blob: 893207cc427f2849750f42da87bf0f9e00fc1db2 [file] [log] [blame]
/*
* Copyright 2022 Rive
*/
#include "mac_utils.hpp"
#ifdef RIVE_BUILD_FOR_APPLE
#if defined(RIVE_BUILD_FOR_IOS)
#include <CoreGraphics/CGImage.h>
#include <ImageIO/CGImageSource.h>
#endif
AutoCF<CGImageRef> rive::FlipCGImageInY(AutoCF<CGImageRef> image) {
if (!image) {
return nullptr;
}
auto w = CGImageGetWidth(image);
auto h = CGImageGetHeight(image);
AutoCF space = CGColorSpaceCreateDeviceRGB();
auto info = kCGBitmapByteOrder32Big | kCGImageAlphaPremultipliedLast;
AutoCF ctx = CGBitmapContextCreate(nullptr, w, h, 8, 0, space, info);
CGContextConcatCTM(ctx, CGAffineTransformMake(1, 0, 0, -1, 0, h));
CGContextDrawImage(ctx, CGRectMake(0, 0, w, h), image);
return CGBitmapContextCreateImage(ctx);
}
AutoCF<CGImageRef> rive::DecodeToCGImage(rive::Span<const uint8_t> span) {
AutoCF data = CFDataCreate(nullptr, span.data(), span.size());
if (!data) {
printf("CFDataCreate failed\n");
return nullptr;
}
AutoCF source = CGImageSourceCreateWithData(data, nullptr);
if (!source) {
printf("CGImageSourceCreateWithData failed\n");
return nullptr;
}
AutoCF image = CGImageSourceCreateImageAtIndex(source, 0, nullptr);
if (!image) {
printf("CGImageSourceCreateImageAtIndex failed\n");
}
return image;
}
#endif