go-libwebp

Experimental translation from libwebp to Go source.
Log | Files | Refs | README | LICENSE

image_dec.c (2811B)


      1 // Copyright 2016 Google Inc. All Rights Reserved.
      2 //
      3 // Use of this source code is governed by a BSD-style license
      4 // that can be found in the COPYING file in the root of the source
      5 // tree. An additional intellectual property rights grant can be found
      6 // in the file PATENTS. All contributing project authors may
      7 // be found in the AUTHORS file in the root of the source tree.
      8 // -----------------------------------------------------------------------------
      9 //
     10 // Generic image-type guessing.
     11 
     12 #include <stddef.h>
     13 
     14 #include "./image_dec.h"
     15 #include "./metadata.h"
     16 #include "webp/encode.h"
     17 #include "webp/types.h"
     18 
     19 const char* WebPGetEnabledInputFileFormats(void) {
     20   return "WebP"
     21 #ifdef WEBP_HAVE_JPEG
     22          ", JPEG"
     23 #endif
     24 #ifdef WEBP_HAVE_PNG
     25          ", PNG"
     26 #endif
     27          ", PNM (PGM, PPM, PAM)"
     28 #ifdef WEBP_HAVE_TIFF
     29          ", TIFF"
     30 #endif
     31 #ifdef HAVE_WINCODEC_H
     32          ", Windows Imaging Component (WIC)"
     33 #endif
     34          "";
     35 }
     36 
     37 static WEBP_INLINE uint32_t GetBE32(const uint8_t buf[]) {
     38   return ((uint32_t)buf[0] << 24) | (buf[1] << 16) | (buf[2] << 8) | buf[3];
     39 }
     40 
     41 WebPInputFileFormat WebPGuessImageType(const uint8_t* const data,
     42                                        size_t data_size) {
     43   WebPInputFileFormat format = WEBP_UNSUPPORTED_FORMAT;
     44   if (data != NULL && data_size >= 12) {
     45     const uint32_t magic1 = GetBE32(data + 0);
     46     const uint32_t magic2 = GetBE32(data + 8);
     47     if (magic1 == 0x89504E47U) {
     48       format = WEBP_PNG_FORMAT;
     49     } else if (magic1 >= 0xFFD8FF00U && magic1 <= 0xFFD8FFFFU) {
     50       format = WEBP_JPEG_FORMAT;
     51     } else if (magic1 == 0x49492A00 || magic1 == 0x4D4D002A) {
     52       format = WEBP_TIFF_FORMAT;
     53     } else if (magic1 == 0x52494646 && magic2 == 0x57454250) {
     54       format = WEBP_WEBP_FORMAT;
     55     } else if (((magic1 >> 24) & 0xff) == 'P') {
     56       const int type = (magic1 >> 16) & 0xff;
     57       // we only support 'P5 -> P7' for now.
     58       if (type >= '5' && type <= '7') format = WEBP_PNM_FORMAT;
     59     }
     60   }
     61   return format;
     62 }
     63 
     64 static int FailReader(const uint8_t* const data, size_t data_size,
     65                       struct WebPPicture* const pic,
     66                       int keep_alpha, struct Metadata* const metadata) {
     67   (void)data;
     68   (void)data_size;
     69   (void)pic;
     70   (void)keep_alpha;
     71   (void)metadata;
     72   return 0;
     73 }
     74 
     75 WebPImageReader WebPGetImageReader(WebPInputFileFormat format) {
     76   switch (format) {
     77     case WEBP_PNG_FORMAT: return ReadPNG;
     78     case WEBP_JPEG_FORMAT: return ReadJPEG;
     79     case WEBP_TIFF_FORMAT: return ReadTIFF;
     80     case WEBP_WEBP_FORMAT: return ReadWebP;
     81     case WEBP_PNM_FORMAT: return ReadPNM;
     82     default: return FailReader;
     83   }
     84 }
     85 
     86 WebPImageReader WebPGuessImageReader(const uint8_t* const data,
     87                                      size_t data_size) {
     88   return WebPGetImageReader(WebPGuessImageType(data, data_size));
     89 }