Skip to content

Commit 138ade0

Browse files
sammy-SCfacebook-github-bot
authored andcommitted
Add transform*rect and transform*size operators
Summary: Adding 2 `transform*rect` and `transform*size` operations. Changelog: [Internal] Reviewed By: JoshuaGross Differential Revision: D20304247 fbshipit-source-id: 7bde67c96a21ce15e9da0464bcfccc61ab8fe13d
1 parent d0871d0 commit 138ade0

File tree

3 files changed

+71
-0
lines changed

3 files changed

+71
-0
lines changed

ReactCommon/fabric/graphics/Transform.cpp

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,5 +180,25 @@ Point operator*(Point const &point, Transform const &transform) {
180180
return result;
181181
}
182182

183+
Rect operator*(Rect const &rect, Transform const &transform) {
184+
auto transformedSize = rect.size * transform;
185+
auto pointAdjustment = Point{(rect.size.width - transformedSize.width) / 2,
186+
(rect.size.height - transformedSize.height) / 2};
187+
188+
return {rect.origin + pointAdjustment, transformedSize};
189+
}
190+
191+
Size operator*(Size const &size, Transform const &transform) {
192+
if (transform == Transform::Identity()) {
193+
return size;
194+
}
195+
196+
auto result = Size{};
197+
result.width = transform.at(0, 0) * size.width;
198+
result.height = transform.at(1, 1) * size.height;
199+
200+
return result;
201+
}
202+
183203
} // namespace react
184204
} // namespace facebook

ReactCommon/fabric/graphics/Transform.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,17 @@ struct Transform {
7979
*/
8080
Point operator*(Point const &point, Transform const &transform);
8181

82+
/*
83+
* Applies tranformation to the given size.
84+
*/
85+
Size operator*(Size const &size, Transform const &transform);
86+
87+
/*
88+
* Applies tranformation to the given rect.
89+
* ONLY SUPPORTS scale transformation.
90+
*/
91+
Rect operator*(Rect const &rect, Transform const &transform);
92+
8293
} // namespace react
8394
} // namespace facebook
8495

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
/*
2+
* Copyright (c) Facebook, Inc. and its affiliates.
3+
*
4+
* This source code is licensed under the MIT license found in the
5+
* LICENSE file in the root directory of this source tree.
6+
*/
7+
8+
#include <react/graphics/Transform.h>
9+
#include <gtest/gtest.h>
10+
11+
using namespace facebook::react;
12+
13+
TEST(TransformTest, transformingSize) {
14+
auto size = facebook::react::Size{100, 200};
15+
auto scaledSize = size * Transform::Scale(0.5, 0.5, 1);
16+
17+
EXPECT_EQ(scaledSize.width, 50);
18+
EXPECT_EQ(scaledSize.height, 100);
19+
}
20+
21+
TEST(TransformTest, transformingPoint) {
22+
auto point = facebook::react::Point{100, 200};
23+
auto translatedPoint = point * Transform::Translate(-50, -100, 0);
24+
25+
EXPECT_EQ(translatedPoint.x, 50);
26+
EXPECT_EQ(translatedPoint.y, 100);
27+
}
28+
29+
TEST(TransformTest, transformingRect) {
30+
auto point = facebook::react::Point{100, 200};
31+
auto size = facebook::react::Size{300, 400};
32+
auto rect = facebook::react::Rect{point, size};
33+
34+
auto transformedRect = rect * Transform::Scale(0.5, 0.5, 1);
35+
36+
EXPECT_EQ(transformedRect.origin.x, 175);
37+
EXPECT_EQ(transformedRect.origin.y, 300);
38+
EXPECT_EQ(transformedRect.size.width, 150);
39+
EXPECT_EQ(transformedRect.size.height, 200);
40+
}

0 commit comments

Comments
 (0)