Mercurial > sdl-ios-xcode
diff test/testshape.c @ 5150:ad50b3db78bd
The rendering functions take a context so it's clear what window they're drawing to. This also potentially opens to the door to multi-threaded rendering in the future.
author | Sam Lantinga <slouken@libsdl.org> |
---|---|
date | Tue, 01 Feb 2011 19:19:43 -0800 |
parents | c8e049de174c |
children | b3ccd1947786 |
line wrap: on
line diff
--- a/test/testshape.c Tue Feb 01 19:15:42 2011 -0800 +++ b/test/testshape.c Tue Feb 01 19:19:43 2011 -0800 @@ -11,177 +11,183 @@ #define TICK_INTERVAL 1000/10 typedef struct LoadedPicture { - SDL_Surface *surface; - SDL_Texture *texture; - SDL_WindowShapeMode mode; + SDL_Surface *surface; + SDL_Texture *texture; + SDL_WindowShapeMode mode; } LoadedPicture; -void render(SDL_Window* window,SDL_Texture *texture,SDL_Rect texture_dimensions) { - SDL_SelectRenderer(window); - - //Clear render-target to blue. - SDL_SetRenderDrawColor(0x00,0x00,0xff,0xff); - SDL_RenderClear(); - - //Render the texture. - SDL_RenderCopy(texture,&texture_dimensions,&texture_dimensions); - - SDL_RenderPresent(); +void render(SDL_Renderer *renderer,SDL_Texture *texture,SDL_Rect texture_dimensions) +{ + //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); } static Uint32 next_time; -Uint32 time_left() { +Uint32 time_left() +{ Uint32 now = SDL_GetTicks(); if(next_time <= now) return 0; - else + else return next_time - now; } -int main(int argc,char** argv) { - Uint8 num_pictures; - LoadedPicture* pictures; - int i, j; - SDL_PixelFormat* format = NULL; - SDL_Window *window; - SDL_Color black = {0,0,0,0xff}; - SDL_Event event; - int event_pending = 0; - int should_exit = 0; - unsigned int current_picture; - int button_down; - Uint32 pixelFormat = 0; - int access = 0; - SDL_Rect texture_dimensions;; +int main(int argc,char** argv) +{ + Uint8 num_pictures; + LoadedPicture* pictures; + int i, j; + SDL_PixelFormat* format = NULL; + SDL_Window *window; + SDL_Renderer *renderer; + SDL_Color black = {0,0,0,0xff}; + SDL_Event event; + int event_pending = 0; + int should_exit = 0; + unsigned int current_picture; + int button_down; + Uint32 pixelFormat = 0; + int access = 0; + SDL_Rect texture_dimensions;; - if(argc < 2) { - printf("SDL_Shape requires at least one bitmap file as argument.\n"); - exit(-1); + if(argc < 2) { + printf("SDL_Shape requires at least one bitmap file as argument.\n"); + exit(-1); } - - if(SDL_VideoInit(NULL) == -1) { - printf("Could not initialize SDL video.\n"); - exit(-2); - } - - num_pictures = argc - 1; - pictures = (LoadedPicture *)malloc(sizeof(LoadedPicture)*num_pictures); - 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]); - if(pictures[i].surface == NULL) { - j = 0; - for(j=0;j<num_pictures;j++) - if(pictures[j].surface != NULL) - SDL_FreeSurface(pictures[j].surface); - free(pictures); - SDL_VideoQuit(); - printf("Could not load surface from named bitmap file.\n"); - exit(-3); - } + + if(SDL_VideoInit(NULL) == -1) { + printf("Could not initialize SDL video.\n"); + exit(-2); + } + + num_pictures = argc - 1; + pictures = (LoadedPicture *)malloc(sizeof(LoadedPicture)*num_pictures); + 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]); + if(pictures[i].surface == NULL) { + j = 0; + for(j=0;j<num_pictures;j++) + if(pictures[j].surface != NULL) + SDL_FreeSurface(pictures[j].surface); + free(pictures); + SDL_VideoQuit(); + printf("Could not load surface from named bitmap file.\n"); + exit(-3); + } - format = pictures[i].surface->format; - if(format->Amask != 0) { - pictures[i].mode.mode = ShapeModeBinarizeAlpha; - pictures[i].mode.parameters.binarizationCutoff = 255; - } - else { - pictures[i].mode.mode = ShapeModeColorKey; - pictures[i].mode.parameters.colorKey = black; - } - } - - window = SDL_CreateShapedWindow("SDL_Shape test",SHAPED_WINDOW_X,SHAPED_WINDOW_Y,SHAPED_WINDOW_DIMENSION,SHAPED_WINDOW_DIMENSION,SDL_WINDOW_RESIZABLE | SDL_WINDOW_SHOWN); - if(window == NULL) { - for(i=0;i<num_pictures;i++) - SDL_FreeSurface(pictures[i].surface); - free(pictures); - SDL_VideoQuit(); - printf("Could not create shaped window for SDL_Shape.\n"); - exit(-4); - } - if(SDL_CreateRenderer(window,-1,0) == -1) { - SDL_DestroyWindow(window); - for(i=0;i<num_pictures;i++) - SDL_FreeSurface(pictures[i].surface); - free(pictures); - SDL_VideoQuit(); - printf("Could not create rendering context for SDL_Shape window.\n"); - 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(0,pictures[i].surface); - if(pictures[i].texture == NULL) { - j = 0; - for(j=0;j<num_pictures;i++) - if(pictures[i].texture != NULL) - SDL_DestroyTexture(pictures[i].texture); - for(i=0;i<num_pictures;i++) - SDL_FreeSurface(pictures[i].surface); - free(pictures); - SDL_DestroyRenderer(window); - SDL_DestroyWindow(window); - SDL_VideoQuit(); - printf("Could not create texture for SDL_shape.\n"); - exit(-6); - } - } - - event_pending = 0; - should_exit = 0; - event_pending = SDL_PollEvent(&event); - current_picture = 0; - button_down = 0; - texture_dimensions.h = 0; - texture_dimensions.w = 0; - texture_dimensions.x = 0; - texture_dimensions.y = 0; - 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); - next_time = SDL_GetTicks() + TICK_INTERVAL; - while(should_exit == 0) { - event_pending = SDL_PollEvent(&event); - if(event_pending == 1) { - if(event.type == SDL_KEYDOWN) { - button_down = 1; - if(event.key.keysym.sym == SDLK_ESCAPE) - should_exit = 1; - } - if(button_down && event.type == SDL_KEYUP) { - button_down = 0; - current_picture += 1; - if(current_picture >= num_pictures) - current_picture = 0; - 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; - event_pending = 0; - } - render(window,pictures[current_picture].texture,texture_dimensions); - SDL_Delay(time_left()); - next_time += TICK_INTERVAL; - } - - //Free the textures. - for(i=0;i<num_pictures;i++) - SDL_DestroyTexture(pictures[i].texture); - //Destroy the window. - SDL_DestroyWindow(window); - //Free the original surfaces backing the textures. - for(i=0;i<num_pictures;i++) - SDL_FreeSurface(pictures[i].surface); - free(pictures); - //Call SDL_VideoQuit() before quitting. - SDL_VideoQuit(); + format = pictures[i].surface->format; + if(format->Amask != 0) { + pictures[i].mode.mode = ShapeModeBinarizeAlpha; + pictures[i].mode.parameters.binarizationCutoff = 255; + } + else { + pictures[i].mode.mode = ShapeModeColorKey; + pictures[i].mode.parameters.colorKey = black; + } + } + + window = SDL_CreateShapedWindow("SDL_Shape test",SHAPED_WINDOW_X,SHAPED_WINDOW_Y,SHAPED_WINDOW_DIMENSION,SHAPED_WINDOW_DIMENSION,SDL_WINDOW_RESIZABLE | SDL_WINDOW_SHOWN); + if(window == NULL) { + for(i=0;i<num_pictures;i++) + SDL_FreeSurface(pictures[i].surface); + free(pictures); + SDL_VideoQuit(); + printf("Could not create shaped window for SDL_Shape.\n"); + exit(-4); + } + renderer = SDL_CreateRenderer(window,-1,0); + if (!renderer) { + SDL_DestroyWindow(window); + for(i=0;i<num_pictures;i++) + SDL_FreeSurface(pictures[i].surface); + free(pictures); + SDL_VideoQuit(); + printf("Could not create rendering context for SDL_Shape window.\n"); + 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,0,pictures[i].surface); + if(pictures[i].texture == NULL) { + j = 0; + for(j=0;j<num_pictures;i++) + if(pictures[i].texture != NULL) + SDL_DestroyTexture(pictures[i].texture); + for(i=0;i<num_pictures;i++) + SDL_FreeSurface(pictures[i].surface); + free(pictures); + SDL_DestroyRenderer(renderer); + SDL_DestroyWindow(window); + SDL_VideoQuit(); + printf("Could not create texture for SDL_shape.\n"); + exit(-6); + } + } + + event_pending = 0; + should_exit = 0; + event_pending = SDL_PollEvent(&event); + current_picture = 0; + button_down = 0; + texture_dimensions.h = 0; + texture_dimensions.w = 0; + texture_dimensions.x = 0; + texture_dimensions.y = 0; + 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); + next_time = SDL_GetTicks() + TICK_INTERVAL; + while(should_exit == 0) { + event_pending = SDL_PollEvent(&event); + if(event_pending == 1) { + if(event.type == SDL_KEYDOWN) { + button_down = 1; + if(event.key.keysym.sym == SDLK_ESCAPE) + should_exit = 1; + } + if(button_down && event.type == SDL_KEYUP) { + button_down = 0; + current_picture += 1; + if(current_picture >= num_pictures) + current_picture = 0; + 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; + event_pending = 0; + } + render(renderer,pictures[current_picture].texture,texture_dimensions); + SDL_Delay(time_left()); + next_time += TICK_INTERVAL; + } + + //Free the textures. + for(i=0;i<num_pictures;i++) + SDL_DestroyTexture(pictures[i].texture); + SDL_DestroyRenderer(renderer); + //Destroy the window. + SDL_DestroyWindow(window); + //Free the original surfaces backing the textures. + for(i=0;i<num_pictures;i++) + SDL_FreeSurface(pictures[i].surface); + free(pictures); + //Call SDL_VideoQuit() before quitting. + SDL_VideoQuit(); - return 0; + return 0; } + +/* vi: set ts=4 sw=4 expandtab: */