SDL  2.0
testshape.c File Reference
#include <stdlib.h>
#include <math.h>
#include <stdio.h>
#include "SDL.h"
#include "SDL_shape.h"
+ Include dependency graph for testshape.c:

Go to the source code of this file.

Data Structures

struct  LoadedPicture

Macros

#define SHAPED_WINDOW_X   150
#define SHAPED_WINDOW_Y   150
#define SHAPED_WINDOW_DIMENSION   640

Functions

void render (SDL_Renderer *renderer, SDL_Texture *texture, SDL_Rect texture_dimensions)
int main (int argc, char **argv)

Macro Definition Documentation

#define SHAPED_WINDOW_DIMENSION   640

Definition at line 20 of file testshape.c.

Referenced by main().

#define SHAPED_WINDOW_X   150

Definition at line 18 of file testshape.c.

Referenced by main().

#define SHAPED_WINDOW_Y   150

Definition at line 19 of file testshape.c.

Referenced by main().

Function Documentation

int main ( int  argc,
char **  argv 
)

Definition at line 41 of file testshape.c.

References SDL_WindowShapeParams::binarizationCutoff, SDL_WindowShapeParams::colorKey, SDL_Surface::format, SDL_PixelFormat::format, SDL_Rect::h, i, j, SDL_Event::key, SDL_KeyboardEvent::keysym, LoadedPicture::mode, SDL_WindowShapeMode::mode, LoadedPicture::name, NULL, SDL_WindowShapeMode::parameters, render(), renderer, SDL_CreateRenderer, SDL_CreateShapedWindow, SDL_CreateTextureFromSurface, SDL_Delay, SDL_DestroyRenderer, SDL_DestroyTexture, SDL_DestroyWindow, SDL_free, SDL_FreeSurface, SDL_ISPIXELFORMAT_ALPHA, SDL_KEYDOWN, SDL_KEYUP, SDL_LoadBMP, SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO, SDL_LogError, SDL_LogInfo, SDL_LogSetPriority, SDL_malloc, SDL_PollEvent, SDL_QueryTexture, SDL_QUIT, SDL_SetWindowPosition, SDL_SetWindowShape, SDL_SetWindowSize, SDL_VideoInit, SDL_VideoQuit, SDLK_ESCAPE, SHAPED_WINDOW_DIMENSION, SHAPED_WINDOW_X, SHAPED_WINDOW_Y, ShapeModeBinarizeAlpha, ShapeModeColorKey, LoadedPicture::surface, SDL_Keysym::sym, LoadedPicture::texture, SDL_Event::type, SDL_Rect::w, SDL_Rect::x, and SDL_Rect::y.

{
Uint8 num_pictures;
LoadedPicture* pictures;
int i, j;
SDL_Color black = {0,0,0,0xff};
int should_exit = 0;
unsigned int current_picture;
int button_down;
Uint32 pixelFormat = 0;
int access = 0;
SDL_Rect texture_dimensions;
/* Enable standard application logging */
if(argc < 2) {
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "SDL_Shape requires at least one bitmap file as argument.");
exit(-1);
}
if(SDL_VideoInit(NULL) == -1) {
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Could not initialize SDL video.");
exit(-2);
}
num_pictures = argc - 1;
pictures = (LoadedPicture *)SDL_malloc(sizeof(LoadedPicture)*num_pictures);
if (!pictures) {
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Could not allocate memory.");
exit(1);
}
for(i=0;i<num_pictures;i++)
pictures[i].surface = NULL;
for(i=0;i<num_pictures;i++) {
pictures[i].surface = SDL_LoadBMP(argv[i+1]);
pictures[i].name = argv[i+1];
if(pictures[i].surface == NULL) {
for(j=0;j<num_pictures;j++)
SDL_FreeSurface(pictures[j].surface);
SDL_free(pictures);
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Could not load surface from named bitmap file: %s", argv[i+1]);
exit(-3);
}
format = pictures[i].surface->format;
}
else {
pictures[i].mode.parameters.colorKey = black;
}
}
window = SDL_CreateShapedWindow("SDL_Shape test",
0);
if(window == NULL) {
for(i=0;i<num_pictures;i++)
SDL_FreeSurface(pictures[i].surface);
SDL_free(pictures);
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Could not create shaped window for SDL_Shape.");
exit(-4);
}
renderer = SDL_CreateRenderer(window,-1,0);
if (!renderer) {
for(i=0;i<num_pictures;i++)
SDL_FreeSurface(pictures[i].surface);
SDL_free(pictures);
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Could not create rendering context for SDL_Shape window.");
exit(-5);
}
for(i=0;i<num_pictures;i++)
pictures[i].texture = NULL;
for(i=0;i<num_pictures;i++) {
pictures[i].texture = SDL_CreateTextureFromSurface(renderer,pictures[i].surface);
if(pictures[i].texture == NULL) {
for(i=0;i<num_pictures;i++)
if(pictures[i].texture != NULL)
for(i=0;i<num_pictures;i++)
SDL_FreeSurface(pictures[i].surface);
SDL_free(pictures);
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Could not create texture for SDL_shape.");
exit(-6);
}
}
should_exit = 0;
current_picture = 0;
button_down = 0;
texture_dimensions.h = 0;
texture_dimensions.w = 0;
texture_dimensions.x = 0;
texture_dimensions.y = 0;
SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION, "Changing to shaped bmp: %s", pictures[current_picture].name);
SDL_QueryTexture(pictures[current_picture].texture,(Uint32 *)&pixelFormat,(int *)&access,&texture_dimensions.w,&texture_dimensions.h);
SDL_SetWindowSize(window,texture_dimensions.w,texture_dimensions.h);
SDL_SetWindowShape(window,pictures[current_picture].surface,&pictures[current_picture].mode);
while(should_exit == 0) {
while (SDL_PollEvent(&event)) {
if(event.type == SDL_KEYDOWN) {
button_down = 1;
if(event.key.keysym.sym == SDLK_ESCAPE) {
should_exit = 1;
break;
}
}
if(button_down && event.type == SDL_KEYUP) {
button_down = 0;
current_picture += 1;
if(current_picture >= num_pictures)
current_picture = 0;
SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION, "Changing to shaped bmp: %s", pictures[current_picture].name);
SDL_QueryTexture(pictures[current_picture].texture,(Uint32 *)&pixelFormat,(int *)&access,&texture_dimensions.w,&texture_dimensions.h);
SDL_SetWindowSize(window,texture_dimensions.w,texture_dimensions.h);
SDL_SetWindowShape(window,pictures[current_picture].surface,&pictures[current_picture].mode);
}
if (event.type == SDL_QUIT) {
should_exit = 1;
break;
}
}
render(renderer,pictures[current_picture].texture,texture_dimensions);
SDL_Delay(10);
}
/* Free the textures. */
for(i=0;i<num_pictures;i++)
SDL_DestroyTexture(pictures[i].texture);
/* Destroy the window. */
/* Free the original surfaces backing the textures. */
for(i=0;i<num_pictures;i++)
SDL_FreeSurface(pictures[i].surface);
SDL_free(pictures);
/* Call SDL_VideoQuit() before quitting. */
return 0;
}
void render ( SDL_Renderer renderer,
SDL_Texture texture,
SDL_Rect  texture_dimensions 
)

Definition at line 29 of file testshape.c.

References SDL_RenderClear, SDL_RenderCopy, SDL_RenderPresent, and SDL_SetRenderDrawColor.

Referenced by main().

{
/* Clear render-target to blue. */
SDL_SetRenderDrawColor(renderer,0x00,0x00,0xff,0xff);
SDL_RenderClear(renderer);
/* Render the texture. */
SDL_RenderCopy(renderer,texture,&texture_dimensions,&texture_dimensions);
SDL_RenderPresent(renderer);
}