Mercurial > sdl-ios-xcode
diff test/testshape.c @ 4799:a0e096916474
Rewrote test program for shaped windows. It definitely displays recognizable pictures now, but the resizing and shaping functionality isn't behaving correctly, possibly due to a miscalculation of alpha values.
author | Eli Gottlieb <eligottlieb@gmail.com> |
---|---|
date | Sun, 18 Jul 2010 21:31:22 -0400 |
parents | |
children | 6d4be626225f |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/testshape.c Sun Jul 18 21:31:22 2010 -0400 @@ -0,0 +1,168 @@ +#include <stdlib.h> +#include <math.h> +#include <SDL_events.h> +#include <SDL_rect.h> +#include <SDL_pixels.h> +#include <SDL_video.h> +#include <SDL_shape.h> + +#define SHAPED_WINDOW_X 150 +#define SHAPED_WINDOW_Y 150 +#define SHAPED_WINDOW_DIMENSION 640 + +int main(int argc,char** argv) { + if(argc < 2) { + printf("SDL_Shape requires at least one bitmap file as argument.\n"); + exit(-1); + } + + if(SDL_VideoInit(NULL,0) == -1) { + printf("Could not initialize SDL video.\n"); + exit(-2); + } + + Uint8 num_pictures = argc - 1; + SDL_Surface **pictures = malloc(sizeof(SDL_Surface*)*num_pictures); + int i = 0; + for(i=0;i<num_pictures;i++) + pictures[i] = NULL; + for(i=0;i<num_pictures;i++) { + SDL_Surface *original = SDL_LoadBMP(argv[i+1]); + if(original == NULL) { + int j = 0; + for(j=0;j<num_pictures;j++) + if(pictures[j] != NULL) + SDL_FreeSurface(pictures[j]); + free(pictures); + SDL_VideoQuit(); + printf("Could not load surface from named bitmap file.\n"); + exit(-3); + } + //THIS CONVERSION ROUTINE IS FRAGILE! It relies in the fact that only certain portions of the format structure must be filled in to use it. + SDL_PixelFormat format = {NULL,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; + SDL_PixelFormatEnumToMasks(SDL_PIXELFORMAT_RGBA8888,&format.BitsPerPixel,&format.Rmask,&format.Gmask,&format.Bmask,&format.Amask); + format.BytesPerPixel = format.BitsPerPixel / 8 + (format.BitsPerPixel % 8 > 0 ? 1 : 0); + pictures[i] = SDL_ConvertSurface(original,&format,0); + //We have no more need of the original now that we have our desired format. + SDL_FreeSurface(original); + if(pictures[i] == NULL) { + int j = 0; + for(j=0;j<num_pictures;j++) + if(pictures[j] != NULL) + SDL_FreeSurface(pictures[j]); + free(pictures); + SDL_VideoQuit(); + printf("Could not convert bitmap surface to desired format.\n"); + exit(-3); + } + + if(SDL_MUSTLOCK(pictures[i])) + SDL_LockSurface(pictures[i]); + + void* pixels = pictures[i]->pixels; + unsigned int pitch = pictures[i]->pitch; + int y =0,x = 0; + for(y=0;y<pictures[i]->h;y++) + for(x=0;x<pictures[i]->w;x++) { + Uint32* pixel = pixels+y*pitch+x*pictures[i]->format->BytesPerPixel; + Uint8 r = 0,g = 0,b = 0; + SDL_GetRGB(*pixel,pictures[i]->format,&r,&g,&b); + if(r == g == b == 0x00) + *pixel = SDL_MapRGBA(pictures[i]->format,r,g,b,0); + } + + if(SDL_MUSTLOCK(pictures[i])) + SDL_UnlockSurface(pictures[i]); + } + + SDL_Window *window = SDL_CreateShapedWindow("SDL_Shape test",SHAPED_WINDOW_X,SHAPED_WINDOW_Y,SHAPED_WINDOW_DIMENSION,SHAPED_WINDOW_DIMENSION,SDL_WINDOW_RESIZABLE | SDL_WINDOW_SHOWN); + if(window == NULL) { + for(i=0;i<num_pictures;i++) + SDL_FreeSurface(pictures[i]); + free(pictures); + SDL_VideoQuit(); + printf("Could not create shaped window for SDL_Shape.\n"); + exit(-4); + } + if(SDL_CreateRenderer(window,-1,SDL_RENDERER_PRESENTFLIP2) == -1) { + SDL_DestroyWindow(window); + for(i=0;i<num_pictures;i++) + SDL_FreeSurface(pictures[i]); + free(pictures); + SDL_VideoQuit(); + printf("Could not create rendering context for SDL_Shape window.\n"); + exit(-5); + } + + SDL_Texture **textures = malloc(sizeof(SDL_Texture*)*num_pictures); + for(i=0;i<num_pictures;i++) + textures[i] = NULL; + for(i=0;i<num_pictures;i++) { + textures[i] = SDL_CreateTextureFromSurface(0,pictures[i]); + if(textures[i] == NULL) { + int j = 0; + for(j=0;j<num_pictures;i++) + if(textures[i] != NULL) + SDL_DestroyTexture(textures[i]); + free(textures); + for(i=0;i<num_pictures;i++) + SDL_FreeSurface(pictures[i]); + free(pictures); + SDL_DestroyRenderer(window); + SDL_DestroyWindow(window); + SDL_VideoQuit(); + printf("Could not create texture for SDL_shape.\n"); + exit(-6); + } + } + + SDL_Event event; + int event_pending = 0; + event_pending = SDL_PollEvent(&event); + unsigned int current_picture = 0; + SDL_WindowShapeMode mode = {ShapeModeDefault,1}; + SDL_SetWindowShape(window,pictures[current_picture],&mode); + int mouse_down = 0; + Uint32 format,access; + SDL_Rect texture_dimensions = {0,0,0,0}; + SDL_QueryTexture(textures[current_picture],&format,&access,&texture_dimensions.w,&texture_dimensions.h); + SDL_SetWindowSize(window,texture_dimensions.w,texture_dimensions.h); + while(event.type != SDL_QUIT) { + if(event.type == SDL_MOUSEBUTTONDOWN) + mouse_down = 1; + if(mouse_down && event.type == SDL_MOUSEBUTTONUP) { + mouse_down = 0; + current_picture += 1; + if(current_picture >= num_pictures) + current_picture = 0; + SDL_QueryTexture(textures[current_picture],&format,&access,&texture_dimensions.w,&texture_dimensions.h); + SDL_SetWindowSize(window,texture_dimensions.w,texture_dimensions.h); + SDL_SetWindowShape(window,pictures[current_picture],&mode); + } + + SDL_SelectRenderer(window); + + //Clear render-target to blue. + SDL_SetRenderDrawColor(0x00,0x00,0xff,0xff); + SDL_RenderClear(); + + //Render the texture. + SDL_RenderCopy(textures[current_picture],&texture_dimensions,&texture_dimensions); + + SDL_RenderPresent(); + event_pending = SDL_PollEvent(&event); + } + + //Free the textures. + for(i=0;i<num_pictures;i++) + SDL_DestroyTexture(textures[i]); + free(textures); + //Destroy the window. + SDL_DestroyWindow(window); + //Free the original surfaces backing the textures. + for(i=0;i<num_pictures;i++) + SDL_FreeSurface(pictures[i]); + free(pictures); + //Call SDL_VideoQuit() before quitting. + SDL_VideoQuit(); +}