src/video/bwindow/SDL_sysvideo.cc

/* [<][>][^][v][top]
[bottom][index][help] */

FUNCTIONS

This source file includes following functions.

   1 /*
   2     SDL - Simple DirectMedia Layer
   3     Copyright (C) 1997, 1998, 1999, 2000, 2001  Sam Lantinga
   4 
   5     This library is free software; you can redistribute it and/or
   6     modify it under the terms of the GNU Library General Public
   7     License as published by the Free Software Foundation; either
   8     version 2 of the License, or (at your option) any later version.
   9 
  10     This library is distributed in the hope that it will be useful,
  11     but WITHOUT ANY WARRANTY; without even the implied warranty of
  12     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  13     Library General Public License for more details.
  14 
  15     You should have received a copy of the GNU Library General Public
  16     License along with this library; if not, write to the Free
  17     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  18 
  19     Sam Lantinga
  20     slouken@devolution.com
  21 */
  22 
  23 #ifdef SAVE_RCSID
  24 static char rcsid =
  25  "@(#) $Id: SDL_sysvideo.cc,v 1.4.2.11 2001/02/10 07:20:05 hercules Exp $";
  26 #endif
  27 
  28 /* BWindow based framebuffer implementation */
  29 
  30 #include <stdlib.h>
  31 #include <string.h>
  32 
  33 #include <stdio.h>
  34 #include <unistd.h>
  35 
  36 #include "SDL.h"
  37 #include "SDL_BeApp.h"
  38 #include "SDL_BWin.h"
  39 #include "SDL_timer.h"
  40 #include "blank_cursor.h"
  41 
  42 extern "C" {
  43 
  44 #include "SDL_sysvideo.h"
  45 #include "SDL_sysmouse_c.h"
  46 #include "SDL_sysevents_c.h"
  47 #include "SDL_events_c.h"
  48 #include "SDL_syswm_c.h"
  49 #include "SDL_lowvideo.h"
  50 
  51 #define BEOS_HIDDEN_SIZE        32      /* starting hidden window size */
  52 
  53 /* Initialization/Query functions */
  54 static int BE_VideoInit(_THIS, SDL_PixelFormat *vformat);
  55 static SDL_Rect **BE_ListModes(_THIS, SDL_PixelFormat *format, Uint32 flags);
  56 static SDL_Surface *BE_SetVideoMode(_THIS, SDL_Surface *current, int width, int height, int bpp, Uint32 flags);
  57 static void BE_UpdateMouse(_THIS);
  58 static int BE_SetColors(_THIS, int firstcolor, int ncolors, SDL_Color *colors);
  59 static void BE_VideoQuit(_THIS);
  60 
  61 /* Hardware surface functions */
  62 static int BE_AllocHWSurface(_THIS, SDL_Surface *surface);
  63 static int BE_LockHWSurface(_THIS, SDL_Surface *surface);
  64 static void BE_UnlockHWSurface(_THIS, SDL_Surface *surface);
  65 static void BE_FreeHWSurface(_THIS, SDL_Surface *surface);
  66 
  67 static int BE_ToggleFullScreen(_THIS, int fullscreen);
  68 
  69 /* OpenGL functions */
  70 #ifdef HAVE_OPENGL
  71 static void BE_GL_SwapBuffers(_THIS);
  72 #endif
  73 
  74 /* FB driver bootstrap functions */
  75 
  76 static int BE_Available(void)
  77 {
  78         return(1);
  79 }
  80 
  81 static void BE_DeleteDevice(SDL_VideoDevice *device)
  82 {
  83         free(device->hidden);
  84         free(device);
  85 }
  86 
  87 static SDL_VideoDevice *BE_CreateDevice(int devindex)
  88 {
  89         SDL_VideoDevice *device;
  90 
  91         /* Initialize all variables that we clean on shutdown */
  92         device = (SDL_VideoDevice *)malloc(sizeof(SDL_VideoDevice));
  93         if ( device ) {
  94                 memset(device, 0, (sizeof *device));
  95                 device->hidden = (struct SDL_PrivateVideoData *)
  96                                 malloc((sizeof *device->hidden));
  97         }
  98         if ( (device == NULL) || (device->hidden == NULL) ) {
  99                 SDL_OutOfMemory();
 100                 if ( device ) {
 101                         free(device);
 102                 }
 103                 return(0);
 104         }
 105         memset(device->hidden, 0, (sizeof *device->hidden));
 106 
 107         /* Set the function pointers */
 108         device->VideoInit = BE_VideoInit;
 109         device->ListModes = BE_ListModes;
 110         device->SetVideoMode = BE_SetVideoMode;
 111         device->UpdateMouse = BE_UpdateMouse;
 112         device->SetColors = BE_SetColors;
 113         device->UpdateRects = NULL;
 114         device->VideoQuit = BE_VideoQuit;
 115         device->AllocHWSurface = BE_AllocHWSurface;
 116         device->CheckHWBlit = NULL;
 117         device->FillHWRect = NULL;
 118         device->SetHWColorKey = NULL;
 119         device->SetHWAlpha = NULL;
 120         device->LockHWSurface = BE_LockHWSurface;
 121         device->UnlockHWSurface = BE_UnlockHWSurface;
 122         device->FlipHWSurface = NULL;
 123         device->FreeHWSurface = BE_FreeHWSurface;
 124 #ifdef HAVE_OPENGL
 125         device->GL_SwapBuffers = BE_GL_SwapBuffers;
 126 #endif
 127         device->SetIcon = NULL;
 128         device->SetCaption = BE_SetWMCaption;
 129         device->GetWMInfo = NULL;
 130         device->FreeWMCursor = BE_FreeWMCursor;
 131         device->CreateWMCursor = BE_CreateWMCursor;
 132         device->ShowWMCursor = BE_ShowWMCursor;
 133         device->WarpWMCursor = BE_WarpWMCursor;
 134         device->InitOSKeymap = BE_InitOSKeymap;
 135         device->PumpEvents = BE_PumpEvents;
 136 
 137         device->free = BE_DeleteDevice;
 138         device->ToggleFullScreen = BE_ToggleFullScreen;
 139 
 140         /* Set the driver flags */
 141         device->handles_any_size = 1;
 142         
 143         return device;
 144 }
 145 
 146 VideoBootStrap BWINDOW_bootstrap = {
 147         "bwindow", "BDirectWindow graphics",
 148         BE_Available, BE_CreateDevice
 149 };
 150 
 151 static inline int ColorSpaceToBitsPerPixel(uint32 colorspace)
 152 {
 153         int bitsperpixel;
 154 
 155         bitsperpixel = 0;
 156         switch (colorspace) {
 157             case B_CMAP8:
 158                 bitsperpixel = 8;
 159                 break;
 160             case B_RGB15:
 161             case B_RGBA15:
 162             case B_RGB15_BIG:
 163             case B_RGBA15_BIG:
 164                 bitsperpixel = 15;
 165                 break;
 166             case B_RGB16:
 167             case B_RGB16_BIG:
 168                 bitsperpixel = 16;
 169                 break;
 170             case B_RGB32:
 171             case B_RGBA32:
 172             case B_RGB32_BIG:
 173             case B_RGBA32_BIG:
 174                 bitsperpixel = 32;
 175                 break;
 176             default:
 177                 break;
 178         }
 179         return(bitsperpixel);
 180 }
 181 
 182 /* Function to sort the display_list in bscreen */
 183 static int CompareModes(const void *A, const void *B)
 184 {
 185         const display_mode *a = (display_mode *)A;
 186         const display_mode *b = (display_mode *)B;
 187 
 188         if ( a->space == b->space ) {
 189                 return((b->virtual_width*b->virtual_height)-
 190                        (a->virtual_width*a->virtual_height));
 191         } else {
 192                 return(ColorSpaceToBitsPerPixel(b->space)-
 193                        ColorSpaceToBitsPerPixel(a->space));
 194         }
 195 }
 196 
 197 /* Yes, this isn't the fastest it could be, but it works nicely */
 198 static int BE_AddMode(_THIS, int index, unsigned int w, unsigned int h)
 199 {
 200         SDL_Rect *mode;
 201         int i;
 202         int next_mode;
 203 
 204         /* Check to see if we already have this mode */
 205         if ( SDL_nummodes[index] > 0 ) {
 206                 for ( i=SDL_nummodes[index]-1; i >= 0; --i ) {
 207                         mode = SDL_modelist[index][i];
 208                         if ( (mode->w == w) && (mode->h == h) ) {
 209 #ifdef BWINDOW_DEBUG
 210                                 fprintf(stderr, "We already have mode %dx%d at %d bytes per pixel\n", w, h, index+1);
 211 #endif
 212                                 return(0);
 213                         }
 214                 }
 215         }
 216 
 217         /* Set up the new video mode rectangle */
 218         mode = (SDL_Rect *)malloc(sizeof *mode);
 219         if ( mode == NULL ) {
 220                 SDL_OutOfMemory();
 221                 return(-1);
 222         }
 223         mode->x = 0;
 224         mode->y = 0;
 225         mode->w = w;
 226         mode->h = h;
 227 #ifdef BWINDOW_DEBUG
 228         fprintf(stderr, "Adding mode %dx%d at %d bytes per pixel\n", w, h, index+1);
 229 #endif
 230 
 231         /* Allocate the new list of modes, and fill in the new mode */
 232         next_mode = SDL_nummodes[index];
 233         SDL_modelist[index] = (SDL_Rect **)
 234                realloc(SDL_modelist[index], (1+next_mode+1)*sizeof(SDL_Rect *));
 235         if ( SDL_modelist[index] == NULL ) {
 236                 SDL_OutOfMemory();
 237                 SDL_nummodes[index] = 0;
 238                 free(mode);
 239                 return(-1);
 240         }
 241         SDL_modelist[index][next_mode] = mode;
 242         SDL_modelist[index][next_mode+1] = NULL;
 243         SDL_nummodes[index]++;
 244 
 245         return(0);
 246 }
 247 
 248 int BE_VideoInit(_THIS, SDL_PixelFormat *vformat)
 249 {
 250         display_mode *modes;
 251         uint32 i, nmodes;
 252         int bpp;
 253         BRect bounds;
 254 
 255         /* Initialize the Be Application for appserver interaction */
 256         if ( SDL_InitBeApp() < 0 ) {
 257                 return(-1);
 258         }
 259 
 260         /* It is important that this be created after SDL_InitBeApp() */
 261         BScreen bscreen;
 262 
 263         /* Save the current display mode */
 264         bscreen.GetMode(&saved_mode);
 265 
 266         /* Determine the screen depth */
 267         vformat->BitsPerPixel = ColorSpaceToBitsPerPixel(bscreen.ColorSpace());
 268         if ( vformat->BitsPerPixel == 0 ) {
 269                 SDL_SetError("Unknown BScreen colorspace: 0x%x",
 270                                                 bscreen.ColorSpace());
 271                 return(-1);
 272         }
 273 
 274         /* Get the video modes we can switch to in fullscreen mode */
 275         bscreen.GetModeList(&modes, &nmodes);
 276         qsort(modes, nmodes, sizeof *modes, CompareModes);
 277         for ( i=0; i<nmodes; ++i ) {
 278                 bpp = ColorSpaceToBitsPerPixel(modes[i].space);
 279                 //if ( bpp != 0 ) { // There are bugs in changing colorspace
 280                 if ( modes[i].space == saved_mode.space ) {
 281                         BE_AddMode(_this, ((bpp+7)/8)-1,
 282                                 modes[i].virtual_width,
 283                                 modes[i].virtual_height);
 284                 }
 285         }
 286 
 287         /* Create the window and view */
 288         bounds.top = 0; bounds.left = 0;
 289         bounds.right = BEOS_HIDDEN_SIZE;
 290         bounds.bottom = BEOS_HIDDEN_SIZE;
 291         SDL_Win = new SDL_BWin(bounds);
 292 
 293         /* Create the clear cursor */
 294         SDL_BlankCursor = BE_CreateWMCursor(_this, blank_cdata, blank_cmask,
 295                         BLANK_CWIDTH, BLANK_CHEIGHT, BLANK_CHOTX, BLANK_CHOTY);
 296 
 297         /* Fill in some window manager capabilities */
 298         _this->info.wm_available = 1;
 299 
 300         /* We're done! */
 301         return(0);
 302 }
 303 
 304 /* We support any dimension at our bit-depth */
 305 SDL_Rect **BE_ListModes(_THIS, SDL_PixelFormat *format, Uint32 flags)
 306 {
 307         SDL_Rect **modes;
 308 
 309         modes = ((SDL_Rect **)0);
 310         if ( (flags & SDL_FULLSCREEN) == SDL_FULLSCREEN ) {
 311                 modes = SDL_modelist[((format->BitsPerPixel+7)/8)-1];
 312         } else {
 313                 if ( format->BitsPerPixel ==
 314                         _this->screen->format->BitsPerPixel ) {
 315                         modes = ((SDL_Rect **)-1);
 316                 }
 317         }
 318         return(modes);
 319 }
 320 
 321 /* Various screen update functions available */
 322 static void BE_NormalUpdate(_THIS, int numrects, SDL_Rect *rects);
 323 
 324 
 325 /* Find the closest display mode for fullscreen */
 326 static bool BE_FindClosestFSMode(_THIS, int width, int height, int bpp,
 327                                          display_mode *mode)
 328 {
 329         BScreen bscreen;
 330         uint32 i, nmodes;
 331         SDL_Rect **modes;
 332         display_mode *dmodes;
 333 
 334         modes = SDL_modelist[((bpp+7)/8)-1];
 335         for ( i=0; modes[i] && (modes[i]->w > width) &&
 336                       (modes[i]->h > height); ++i ) {
 337                 /* still looking */
 338         }
 339         if ( ! modes[i] || (modes[i]->w < width) || (modes[i]->h < width) ) {
 340                 --i;    /* We went too far */
 341         }
 342         width = modes[i]->w;
 343         height = modes[i]->h;      
 344         bscreen.GetModeList(&dmodes, &nmodes);
 345         for ( i = 0; i < nmodes; ++i ) {
 346                 if ( (bpp == ColorSpaceToBitsPerPixel(dmodes[i].space)) &&
 347                      (width == dmodes[i].virtual_width) &&
 348                      (height == dmodes[i].virtual_height) ) {
 349                         break;
 350                 }
 351         }
 352         if ( i != nmodes ) {
 353                 *mode = dmodes[i];
 354                 return true;
 355         } else {
 356                 return false;
 357         }       
 358 }
 359 
 360 static int BE_ToggleFullScreen(_THIS, int fullscreen)
 361 {
 362         bool needs_unlock, is_fullscreen;       
 363         BScreen bscreen;
 364         BRect bounds;
 365         display_mode mode;
 366         int width, height, bpp;
 367 
 368         SDL_Win->SetFullScreen(fullscreen);
 369         is_fullscreen = SDL_Win->IsFullScreen();
 370                                              
 371         if(!((is_fullscreen && fullscreen) ||
 372              (!is_fullscreen && !fullscreen))) {
 373                 /* Modeswitch failed */
 374                 return 0;
 375         }
 376         
 377         if(is_fullscreen)       _this->screen->flags |= SDL_FULLSCREEN;
 378         else                    _this->screen->flags &= ~SDL_FULLSCREEN;
 379 
 380         width = _this->screen->w;
 381         height = _this->screen->h;
 382 
 383         /* Set the appropriate video mode */
 384         if ( fullscreen ) {
 385                 bpp = _this->screen->format->BitsPerPixel;
 386                 bscreen.GetMode(&mode);
 387                 if ( (bpp != ColorSpaceToBitsPerPixel(mode.space)) ||
 388                      (width != mode.virtual_width) ||
 389                      (height != mode.virtual_height)) {
 390                         if(BE_FindClosestFSMode(_this, width, height, bpp, &mode)) {
 391                                 bscreen.SetMode(&mode);
 392                                 /* This simply stops the next resize event from being
 393                                  * sent to the SDL handler.
 394                                  */
 395                                 SDL_Win->InhibitResize();
 396                         } else {
 397                                 _this->screen->flags &= ~SDL_FULLSCREEN;
 398                         }
 399                 }
 400                 
 401         } else {
 402                 bscreen.SetMode(&saved_mode);
 403         }
 404         
 405         if ( SDL_Win->Lock() ) {
 406                 int xoff, yoff;
 407                 if ( SDL_Win->Shown() ) {
 408                         needs_unlock = 1;
 409                         SDL_Win->Hide();
 410                 } else {
 411                         needs_unlock = 0;
 412                 }
 413                 /* This resizes the window and view area, but inhibits resizing of
 414                  * the BBitmap due to the InhibitResize call above. Thus the bitmap
 415                  * (pixel data) never changes.
 416                  */
 417                 SDL_Win->ResizeTo(width, height);
 418                 bounds = bscreen.Frame();
 419                 /* Calculate offsets - used either to center window (windowed mode)
 420                  * or to set drawing offsets (fullscreen mode)
 421                  */
 422                 xoff = (bounds.IntegerWidth() - _this->screen->w)/2;
 423                 yoff = (bounds.IntegerHeight() - _this->screen->h)/2;
 424                 if(fullscreen) {
 425                         /* Set offset for drawing */
 426                         SDL_Win->SetXYOffset(xoff, yoff);
 427                 } else {
 428                         /* Center window and reset the drawing offset */
 429                         SDL_Win->MoveTo(xoff > 0 ? (float)xoff : 0.0,
 430                                         yoff > 0 ? (float)yoff : 0.0);
 431                         SDL_Win->SetXYOffset(0, 0);
 432                 }
 433                 SDL_Win->Show();
 434                 
 435                 /* Unlock the window manually after the first Show() */
 436                 if ( needs_unlock ) { SDL_Win->Unlock(); }
 437         }
 438         return(1);
 439 }
 440 
 441 /* FIXME: check return values and cleanup here */
 442 SDL_Surface *BE_SetVideoMode(_THIS, SDL_Surface *current,
 443                                 int width, int height, int bpp, Uint32 flags)
 444 {
 445         BScreen bscreen;
 446         display_mode mode;
 447         BBitmap *bbitmap;
 448         BRect bounds;
 449         int needs_unlock;
 450         int xoff = 0, yoff = 0;
 451 
 452         /* Set the appropriate video mode */
 453         if ( flags & SDL_FULLSCREEN ) { 
 454                 bscreen.GetMode(&mode);
 455                 if ( (bpp != ColorSpaceToBitsPerPixel(mode.space)) ||
 456                      (width != mode.virtual_width) ||
 457                      (height != mode.virtual_height) ) {
 458                         if(BE_FindClosestFSMode(_this, width, height, bpp, &mode)) {
 459                                 bscreen.SetMode(&mode);
 460                                 xoff = (mode.virtual_width - width)/2;
 461                                 yoff = (mode.virtual_height - height)/2;
 462                         } else {
 463                                 flags &= ~SDL_FULLSCREEN;
 464                         }
 465                 }
 466         } else {
 467                 if ( current->flags & SDL_FULLSCREEN ) {
 468                         bscreen.SetMode(&saved_mode);
 469                 }
 470         }
 471 
 472         /* Create the view for this window */
 473         if ( SDL_Win->CreateView(flags) < 0 ) {
 474                 return(NULL);
 475         }
 476 
 477         /* Set offsets */
 478         SDL_Win->SetXYOffset(xoff, yoff);
 479 
 480         current->flags = 0;             /* Clear flags */
 481         current->w = width;
 482         current->h = height;
 483         if ( flags & SDL_FULLSCREEN ) {
 484                 SDL_Win->SetFullScreen(1);
 485                 current->flags |= SDL_FULLSCREEN;
 486         } else {
 487                 SDL_Win->SetFullScreen(0);
 488         }
 489         SDL_Win->SetType(B_TITLED_WINDOW);
 490         if ( flags & SDL_NOFRAME ) {
 491                 current->flags |= SDL_NOFRAME;
 492                 SDL_Win->SetLook(B_NO_BORDER_WINDOW_LOOK);
 493         } else {
 494                 if ( (flags & SDL_RESIZABLE) && !(flags & SDL_OPENGL) )  {
 495                         current->flags |= SDL_RESIZABLE;
 496                         /* We don't want opaque resizing (TM). :-) */
 497                         SDL_Win->SetFlags(B_OUTLINE_RESIZE);
 498                 } else {
 499                         SDL_Win->SetFlags(B_NOT_RESIZABLE|B_NOT_ZOOMABLE);
 500                 }
 501         }
 502 
 503         if ( flags & SDL_OPENGL ) {
 504                 current->flags |= SDL_OPENGL;
 505                 current->pitch = 0;
 506                 current->pixels = NULL;
 507                 _this->UpdateRects = NULL;              
 508                 //              _this->ToggleFullScreen = NULL;
 509         } else {
 510                 /* Create the BBitmap framebuffer */
 511                 bounds.top = 0; bounds.left = 0;
 512                 bounds.right = width-1;
 513                 bounds.bottom = height-1;
 514                 bbitmap = new BBitmap(bounds, bscreen.ColorSpace());
 515                 if ( ! bbitmap->IsValid() ) {
 516                         SDL_SetError("Couldn't create screen bitmap");
 517                         delete bbitmap;
 518                         return(NULL);
 519                 }
 520                 current->pitch = bbitmap->BytesPerRow();
 521                 current->pixels = (void *)bbitmap->Bits();
 522                 SDL_Win->SetBitmap(bbitmap);
 523                 _this->UpdateRects = BE_NormalUpdate;
 524         }
 525 
 526         /* Hide the window for resizing */
 527         if ( SDL_Win->Lock() ) {
 528                 if ( SDL_Win->Shown() ) {
 529                         needs_unlock = 1;
 530                         SDL_Win->Hide();
 531                 } else {
 532                         needs_unlock = 0;
 533                 }
 534 
 535                 /* Resize, but only if the window is different size than
 536                  * before. Otherwise it jumps funnily when the user resizes.
 537                  */
 538                 bounds = SDL_Win->Bounds();
 539                 if((int)bounds.Width() != width ||
 540                    (int)bounds.Height() != height) {
 541                         SDL_Win->ResizeTo(width, height);
 542                         bounds = bscreen.Frame();
 543                         SDL_Win->MoveTo((bounds.Width()-width)/2,
 544                                         (bounds.Height()-height)/2);
 545                 }
 546                 SDL_Win->Show();
 547 
 548                 /* Unlock the window manually after the first Show() */
 549                 if ( needs_unlock ) {
 550                         SDL_Win->Unlock();
 551                 }
 552         }
 553 
 554         /* We're done */
 555         return(current);
 556 }
 557 
 558 /* Update the current mouse state and position */
 559 void BE_UpdateMouse(_THIS)
 560 {
 561         BPoint point;
 562         uint32 buttons;
 563 
 564         if ( SDL_Win->Lock() ) {
 565                 /* Get new input state, if still active */
 566                 if ( SDL_Win->IsActive() ) {
 567                         (SDL_Win->View())->GetMouse(&point, &buttons, true);
 568                 } else {
 569                         point.x = -1;
 570                         point.y = -1;
 571                 }
 572                 SDL_Win->Unlock();
 573 
 574                 if ( (point.x >= 0) && (point.x < SDL_VideoSurface->w) &&
 575                      (point.y >= 0) && (point.y < SDL_VideoSurface->h) ) {
 576                         SDL_PrivateAppActive(1, SDL_APPMOUSEFOCUS);
 577                         SDL_PrivateMouseMotion(0, 0,
 578                                         (Sint16)point.x, (Sint16)point.y);
 579                 } else {
 580                         SDL_PrivateAppActive(0, SDL_APPMOUSEFOCUS);
 581                 }
 582         }
 583 }
 584 
 585 /* We don't actually allow hardware surfaces other than the main one */
 586 static int BE_AllocHWSurface(_THIS, SDL_Surface *surface)
 587 {
 588         return(-1);
 589 }
 590 static void BE_FreeHWSurface(_THIS, SDL_Surface *surface)
 591 {
 592         return;
 593 }
 594 static int BE_LockHWSurface(_THIS, SDL_Surface *surface)
 595 {
 596         return(0);
 597 }
 598 static void BE_UnlockHWSurface(_THIS, SDL_Surface *surface)
 599 {
 600         return;
 601 }
 602 
 603 static void BE_NormalUpdate(_THIS, int numrects, SDL_Rect *rects)
 604 {
 605         if ( SDL_Win->BeginDraw() ) {
 606                 int i;
 607 
 608                 for ( i=0; i<numrects; ++i ) {
 609                         BRect rect;
 610 
 611                         rect.top = rects[i].y;
 612                         rect.left = rects[i].x;
 613                         rect.bottom = rect.top+rects[i].h-1;
 614                         rect.right = rect.left+rects[i].w-1;
 615                         SDL_Win->DrawAsync(rect);
 616                 }
 617                 SDL_Win->EndDraw();
 618         }
 619 }
 620 
 621 #ifdef HAVE_OPENGL
 622 void BE_GL_SwapBuffers(_THIS)
 623 {
 624         SDL_Win->SwapBuffers();
 625 }
 626 #endif
 627 
 628 /* Is the system palette settable? */
 629 int BE_SetColors(_THIS, int firstcolor, int ncolors, SDL_Color *colors)
 630 {
 631         int i;
 632         SDL_Palette *palette;
 633         const color_map *cmap = BScreen().ColorMap();
 634 
 635         /* Get the screen colormap */
 636         palette = _this->screen->format->palette;
 637         for ( i=0; i<256; ++i ) {
 638                 palette->colors[i].r = cmap->color_list[i].red;
 639                 palette->colors[i].g = cmap->color_list[i].green;
 640                 palette->colors[i].b = cmap->color_list[i].blue;
 641         }
 642         return(0);
 643 }
 644 
 645 void BE_VideoQuit(_THIS)
 646 {
 647         int i, j;
 648 
 649         if ( SDL_BlankCursor != NULL ) {
 650                 BE_FreeWMCursor(_this, SDL_BlankCursor);
 651                 SDL_BlankCursor = NULL;
 652         }
 653         for ( i=0; i<NUM_MODELISTS; ++i ) {
 654                 if ( SDL_modelist[i] ) {
 655                         for ( j=0; SDL_modelist[i][j]; ++j ) {
 656                                 free(SDL_modelist[i][j]);
 657                         }
 658                         free(SDL_modelist[i]);
 659                         SDL_modelist[i] = NULL;
 660                 }
 661         }
 662         /* Restore the original video mode */
 663         if ( _this->screen ) {
 664                 if ( (_this->screen->flags&SDL_FULLSCREEN) == SDL_FULLSCREEN ) {
 665                         BScreen bscreen;
 666                         bscreen.SetMode(&saved_mode);
 667                 }
 668                 _this->screen->pixels = NULL;
 669         }
 670         SDL_QuitBeApp();
 671 }
 672 
 673 }; /* Extern C */

/* [<][>][^][v][top][bottom][index][help] */