41 m.setTranslate(3, 4, 2);
47 const float f[] = { 1, 0, 0, 2, 3, 1, 2, 5, 0, 5, 3, 0, 0, 1, 0, 2 };
50 f[1], f[5], f[ 9], f[13],
51 f[2], f[6], f[10], f[14],
52 f[3], f[7], f[11], f[15]) == m);
55 SkM44 t = m.transpose();
64 f[ 4], f[ 5], f[ 6], f[ 7],
65 f[ 8], f[ 9], f[10], f[14],
66 f[12], f[13], f[14], f[15]) == m);
208 auto map2d = [&](
const SkM44& m,
SkV2 p) {
209 SkV4 mapped = m.map(p.x, p.y, 0.f, 1.f);
212 return SkV2{mapped.
x, mapped.
y};
214 auto assertNearlyEqual = [&](
float actual,
float expected) {
216 "Expected %g == %g", actual, expected);
218 auto assertEdges = [&](
float actualLow,
float actualHigh,
219 float expectedLow,
float expectedHigh) {
220 SkASSERT(expectedLow < expectedHigh);
222 "Expected %g < %g", actualLow, actualHigh);
224 assertNearlyEqual(actualLow, expectedLow);
225 assertNearlyEqual(actualHigh, expectedHigh);
229 for (
const auto& r : dstScales) {
242 SkV2 center = map2d(m, {src.centerX(), src.centerY()});
243 assertNearlyEqual(
center.x, dst.centerX());
244 assertNearlyEqual(
center.y, dst.centerY());
247 SkV2 tl = map2d(m, {src.fLeft, src.fTop});
248 SkV2 tr = map2d(m, {src.fRight, src.fTop});
249 SkV2 br = map2d(m, {src.fRight, src.fBottom});
250 SkV2 bl = map2d(m, {src.fLeft, src.fBottom});
252 assertEdges(tl.
x, tr.x, dst.fLeft, dst.fRight);
253 assertEdges(bl.x, br.x, dst.fLeft, dst.fRight);
254 assertEdges(tl.
y, bl.y, dst.fTop, dst.fBottom);
255 assertEdges(tr.y, br.y, dst.fTop, dst.fBottom);
260 auto assertRectsNearlyEqual = [&](
const SkRect& actual,
const SkRect& expected,
263 "Expected %g == %g", actual.
fLeft, expected.fLeft);
265 "Expected %g == %g", actual.
fTop, expected.fTop);
267 "Expected %g == %g", actual.
fRight, expected.fRight);
269 "Expected %g == %g", actual.
fBottom, expected.fBottom);
271 auto assertMapRect = [&](
const SkM44& m,
const SkRect& src,
const SkRect* expected) {
272 SkRect epsilon = {1e-5f, 1e-5f, 1e-5f, 1e-5f};
278 assertRectsNearlyEqual(actual, *expected, epsilon);
281 SkV4 corners[4] = {{src.fLeft, src.fTop, 0.f, 1.f},
282 {src.fRight, src.fTop, 0.f, 1.f},
283 {src.fRight, src.fBottom, 0.f, 1.f},
284 {src.fLeft, src.fBottom, 0.f, 1.f}};
285 bool leftFound =
false;
286 bool topFound =
false;
287 bool rightFound =
false;
288 bool bottomFound =
false;
289 bool clipped =
false;
290 for (
int i = 0; i < 4; ++i) {
291 SkV4 mapped = m * corners[i];
292 if (mapped.
w > 0.f) {
294 float x = mapped.
x / mapped.
w;
295 float y = mapped.
y / mapped.
w;
299 "Expected %g contained in [%g, %g]",
302 "Expected %g contained in [%g, %g]",
326 if (!leftFound) { epsilon.
fLeft = .01f * actual.
fLeft; }
327 if (!topFound) { epsilon.
fTop = .01f * actual.
fTop; }
328 if (!rightFound) { epsilon.
fRight = .01f * actual.
fRight; }
337 assertRectsNearlyEqual(actual, path.getBounds(), epsilon);
344 assertMapRect(
SkM44(), src, &src);
347 10.f + 2.f * src.fRight, 8.f + 4.f * src.fBottom);
348 assertMapRect(
SkM44::Scale(2.f, 4.f).postTranslate(10.f, 8.f), src, &st);
351 .preTranslate(-src.centerX(), -src.centerY())
357 p.preTranslate(0.f, 5.f, -0.1f);
359 assertMapRect(p, src,
nullptr);
363 p.setRow(3, {-.2f, -.6f, 0.f, 8.f});
364 assertMapRect(p, src,
nullptr);
375 -1.75697533e-05f, 0.000157153074f, -1.10847975e-06f,
376 -6.00415362e-08f, 0.00000000f, 0.000169880834f));
static SkMatrix MakeAll(SkScalar scaleX, SkScalar skewX, SkScalar transX, SkScalar skewY, SkScalar scaleY, SkScalar transY, SkScalar pers0, SkScalar pers1, SkScalar pers2)
VULKAN_HPP_DEFAULT_DISPATCH_LOADER_DYNAMIC_STORAGE auto & d