1 /*
2   showimage:  A test application for the SDL image loading library.
3   Copyright (C) 1997-2019 Sam Lantinga <slouken@libsdl.org>
4 
5   This software is provided 'as-is', without any express or implied
6   warranty.  In no event will the authors be held liable for any damages
7   arising from the use of this software.
8 
9   Permission is granted to anyone to use this software for any purpose,
10   including commercial applications, and to alter it and redistribute it
11   freely, subject to the following restrictions:
12 
13   1. The origin of this software must not be misrepresented; you must not
14      claim that you wrote the original software. If you use this software
15      in a product, an acknowledgment in the product documentation would be
16      appreciated but is not required.
17   2. Altered source versions must be plainly marked as such, and must not be
18      misrepresented as being the original software.
19   3. This notice may not be removed or altered from any source distribution.
20 */
21 
22 #include <stdlib.h>
23 #include <stdio.h>
24 #include <string.h>
25 
26 #include "SDL.h"
27 #include "SDL_image.h"
28 
29 
30 /* Draw a Gimpish background pattern to show transparency in the image */
draw_background(SDL_Renderer * renderer,int w,int h)31 static void draw_background(SDL_Renderer *renderer, int w, int h)
32 {
33     SDL_Color col[2] = {
34         { 0x66, 0x66, 0x66, 0xff },
35         { 0x99, 0x99, 0x99, 0xff },
36     };
37     int i, x, y;
38     SDL_Rect rect;
39 
40     rect.w = 8;
41     rect.h = 8;
42     for (y = 0; y < h; y += rect.h) {
43         for (x = 0; x < w; x += rect.w) {
44             /* use an 8x8 checkerboard pattern */
45             i = (((x ^ y) >> 3) & 1);
46             SDL_SetRenderDrawColor(renderer, col[i].r, col[i].g, col[i].b, col[i].a);
47 
48             rect.x = x;
49             rect.y = y;
50             SDL_RenderFillRect(renderer, &rect);
51         }
52     }
53 }
54 
main(int argc,char * argv[])55 int main(int argc, char *argv[])
56 {
57     SDL_Window *window;
58     SDL_Renderer *renderer;
59     SDL_Texture *texture;
60     Uint32 flags;
61     int i, w, h, done;
62     SDL_Event event;
63     const char *saveFile = NULL;
64 
65     /* Check command line usage */
66     if ( ! argv[1] ) {
67         SDL_Log("Usage: %s [-fullscreen] [-save file.png] <image_file> ...\n", argv[0]);
68         return(1);
69     }
70 
71     flags = SDL_WINDOW_HIDDEN;
72     for ( i=1; argv[i]; ++i ) {
73         if ( SDL_strcmp(argv[i], "-fullscreen") == 0 ) {
74             SDL_ShowCursor(0);
75             flags |= SDL_WINDOW_FULLSCREEN;
76         }
77     }
78 
79     if (SDL_Init(SDL_INIT_VIDEO) == -1) {
80         SDL_Log("SDL_Init(SDL_INIT_VIDEO) failed: %s\n", SDL_GetError());
81         return(2);
82     }
83 
84     if (SDL_CreateWindowAndRenderer(0, 0, flags, &window, &renderer) < 0) {
85         SDL_Log("SDL_CreateWindowAndRenderer() failed: %s\n", SDL_GetError());
86         return(2);
87     }
88 
89     for ( i=1; argv[i]; ++i ) {
90         if ( SDL_strcmp(argv[i], "-fullscreen") == 0 ) {
91             continue;
92         }
93 
94         if ( SDL_strcmp(argv[i], "-save") == 0 && argv[i+1] ) {
95             ++i;
96             saveFile = argv[i];
97             continue;
98         }
99 
100         /* Open the image file */
101         texture = IMG_LoadTexture(renderer, argv[i]);
102         if (!texture) {
103             SDL_Log("Couldn't load %s: %s\n", argv[i], SDL_GetError());
104             continue;
105         }
106         SDL_QueryTexture(texture, NULL, NULL, &w, &h);
107 
108         /* Save the image file, if desired */
109         if ( saveFile ) {
110             SDL_Surface *surface = IMG_Load(argv[i]);
111             if (surface) {
112                 int result;
113                 const char *ext = SDL_strrchr(saveFile, '.');
114                 if ( ext && SDL_strcasecmp(ext, ".bmp") == 0 ) {
115                     result = SDL_SaveBMP(surface, saveFile);
116                 } else if ( ext && SDL_strcasecmp(ext, ".jpg") == 0 ) {
117                     result = IMG_SaveJPG(surface, saveFile, 90);
118                 } else {
119                     result = IMG_SavePNG(surface, saveFile);
120                 }
121                 if ( result < 0 ) {
122                     SDL_Log("Couldn't save %s: %s\n", saveFile, SDL_GetError());
123                 }
124             } else {
125                 SDL_Log("Couldn't load %s: %s\n", argv[i], SDL_GetError());
126             }
127         }
128 
129         /* Show the window */
130         SDL_SetWindowTitle(window, argv[i]);
131         SDL_SetWindowSize(window, w, h);
132         SDL_ShowWindow(window);
133 
134         done = 0;
135         while ( ! done ) {
136             while ( SDL_PollEvent(&event) ) {
137                 switch (event.type) {
138                     case SDL_KEYUP:
139                         switch (event.key.keysym.sym) {
140                             case SDLK_LEFT:
141                                 if ( i > 1 ) {
142                                     i -= 2;
143                                     done = 1;
144                                 }
145                                 break;
146                             case SDLK_RIGHT:
147                                 if ( argv[i+1] ) {
148                                     done = 1;
149                                 }
150                                 break;
151                             case SDLK_ESCAPE:
152                             case SDLK_q:
153                                 argv[i+1] = NULL;
154                             /* Drop through to done */
155                             case SDLK_SPACE:
156                             case SDLK_TAB:
157                             done = 1;
158                             break;
159                             default:
160                             break;
161                         }
162                         break;
163                     case SDL_MOUSEBUTTONDOWN:
164                         done = 1;
165                         break;
166                     case SDL_QUIT:
167                         argv[i+1] = NULL;
168                         done = 1;
169                         break;
170                     default:
171                         break;
172                 }
173             }
174             /* Draw a background pattern in case the image has transparency */
175             draw_background(renderer, w, h);
176 
177             /* Display the image */
178             SDL_RenderCopy(renderer, texture, NULL, NULL);
179             SDL_RenderPresent(renderer);
180 
181             SDL_Delay(100);
182         }
183         SDL_DestroyTexture(texture);
184     }
185 
186 
187     SDL_DestroyRenderer(renderer);
188     SDL_DestroyWindow(window);
189 
190     /* We're done! */
191     SDL_Quit();
192     return(0);
193 }
194