5 #include "gtest/gtest.h"
14 TEST(RoundRectTest, RoundingRadiiEmptyDeclaration) {
34 TEST(RoundRectTest, RoundingRadiiDefaultConstructor) {
46 TEST(RoundRectTest, RoundingRadiiScalarConstructor) {
58 TEST(RoundRectTest, RoundingRadiiEmptyScalarConstructor) {
70 TEST(RoundRectTest, RoundingRadiiSizeConstructor) {
82 TEST(RoundRectTest, RoundingRadiiEmptySizeConstructor) {
108 TEST(RoundRectTest, RoundingRadiiNamedSizesConstructor) {
111 .top_right =
Size(6.0f, 6.5f),
112 .bottom_left =
Size(7.0f, 7.5f),
113 .bottom_right =
Size(8.0f, 8.5f),
125 TEST(RoundRectTest, RoundingRadiiPartialNamedSizesConstructor) {
183 TEST(RoundRectTest, RoundingRadiiMultiply) {
186 .top_right =
Size(6.0f, 6.5f),
187 .bottom_left =
Size(7.0f, 7.5f),
188 .bottom_right =
Size(8.0f, 8.5f),
201 TEST(RoundRectTest, RoundingRadiiEquals) {
204 .top_right =
Size(6.0f, 6.5f),
205 .bottom_left =
Size(7.0f, 7.5f),
206 .bottom_right =
Size(8.0f, 8.5f),
210 .top_right =
Size(6.0f, 6.5f),
211 .bottom_left =
Size(7.0f, 7.5f),
212 .bottom_right =
Size(8.0f, 8.5f),
215 EXPECT_EQ(radii, other);
218 TEST(RoundRectTest, RoundingRadiiNotEquals) {
221 .top_right =
Size(6.0f, 6.5f),
222 .bottom_left =
Size(7.0f, 7.5f),
223 .bottom_right =
Size(8.0f, 8.5f),
229 EXPECT_NE(different, radii);
234 EXPECT_NE(different, radii);
239 EXPECT_NE(different, radii);
244 EXPECT_NE(different, radii);
249 EXPECT_NE(different, radii);
254 EXPECT_NE(different, radii);
259 EXPECT_NE(different, radii);
264 EXPECT_NE(different, radii);
268 TEST(RoundRectTest, RoundingRadiiCornersSameTolerance) {
271 .top_right = {10.01, 20.01},
272 .bottom_left = {9.99, 19.99},
273 .bottom_right = {9.99, 20.01},
276 EXPECT_TRUE(radii.AreAllCornersSame(.02));
320 TEST(RoundRectTest, EmptyDeclaration) {
323 EXPECT_TRUE(round_rect.
IsEmpty());
324 EXPECT_FALSE(round_rect.
IsRect());
325 EXPECT_FALSE(round_rect.
IsOval());
347 TEST(RoundRectTest, DefaultConstructor) {
350 EXPECT_TRUE(round_rect.
IsEmpty());
351 EXPECT_FALSE(round_rect.
IsRect());
352 EXPECT_FALSE(round_rect.
IsOval());
362 TEST(RoundRectTest, EmptyRectConstruction) {
366 EXPECT_TRUE(round_rect.
IsEmpty());
367 EXPECT_FALSE(round_rect.
IsRect());
368 EXPECT_FALSE(round_rect.
IsOval());
378 TEST(RoundRectTest, RectConstructor) {
382 EXPECT_FALSE(round_rect.
IsEmpty());
383 EXPECT_TRUE(round_rect.
IsRect());
384 EXPECT_FALSE(round_rect.
IsOval());
394 TEST(RoundRectTest, InvertedRectConstruction) {
398 EXPECT_FALSE(round_rect.
IsEmpty());
399 EXPECT_TRUE(round_rect.
IsRect());
400 EXPECT_FALSE(round_rect.
IsOval());
410 TEST(RoundRectTest, EmptyOvalConstruction) {
414 EXPECT_TRUE(round_rect.
IsEmpty());
415 EXPECT_FALSE(round_rect.
IsRect());
416 EXPECT_FALSE(round_rect.
IsOval());
426 TEST(RoundRectTest, OvalConstructor) {
430 EXPECT_FALSE(round_rect.
IsEmpty());
431 EXPECT_FALSE(round_rect.
IsRect());
432 EXPECT_TRUE(round_rect.
IsOval());
442 TEST(RoundRectTest, InvertedOvalConstruction) {
446 EXPECT_FALSE(round_rect.
IsEmpty());
447 EXPECT_FALSE(round_rect.
IsRect());
448 EXPECT_TRUE(round_rect.
IsOval());
458 TEST(RoundRectTest, RectRadiusConstructor) {
462 EXPECT_FALSE(round_rect.
IsEmpty());
463 EXPECT_FALSE(round_rect.
IsRect());
464 EXPECT_FALSE(round_rect.
IsOval());
474 TEST(RoundRectTest, RectXYConstructor) {
478 EXPECT_FALSE(round_rect.
IsEmpty());
479 EXPECT_FALSE(round_rect.
IsRect());
480 EXPECT_FALSE(round_rect.
IsOval());
490 TEST(RoundRectTest, RectSizeConstructor) {
494 EXPECT_FALSE(round_rect.
IsEmpty());
495 EXPECT_FALSE(round_rect.
IsRect());
496 EXPECT_FALSE(round_rect.
IsOval());
506 TEST(RoundRectTest, RectRadiiConstructor) {
510 .top_left =
Size(1.0, 1.5),
511 .top_right =
Size(2.0, 2.5f),
512 .bottom_left =
Size(3.0, 3.5f),
513 .bottom_right =
Size(4.0, 4.5f),
516 EXPECT_FALSE(round_rect.
IsEmpty());
517 EXPECT_FALSE(round_rect.
IsRect());
518 EXPECT_FALSE(round_rect.
IsOval());
528 TEST(RoundRectTest, RectRadiiOverflowWidthConstructor) {
532 .top_left =
Size(1.0f, 2.0f),
533 .top_right =
Size(3.0f, 4.0f),
534 .bottom_left =
Size(5.0f, 6.0f),
535 .bottom_right =
Size(7.0f, 8.0f),
541 EXPECT_FALSE(round_rect.
IsEmpty());
542 EXPECT_FALSE(round_rect.
IsRect());
543 EXPECT_FALSE(round_rect.
IsOval());
553 TEST(RoundRectTest, RectRadiiOverflowHeightConstructor) {
557 .top_left =
Size(1.0f, 2.0f),
558 .top_right =
Size(3.0f, 4.0f),
559 .bottom_left =
Size(5.0f, 6.0f),
560 .bottom_right =
Size(7.0f, 8.0f),
566 EXPECT_FALSE(round_rect.
IsEmpty());
567 EXPECT_FALSE(round_rect.
IsRect());
568 EXPECT_FALSE(round_rect.
IsOval());
582 .top_left =
Size(1.0f, 2.0f),
583 .top_right =
Size(3.0f, 4.0f),
584 .bottom_left =
Size(5.0f, 6.0f),
585 .bottom_right =
Size(7.0f, 8.0f),
589 EXPECT_FALSE(shifted.IsEmpty());
590 EXPECT_FALSE(shifted.IsRect());
591 EXPECT_FALSE(shifted.IsOval());
592 EXPECT_TRUE(shifted.IsFinite());
593 EXPECT_FALSE(shifted.GetBounds().IsEmpty());
594 EXPECT_EQ(shifted.GetBounds(),
Rect::MakeLTRB(15.0f, 16.0f, 45.0f, 46.0f));
595 EXPECT_EQ(shifted.GetRadii().top_left,
Size(1.0f, 2.0f));
596 EXPECT_EQ(shifted.GetRadii().top_right,
Size(3.0f, 4.0f));
597 EXPECT_EQ(shifted.GetRadii().bottom_left,
Size(5.0f, 6.0f));
598 EXPECT_EQ(shifted.GetRadii().bottom_right,
Size(7.0f, 8.0f));
603 .top_left =
Size(1.0f, 2.0f),
604 .top_right =
Size(3.0f, 4.0f),
605 .bottom_left =
Size(5.0f, 6.0f),
606 .bottom_right =
Size(7.0f, 8.0f),
610 TEST(RoundRectTest, ExpandScalar) {
614 .top_left =
Size(1.0f, 2.0f),
615 .top_right =
Size(3.0f, 4.0f),
616 .bottom_left =
Size(5.0f, 6.0f),
617 .bottom_right =
Size(7.0f, 8.0f),
621 EXPECT_FALSE(expanded.IsEmpty());
622 EXPECT_FALSE(expanded.IsRect());
623 EXPECT_FALSE(expanded.IsOval());
624 EXPECT_TRUE(expanded.IsFinite());
625 EXPECT_FALSE(expanded.GetBounds().IsEmpty());
626 EXPECT_EQ(expanded.GetBounds(),
Rect::MakeLTRB(5.0f, 5.0f, 45.0f, 45.0f));
627 EXPECT_EQ(expanded.GetRadii().top_left,
Size(1.0f, 2.0f));
628 EXPECT_EQ(expanded.GetRadii().top_right,
Size(3.0f, 4.0f));
629 EXPECT_EQ(expanded.GetRadii().bottom_left,
Size(5.0f, 6.0f));
630 EXPECT_EQ(expanded.GetRadii().bottom_right,
Size(7.0f, 8.0f));
635 .top_left =
Size(1.0f, 2.0f),
636 .top_right =
Size(3.0f, 4.0f),
637 .bottom_left =
Size(5.0f, 6.0f),
638 .bottom_right =
Size(7.0f, 8.0f),
642 TEST(RoundRectTest, ExpandTwoScalars) {
646 .top_left =
Size(1.0f, 2.0f),
647 .top_right =
Size(3.0f, 4.0f),
648 .bottom_left =
Size(5.0f, 6.0f),
649 .bottom_right =
Size(7.0f, 8.0f),
653 EXPECT_FALSE(expanded.IsEmpty());
654 EXPECT_FALSE(expanded.IsRect());
655 EXPECT_FALSE(expanded.IsOval());
656 EXPECT_TRUE(expanded.IsFinite());
657 EXPECT_FALSE(expanded.GetBounds().IsEmpty());
658 EXPECT_EQ(expanded.GetBounds(),
Rect::MakeLTRB(5.0f, 4.0f, 45.0f, 46.0f));
659 EXPECT_EQ(expanded.GetRadii().top_left,
Size(1.0f, 2.0f));
660 EXPECT_EQ(expanded.GetRadii().top_right,
Size(3.0f, 4.0f));
661 EXPECT_EQ(expanded.GetRadii().bottom_left,
Size(5.0f, 6.0f));
662 EXPECT_EQ(expanded.GetRadii().bottom_right,
Size(7.0f, 8.0f));
667 .top_left =
Size(1.0f, 2.0f),
668 .top_right =
Size(3.0f, 4.0f),
669 .bottom_left =
Size(5.0f, 6.0f),
670 .bottom_right =
Size(7.0f, 8.0f),
674 TEST(RoundRectTest, ExpandFourScalars) {
678 .top_left =
Size(1.0f, 2.0f),
679 .top_right =
Size(3.0f, 4.0f),
680 .bottom_left =
Size(5.0f, 6.0f),
681 .bottom_right =
Size(7.0f, 8.0f),
685 EXPECT_FALSE(expanded.IsEmpty());
686 EXPECT_FALSE(expanded.IsRect());
687 EXPECT_FALSE(expanded.IsOval());
688 EXPECT_TRUE(expanded.IsFinite());
689 EXPECT_FALSE(expanded.GetBounds().IsEmpty());
690 EXPECT_EQ(expanded.GetBounds(),
Rect::MakeLTRB(5.0f, 4.0f, 47.0f, 48.0f));
691 EXPECT_EQ(expanded.GetRadii().top_left,
Size(1.0f, 2.0f));
692 EXPECT_EQ(expanded.GetRadii().top_right,
Size(3.0f, 4.0f));
693 EXPECT_EQ(expanded.GetRadii().bottom_left,
Size(5.0f, 6.0f));
694 EXPECT_EQ(expanded.GetRadii().bottom_right,
Size(7.0f, 8.0f));
699 .top_left =
Size(1.0f, 2.0f),
700 .top_right =
Size(3.0f, 4.0f),
701 .bottom_left =
Size(5.0f, 6.0f),
702 .bottom_right =
Size(7.0f, 8.0f),
706 TEST(RoundRectTest, ContractScalar) {
710 .top_left =
Size(1.0f, 2.0f),
711 .top_right =
Size(3.0f, 4.0f),
712 .bottom_left =
Size(5.0f, 6.0f),
713 .bottom_right =
Size(7.0f, 8.0f),
717 EXPECT_FALSE(expanded.IsEmpty());
718 EXPECT_FALSE(expanded.IsRect());
719 EXPECT_FALSE(expanded.IsOval());
720 EXPECT_TRUE(expanded.IsFinite());
721 EXPECT_FALSE(expanded.GetBounds().IsEmpty());
722 EXPECT_EQ(expanded.GetBounds(),
Rect::MakeLTRB(12.0f, 12.0f, 38.0f, 38.0f));
723 EXPECT_EQ(expanded.GetRadii().top_left,
Size(1.0f, 2.0f));
724 EXPECT_EQ(expanded.GetRadii().top_right,
Size(3.0f, 4.0f));
725 EXPECT_EQ(expanded.GetRadii().bottom_left,
Size(5.0f, 6.0f));
726 EXPECT_EQ(expanded.GetRadii().bottom_right,
Size(7.0f, 8.0f));
731 .top_left =
Size(1.0f, 2.0f),
732 .top_right =
Size(3.0f, 4.0f),
733 .bottom_left =
Size(5.0f, 6.0f),
734 .bottom_right =
Size(7.0f, 8.0f),
738 TEST(RoundRectTest, ContractTwoScalars) {
742 .top_left =
Size(1.0f, 2.0f),
743 .top_right =
Size(3.0f, 4.0f),
744 .bottom_left =
Size(5.0f, 6.0f),
745 .bottom_right =
Size(7.0f, 8.0f),
749 EXPECT_FALSE(expanded.IsEmpty());
750 EXPECT_FALSE(expanded.IsRect());
751 EXPECT_FALSE(expanded.IsOval());
752 EXPECT_TRUE(expanded.IsFinite());
753 EXPECT_FALSE(expanded.GetBounds().IsEmpty());
754 EXPECT_EQ(expanded.GetBounds(),
Rect::MakeLTRB(11.0f, 12.0f, 39.0f, 38.0f));
755 EXPECT_EQ(expanded.GetRadii().top_left,
Size(1.0f, 2.0f));
756 EXPECT_EQ(expanded.GetRadii().top_right,
Size(3.0f, 4.0f));
757 EXPECT_EQ(expanded.GetRadii().bottom_left,
Size(5.0f, 6.0f));
758 EXPECT_EQ(expanded.GetRadii().bottom_right,
Size(7.0f, 8.0f));
763 .top_left =
Size(1.0f, 2.0f),
764 .top_right =
Size(3.0f, 4.0f),
765 .bottom_left =
Size(5.0f, 6.0f),
766 .bottom_right =
Size(7.0f, 8.0f),
770 TEST(RoundRectTest, ContractFourScalars) {
774 .top_left =
Size(1.0f, 2.0f),
775 .top_right =
Size(3.0f, 4.0f),
776 .bottom_left =
Size(5.0f, 6.0f),
777 .bottom_right =
Size(7.0f, 8.0f),
781 EXPECT_FALSE(expanded.IsEmpty());
782 EXPECT_FALSE(expanded.IsRect());
783 EXPECT_FALSE(expanded.IsOval());
784 EXPECT_TRUE(expanded.IsFinite());
785 EXPECT_FALSE(expanded.GetBounds().IsEmpty());
786 EXPECT_EQ(expanded.GetBounds(),
Rect::MakeLTRB(11.0f, 11.5f, 38.0f, 37.5f));
787 EXPECT_EQ(expanded.GetRadii().top_left,
Size(1.0f, 2.0f));
788 EXPECT_EQ(expanded.GetRadii().top_right,
Size(3.0f, 4.0f));
789 EXPECT_EQ(expanded.GetRadii().bottom_left,
Size(5.0f, 6.0f));
790 EXPECT_EQ(expanded.GetRadii().bottom_right,
Size(7.0f, 8.0f));
795 .top_left =
Size(1.0f, 2.0f),
796 .top_right =
Size(3.0f, 4.0f),
797 .bottom_left =
Size(5.0f, 6.0f),
798 .bottom_right =
Size(7.0f, 8.0f),
802 TEST(RoundRectTest, ContractAndRequireRadiiAdjustment) {
806 .top_left =
Size(1.0f, 2.0f),
807 .top_right =
Size(3.0f, 4.0f),
808 .bottom_left =
Size(5.0f, 6.0f),
809 .bottom_right =
Size(7.0f, 8.0f),
817 EXPECT_FALSE(expanded.IsEmpty());
818 EXPECT_FALSE(expanded.IsRect());
819 EXPECT_FALSE(expanded.IsOval());
820 EXPECT_TRUE(expanded.IsFinite());
821 EXPECT_FALSE(expanded.GetBounds().IsEmpty());
822 EXPECT_EQ(expanded.GetBounds(),
Rect::MakeLTRB(22.0f, 22.0f, 28.0f, 28.0f));
823 EXPECT_EQ(expanded.GetRadii().top_left,
Size(0.5f, 1.0f));
824 EXPECT_EQ(expanded.GetRadii().top_right,
Size(1.5f, 2.0f));
825 EXPECT_EQ(expanded.GetRadii().bottom_left,
Size(2.5f, 3.0f));
826 EXPECT_EQ(expanded.GetRadii().bottom_right,
Size(3.5f, 4.0f));
833 .top_left =
Size(1.0f, 2.0f),
834 .top_right =
Size(3.0f, 4.0f),
835 .bottom_left =
Size(5.0f, 6.0f),
836 .bottom_right =
Size(7.0f, 8.0f),
845 .top_left =
Size(0.5f, 1.0f),
846 .top_right =
Size(1.5f, 2.0f),
847 .bottom_left =
Size(2.5f, 3.0f),
848 .bottom_right =
Size(3.5f, 4.0f),
852 TEST(RoundRectTest, NoCornerRoundRectContains) {
857 EXPECT_TRUE(no_corners.Contains({-50, -50}));
860 EXPECT_TRUE(no_corners.Contains({-50, 49.99}));
861 EXPECT_TRUE(no_corners.Contains({49.99, -50}));
862 EXPECT_TRUE(no_corners.Contains({49.99, 49.99}));
863 EXPECT_FALSE(no_corners.Contains({-50.01, -50}));
864 EXPECT_FALSE(no_corners.Contains({-50, -50.01}));
865 EXPECT_FALSE(no_corners.Contains({-50.01, 50}));
866 EXPECT_FALSE(no_corners.Contains({-50, 50.01}));
867 EXPECT_FALSE(no_corners.Contains({50.01, -50}));
868 EXPECT_FALSE(no_corners.Contains({50, -50.01}));
869 EXPECT_FALSE(no_corners.Contains({50.01, 50}));
870 EXPECT_FALSE(no_corners.Contains({50, 50.01}));
873 TEST(RoundRectTest, TinyCornerRoundRectContains) {
878 EXPECT_FALSE(tiny_corners.Contains({-50, -50}));
879 EXPECT_FALSE(tiny_corners.Contains({-50, 50}));
880 EXPECT_FALSE(tiny_corners.Contains({50, -50}));
881 EXPECT_FALSE(tiny_corners.Contains({50, 50}));
884 TEST(RoundRectTest, UniformCircularRoundRectContains) {
890 EXPECT_TRUE(expanded_2_r_2.Contains({-50, -50}));
891 EXPECT_TRUE(expanded_2_r_2.Contains({-50, 50}));
892 EXPECT_TRUE(expanded_2_r_2.Contains({50, -50}));
893 EXPECT_TRUE(expanded_2_r_2.Contains({50, 50}));
906 EXPECT_TRUE(expanded_2_r_2.Contains({-coord_in, -coord_in}));
907 EXPECT_FALSE(expanded_2_r_2.Contains({-coord_out, -coord_out}));
909 EXPECT_TRUE(expanded_2_r_2.Contains({coord_in, -coord_in}));
910 EXPECT_FALSE(expanded_2_r_2.Contains({coord_out, -coord_out}));
912 EXPECT_TRUE(expanded_2_r_2.Contains({-coord_in, coord_in}));
913 EXPECT_FALSE(expanded_2_r_2.Contains({-coord_out, coord_out}));
915 EXPECT_TRUE(expanded_2_r_2.Contains({coord_in, coord_in}));
916 EXPECT_FALSE(expanded_2_r_2.Contains({coord_out, coord_out}));
919 TEST(RoundRectTest, UniformEllipticalRoundRectContains) {
925 EXPECT_TRUE(expanded_2_r_2.Contains({-50, -50}));
926 EXPECT_TRUE(expanded_2_r_2.Contains({-50, 50}));
927 EXPECT_TRUE(expanded_2_r_2.Contains({50, -50}));
928 EXPECT_TRUE(expanded_2_r_2.Contains({50, 50}));
945 EXPECT_TRUE(expanded_2_r_2.Contains({-x_coord_in, -y_coord_in}));
946 EXPECT_FALSE(expanded_2_r_2.Contains({-x_coord_out, -y_coord_out}));
948 EXPECT_TRUE(expanded_2_r_2.Contains({x_coord_in, -y_coord_in}));
949 EXPECT_FALSE(expanded_2_r_2.Contains({x_coord_out, -y_coord_out}));
951 EXPECT_TRUE(expanded_2_r_2.Contains({-x_coord_in, y_coord_in}));
952 EXPECT_FALSE(expanded_2_r_2.Contains({-x_coord_out, y_coord_out}));
954 EXPECT_TRUE(expanded_2_r_2.Contains({x_coord_in, y_coord_in}));
955 EXPECT_FALSE(expanded_2_r_2.Contains({x_coord_out, y_coord_out}));
958 TEST(RoundRectTest, DifferingCornersRoundRectContains) {
962 .top_left =
Size(2.0, 3.0),
963 .top_right =
Size(4.0, 5.0),
964 .bottom_left =
Size(6.0, 7.0),
965 .bottom_right =
Size(8.0, 9.0),
976 auto coord = [](
Scalar radius) {
979 auto coord_in = [&coord](
Scalar radius) {
982 auto coord_out = [&coord](
Scalar radius) {
988 EXPECT_TRUE(round_rect.Contains({-coord_in(2.0), -coord_in(3.0)}));
989 EXPECT_FALSE(round_rect.Contains({-coord_out(2.0), -coord_out(3.0)}));
991 EXPECT_TRUE(round_rect.Contains({coord_in(4.0), -coord_in(5.0)}));
992 EXPECT_FALSE(round_rect.Contains({coord_out(4.0), -coord_out(5.0)}));
994 EXPECT_TRUE(round_rect.Contains({-coord_in(6.0), coord_in(7.0)}));
995 EXPECT_FALSE(round_rect.Contains({-coord_out(6.0), coord_out(7.0)}));
997 EXPECT_TRUE(round_rect.Contains({coord_in(8.0), coord_in(9.0)}));
998 EXPECT_FALSE(round_rect.Contains({coord_out(8.0), coord_out(9.0)}));
TEST(AllocationSizeTest, CanCreateTypedAllocations)
constexpr float kEhCloseEnough
constexpr bool IsFinite() const
constexpr const RoundingRadii & GetRadii() const
static RoundRect MakeRectRadii(const Rect &rect, const RoundingRadii &radii)
constexpr static RoundRect MakeRectRadius(const Rect &rect, Scalar radius)
constexpr bool IsEmpty() const
constexpr bool IsRect() const
constexpr static RoundRect MakeOval(const Rect &rect)
constexpr RoundRect Expand(Scalar left, Scalar top, Scalar right, Scalar bottom) const
Returns a round rectangle with expanded edges. Negative expansion results in shrinking.
constexpr static RoundRect MakeRect(const Rect &rect)
constexpr RoundRect Shift(Scalar dx, Scalar dy) const
Returns a new round rectangle translated by the given offset.
constexpr const Rect & GetBounds() const
constexpr bool IsOval() const
constexpr static RoundRect MakeRectXY(const Rect &rect, Scalar x_radius, Scalar y_radius)
constexpr bool AreAllCornersEmpty() const
constexpr static RoundingRadii MakeRadii(Size radii)
constexpr bool IsFinite() const
constexpr bool AreAllCornersSame(Scalar tolerance=kEhCloseEnough) const
constexpr static RoundingRadii MakeRadius(Scalar radius)
constexpr TRect< T > Expand(T left, T top, T right, T bottom) const
Returns a rectangle with expanded edges. Negative expansion results in shrinking.
constexpr auto GetBottom() const
constexpr auto GetTop() const
constexpr bool IsEmpty() const
Returns true if either of the width or height are 0, negative, or NaN.
constexpr auto GetLeft() const
constexpr auto GetRight() const
constexpr static TRect MakeXYWH(Type x, Type y, Type width, Type height)
constexpr static TRect MakeLTRB(Type left, Type top, Type right, Type bottom)