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 WebP-to-SDL wrapper. Useful for emscripten.
11*b2055c35SXin Li //
12*b2055c35SXin Li // Author: James Zern ([email protected])
13*b2055c35SXin Li
14*b2055c35SXin Li #ifdef HAVE_CONFIG_H
15*b2055c35SXin Li #include "src/webp/config.h"
16*b2055c35SXin Li #endif
17*b2055c35SXin Li
18*b2055c35SXin Li #if defined(WEBP_HAVE_SDL)
19*b2055c35SXin Li
20*b2055c35SXin Li #include "webp_to_sdl.h"
21*b2055c35SXin Li
22*b2055c35SXin Li #include <stdio.h>
23*b2055c35SXin Li
24*b2055c35SXin Li #include "src/webp/decode.h"
25*b2055c35SXin Li
26*b2055c35SXin Li #if defined(WEBP_HAVE_JUST_SDL_H)
27*b2055c35SXin Li #include <SDL.h>
28*b2055c35SXin Li #else
29*b2055c35SXin Li #include <SDL2/SDL.h>
30*b2055c35SXin Li #endif
31*b2055c35SXin Li
32*b2055c35SXin Li static int init_ok = 0;
WebPToSDL(const char * data,unsigned int data_size)33*b2055c35SXin Li int WebPToSDL(const char* data, unsigned int data_size) {
34*b2055c35SXin Li int ok = 0;
35*b2055c35SXin Li VP8StatusCode status;
36*b2055c35SXin Li WebPBitstreamFeatures input;
37*b2055c35SXin Li uint8_t* output = NULL;
38*b2055c35SXin Li SDL_Window* window = NULL;
39*b2055c35SXin Li SDL_Renderer* renderer = NULL;
40*b2055c35SXin Li SDL_Texture* texture = NULL;
41*b2055c35SXin Li int width, height;
42*b2055c35SXin Li
43*b2055c35SXin Li if (!init_ok) {
44*b2055c35SXin Li SDL_Init(SDL_INIT_VIDEO);
45*b2055c35SXin Li init_ok = 1;
46*b2055c35SXin Li }
47*b2055c35SXin Li
48*b2055c35SXin Li status = WebPGetFeatures((uint8_t*)data, (size_t)data_size, &input);
49*b2055c35SXin Li if (status != VP8_STATUS_OK) goto Error;
50*b2055c35SXin Li width = input.width;
51*b2055c35SXin Li height = input.height;
52*b2055c35SXin Li
53*b2055c35SXin Li SDL_CreateWindowAndRenderer(width, height, 0, &window, &renderer);
54*b2055c35SXin Li if (window == NULL || renderer == NULL) {
55*b2055c35SXin Li fprintf(stderr, "Unable to create window or renderer!\n");
56*b2055c35SXin Li goto Error;
57*b2055c35SXin Li }
58*b2055c35SXin Li SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY,
59*b2055c35SXin Li "linear"); // make the scaled rendering look smoother.
60*b2055c35SXin Li SDL_RenderSetLogicalSize(renderer, width, height);
61*b2055c35SXin Li
62*b2055c35SXin Li texture = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_ABGR8888,
63*b2055c35SXin Li SDL_TEXTUREACCESS_STREAMING, width, height);
64*b2055c35SXin Li if (texture == NULL) {
65*b2055c35SXin Li fprintf(stderr, "Unable to create %dx%d RGBA texture!\n", width, height);
66*b2055c35SXin Li goto Error;
67*b2055c35SXin Li }
68*b2055c35SXin Li
69*b2055c35SXin Li #if SDL_BYTEORDER == SDL_BIG_ENDIAN
70*b2055c35SXin Li output = WebPDecodeBGRA((const uint8_t*)data, (size_t)data_size, &width,
71*b2055c35SXin Li &height);
72*b2055c35SXin Li #else
73*b2055c35SXin Li output = WebPDecodeRGBA((const uint8_t*)data, (size_t)data_size, &width,
74*b2055c35SXin Li &height);
75*b2055c35SXin Li #endif
76*b2055c35SXin Li if (output == NULL) {
77*b2055c35SXin Li fprintf(stderr, "Error decoding image (%d)\n", status);
78*b2055c35SXin Li goto Error;
79*b2055c35SXin Li }
80*b2055c35SXin Li
81*b2055c35SXin Li SDL_UpdateTexture(texture, NULL, output, width * sizeof(uint32_t));
82*b2055c35SXin Li SDL_RenderClear(renderer);
83*b2055c35SXin Li SDL_RenderCopy(renderer, texture, NULL, NULL);
84*b2055c35SXin Li SDL_RenderPresent(renderer);
85*b2055c35SXin Li ok = 1;
86*b2055c35SXin Li
87*b2055c35SXin Li Error:
88*b2055c35SXin Li // We should call SDL_DestroyWindow(window) but that makes .js fail.
89*b2055c35SXin Li SDL_DestroyRenderer(renderer);
90*b2055c35SXin Li SDL_DestroyTexture(texture);
91*b2055c35SXin Li WebPFree(output);
92*b2055c35SXin Li return ok;
93*b2055c35SXin Li }
94*b2055c35SXin Li
95*b2055c35SXin Li //------------------------------------------------------------------------------
96*b2055c35SXin Li
97*b2055c35SXin Li #endif // WEBP_HAVE_SDL
98