test/testshape.c
changeset 4808 2ae79ed78a5a
parent 4805 de3b3455f8ec
child 4809 329708ffe2a7
equal deleted inserted replaced
4807:c9eb95f29770 4808:2ae79ed78a5a
    11 #define SHAPED_WINDOW_X 150
    11 #define SHAPED_WINDOW_X 150
    12 #define SHAPED_WINDOW_Y 150
    12 #define SHAPED_WINDOW_Y 150
    13 #define SHAPED_WINDOW_DIMENSION 640
    13 #define SHAPED_WINDOW_DIMENSION 640
    14 
    14 
    15 #define TICK_INTERVAL 18
    15 #define TICK_INTERVAL 18
       
    16 
       
    17 typedef struct LoadedPicture {
       
    18 	SDL_Surface *surface;
       
    19 	SDL_Texture *texture;
       
    20 	SDL_WindowShapeMode mode;
       
    21 } LoadedPicture;
    16 
    22 
    17 void render(SDL_Window* window,SDL_Texture *texture,SDL_Rect texture_dimensions) {
    23 void render(SDL_Window* window,SDL_Texture *texture,SDL_Rect texture_dimensions) {
    18 	SDL_SelectRenderer(window);
    24 	SDL_SelectRenderer(window);
    19 	
    25 	
    20 	//Clear render-target to blue.
    26 	//Clear render-target to blue.
    47 		printf("Could not initialize SDL video.\n");
    53 		printf("Could not initialize SDL video.\n");
    48 		exit(-2);
    54 		exit(-2);
    49 	}
    55 	}
    50 	
    56 	
    51 	Uint8 num_pictures = argc - 1;
    57 	Uint8 num_pictures = argc - 1;
    52 	SDL_Surface **pictures = malloc(sizeof(SDL_Surface*)*num_pictures);
    58 	LoadedPicture* pictures = malloc(sizeof(LoadedPicture)*num_pictures);
    53 	int i = 0;
    59 	int i = 0;
    54 	for(i=0;i<num_pictures;i++)
    60 	for(i=0;i<num_pictures;i++)
    55 		pictures[i] = NULL;
    61 		pictures[i].surface = NULL;
    56 	for(i=0;i<num_pictures;i++) {
    62 	for(i=0;i<num_pictures;i++) {
    57 		pictures[i] = SDL_LoadBMP(argv[i+1]);
    63 		pictures[i].surface = SDL_LoadBMP(argv[i+1]);
    58 		if(pictures[i] == NULL) {
    64 		if(pictures[i].surface == NULL) {
    59 			int j = 0;
    65 			int j = 0;
    60 			for(j=0;j<num_pictures;j++)
    66 			for(j=0;j<num_pictures;j++)
    61 				if(pictures[j] != NULL)
    67 				if(pictures[j].surface != NULL)
    62 					SDL_FreeSurface(pictures[j]);
    68 					SDL_FreeSurface(pictures[j].surface);
    63 			free(pictures);
    69 			free(pictures);
    64 			SDL_VideoQuit();
    70 			SDL_VideoQuit();
    65 			printf("Could not load surface from named bitmap file.\n");
    71 			printf("Could not load surface from named bitmap file.\n");
    66 			exit(-3);
    72 			exit(-3);
       
    73 		}
       
    74 		SDL_PixelFormat* format = pictures[i].surface->format;
       
    75 		Uint32 format_enum = SDL_MasksToPixelFormatEnum (format->BitsPerPixel,format->Rmask,format->Gmask, format->Bmask,format->Amask);
       
    76 		if(SDL_ISPIXELFORMAT_ALPHA(format_enum)) {
       
    77 			pictures[i].mode.mode = ShapeModeBinarizeAlpha;
       
    78 			pictures[i].mode.parameters.binarizationCutoff = 1;
       
    79 		}
       
    80 		else {
       
    81 			pictures[i].mode.mode = ShapeModeColorKey;
       
    82 			SDL_Color black = {0,0,0,0xff};
       
    83 			pictures[i].mode.parameters.colorKey = black;
    67 		}
    84 		}
    68 	}
    85 	}
    69 	
    86 	
    70 	SDL_Window *window = SDL_CreateShapedWindow("SDL_Shape test",SHAPED_WINDOW_X,SHAPED_WINDOW_Y,SHAPED_WINDOW_DIMENSION,SHAPED_WINDOW_DIMENSION,SDL_WINDOW_RESIZABLE | SDL_WINDOW_SHOWN);
    87 	SDL_Window *window = SDL_CreateShapedWindow("SDL_Shape test",SHAPED_WINDOW_X,SHAPED_WINDOW_Y,SHAPED_WINDOW_DIMENSION,SHAPED_WINDOW_DIMENSION,SDL_WINDOW_RESIZABLE | SDL_WINDOW_SHOWN);
    71 	if(window == NULL) {
    88 	if(window == NULL) {
    72 		for(i=0;i<num_pictures;i++)
    89 		for(i=0;i<num_pictures;i++)
    73 			SDL_FreeSurface(pictures[i]);
    90 			SDL_FreeSurface(pictures[i].surface);
    74 		free(pictures);
    91 		free(pictures);
    75 		SDL_VideoQuit();
    92 		SDL_VideoQuit();
    76 		printf("Could not create shaped window for SDL_Shape.\n");
    93 		printf("Could not create shaped window for SDL_Shape.\n");
    77 		exit(-4);
    94 		exit(-4);
    78 	}
    95 	}
    79 	if(SDL_CreateRenderer(window,-1,SDL_RENDERER_PRESENTFLIP2) == -1) {
    96 	if(SDL_CreateRenderer(window,-1,SDL_RENDERER_PRESENTFLIP2) == -1) {
    80 		SDL_DestroyWindow(window);
    97 		SDL_DestroyWindow(window);
    81 		for(i=0;i<num_pictures;i++)
    98 		for(i=0;i<num_pictures;i++)
    82 			SDL_FreeSurface(pictures[i]);
    99 			SDL_FreeSurface(pictures[i].surface);
    83 		free(pictures);
   100 		free(pictures);
    84 		SDL_VideoQuit();
   101 		SDL_VideoQuit();
    85 		printf("Could not create rendering context for SDL_Shape window.\n");
   102 		printf("Could not create rendering context for SDL_Shape window.\n");
    86 		exit(-5);
   103 		exit(-5);
    87 	}
   104 	}
    88 	
   105 	
    89 	SDL_Texture **textures = malloc(sizeof(SDL_Texture*)*num_pictures);
       
    90 	for(i=0;i<num_pictures;i++)
   106 	for(i=0;i<num_pictures;i++)
    91 		textures[i] = NULL;
   107 		pictures[i].texture = NULL;
    92 	for(i=0;i<num_pictures;i++) {
   108 	for(i=0;i<num_pictures;i++) {
    93 		textures[i] = SDL_CreateTextureFromSurface(0,pictures[i]);
   109 		pictures[i].texture = SDL_CreateTextureFromSurface(0,pictures[i].surface);
    94 		if(textures[i] == NULL) {
   110 		if(pictures[i].texture == NULL) {
    95 			int j = 0;
   111 			int j = 0;
    96 			for(j=0;j<num_pictures;i++)
   112 			for(j=0;j<num_pictures;i++)
    97 				if(textures[i] != NULL)
   113 				if(pictures[i].texture != NULL)
    98 					SDL_DestroyTexture(textures[i]);
   114 					SDL_DestroyTexture(pictures[i].texture);
    99 			free(textures);
       
   100 			for(i=0;i<num_pictures;i++)
   115 			for(i=0;i<num_pictures;i++)
   101 				SDL_FreeSurface(pictures[i]);
   116 				SDL_FreeSurface(pictures[i].surface);
   102 			free(pictures);
   117 			free(pictures);
   103 			SDL_DestroyRenderer(window);
   118 			SDL_DestroyRenderer(window);
   104 			SDL_DestroyWindow(window);
   119 			SDL_DestroyWindow(window);
   105 			SDL_VideoQuit();
   120 			SDL_VideoQuit();
   106 			printf("Could not create texture for SDL_shape.\n");
   121 			printf("Could not create texture for SDL_shape.\n");
   114 	unsigned int current_picture = 0;
   129 	unsigned int current_picture = 0;
   115 	SDL_WindowShapeMode mode = {ShapeModeDefault,1};
   130 	SDL_WindowShapeMode mode = {ShapeModeDefault,1};
   116 	int button_down = 0;
   131 	int button_down = 0;
   117 	Uint32 format = 0,access = 0;
   132 	Uint32 format = 0,access = 0;
   118 	SDL_Rect texture_dimensions = {0,0,0,0};
   133 	SDL_Rect texture_dimensions = {0,0,0,0};
   119 	SDL_QueryTexture(textures[current_picture],&format,&access,&texture_dimensions.w,&texture_dimensions.h);
   134 	SDL_QueryTexture(pictures[current_picture].texture,&format,&access,&texture_dimensions.w,&texture_dimensions.h);
   120 	SDL_SetWindowSize(window,texture_dimensions.w,texture_dimensions.h);
   135 	SDL_SetWindowSize(window,texture_dimensions.w,texture_dimensions.h);
   121 	SDL_SetWindowShape(window,pictures[current_picture],&mode);
   136 	SDL_SetWindowShape(window,pictures[current_picture].surface,&mode);
   122 	next_time = SDL_GetTicks() + TICK_INTERVAL;
   137 	next_time = SDL_GetTicks() + TICK_INTERVAL;
   123 	while(should_exit == 0) {
   138 	while(should_exit == 0) {
   124 		event_pending = SDL_PollEvent(&event);
   139 		event_pending = SDL_PollEvent(&event);
   125 		if(event_pending == 1) {
   140 		if(event_pending == 1) {
   126 			if(event.type == SDL_KEYDOWN) {
   141 			if(event.type == SDL_KEYDOWN) {
   131 			if(button_down && event.type == SDL_KEYUP) {
   146 			if(button_down && event.type == SDL_KEYUP) {
   132 				button_down = 0;
   147 				button_down = 0;
   133 				current_picture += 1;
   148 				current_picture += 1;
   134 				if(current_picture >= num_pictures)
   149 				if(current_picture >= num_pictures)
   135 					current_picture = 0;
   150 					current_picture = 0;
   136 				SDL_QueryTexture(textures[current_picture],&format,&access,&texture_dimensions.w,&texture_dimensions.h);
   151 				SDL_QueryTexture(pictures[current_picture].texture,&format,&access,&texture_dimensions.w,&texture_dimensions.h);
   137 				SDL_SetWindowSize(window,texture_dimensions.w,texture_dimensions.h);
   152 				SDL_SetWindowSize(window,texture_dimensions.w,texture_dimensions.h);
   138 				SDL_SetWindowShape(window,pictures[current_picture],&mode);
   153 				SDL_SetWindowShape(window,pictures[current_picture].surface,&mode);
   139 			}
   154 			}
   140 			if(event.type == SDL_QUIT)
   155 			if(event.type == SDL_QUIT)
   141 				should_exit = 1;
   156 				should_exit = 1;
   142 			event_pending = 0;
   157 			event_pending = 0;
   143 		}
   158 		}
   144 		render(window,textures[current_picture],texture_dimensions);
   159 		render(window,pictures[current_picture].texture,texture_dimensions);
   145 		SDL_Delay(time_left());
   160 		SDL_Delay(time_left());
   146 		next_time += TICK_INTERVAL;
   161 		next_time += TICK_INTERVAL;
   147 	}
   162 	}
   148 	
   163 	
   149 	//Free the textures.
   164 	//Free the textures.
   150 	for(i=0;i<num_pictures;i++)
   165 	for(i=0;i<num_pictures;i++)
   151 		SDL_DestroyTexture(textures[i]);
   166 		SDL_DestroyTexture(pictures[i].texture);
   152 	free(textures);
       
   153 	//Destroy the window.
   167 	//Destroy the window.
   154 	SDL_DestroyWindow(window);
   168 	SDL_DestroyWindow(window);
   155 	//Free the original surfaces backing the textures.
   169 	//Free the original surfaces backing the textures.
   156 	for(i=0;i<num_pictures;i++)
   170 	for(i=0;i<num_pictures;i++)
   157 		SDL_FreeSurface(pictures[i]);
   171 		SDL_FreeSurface(pictures[i].surface);
   158 	free(pictures);
   172 	free(pictures);
   159 	//Call SDL_VideoQuit() before quitting.
   173 	//Call SDL_VideoQuit() before quitting.
   160 	SDL_VideoQuit();
   174 	SDL_VideoQuit();
   161 }
   175 }