#include #include #include #include "SDL.h" #include "SDL_shape.h" #define SHAPED_WINDOW_X 150 #define SHAPED_WINDOW_Y 150 #define SHAPED_WINDOW_DIMENSION 640 #define TICK_INTERVAL 1000/60 typedef struct LoadedPicture { SDL_Surface *surface; SDL_Texture *texture; SDL_WindowShapeMode mode; } LoadedPicture; void render(SDL_Window* window,SDL_Texture *texture,SDL_Rect texture_dimensions) { SDL_SelectRenderer(window); //Clear render-target to blue. SDL_SetRenderDrawColor(0x00,0x00,0xff,0xff); SDL_RenderClear(); //Render the texture. SDL_RenderCopy(texture,&texture_dimensions,&texture_dimensions); SDL_RenderPresent(); } static Uint32 next_time; Uint32 time_left() { Uint32 now = SDL_GetTicks(); if(next_time <= now) return 0; else return next_time - now; } int main(int argc,char** argv) { Uint8 num_pictures; LoadedPicture* pictures; int i, j; SDL_PixelFormat* format = NULL; SDL_Window *window; SDL_Color black = {0,0,0,0xff}; SDL_Event event; int event_pending = 0; int should_exit = 0; unsigned int current_picture; int button_down; Uint32 pixelFormat = 0; int access = 0; SDL_Rect texture_dimensions;; 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); } num_pictures = argc - 1; pictures = (LoadedPicture *)malloc(sizeof(LoadedPicture)*num_pictures); for(i=0;iformat; if(format->Amask != 0) { pictures[i].mode.mode = ShapeModeBinarizeAlpha; pictures[i].mode.parameters.binarizationCutoff = 1; } else { pictures[i].mode.mode = ShapeModeColorKey; pictures[i].mode.parameters.colorKey = black; } } 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) current_picture = 0; SDL_QueryTexture(pictures[current_picture].texture,(Uint32 *)&pixelFormat,(int *)&access,&texture_dimensions.w,&texture_dimensions.h); SDL_SetWindowSize(window,texture_dimensions.w,texture_dimensions.h); SDL_SetWindowShape(window,pictures[current_picture].surface,&pictures[current_picture].mode); } if(event.type == SDL_QUIT) should_exit = 1; event_pending = 0; } render(window,pictures[current_picture].texture,texture_dimensions); SDL_Delay(time_left()); next_time += TICK_INTERVAL; } //Free the textures. for(i=0;i