This repository has been archived on 2023-10-09. You can view files and clone it, but cannot push or open issues or pull requests.
Files
blender-archive/source/blender/src/swapbuffers.c
Kent Mein d0e346d544 updated .c files to include:
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif

Just need to finish cpp files now :)

Kent
--
mein@cs.umn.edu
2002-11-25 12:02:15 +00:00

285 lines
5.9 KiB
C

/**
* $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 HAVE_CONFIG_H
#include <config.h>
#endif
#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);
}