Ticket #9019: 16bit_step1.patch

File 16bit_step1.patch, 5.4 KB (added by SF/upthorn, 10 years ago)

The initial patch, unreviewed

  • backends/platform/sdl/graphics.cpp

     
    408408        }
    409409
    410410        //
     411        // Create the surface that contains the 16 bit game data
     412        //
     413        _screen16 = SDL_CreateRGBSurface(SDL_SWSURFACE, _videoMode.screenWidth, _videoMode.screenHeight,
     414                                                16,
     415                                                _hwscreen->format->Rmask,
     416                                                _hwscreen->format->Gmask,
     417                                                _hwscreen->format->Bmask,
     418                                                _hwscreen->format->Amask);
     419        if (_screen16 == NULL)
     420                error("allocating _screen16 failed");
     421
     422        //
    411423        // Create the surface used for the graphics in 16 bit before scaling, and also the overlay
    412424        //
    413425
     
    484496}
    485497
    486498void OSystem_SDL::unloadGFXMode() {
    487         if (_screen) {
    488                 SDL_FreeSurface(_screen);
    489                 _screen = NULL;
     499        if (_screen16) {
     500                SDL_FreeSurface(_screen16);
     501                _screen16 = NULL;
    490502        }
    491503
    492504        if (_hwscreen) {
     
    519531}
    520532
    521533bool OSystem_SDL::hotswapGFXMode() {
    522         if (!_screen)
     534        if (!_screen16)
    523535                return false;
    524536
    525537        // Keep around the old _screen & _overlayscreen so we can restore the screen data
    526538        // after the mode switch.
    527         SDL_Surface *old_screen = _screen;
     539        SDL_Surface *old_screen = _screen16;
    528540        SDL_Surface *old_overlayscreen = _overlayscreen;
    529         _screen = NULL;
     541        _screen16 = NULL;
    530542        _overlayscreen = NULL;
    531543
    532544        // Release the HW screen surface
     
    544556        if (!loadGFXMode()) {
    545557                unloadGFXMode();
    546558
    547                 _screen = old_screen;
     559                _screen16 = old_screen;
    548560                _overlayscreen = old_overlayscreen;
    549561
    550562                return false;
     
    554566        SDL_SetColors(_screen, _currentPalette, 0, 256);
    555567
    556568        // Restore old screen content
    557         SDL_BlitSurface(old_screen, NULL, _screen, NULL);
     569        SDL_BlitSurface(old_screen, NULL, _screen16, NULL);
    558570        SDL_BlitSurface(old_overlayscreen, NULL, _overlayscreen, NULL);
    559571
    560572        // Free the old surfaces
     
    636648#endif
    637649
    638650        if (!_overlayVisible) {
    639                 origSurf = _screen;
     651                origSurf = _screen16;
    640652                srcSurf = _tmpscreen;
    641653                width = _videoMode.screenWidth;
    642654                height = _videoMode.screenHeight;
     
    781793        assert (_transactionMode == kTransactionNone);
    782794        assert(src);
    783795
    784         if (_screen == NULL) {
     796        if (_screen16 == NULL) {
    785797                warning("OSystem_SDL::copyRectToScreen: _screen == NULL");
    786798                return;
    787799        }
     
    829841        }
    830842
    831843        // Try to lock the screen surface
    832         if (SDL_LockSurface(_screen) == -1)
     844        if (SDL_LockSurface(_screen16) == -1)
    833845                error("SDL_LockSurface failed: %s", SDL_GetError());
    834846
    835         byte *dst = (byte *)_screen->pixels + y * _videoMode.screenWidth + x;
     847        byte *dst = (byte *)_screen16->pixels + y * _videoMode.screenWidth * 2 + x * 2;
    836848
    837         if (_videoMode.screenWidth == pitch && pitch == w) {
    838                 memcpy(dst, src, h*w);
     849        if (_videoMode.screenWidth == pitch && pitch == w * 2) {
     850                memcpy(dst, src, h*w*2);
    839851        } else {
    840852                do {
    841                         memcpy(dst, src, w);
     853                        memcpy(dst, src, w * 2);
    842854                        src += pitch;
    843                         dst += _videoMode.screenWidth;
     855                        dst += _videoMode.screenWidth * 2;
    844856                } while (--h);
    845857        }
    846858
    847859        // Unlock the screen surface
    848         SDL_UnlockSurface(_screen);
     860        SDL_UnlockSurface(_screen16);
    849861}
    850862
    851863Graphics::Surface *OSystem_SDL::lockScreen() {
     
    859871        _screenIsLocked = true;
    860872
    861873        // Try to lock the screen surface
    862         if (SDL_LockSurface(_screen) == -1)
     874        if (SDL_LockSurface(_screen16) == -1)
    863875                error("SDL_LockSurface failed: %s", SDL_GetError());
    864876
    865         _framebuffer.pixels = _screen->pixels;
    866         _framebuffer.w = _screen->w;
    867         _framebuffer.h = _screen->h;
    868         _framebuffer.pitch = _screen->pitch;
    869         _framebuffer.bytesPerPixel = 1;
     877        _framebuffer.pixels = _screen16->pixels;
     878        _framebuffer.w = _screen16->w;
     879        _framebuffer.h = _screen16->h;
     880        _framebuffer.pitch = _screen16->pitch;
     881        _framebuffer.bytesPerPixel = 2;
    870882
    871883        return &_framebuffer;
    872884}
     
    879891        _screenIsLocked = false;
    880892
    881893        // Unlock the screen surface
    882         SDL_UnlockSurface(_screen);
     894        SDL_UnlockSurface(_screen16);
    883895
    884896        // Trigger a full screen update
    885897        _forceFull = true;
     
    10541066        // since we don't actually set the palette until the screen is updated.
    10551067        // But it could indicate a programming error, so let's warn about it.
    10561068
    1057         if (!_screen)
    1058                 warning("OSystem_SDL::setPalette: _screen == NULL");
     1069        if (!_screen16)
     1070                warning("OSystem_SDL::setPalette: _screen16 == NULL");
    10591071
    10601072        const byte *b = colors;
    10611073        uint i;
     
    11791191        dst.x = dst.y = 1;
    11801192        src.w = dst.w = _videoMode.screenWidth;
    11811193        src.h = dst.h = _videoMode.screenHeight;
    1182         if (SDL_BlitSurface(_screen, &src, _tmpscreen, &dst) != 0)
     1194        if (SDL_BlitSurface(_screen16, &src, _tmpscreen, &dst) != 0)
    11831195                error("SDL_BlitSurface failed: %s", SDL_GetError());
    11841196
    11851197        SDL_LockSurface(_tmpscreen);
  • backends/platform/sdl/sdl.cpp

     
    200200#ifdef USE_OSD
    201201        _osdSurface(0), _osdAlpha(SDL_ALPHA_TRANSPARENT), _osdFadeStartTime(0),
    202202#endif
    203         _hwscreen(0), _screen(0), _tmpscreen(0),
     203        _hwscreen(0), _screen16(0), _screen(0), _tmpscreen(0),
    204204        _overlayVisible(false),
    205205        _overlayscreen(0), _tmpscreen2(0),
    206206        _samplesPerSec(0),
  • backends/platform/sdl/sdl.h

     
    227227
    228228        // unseen game screen
    229229        SDL_Surface *_screen;
     230        SDL_Surface *_screen16;
    230231
    231232        // temporary screen (for scalers)
    232233        SDL_Surface *_tmpscreen;