blob: 89944d0a99cf0f824dcc2ee04354d34559225e46 [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