Mercurial > sdl-ios-xcode
changeset 4795:6f0bc179771c
Numerous bug fixes that keep testeyes from crashing and dying.
author | Eli Gottlieb <eligottlieb@gmail.com> |
---|---|
date | Wed, 14 Jul 2010 00:49:28 -0400 |
parents | e562160a873f |
children | e8caf178d082 |
files | src/video/SDL_shape.c src/video/x11/SDL_x11shape.c test/testeyes.c |
diffstat | 3 files changed, 38 insertions(+), 18 deletions(-) [+] |
line wrap: on
line diff
--- 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;