Ticket #7927: scummvm-shake.patch

File scummvm-shake.patch, 7.4 KB (added by SF/stauff1, 22 years ago)

The patch file

  • gfx.cpp

    diff -Naur scummvm/gfx.cpp scummvm-shake-patch/gfx.cpp
    old new  
    14091409}
    14101410
    14111411void Scumm::setShake(int mode) {
    1412         if (mode!=-1)
     1412        if (mode < 0)
     1413                _shakeMode = 0;
     1414        else
    14131415                _shakeMode = mode;
    1414         else
    1415                 mode = 0;
    1416         /* XXX: not implemented */
    1417         warning("stub setShake(%d)",mode);
     1416
     1417        if (_shakeMode) _shakeFrame = 0;
     1418
     1419        updateScreen(this);
     1420
     1421        warning("stub setShake(%d) - half implemented",mode);
    14181422}
    14191423
    14201424void Gdi::clearUpperMask() {
  • scumm.h

    diff -Naur scummvm/scumm.h scummvm-shake-patch/scumm.h
    old new  
    10341034               
    10351035        int16 _talkDelay;
    10361036        int16 _shakeMode;
     1037        int16 _shakeFrame;
     1038        uint32 _shakeTicks;
    10371039
    10381040        int16 _virtual_mouse_x, _virtual_mouse_y;
    10391041
  • sdl.cpp

    diff -Naur scummvm/sdl.cpp scummvm-shake-patch/sdl.cpp
    old new  
    3838SOUND_DRIVER_TYPE snd_driv;
    3939
    4040static SDL_Surface *screen;
     41static SDL_Surface *shakebuf;
     42static SDL_Surface *blackness;
    4143
    4244void updateScreen(Scumm *s);
    4345
     
    5759        }
    5860       
    5961        SDL_SetColors(screen, colors, first, num);
     62        SDL_SetColors(shakebuf, colors, first, num);
    6063       
    6164        s->_palDirtyMax = -1;
    6265        s->_palDirtyMin = 0x3E8;
     
    202205void blitToScreen(Scumm *s, byte *src,int x, int y, int w, int h) {
    203206        byte *dst;
    204207        int i;
     208        SDL_Surface *target;
    205209
    206210        hide_mouse = true;
    207211        if (has_mouse) {
    208212                s->drawMouse();
    209213        }
    210214
    211         if (SDL_LockSurface(screen)==-1)
     215        if (s->_shakeMode || s->_shakeFrame) {
     216                target = shakebuf;
     217        } else {
     218                target = screen;
     219        }
     220
     221        if (SDL_LockSurface(target)==-1)
    212222                error("SDL_LockSurface failed: %s.\n", SDL_GetError());
    213223
    214224#if !defined(SCALEUP_2x2)
    215         dst = (byte*)screen->pixels + y*320 + x;
     225        dst = (byte*)target->pixels + y*320 + x;
    216226        addDirtyRect(x,y,w,h);
    217227        do {
    218228                memcpy(dst, src, w);
     
    220230                src += 320;
    221231        } while (--h);
    222232#else
    223         dst = (byte*)screen->pixels + y*640*2 + x*2;
     233        dst = (byte*)target->pixels + y*640*2 + x*2;
    224234        addDirtyRect(x,y,w,h);         
    225235        do {
    226236                i=0;
     
    234244
    235245#endif
    236246
    237         SDL_UnlockSurface(screen);
     247        SDL_UnlockSurface(target);
    238248}
    239249
    240250void updateScreen(Scumm *s) {
     251        SDL_Rect srcr, destr;
    241252
    242253        if (s->_fastMode&2)
    243254                return;
     
    250261        if(s->_palDirtyMax != -1) {
    251262                updatePalette(s);
    252263        }
     264
     265        if (s->_shakeMode) {
     266                /* if a shake has just begun, we take a copy of the screen */
     267                warning("(mode) mode=%d,frame=%d)",s->_shakeMode, s->_shakeFrame);
     268                if (s->_shakeFrame == 0) {
     269                        if (SDL_BlitSurface(screen, NULL, shakebuf, NULL))
     270                                error("SDL_BlitSurface failed: %s.\n", SDL_GetError());
     271                }
     272
     273                fullRedraw = true;
     274
     275                destr.x = 0; destr.y = 0;
     276                destr.w = shakebuf->w;
     277                srcr.x = 0; srcr.y = 0;
     278                srcr.w = screen->w;
     279
     280#if defined(SCALEUP_2x2)
     281                destr.h = shakebuf->h-4;
     282                srcr.h = screen->h-4;
     283#else
     284                destr.h = shakebuf->h-2;
     285                srcr.h = screen->h-2;
     286#endif
     287
     288                /* compensate for the fact that this will be called much more
     289                 * during mouse movement */
     290                if (((SDL_GetTicks()) >= s->_shakeTicks + 150) ||
     291                                (s->_shakeFrame == 0)) {
     292                        s->_shakeFrame++;
     293                        s->_shakeTicks = SDL_GetTicks();
     294                }
     295                if (s->_shakeFrame % 2) {
     296#if defined(SCALEUP_2x2)
     297                        srcr.y += 4;
     298#else
     299                        srcr.y += 2;
     300#endif
     301
     302                } else {
     303#if defined(SCALEUP_2x2)
     304                        destr.y += 4;
     305#else
     306                        destr.y += 2;
     307#endif
     308                }
     309                if (SDL_BlitSurface(shakebuf, &srcr, screen, &destr))
     310                        error("SDL_BlitSurface failed: %s.\n", SDL_GetError());
     311
     312#if defined(SCALEUP_2x2)
     313                destr.h = 4;
     314                if (s->_shakeFrame % 2)
     315                        destr.y = screen->h-4;
     316                else
     317                        destr.y = 0;
     318#else
     319                destr.h = 2;
     320                if (s->_shakeFrame % 2)
     321                        destr.y = screen->h-2;
     322                else
     323                        destr.y = 0;
     324#endif
     325                if (SDL_BlitSurface(blackness, NULL, screen, &destr))
     326                        error("SDL_BlitSurface failed: %s.\n", SDL_GetError());
     327
     328        } else if (s->_shakeFrame) {
     329                /* shake has just ended, clean up */
     330                warning("(frame) mode=%d,frame=%d)",s->_shakeMode, s->_shakeFrame);
     331                fullRedraw = true;
     332                if (SDL_BlitSurface(shakebuf, NULL, screen, NULL))
     333                        error("SDL_BlitSurface failed: %s.\n", SDL_GetError());
     334                s->_shakeFrame = 0;
     335        }       
     336
    253337        if (fullRedraw) {
    254338                SDL_UpdateRect(screen, 0,0,0,0);
    255339#if defined(SHOW_AREA)
     
    267351        }
    268352
    269353        numDirtyRects = 0;
     354        if (fullRedraw && (s->_shakeFrame || s->_shakeMode))
     355                fullRedraw = false;
    270356}
    271357
    272358void drawMouse(Scumm *s, int xdraw, int ydraw, int w, int h, byte *buf, bool visible) {
    273359        int x,y;
    274360        byte *dst,*bak;
    275361        byte color;
     362        SDL_Surface *target;
    276363
    277364        if (hide_mouse)
    278365                visible = false;
    279366
    280         if (SDL_LockSurface(screen)==-1)
     367        if (s->_shakeMode || s->_shakeFrame) {
     368                debug(0, "m=%d,f=%d)", s->_shakeMode, s->_shakeFrame);
     369                target = shakebuf;
     370        } else {
     371                target = screen;
     372        }
     373
     374        if (SDL_LockSurface(target)==-1)
    281375                error("SDL_LockSurface failed: %s.\n", SDL_GetError());
    282376
    283377#if defined(SCALEUP_2x2)
    284378
    285379        if (has_mouse) {
    286                 dst = (byte*)screen->pixels + old_mouse_y*640*2 + old_mouse_x*2;
     380                dst = (byte*)target->pixels + old_mouse_y*640*2 + old_mouse_x*2;
    287381                bak = old_backup;
    288382
    289383                for (y=0; y<old_mouse_h; y++,bak+=BAK_WIDTH*2,dst+=640*2) {
     
    299393        }
    300394
    301395        if (visible) {
    302                 dst = (byte*)screen->pixels + ydraw*640*2 + xdraw*2;
     396                dst = (byte*)target->pixels + ydraw*640*2 + xdraw*2;
    303397                bak = old_backup;
    304398
    305399                for (y=0; y<h; y++,dst+=640*2,bak+=BAK_WIDTH*2,buf+=w) {
     
    321415        }
    322416#else
    323417        if (has_mouse) {
    324                 dst = (byte*)screen->pixels + old_mouse_y*320 + old_mouse_x;
     418                dst = (byte*)target->pixels + old_mouse_y*320 + old_mouse_x;
    325419                bak = old_backup;
    326420
    327421                for (y=0; y<old_mouse_h; y++,bak+=BAK_WIDTH,dst+=320) {
     
    335429                }
    336430        }
    337431        if (visible) {
    338                 dst = (byte*)screen->pixels + ydraw*320 + xdraw;
     432                dst = (byte*)target->pixels + ydraw*320 + xdraw;
    339433                bak = old_backup;
    340434
    341435                for (y=0; y<h; y++,dst+=320,bak+=BAK_WIDTH,buf+=w) {
     
    355449
    356450#endif 
    357451
    358         SDL_UnlockSurface(screen);
     452        SDL_UnlockSurface(target);
    359453
    360454        if (has_mouse) {
    361455                has_mouse = false;
     
    430524        }
    431525
    432526#if !defined(SCALEUP_2x2)
    433         screen = SDL_SetVideoMode(320, 200, 8, fullScreen ? (SDL_SWSURFACE | SDL_FULLSCREEN) : SDL_SWSURFACE);
     527        if (!(screen = SDL_SetVideoMode(320, 200, 8,
     528                        fullScreen ? (SDL_SWSURFACE | SDL_FULLSCREEN) : SDL_SWSURFACE)))
    434529#else
    435         screen = SDL_SetVideoMode(640, 400, 8, fullScreen ? (SDL_SWSURFACE | SDL_FULLSCREEN) : SDL_SWSURFACE);
     530        if (!(screen = SDL_SetVideoMode(640, 400, 8,
     531                        fullScreen ? (SDL_SWSURFACE | SDL_FULLSCREEN) : SDL_SWSURFACE)))
    436532#endif
     533                error("SDL_SetVideoMode failed: %s.\n", SDL_GetError());
     534
     535        if (!(shakebuf = SDL_CreateRGBSurface(SDL_SWSURFACE, screen->w,
     536                                        screen->h, 8, 0, 0, 0, 0)))
     537                error("SDL_CreateRGBSurface failed: %s.\n", SDL_GetError());
     538
     539#if !defined(SCALEUP_2x2)
     540        if (!(blackness = SDL_CreateRGBSurface(SDL_SWSURFACE, screen->w, 2,
     541                                        8, 0, 0, 0, 0)))
     542#else
     543        if (!(blackness = SDL_CreateRGBSurface(SDL_SWSURFACE, screen->w, 4,
     544                                        8, 0, 0, 0, 0)))
     545#endif
     546                error("SDL_CreateRGBSurface failed: %s.\n", SDL_GetError());
     547
     548        if(SDL_FillRect(blackness, NULL, 0))
     549                error("SDL_FillRect failed: %s.\n", SDL_GetError());
    437550
    438551        printf("%d %d, %d %d, %d %d %d, %d %d %d %d %d\n",
    439552                sizeof(int8), sizeof(uint8),