OLD | NEW |
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "platform/graphics/paint/GeometryMapper.h" | 5 #include "platform/graphics/paint/GeometryMapper.h" |
6 | 6 |
7 #include "platform/geometry/GeometryTestHelpers.h" | 7 #include "platform/geometry/GeometryTestHelpers.h" |
8 #include "platform/geometry/LayoutRect.h" | 8 #include "platform/geometry/LayoutRect.h" |
9 #include "platform/graphics/paint/ClipPaintPropertyNode.h" | 9 #include "platform/graphics/paint/ClipPaintPropertyNode.h" |
10 #include "platform/graphics/paint/EffectPaintPropertyNode.h" | 10 #include "platform/graphics/paint/EffectPaintPropertyNode.h" |
(...skipping 224 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
235 TransformationMatrix translateTransform; | 235 TransformationMatrix translateTransform; |
236 translateTransform.translate(100, 0); | 236 translateTransform.translate(100, 0); |
237 RefPtr<TransformPaintPropertyNode> transform2 = | 237 RefPtr<TransformPaintPropertyNode> transform2 = |
238 TransformPaintPropertyNode::create(transform1, translateTransform, | 238 TransformPaintPropertyNode::create(transform1, translateTransform, |
239 FloatPoint3D()); | 239 FloatPoint3D()); |
240 | 240 |
241 PropertyTreeState localState = rootPropertyTreeState(); | 241 PropertyTreeState localState = rootPropertyTreeState(); |
242 localState.setTransform(transform2.get()); | 242 localState.setTransform(transform2.get()); |
243 | 243 |
244 FloatRect input(0, 0, 100, 100); | 244 FloatRect input(0, 0, 100, 100); |
245 // Note: unlike NestedTransforms, the order of these transforms matters. This
tests correct order of matrix multiplication. | 245 // Note: unlike NestedTransforms, the order of these transforms matters. This |
| 246 // tests correct order of matrix multiplication. |
246 TransformationMatrix final = scaleTransform * translateTransform; | 247 TransformationMatrix final = scaleTransform * translateTransform; |
247 FloatRect output = final.mapRect(input); | 248 FloatRect output = final.mapRect(input); |
248 | 249 |
249 CHECK_MAPPINGS(input, output, output, final, rootClipNode->clipRect().rect(), | 250 CHECK_MAPPINGS(input, output, output, final, rootClipNode->clipRect().rect(), |
250 localState, rootPropertyTreeState()); | 251 localState, rootPropertyTreeState()); |
251 | 252 |
252 // Check the cached matrix for the intermediate transform. | 253 // Check the cached matrix for the intermediate transform. |
253 EXPECT_EQ(scaleTransform, | 254 EXPECT_EQ(scaleTransform, |
254 getPrecomputedDataForAncestor(rootPropertyTreeState()) | 255 getPrecomputedDataForAncestor(rootPropertyTreeState()) |
255 .toAncestorTransforms.get(transform1.get())); | 256 .toAncestorTransforms.get(transform1.get())); |
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
395 } | 396 } |
396 | 397 |
397 { | 398 { |
398 PropertyTreeState localState = rootPropertyTreeState(); | 399 PropertyTreeState localState = rootPropertyTreeState(); |
399 localState.setClip(clip2.get()); | 400 localState.setClip(clip2.get()); |
400 localState.setTransform(transform.get()); | 401 localState.setTransform(transform.get()); |
401 | 402 |
402 FloatRect mappedClip = rotateTransform.mapRect(clip2->clipRect().rect()); | 403 FloatRect mappedClip = rotateTransform.mapRect(clip2->clipRect().rect()); |
403 mappedClip.intersect(clip1->clipRect().rect()); | 404 mappedClip.intersect(clip1->clipRect().rect()); |
404 | 405 |
405 // All clips are performed in the space of the ancestor. In cases such as th
is, this means the | 406 // All clips are performed in the space of the ancestor. In cases such as |
406 // clip is a bit lossy. | 407 // this, this means the clip is a bit lossy. |
407 FloatRect output(input); | 408 FloatRect output(input); |
408 // Map to transformed rect in ancestor space. | 409 // Map to transformed rect in ancestor space. |
409 output = rotateTransform.mapRect(output); | 410 output = rotateTransform.mapRect(output); |
410 // Intersect with all clips between local and ancestor, independently mapped
to ancestor space. | 411 // Intersect with all clips between local and ancestor, independently mapped |
| 412 // to ancestor space. |
411 output.intersect(mappedClip); | 413 output.intersect(mappedClip); |
412 | 414 |
413 CHECK_MAPPINGS( | 415 CHECK_MAPPINGS( |
414 input, // Input | 416 input, // Input |
415 output, // Visual rect | 417 output, // Visual rect |
416 rotateTransform.mapRect(input), // Transformed rect (not clipped) | 418 rotateTransform.mapRect(input), // Transformed rect (not clipped) |
417 rotateTransform, // Transform matrix to ancestor space | 419 rotateTransform, // Transform matrix to ancestor space |
418 mappedClip, // Clip rect in ancestor space | 420 mappedClip, // Clip rect in ancestor space |
419 localState, rootPropertyTreeState()); | 421 localState, rootPropertyTreeState()); |
420 } | 422 } |
421 } | 423 } |
422 | 424 |
423 TEST_F(GeometryMapperTest, SiblingTransforms) { | 425 TEST_F(GeometryMapperTest, SiblingTransforms) { |
424 // These transforms are siblings. Thus mapping from one to the other requires
going through the root. | 426 // These transforms are siblings. Thus mapping from one to the other requires |
| 427 // going through the root. |
425 TransformationMatrix rotateTransform1; | 428 TransformationMatrix rotateTransform1; |
426 rotateTransform1.rotate(45); | 429 rotateTransform1.rotate(45); |
427 RefPtr<TransformPaintPropertyNode> transform1 = | 430 RefPtr<TransformPaintPropertyNode> transform1 = |
428 TransformPaintPropertyNode::create(rootPropertyTreeState().transform(), | 431 TransformPaintPropertyNode::create(rootPropertyTreeState().transform(), |
429 rotateTransform1, FloatPoint3D()); | 432 rotateTransform1, FloatPoint3D()); |
430 | 433 |
431 TransformationMatrix rotateTransform2; | 434 TransformationMatrix rotateTransform2; |
432 rotateTransform2.rotate(-45); | 435 rotateTransform2.rotate(-45); |
433 RefPtr<TransformPaintPropertyNode> transform2 = | 436 RefPtr<TransformPaintPropertyNode> transform2 = |
434 TransformPaintPropertyNode::create(rootPropertyTreeState().transform(), | 437 TransformPaintPropertyNode::create(rootPropertyTreeState().transform(), |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
472 EXPECT_TRUE(success); | 475 EXPECT_TRUE(success); |
473 EXPECT_RECT_EQ(expected, result); | 476 EXPECT_RECT_EQ(expected, result); |
474 | 477 |
475 result = geometryMapper->mapRectToDestinationSpace(input, transform1State, | 478 result = geometryMapper->mapRectToDestinationSpace(input, transform1State, |
476 transform2State, success); | 479 transform2State, success); |
477 EXPECT_TRUE(success); | 480 EXPECT_TRUE(success); |
478 EXPECT_RECT_EQ(expected, result); | 481 EXPECT_RECT_EQ(expected, result); |
479 } | 482 } |
480 | 483 |
481 TEST_F(GeometryMapperTest, SiblingTransformsWithClip) { | 484 TEST_F(GeometryMapperTest, SiblingTransformsWithClip) { |
482 // These transforms are siblings. Thus mapping from one to the other requires
going through the root. | 485 // These transforms are siblings. Thus mapping from one to the other requires |
| 486 // going through the root. |
483 TransformationMatrix rotateTransform1; | 487 TransformationMatrix rotateTransform1; |
484 rotateTransform1.rotate(45); | 488 rotateTransform1.rotate(45); |
485 RefPtr<TransformPaintPropertyNode> transform1 = | 489 RefPtr<TransformPaintPropertyNode> transform1 = |
486 TransformPaintPropertyNode::create(rootPropertyTreeState().transform(), | 490 TransformPaintPropertyNode::create(rootPropertyTreeState().transform(), |
487 rotateTransform1, FloatPoint3D()); | 491 rotateTransform1, FloatPoint3D()); |
488 | 492 |
489 TransformationMatrix rotateTransform2; | 493 TransformationMatrix rotateTransform2; |
490 rotateTransform2.rotate(-45); | 494 rotateTransform2.rotate(-45); |
491 RefPtr<TransformPaintPropertyNode> transform2 = | 495 RefPtr<TransformPaintPropertyNode> transform2 = |
492 TransformPaintPropertyNode::create(rootPropertyTreeState().transform(), | 496 TransformPaintPropertyNode::create(rootPropertyTreeState().transform(), |
493 rotateTransform2, FloatPoint3D()); | 497 rotateTransform2, FloatPoint3D()); |
494 | 498 |
495 RefPtr<ClipPaintPropertyNode> clip = ClipPaintPropertyNode::create( | 499 RefPtr<ClipPaintPropertyNode> clip = ClipPaintPropertyNode::create( |
496 rootPropertyTreeState().clip(), transform2.get(), | 500 rootPropertyTreeState().clip(), transform2.get(), |
497 FloatRoundedRect(10, 10, 70, 70)); | 501 FloatRoundedRect(10, 10, 70, 70)); |
498 | 502 |
499 PropertyTreeState transform1State = rootPropertyTreeState(); | 503 PropertyTreeState transform1State = rootPropertyTreeState(); |
500 transform1State.setTransform(transform1.get()); | 504 transform1State.setTransform(transform1.get()); |
501 PropertyTreeState transform2AndClipState = rootPropertyTreeState(); | 505 PropertyTreeState transform2AndClipState = rootPropertyTreeState(); |
502 transform2AndClipState.setTransform(transform2.get()); | 506 transform2AndClipState.setTransform(transform2.get()); |
503 transform2AndClipState.setClip(clip.get()); | 507 transform2AndClipState.setClip(clip.get()); |
504 | 508 |
505 bool success; | 509 bool success; |
506 FloatRect input(0, 0, 100, 100); | 510 FloatRect input(0, 0, 100, 100); |
507 | 511 |
508 // Test map from transform1State to transform2AndClipState. | 512 // Test map from transform1State to transform2AndClipState. |
509 FloatRect expected = | 513 FloatRect expected = |
510 rotateTransform2.inverse().mapRect(rotateTransform1.mapRect(input)); | 514 rotateTransform2.inverse().mapRect(rotateTransform1.mapRect(input)); |
511 | 515 |
512 // mapToVisualRectInDestinationSpace ignores clip from the common ancestor to
destination. | 516 // mapToVisualRectInDestinationSpace ignores clip from the common ancestor to |
| 517 // destination. |
513 FloatRect result = geometryMapper->mapToVisualRectInDestinationSpace( | 518 FloatRect result = geometryMapper->mapToVisualRectInDestinationSpace( |
514 input, transform1State, transform2AndClipState, success); | 519 input, transform1State, transform2AndClipState, success); |
515 // Fails, because the clip of the destination state is not an ancestor of the
clip of the source state. | 520 // Fails, because the clip of the destination state is not an ancestor of the |
| 521 // clip of the source state. |
516 EXPECT_FALSE(success); | 522 EXPECT_FALSE(success); |
517 | 523 |
518 // mapRectToDestinationSpace ignores clip. | 524 // mapRectToDestinationSpace ignores clip. |
519 result = geometryMapper->mapRectToDestinationSpace( | 525 result = geometryMapper->mapRectToDestinationSpace( |
520 input, transform1State, transform2AndClipState, success); | 526 input, transform1State, transform2AndClipState, success); |
521 EXPECT_TRUE(success); | 527 EXPECT_TRUE(success); |
522 EXPECT_RECT_EQ(expected, result); | 528 EXPECT_RECT_EQ(expected, result); |
523 | 529 |
524 // Test map from transform2AndClipState to transform1State. | 530 // Test map from transform2AndClipState to transform1State. |
525 FloatRect expectedUnclipped = | 531 FloatRect expectedUnclipped = |
526 rotateTransform1.inverse().mapRect(rotateTransform2.mapRect(input)); | 532 rotateTransform1.inverse().mapRect(rotateTransform2.mapRect(input)); |
527 FloatRect expectedClipped = rotateTransform1.inverse().mapRect( | 533 FloatRect expectedClipped = rotateTransform1.inverse().mapRect( |
528 rotateTransform2.mapRect(FloatRect(10, 10, 70, 70))); | 534 rotateTransform2.mapRect(FloatRect(10, 10, 70, 70))); |
529 | 535 |
530 // mapToVisualRectInDestinationSpace ignores clip from the common ancestor to
destination. | 536 // mapToVisualRectInDestinationSpace ignores clip from the common ancestor to |
| 537 // destination. |
531 result = geometryMapper->mapToVisualRectInDestinationSpace( | 538 result = geometryMapper->mapToVisualRectInDestinationSpace( |
532 input, transform2AndClipState, transform1State, success); | 539 input, transform2AndClipState, transform1State, success); |
533 EXPECT_TRUE(success); | 540 EXPECT_TRUE(success); |
534 EXPECT_RECT_EQ(expectedClipped, result); | 541 EXPECT_RECT_EQ(expectedClipped, result); |
535 | 542 |
536 // mapRectToDestinationSpace ignores clip. | 543 // mapRectToDestinationSpace ignores clip. |
537 result = geometryMapper->mapRectToDestinationSpace( | 544 result = geometryMapper->mapRectToDestinationSpace( |
538 input, transform2AndClipState, transform1State, success); | 545 input, transform2AndClipState, transform1State, success); |
539 EXPECT_TRUE(success); | 546 EXPECT_TRUE(success); |
540 EXPECT_RECT_EQ(expectedUnclipped, result); | 547 EXPECT_RECT_EQ(expectedUnclipped, result); |
(...skipping 29 matching lines...) Expand all Loading... |
570 EXPECT_EQ(rootPropertyTreeState().transform(), | 577 EXPECT_EQ(rootPropertyTreeState().transform(), |
571 leastCommonAncestor(childOfChild2.get(), | 578 leastCommonAncestor(childOfChild2.get(), |
572 rootPropertyTreeState().transform())); | 579 rootPropertyTreeState().transform())); |
573 EXPECT_EQ(child2, leastCommonAncestor(childOfChild2.get(), child2.get())); | 580 EXPECT_EQ(child2, leastCommonAncestor(childOfChild2.get(), child2.get())); |
574 | 581 |
575 EXPECT_EQ(rootPropertyTreeState().transform(), | 582 EXPECT_EQ(rootPropertyTreeState().transform(), |
576 leastCommonAncestor(child1.get(), child2.get())); | 583 leastCommonAncestor(child1.get(), child2.get())); |
577 } | 584 } |
578 | 585 |
579 } // namespace blink | 586 } // namespace blink |
OLD | NEW |