Ticket #7927: scummvm-shake.patch
File scummvm-shake.patch, 7.4 KB (added by , 22 years ago) |
---|
-
gfx.cpp
diff -Naur scummvm/gfx.cpp scummvm-shake-patch/gfx.cpp
old new 1409 1409 } 1410 1410 1411 1411 void Scumm::setShake(int mode) { 1412 if (mode!=-1) 1412 if (mode < 0) 1413 _shakeMode = 0; 1414 else 1413 1415 _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); 1418 1422 } 1419 1423 1420 1424 void Gdi::clearUpperMask() { -
scumm.h
diff -Naur scummvm/scumm.h scummvm-shake-patch/scumm.h
old new 1034 1034 1035 1035 int16 _talkDelay; 1036 1036 int16 _shakeMode; 1037 int16 _shakeFrame; 1038 uint32 _shakeTicks; 1037 1039 1038 1040 int16 _virtual_mouse_x, _virtual_mouse_y; 1039 1041 -
sdl.cpp
diff -Naur scummvm/sdl.cpp scummvm-shake-patch/sdl.cpp
old new 38 38 SOUND_DRIVER_TYPE snd_driv; 39 39 40 40 static SDL_Surface *screen; 41 static SDL_Surface *shakebuf; 42 static SDL_Surface *blackness; 41 43 42 44 void updateScreen(Scumm *s); 43 45 … … 57 59 } 58 60 59 61 SDL_SetColors(screen, colors, first, num); 62 SDL_SetColors(shakebuf, colors, first, num); 60 63 61 64 s->_palDirtyMax = -1; 62 65 s->_palDirtyMin = 0x3E8; … … 202 205 void blitToScreen(Scumm *s, byte *src,int x, int y, int w, int h) { 203 206 byte *dst; 204 207 int i; 208 SDL_Surface *target; 205 209 206 210 hide_mouse = true; 207 211 if (has_mouse) { 208 212 s->drawMouse(); 209 213 } 210 214 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) 212 222 error("SDL_LockSurface failed: %s.\n", SDL_GetError()); 213 223 214 224 #if !defined(SCALEUP_2x2) 215 dst = (byte*) screen->pixels + y*320 + x;225 dst = (byte*)target->pixels + y*320 + x; 216 226 addDirtyRect(x,y,w,h); 217 227 do { 218 228 memcpy(dst, src, w); … … 220 230 src += 320; 221 231 } while (--h); 222 232 #else 223 dst = (byte*) screen->pixels + y*640*2 + x*2;233 dst = (byte*)target->pixels + y*640*2 + x*2; 224 234 addDirtyRect(x,y,w,h); 225 235 do { 226 236 i=0; … … 234 244 235 245 #endif 236 246 237 SDL_UnlockSurface( screen);247 SDL_UnlockSurface(target); 238 248 } 239 249 240 250 void updateScreen(Scumm *s) { 251 SDL_Rect srcr, destr; 241 252 242 253 if (s->_fastMode&2) 243 254 return; … … 250 261 if(s->_palDirtyMax != -1) { 251 262 updatePalette(s); 252 263 } 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 253 337 if (fullRedraw) { 254 338 SDL_UpdateRect(screen, 0,0,0,0); 255 339 #if defined(SHOW_AREA) … … 267 351 } 268 352 269 353 numDirtyRects = 0; 354 if (fullRedraw && (s->_shakeFrame || s->_shakeMode)) 355 fullRedraw = false; 270 356 } 271 357 272 358 void drawMouse(Scumm *s, int xdraw, int ydraw, int w, int h, byte *buf, bool visible) { 273 359 int x,y; 274 360 byte *dst,*bak; 275 361 byte color; 362 SDL_Surface *target; 276 363 277 364 if (hide_mouse) 278 365 visible = false; 279 366 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) 281 375 error("SDL_LockSurface failed: %s.\n", SDL_GetError()); 282 376 283 377 #if defined(SCALEUP_2x2) 284 378 285 379 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; 287 381 bak = old_backup; 288 382 289 383 for (y=0; y<old_mouse_h; y++,bak+=BAK_WIDTH*2,dst+=640*2) { … … 299 393 } 300 394 301 395 if (visible) { 302 dst = (byte*) screen->pixels + ydraw*640*2 + xdraw*2;396 dst = (byte*)target->pixels + ydraw*640*2 + xdraw*2; 303 397 bak = old_backup; 304 398 305 399 for (y=0; y<h; y++,dst+=640*2,bak+=BAK_WIDTH*2,buf+=w) { … … 321 415 } 322 416 #else 323 417 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; 325 419 bak = old_backup; 326 420 327 421 for (y=0; y<old_mouse_h; y++,bak+=BAK_WIDTH,dst+=320) { … … 335 429 } 336 430 } 337 431 if (visible) { 338 dst = (byte*) screen->pixels + ydraw*320 + xdraw;432 dst = (byte*)target->pixels + ydraw*320 + xdraw; 339 433 bak = old_backup; 340 434 341 435 for (y=0; y<h; y++,dst+=320,bak+=BAK_WIDTH,buf+=w) { … … 355 449 356 450 #endif 357 451 358 SDL_UnlockSurface( screen);452 SDL_UnlockSurface(target); 359 453 360 454 if (has_mouse) { 361 455 has_mouse = false; … … 430 524 } 431 525 432 526 #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))) 434 529 #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))) 436 532 #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()); 437 550 438 551 printf("%d %d, %d %d, %d %d %d, %d %d %d %d %d\n", 439 552 sizeof(int8), sizeof(uint8),