Numerous bug fixes that keep testeyes from crashing and dying.
authorEli Gottlieb <eligottlieb@gmail.com>
Wed, 14 Jul 2010 00:49:28 -0400
changeset 4795 6f0bc179771c
parent 4794 e562160a873f
child 4796 e8caf178d082
Numerous bug fixes that keep testeyes from crashing and dying.
src/video/SDL_shape.c
src/video/x11/SDL_x11shape.c
test/testeyes.c
--- a/src/video/SDL_shape.c	Tue Jul 13 02:43:49 2010 -0400
+++ b/src/video/SDL_shape.c	Wed Jul 14 00:49:28 2010 -0400
@@ -48,7 +48,7 @@
 void SDL_CalculateShapeBitmap(Uint8 alphacutoff,SDL_Surface *shape,Uint8* bitmap,Uint8 ppb,Uint8 value) {
 	int x = 0;
 	int y = 0;
-	Uint8 alpha = 0;
+	Uint8 r = 0,g = 0,b = 0,alpha = 0;
 	Uint8* pixel;
 	Uint32 bitmap_pixel;
 	if(SDL_MUSTLOCK(shape))
@@ -57,7 +57,7 @@
 		for(y = 0;y<shape->h;y++) {
 			pixel = shape->pixels + (y*shape->pitch) + (x*shape->format->BytesPerPixel);
 			alpha = 0;
-			SDL_GetRGBA(*(Uint32*)pixel,shape->format,NULL,NULL,NULL,&alpha);
+			SDL_GetRGBA(*(Uint32*)pixel,shape->format,&r,&g,&b,&alpha);
 			Uint32 bitmap_pixel = y*shape->w + x;
 			bitmap[bitmap_pixel / ppb] |= (alpha >= alphacutoff ? value : 0) << ((ppb - 1) - (bitmap_pixel % ppb));
 		}
--- a/src/video/x11/SDL_x11shape.c	Tue Jul 13 02:43:49 2010 -0400
+++ b/src/video/x11/SDL_x11shape.c	Wed Jul 14 00:49:28 2010 -0400
@@ -34,7 +34,10 @@
 		result->window = window;
 		result->alphacutoff = 0;
 		result->usershownflag = 0;
-		result->driverdata = malloc(sizeof(SDL_ShapeData));
+		SDL_ShapeData* data = malloc(sizeof(SDL_ShapeData));
+		result->driverdata = data;
+		data->bitmapsize = 0;
+		data->bitmap = NULL;
 		window->shaper = result;
 		int resized_properly = X11_ResizeWindowShape(window);
 		assert(resized_properly == 0);
--- a/test/testeyes.c	Tue Jul 13 02:43:49 2010 -0400
+++ b/test/testeyes.c	Wed Jul 14 00:49:28 2010 -0400
@@ -143,31 +143,47 @@
 		exit(-3);
 	}
 	
-	SDL_Color bnw_palette[2] = {{0,0,0,255},{255,255,255,255}};
-	SDL_Texture *eyes_texture = SDL_CreateTexture(SDL_PIXELFORMAT_INDEX1LSB,SDL_TEXTUREACCESS_STREAMING,eyes_width,eyes_height);
+	int bpp = 0;
+	Uint32 r = 0,g = 0,b = 0,a = 0;
+	SDL_PixelFormatEnumToMasks(SDL_PIXELFORMAT_ARGB4444,&bpp,&r,&g,&b,&a);
+	SDL_Surface *eyes = SDL_CreateRGBSurface(0,eyes_width,eyes_height,bpp,r,g,b,a);
+	if(eyes == NULL) {
+		SDL_DestroyRenderer(window);
+		SDL_DestroyWindow(window);
+		SDL_VideoQuit();
+		printf("Could not create eyes surface.\n");
+		exit(-4);
+	}
+	
+	void *pixels = NULL;
+	int pitch = 0;
+	SDL_Rect rect = {0,0,eyes_width,eyes_height};
+	if(SDL_MUSTLOCK(eyes))
+		SDL_LockSurface(eyes);
+	pixels = eyes->pixels;
+	pitch = eyes->pitch;
+	for(int y=0;y<eyes_height;y++)
+		for(int x=0;x<eyes_width;x++) {
+			Uint8 brightness = *(Uint8*)(eyes_bits+(eyes_width/8)*y+(x/8)) & (1 << (7 - x % 8)) ? 255 : 0;
+			*(Uint16*)(pixels+pitch*y+x*16/8) = SDL_MapRGBA(eyes->format,brightness,brightness,brightness,255);
+		}
+	if(SDL_MUSTLOCK(eyes))
+		SDL_UnlockSurface(eyes);
+	SDL_Texture *eyes_texture = SDL_CreateTextureFromSurface(SDL_PIXELFORMAT_ARGB4444,eyes);
 	if(eyes_texture == NULL) {
+		SDL_FreeSurface(eyes);
 		SDL_DestroyRenderer(window);
 		SDL_DestroyWindow(window);
 		SDL_VideoQuit();
 		printf("Could not create eyes texture.\n");
-		exit(-4);
+		exit(-5);
 	}
-	SDL_SetTexturePalette(eyes_texture,bnw_palette,0,2);
-	
-	void *pixels = NULL;
-	int pitch = 0;
-	SDL_Rect rect = {0,0,eyes_width,eyes_height};
-	SDL_LockTexture(eyes_texture,&rect,1,&pixels,&pitch);
-	for(int row = 0;row<eyes_height;row++)
-		memcpy(pixels+pitch*row,eyes_bits+(eyes_width/8)*row,eyes_width/8);
-	SDL_UnlockTexture(eyes_texture);
-	
-	int bpp = 0;
-	Uint32 r = 0,g = 0,b = 0,a = 0;
+
 	SDL_PixelFormatEnumToMasks(SDL_PIXELFORMAT_ARGB4444,&bpp,&r,&g,&b,&a);
 	SDL_Surface *mask = SDL_CreateRGBSurface(0,eyesmask_width,eyesmask_height,bpp,r,g,b,a);
 	if(mask == NULL) {
 		SDL_DestroyTexture(eyes_texture);
+		SDL_FreeSurface(eyes);
 		SDL_DestroyRenderer(window);
 		SDL_DestroyWindow(window);
 		SDL_VideoQuit();
@@ -178,6 +194,7 @@
 	if(SDL_MUSTLOCK(mask))
 		SDL_LockSurface(mask);
 	pixels = mask->pixels;
+	pitch = mask->pitch;
 	for(int y=0;y<eyesmask_height;y++)
 		for(int x=0;x<eyesmask_width;x++) {
 			Uint8 alpha = *(Uint8*)(eyesmask_bits+(eyesmask_width/8)*y+(x/8)) & (1 << (7 - x % 8)) ? 1 : 0;