| // Copyright 2016 Google Inc. All Rights Reserved. |
| // |
| // Use of this source code is governed by a BSD-style license |
| // that can be found in the COPYING file in the root of the source |
| // tree. An additional intellectual property rights grant can be found |
| // in the file PATENTS. All contributing project authors may |
| // be found in the AUTHORS file in the root of the source tree. |
| // ----------------------------------------------------------------------------- |
| // |
| // Generic image-type guessing. |
| |
| #include "./image_dec.h" |
| |
| static WEBP_INLINE uint32_t GetBE32(const uint8_t buf[]) { |
| return ((uint32_t)buf[0] << 24) | (buf[1] << 16) | (buf[2] << 8) | buf[3]; |
| } |
| |
| WebPInputFileFormat WebPGuessImageType(const uint8_t* const data, |
| size_t data_size) { |
| WebPInputFileFormat format = WEBP_UNSUPPORTED_FORMAT; |
| if (data != NULL && data_size >= 12) { |
| const uint32_t magic1 = GetBE32(data + 0); |
| const uint32_t magic2 = GetBE32(data + 8); |
| if (magic1 == 0x89504E47U) { |
| format = WEBP_PNG_FORMAT; |
| } else if (magic1 >= 0xFFD8FF00U && magic1 <= 0xFFD8FFFFU) { |
| format = WEBP_JPEG_FORMAT; |
| } else if (magic1 == 0x49492A00 || magic1 == 0x4D4D002A) { |
| format = WEBP_TIFF_FORMAT; |
| } else if (magic1 == 0x52494646 && magic2 == 0x57454250) { |
| format = WEBP_WEBP_FORMAT; |
| } else if (((magic1 >> 24) & 0xff) == 'P') { |
| const int type = (magic1 >> 16) & 0xff; |
| // we only support 'P5 -> P7' for now. |
| if (type >= '5' && type <= '7') format = WEBP_PNM_FORMAT; |
| } |
| } |
| return format; |
| } |
| |
| static int FailReader(const uint8_t* const data, size_t data_size, |
| struct WebPPicture* const pic, |
| int keep_alpha, struct Metadata* const metadata) { |
| (void)data; |
| (void)data_size; |
| (void)pic; |
| (void)keep_alpha; |
| (void)metadata; |
| return 0; |
| } |
| |
| WebPImageReader WebPGetImageReader(WebPInputFileFormat format) { |
| switch (format) { |
| case WEBP_PNG_FORMAT: return ReadPNG; |
| case WEBP_JPEG_FORMAT: return ReadJPEG; |
| case WEBP_TIFF_FORMAT: return ReadTIFF; |
| case WEBP_WEBP_FORMAT: return ReadWebP; |
| case WEBP_PNM_FORMAT: return ReadPNM; |
| default: return FailReader; |
| } |
| } |
| |
| WebPImageReader WebPGuessImageReader(const uint8_t* const data, |
| size_t data_size) { |
| return WebPGetImageReader(WebPGuessImageType(data, data_size)); |
| } |