[ios, macos] Only set stretchable regions for stretch resizing mode

This commit is contained in:
Minh Nguyễn
2020-03-11 16:03:02 -07:00
committed by Minh Nguyễn
parent a18d5211a6
commit dc3470b993
3 changed files with 71 additions and 15 deletions

View File

@@ -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);

View File

@@ -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<mbgl::style::Image>)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<mbgl::style::ImageContent> imageContent;
if (!MGLEdgeInsetsIsZero(self.capInsets)) {
if (!MGLEdgeInsetsIsZero(self.capInsets))
{
imageContent = (mbgl::style::ImageContent){
.left = static_cast<float>(self.capInsets.left * self.scale),
.top = static_cast<float>(self.capInsets.top * self.scale),

View File

@@ -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<float>(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<mbgl::style::ImageContent> imageContent;
if (!MGLEdgeInsetsIsZero(self.capInsets)) {