summaryrefslogtreecommitdiff
path: root/platform/darwin/image.mm
diff options
context:
space:
mode:
Diffstat (limited to 'platform/darwin/image.mm')
-rw-r--r--platform/darwin/image.mm17
1 files changed, 16 insertions, 1 deletions
diff --git a/platform/darwin/image.mm b/platform/darwin/image.mm
index 854b9157f8..e984b0688a 100644
--- a/platform/darwin/image.mm
+++ b/platform/darwin/image.mm
@@ -2,6 +2,8 @@
#import <ImageIO/ImageIO.h>
+#import <webp/decode.h>
+
#if TARGET_OS_IPHONE
#import <MobileCoreServices/MobileCoreServices.h>
#else
@@ -65,8 +67,21 @@ std::string encodePNG(const PremultipliedImage& src) {
return result;
}
+PremultipliedImage decodeWebP(const uint8_t*, size_t);
+
PremultipliedImage decodeImage(const std::string &source_data) {
- CFDataRef data = CFDataCreateWithBytesNoCopy(kCFAllocatorDefault, reinterpret_cast<const unsigned char *>(source_data.data()), source_data.size(), kCFAllocatorNull);
+ // CoreFoundation does not decode WebP natively.
+ size_t size = source_data.size();
+ if (size >= 12) {
+ const uint8_t* data = reinterpret_cast<const uint8_t*>(source_data.data());
+ uint32_t riff_magic = (data[0] << 24) | (data[1] << 16) | (data[2] << 8) | data[3];
+ uint32_t webp_magic = (data[8] << 24) | (data[9] << 16) | (data[10] << 8) | data[11];
+ if (riff_magic == 0x52494646 && webp_magic == 0x57454250) {
+ return decodeWebP(data, size);
+ }
+ }
+
+ CFDataRef data = CFDataCreateWithBytesNoCopy(kCFAllocatorDefault, reinterpret_cast<const unsigned char *>(source_data.data()), size, kCFAllocatorNull);
if (!data) {
throw std::runtime_error("CFDataCreateWithBytesNoCopy failed");
}