Skip to content

Commit 446aae6

Browse files
committed
[google_maps_flutter] Downsample wide gamut images to sRGB before serving them to google maps.
1 parent 1863b7e commit 446aae6

File tree

3 files changed

+45
-31
lines changed

3 files changed

+45
-31
lines changed

packages/google_maps_flutter/google_maps_flutter_ios/CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
## 2.4.3
2+
3+
* Downsamples wide gamut tiles before serving them to google maps.
4+
15
## 2.4.2
26

37
* Makes the tile overlay callback invoke the platform channel on the platform thread.

packages/google_maps_flutter/google_maps_flutter_ios/ios/Classes/FLTGoogleMapTileOverlayController.m

Lines changed: 40 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -123,39 +123,49 @@ - (void)requestTileForX:(NSUInteger)x
123123
zoom:(NSUInteger)zoom
124124
receiver:(id<GMSTileReceiver>)receiver {
125125
dispatch_async(dispatch_get_main_queue(), ^{
126-
[self.methodChannel invokeMethod:@"tileOverlay#getTile"
127-
arguments:@{
128-
@"tileOverlayId" : self.tileOverlayIdentifier,
129-
@"x" : @(x),
130-
@"y" : @(y),
131-
@"zoom" : @(zoom)
132-
}
133-
result:^(id _Nullable result) {
134-
UIImage *tileImage;
135-
if ([result isKindOfClass:[NSDictionary class]]) {
136-
FlutterStandardTypedData *typedData = (FlutterStandardTypedData *)result[@"data"];
137-
if (typedData == nil) {
138-
tileImage = kGMSTileLayerNoTile;
139-
} else {
140-
tileImage = [UIImage imageWithData:typedData.data];
141-
}
142-
} else {
143-
if ([result isKindOfClass:[FlutterError class]]) {
144-
FlutterError *error = (FlutterError *)result;
145-
NSLog(@"Can't get tile: errorCode = %@, errorMessage = %@, details = %@",
146-
[error code], [error message], [error details]);
147-
}
148-
if ([result isKindOfClass:[FlutterMethodNotImplemented class]]) {
149-
NSLog(@"Can't get tile: notImplemented");
150-
}
151-
tileImage = kGMSTileLayerNoTile;
152-
}
153-
154-
[receiver receiveTileWithX:x y:y zoom:zoom image:tileImage];
155-
}];
126+
[self.methodChannel
127+
invokeMethod:@"tileOverlay#getTile"
128+
arguments:@{
129+
@"tileOverlayId" : self.tileOverlayIdentifier,
130+
@"x" : @(x),
131+
@"y" : @(y),
132+
@"zoom" : @(zoom)
133+
}
134+
result:^(id _Nullable result) {
135+
UIImage *tileImage;
136+
if ([result isKindOfClass:[NSDictionary class]]) {
137+
FlutterStandardTypedData *typedData = (FlutterStandardTypedData *)result[@"data"];
138+
if (typedData == nil) {
139+
tileImage = kGMSTileLayerNoTile;
140+
} else {
141+
tileImage = [UIImage imageWithData:typedData.data];
142+
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
143+
CGContextRef context = CGBitmapContextCreate(nil, tileImage.size.width, tileImage.size.height, 8, 0, colorSpace, kCGImageAlphaPremultipliedLast);
144+
CGContextDrawImage(context, CGRectMake(0, 0, tileImage.size.width, tileImage.size.height), tileImage.CGImage);
145+
CGImageRef image = CGBitmapContextCreateImage(context);
146+
tileImage = [UIImage imageWithCGImage:image];
147+
CGImageRelease(image);
148+
CGContextRelease(context);
149+
CGColorSpaceRelease(colorSpace);
150+
}
151+
} else {
152+
if ([result isKindOfClass:[FlutterError class]]) {
153+
FlutterError *error = (FlutterError *)result;
154+
NSLog(@"Can't get tile: errorCode = %@, errorMessage = %@, details = %@",
155+
[error code], [error message], [error details]);
156+
}
157+
if ([result isKindOfClass:[FlutterMethodNotImplemented class]]) {
158+
NSLog(@"Can't get tile: notImplemented");
159+
}
160+
tileImage = kGMSTileLayerNoTile;
161+
}
162+
163+
[receiver receiveTileWithX:x y:y zoom:zoom image:tileImage];
164+
}];
156165
});
157166
}
158167

168+
159169
@end
160170

161171
@interface FLTTileOverlaysController ()

packages/google_maps_flutter/google_maps_flutter_ios/pubspec.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ name: google_maps_flutter_ios
22
description: iOS implementation of the google_maps_flutter plugin.
33
repository: https://github.com/flutter/packages/tree/main/packages/google_maps_flutter/google_maps_flutter_ios
44
issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+maps%22
5-
version: 2.4.2
5+
version: 2.4.3
66

77
environment:
88
sdk: ^3.2.3

0 commit comments

Comments
 (0)