diff options
author | Konstantin Käfer <mail@kkaefer.com> | 2017-01-25 17:28:23 +0100 |
---|---|---|
committer | Konstantin Käfer <mail@kkaefer.com> | 2017-01-26 15:26:55 +0100 |
commit | 19bd68d3a2c1236bf092596a9ef2ac0f7364d195 (patch) | |
tree | 6ea396fab89277a75d792b4627075af9e8e86b93 /platform/ios/src/UIImage+MGLAdditions.mm | |
parent | 46fe0df2a2a2b4c28d8579245c0caad258a8b512 (diff) | |
download | qtlocation-mapboxgl-19bd68d3a2c1236bf092596a9ef2ac0f7364d195.tar.gz |
[macos,ios] don't roundtrip through encodePNG when converting images
Diffstat (limited to 'platform/ios/src/UIImage+MGLAdditions.mm')
-rw-r--r-- | platform/ios/src/UIImage+MGLAdditions.mm | 35 |
1 files changed, 12 insertions, 23 deletions
diff --git a/platform/ios/src/UIImage+MGLAdditions.mm b/platform/ios/src/UIImage+MGLAdditions.mm index 7b5737f5e4..d99a1f73ed 100644 --- a/platform/ios/src/UIImage+MGLAdditions.mm +++ b/platform/ios/src/UIImage+MGLAdditions.mm @@ -1,42 +1,31 @@ #import "UIImage+MGLAdditions.h" +#include <mbgl/util/image+MGLAdditions.hpp> + @implementation UIImage (MGLAdditions) - (nullable instancetype)initWithMGLSpriteImage:(const mbgl::SpriteImage *)spriteImage { - std::string png = encodePNG(spriteImage->image); - NSData *data = [[NSData alloc] initWithBytes:png.data() length:png.size()]; - if (self = [self initWithData:data scale:spriteImage->pixelRatio]) + CGImageRef image = CGImageFromMGLPremultipliedImage(spriteImage->image.clone()); + if (!image) { + return nil; + } + + if (self = [self initWithCGImage:image scale:spriteImage->pixelRatio orientation:UIImageOrientationUp]) { if (spriteImage->sdf) { self = [self imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]; } } + CGImageRelease(image); return self; } -- (std::unique_ptr<mbgl::SpriteImage>)mgl_spriteImage -{ - CGImageRef cgImage = self.CGImage; - size_t width = CGImageGetWidth(cgImage); - size_t height = CGImageGetHeight(cgImage); - CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); - mbgl::PremultipliedImage cPremultipliedImage({ static_cast<uint32_t>(width), static_cast<uint32_t>(height) }); - size_t bytesPerPixel = 4; - size_t bytesPerRow = bytesPerPixel * width; - size_t bitsPerComponent = 8; - - CGContextRef context = CGBitmapContextCreate(cPremultipliedImage.data.get(), - width, height, bitsPerComponent, bytesPerRow, - colorSpace, kCGImageAlphaPremultipliedLast); - - CGContextDrawImage(context, CGRectMake(0, 0, width, height), cgImage); - CGContextRelease(context); - CGColorSpaceRelease(colorSpace); - +- (std::unique_ptr<mbgl::SpriteImage>)mgl_spriteImage { BOOL isTemplate = self.renderingMode == UIImageRenderingModeAlwaysTemplate; - return std::make_unique<mbgl::SpriteImage>(std::move(cPremultipliedImage), float(self.scale), isTemplate); + return std::make_unique<mbgl::SpriteImage>(MGLPremultipliedImageFromCGImage(self.CGImage), + float(self.scale), isTemplate); } @end |