Initial commit
This commit is contained in:
+78
@@ -0,0 +1,78 @@
|
||||
//
|
||||
// UIImage+WebP.m
|
||||
// SDWebImage
|
||||
//
|
||||
// Created by Olivier Poitrey on 07/06/13.
|
||||
// Copyright (c) 2013 Dailymotion. All rights reserved.
|
||||
//
|
||||
|
||||
#ifdef SD_WEBP
|
||||
#import "UIImage+WebP.h"
|
||||
|
||||
#if !COCOAPODS
|
||||
#import "webp/decode.h"
|
||||
#else
|
||||
#import "webp/decode.h"
|
||||
#endif
|
||||
|
||||
// Callback for CGDataProviderRelease
|
||||
static void FreeImageData(void *info, const void *data, size_t size)
|
||||
{
|
||||
free((void *)data);
|
||||
}
|
||||
|
||||
@implementation UIImage (WebP)
|
||||
|
||||
+ (UIImage *)sd_imageWithWebPData:(NSData *)data {
|
||||
WebPDecoderConfig config;
|
||||
if (!WebPInitDecoderConfig(&config)) {
|
||||
return nil;
|
||||
}
|
||||
|
||||
if (WebPGetFeatures(data.bytes, data.length, &config.input) != VP8_STATUS_OK) {
|
||||
return nil;
|
||||
}
|
||||
|
||||
config.output.colorspace = config.input.has_alpha ? MODE_rgbA : MODE_RGB;
|
||||
config.options.use_threads = 1;
|
||||
|
||||
// Decode the WebP image data into a RGBA value array.
|
||||
if (WebPDecode(data.bytes, data.length, &config) != VP8_STATUS_OK) {
|
||||
return nil;
|
||||
}
|
||||
|
||||
int width = config.input.width;
|
||||
int height = config.input.height;
|
||||
if (config.options.use_scaling) {
|
||||
width = config.options.scaled_width;
|
||||
height = config.options.scaled_height;
|
||||
}
|
||||
|
||||
// Construct a UIImage from the decoded RGBA value array.
|
||||
CGDataProviderRef provider =
|
||||
CGDataProviderCreateWithData(NULL, config.output.u.RGBA.rgba, config.output.u.RGBA.size, FreeImageData);
|
||||
CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceRGB();
|
||||
CGBitmapInfo bitmapInfo = config.input.has_alpha ? kCGBitmapByteOrder32Big | kCGImageAlphaPremultipliedLast : 0;
|
||||
size_t components = config.input.has_alpha ? 4 : 3;
|
||||
CGColorRenderingIntent renderingIntent = kCGRenderingIntentDefault;
|
||||
CGImageRef imageRef = CGImageCreate(width, height, 8, components * 8, components * width, colorSpaceRef, bitmapInfo, provider, NULL, NO, renderingIntent);
|
||||
|
||||
CGColorSpaceRelease(colorSpaceRef);
|
||||
CGDataProviderRelease(provider);
|
||||
|
||||
UIImage *image = [[UIImage alloc] initWithCGImage:imageRef];
|
||||
CGImageRelease(imageRef);
|
||||
|
||||
return image;
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
#if !COCOAPODS
|
||||
// Functions to resolve some undefined symbols when using WebP and force_load flag
|
||||
void WebPInitPremultiplyNEON(void) {}
|
||||
void WebPInitUpsamplersNEON(void) {}
|
||||
void VP8DspInitNEON(void) {}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user