[Scummvm-cvs-logs] CVS: scummvm sdl.cpp,1.87,1.88
Ludvig Strigeus
strigeus at users.sourceforge.net
Sat Apr 13 06:12:04 CEST 2002
- Previous message: [Scummvm-cvs-logs] CVS: scummvm main.cpp,1.1,1.2 scummvm.cpp,1.106,1.107 sdl.cpp,1.86,1.87
- Next message: [Scummvm-cvs-logs] CVS: scummvm/sound adlib.cpp,1.11,1.12 gmidi.cpp,1.13,1.14 gmidi.h,1.5,1.6 imuse.cpp,1.20,1.21
- Messages sorted by:
[ date ]
[ thread ]
[ subject ]
[ author ]
Update of /cvsroot/scummvm/scummvm
In directory usw-pr-cvs1:/tmp/cvs-serv17736
Modified Files:
sdl.cpp
Log Message:
fixed bug when switching mode
Index: sdl.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/sdl.cpp,v
retrieving revision 1.87
retrieving revision 1.88
diff -C2 -d -r1.87 -r1.88
*** sdl.cpp 13 Apr 2002 12:43:02 -0000 1.87
--- sdl.cpp 13 Apr 2002 13:11:24 -0000 1.88
***************
*** 1,4 ****
- #define NEED_SDL_HEADERS
-
#include "stdafx.h"
#include "scumm.h"
--- 1,2 ----
***************
*** 145,148 ****
--- 143,148 ----
void hotswap_gfx_mode();
+
+ void get_320x200_image(byte *buf);
};
***************
*** 185,192 ****
const byte *b = colors;
uint i;
for(i=0;i!=num;i++) {
! _cur_pal[i].r = b[0];
! _cur_pal[i].g = b[1];
! _cur_pal[i].b = b[2];
b += 4;
}
--- 185,193 ----
const byte *b = colors;
uint i;
+ SDL_Color *base = _cur_pal + start;
for(i=0;i!=num;i++) {
! base[i].r = b[0];
! base[i].g = b[1];
! base[i].b = b[2];
b += 4;
}
***************
*** 194,199 ****
if (_mode_flags & DF_FORCE_FULL_ON_PALETTE)
force_full = true;
!
! SDL_SetColors(sdl_screen, _cur_pal, start, num);
}
--- 195,199 ----
if (_mode_flags & DF_FORCE_FULL_ON_PALETTE)
force_full = true;
! SDL_SetColors(sdl_screen, base, start, num);
}
***************
*** 330,340 ****
_cur_pal = (SDL_Color*)calloc(sizeof(SDL_Color), 256);
- load_gfx_mode();
-
dirty_rect_list = (SDL_Rect*)calloc(NUM_DIRTY_RECT, sizeof(SDL_Rect));
-
_ms_backup = (byte*)malloc(MAX_MOUSE_W * MAX_MOUSE_H * MAX_SCALING);
-
dirty_checksums = (uint32*)calloc(CKSUM_NUM*2, sizeof(uint32));
}
--- 330,338 ----
_cur_pal = (SDL_Color*)calloc(sizeof(SDL_Color), 256);
dirty_rect_list = (SDL_Rect*)calloc(NUM_DIRTY_RECT, sizeof(SDL_Rect));
_ms_backup = (byte*)malloc(MAX_MOUSE_W * MAX_MOUSE_H * MAX_SCALING);
dirty_checksums = (uint32*)calloc(CKSUM_NUM*2, sizeof(uint32));
+
+ load_gfx_mode();
}
***************
*** 754,757 ****
--- 752,798 ----
}
+
+ /* retrieve the 320x200 bitmap currently being displayed */
+ void OSystem_SDL::get_320x200_image(byte *buf) {
+ /* make sure the mouse is gone */
+ undraw_mouse();
+
+ if (SDL_LockSurface(sdl_screen) == -1)
+ error("SDL_LockSurface failed: %s.\n", SDL_GetError());
+
+ byte *src;
+ int x,y;
+
+ switch(_internal_scaling) {
+ case 1:
+ memcpy(buf, sdl_screen->pixels, 320*200);
+ break;
+
+ case 2:
+ src = (byte*)sdl_screen->pixels;
+ for(y=0; y!=200; y++) {
+ for(x=0; x!=320; x++)
+ buf[x] = src[x*2];
+
+ buf += 320;
+ src += 320 * 2 * 2;
+ }
+ break;
+
+ case 3:
+ src = (byte*)sdl_screen->pixels;
+ for(y=0; y!=200; y++) {
+ for(x=0; x!=320; x++)
+ buf[x] = src[x*3];
+
+ buf += 320;
+ src += 320 * 3 * 3;
+ }
+ break;
+ }
+
+ SDL_UnlockSurface(sdl_screen);
+ }
+
void OSystem_SDL::hotswap_gfx_mode() {
/* hmm, need to allocate a 320x200 bitmap
***************
*** 762,791 ****
byte *bak_mem = (byte*)malloc(320*200);
! SDL_Surface *bak = SDL_CreateRGBSurfaceFrom(bak_mem, 320, 200, 8, 320, 0, 0, 0, 0);
! if (bak == NULL) {
! error("hotswap_gfx_mode::bak==NULL");
! }
!
! SDL_SetColors(bak, _cur_pal, 0, 256);
!
! SDL_Rect src_rect = {0, 0, 320 * _internal_scaling, 200 * _internal_scaling };
! static SDL_Rect dst_rect = {0, 0, 320, 200 };
!
! if (SDL_BlitSurface(sdl_screen, &src_rect, bak, &dst_rect) != 0)
! error("hotswap_gfx_mode::blit failed = %s", SDL_GetError());
!
! /* destroy the temp surface, the backup bitmap is in bak_mem now */
! SDL_FreeSurface(bak);
unload_gfx_mode();
load_gfx_mode();
- /* reset palette */
- SDL_SetColors(sdl_screen, _cur_pal, 0, 256);
-
/* blit image */
OSystem_SDL::copy_rect(bak_mem, 320, 0, 0, 320, 200);
-
free(bak_mem);
}
--- 803,820 ----
byte *bak_mem = (byte*)malloc(320*200);
! get_320x200_image(bak_mem);
unload_gfx_mode();
load_gfx_mode();
/* blit image */
OSystem_SDL::copy_rect(bak_mem, 320, 0, 0, 320, 200);
free(bak_mem);
+
+ /* reset palette */
+ SDL_SetColors(sdl_screen, _cur_pal, 0, 256);
+
+ force_full = true;
+ OSystem_SDL::update_screen();
}
- Previous message: [Scummvm-cvs-logs] CVS: scummvm main.cpp,1.1,1.2 scummvm.cpp,1.106,1.107 sdl.cpp,1.86,1.87
- Next message: [Scummvm-cvs-logs] CVS: scummvm/sound adlib.cpp,1.11,1.12 gmidi.cpp,1.13,1.14 gmidi.h,1.5,1.6 imuse.cpp,1.20,1.21
- Messages sorted by:
[ date ]
[ thread ]
[ subject ]
[ author ]
More information about the Scummvm-git-logs
mailing list