Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(32)

Side by Side Diff: Source/core/rendering/CompositedLayerMapping.cpp

Issue 20723003: Fix pixel snapping issues when layers become composited (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Bring up to ToT again... Created 6 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2009, 2010, 2011 Apple Inc. All rights reserved. 2 * Copyright (C) 2009, 2010, 2011 Apple Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions 5 * modification, are permitted provided that the following conditions
6 * are met: 6 * are met:
7 * 1. Redistributions of source code must retain the above copyright 7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer. 8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright 9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the 10 * notice, this list of conditions and the following disclaimer in the
(...skipping 329 matching lines...) Expand 10 before | Expand all | Expand 10 after
340 340
341 return true; 341 return true;
342 } 342 }
343 343
344 void CompositedLayerMapping::updateCompositedBounds() 344 void CompositedLayerMapping::updateCompositedBounds()
345 { 345 {
346 // We need to know if we draw content in order to update our bounds (this ha s an effect 346 // We need to know if we draw content in order to update our bounds (this ha s an effect
347 // on whether or not descendands will paint into our backing). Update this v alue now. 347 // on whether or not descendands will paint into our backing). Update this v alue now.
348 updateDrawsContent(isSimpleContainerCompositingLayer()); 348 updateDrawsContent(isSimpleContainerCompositingLayer());
349 349
350 IntRect layerBounds = compositor()->calculateCompositedBounds(m_owningLayer, m_owningLayer); 350 LayoutRect layerBounds = compositor()->calculateCompositedBounds(m_owningLay er, m_owningLayer);
351 351
352 // Clip to the size of the document or enclosing overflow-scroll layer. 352 // Clip to the size of the document or enclosing overflow-scroll layer.
353 // If this or an ancestor is transformed, we can't currently compute the cor rect rect to intersect with. 353 // If this or an ancestor is transformed, we can't currently compute the cor rect rect to intersect with.
354 // We'd need RenderObject::convertContainerToLocalQuad(), which doesn't yet exist. 354 // We'd need RenderObject::convertContainerToLocalQuad(), which doesn't yet exist.
355 if (shouldClipCompositedBounds()) { 355 if (shouldClipCompositedBounds()) {
356 RenderView* view = m_owningLayer->renderer()->view(); 356 RenderView* view = m_owningLayer->renderer()->view();
357 RenderLayer* rootLayer = view->layer(); 357 RenderLayer* rootLayer = view->layer();
358 358
359 LayoutRect clippingBounds; 359 LayoutRect clippingBounds;
360 if (renderer()->style()->position() == FixedPosition && renderer()->cont ainer() == view) 360 if (renderer()->style()->position() == FixedPosition && renderer()->cont ainer() == view)
361 clippingBounds = view->frameView()->viewportConstrainedVisibleConten tRect(); 361 clippingBounds = view->frameView()->viewportConstrainedVisibleConten tRect();
362 else 362 else
363 clippingBounds = view->unscaledDocumentRect(); 363 clippingBounds = view->unscaledDocumentRect();
364 364
365 if (m_owningLayer != rootLayer) 365 if (m_owningLayer != rootLayer)
366 clippingBounds.intersect(m_owningLayer->backgroundClipRect(ClipRects Context(rootLayer, 0, AbsoluteClipRects)).rect()); // FIXME: Incorrect for CSS r egions. 366 clippingBounds.intersect(m_owningLayer->backgroundClipRect(ClipRects Context(rootLayer, 0, AbsoluteClipRects)).rect()); // FIXME: Incorrect for CSS r egions.
367 367
368 LayoutPoint delta; 368 LayoutPoint delta;
369 m_owningLayer->convertToLayerCoords(rootLayer, delta); 369 m_owningLayer->convertToLayerCoords(rootLayer, delta);
370 clippingBounds.move(-delta.x(), -delta.y()); 370 clippingBounds.move(-delta.x(), -delta.y());
371 371
372 layerBounds.intersect(pixelSnappedIntRect(clippingBounds)); 372 layerBounds.intersect(clippingBounds);
373 m_boundsConstrainedByClipping = true; 373 m_boundsConstrainedByClipping = true;
374 } else { 374 } else {
375 m_boundsConstrainedByClipping = false; 375 m_boundsConstrainedByClipping = false;
376 } 376 }
377 377
378 // If the element has a transform-origin that has fixed lengths, and the ren derer has zero size, 378 // If the element has a transform-origin that has fixed lengths, and the ren derer has zero size,
379 // then we need to ensure that the compositing layer has non-zero size so th at we can apply 379 // then we need to ensure that the compositing layer has non-zero size so th at we can apply
380 // the transform-origin via the GraphicsLayer anchorPoint (which is expresse d as a fractional value). 380 // the transform-origin via the GraphicsLayer anchorPoint (which is expresse d as a fractional value).
381 if (layerBounds.isEmpty() && hasNonZeroTransformOrigin(renderer())) { 381 if (layerBounds.isEmpty() && hasNonZeroTransformOrigin(renderer())) {
382 layerBounds.setWidth(1); 382 layerBounds.setWidth(1);
383 layerBounds.setHeight(1); 383 layerBounds.setHeight(1);
384 m_artificiallyInflatedBounds = true; 384 m_artificiallyInflatedBounds = true;
385 } else { 385 } else {
386 m_artificiallyInflatedBounds = false; 386 m_artificiallyInflatedBounds = false;
387 } 387 }
388 388
389 setCompositedBounds(layerBounds); 389 setCompositedBounds(layerBounds);
390 } 390 }
391 391
392 void CompositedLayerMapping::updateAfterWidgetResize() 392 void CompositedLayerMapping::updateAfterWidgetResize()
393 { 393 {
394 if (renderer()->isRenderPart()) { 394 if (renderer()->isRenderPart()) {
395 if (RenderLayerCompositor* innerCompositor = RenderLayerCompositor::fram eContentsCompositor(toRenderPart(renderer()))) { 395 if (RenderLayerCompositor* innerCompositor = RenderLayerCompositor::fram eContentsCompositor(toRenderPart(renderer()))) {
396 innerCompositor->frameViewDidChangeSize(); 396 innerCompositor->frameViewDidChangeSize();
397 innerCompositor->frameViewDidChangeLocation(contentsBox().location() ); 397 // We can floor this point because our frameviews are always aligned to pixel boundaries.
398 ASSERT(contentsBox().location() == flooredIntPoint(contentsBox().loc ation()));
399 innerCompositor->frameViewDidChangeLocation(flooredIntPoint(contents Box().location()));
398 } 400 }
399 } 401 }
400 } 402 }
401 403
402 void CompositedLayerMapping::updateCompositingReasons() 404 void CompositedLayerMapping::updateCompositingReasons()
403 { 405 {
404 // All other layers owned by this mapping will have the same compositing rea son 406 // All other layers owned by this mapping will have the same compositing rea son
405 // for their lifetime, so they are initialized only when created. 407 // for their lifetime, so they are initialized only when created.
406 m_graphicsLayer->setCompositingReasons(m_owningLayer->compositingReasons()); 408 m_graphicsLayer->setCompositingReasons(m_owningLayer->compositingReasons());
407 } 409 }
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after
538 LayoutRect result = PaintInfo::infiniteRect(); 540 LayoutRect result = PaintInfo::infiniteRect();
539 if (renderer->hasOverflowClip()) 541 if (renderer->hasOverflowClip())
540 result = renderer->overflowClipRect(LayoutPoint(), 0); // FIXME: Incorre ct for CSS regions. 542 result = renderer->overflowClipRect(LayoutPoint(), 0); // FIXME: Incorre ct for CSS regions.
541 543
542 if (renderer->hasClip()) 544 if (renderer->hasClip())
543 result.intersect(renderer->clipRect(LayoutPoint(), 0)); // FIXME: Incorr ect for CSS regions. 545 result.intersect(renderer->clipRect(LayoutPoint(), 0)); // FIXME: Incorr ect for CSS regions.
544 546
545 return pixelSnappedIntRect(result); 547 return pixelSnappedIntRect(result);
546 } 548 }
547 549
550 void CompositedLayerMapping::adjustBoundsForSubPixelAccumulation(const RenderLay er* compositedAncestor, IntRect& localBounds, IntRect& relativeBounds, IntPoint& delta)
551 {
552 LayoutRect localRawCompositingBounds = compositedBounds();
553 LayoutPoint rawDelta;
554 m_owningLayer->convertToLayerCoords(compositedAncestor, rawDelta);
555 delta = flooredIntPoint(rawDelta);
556 m_subpixelAccumulation = toLayoutSize(rawDelta).fraction();
557 RELEASE_ASSERT(m_subpixelAccumulation.width() < 1 && m_subpixelAccumulation. height() < 1);
558
559 // Move the bounds by the subpixel accumulation so that it pixel-snaps relat ive to absolute pixels instead of local coordinates.
560 localRawCompositingBounds.move(m_subpixelAccumulation);
561 localBounds = pixelSnappedIntRect(localRawCompositingBounds);
562
563 relativeBounds = localBounds;
564 relativeBounds.moveBy(delta);
565 }
566
548 void CompositedLayerMapping::updateGraphicsLayerGeometry() 567 void CompositedLayerMapping::updateGraphicsLayerGeometry()
549 { 568 {
550 // If we haven't built z-order lists yet, wait until later. 569 // If we haven't built z-order lists yet, wait until later.
551 if (m_owningLayer->stackingNode()->isStackingContainer() && m_owningLayer->s tackingNode()->zOrderListsDirty()) 570 if (m_owningLayer->stackingNode()->isStackingContainer() && m_owningLayer->s tackingNode()->zOrderListsDirty())
552 return; 571 return;
553 572
554 // Set transform property, if it is not animating. We have to do this here b ecause the transform 573 // Set transform property, if it is not animating. We have to do this here b ecause the transform
555 // is affected by the layer dimensions. 574 // is affected by the layer dimensions.
556 if (RuntimeEnabledFeatures::webAnimationsCSSEnabled() 575 if (RuntimeEnabledFeatures::webAnimationsCSSEnabled()
557 ? !hasActiveAnimationsOnCompositor(*renderer(), CSSPropertyWebkitTransfo rm) 576 ? !hasActiveAnimationsOnCompositor(*renderer(), CSSPropertyWebkitTransfo rm)
(...skipping 29 matching lines...) Expand all
587 606
588 RenderLayer* compAncestor = m_owningLayer->ancestorCompositingLayer(); 607 RenderLayer* compAncestor = m_owningLayer->ancestorCompositingLayer();
589 608
590 // We compute everything relative to the enclosing compositing layer. 609 // We compute everything relative to the enclosing compositing layer.
591 IntRect ancestorCompositingBounds; 610 IntRect ancestorCompositingBounds;
592 if (compAncestor) { 611 if (compAncestor) {
593 ASSERT(compAncestor->hasCompositedLayerMapping()); 612 ASSERT(compAncestor->hasCompositedLayerMapping());
594 ancestorCompositingBounds = pixelSnappedIntRect(compAncestor->composited LayerMapping()->compositedBounds()); 613 ancestorCompositingBounds = pixelSnappedIntRect(compAncestor->composited LayerMapping()->compositedBounds());
595 } 614 }
596 615
597 IntRect localCompositingBounds = pixelSnappedIntRect(compositedBounds()); 616 IntRect localCompositingBounds;
598 617 IntRect relativeCompositingBounds;
599 IntRect relativeCompositingBounds(localCompositingBounds);
600 IntPoint delta; 618 IntPoint delta;
601 m_owningLayer->convertToPixelSnappedLayerCoords(compAncestor, delta); 619 adjustBoundsForSubPixelAccumulation(compAncestor, localCompositingBounds, re lativeCompositingBounds, delta);
602 relativeCompositingBounds.moveBy(delta);
603 620
604 IntPoint graphicsLayerParentLocation; 621 IntPoint graphicsLayerParentLocation;
605 if (compAncestor && compAncestor->compositedLayerMapping()->hasClippingLayer ()) { 622 if (compAncestor && compAncestor->compositedLayerMapping()->hasClippingLayer ()) {
606 // If the compositing ancestor has a layer to clip children, we parent i n that, and therefore 623 // If the compositing ancestor has a layer to clip children, we parent i n that, and therefore
607 // position relative to it. 624 // position relative to it.
608 IntRect clippingBox = clipBox(toRenderBox(compAncestor->renderer())); 625 IntRect clippingBox = clipBox(toRenderBox(compAncestor->renderer()));
609 graphicsLayerParentLocation = clippingBox.location(); 626 graphicsLayerParentLocation = clippingBox.location();
610 } else if (compAncestor) { 627 } else if (compAncestor) {
611 graphicsLayerParentLocation = ancestorCompositingBounds.location(); 628 graphicsLayerParentLocation = ancestorCompositingBounds.location();
612 } else { 629 } else {
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
672 m_maskLayer->setNeedsDisplay(); 689 m_maskLayer->setNeedsDisplay();
673 } 690 }
674 m_maskLayer->setPosition(FloatPoint()); 691 m_maskLayer->setPosition(FloatPoint());
675 m_maskLayer->setOffsetFromRenderer(m_graphicsLayer->offsetFromRenderer() ); 692 m_maskLayer->setOffsetFromRenderer(m_graphicsLayer->offsetFromRenderer() );
676 } 693 }
677 694
678 if (m_owningLayer->hasTransform()) { 695 if (m_owningLayer->hasTransform()) {
679 const IntRect borderBox = toRenderBox(renderer())->pixelSnappedBorderBox Rect(); 696 const IntRect borderBox = toRenderBox(renderer())->pixelSnappedBorderBox Rect();
680 697
681 // Get layout bounds in the coords of compAncestor to match relativeComp ositingBounds. 698 // Get layout bounds in the coords of compAncestor to match relativeComp ositingBounds.
682 IntRect layerBounds = IntRect(delta, borderBox.size()); 699 IntRect layerBounds(delta, borderBox.size());
683 700
684 // Update properties that depend on layer dimensions 701 // Update properties that depend on layer dimensions
685 FloatPoint3D transformOrigin = computeTransformOrigin(borderBox); 702 FloatPoint3D transformOrigin = computeTransformOrigin(borderBox);
686 // Compute the anchor point, which is in the center of the renderer box unless transform-origin is set. 703 // Compute the anchor point, which is in the center of the renderer box unless transform-origin is set.
687 FloatPoint3D anchor(relativeCompositingBounds.width() != 0.0f ? ((layerB ounds.x() - relativeCompositingBounds.x()) + transformOrigin.x()) / relativeComp ositingBounds.width() : 0.5f, 704 FloatPoint3D anchor(relativeCompositingBounds.width() != 0.0f ? ((layerB ounds.x() - relativeCompositingBounds.x()) + transformOrigin.x()) / relativeComp ositingBounds.width() : 0.5f,
688 relativeCompositingBounds.height() != 0.0f ? ((layerBounds.y() - rel ativeCompositingBounds.y()) + transformOrigin.y()) / relativeCompositingBounds.h eight() : 0.5f, 705 relativeCompositingBounds.height() != 0.0f ? ((layerBounds.y() - rel ativeCompositingBounds.y()) + transformOrigin.y()) / relativeCompositingBounds.h eight() : 0.5f,
689 transformOrigin.z()); 706 transformOrigin.z());
690 m_graphicsLayer->setAnchorPoint(anchor); 707 m_graphicsLayer->setAnchorPoint(anchor);
691 708
692 RenderStyle* style = renderer()->style(); 709 RenderStyle* style = renderer()->style();
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
757 774
758 if (m_scrollingLayer) { 775 if (m_scrollingLayer) {
759 ASSERT(m_scrollingContentsLayer); 776 ASSERT(m_scrollingContentsLayer);
760 RenderBox* renderBox = toRenderBox(renderer()); 777 RenderBox* renderBox = toRenderBox(renderer());
761 IntRect clientBox = enclosingIntRect(renderBox->clientBoxRect()); 778 IntRect clientBox = enclosingIntRect(renderBox->clientBoxRect());
762 // FIXME: We should make RenderBox::clientBoxRect consider scrollbar pla cement. 779 // FIXME: We should make RenderBox::clientBoxRect consider scrollbar pla cement.
763 if (style->shouldPlaceBlockDirectionScrollbarOnLogicalLeft()) 780 if (style->shouldPlaceBlockDirectionScrollbarOnLogicalLeft())
764 clientBox.move(renderBox->verticalScrollbarWidth(), 0); 781 clientBox.move(renderBox->verticalScrollbarWidth(), 0);
765 782
766 IntSize adjustedScrollOffset = m_owningLayer->scrollableArea()->adjusted ScrollOffset(); 783 IntSize adjustedScrollOffset = m_owningLayer->scrollableArea()->adjusted ScrollOffset();
767 m_scrollingLayer->setPosition(FloatPoint(clientBox.location() - localCom positingBounds.location())); 784 m_scrollingLayer->setPosition(FloatPoint(clientBox.location() - localCom positingBounds.location() + roundedIntSize(m_subpixelAccumulation)));
768 m_scrollingLayer->setSize(clientBox.size()); 785 m_scrollingLayer->setSize(clientBox.size());
769 786
770 IntSize oldScrollingLayerOffset = m_scrollingLayer->offsetFromRenderer() ; 787 IntSize oldScrollingLayerOffset = m_scrollingLayer->offsetFromRenderer() ;
771 m_scrollingLayer->setOffsetFromRenderer(-toIntSize(clientBox.location()) ); 788 m_scrollingLayer->setOffsetFromRenderer(-toIntSize(clientBox.location()) );
772 789
773 if (m_childClippingMaskLayer) { 790 if (m_childClippingMaskLayer) {
774 m_childClippingMaskLayer->setPosition(m_scrollingLayer->position()); 791 m_childClippingMaskLayer->setPosition(m_scrollingLayer->position());
775 m_childClippingMaskLayer->setSize(m_scrollingLayer->size()); 792 m_childClippingMaskLayer->setSize(m_scrollingLayer->size());
776 m_childClippingMaskLayer->setOffsetFromRenderer(toIntSize(clientBox. location())); 793 m_childClippingMaskLayer->setOffsetFromRenderer(toIntSize(clientBox. location()));
777 } 794 }
(...skipping 22 matching lines...) Expand all
800 if (m_foregroundLayer->size() != m_scrollingContentsLayer->size()) 817 if (m_foregroundLayer->size() != m_scrollingContentsLayer->size())
801 m_foregroundLayer->setSize(m_scrollingContentsLayer->size()); 818 m_foregroundLayer->setSize(m_scrollingContentsLayer->size());
802 m_foregroundLayer->setNeedsDisplay(); 819 m_foregroundLayer->setNeedsDisplay();
803 m_foregroundLayer->setOffsetFromRenderer(m_scrollingContentsLayer->o ffsetFromRenderer()); 820 m_foregroundLayer->setOffsetFromRenderer(m_scrollingContentsLayer->o ffsetFromRenderer());
804 } 821 }
805 } 822 }
806 823
807 if (m_squashingLayer) { 824 if (m_squashingLayer) {
808 ASSERT(compositor()->layerSquashingEnabled()); 825 ASSERT(compositor()->layerSquashingEnabled());
809 826
810 IntRect totalSquashBounds; 827 LayoutRect totalSquashBounds;
811 for (size_t i = 0; i < m_squashedLayers.size(); ++i) { 828 for (size_t i = 0; i < m_squashedLayers.size(); ++i) {
812 IntRect squashedBounds = compositor()->calculateCompositedBounds(m_s quashedLayers[i].renderLayer, m_squashedLayers[i].renderLayer); 829 LayoutRect squashedBounds = compositor()->calculateCompositedBounds( m_squashedLayers[i].renderLayer, m_squashedLayers[i].renderLayer);
813 830
814 // Store the composited bounds before applying the offset. 831 // Store the composited bounds before applying the offset.
815 // FIXME: consider whether it is more efficient or clarifies the mat h to store the compositedBounds after applying the offset. 832 // FIXME: consider whether it is more efficient or clarifies the mat h to store the compositedBounds after applying the offset.
816 m_squashedLayers[i].compositedBounds = squashedBounds; 833 m_squashedLayers[i].compositedBounds = squashedBounds;
817 834
818 squashedBounds.move(m_squashedLayers[i].offsetFromBackingRoot); 835 squashedBounds.move(m_squashedLayers[i].offsetFromBackingRoot);
819 totalSquashBounds.unite(squashedBounds); 836 totalSquashBounds.unite(squashedBounds);
820 } 837 }
821 838
822 IntPoint squashLayerPosition; 839 IntPoint squashLayerPosition;
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after
934 m_squashingContainmentLayer->addChild(m_ancestorClippingLayer.get()) ; 951 m_squashingContainmentLayer->addChild(m_ancestorClippingLayer.get()) ;
935 else 952 else
936 m_squashingContainmentLayer->addChild(m_graphicsLayer.get()); 953 m_squashingContainmentLayer->addChild(m_graphicsLayer.get());
937 954
938 m_squashingContainmentLayer->addChild(m_squashingLayer.get()); 955 m_squashingContainmentLayer->addChild(m_squashingLayer.get());
939 } 956 }
940 } 957 }
941 958
942 void CompositedLayerMapping::updateContentsRect(bool isSimpleContainer) 959 void CompositedLayerMapping::updateContentsRect(bool isSimpleContainer)
943 { 960 {
944 IntRect contentsRect; 961 LayoutRect contentsRect;
945 if (isSimpleContainer && renderer()->hasBackground()) 962 if (isSimpleContainer && renderer()->hasBackground())
946 contentsRect = backgroundBox(); 963 contentsRect = backgroundBox();
947 else 964 else
948 contentsRect = contentsBox(); 965 contentsRect = contentsBox();
949 966
950 m_graphicsLayer->setContentsRect(contentsRect); 967 m_graphicsLayer->setContentsRect(pixelSnappedIntRect(contentsRect));
951 } 968 }
952 969
953 void CompositedLayerMapping::updateDrawsContent(bool isSimpleContainer) 970 void CompositedLayerMapping::updateDrawsContent(bool isSimpleContainer)
954 { 971 {
955 if (m_scrollingLayer) { 972 if (m_scrollingLayer) {
956 // We don't have to consider overflow controls, because we know that the scrollbars are drawn elsewhere. 973 // We don't have to consider overflow controls, because we know that the scrollbars are drawn elsewhere.
957 // m_graphicsLayer only needs backing store if the non-scrolling parts ( background, outlines, borders, shadows etc) need to paint. 974 // m_graphicsLayer only needs backing store if the non-scrolling parts ( background, outlines, borders, shadows etc) need to paint.
958 // m_scrollingLayer never has backing store. 975 // m_scrollingLayer never has backing store.
959 // m_scrollingContentsLayer only needs backing store if the scrolled con tents need to paint. 976 // m_scrollingContentsLayer only needs backing store if the scrolled con tents need to paint.
960 bool hasNonScrollingPaintedContent = m_owningLayer->hasVisibleContent() && m_owningLayer->hasBoxDecorationsOrBackground(); 977 bool hasNonScrollingPaintedContent = m_owningLayer->hasVisibleContent() && m_owningLayer->hasBoxDecorationsOrBackground();
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after
1067 scrollingCoordinator->scrollableAreaScrollbarLayerDidChange(m_owning Layer->scrollableArea(), HorizontalScrollbar); 1084 scrollingCoordinator->scrollableAreaScrollbarLayerDidChange(m_owning Layer->scrollableArea(), HorizontalScrollbar);
1068 if (verticalScrollbarLayerChanged) 1085 if (verticalScrollbarLayerChanged)
1069 scrollingCoordinator->scrollableAreaScrollbarLayerDidChange(m_owning Layer->scrollableArea(), VerticalScrollbar); 1086 scrollingCoordinator->scrollableAreaScrollbarLayerDidChange(m_owning Layer->scrollableArea(), VerticalScrollbar);
1070 } 1087 }
1071 1088
1072 return horizontalScrollbarLayerChanged || verticalScrollbarLayerChanged || s crollCornerLayerChanged; 1089 return horizontalScrollbarLayerChanged || verticalScrollbarLayerChanged || s crollCornerLayerChanged;
1073 } 1090 }
1074 1091
1075 void CompositedLayerMapping::positionOverflowControlsLayers(const IntSize& offse tFromRoot) 1092 void CompositedLayerMapping::positionOverflowControlsLayers(const IntSize& offse tFromRoot)
1076 { 1093 {
1077 IntSize offsetFromRenderer = m_graphicsLayer->offsetFromRenderer(); 1094 IntSize offsetFromRenderer = m_graphicsLayer->offsetFromRenderer() - rounded IntSize(m_subpixelAccumulation);
1078 if (GraphicsLayer* layer = layerForHorizontalScrollbar()) { 1095 if (GraphicsLayer* layer = layerForHorizontalScrollbar()) {
1079 Scrollbar* hBar = m_owningLayer->scrollableArea()->horizontalScrollbar() ; 1096 Scrollbar* hBar = m_owningLayer->scrollableArea()->horizontalScrollbar() ;
1080 if (hBar) { 1097 if (hBar) {
1081 layer->setPosition(hBar->frameRect().location() - offsetFromRoot - o ffsetFromRenderer); 1098 layer->setPosition(hBar->frameRect().location() - offsetFromRoot - o ffsetFromRenderer);
1082 layer->setSize(hBar->frameRect().size()); 1099 layer->setSize(hBar->frameRect().size());
1083 if (layer->hasContentsLayer()) 1100 if (layer->hasContentsLayer())
1084 layer->setContentsRect(IntRect(IntPoint(), hBar->frameRect().siz e())); 1101 layer->setContentsRect(IntRect(IntPoint(), hBar->frameRect().siz e()));
1085 } 1102 }
1086 layer->setDrawsContent(hBar && !layer->hasContentsLayer()); 1103 layer->setDrawsContent(hBar && !layer->hasContentsLayer());
1087 } 1104 }
(...skipping 550 matching lines...) Expand 10 before | Expand all | Expand 10 after
1638 float boxHeight = borderBox.height(); 1655 float boxHeight = borderBox.height();
1639 1656
1640 FloatPoint origin; 1657 FloatPoint origin;
1641 origin.setX(floatValueForLength(style->perspectiveOriginX(), boxWidth)); 1658 origin.setX(floatValueForLength(style->perspectiveOriginX(), boxWidth));
1642 origin.setY(floatValueForLength(style->perspectiveOriginY(), boxHeight)); 1659 origin.setY(floatValueForLength(style->perspectiveOriginY(), boxHeight));
1643 1660
1644 return origin; 1661 return origin;
1645 } 1662 }
1646 1663
1647 // Return the offset from the top-left of this compositing layer at which the re nderer's contents are painted. 1664 // Return the offset from the top-left of this compositing layer at which the re nderer's contents are painted.
1648 IntSize CompositedLayerMapping::contentOffsetInCompostingLayer() const 1665 LayoutSize CompositedLayerMapping::contentOffsetInCompostingLayer() const
1649 { 1666 {
1650 return IntSize(-m_compositedBounds.x(), -m_compositedBounds.y()); 1667 return LayoutSize(-m_compositedBounds.x(), -m_compositedBounds.y());
1651 } 1668 }
1652 1669
1653 IntRect CompositedLayerMapping::contentsBox() const 1670 LayoutRect CompositedLayerMapping::contentsBox() const
1654 { 1671 {
1655 IntRect contentsBox = contentsRect(renderer()); 1672 LayoutRect contentsBox = contentsRect(renderer());
1656 contentsBox.move(contentOffsetInCompostingLayer()); 1673 contentsBox.move(contentOffsetInCompostingLayer());
1657 return contentsBox; 1674 return contentsBox;
1658 } 1675 }
1659 1676
1660 IntRect CompositedLayerMapping::backgroundBox() const 1677 IntRect CompositedLayerMapping::backgroundBox() const
1661 { 1678 {
1662 IntRect backgroundBox = backgroundRect(renderer()); 1679 LayoutRect backgroundBox = backgroundRect(renderer());
1663 backgroundBox.move(contentOffsetInCompostingLayer()); 1680 backgroundBox.move(contentOffsetInCompostingLayer());
1664 return backgroundBox; 1681 return pixelSnappedIntRect(backgroundBox);
1665 } 1682 }
1666 1683
1667 GraphicsLayer* CompositedLayerMapping::parentForSublayers() const 1684 GraphicsLayer* CompositedLayerMapping::parentForSublayers() const
1668 { 1685 {
1669 if (m_scrollingContentsLayer) 1686 if (m_scrollingContentsLayer)
1670 return m_scrollingContentsLayer.get(); 1687 return m_scrollingContentsLayer.get();
1671 1688
1672 return m_childContainmentLayer ? m_childContainmentLayer.get() : m_graphicsL ayer.get(); 1689 return m_childContainmentLayer ? m_childContainmentLayer.get() : m_graphicsL ayer.get();
1673 } 1690 }
1674 1691
(...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after
1829 paintFlags |= (PaintLayerPaintingRootBackgroundOnly | PaintLayerPainting CompositingForegroundPhase); // Need PaintLayerPaintingCompositingForegroundPhas e to walk child layers. 1846 paintFlags |= (PaintLayerPaintingRootBackgroundOnly | PaintLayerPainting CompositingForegroundPhase); // Need PaintLayerPaintingCompositingForegroundPhas e to walk child layers.
1830 else if (compositor()->fixedRootBackgroundLayer()) 1847 else if (compositor()->fixedRootBackgroundLayer())
1831 paintFlags |= PaintLayerPaintingSkipRootBackground; 1848 paintFlags |= PaintLayerPaintingSkipRootBackground;
1832 1849
1833 // Note carefully: in theory it is appropriate to invoke context->save() her e 1850 // Note carefully: in theory it is appropriate to invoke context->save() her e
1834 // and restore the context after painting. For efficiency, we are assuming t hat 1851 // and restore the context after painting. For efficiency, we are assuming t hat
1835 // it is equivalent to manually undo this offset translation, which means we are 1852 // it is equivalent to manually undo this offset translation, which means we are
1836 // assuming that the context's space was not affected by the RenderLayer 1853 // assuming that the context's space was not affected by the RenderLayer
1837 // painting code. 1854 // painting code.
1838 1855
1839 LayoutSize offset = paintInfo.offsetFromRenderer; 1856 IntSize offset = paintInfo.offsetFromRenderer;
1840 context->translate(-offset); 1857 context->translate(-offset);
1841 LayoutRect relativeClip(clip);
1842 relativeClip.move(offset);
1843 1858
1844 // The dirtyRect is in the coords of the painting root. 1859 // The dirtyRect is in the coords of the painting root.
1845 IntRect dirtyRect = pixelSnappedIntRect(relativeClip); 1860 IntRect dirtyRect(clip);
1846 if (!(paintInfo.paintingPhase & GraphicsLayerPaintOverflowContents)) 1861 dirtyRect.move(offset);
1847 dirtyRect.intersect(paintInfo.compositedBounds); 1862
1863 if (!(paintInfo.paintingPhase & GraphicsLayerPaintOverflowContents)) {
1864 LayoutRect bounds = paintInfo.compositedBounds;
1865 bounds.move(m_subpixelAccumulation);
1866 dirtyRect.intersect(pixelSnappedIntRect(bounds));
1867 } else {
1868 dirtyRect.move(roundedIntSize(m_subpixelAccumulation));
1869 }
1848 1870
1849 #ifndef NDEBUG 1871 #ifndef NDEBUG
1850 paintInfo.renderLayer->renderer()->assertSubtreeIsLaidOut(); 1872 paintInfo.renderLayer->renderer()->assertSubtreeIsLaidOut();
1851 #endif 1873 #endif
1852 1874
1853 if (paintInfo.renderLayer->compositingState() != PaintsIntoGroupedBacking) { 1875 if (paintInfo.renderLayer->compositingState() != PaintsIntoGroupedBacking) {
1854 // FIXME: GraphicsLayers need a way to split for RenderRegions. 1876 // FIXME: GraphicsLayers need a way to split for RenderRegions.
1855 LayerPaintingInfo paintingInfo(paintInfo.renderLayer, dirtyRect, PaintBe haviorNormal, LayoutSize()); 1877 LayerPaintingInfo paintingInfo(paintInfo.renderLayer, dirtyRect, PaintBe haviorNormal, m_subpixelAccumulation);
1856 paintInfo.renderLayer->paintLayerContents(context, paintingInfo, paintFl ags); 1878 paintInfo.renderLayer->paintLayerContents(context, paintingInfo, paintFl ags);
1857 1879
1858 ASSERT(!paintInfo.isBackgroundLayer || paintFlags & PaintLayerPaintingRo otBackgroundOnly); 1880 ASSERT(!paintInfo.isBackgroundLayer || paintFlags & PaintLayerPaintingRo otBackgroundOnly);
1859 1881
1860 if (paintInfo.renderLayer->containsDirtyOverlayScrollbars()) 1882 if (paintInfo.renderLayer->containsDirtyOverlayScrollbars())
1861 paintInfo.renderLayer->paintLayerContents(context, paintingInfo, pai ntFlags | PaintLayerPaintingOverlayScrollbars); 1883 paintInfo.renderLayer->paintLayerContents(context, paintingInfo, pai ntFlags | PaintLayerPaintingOverlayScrollbars);
1862 } else { 1884 } else {
1863 ASSERT(compositor()->layerSquashingEnabled()); 1885 ASSERT(compositor()->layerSquashingEnabled());
1864 LayerPaintingInfo paintingInfo(paintInfo.renderLayer, dirtyRect, PaintBe haviorNormal, LayoutSize()); 1886 LayerPaintingInfo paintingInfo(paintInfo.renderLayer, dirtyRect, PaintBe haviorNormal, LayoutSize());
1865 paintInfo.renderLayer->paintLayer(context, paintingInfo, paintFlags); 1887 paintInfo.renderLayer->paintLayer(context, paintingInfo, paintFlags);
(...skipping 210 matching lines...) Expand 10 before | Expand all | Expand 10 after
2076 } 2098 }
2077 2099
2078 void CompositedLayerMapping::notifyAnimationStarted(const GraphicsLayer*, double wallClockTime, double monotonicTime) 2100 void CompositedLayerMapping::notifyAnimationStarted(const GraphicsLayer*, double wallClockTime, double monotonicTime)
2079 { 2101 {
2080 if (RuntimeEnabledFeatures::webAnimationsCSSEnabled()) 2102 if (RuntimeEnabledFeatures::webAnimationsCSSEnabled())
2081 renderer()->node()->document().cssPendingAnimations().notifyCompositorAn imationStarted(monotonicTime); 2103 renderer()->node()->document().cssPendingAnimations().notifyCompositorAn imationStarted(monotonicTime);
2082 else 2104 else
2083 renderer()->animation().notifyAnimationStarted(renderer(), wallClockTime ); 2105 renderer()->animation().notifyAnimationStarted(renderer(), wallClockTime );
2084 } 2106 }
2085 2107
2086 IntRect CompositedLayerMapping::compositedBounds() const 2108 LayoutRect CompositedLayerMapping::compositedBounds() const
2087 { 2109 {
2088 return m_compositedBounds; 2110 return m_compositedBounds;
2089 } 2111 }
2090 2112
2091 void CompositedLayerMapping::setCompositedBounds(const IntRect& bounds) 2113 void CompositedLayerMapping::setCompositedBounds(const LayoutRect& bounds)
2092 { 2114 {
2093 m_compositedBounds = bounds; 2115 m_compositedBounds = bounds;
2094 } 2116 }
2095 2117
2096 void CompositedLayerMapping::addRenderLayerToSquashingGraphicsLayer(RenderLayer* layer, IntSize offsetFromTargetBacking, size_t nextSquashedLayerIndex) 2118 void CompositedLayerMapping::addRenderLayerToSquashingGraphicsLayer(RenderLayer* layer, IntSize offsetFromTargetBacking, size_t nextSquashedLayerIndex)
2097 { 2119 {
2098 ASSERT(compositor()->layerSquashingEnabled()); 2120 ASSERT(compositor()->layerSquashingEnabled());
2099 2121
2100 GraphicsLayerPaintInfo paintInfo; 2122 GraphicsLayerPaintInfo paintInfo;
2101 paintInfo.renderLayer = layer; 2123 paintInfo.renderLayer = layer;
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
2202 } else if (graphicsLayer == m_scrollingContentsLayer.get()) { 2224 } else if (graphicsLayer == m_scrollingContentsLayer.get()) {
2203 name = "Scrolling Contents Layer"; 2225 name = "Scrolling Contents Layer";
2204 } else { 2226 } else {
2205 ASSERT_NOT_REACHED(); 2227 ASSERT_NOT_REACHED();
2206 } 2228 }
2207 2229
2208 return name; 2230 return name;
2209 } 2231 }
2210 2232
2211 } // namespace WebCore 2233 } // namespace WebCore
OLDNEW
« no previous file with comments | « Source/core/rendering/CompositedLayerMapping.h ('k') | Source/core/rendering/FilterEffectRenderer.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698