1 /* 2 Copyright (C) 1997-2014 Sam Lantinga <slouken (at) libsdl.org> 3 4 This software is provided 'as-is', without any express or implied 5 warranty. In no event will the authors be held liable for any damages 6 arising from the use of this software. 7 8 Permission is granted to anyone to use this software for any purpose, 9 including commercial applications, and to alter it and redistribute it 10 freely. 11 */ 12 #include <stdlib.h> 13 #include <math.h> 14 #include <stdio.h> 15 #include "SDL.h" 16 #include "SDL_shape.h" 17 18 #define SHAPED_WINDOW_X 150 19 #define SHAPED_WINDOW_Y 150 20 #define SHAPED_WINDOW_DIMENSION 640 21 22 typedef struct LoadedPicture { 23 SDL_Surface *surface; 24 SDL_Texture *texture; 25 SDL_WindowShapeMode mode; 26 const char* name; 27 } LoadedPicture; 28 29 void render(SDL_Renderer *renderer,SDL_Texture *texture,SDL_Rect texture_dimensions) 30 { 31 /* Clear render-target to blue. */ 32 SDL_SetRenderDrawColor(renderer,0x00,0x00,0xff,0xff); 33 SDL_RenderClear(renderer); 34 35 /* Render the texture. */ 36 SDL_RenderCopy(renderer,texture,&texture_dimensions,&texture_dimensions); 37 38 SDL_RenderPresent(renderer); 39 } 40 41 int main(int argc,char** argv) 42 { 43 Uint8 num_pictures; 44 LoadedPicture* pictures; 45 int i, j; 46 SDL_PixelFormat* format = NULL; 47 SDL_Window *window; 48 SDL_Renderer *renderer; 49 SDL_Color black = {0,0,0,0xff}; 50 SDL_Event event; 51 int event_pending = 0; 52 int should_exit = 0; 53 unsigned int current_picture; 54 int button_down; 55 Uint32 pixelFormat = 0; 56 int access = 0; 57 SDL_Rect texture_dimensions;; 58 59 /* Enable standard application logging */ 60 SDL_LogSetPriority(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO); 61 62 if(argc < 2) { 63 SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "SDL_Shape requires at least one bitmap file as argument."); 64 exit(-1); 65 } 66 67 if(SDL_VideoInit(NULL) == -1) { 68 SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Could not initialize SDL video."); 69 exit(-2); 70 } 71 72 num_pictures = argc - 1; 73 pictures = (LoadedPicture *)SDL_malloc(sizeof(LoadedPicture)*num_pictures); 74 for(i=0;i<num_pictures;i++) 75 pictures[i].surface = NULL; 76 for(i=0;i<num_pictures;i++) { 77 pictures[i].surface = SDL_LoadBMP(argv[i+1]); 78 pictures[i].name = argv[i+1]; 79 if(pictures[i].surface == NULL) { 80 j = 0; 81 for(j=0;j<num_pictures;j++) 82 SDL_FreeSurface(pictures[j].surface); 83 SDL_free(pictures); 84 SDL_VideoQuit(); 85 SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Could not load surface from named bitmap file: %s", argv[i+1]); 86 exit(-3); 87 } 88 89 format = pictures[i].surface->format; 90 if(SDL_ISPIXELFORMAT_ALPHA(format->format)) { 91 pictures[i].mode.mode = ShapeModeBinarizeAlpha; 92 pictures[i].mode.parameters.binarizationCutoff = 255; 93 } 94 else { 95 pictures[i].mode.mode = ShapeModeColorKey; 96 pictures[i].mode.parameters.colorKey = black; 97 } 98 } 99 100 window = SDL_CreateShapedWindow("SDL_Shape test", 101 SHAPED_WINDOW_X, SHAPED_WINDOW_Y, 102 SHAPED_WINDOW_DIMENSION,SHAPED_WINDOW_DIMENSION, 103 0); 104 SDL_SetWindowPosition(window, SHAPED_WINDOW_X, SHAPED_WINDOW_Y); 105 if(window == NULL) { 106 for(i=0;i<num_pictures;i++) 107 SDL_FreeSurface(pictures[i].surface); 108 SDL_free(pictures); 109 SDL_VideoQuit(); 110 SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Could not create shaped window for SDL_Shape."); 111 exit(-4); 112 } 113 renderer = SDL_CreateRenderer(window,-1,0); 114 if (!renderer) { 115 SDL_DestroyWindow(window); 116 for(i=0;i<num_pictures;i++) 117 SDL_FreeSurface(pictures[i].surface); 118 SDL_free(pictures); 119 SDL_VideoQuit(); 120 SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Could not create rendering context for SDL_Shape window."); 121 exit(-5); 122 } 123 124 for(i=0;i<num_pictures;i++) 125 pictures[i].texture = NULL; 126 for(i=0;i<num_pictures;i++) { 127 pictures[i].texture = SDL_CreateTextureFromSurface(renderer,pictures[i].surface); 128 if(pictures[i].texture == NULL) { 129 j = 0; 130 for(j=0;j<num_pictures;i++) 131 if(pictures[i].texture != NULL) 132 SDL_DestroyTexture(pictures[i].texture); 133 for(i=0;i<num_pictures;i++) 134 SDL_FreeSurface(pictures[i].surface); 135 SDL_free(pictures); 136 SDL_DestroyRenderer(renderer); 137 SDL_DestroyWindow(window); 138 SDL_VideoQuit(); 139 SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Could not create texture for SDL_shape."); 140 exit(-6); 141 } 142 } 143 144 event_pending = 0; 145 should_exit = 0; 146 event_pending = SDL_PollEvent(&event); 147 current_picture = 0; 148 button_down = 0; 149 texture_dimensions.h = 0; 150 texture_dimensions.w = 0; 151 texture_dimensions.x = 0; 152 texture_dimensions.y = 0; 153 SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION, "Changing to shaped bmp: %s", pictures[current_picture].name); 154 SDL_QueryTexture(pictures[current_picture].texture,(Uint32 *)&pixelFormat,(int *)&access,&texture_dimensions.w,&texture_dimensions.h); 155 SDL_SetWindowSize(window,texture_dimensions.w,texture_dimensions.h); 156 SDL_SetWindowShape(window,pictures[current_picture].surface,&pictures[current_picture].mode); 157 while(should_exit == 0) { 158 event_pending = SDL_PollEvent(&event); 159 if(event_pending == 1) { 160 if(event.type == SDL_KEYDOWN) { 161 button_down = 1; 162 if(event.key.keysym.sym == SDLK_ESCAPE) { 163 should_exit = 1; 164 break; 165 } 166 } 167 if(button_down && event.type == SDL_KEYUP) { 168 button_down = 0; 169 current_picture += 1; 170 if(current_picture >= num_pictures) 171 current_picture = 0; 172 SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION, "Changing to shaped bmp: %s", pictures[current_picture].name); 173 SDL_QueryTexture(pictures[current_picture].texture,(Uint32 *)&pixelFormat,(int *)&access,&texture_dimensions.w,&texture_dimensions.h); 174 SDL_SetWindowSize(window,texture_dimensions.w,texture_dimensions.h); 175 SDL_SetWindowShape(window,pictures[current_picture].surface,&pictures[current_picture].mode); 176 } 177 if(event.type == SDL_QUIT) 178 should_exit = 1; 179 event_pending = 0; 180 } 181 render(renderer,pictures[current_picture].texture,texture_dimensions); 182 SDL_Delay(10); 183 } 184 185 /* Free the textures. */ 186 for(i=0;i<num_pictures;i++) 187 SDL_DestroyTexture(pictures[i].texture); 188 SDL_DestroyRenderer(renderer); 189 /* Destroy the window. */ 190 SDL_DestroyWindow(window); 191 /* Free the original surfaces backing the textures. */ 192 for(i=0;i<num_pictures;i++) 193 SDL_FreeSurface(pictures[i].surface); 194 SDL_free(pictures); 195 /* Call SDL_VideoQuit() before quitting. */ 196 SDL_VideoQuit(); 197 198 return 0; 199 } 200 201 /* vi: set ts=4 sw=4 expandtab: */ 202