1*b2055c35SXin Li // Copyright 2017 Google Inc. All Rights Reserved.
2*b2055c35SXin Li //
3*b2055c35SXin Li // Use of this source code is governed by a BSD-style license
4*b2055c35SXin Li // that can be found in the COPYING file in the root of the source
5*b2055c35SXin Li // tree. An additional intellectual property rights grant can be found
6*b2055c35SXin Li // in the file PATENTS. All contributing project authors may
7*b2055c35SXin Li // be found in the AUTHORS file in the root of the source tree.
8*b2055c35SXin Li // -----------------------------------------------------------------------------
9*b2055c35SXin Li //
10*b2055c35SXin Li // Simple SDL-based WebP file viewer.
11*b2055c35SXin Li // Does not support animation, just static images.
12*b2055c35SXin Li //
13*b2055c35SXin Li // Press 'q' to exit.
14*b2055c35SXin Li //
15*b2055c35SXin Li // Author: James Zern ([email protected])
16*b2055c35SXin Li
17*b2055c35SXin Li #include <stdio.h>
18*b2055c35SXin Li
19*b2055c35SXin Li #ifdef HAVE_CONFIG_H
20*b2055c35SXin Li #include "webp/config.h"
21*b2055c35SXin Li #endif
22*b2055c35SXin Li
23*b2055c35SXin Li #if defined(WEBP_HAVE_SDL)
24*b2055c35SXin Li
25*b2055c35SXin Li #include "webp_to_sdl.h"
26*b2055c35SXin Li #include "webp/decode.h"
27*b2055c35SXin Li #include "imageio/imageio_util.h"
28*b2055c35SXin Li #include "../examples/unicode.h"
29*b2055c35SXin Li
30*b2055c35SXin Li #if defined(WEBP_HAVE_JUST_SDL_H)
31*b2055c35SXin Li #include <SDL.h>
32*b2055c35SXin Li #else
33*b2055c35SXin Li #include <SDL2/SDL.h>
34*b2055c35SXin Li #endif
35*b2055c35SXin Li
ProcessEvents(void)36*b2055c35SXin Li static void ProcessEvents(void) {
37*b2055c35SXin Li int done = 0;
38*b2055c35SXin Li SDL_Event event;
39*b2055c35SXin Li while (!done && SDL_WaitEvent(&event)) {
40*b2055c35SXin Li switch (event.type) {
41*b2055c35SXin Li case SDL_KEYUP:
42*b2055c35SXin Li switch (event.key.keysym.sym) {
43*b2055c35SXin Li case SDLK_q: done = 1; break;
44*b2055c35SXin Li default: break;
45*b2055c35SXin Li }
46*b2055c35SXin Li break;
47*b2055c35SXin Li default: break;
48*b2055c35SXin Li }
49*b2055c35SXin Li }
50*b2055c35SXin Li }
51*b2055c35SXin Li
main(int argc,char * argv[])52*b2055c35SXin Li int main(int argc, char* argv[]) {
53*b2055c35SXin Li int c;
54*b2055c35SXin Li int ok = 0;
55*b2055c35SXin Li
56*b2055c35SXin Li INIT_WARGV(argc, argv);
57*b2055c35SXin Li
58*b2055c35SXin Li for (c = 1; c < argc; ++c) {
59*b2055c35SXin Li const char* file = NULL;
60*b2055c35SXin Li const uint8_t* webp = NULL;
61*b2055c35SXin Li size_t webp_size = 0;
62*b2055c35SXin Li if (!strcmp(argv[c], "-h")) {
63*b2055c35SXin Li printf("Usage: %s [-h] image.webp [more_files.webp...]\n", argv[0]);
64*b2055c35SXin Li FREE_WARGV_AND_RETURN(0);
65*b2055c35SXin Li } else {
66*b2055c35SXin Li file = (const char*)GET_WARGV(argv, c);
67*b2055c35SXin Li }
68*b2055c35SXin Li if (file == NULL) continue;
69*b2055c35SXin Li if (!ImgIoUtilReadFile(file, &webp, &webp_size)) {
70*b2055c35SXin Li WFPRINTF(stderr, "Error opening file: %s\n", (const W_CHAR*)file);
71*b2055c35SXin Li goto Error;
72*b2055c35SXin Li }
73*b2055c35SXin Li if (webp_size != (size_t)(int)webp_size) {
74*b2055c35SXin Li free((void*)webp);
75*b2055c35SXin Li fprintf(stderr, "File too large.\n");
76*b2055c35SXin Li goto Error;
77*b2055c35SXin Li }
78*b2055c35SXin Li ok = WebPToSDL((const char*)webp, (int)webp_size);
79*b2055c35SXin Li free((void*)webp);
80*b2055c35SXin Li if (!ok) {
81*b2055c35SXin Li WFPRINTF(stderr, "Error decoding file %s\n", (const W_CHAR*)file);
82*b2055c35SXin Li goto Error;
83*b2055c35SXin Li }
84*b2055c35SXin Li ProcessEvents();
85*b2055c35SXin Li }
86*b2055c35SXin Li ok = 1;
87*b2055c35SXin Li
88*b2055c35SXin Li Error:
89*b2055c35SXin Li SDL_Quit();
90*b2055c35SXin Li FREE_WARGV_AND_RETURN(ok ? 0 : 1);
91*b2055c35SXin Li }
92*b2055c35SXin Li
93*b2055c35SXin Li #else // !WEBP_HAVE_SDL
94*b2055c35SXin Li
main(int argc,const char * argv[])95*b2055c35SXin Li int main(int argc, const char* argv[]) {
96*b2055c35SXin Li fprintf(stderr, "SDL support not enabled in %s.\n", argv[0]);
97*b2055c35SXin Li (void)argc;
98*b2055c35SXin Li return 0;
99*b2055c35SXin Li }
100*b2055c35SXin Li
101*b2055c35SXin Li #endif
102