xref: /aosp_15_r20/external/webp/extras/webp_to_sdl.c (revision b2055c353e87c8814eb2b6b1b11112a1562253bd)
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