diff options
Diffstat (limited to 'source/blender/src/swapbuffers.c')
-rw-r--r-- | source/blender/src/swapbuffers.c | 280 |
1 files changed, 280 insertions, 0 deletions
diff --git a/source/blender/src/swapbuffers.c b/source/blender/src/swapbuffers.c new file mode 100644 index 00000000000..5d90392b145 --- /dev/null +++ b/source/blender/src/swapbuffers.c @@ -0,0 +1,280 @@ +/** + * $Id$ + * + * ***** BEGIN GPL/BL DUAL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. The Blender + * Foundation also sells licenses for use in proprietary software under + * the Blender License. See http://www.blender.org/BL/ for information + * about this. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. + * All rights reserved. + * + * The Original Code is: all of this file. + * + * Contributor(s): none yet. + * + * ***** END GPL/BL DUAL LICENSE BLOCK ***** + */ + +#include <stdlib.h> + +#ifdef WIN32 +#include "BLI_winstuff.h" +#endif + +#include "DNA_space_types.h" +#include "DNA_screen_types.h" + +#include "BKE_global.h" + +#include "BIF_gl.h" +#include "BIF_interface.h" +#include "BIF_mywindow.h" +#include "BIF_screen.h" +#include "BIF_space.h" + +#include "winlay.h" + +#if 0 +static void copy_back_to_front(void) +{ + int actually_swap= 0; + int winx, winy; + char *data; + + winlay_get_winsize(&winx, &winy); + + if (actually_swap) { + data= malloc(4*winx*winy); + glReadPixels(0, 0, winx, winy, GL_RGBA, GL_UNSIGNED_BYTE, data); + } + + mywinset(1); + glRasterPos2f(-0.5,-0.5); + glReadBuffer(GL_BACK); + glDrawBuffer(GL_FRONT); + glCopyPixels(0, 0, winx, winy, GL_COLOR); + glDrawBuffer(GL_BACK); + glFinish(); + + if (actually_swap) { + glRasterPos2f(-0.5,-0.5); + glDrawPixels(winx, winy, GL_RGBA, GL_UNSIGNED_BYTE, data); + glFinish(); + free(data); + } +} +#endif + +static void screen_swapbuffers_REDRAW(bScreen *sc) +{ + ScrArea *sa; + int doswap= 0, swap; + + /* dit is een nieuwe implementatie: uitsluitend met redraws en normale swapbuffer */ + + /* allemaal front ok? */ + sa= sc->areabase.first; + while(sa) { + if(sa->win && (sa->win_swap & WIN_FRONT_OK)==0) break; + if(!sa->headertype) sa->head_swap= WIN_EQUAL; + if((sa->head_swap & WIN_FRONT_OK)==0) break; + sa= sa->next; + } + if(sa==0) return; + + sa= sc->areabase.first; + while(sa) { + + swap= sa->win_swap; + if( (swap & WIN_BACK_OK) == 0) { + scrarea_do_windraw(sa); + doswap= 1; + sa->win_swap= swap | WIN_BACK_OK; + } + else if( sa->win_swap==WIN_BACK_OK) doswap= 1; + + swap= sa->head_swap; + if( (swap & WIN_BACK_OK) == 0) { + if (sa->headertype) scrarea_do_headdraw(sa); + doswap= 1; + sa->head_swap = swap | WIN_BACK_OK; + } + else if( sa->head_swap==WIN_BACK_OK) doswap= 1; + + sa= sa->next; + } + + /* de hele backbuffer moet nu OK zijn */ + if(doswap) { + myswapbuffers(); + } +} + +#include "BMF_Api.h" +#include <stdio.h> + +static void draw_debug_win(int win) +{ + static int drawcounter= 0; + char buf[64]; + int x, y; + int w, h; + + bwin_getsuborigin(win, &x, &y); + bwin_getsize(win, &w, &h); + + mywinset(win); + + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + glOrtho(0, w, 0, h, -1, 1); + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + + glColor3f(0.8, 0.8, 0.8); + glRecti(0, 0, w, h); + + glColor3f(0.6, 0.6, 0.6); + glRecti(2, 2, w-4, h-4); + + glColor3ub(0, 0, 0); + glRasterPos2i(5, 5); + + sprintf(buf, "win: %d - (%d, %d, %d, %d) %d\n", win, x, y, w, h, drawcounter++); + BMF_DrawString(G.font, buf); +} + +static void screen_swapbuffers_DEBUG(bScreen *sc) +{ + ScrArea *sa; + + for (sa= sc->areabase.first; sa; sa= sa->next) { + draw_debug_win(sa->win); + if (sa->headwin) draw_debug_win(sa->headwin); + } + + myswapbuffers(); +} + +static void screen_swapbuffers_DEBUG_SWAP(bScreen *sc) +{ + ScrArea *sa; + int doswap= 0, swap; + + /* dit is een nieuwe implementatie: uitsluitend met redraws en normale swapbuffer */ + + /* allemaal front ok? */ + sa= sc->areabase.first; + while(sa) { + if(sa->win && (sa->win_swap & WIN_FRONT_OK)==0) break; + if(!sa->headertype) sa->head_swap= WIN_EQUAL; + if((sa->head_swap & WIN_FRONT_OK)==0) break; + sa= sa->next; + } + if(sa==0) return; + + sa= sc->areabase.first; + while(sa) { + + swap= sa->win_swap; + if( (swap & WIN_BACK_OK) == 0) { + scrarea_do_windraw(sa); + draw_debug_win(sa->win); + + doswap= 1; + sa->win_swap= swap | WIN_BACK_OK; + } + else if( sa->win_swap==WIN_BACK_OK) doswap= 1; + + swap= sa->head_swap; + if( (swap & WIN_BACK_OK) == 0) { + if (sa->headertype) { + scrarea_do_headdraw(sa); + draw_debug_win(sa->headwin); + } + doswap= 1; + sa->head_swap = swap | WIN_BACK_OK; + } + else if( sa->head_swap==WIN_BACK_OK) doswap= 1; + + sa= sa->next; + } + + /* de hele backbuffer moet nu OK zijn */ + if(doswap) { + myswapbuffers(); + } +} + +static void screen_swapbuffers_SIMPLE(bScreen *sc) +{ + ScrArea *sa; + + mywinset(1); + glClearColor(0.8, 0.6, 0.7, 1.0); + glClear(GL_COLOR_BUFFER_BIT); + + for (sa= sc->areabase.first; sa; sa= sa->next) { + scrarea_do_windraw(sa); + if (sa->headertype) scrarea_do_headdraw(sa); + } + + myswapbuffers(); +} + +static int drawmode_default= 'r'; +int debug_swapbuffers_override= 0; + +void set_debug_swapbuffers_ovveride(bScreen *sc, int mode) +{ + ScrArea *sa; + for (sa= sc->areabase.first; sa; sa= sa->next) { + sa->win_swap= 0; + sa->head_swap= 0; + } + debug_swapbuffers_override= mode; +} + +void screen_swapbuffers(void) +{ + ScrArea *tempsa; + + bScreen *sc= G.curscreen; + int drawmode; + + if (debug_swapbuffers_override) { + drawmode= debug_swapbuffers_override; + } else { + drawmode= drawmode_default; + } + + tempsa= curarea; + areawinset(1); + + if (drawmode=='s') { + screen_swapbuffers_SIMPLE(sc); + } else if (drawmode=='d') { + screen_swapbuffers_DEBUG(sc); + } else if (drawmode=='f') { + screen_swapbuffers_DEBUG_SWAP(sc); + } else { + screen_swapbuffers_REDRAW(sc); + } + + areawinset(tempsa->win); +}
\ No newline at end of file |