#include #include #include #include #include #include #include #include #include #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) { 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; LoadedPicture* pictures = malloc(sizeof(LoadedPicture)*num_pictures); int i = 0; for(i=0;iformat; Uint32 format_enum = SDL_MasksToPixelFormatEnum (format->BitsPerPixel,format->Rmask,format->Gmask, format->Bmask,format->Amask); if(SDL_ISPIXELFORMAT_ALPHA(format_enum)) { pictures[i].mode.mode = ShapeModeBinarizeAlpha; pictures[i].mode.parameters.binarizationCutoff = 1; } else { pictures[i].mode.mode = ShapeModeColorKey; SDL_Color black = {0,0,0,0xff}; pictures[i].mode.parameters.colorKey = black; } } 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) current_picture = 0; SDL_QueryTexture(pictures[current_picture].texture,&format,&access,&texture_dimensions.w,&texture_dimensions.h); SDL_SetWindowSize(window,texture_dimensions.w,texture_dimensions.h); SDL_SetWindowShape(window,pictures[current_picture].surface,&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