5#include "flutter/display_list/utils/dl_matrix_clip_tracker.h"
6#include "flutter/testing/assertions_skia.h"
7#include "gtest/gtest.h"
33 EXPECT_EQ(tracker1.
matrix(), dl_matrix);
40 EXPECT_EQ(tracker2.
matrix(), dl_matrix);
47 EXPECT_EQ(tracker3.
matrix(), dl_matrix);
67 EXPECT_EQ(state1.
matrix(), dl_matrix);
74 EXPECT_EQ(state2.
matrix(), dl_matrix);
81 EXPECT_EQ(state3.
matrix(), dl_matrix);
106 EXPECT_EQ(tracker1.
matrix(), dl_matrix);
112 EXPECT_EQ(tracker2.
matrix(), dl_matrix);
137 EXPECT_EQ(state1.
matrix(), dl_matrix);
143 EXPECT_EQ(state2.
matrix(), dl_matrix);
171 EXPECT_EQ(tracker1.
matrix(), dl_matrix);
178 EXPECT_EQ(tracker2.
matrix(), dl_matrix);
206 EXPECT_EQ(state1.
matrix(), dl_matrix);
213 EXPECT_EQ(state2.
matrix(), dl_matrix);
241 EXPECT_EQ(tracker1.
matrix(), dl_matrix);
248 EXPECT_EQ(tracker2.
matrix(), dl_matrix);
276 EXPECT_EQ(state1.
matrix(), dl_matrix);
283 EXPECT_EQ(state2.
matrix(), dl_matrix);
316 EXPECT_EQ(tracker1.
matrix(), dl_matrix);
330 EXPECT_EQ(tracker2.
matrix(), dl_matrix);
351 const SkM44 translated_m44 =
SkM44(translated_matrix);
352 const DlMatrix dl_translated_matrix =
366 EXPECT_EQ(tracker1.
matrix_3x3(), translated_matrix);
367 EXPECT_EQ(tracker1.
matrix_4x4(), translated_m44);
368 EXPECT_EQ(tracker1.
matrix(), dl_translated_matrix);
373 EXPECT_EQ(tracker2.
matrix_3x3(), translated_matrix);
374 EXPECT_EQ(tracker2.
matrix_4x4(), translated_m44);
375 EXPECT_EQ(tracker2.
matrix(), dl_translated_matrix);
380 EXPECT_EQ(tracker3.
matrix_3x3(), translated_matrix);
381 EXPECT_EQ(tracker3.
matrix_4x4(), translated_m44);
382 EXPECT_EQ(tracker3.
matrix(), dl_translated_matrix);
393 const SkM44 translated_m44 =
SkM44(translated_matrix);
394 const DlMatrix dl_translated_matrix =
408 EXPECT_EQ(state1.
matrix_3x3(), translated_matrix);
409 EXPECT_EQ(state1.
matrix_4x4(), translated_m44);
410 EXPECT_EQ(state1.
matrix(), dl_translated_matrix);
415 EXPECT_EQ(state2.
matrix_3x3(), translated_matrix);
416 EXPECT_EQ(state2.
matrix_4x4(), translated_m44);
417 EXPECT_EQ(state2.
matrix(), dl_translated_matrix);
422 EXPECT_EQ(state3.
matrix_3x3(), translated_matrix);
423 EXPECT_EQ(state3.
matrix_4x4(), translated_m44);
424 EXPECT_EQ(state3.
matrix(), dl_translated_matrix);
437 const SkM44 scaled_m44 =
SkM44(scaled_matrix);
438 const DlMatrix scaled_dl_matrix = dl_matrix.
Scale({0.5, 2, 1});
444 tracker1.
scale(0.5, 2);
445 tracker2.
scale(0.5, 2);
446 tracker3.
scale(0.5, 2);
451 EXPECT_EQ(tracker1.
matrix_3x3(), scaled_matrix);
453 EXPECT_EQ(tracker1.
matrix(), scaled_dl_matrix);
458 EXPECT_EQ(tracker2.
matrix_3x3(), scaled_matrix);
460 EXPECT_EQ(tracker2.
matrix(), scaled_dl_matrix);
465 EXPECT_EQ(tracker3.
matrix_3x3(), scaled_matrix);
467 EXPECT_EQ(tracker3.
matrix(), scaled_dl_matrix);
480 const SkM44 scaled_m44 =
SkM44(scaled_matrix);
481 const DlMatrix scaled_dl_matrix = dl_matrix.
Scale({0.5, 2, 1});
487 state1.
scale(0.5, 2);
488 state2.
scale(0.5, 2);
489 state3.
scale(0.5, 2);
494 EXPECT_EQ(state1.
matrix_3x3(), scaled_matrix);
496 EXPECT_EQ(state1.
matrix(), scaled_dl_matrix);
501 EXPECT_EQ(state2.
matrix_3x3(), scaled_matrix);
503 EXPECT_EQ(state2.
matrix(), scaled_dl_matrix);
508 EXPECT_EQ(state3.
matrix_3x3(), scaled_matrix);
510 EXPECT_EQ(state3.
matrix(), scaled_dl_matrix);
521 const SkM44 skewed_m44 =
SkM44(skewed_matrix);
528 tracker1.
skew(.25, 0);
529 tracker2.
skew(.25, 0);
530 tracker3.
skew(.25, 0);
535 EXPECT_EQ(tracker1.
matrix_3x3(), skewed_matrix);
537 EXPECT_EQ(tracker1.
matrix(), skewed_dl_matrix);
542 EXPECT_EQ(tracker2.
matrix_3x3(), skewed_matrix);
544 EXPECT_EQ(tracker2.
matrix(), skewed_dl_matrix);
549 EXPECT_EQ(tracker3.
matrix_3x3(), skewed_matrix);
551 EXPECT_EQ(tracker3.
matrix(), skewed_dl_matrix);
562 const SkM44 skewed_m44 =
SkM44(skewed_matrix);
576 EXPECT_EQ(state1.
matrix_3x3(), skewed_matrix);
578 EXPECT_EQ(state1.
matrix(), skewed_dl_matrix);
583 EXPECT_EQ(state2.
matrix_3x3(), skewed_matrix);
585 EXPECT_EQ(state2.
matrix(), skewed_dl_matrix);
590 EXPECT_EQ(state3.
matrix_3x3(), skewed_matrix);
592 EXPECT_EQ(state3.
matrix(), skewed_dl_matrix);
603 const SkM44 rotated_m44 =
SkM44(rotated_matrix);
618 EXPECT_EQ(tracker1.
matrix_3x3(), rotated_matrix);
619 EXPECT_EQ(tracker1.
matrix_4x4(), rotated_m44);
620 EXPECT_EQ(tracker1.
matrix(), rotated_dl_matrix);
625 EXPECT_EQ(tracker2.
matrix_3x3(), rotated_matrix);
626 EXPECT_EQ(tracker2.
matrix_4x4(), rotated_m44);
627 EXPECT_EQ(tracker2.
matrix(), rotated_dl_matrix);
632 EXPECT_EQ(tracker3.
matrix_3x3(), rotated_matrix);
633 EXPECT_EQ(tracker3.
matrix_4x4(), rotated_m44);
634 EXPECT_EQ(tracker3.
matrix(), rotated_dl_matrix);
645 const SkM44 rotated_m44 =
SkM44(rotated_matrix);
660 EXPECT_EQ(state1.
matrix_3x3(), rotated_matrix);
662 EXPECT_EQ(state1.
matrix(), rotated_dl_matrix);
667 EXPECT_EQ(state2.
matrix_3x3(), rotated_matrix);
669 EXPECT_EQ(state2.
matrix(), rotated_dl_matrix);
674 EXPECT_EQ(state3.
matrix_3x3(), rotated_matrix);
676 EXPECT_EQ(state3.
matrix(), rotated_dl_matrix);
690 const SkM44 transformed_m44 =
SkM44(transformed_matrix);
691 const DlMatrix transformed_dl_matrix =
711 EXPECT_EQ(tracker1.
matrix_3x3(), transformed_matrix);
712 EXPECT_EQ(tracker1.
matrix_4x4(), transformed_m44);
713 EXPECT_EQ(tracker1.
matrix(), transformed_dl_matrix);
718 EXPECT_EQ(tracker2.
matrix_3x3(), transformed_matrix);
719 EXPECT_EQ(tracker2.
matrix_4x4(), transformed_m44);
720 EXPECT_EQ(tracker2.
matrix(), transformed_dl_matrix);
725 EXPECT_EQ(tracker3.
matrix_3x3(), transformed_matrix);
726 EXPECT_EQ(tracker3.
matrix_4x4(), transformed_m44);
727 EXPECT_EQ(tracker3.
matrix(), transformed_dl_matrix);
741 const SkM44 transformed_m44 =
SkM44(transformed_matrix);
742 const DlMatrix transformed_dl_matrix =
762 EXPECT_EQ(state1.
matrix_3x3(), transformed_matrix);
763 EXPECT_EQ(state1.
matrix_4x4(), transformed_m44);
764 EXPECT_EQ(state1.
matrix(), transformed_dl_matrix);
769 EXPECT_EQ(state2.
matrix_3x3(), transformed_matrix);
770 EXPECT_EQ(state2.
matrix_4x4(), transformed_m44);
771 EXPECT_EQ(state2.
matrix(), transformed_dl_matrix);
776 EXPECT_EQ(state3.
matrix_3x3(), transformed_matrix);
777 EXPECT_EQ(state3.
matrix_4x4(), transformed_m44);
778 EXPECT_EQ(state3.
matrix(), transformed_dl_matrix);
792 const SkM44 transformed_m44 =
SkM44(transformed_matrix);
793 const DlMatrix transformed_dl_matrix =
819 EXPECT_EQ(tracker1.
matrix_3x3(), transformed_matrix);
820 EXPECT_EQ(tracker1.
matrix_4x4(), transformed_m44);
821 EXPECT_EQ(tracker1.
matrix(), transformed_dl_matrix);
826 EXPECT_EQ(tracker2.
matrix_3x3(), transformed_matrix);
827 EXPECT_EQ(tracker2.
matrix_4x4(), transformed_m44);
828 EXPECT_EQ(tracker2.
matrix(), transformed_dl_matrix);
833 EXPECT_EQ(tracker3.
matrix_3x3(), transformed_matrix);
834 EXPECT_EQ(tracker3.
matrix_4x4(), transformed_m44);
835 EXPECT_EQ(tracker3.
matrix(), transformed_dl_matrix);
849 const SkM44 transformed_m44 =
SkM44(transformed_matrix);
850 const DlMatrix transformed_dl_matrix =
876 EXPECT_EQ(state1.
matrix_3x3(), transformed_matrix);
877 EXPECT_EQ(state1.
matrix_4x4(), transformed_m44);
878 EXPECT_EQ(state1.
matrix(), transformed_dl_matrix);
883 EXPECT_EQ(state2.
matrix_3x3(), transformed_matrix);
884 EXPECT_EQ(state2.
matrix_4x4(), transformed_m44);
885 EXPECT_EQ(state2.
matrix(), transformed_dl_matrix);
890 EXPECT_EQ(state3.
matrix_3x3(), transformed_matrix);
891 EXPECT_EQ(state3.
matrix_4x4(), transformed_m44);
892 EXPECT_EQ(state3.
matrix(), transformed_dl_matrix);
906 const DlMatrix transformed_dl_matrix =
932 EXPECT_EQ(tracker1.
matrix_4x4(), transformed_m44);
933 EXPECT_EQ(tracker1.
matrix(), transformed_dl_matrix);
938 EXPECT_EQ(tracker2.
matrix_4x4(), transformed_m44);
939 EXPECT_EQ(tracker2.
matrix(), transformed_dl_matrix);
944 EXPECT_EQ(tracker3.
matrix_4x4(), transformed_m44);
945 EXPECT_EQ(tracker3.
matrix(), transformed_dl_matrix);
959 const DlMatrix transformed_dl_matrix =
985 EXPECT_EQ(state1.
matrix_4x4(), transformed_m44);
986 EXPECT_EQ(state1.
matrix(), transformed_dl_matrix);
991 EXPECT_EQ(state2.
matrix_4x4(), transformed_m44);
992 EXPECT_EQ(state2.
matrix(), transformed_dl_matrix);
997 EXPECT_EQ(state3.
matrix_4x4(), transformed_m44);
998 EXPECT_EQ(state3.
matrix(), transformed_dl_matrix);
1004 auto non_reducing = [&cull_rect](
const SkRect& diff_rect,
1005 const std::string& label) {
1026 EXPECT_EQ(
state.device_cull_rect(), cull_rect) << label;
1032 EXPECT_EQ(
state.device_cull_rect(), cull_rect) << label <<
" (RRect)";
1038 EXPECT_EQ(
state.device_cull_rect(), cull_rect) << label <<
" (RRect)";
1042 auto reducing = [&cull_rect](
const SkRect& diff_rect,
1043 const SkRect& result_rect,
1044 const std::string& label) {
1066 EXPECT_EQ(
state.device_cull_rect(), result_rect) << label;
1072 EXPECT_EQ(
state.device_cull_rect(), result_rect) << label <<
" (RRect)";
1078 EXPECT_EQ(
state.device_cull_rect(), result_rect) << label <<
" (RRect)";
1102 non_reducing(
SkRect::MakeLTRB(35, 21, 45, 40),
"Right edge, bottom-biased");
1103 non_reducing(
SkRect::MakeLTRB(20, 35, 39, 45),
"Bottom edge, left-biased");
1104 non_reducing(
SkRect::MakeLTRB(21, 35, 40, 45),
"Bottom edge, right-biased");
1106 non_reducing(
SkRect::MakeLTRB(15, 21, 25, 40),
"Left edge, bottom-biased");
1110 non_reducing(
SkRect::MakeLTRB(15, 25, 45, 35),
"Horizontal interior slice");
1121 "Slice off bottom");
1154 EXPECT_EQ(
state.local_cull_rect(), cull_rect);
1155 EXPECT_EQ(
state.device_cull_rect(), cull_rect);
1180 EXPECT_EQ(
state.local_cull_rect(), clip_bounds);
1181 EXPECT_EQ(
state.device_cull_rect(), clip_bounds);
#define TEST(S, s, D, expected)
static SkPath clip(const SkPath &path, const SkHalfPlane &plane)
static SkM44 Scale(SkScalar x, SkScalar y, SkScalar z=1)
static SkMatrix Scale(SkScalar sx, SkScalar sy)
static SkMatrix RotateDeg(SkScalar deg)
static SkMatrix Translate(SkScalar dx, SkScalar dy)
static SkMatrix MakeAll(SkScalar scaleX, SkScalar skewX, SkScalar transX, SkScalar skewY, SkScalar scaleY, SkScalar transY, SkScalar pers0, SkScalar pers1, SkScalar pers2)
static SkMatrix Concat(const SkMatrix &a, const SkMatrix &b)
static const SkMatrix & I()
static SkMatrix Skew(SkScalar kx, SkScalar ky)
SkPath & addCircle(SkScalar x, SkScalar y, SkScalar radius, SkPathDirection dir=SkPathDirection::kCW)
void setFillType(SkPathFillType ft)
SkPath & addRect(const SkRect &rect, SkPathDirection dir, unsigned start)
static SkRRect MakeRect(const SkRect &r)
void scale(SkScalar sx, SkScalar sy)
bool using_4x4_matrix() const
SkMatrix matrix_3x3() const
const DlMatrix & matrix() const
void rotate(SkScalar degrees)
void transform2DAffine(SkScalar mxx, SkScalar mxy, SkScalar mxt, SkScalar myx, SkScalar myy, SkScalar myt)
SkRect device_cull_rect() const
void setTransform(const DlMatrix &matrix)
void transformFullPerspective(SkScalar mxx, SkScalar mxy, SkScalar mxz, SkScalar mxt, SkScalar myx, SkScalar myy, SkScalar myz, SkScalar myt, SkScalar mzx, SkScalar mzy, SkScalar mzz, SkScalar mzt, SkScalar mwx, SkScalar mwy, SkScalar mwz, SkScalar mwt)
void skew(SkScalar skx, SkScalar sky)
SkRect local_cull_rect() const
void translate(SkScalar tx, SkScalar ty)
void clipRect(const DlRect &rect, ClipOp op, bool is_aa)
void scale(SkScalar sx, SkScalar sy)
bool using_4x4_matrix() const
SkRect local_cull_rect() const
SkRect device_cull_rect() const
void clipPath(const SkPath &path, ClipOp op, bool is_aa)
void transform2DAffine(SkScalar mxx, SkScalar mxy, SkScalar mxt, SkScalar myx, SkScalar myy, SkScalar myt)
void transform(const DlMatrix &matrix)
void translate(SkScalar tx, SkScalar ty)
void clipRRect(const SkRRect &rrect, ClipOp op, bool is_aa)
void setTransform(const DlMatrix &matrix)
void transformFullPerspective(SkScalar mxx, SkScalar mxy, SkScalar mxz, SkScalar mxt, SkScalar myx, SkScalar myy, SkScalar myz, SkScalar myt, SkScalar mzx, SkScalar mzy, SkScalar mzz, SkScalar mzt, SkScalar mwx, SkScalar mwy, SkScalar mwz, SkScalar mwt)
void skew(SkScalar skx, SkScalar sky)
SkMatrix matrix_3x3() const
void rotate(SkScalar degrees)
impeller::Matrix DlMatrix
impeller::Degrees Degrees
static constexpr SkRect MakeEmpty()
bool contains(SkScalar x, SkScalar y) const
static constexpr SkRect MakeLTRB(float l, float t, float r, float b)
A 4x4 matrix using column-major storage.
static constexpr Matrix MakeTranslation(const Vector3 &t)
static constexpr Matrix MakeRow(Scalar m0, Scalar m1, Scalar m2, Scalar m3, Scalar m4, Scalar m5, Scalar m6, Scalar m7, Scalar m8, Scalar m9, Scalar m10, Scalar m11, Scalar m12, Scalar m13, Scalar m14, Scalar m15)
static constexpr Matrix MakeSkew(Scalar sx, Scalar sy)
constexpr Matrix Scale(const Vector3 &s) const
static Matrix MakeRotationZ(Radians r)
static constexpr Matrix MakeScale(const Vector3 &s)
static constexpr TRect MakeLTRB(Type left, Type top, Type right, Type bottom)
#define EXPECT_TRUE(handle)