Atlas - testshape.c

Home / ext / SDL2 / test Lines: 1 | Size: 7095 bytes [Download] [Show on GitHub] [Search similar files] [Raw] [Raw (proxy)]
[FILE BEGIN]
1/* 2 Copyright (C) 1997-2018 Sam Lantinga <[email protected]> 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 22typedef struct LoadedPicture { 23 SDL_Surface *surface; 24 SDL_Texture *texture; 25 SDL_WindowShapeMode mode; 26 const char* name; 27} LoadedPicture; 28 29void 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 41int 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 should_exit = 0; 52 unsigned int current_picture; 53 int button_down; 54 Uint32 pixelFormat = 0; 55 int access = 0; 56 SDL_Rect texture_dimensions; 57 58 /* Enable standard application logging */ 59 SDL_LogSetPriority(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO); 60 61 if(argc < 2) { 62 SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "SDL_Shape requires at least one bitmap file as argument."); 63 exit(-1); 64 } 65 66 if(SDL_VideoInit(NULL) == -1) { 67 SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Could not initialize SDL video."); 68 exit(-2); 69 } 70 71 num_pictures = argc - 1; 72 pictures = (LoadedPicture *)SDL_malloc(sizeof(LoadedPicture)*num_pictures); 73 if (!pictures) { 74 SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Could not allocate memory."); 75 exit(1); 76 } 77 for(i=0;i<num_pictures;i++) 78 pictures[i].surface = NULL; 79 for(i=0;i<num_pictures;i++) { 80 pictures[i].surface = SDL_LoadBMP(argv[i+1]); 81 pictures[i].name = argv[i+1]; 82 if(pictures[i].surface == NULL) { 83 for(j=0;j<num_pictures;j++) 84 SDL_FreeSurface(pictures[j].surface); 85 SDL_free(pictures); 86 SDL_VideoQuit(); 87 SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Could not load surface from named bitmap file: %s", argv[i+1]); 88 exit(-3); 89 } 90 91 format = pictures[i].surface->format; 92 if(SDL_ISPIXELFORMAT_ALPHA(format->format)) { 93 pictures[i].mode.mode = ShapeModeBinarizeAlpha; 94 pictures[i].mode.parameters.binarizationCutoff = 255; 95 } 96 else { 97 pictures[i].mode.mode = ShapeModeColorKey; 98 pictures[i].mode.parameters.colorKey = black; 99 } 100 } 101 102 window = SDL_CreateShapedWindow("SDL_Shape test", 103 SHAPED_WINDOW_X, SHAPED_WINDOW_Y, 104 SHAPED_WINDOW_DIMENSION,SHAPED_WINDOW_DIMENSION, 105 0); 106 SDL_SetWindowPosition(window, SHAPED_WINDOW_X, SHAPED_WINDOW_Y); 107 if(window == NULL) { 108 for(i=0;i<num_pictures;i++) 109 SDL_FreeSurface(pictures[i].surface); 110 SDL_free(pictures); 111 SDL_VideoQuit(); 112 SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Could not create shaped window for SDL_Shape."); 113 exit(-4); 114 } 115 renderer = SDL_CreateRenderer(window,-1,0); 116 if (!renderer) { 117 SDL_DestroyWindow(window); 118 for(i=0;i<num_pictures;i++) 119 SDL_FreeSurface(pictures[i].surface); 120 SDL_free(pictures); 121 SDL_VideoQuit(); 122 SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Could not create rendering context for SDL_Shape window."); 123 exit(-5); 124 } 125 126 for(i=0;i<num_pictures;i++) 127 pictures[i].texture = NULL; 128 for(i=0;i<num_pictures;i++) { 129 pictures[i].texture = SDL_CreateTextureFromSurface(renderer,pictures[i].surface); 130 if(pictures[i].texture == NULL) { 131 for(i=0;i<num_pictures;i++) 132 if(pictures[i].texture != NULL) 133 SDL_DestroyTexture(pictures[i].texture); 134 for(i=0;i<num_pictures;i++) 135 SDL_FreeSurface(pictures[i].surface); 136 SDL_free(pictures); 137 SDL_DestroyRenderer(renderer); 138 SDL_DestroyWindow(window); 139 SDL_VideoQuit(); 140 SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Could not create texture for SDL_shape."); 141 exit(-6); 142 } 143 } 144 145 should_exit = 0; 146 current_picture = 0; 147 button_down = 0; 148 texture_dimensions.h = 0; 149 texture_dimensions.w = 0; 150 texture_dimensions.x = 0; 151 texture_dimensions.y = 0; 152 SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION, "Changing to shaped bmp: %s", pictures[current_picture].name); 153 SDL_QueryTexture(pictures[current_picture].texture,(Uint32 *)&pixelFormat,(int *)&access,&texture_dimensions.w,&texture_dimensions.h); 154 SDL_SetWindowSize(window,texture_dimensions.w,texture_dimensions.h); 155 SDL_SetWindowShape(window,pictures[current_picture].surface,&pictures[current_picture].mode); 156 while(should_exit == 0) { 157 while (SDL_PollEvent(&event)) { 158 if(event.type == SDL_KEYDOWN) { 159 button_down = 1; 160 if(event.key.keysym.sym == SDLK_ESCAPE) { 161 should_exit = 1; 162 break; 163 } 164 } 165 if(button_down && event.type == SDL_KEYUP) { 166 button_down = 0; 167 current_picture += 1; 168 if(current_picture >= num_pictures) 169 current_picture = 0; 170 SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION, "Changing to shaped bmp: %s", pictures[current_picture].name); 171 SDL_QueryTexture(pictures[current_picture].texture,(Uint32 *)&pixelFormat,(int *)&access,&texture_dimensions.w,&texture_dimensions.h); 172 SDL_SetWindowSize(window,texture_dimensions.w,texture_dimensions.h); 173 SDL_SetWindowShape(window,pictures[current_picture].surface,&pictures[current_picture].mode); 174 } 175 if (event.type == SDL_QUIT) { 176 should_exit = 1; 177 break; 178 } 179 } 180 render(renderer,pictures[current_picture].texture,texture_dimensions); 181 SDL_Delay(10); 182 } 183 184 /* Free the textures. */ 185 for(i=0;i<num_pictures;i++) 186 SDL_DestroyTexture(pictures[i].texture); 187 SDL_DestroyRenderer(renderer); 188 /* Destroy the window. */ 189 SDL_DestroyWindow(window); 190 /* Free the original surfaces backing the textures. */ 191 for(i=0;i<num_pictures;i++) 192 SDL_FreeSurface(pictures[i].surface); 193 SDL_free(pictures); 194 /* Call SDL_VideoQuit() before quitting. */ 195 SDL_VideoQuit(); 196 197 return 0; 198} 199 200/* vi: set ts=4 sw=4 expandtab: */ 201
[FILE END]
(C) 2025 0x4248 (C) 2025 4248 Media and 4248 Systems, All part of 0x4248 See LICENCE files for more information. Not all files are by 0x4248 always check Licencing.