From dc3470b99327942fa2027b64639ba5fdf9366a5d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Minh=20Nguye=CC=82=CC=83n?= Date: Wed, 11 Mar 2020 16:03:02 -0700 Subject: [PATCH] [ios, macos] Only set stretchable regions for stretch resizing mode --- platform/darwin/test/MGLImageTests.mm | 36 +++++++++++++++++++++- platform/ios/src/UIImage+MGLAdditions.mm | 30 +++++++++++++----- platform/macos/src/NSImage+MGLAdditions.mm | 20 ++++++++---- 3 files changed, 71 insertions(+), 15 deletions(-) diff --git a/platform/darwin/test/MGLImageTests.mm b/platform/darwin/test/MGLImageTests.mm index cb3e0394d..6f3e1d1eb 100644 --- a/platform/darwin/test/MGLImageTests.mm +++ b/platform/darwin/test/MGLImageTests.mm @@ -3,8 +3,12 @@ #if TARGET_OS_IPHONE #import "UIImage+MGLAdditions.h" + #define MGLImageResizingModeTile UIImageResizingModeTile + #define MGLImageResizingModeStretch UIImageResizingModeStretch #else #import "NSImage+MGLAdditions.h" + #define MGLImageResizingModeTile NSImageResizingModeTile + #define MGLImageResizingModeStretch NSImageResizingModeStretch #endif @interface MGLImageTests : XCTestCase @@ -32,6 +36,7 @@ NSRectFill(dstRect); return YES; }]; + image.resizingMode = NSImageResizingModeTile; #endif { @@ -40,8 +45,11 @@ if (styleImage) { XCTAssert(!styleImage->getContent()); XCTAssertFalse(styleImage->isSdf()); + XCTAssertTrue(styleImage->getStretchX().empty()); + XCTAssertTrue(styleImage->getStretchY().empty()); MGLImage *imageAfter = [[MGLImage alloc] initWithMGLStyleImage:*styleImage]; + XCTAssertEqual(imageAfter.resizingMode, MGLImageResizingModeTile); XCTAssertEqual(imageAfter.capInsets.top, 0); XCTAssertEqual(imageAfter.capInsets.left, 0); XCTAssertEqual(imageAfter.capInsets.bottom, 0); @@ -50,17 +58,31 @@ } #if TARGET_OS_IPHONE - image = [image resizableImageWithCapInsets:UIEdgeInsetsZero]; + image = [image resizableImageWithCapInsets:UIEdgeInsetsZero resizingMode:UIImageResizingModeStretch]; #else + image.resizingMode = NSImageResizingModeStretch; image.capInsets = NSEdgeInsetsZero; #endif { auto styleImage = [image mgl_styleImageWithIdentifier:@"box"]; XCTAssert(styleImage); if (styleImage) { + auto scale = styleImage->getPixelRatio(); XCTAssert(!styleImage->getContent()); + auto stretchX = styleImage->getStretchX(); + XCTAssertEqual(stretchX.size(), 1UL); + if (!stretchX.empty()) { + XCTAssertEqual(stretchX.front(), mbgl::style::ImageStretch(0, 24 * scale)); + } + auto stretchY = styleImage->getStretchY(); + XCTAssertEqual(stretchY.size(), 1UL); + if (!stretchY.empty()) { + XCTAssertEqual(stretchY.front(), mbgl::style::ImageStretch(0, 24 * scale)); + } + MGLImage *imageAfter = [[MGLImage alloc] initWithMGLStyleImage:*styleImage]; + XCTAssertEqual(imageAfter.resizingMode, MGLImageResizingModeStretch); XCTAssertEqual(imageAfter.capInsets.top, 0); XCTAssertEqual(imageAfter.capInsets.left, 0); XCTAssertEqual(imageAfter.capInsets.bottom, 0); @@ -87,7 +109,19 @@ XCTAssertEqual(content->right, 20 * scale); } + auto stretchX = styleImage->getStretchX(); + XCTAssertEqual(stretchX.size(), 1UL); + if (!stretchX.empty()) { + XCTAssertEqual(stretchX.front(), mbgl::style::ImageStretch(2 * scale, 20 * scale)); + } + auto stretchY = styleImage->getStretchY(); + XCTAssertEqual(stretchY.size(), 1UL); + if (!stretchY.empty()) { + XCTAssertEqual(stretchY.front(), mbgl::style::ImageStretch(1 * scale, 21 * scale)); + } + MGLImage *imageAfter = [[MGLImage alloc] initWithMGLStyleImage:*styleImage]; + XCTAssertEqual(imageAfter.resizingMode, MGLImageResizingModeStretch); XCTAssertEqual(imageAfter.capInsets.top, 1); XCTAssertEqual(imageAfter.capInsets.left, 2); XCTAssertEqual(imageAfter.capInsets.bottom, 3); diff --git a/platform/ios/src/UIImage+MGLAdditions.mm b/platform/ios/src/UIImage+MGLAdditions.mm index 1f468aa3f..19c000c6a 100644 --- a/platform/ios/src/UIImage+MGLAdditions.mm +++ b/platform/ios/src/UIImage+MGLAdditions.mm @@ -32,7 +32,16 @@ BOOL MGLEdgeInsetsIsZero(UIEdgeInsets edgeInsets) { content->left / scale, self.size.height - content->bottom / scale, self.size.width - content->right / scale); - self = [self resizableImageWithCapInsets:capInsets resizingMode:UIImageResizingModeStretch]; + UIImageResizingMode resizingMode = UIImageResizingModeTile; + if (!styleImage.getStretchX().empty() || !styleImage.getStretchY().empty()) + { + resizingMode = UIImageResizingModeStretch; + } + self = [self resizableImageWithCapInsets:capInsets resizingMode:resizingMode]; + } + if (!styleImage.getStretchX().empty() || !styleImage.getStretchY().empty()) + { + self = [self resizableImageWithCapInsets:self.capInsets resizingMode:UIImageResizingModeStretch]; } } CGImageRelease(image); @@ -53,15 +62,20 @@ BOOL MGLEdgeInsetsIsZero(UIEdgeInsets edgeInsets) { } - (std::unique_ptr)mgl_styleImageWithIdentifier:(NSString *)identifier { - mbgl::style::ImageStretches stretchX = {{ - self.capInsets.left / self.scale, (self.size.width - self.capInsets.right) / self.scale, - }}; - mbgl::style::ImageStretches stretchY = {{ - self.capInsets.top / self.scale, (self.size.height - self.capInsets.bottom) / self.scale, - }}; + mbgl::style::ImageStretches stretchX, stretchY; + if (self.resizingMode == UIImageResizingModeStretch) + { + stretchX.push_back({ + self.capInsets.left * self.scale, (self.size.width - self.capInsets.right) * self.scale, + }); + stretchY.push_back({ + self.capInsets.top * self.scale, (self.size.height - self.capInsets.bottom) * self.scale, + }); + } mbgl::optional imageContent; - if (!MGLEdgeInsetsIsZero(self.capInsets)) { + if (!MGLEdgeInsetsIsZero(self.capInsets)) + { imageContent = (mbgl::style::ImageContent){ .left = static_cast(self.capInsets.left * self.scale), .top = static_cast(self.capInsets.top * self.scale), diff --git a/platform/macos/src/NSImage+MGLAdditions.mm b/platform/macos/src/NSImage+MGLAdditions.mm index 2bb4fae60..178cd17c7 100644 --- a/platform/macos/src/NSImage+MGLAdditions.mm +++ b/platform/macos/src/NSImage+MGLAdditions.mm @@ -33,6 +33,11 @@ BOOL MGLEdgeInsetsIsZero(NSEdgeInsets edgeInsets) { if (self = [self initWithSize:size]) { [self addRepresentation:rep]; [self setTemplate:styleImage.isSdf()]; + if (!styleImage.getStretchX().empty() || !styleImage.getStretchY().empty()) { + self.resizingMode = NSImageResizingModeStretch; + } else { + self.resizingMode = NSImageResizingModeTile; + } if (auto content = styleImage.getContent()) { self.capInsets = NSEdgeInsetsMake(content->top / scale, content->left / scale, @@ -48,12 +53,15 @@ BOOL MGLEdgeInsetsIsZero(NSEdgeInsets edgeInsets) { auto imageWidth = cPremultipliedImage.size.width; float scale = static_cast(imageWidth) / self.size.width; - mbgl::style::ImageStretches stretchX = {{ - self.capInsets.left * scale, (self.size.width - self.capInsets.right) * scale, - }}; - mbgl::style::ImageStretches stretchY = {{ - self.capInsets.top * scale, (self.size.height - self.capInsets.bottom) * scale, - }}; + mbgl::style::ImageStretches stretchX, stretchY; + if (self.resizingMode == NSImageResizingModeStretch) { + stretchX.push_back({ + self.capInsets.left * scale, (self.size.width - self.capInsets.right) * scale, + }); + stretchY.push_back({ + self.capInsets.top * scale, (self.size.height - self.capInsets.bottom) * scale, + }); + } mbgl::optional imageContent; if (!MGLEdgeInsetsIsZero(self.capInsets)) {