From 88f91a48ae1b237aa285038feecf5060013baad2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Minh=20Nguye=CC=82=CC=83n?= Date: Tue, 6 Dec 2016 00:27:41 -0800 Subject: [ios, macos] Template images as style images Convert template images to SDF icons and back when storing them as style images. --- platform/ios/src/UIImage+MGLAdditions.mm | 12 ++++++++++-- platform/macos/app/MapDocument.m | 16 ++++++++++++++++ platform/macos/src/NSImage+MGLAdditions.mm | 4 +++- 3 files changed, 29 insertions(+), 3 deletions(-) diff --git a/platform/ios/src/UIImage+MGLAdditions.mm b/platform/ios/src/UIImage+MGLAdditions.mm index 4507fb6c41..e4d072e136 100644 --- a/platform/ios/src/UIImage+MGLAdditions.mm +++ b/platform/ios/src/UIImage+MGLAdditions.mm @@ -6,7 +6,14 @@ { std::string png = encodePNG(spriteImage->image); NSData *data = [[NSData alloc] initWithBytes:png.data() length:png.size()]; - return [self initWithData:data scale:spriteImage->pixelRatio]; + if (self = [self initWithData:data scale:spriteImage->pixelRatio]) + { + if (spriteImage->sdf) + { + self = [self imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]; + } + } + return self; } - (std::unique_ptr)mgl_spriteImage @@ -28,7 +35,8 @@ CGContextRelease(context); CGColorSpaceRelease(colorSpace); - return std::make_unique(std::move(cPremultipliedImage), float(self.scale)); + BOOL isTemplate = self.renderingMode == UIImageRenderingModeAlwaysTemplate; + return std::make_unique(std::move(cPremultipliedImage), float(self.scale), isTemplate); } @end diff --git a/platform/macos/app/MapDocument.m b/platform/macos/app/MapDocument.m index d2e6a0f810..ed33d7f089 100644 --- a/platform/macos/app/MapDocument.m +++ b/platform/macos/app/MapDocument.m @@ -675,6 +675,22 @@ NS_ARRAY_OF(id ) *MBXFlattenedShapes(NS_ARRAY_OF(id valueWithRawValue:[NSColor greenColor]]; fillLayer.predicate = [NSPredicate predicateWithFormat:@"%K == %@", @"type", @"park"]; [self.mapView.style addLayer:fillLayer]; + + NSImage *image = [NSImage imageNamed:NSImageNameIChatTheaterTemplate]; + [self.mapView.style setImage:image forName:NSImageNameIChatTheaterTemplate]; + + MGLSource *streetsSource = [self.mapView.style sourceWithIdentifier:@"composite"]; + MGLSymbolStyleLayer *theaterLayer = [[MGLSymbolStyleLayer alloc] initWithIdentifier:@"theaters" source:streetsSource]; + theaterLayer.sourceLayerIdentifier = @"poi_label"; + theaterLayer.predicate = [NSPredicate predicateWithFormat:@"maki == 'theatre'"]; + theaterLayer.iconImageName = [MGLStyleValue valueWithRawValue:NSImageNameIChatTheaterTemplate]; + theaterLayer.iconSize = [MGLStyleValue valueWithRawValue:@2]; + theaterLayer.iconColor = [MGLStyleValue valueWithStops:@{ + @16.0: [MGLStyleValue valueWithRawValue:[NSColor redColor]], + @18.0: [MGLStyleValue valueWithRawValue:[NSColor yellowColor]], + @20.0: [MGLStyleValue valueWithRawValue:[NSColor blackColor]], + }]; + [self.mapView.style addLayer:theaterLayer]; } - (IBAction)dropPin:(NSMenuItem *)sender { diff --git a/platform/macos/src/NSImage+MGLAdditions.mm b/platform/macos/src/NSImage+MGLAdditions.mm index dd132d0e87..9036ab24ae 100644 --- a/platform/macos/src/NSImage+MGLAdditions.mm +++ b/platform/macos/src/NSImage+MGLAdditions.mm @@ -8,6 +8,7 @@ NSBitmapImageRep *rep = [NSBitmapImageRep imageRepWithData:data]; if ([self initWithSize:NSMakeSize(spriteImage->getWidth(), spriteImage->getHeight())]) { [self addRepresentation:rep]; + [self setTemplate:spriteImage->sdf]; } return self; } @@ -23,7 +24,8 @@ mbgl::PremultipliedImage cPremultipliedImage(rep.pixelsWide, rep.pixelsHigh); std::copy(rep.bitmapData, rep.bitmapData + cPremultipliedImage.size(), cPremultipliedImage.data.get()); return std::make_unique(std::move(cPremultipliedImage), - (float)(rep.pixelsWide / self.size.width)); + (float)(rep.pixelsWide / self.size.width), + [self isTemplate]); } @end -- cgit v1.2.1