Should support RGB / RGB_ALPHA / GRAYSCALE correctly, though Change-Id: Idb1470581ebdfc6efee73009b2abd53889e901cb
		
			
				
	
	
		
			67 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			67 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
// 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));
 | 
						|
}
 |