[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


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();
  }
  





More information about the Scummvm-git-logs mailing list