cscg22-gearboy

CSCG 2022 Challenge 'Gearboy'
git clone https://git.sinitax.com/sinitax/cscg22-gearboy
Log | Files | Refs | sfeed.txt

testshape.c (7125B)


      1/*
      2  Copyright (C) 1997-2014 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
     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 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: */