1/*
2 * Copyright (c) 2013, Google Inc. All rights reserved.
3 * Copyright (C) 2016 Apple Inc. All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
13 *
14 * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
15 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
16 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
17 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
18 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
19 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
20 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
21 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
22 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
23 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
24 * THE POSSIBILITY OF SUCH DAMAGE.
25 */
26
27#include "config.h"
28
29#include <WebCore/AffineTransform.h>
30#include <WebCore/FloatPoint.h>
31#include <WebCore/FloatQuad.h>
32#include <WebCore/FloatRect.h>
33#include <WebCore/IntPoint.h>
34#include <WebCore/IntRect.h>
35#include <WebCore/TransformationMatrix.h>
36
37#if USE(CG)
38#include <CoreGraphics/CoreGraphics.h>
39#endif
40
41#if USE(CA)
42#include <QuartzCore/QuartzCore.h>
43#endif
44
45#if PLATFORM(WIN)
46#include <d2d1.h>
47#endif
48
49namespace TestWebKitAPI {
50
51static void testIdentity(const WebCore::TransformationMatrix& transform)
52{
53 EXPECT_DOUBLE_EQ(1.0, transform.m11());
54 EXPECT_DOUBLE_EQ(0.0, transform.m12());
55 EXPECT_DOUBLE_EQ(0.0, transform.m13());
56 EXPECT_DOUBLE_EQ(0.0, transform.m14());
57 EXPECT_DOUBLE_EQ(0.0, transform.m21());
58 EXPECT_DOUBLE_EQ(1.0, transform.m22());
59 EXPECT_DOUBLE_EQ(0.0, transform.m23());
60 EXPECT_DOUBLE_EQ(0.0, transform.m24());
61 EXPECT_DOUBLE_EQ(0.0, transform.m31());
62 EXPECT_DOUBLE_EQ(0.0, transform.m32());
63 EXPECT_DOUBLE_EQ(1.0, transform.m33());
64 EXPECT_DOUBLE_EQ(0.0, transform.m34());
65 EXPECT_DOUBLE_EQ(0.0, transform.m41());
66 EXPECT_DOUBLE_EQ(0.0, transform.m42());
67 EXPECT_DOUBLE_EQ(0.0, transform.m43());
68 EXPECT_DOUBLE_EQ(1.0, transform.m44());
69}
70
71static void testGetAndSet(WebCore::TransformationMatrix& transform)
72{
73 transform.setA(1.1);
74 EXPECT_DOUBLE_EQ(1.1, transform.a());
75 transform.setB(2.2);
76 EXPECT_DOUBLE_EQ(2.2, transform.b());
77 transform.setC(3.3);
78 EXPECT_DOUBLE_EQ(3.3, transform.c());
79 transform.setD(4.4);
80 EXPECT_DOUBLE_EQ(4.4, transform.d());
81 transform.setE(5.5);
82 EXPECT_DOUBLE_EQ(5.5, transform.e());
83 transform.setF(6.6);
84 EXPECT_DOUBLE_EQ(6.6, transform.f());
85
86 transform.setM11(1.1);
87 EXPECT_DOUBLE_EQ(1.1, transform.m11());
88 transform.setM12(2.2);
89 EXPECT_DOUBLE_EQ(2.2, transform.m12());
90 transform.setM13(3.3);
91 EXPECT_DOUBLE_EQ(3.3, transform.m13());
92 transform.setM14(4.4);
93 EXPECT_DOUBLE_EQ(4.4, transform.m14());
94 transform.setM21(5.5);
95 EXPECT_DOUBLE_EQ(5.5, transform.m21());
96 transform.setM22(6.6);
97 EXPECT_DOUBLE_EQ(6.6, transform.m22());
98 transform.setM23(7.7);
99 EXPECT_DOUBLE_EQ(7.7, transform.m23());
100 transform.setM24(8.8);
101 EXPECT_DOUBLE_EQ(8.8, transform.m24());
102 transform.setM31(9.9);
103 EXPECT_DOUBLE_EQ(9.9, transform.m31());
104 transform.setM32(10.10);
105 EXPECT_DOUBLE_EQ(10.10, transform.m32());
106 transform.setM33(11.11);
107 EXPECT_DOUBLE_EQ(11.11, transform.m33());
108 transform.setM34(12.12);
109 EXPECT_DOUBLE_EQ(12.12, transform.m34());
110 transform.setM41(13.13);
111 EXPECT_DOUBLE_EQ(13.13, transform.m41());
112 transform.setM42(14.14);
113 EXPECT_DOUBLE_EQ(14.14, transform.m42());
114 transform.setM43(15.15);
115 EXPECT_DOUBLE_EQ(15.15, transform.m43());
116 transform.setM44(16.16);
117 EXPECT_DOUBLE_EQ(16.16, transform.m44());
118}
119
120TEST(TransformationMatrix, DefaultConstruction)
121{
122 WebCore::TransformationMatrix test;
123
124 testIdentity(test);
125
126 testGetAndSet(test);
127
128 ASSERT_FALSE(test.isIdentity());
129}
130
131static void testAffineLikeConstruction(const WebCore::TransformationMatrix& transform)
132{
133 EXPECT_DOUBLE_EQ(6.0, transform.a());
134 EXPECT_DOUBLE_EQ(5.0, transform.b());
135 EXPECT_DOUBLE_EQ(4.0, transform.c());
136 EXPECT_DOUBLE_EQ(3.0, transform.d());
137 EXPECT_DOUBLE_EQ(2.0, transform.e());
138 EXPECT_DOUBLE_EQ(1.0, transform.f());
139}
140
141static void testValueConstruction(const WebCore::TransformationMatrix& transform)
142{
143 EXPECT_DOUBLE_EQ(16.0, transform.m11());
144 EXPECT_DOUBLE_EQ(15.0, transform.m12());
145 EXPECT_DOUBLE_EQ(14.0, transform.m13());
146 EXPECT_DOUBLE_EQ(13.0, transform.m14());
147 EXPECT_DOUBLE_EQ(12.0, transform.m21());
148 EXPECT_DOUBLE_EQ(11.0, transform.m22());
149 EXPECT_DOUBLE_EQ(10.0, transform.m23());
150 EXPECT_DOUBLE_EQ(9.0, transform.m24());
151 EXPECT_DOUBLE_EQ(8.0, transform.m31());
152 EXPECT_DOUBLE_EQ(7.0, transform.m32());
153 EXPECT_DOUBLE_EQ(6.0, transform.m33());
154 EXPECT_DOUBLE_EQ(5.0, transform.m34());
155 EXPECT_DOUBLE_EQ(4.0, transform.m41());
156 EXPECT_DOUBLE_EQ(3.0, transform.m42());
157 EXPECT_DOUBLE_EQ(2.0, transform.m43());
158 EXPECT_DOUBLE_EQ(1.0, transform.m44());
159 ASSERT_FALSE(transform.isAffine());
160}
161
162TEST(TransformationMatrix, ValueConstruction)
163{
164 WebCore::TransformationMatrix test1(6.0, 5.0, 4.0, 3.0, 2.0, 1.0);
165
166 testAffineLikeConstruction(test1);
167
168 ASSERT_FALSE(test1.isIdentity());
169 ASSERT_TRUE(test1.isAffine());
170
171 WebCore::TransformationMatrix test2(16.0, 15.0, 14.0, 13.0, 12.0, 11.0, 10.0,
172 9.0, 8.0, 7.0, 6.0, 5.0, 4.0, 3.0, 2.0, 1.0);
173
174 testValueConstruction(test2);
175
176 testGetAndSet(test2);
177
178 ASSERT_FALSE(test2.isIdentity());
179 ASSERT_FALSE(test2.isAffine());
180
181 test2.makeIdentity();
182
183 testIdentity(test2);
184
185 ASSERT_TRUE(test2.isIdentity());
186}
187
188#if USE(CG)
189TEST(TransformationMatrix, CGAffineTransformConstruction)
190{
191 CGAffineTransform cgTransform = CGAffineTransformMake(6.0, 5.0, 4.0, 3.0, 2.0, 1.0);
192 WebCore::TransformationMatrix test(cgTransform);
193
194 testAffineLikeConstruction(test);
195 testGetAndSet(test);
196
197 ASSERT_FALSE(test.isIdentity());
198}
199#endif
200
201#if PLATFORM(WIN)
202TEST(TransformationMatrix, D2D1MatrixConstruction)
203{
204 D2D1_MATRIX_3X2_F d2dTransform = D2D1::Matrix3x2F(6.0, 5.0, 4.0, 3.0, 2.0, 1.0);
205 WebCore::TransformationMatrix test(d2dTransform);
206
207 testAffineLikeConstruction(test);
208 testGetAndSet(test);
209
210 ASSERT_FALSE(test.isIdentity());
211}
212#endif
213
214TEST(TransformationMatrix, AffineTransformConstruction)
215{
216 WebCore::AffineTransform affineTransform(6.0, 5.0, 4.0, 3.0, 2.0, 1.0);
217 WebCore::TransformationMatrix test(affineTransform);
218
219 testAffineLikeConstruction(test);
220 testGetAndSet(test);
221
222 ASSERT_FALSE(test.isIdentity());
223}
224
225TEST(TransformationMatrix, TransformMatrixConstruction)
226{
227 WebCore::TransformationMatrix matrix(16.0, 15.0, 14.0, 13.0, 12.0, 11.0, 10.0,
228 9.0, 8.0, 7.0, 6.0, 5.0, 4.0, 3.0, 2.0, 1.0);
229 WebCore::TransformationMatrix test(matrix);
230
231 testValueConstruction(test);
232}
233
234TEST(TransformationMatrix, Assignment)
235{
236 WebCore::TransformationMatrix test(6.0, 5.0, 4.0, 3.0, 2.0, 1.0);
237 WebCore::TransformationMatrix matrix(16.0, 15.0, 14.0, 13.0, 12.0, 11.0, 10.0,
238 9.0, 8.0, 7.0, 6.0, 5.0, 4.0, 3.0, 2.0, 1.0);
239
240 testAffineLikeConstruction(test);
241
242 test = matrix;
243
244 testValueConstruction(test);
245}
246
247TEST(TransformationMatrix, Identity)
248{
249 WebCore::TransformationMatrix test(6.0, 5.0, 4.0, 3.0, 2.0, 1.0);
250
251 ASSERT_FALSE(test.isIdentity());
252 ASSERT_FALSE(test.isIdentityOrTranslation());
253
254 test.makeIdentity();
255
256 ASSERT_TRUE(test.isIdentity());
257 ASSERT_TRUE(test.isIdentityOrTranslation());
258
259 testIdentity(test);
260}
261
262static void testAffineVersion(WebCore::TransformationMatrix affineTransformMatrix)
263{
264 ASSERT_FALSE(affineTransformMatrix.isIdentity());
265 ASSERT_FALSE(affineTransformMatrix.isIdentityOrTranslation());
266 ASSERT_TRUE(affineTransformMatrix.isAffine());
267
268 EXPECT_DOUBLE_EQ(16.0, affineTransformMatrix.m11());
269 EXPECT_DOUBLE_EQ(15.0, affineTransformMatrix.m12());
270 EXPECT_DOUBLE_EQ(0.0, affineTransformMatrix.m13());
271 EXPECT_DOUBLE_EQ(0.0, affineTransformMatrix.m14());
272 EXPECT_DOUBLE_EQ(12.0, affineTransformMatrix.m21());
273 EXPECT_DOUBLE_EQ(11.0, affineTransformMatrix.m22());
274 EXPECT_DOUBLE_EQ(0.0, affineTransformMatrix.m23());
275 EXPECT_DOUBLE_EQ(0.0, affineTransformMatrix.m24());
276 EXPECT_DOUBLE_EQ(0.0, affineTransformMatrix.m31());
277 EXPECT_DOUBLE_EQ(0.0, affineTransformMatrix.m32());
278 EXPECT_DOUBLE_EQ(1.0, affineTransformMatrix.m33());
279 EXPECT_DOUBLE_EQ(0.0, affineTransformMatrix.m34());
280 EXPECT_DOUBLE_EQ(4.0, affineTransformMatrix.m41());
281 EXPECT_DOUBLE_EQ(3.0, affineTransformMatrix.m42());
282 EXPECT_DOUBLE_EQ(0.0, affineTransformMatrix.m43());
283 EXPECT_DOUBLE_EQ(1.0, affineTransformMatrix.m44());
284}
285
286TEST(TransformationMatrix, AffineVersion)
287{
288 WebCore::TransformationMatrix test(16.0, 15.0, 14.0, 13.0, 12.0, 11.0, 10.0,
289 9.0, 8.0, 7.0, 6.0, 5.0, 4.0, 3.0, 2.0, 1.0);
290
291 ASSERT_FALSE(test.isIdentity());
292 ASSERT_FALSE(test.isIdentityOrTranslation());
293 ASSERT_FALSE(test.isAffine());
294
295 auto affineCopy = test.toAffineTransform();
296
297 testAffineVersion(affineCopy);
298
299 test.makeAffine();
300
301 testAffineVersion(test);
302}
303
304TEST(TransformationMatrix, MapFloatPoint)
305{
306 WebCore::TransformationMatrix test;
307 WebCore::FloatPoint point(100.0f, 50.0f);
308
309 auto mappedPoint = test.mapPoint(point);
310
311 ASSERT_FLOAT_EQ(100.0f, mappedPoint.x());
312 ASSERT_FLOAT_EQ(50.0f, mappedPoint.y());
313
314 test.setD(2.0);
315
316 auto mappedPoint2 = test.mapPoint(point);
317
318 ASSERT_FLOAT_EQ(100.0f, mappedPoint2.x());
319 ASSERT_FLOAT_EQ(100.0f, mappedPoint2.y());
320
321 test.setA(0.5);
322
323 auto mappedPoint3 = test.mapPoint(point);
324
325 ASSERT_FLOAT_EQ(50.0f, mappedPoint3.x());
326 ASSERT_FLOAT_EQ(100.0f, mappedPoint3.y());
327
328 test.setM22(0.5);
329
330 auto mappedPoint4 = test.mapPoint(point);
331
332 ASSERT_FLOAT_EQ(50.0f, mappedPoint4.x());
333 ASSERT_FLOAT_EQ(25.0f, mappedPoint4.y());
334
335 test.setM11(2.0);
336
337 auto mappedPoint5 = test.mapPoint(point);
338
339 ASSERT_FLOAT_EQ(200.0f, mappedPoint5.x());
340 ASSERT_FLOAT_EQ(25.0f, mappedPoint5.y());
341}
342
343TEST(TransformationMatrix, MapIntPoint)
344{
345 WebCore::TransformationMatrix test;
346 WebCore::IntPoint point(100, 50);
347
348 auto mappedPoint = test.mapPoint(point);
349
350 ASSERT_EQ(100, mappedPoint.x());
351 ASSERT_EQ(50, mappedPoint.y());
352
353 test.setD(2.0);
354
355 auto mappedPoint2 = test.mapPoint(point);
356
357 ASSERT_EQ(100, mappedPoint2.x());
358 ASSERT_EQ(100, mappedPoint2.y());
359
360 test.setA(0.5);
361
362 auto mappedPoint3 = test.mapPoint(point);
363
364 ASSERT_EQ(50, mappedPoint3.x());
365 ASSERT_EQ(100, mappedPoint3.y());
366
367 test.setM22(0.5);
368
369 auto mappedPoint4 = test.mapPoint(point);
370
371 ASSERT_EQ(50, mappedPoint4.x());
372 ASSERT_EQ(25, mappedPoint4.y());
373
374 test.setM11(2.0);
375
376 auto mappedPoint5 = test.mapPoint(point);
377
378 ASSERT_EQ(200, mappedPoint5.x());
379 ASSERT_EQ(25, mappedPoint5.y());
380}
381
382TEST(TransformationMatrix, MapIntRect)
383{
384 WebCore::TransformationMatrix test;
385 WebCore::IntRect rect(10, 20, 200, 300);
386
387 auto mappedRect = test.mapRect(rect);
388
389 ASSERT_EQ(10, mappedRect.x());
390 ASSERT_EQ(20, mappedRect.y());
391 ASSERT_EQ(200, mappedRect.width());
392 ASSERT_EQ(300, mappedRect.height());
393
394 test.setD(2.0);
395
396 auto mappedRect2 = test.mapRect(rect);
397
398 ASSERT_EQ(10, mappedRect2.x());
399 ASSERT_EQ(40, mappedRect2.y());
400 ASSERT_EQ(200, mappedRect2.width());
401 ASSERT_EQ(600, mappedRect2.height());
402
403 test.setA(0.5);
404
405 auto mappedRect3 = test.mapRect(rect);
406
407 ASSERT_EQ(5, mappedRect3.x());
408 ASSERT_EQ(40, mappedRect3.y());
409 ASSERT_EQ(100, mappedRect3.width());
410 ASSERT_EQ(600, mappedRect3.height());
411
412 test.setM22(0.5);
413
414 auto mappedRect4 = test.mapRect(rect);
415
416 ASSERT_EQ(5, mappedRect4.x());
417 ASSERT_EQ(10, mappedRect4.y());
418 ASSERT_EQ(100, mappedRect4.width());
419 ASSERT_EQ(150, mappedRect4.height());
420
421 test.setM11(2.0);
422
423 auto mappedRect5 = test.mapRect(rect);
424
425 ASSERT_EQ(20, mappedRect5.x());
426 ASSERT_EQ(10, mappedRect5.y());
427 ASSERT_EQ(100, mappedRect4.width());
428 ASSERT_EQ(150, mappedRect4.height());
429}
430
431TEST(TransformationMatrix, MapFloatRect)
432{
433 WebCore::TransformationMatrix test;
434 WebCore::FloatRect rect(10.f, 20.0f, 200.0f, 300.0f);
435
436 auto mappedRect = test.mapRect(rect);
437
438 ASSERT_FLOAT_EQ(10.0f, mappedRect.x());
439 ASSERT_FLOAT_EQ(20.0f, mappedRect.y());
440 ASSERT_FLOAT_EQ(200.0f, mappedRect.width());
441 ASSERT_FLOAT_EQ(300.0f, mappedRect.height());
442
443 test.setD(2.0);
444
445 auto mappedRect2 = test.mapRect(rect);
446
447 ASSERT_FLOAT_EQ(10.0f, mappedRect2.x());
448 ASSERT_FLOAT_EQ(40.0f, mappedRect2.y());
449 ASSERT_FLOAT_EQ(200.0f, mappedRect2.width());
450 ASSERT_FLOAT_EQ(600.0f, mappedRect2.height());
451
452 test.setA(0.5);
453
454 auto mappedRect3 = test.mapRect(rect);
455
456 ASSERT_FLOAT_EQ(5.0f, mappedRect3.x());
457 ASSERT_FLOAT_EQ(40.0f, mappedRect3.y());
458 ASSERT_FLOAT_EQ(100.0f, mappedRect3.width());
459 ASSERT_FLOAT_EQ(600.0f, mappedRect3.height());
460
461 test.setM22(0.5);
462
463 auto mappedRect4 = test.mapRect(rect);
464
465 ASSERT_FLOAT_EQ(5.0f, mappedRect4.x());
466 ASSERT_FLOAT_EQ(10.0f, mappedRect4.y());
467 ASSERT_FLOAT_EQ(100.0f, mappedRect4.width());
468 ASSERT_FLOAT_EQ(150.0f, mappedRect4.height());
469
470 test.setM11(2.0);
471
472 auto mappedRect5 = test.mapRect(rect);
473
474 ASSERT_FLOAT_EQ(20.0f, mappedRect5.x());
475 ASSERT_FLOAT_EQ(10.0f, mappedRect5.y());
476 ASSERT_FLOAT_EQ(100.0f, mappedRect4.width());
477 ASSERT_FLOAT_EQ(150.0f, mappedRect4.height());
478}
479
480TEST(TransformationMatrix, MapFloatQuad)
481{
482 WebCore::FloatRect rect(100.0f, 100.0f, 100.0f, 50.0f);
483 WebCore::FloatQuad quad(rect);
484
485 ASSERT_FLOAT_EQ(100.0f, quad.p1().x());
486 ASSERT_FLOAT_EQ(100.0f, quad.p1().y());
487 ASSERT_FLOAT_EQ(200.0f, quad.p2().x());
488 ASSERT_FLOAT_EQ(100.0f, quad.p2().y());
489 ASSERT_FLOAT_EQ(200.0f, quad.p3().x());
490 ASSERT_FLOAT_EQ(150.0f, quad.p3().y());
491 ASSERT_FLOAT_EQ(100.0f, quad.p4().x());
492 ASSERT_FLOAT_EQ(150.0f, quad.p4().y());
493
494 WebCore::TransformationMatrix test;
495 auto mappedQuad = test.mapQuad(quad);
496
497 ASSERT_FLOAT_EQ(100.0f, mappedQuad.p1().x());
498 ASSERT_FLOAT_EQ(100.0f, mappedQuad.p1().y());
499 ASSERT_FLOAT_EQ(200.0f, mappedQuad.p2().x());
500 ASSERT_FLOAT_EQ(100.0f, mappedQuad.p2().y());
501 ASSERT_FLOAT_EQ(200.0f, mappedQuad.p3().x());
502 ASSERT_FLOAT_EQ(150.0f, mappedQuad.p3().y());
503 ASSERT_FLOAT_EQ(100.0f, mappedQuad.p4().x());
504 ASSERT_FLOAT_EQ(150.0f, mappedQuad.p4().y());
505
506 test.setD(2.0);
507
508 auto mappedQuad2 = test.mapQuad(quad);
509
510 ASSERT_FLOAT_EQ(100.0f, mappedQuad2.p1().x());
511 ASSERT_FLOAT_EQ(200.0f, mappedQuad2.p1().y());
512 ASSERT_FLOAT_EQ(200.0f, mappedQuad2.p2().x());
513 ASSERT_FLOAT_EQ(200.0f, mappedQuad2.p2().y());
514 ASSERT_FLOAT_EQ(200.0f, mappedQuad2.p3().x());
515 ASSERT_FLOAT_EQ(300.0f, mappedQuad2.p3().y());
516 ASSERT_FLOAT_EQ(100.0f, mappedQuad2.p4().x());
517 ASSERT_FLOAT_EQ(300.0f, mappedQuad2.p4().y());
518
519 test.setA(0.5);
520
521 auto mappedQuad3 = test.mapQuad(quad);
522
523 ASSERT_FLOAT_EQ(50.0f, mappedQuad3.p1().x());
524 ASSERT_FLOAT_EQ(200.0f, mappedQuad3.p1().y());
525 ASSERT_FLOAT_EQ(100.0f, mappedQuad3.p2().x());
526 ASSERT_FLOAT_EQ(200.0f, mappedQuad3.p2().y());
527 ASSERT_FLOAT_EQ(100.0f, mappedQuad3.p3().x());
528 ASSERT_FLOAT_EQ(300.0f, mappedQuad3.p3().y());
529 ASSERT_FLOAT_EQ(50.0f, mappedQuad3.p4().x());
530 ASSERT_FLOAT_EQ(300.0f, mappedQuad3.p4().y());
531
532 test.setM22(0.5);
533
534 auto mappedQuad4 = test.mapQuad(quad);
535
536 ASSERT_FLOAT_EQ(50.0f, mappedQuad4.p1().x());
537 ASSERT_FLOAT_EQ(50.0f, mappedQuad4.p1().y());
538 ASSERT_FLOAT_EQ(100.0f, mappedQuad4.p2().x());
539 ASSERT_FLOAT_EQ(50.0f, mappedQuad4.p2().y());
540 ASSERT_FLOAT_EQ(100.0f, mappedQuad4.p3().x());
541 ASSERT_FLOAT_EQ(75.0f, mappedQuad4.p3().y());
542 ASSERT_FLOAT_EQ(50.0f, mappedQuad4.p4().x());
543 ASSERT_FLOAT_EQ(75.0f, mappedQuad4.p4().y());
544
545 test.setM11(2.0);
546
547 auto mappedQuad5 = test.mapQuad(quad);
548
549 ASSERT_FLOAT_EQ(200.0f, mappedQuad5.p1().x());
550 ASSERT_FLOAT_EQ(50.0f, mappedQuad5.p1().y());
551 ASSERT_FLOAT_EQ(400.0f, mappedQuad5.p2().x());
552 ASSERT_FLOAT_EQ(50.0f, mappedQuad5.p2().y());
553 ASSERT_FLOAT_EQ(400.0f, mappedQuad5.p3().x());
554 ASSERT_FLOAT_EQ(75.0f, mappedQuad5.p3().y());
555 ASSERT_FLOAT_EQ(200.0f, mappedQuad5.p4().x());
556 ASSERT_FLOAT_EQ(75.0f, mappedQuad5.p4().y());
557}
558
559static void testDoubled(const WebCore::TransformationMatrix& transform)
560{
561 EXPECT_DOUBLE_EQ(12.0, transform.a());
562 EXPECT_DOUBLE_EQ(10.0, transform.b());
563 EXPECT_DOUBLE_EQ(8.0, transform.c());
564 EXPECT_DOUBLE_EQ(6.0, transform.d());
565 EXPECT_DOUBLE_EQ(2.0, transform.e());
566 EXPECT_DOUBLE_EQ(1.0, transform.f());
567}
568
569static void testHalved(const WebCore::TransformationMatrix& transform)
570{
571 EXPECT_DOUBLE_EQ(3.0, transform.a());
572 EXPECT_DOUBLE_EQ(2.5, transform.b());
573 EXPECT_DOUBLE_EQ(2.0, transform.c());
574 EXPECT_DOUBLE_EQ(1.5, transform.d());
575 EXPECT_DOUBLE_EQ(2.0, transform.e());
576 EXPECT_DOUBLE_EQ(1.0, transform.f());
577}
578
579static void testDoubled2(const WebCore::TransformationMatrix& transform)
580{
581 EXPECT_DOUBLE_EQ(32.0, transform.m11());
582 EXPECT_DOUBLE_EQ(30.0, transform.m12());
583 EXPECT_DOUBLE_EQ(28.0, transform.m13());
584 EXPECT_DOUBLE_EQ(26.0, transform.m14());
585 EXPECT_DOUBLE_EQ(24.0, transform.m21());
586 EXPECT_DOUBLE_EQ(22.0, transform.m22());
587 EXPECT_DOUBLE_EQ(20.0, transform.m23());
588 EXPECT_DOUBLE_EQ(18.0, transform.m24());
589 EXPECT_DOUBLE_EQ(16.0, transform.m31());
590 EXPECT_DOUBLE_EQ(14.0, transform.m32());
591 EXPECT_DOUBLE_EQ(12.0, transform.m33());
592 EXPECT_DOUBLE_EQ(10.0, transform.m34());
593 EXPECT_DOUBLE_EQ(8.0, transform.m41());
594 EXPECT_DOUBLE_EQ(6.0, transform.m42());
595 EXPECT_DOUBLE_EQ(4.0, transform.m43());
596 EXPECT_DOUBLE_EQ(2.0, transform.m44());
597}
598
599static void testHalved2(const WebCore::TransformationMatrix& transform)
600{
601 EXPECT_DOUBLE_EQ(8.0, transform.m11());
602 EXPECT_DOUBLE_EQ(7.5, transform.m12());
603 EXPECT_DOUBLE_EQ(7.0, transform.m13());
604 EXPECT_DOUBLE_EQ(6.5, transform.m14());
605 EXPECT_DOUBLE_EQ(6.0, transform.m21());
606 EXPECT_DOUBLE_EQ(5.5, transform.m22());
607 EXPECT_DOUBLE_EQ(5.0, transform.m23());
608 EXPECT_DOUBLE_EQ(4.5, transform.m24());
609 EXPECT_DOUBLE_EQ(4.0, transform.m31());
610 EXPECT_DOUBLE_EQ(3.5, transform.m32());
611 EXPECT_DOUBLE_EQ(3.0, transform.m33());
612 EXPECT_DOUBLE_EQ(2.5, transform.m34());
613 EXPECT_DOUBLE_EQ(2.0, transform.m41());
614 EXPECT_DOUBLE_EQ(1.5, transform.m42());
615 EXPECT_DOUBLE_EQ(1.0, transform.m43());
616 EXPECT_DOUBLE_EQ(0.5, transform.m44());
617}
618
619TEST(TransformationMatrix, Multiply)
620{
621 WebCore::TransformationMatrix test(6.0, 5.0, 4.0, 3.0, 2.0, 1.0);
622 WebCore::TransformationMatrix identity;
623
624 testAffineLikeConstruction(test);
625
626 test.multiply(identity);
627
628 testAffineLikeConstruction(test);
629
630 WebCore::TransformationMatrix doubler(2.0, 0.0, 0.0, 2.0, 0.0, 0.0);
631
632 test.multiply(doubler);
633
634 testDoubled(test);
635
636 WebCore::TransformationMatrix halver(0.5, 0.0, 0.0, 0.5, 0.0, 0.0);
637
638 test.multiply(halver);
639
640 testAffineLikeConstruction(test);
641
642 test.multiply(halver);
643
644 testHalved(test);
645
646 WebCore::TransformationMatrix test2(16.0, 15.0, 14.0, 13.0, 12.0, 11.0, 10.0,
647 9.0, 8.0, 7.0, 6.0, 5.0, 4.0, 3.0, 2.0, 1.0);
648
649 testValueConstruction(test2);
650
651 test2.multiply(identity);
652
653 testValueConstruction(test2);
654
655 WebCore::TransformationMatrix doubler2(2.0, 0.0, 0.0, 0.0, 0.0, 2.0, 0.0, 0.0,
656 0.0, 0.0, 2.0, 0.0, 0.0, 0.0, 0.0, 2.0);
657
658 test2.multiply(doubler2);
659
660 testDoubled2(test2);
661
662 WebCore::TransformationMatrix halver2(0.5, 0.0, 0.0, 0.0, 0.0, 0.5, 0.0, 0.0,
663 0.0, 0.0, 0.5, 0.0, 0.0, 0.0, 0.0, 0.5);
664
665 test2.multiply(halver2);
666
667 testValueConstruction(test2);
668
669 test2.multiply(halver2);
670
671 testHalved2(test2);
672
673 WebCore::TransformationMatrix test3(6.0, 5.0, 4.0, 3.0, 2.0, 1.0);
674
675 test3 *= identity;
676
677 testAffineLikeConstruction(test3);
678
679 test3 *= doubler;
680
681 testDoubled(test3);
682
683 const WebCore::TransformationMatrix test4(16.0, 15.0, 14.0, 13.0, 12.0, 11.0, 10.0,
684 9.0, 8.0, 7.0, 6.0, 5.0, 4.0, 3.0, 2.0, 1.0);
685
686 auto result1 = test4 * identity;
687
688 testValueConstruction(result1);
689
690 auto result2 = test4 * doubler2;
691
692 testDoubled2(result2);
693}
694
695static void testScaledByTwo(const WebCore::TransformationMatrix& transform)
696{
697 EXPECT_DOUBLE_EQ(32.0, transform.m11());
698 EXPECT_DOUBLE_EQ(30.0, transform.m12());
699 EXPECT_DOUBLE_EQ(28.0, transform.m13());
700 EXPECT_DOUBLE_EQ(26.0, transform.m14());
701 EXPECT_DOUBLE_EQ(24.0, transform.m21());
702 EXPECT_DOUBLE_EQ(22.0, transform.m22());
703 EXPECT_DOUBLE_EQ(20.0, transform.m23());
704 EXPECT_DOUBLE_EQ(18.0, transform.m24());
705 EXPECT_DOUBLE_EQ(8.0, transform.m31());
706 EXPECT_DOUBLE_EQ(7.0, transform.m32());
707 EXPECT_DOUBLE_EQ(6.0, transform.m33());
708 EXPECT_DOUBLE_EQ(5.0, transform.m34());
709 EXPECT_DOUBLE_EQ(4.0, transform.m41());
710 EXPECT_DOUBLE_EQ(3.0, transform.m42());
711 EXPECT_DOUBLE_EQ(2.0, transform.m43());
712 EXPECT_DOUBLE_EQ(1.0, transform.m44());
713}
714
715static void testScaledByHalf(const WebCore::TransformationMatrix& transform)
716{
717 EXPECT_DOUBLE_EQ(8.0, transform.m11());
718 EXPECT_DOUBLE_EQ(7.5, transform.m12());
719 EXPECT_DOUBLE_EQ(7.0, transform.m13());
720 EXPECT_DOUBLE_EQ(6.5, transform.m14());
721 EXPECT_DOUBLE_EQ(6.0, transform.m21());
722 EXPECT_DOUBLE_EQ(5.5, transform.m22());
723 EXPECT_DOUBLE_EQ(5.0, transform.m23());
724 EXPECT_DOUBLE_EQ(4.5, transform.m24());
725 EXPECT_DOUBLE_EQ(8.0, transform.m31());
726 EXPECT_DOUBLE_EQ(7.0, transform.m32());
727 EXPECT_DOUBLE_EQ(6.0, transform.m33());
728 EXPECT_DOUBLE_EQ(5.0, transform.m34());
729 EXPECT_DOUBLE_EQ(4.0, transform.m41());
730 EXPECT_DOUBLE_EQ(3.0, transform.m42());
731 EXPECT_DOUBLE_EQ(2.0, transform.m43());
732 EXPECT_DOUBLE_EQ(1.0, transform.m44());
733}
734
735
736TEST(TransformationMatrix, Scale)
737{
738 WebCore::TransformationMatrix test(6.0, 5.0, 4.0, 3.0, 2.0, 1.0);
739
740 testAffineLikeConstruction(test);
741
742 test.scale(1.0);
743
744 testAffineLikeConstruction(test);
745
746 test.scale(2.0);
747
748 testDoubled(test);
749
750 test.scale(0.5);
751
752 testAffineLikeConstruction(test);
753
754 test.scale(0.5);
755
756 testHalved(test);
757
758 WebCore::TransformationMatrix test2(16.0, 15.0, 14.0, 13.0, 12.0, 11.0, 10.0,
759 9.0, 8.0, 7.0, 6.0, 5.0, 4.0, 3.0, 2.0, 1.0);
760
761 testValueConstruction(test2);
762
763 test2.scale(2.0);
764
765 testScaledByTwo(test2);
766
767 test2.scale(0.5);
768
769 testValueConstruction(test2);
770
771 test2.scale(0.5);
772
773 testScaledByHalf(test2);
774}
775
776TEST(TransformationMatrix, ScaleUniformNonUniform)
777{
778 WebCore::TransformationMatrix test(16.0, 15.0, 14.0, 13.0, 12.0, 11.0, 10.0,
779 9.0, 8.0, 7.0, 6.0, 5.0, 4.0, 3.0, 2.0, 1.0);
780
781 testValueConstruction(test);
782
783 test.scaleNonUniform(1.0, 1.0);
784
785 testValueConstruction(test);
786
787 test.scaleNonUniform(2.0, 2.0);
788
789 testScaledByTwo(test);
790
791 test.scaleNonUniform(0.5, 0.5);
792
793 testValueConstruction(test);
794
795 test.scaleNonUniform(0.5, 0.5);
796
797 testScaledByHalf(test);
798}
799
800TEST(TransformationMatrix, Rotate)
801{
802 WebCore::TransformationMatrix test(6.0, 5.0, 4.0, 3.0, 2.0, 1.0);
803
804 test.rotate(360.0);
805
806 testAffineLikeConstruction(test);
807
808 test.rotate(180.0);
809
810 static double epsilon = 0.0001;
811
812 EXPECT_NEAR(-6.0, test.a(), epsilon);
813 EXPECT_NEAR(-5.0, test.b(), epsilon);
814 EXPECT_NEAR(-4.0, test.c(), epsilon);
815 EXPECT_NEAR(-3.0, test.d(), epsilon);
816 EXPECT_DOUBLE_EQ(2.0, test.e());
817 EXPECT_DOUBLE_EQ(1.0, test.f());
818
819 test.rotate(-180.0);
820
821 testAffineLikeConstruction(test);
822
823 test.rotate(90.0);
824
825 EXPECT_NEAR(4.0, test.a(), epsilon);
826 EXPECT_NEAR(3.0, test.b(), epsilon);
827 EXPECT_NEAR(-6.0, test.c(), epsilon);
828 EXPECT_NEAR(-5.0, test.d(), epsilon);
829 EXPECT_DOUBLE_EQ(2.0, test.e());
830 EXPECT_DOUBLE_EQ(1.0, test.f());
831
832 test.rotate(-90.0);
833
834 testAffineLikeConstruction(test);
835}
836
837TEST(TransformationMatrix, TranslateXY)
838{
839 WebCore::TransformationMatrix test(6.0, 5.0, 4.0, 3.0, 2.0, 1.0);
840
841 test.translate(0.0, 0.0);
842
843 testAffineLikeConstruction(test);
844
845 test.translate(5.0, 0.0);
846
847 EXPECT_DOUBLE_EQ(6.0, test.a());
848 EXPECT_DOUBLE_EQ(5.0, test.b());
849 EXPECT_DOUBLE_EQ(4.0, test.c());
850 EXPECT_DOUBLE_EQ(3.0, test.d());
851 EXPECT_DOUBLE_EQ(32.0, test.e());
852 EXPECT_DOUBLE_EQ(26.0, test.f());
853
854 test.translate(0.0, -1.2);
855
856 EXPECT_DOUBLE_EQ(6.0, test.a());
857 EXPECT_DOUBLE_EQ(5.0, test.b());
858 EXPECT_DOUBLE_EQ(4.0, test.c());
859 EXPECT_DOUBLE_EQ(3.0, test.d());
860 EXPECT_DOUBLE_EQ(27.2, test.e());
861 EXPECT_DOUBLE_EQ(22.4, test.f());
862}
863
864TEST(TransformationMatrix, FlipX)
865{
866 WebCore::TransformationMatrix test(6.0, 5.0, 4.0, 3.0, 2.0, 1.0);
867
868 testAffineLikeConstruction(test);
869
870 test.flipX();
871
872 EXPECT_DOUBLE_EQ(-6.0, test.a());
873 EXPECT_DOUBLE_EQ(-5.0, test.b());
874 EXPECT_DOUBLE_EQ(4.0, test.c());
875 EXPECT_DOUBLE_EQ(3.0, test.d());
876 EXPECT_DOUBLE_EQ(2.0, test.e());
877 EXPECT_DOUBLE_EQ(1.0, test.f());
878
879 test.flipX();
880
881 testAffineLikeConstruction(test);
882
883 WebCore::TransformationMatrix test2;
884
885 testIdentity(test2);
886
887 ASSERT_TRUE(test2.isIdentity());
888 ASSERT_TRUE(test2.isIdentityOrTranslation());
889
890 test2.flipX();
891
892 EXPECT_DOUBLE_EQ(-1.0, test2.a());
893 EXPECT_DOUBLE_EQ(0.0, test2.b());
894 EXPECT_DOUBLE_EQ(0.0, test2.c());
895 EXPECT_DOUBLE_EQ(1.0, test2.d());
896 EXPECT_DOUBLE_EQ(0.0, test2.e());
897 EXPECT_DOUBLE_EQ(0.0, test2.f());
898
899 ASSERT_FALSE(test2.isIdentity());
900 ASSERT_FALSE(test2.isIdentityOrTranslation());
901
902 test2.flipX();
903
904 ASSERT_TRUE(test2.isIdentity());
905 ASSERT_TRUE(test2.isIdentityOrTranslation());
906}
907
908TEST(TransformationMatrix, FlipY)
909{
910 WebCore::TransformationMatrix test(6.0, 5.0, 4.0, 3.0, 2.0, 1.0);
911
912 testAffineLikeConstruction(test);
913
914 test.flipY();
915
916 EXPECT_DOUBLE_EQ(6.0, test.a());
917 EXPECT_DOUBLE_EQ(5.0, test.b());
918 EXPECT_DOUBLE_EQ(-4.0, test.c());
919 EXPECT_DOUBLE_EQ(-3.0, test.d());
920 EXPECT_DOUBLE_EQ(2.0, test.e());
921 EXPECT_DOUBLE_EQ(1.0, test.f());
922
923 test.flipY();
924
925 testAffineLikeConstruction(test);
926
927 WebCore::TransformationMatrix test2;
928
929 testIdentity(test2);
930
931 ASSERT_TRUE(test2.isIdentity());
932 ASSERT_TRUE(test2.isIdentityOrTranslation());
933
934 test2.flipY();
935
936 EXPECT_DOUBLE_EQ(1.0, test2.a());
937 EXPECT_DOUBLE_EQ(0.0, test2.b());
938 EXPECT_DOUBLE_EQ(0.0, test2.c());
939 EXPECT_DOUBLE_EQ(-1.0, test2.d());
940 EXPECT_DOUBLE_EQ(0.0, test2.e());
941 EXPECT_DOUBLE_EQ(0.0, test2.f());
942
943 ASSERT_FALSE(test2.isIdentity());
944 ASSERT_FALSE(test2.isIdentityOrTranslation());
945
946 test2.flipY();
947
948 ASSERT_TRUE(test2.isIdentity());
949 ASSERT_TRUE(test2.isIdentityOrTranslation());
950}
951
952TEST(TransformationMatrix, FlipXandFlipY)
953{
954 WebCore::TransformationMatrix test(6.0, 5.0, 4.0, 3.0, 2.0, 1.0);
955
956 testAffineLikeConstruction(test);
957
958 test.flipX();
959
960 EXPECT_DOUBLE_EQ(-6.0, test.a());
961 EXPECT_DOUBLE_EQ(-5.0, test.b());
962 EXPECT_DOUBLE_EQ(4.0, test.c());
963 EXPECT_DOUBLE_EQ(3.0, test.d());
964 EXPECT_DOUBLE_EQ(2.0, test.e());
965 EXPECT_DOUBLE_EQ(1.0, test.f());
966
967 test.flipY();
968
969 EXPECT_DOUBLE_EQ(-6.0, test.a());
970 EXPECT_DOUBLE_EQ(-5.0, test.b());
971 EXPECT_DOUBLE_EQ(-4.0, test.c());
972 EXPECT_DOUBLE_EQ(-3.0, test.d());
973 EXPECT_DOUBLE_EQ(2.0, test.e());
974 EXPECT_DOUBLE_EQ(1.0, test.f());
975
976 test.flipX();
977
978 EXPECT_DOUBLE_EQ(6.0, test.a());
979 EXPECT_DOUBLE_EQ(5.0, test.b());
980 EXPECT_DOUBLE_EQ(-4.0, test.c());
981 EXPECT_DOUBLE_EQ(-3.0, test.d());
982 EXPECT_DOUBLE_EQ(2.0, test.e());
983 EXPECT_DOUBLE_EQ(1.0, test.f());
984
985 test.flipY();
986
987 testAffineLikeConstruction(test);
988
989 WebCore::TransformationMatrix test2;
990
991 ASSERT_TRUE(test2.isIdentity());
992 ASSERT_TRUE(test2.isIdentityOrTranslation());
993
994 test2.flipX();
995
996 ASSERT_FALSE(test2.isIdentity());
997 ASSERT_FALSE(test2.isIdentityOrTranslation());
998
999 test2.flipY();
1000
1001 ASSERT_FALSE(test2.isIdentity());
1002 ASSERT_FALSE(test2.isIdentityOrTranslation());
1003
1004 test2.flipX();
1005
1006 ASSERT_FALSE(test2.isIdentity());
1007 ASSERT_FALSE(test2.isIdentityOrTranslation());
1008
1009 test2.flipY();
1010
1011 ASSERT_TRUE(test2.isIdentity());
1012 ASSERT_TRUE(test2.isIdentityOrTranslation());
1013}
1014
1015TEST(TransformationMatrix, Skew)
1016{
1017 WebCore::TransformationMatrix test(6.0, 5.0, 4.0, 3.0, 2.0, 1.0);
1018
1019 testAffineLikeConstruction(test);
1020
1021 test.skew(360.0, 360.0);
1022
1023 testAffineLikeConstruction(test);
1024
1025 test.skew(0.0, 0.0);
1026
1027 testAffineLikeConstruction(test);
1028
1029 test.skew(180.0, 180.0);
1030
1031 static double epsilon = 0.0001;
1032
1033 EXPECT_DOUBLE_EQ(6.0, test.a());
1034 EXPECT_DOUBLE_EQ(5.0, test.b());
1035 EXPECT_NEAR(4.0, test.c(), epsilon);
1036 EXPECT_DOUBLE_EQ(3.0, test.d());
1037 EXPECT_DOUBLE_EQ(2.0, test.e());
1038 EXPECT_DOUBLE_EQ(1.0, test.f());
1039
1040 test.skew(-180.0, -180.0);
1041
1042 testAffineLikeConstruction(test);
1043}
1044
1045TEST(TransformationMatrix, Inverse)
1046{
1047 WebCore::TransformationMatrix test;
1048
1049 auto inverse = test.inverse();
1050
1051 ASSERT(inverse);
1052
1053 EXPECT_DOUBLE_EQ(1.0, inverse->a());
1054 EXPECT_DOUBLE_EQ(0.0, inverse->b());
1055 EXPECT_DOUBLE_EQ(0.0, inverse->c());
1056 EXPECT_DOUBLE_EQ(1.0, inverse->d());
1057 EXPECT_DOUBLE_EQ(0.0, inverse->e());
1058 EXPECT_DOUBLE_EQ(0.0, inverse->f());
1059
1060 auto test2 = test * inverse.value();
1061
1062 testIdentity(test2);
1063}
1064
1065TEST(TransformationMatrix, NonInvertableBlend)
1066{
1067 WebCore::TransformationMatrix from;
1068 WebCore::TransformationMatrix to(2.7133590938, 0.0, 0.0, 0.0, 0.0, 2.4645137761, 0.0, 0.0, 0.0, 0.0, 0.00, 0.01, 0.02, 0.03, 0.04, 0.05);
1069 WebCore::TransformationMatrix result;
1070
1071 result = to;
1072 result.blend(from, 0.25);
1073 EXPECT_TRUE(result == from);
1074
1075 result = to;
1076 result.blend(from, 0.75);
1077 EXPECT_TRUE(result == to);
1078}
1079
1080TEST(TransformationMatrix, Blend)
1081{
1082 WebCore::TransformationMatrix transform;
1083
1084 WebCore::TransformationMatrix scaled;
1085 scaled.scale(2.0);
1086
1087 transform.blend(scaled, 50);
1088
1089 static const double epsilon = 0.0001;
1090 EXPECT_NEAR(-48.0, transform.m11(), epsilon);
1091 EXPECT_NEAR(0.0, transform.m12(), epsilon);
1092 EXPECT_NEAR(0.0, transform.m13(), epsilon);
1093 EXPECT_NEAR(0.0, transform.m14(), epsilon);
1094 EXPECT_NEAR(0.0, transform.m21(), epsilon);
1095 EXPECT_NEAR(-48.0, transform.m22(), epsilon);
1096 EXPECT_NEAR(0.0, transform.m23(), epsilon);
1097 EXPECT_NEAR(0.0, transform.m24(), epsilon);
1098 EXPECT_NEAR(0.0, transform.m31(), epsilon);
1099 EXPECT_NEAR(0.0, transform.m32(), epsilon);
1100 EXPECT_NEAR(1.0, transform.m33(), epsilon);
1101 EXPECT_NEAR(0.0, transform.m34(), epsilon);
1102 EXPECT_NEAR(0.0, transform.m41(), epsilon);
1103 EXPECT_NEAR(0.0, transform.m42(), epsilon);
1104 EXPECT_NEAR(0.0, transform.m43(), epsilon);
1105 EXPECT_NEAR(1.0, transform.m44(), epsilon);
1106}
1107
1108TEST(TransformationMatrix, Blend2)
1109{
1110 WebCore::TransformationMatrix transform;
1111
1112 WebCore::TransformationMatrix scaled;
1113 scaled.scale(2.0);
1114
1115 transform.blend2(scaled, 20);
1116
1117 static const double epsilon = 0.0001;
1118 EXPECT_NEAR(-18.0, transform.m11(), epsilon);
1119 EXPECT_NEAR(0.0, transform.m12(), epsilon);
1120 EXPECT_NEAR(0.0, transform.m13(), epsilon);
1121 EXPECT_NEAR(0.0, transform.m14(), epsilon);
1122 EXPECT_NEAR(0.0, transform.m21(), epsilon);
1123 EXPECT_NEAR(-18.0, transform.m22(), epsilon);
1124 EXPECT_NEAR(0.0, transform.m23(), epsilon);
1125 EXPECT_NEAR(0.0, transform.m24(), epsilon);
1126 EXPECT_NEAR(0.0, transform.m31(), epsilon);
1127 EXPECT_NEAR(0.0, transform.m32(), epsilon);
1128 EXPECT_NEAR(1.0, transform.m33(), epsilon);
1129 EXPECT_NEAR(0.0, transform.m34(), epsilon);
1130 EXPECT_NEAR(0.0, transform.m41(), epsilon);
1131 EXPECT_NEAR(0.0, transform.m42(), epsilon);
1132 EXPECT_NEAR(0.0, transform.m43(), epsilon);
1133 EXPECT_NEAR(1.0, transform.m44(), epsilon);
1134}
1135
1136TEST(TransformationMatrix, Blend4)
1137{
1138 WebCore::TransformationMatrix transform;
1139
1140 WebCore::TransformationMatrix scaled;
1141 scaled.scale(2.0);
1142
1143 transform.blend4(scaled, 30);
1144
1145 static const double epsilon = 0.0001;
1146 EXPECT_NEAR(-28.0, transform.m11(), epsilon);
1147 EXPECT_NEAR(0.0, transform.m12(), epsilon);
1148 EXPECT_NEAR(0.0, transform.m13(), epsilon);
1149 EXPECT_NEAR(0.0, transform.m14(), epsilon);
1150 EXPECT_NEAR(0.0, transform.m21(), epsilon);
1151 EXPECT_NEAR(-28.0, transform.m22(), epsilon);
1152 EXPECT_NEAR(0.0, transform.m23(), epsilon);
1153 EXPECT_NEAR(0.0, transform.m24(), epsilon);
1154 EXPECT_NEAR(0.0, transform.m31(), epsilon);
1155 EXPECT_NEAR(0.0, transform.m32(), epsilon);
1156 EXPECT_NEAR(1.0, transform.m33(), epsilon);
1157 EXPECT_NEAR(0.0, transform.m34(), epsilon);
1158 EXPECT_NEAR(0.0, transform.m41(), epsilon);
1159 EXPECT_NEAR(0.0, transform.m42(), epsilon);
1160 EXPECT_NEAR(0.0, transform.m43(), epsilon);
1161 EXPECT_NEAR(1.0, transform.m44(), epsilon);
1162}
1163
1164TEST(TransformationMatrix, Equality)
1165{
1166 WebCore::TransformationMatrix test(6.0, 5.0, 4.0, 3.0, 2.0, 1.0);
1167 WebCore::TransformationMatrix test2;
1168
1169 ASSERT_FALSE(test == test2);
1170 ASSERT_TRUE(test != test2);
1171
1172 test.makeIdentity();
1173
1174 ASSERT_TRUE(test == test2);
1175 ASSERT_FALSE(test != test2);
1176
1177 WebCore::TransformationMatrix test3(16.0, 15.0, 14.0, 13.0, 12.0, 11.0, 10.0,
1178 9.0, 8.0, 7.0, 6.0, 5.0, 4.0, 3.0, 2.0, 1.0);
1179 WebCore::TransformationMatrix test4(test3);
1180
1181 ASSERT_TRUE(test3 == test4);
1182 ASSERT_FALSE(test3 != test4);
1183
1184 test4.setM43(1002.22);
1185
1186 ASSERT_FALSE(test3 == test4);
1187 ASSERT_TRUE(test3 != test4);
1188}
1189
1190#if USE(CA)
1191static void testTranslationMatrix(const WebCore::TransformationMatrix& matrix)
1192{
1193 EXPECT_DOUBLE_EQ(1.0, matrix.m11());
1194 EXPECT_DOUBLE_EQ(0.0, matrix.m12());
1195 EXPECT_DOUBLE_EQ(0.0, matrix.m13());
1196 EXPECT_DOUBLE_EQ(0.0, matrix.m14());
1197 EXPECT_DOUBLE_EQ(0.0, matrix.m21());
1198 EXPECT_DOUBLE_EQ(1.0, matrix.m22());
1199 EXPECT_DOUBLE_EQ(0.0, matrix.m23());
1200 EXPECT_DOUBLE_EQ(0.0, matrix.m24());
1201 EXPECT_DOUBLE_EQ(0.0, matrix.m31());
1202 EXPECT_DOUBLE_EQ(0.0, matrix.m32());
1203 EXPECT_DOUBLE_EQ(1.0, matrix.m33());
1204 EXPECT_DOUBLE_EQ(0.0, matrix.m34());
1205 EXPECT_DOUBLE_EQ(10.0, matrix.m41());
1206 EXPECT_DOUBLE_EQ(15.0, matrix.m42());
1207 EXPECT_DOUBLE_EQ(30.0, matrix.m43());
1208 EXPECT_DOUBLE_EQ(1.0, matrix.m44());
1209}
1210#endif
1211
1212TEST(TransformationMatrix, Casting)
1213{
1214 WebCore::TransformationMatrix test(16.0, 15.0, 14.0, 13.0, 12.0, 11.0, 10.0,
1215 9.0, 8.0, 7.0, 6.0, 5.0, 4.0, 3.0, 2.0, 1.0);
1216
1217#if USE(CA)
1218 CATransform3D caTransform = CATransform3DMakeTranslation(10.0f, 15.0f, 30.0f);
1219
1220 WebCore::TransformationMatrix fromCATransform(caTransform);
1221
1222 testTranslationMatrix(fromCATransform);
1223
1224 CATransform3D caFromWK = test;
1225
1226 EXPECT_DOUBLE_EQ(16.0, caFromWK.m11);
1227 EXPECT_DOUBLE_EQ(15.0, caFromWK.m12);
1228 EXPECT_DOUBLE_EQ(14.0, caFromWK.m13);
1229 EXPECT_DOUBLE_EQ(13.0, caFromWK.m14);
1230 EXPECT_DOUBLE_EQ(12.0, caFromWK.m21);
1231 EXPECT_DOUBLE_EQ(11.0, caFromWK.m22);
1232 EXPECT_DOUBLE_EQ(10.0, caFromWK.m23);
1233 EXPECT_DOUBLE_EQ(9.0, caFromWK.m24);
1234 EXPECT_DOUBLE_EQ(8.0, caFromWK.m31);
1235 EXPECT_DOUBLE_EQ(7.0, caFromWK.m32);
1236 EXPECT_DOUBLE_EQ(6.0, caFromWK.m33);
1237 EXPECT_DOUBLE_EQ(5.0, caFromWK.m34);
1238 EXPECT_DOUBLE_EQ(4.0, caFromWK.m41);
1239 EXPECT_DOUBLE_EQ(3.0, caFromWK.m42);
1240 EXPECT_DOUBLE_EQ(2.0, caFromWK.m43);
1241 EXPECT_DOUBLE_EQ(1.0, caFromWK.m44);
1242#endif
1243
1244#if USE(CG)
1245 CGAffineTransform cgTransform = CGAffineTransformMake(6.0, 5.0, 4.0, 3.0, 2.0, 1.0);
1246 WebCore::TransformationMatrix fromCGTransform(cgTransform);
1247
1248 testAffineLikeConstruction(fromCGTransform);
1249
1250 CGAffineTransform cgFromWK = test;
1251 EXPECT_DOUBLE_EQ(16.0, cgFromWK.a);
1252 EXPECT_DOUBLE_EQ(15.0, cgFromWK.b);
1253 EXPECT_DOUBLE_EQ(12.0, cgFromWK.c);
1254 EXPECT_DOUBLE_EQ(11.0, cgFromWK.d);
1255 EXPECT_DOUBLE_EQ(4.0, cgFromWK.tx);
1256 EXPECT_DOUBLE_EQ(3.0, cgFromWK.ty);
1257#endif
1258
1259#if PLATFORM(WIN) || (PLATFORM(GTK) && OS(WINDOWS))
1260 XFORM gdiFromWK = test;
1261 EXPECT_DOUBLE_EQ(16.0, gdiFromWK.eM11);
1262 EXPECT_DOUBLE_EQ(15.0, gdiFromWK.eM12);
1263 EXPECT_DOUBLE_EQ(12.0, gdiFromWK.eM21);
1264 EXPECT_DOUBLE_EQ(11.0, gdiFromWK.eM22);
1265 EXPECT_DOUBLE_EQ(4.0, gdiFromWK.eDx);
1266 EXPECT_DOUBLE_EQ(3.0, gdiFromWK.eDy);
1267#endif
1268
1269#if PLATFORM(WIN)
1270 D2D1_MATRIX_3X2_F d2dTransform = D2D1::Matrix3x2F(6.0, 5.0, 4.0, 3.0, 2.0, 1.0);
1271 WebCore::TransformationMatrix fromD2DTransform(d2dTransform);
1272
1273 testAffineLikeConstruction(fromD2DTransform);
1274
1275 D2D1_MATRIX_3X2_F d2dFromWK = test;
1276 EXPECT_DOUBLE_EQ(16.0, d2dFromWK._11);
1277 EXPECT_DOUBLE_EQ(15.0, d2dFromWK._12);
1278 EXPECT_DOUBLE_EQ(12.0, d2dFromWK._21);
1279 EXPECT_DOUBLE_EQ(11.0, d2dFromWK._22);
1280 EXPECT_DOUBLE_EQ(4.0, d2dFromWK._31);
1281 EXPECT_DOUBLE_EQ(3.0, d2dFromWK._32);
1282#endif
1283}
1284
1285TEST(TransformationMatrix, MakeMapBetweenRects)
1286{
1287 WebCore::FloatRect fromRect(10.0f, 10.0f, 100.0f, 100.0f);
1288 WebCore::FloatRect toRect(70.0f, 70.0f, 200.0f, 50.0f);
1289
1290 auto mapBetween = WebCore::TransformationMatrix::rectToRect(fromRect, toRect);
1291
1292 EXPECT_DOUBLE_EQ(2.0, mapBetween.a());
1293 EXPECT_DOUBLE_EQ(0.0, mapBetween.b());
1294 EXPECT_DOUBLE_EQ(0.0, mapBetween.c());
1295 EXPECT_DOUBLE_EQ(0.5, mapBetween.d());
1296 EXPECT_DOUBLE_EQ(60.0, mapBetween.e());
1297 EXPECT_DOUBLE_EQ(60.0, mapBetween.f());
1298
1299 EXPECT_DOUBLE_EQ(2.0, mapBetween.m11());
1300 EXPECT_DOUBLE_EQ(0.0, mapBetween.m12());
1301 EXPECT_DOUBLE_EQ(0.0, mapBetween.m13());
1302 EXPECT_DOUBLE_EQ(0.0, mapBetween.m14());
1303 EXPECT_DOUBLE_EQ(0.0, mapBetween.m21());
1304 EXPECT_DOUBLE_EQ(0.5, mapBetween.m22());
1305 EXPECT_DOUBLE_EQ(0.0, mapBetween.m23());
1306 EXPECT_DOUBLE_EQ(0.0, mapBetween.m24());
1307 EXPECT_DOUBLE_EQ(0.0, mapBetween.m31());
1308 EXPECT_DOUBLE_EQ(0.0, mapBetween.m32());
1309 EXPECT_DOUBLE_EQ(1.0, mapBetween.m33());
1310 EXPECT_DOUBLE_EQ(0.0, mapBetween.m34());
1311 EXPECT_DOUBLE_EQ(60.0, mapBetween.m41());
1312 EXPECT_DOUBLE_EQ(60.0, mapBetween.m42());
1313 EXPECT_DOUBLE_EQ(0.0, mapBetween.m43());
1314 EXPECT_DOUBLE_EQ(1.0, mapBetween.m44());
1315}
1316
1317}
1318