[ios, macos] Only set stretchable regions for stretch resizing mode
This commit is contained in:
committed by
Minh Nguyễn
parent
a18d5211a6
commit
dc3470b993
@@ -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);
|
||||
|
||||
@@ -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),
|
||||
|
||||
@@ -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)) {
|
||||
|
||||
Reference in New Issue
Block a user