test/testshape.c
author Sam Lantinga <slouken@libsdl.org>
Thu, 07 Dec 2017 16:08:09 -0800
changeset 11730 ac6c607e065c
parent 11111 0841489fa4df
child 11811 5d94cb6b24d3
permissions -rw-r--r--
Enable building the Metal renderer by default, and weak link the Metal framework so the SDL library is safe to use on older Macs
Also generate iOS versions of the Metal shaders
     1 /*
     2   Copyright (C) 1997-2017 Sam Lantinga <slouken@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 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: */