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

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

Issue 102123013: Fix painting of fixed background images in composited layers (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: 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) 1999 Lars Knoll (knoll@kde.org) 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
3 * (C) 1999 Antti Koivisto (koivisto@kde.org) 3 * (C) 1999 Antti Koivisto (koivisto@kde.org)
4 * (C) 2005 Allan Sandfeld Jensen (kde@carewolf.com) 4 * (C) 2005 Allan Sandfeld Jensen (kde@carewolf.com)
5 * (C) 2005, 2006 Samuel Weinig (sam.weinig@gmail.com) 5 * (C) 2005, 2006 Samuel Weinig (sam.weinig@gmail.com)
6 * Copyright (C) 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved. 6 * Copyright (C) 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
7 * Copyright (C) 2010 Google Inc. All rights reserved. 7 * Copyright (C) 2010 Google Inc. All rights reserved.
8 * 8 *
9 * This library is free software; you can redistribute it and/or 9 * This library is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU Library General Public 10 * modify it under the terms of the GNU Library General Public
(...skipping 712 matching lines...) Expand 10 before | Expand all | Expand 10 after
723 } 723 }
724 } else if (bgColor.alpha()) { 724 } else if (bgColor.alpha()) {
725 context->fillRect(backgroundRect, bgColor, context->compositeOpe ration()); 725 context->fillRect(backgroundRect, bgColor, context->compositeOpe ration());
726 } 726 }
727 } 727 }
728 } 728 }
729 729
730 // no progressive loading of the background image 730 // no progressive loading of the background image
731 if (shouldPaintBackgroundImage) { 731 if (shouldPaintBackgroundImage) {
732 BackgroundImageGeometry geometry; 732 BackgroundImageGeometry geometry;
733 calculateBackgroundImageGeometry(bgLayer, scrolledPaintRect, geometry, b ackgroundObject); 733 calculateBackgroundImageGeometry(paintInfo.paintContainer(), bgLayer, sc rolledPaintRect, geometry, backgroundObject);
734 geometry.clip(paintInfo.rect); 734 geometry.clip(paintInfo.rect);
735 if (!geometry.destRect().isEmpty()) { 735 if (!geometry.destRect().isEmpty()) {
736 CompositeOperator compositeOp = op == CompositeSourceOver ? bgLayer- >composite() : op; 736 CompositeOperator compositeOp = op == CompositeSourceOver ? bgLayer- >composite() : op;
737 RenderObject* clientForBackgroundImage = backgroundObject ? backgrou ndObject : this; 737 RenderObject* clientForBackgroundImage = backgroundObject ? backgrou ndObject : this;
738 RefPtr<Image> image = bgImage->image(clientForBackgroundImage, geome try.tileSize()); 738 RefPtr<Image> image = bgImage->image(clientForBackgroundImage, geome try.tileSize());
739 bool useLowQualityScaling = shouldPaintAtLowQuality(context, image.g et(), bgLayer, geometry.tileSize()); 739 bool useLowQualityScaling = shouldPaintAtLowQuality(context, image.g et(), bgLayer, geometry.tileSize());
740 if (bgLayer->maskSourceType() == MaskLuminance) 740 if (bgLayer->maskSourceType() == MaskLuminance)
741 context->setColorFilter(ColorFilterLuminanceToAlpha); 741 context->setColorFilter(ColorFilterLuminanceToAlpha);
742 context->drawTiledImage(image.get(), geometry.destRect(), geometry.r elativePhase(), geometry.tileSize(), 742 context->drawTiledImage(image.get(), geometry.destRect(), geometry.r elativePhase(), geometry.tileSize(),
743 compositeOp, useLowQualityScaling, bgLayer->blendMode(), geometr y.spaceSize()); 743 compositeOp, useLowQualityScaling, bgLayer->blendMode(), geometr y.spaceSize());
(...skipping 245 matching lines...) Expand 10 before | Expand all | Expand 10 after
989 { 989 {
990 int numberOfTiles = areaSize / tileSize; 990 int numberOfTiles = areaSize / tileSize;
991 int space = -1; 991 int space = -1;
992 992
993 if (numberOfTiles > 1) 993 if (numberOfTiles > 1)
994 space = lroundf((float)(areaSize - numberOfTiles * tileSize) / (numberOf Tiles - 1)); 994 space = lroundf((float)(areaSize - numberOfTiles * tileSize) / (numberOf Tiles - 1));
995 995
996 return space; 996 return space;
997 } 997 }
998 998
999 void RenderBoxModelObject::calculateBackgroundImageGeometry(const FillLayer* fil lLayer, const LayoutRect& paintRect, 999 void RenderBoxModelObject::calculateBackgroundImageGeometry(const RenderLayerMod elObject* paintContainer, const FillLayer* fillLayer, const LayoutRect& paintRec t,
1000 BackgroundImageGeometry& geometry, RenderObject* backgroundObject) 1000 BackgroundImageGeometry& geometry, RenderObject* backgroundObject) const
1001 { 1001 {
1002 LayoutUnit left = 0; 1002 LayoutUnit left = 0;
1003 LayoutUnit top = 0; 1003 LayoutUnit top = 0;
1004 IntSize positioningAreaSize; 1004 IntSize positioningAreaSize;
1005 IntRect snappedPaintRect = pixelSnappedIntRect(paintRect); 1005 IntRect snappedPaintRect = pixelSnappedIntRect(paintRect);
1006 1006
1007 // Determine the background positioning area and set destRect to the backgro und painting area. 1007 // Determine the background positioning area and set destRect to the backgro und painting area.
1008 // destRect will be adjusted later if the background is non-repeating. 1008 // destRect will be adjusted later if the background is non-repeating.
1009 // FIXME: transforms spec says that fixed backgrounds behave like scroll ins ide transforms.
1009 bool fixedAttachment = fillLayer->attachment() == FixedBackgroundAttachment; 1010 bool fixedAttachment = fillLayer->attachment() == FixedBackgroundAttachment;
1010 1011
1011 #if ENABLE(FAST_MOBILE_SCROLLING) 1012 #if ENABLE(FAST_MOBILE_SCROLLING)
1012 if (view()->frameView() && view()->frameView()->canBlitOnScroll()) { 1013 if (view()->frameView() && view()->frameView()->canBlitOnScroll()) {
1013 // As a side effect of an optimization to blit on scroll, we do not hono r the CSS 1014 // As a side effect of an optimization to blit on scroll, we do not hono r the CSS
1014 // property "background-attachment: fixed" because it may result in rend ering 1015 // property "background-attachment: fixed" because it may result in rend ering
1015 // artifacts. Note, these artifacts only appear if we are blitting on sc roll of 1016 // artifacts. Note, these artifacts only appear if we are blitting on sc roll of
1016 // a page that has fixed background images. 1017 // a page that has fixed background images.
1017 fixedAttachment = false; 1018 fixedAttachment = false;
1018 } 1019 }
(...skipping 21 matching lines...) Expand all
1040 // The background of the box generated by the root element covers the en tire canvas including 1041 // The background of the box generated by the root element covers the en tire canvas including
1041 // its margins. Since those were added in already, we have to factor the m out when computing 1042 // its margins. Since those were added in already, we have to factor the m out when computing
1042 // the background positioning area. 1043 // the background positioning area.
1043 if (isRoot()) { 1044 if (isRoot()) {
1044 positioningAreaSize = pixelSnappedIntSize(toRenderBox(this)->size() - LayoutSize(left + right, top + bottom), toRenderBox(this)->location()); 1045 positioningAreaSize = pixelSnappedIntSize(toRenderBox(this)->size() - LayoutSize(left + right, top + bottom), toRenderBox(this)->location());
1045 left += marginLeft(); 1046 left += marginLeft();
1046 top += marginTop(); 1047 top += marginTop();
1047 } else 1048 } else
1048 positioningAreaSize = pixelSnappedIntSize(paintRect.size() - LayoutS ize(left + right, top + bottom), paintRect.location()); 1049 positioningAreaSize = pixelSnappedIntSize(paintRect.size() - LayoutS ize(left + right, top + bottom), paintRect.location());
1049 } else { 1050 } else {
1051 geometry.setHasNonLocalGeometry();
1052
1050 IntRect viewportRect = pixelSnappedIntRect(viewRect()); 1053 IntRect viewportRect = pixelSnappedIntRect(viewRect());
1051 if (fixedBackgroundPaintsInLocalCoordinates()) 1054 if (fixedBackgroundPaintsInLocalCoordinates())
1052 viewportRect.setLocation(IntPoint()); 1055 viewportRect.setLocation(IntPoint());
1053 else if (FrameView* frameView = view()->frameView()) 1056 else if (FrameView* frameView = view()->frameView())
1054 viewportRect.setLocation(IntPoint(frameView->scrollOffsetForFixedPos ition())); 1057 viewportRect.setLocation(IntPoint(frameView->scrollOffsetForFixedPos ition()));
1055 1058
1059 if (paintContainer) {
1060 IntPoint absoluteContainerOffset = roundedIntPoint(paintContainer->l ocalToAbsolute(FloatPoint()));
1061 viewportRect.moveBy(-absoluteContainerOffset);
1062 }
1063
1056 geometry.setDestRect(pixelSnappedIntRect(viewportRect)); 1064 geometry.setDestRect(pixelSnappedIntRect(viewportRect));
1057 positioningAreaSize = geometry.destRect().size(); 1065 positioningAreaSize = geometry.destRect().size();
1058 } 1066 }
1059 1067
1060 RenderObject* clientForBackgroundImage = backgroundObject ? backgroundObject : this; 1068 const RenderObject* clientForBackgroundImage = backgroundObject ? background Object : this;
1061 IntSize fillTileSize = calculateFillTileSize(fillLayer, positioningAreaSize) ; 1069 IntSize fillTileSize = calculateFillTileSize(fillLayer, positioningAreaSize) ;
1062 fillLayer->image()->setContainerSizeForRenderer(clientForBackgroundImage, fi llTileSize, style()->effectiveZoom()); 1070 fillLayer->image()->setContainerSizeForRenderer(clientForBackgroundImage, fi llTileSize, style()->effectiveZoom());
1063 geometry.setTileSize(fillTileSize); 1071 geometry.setTileSize(fillTileSize);
1064 1072
1065 EFillRepeat backgroundRepeatX = fillLayer->repeatX(); 1073 EFillRepeat backgroundRepeatX = fillLayer->repeatX();
1066 EFillRepeat backgroundRepeatY = fillLayer->repeatY(); 1074 EFillRepeat backgroundRepeatY = fillLayer->repeatY();
1067 RenderView* renderView = view(); 1075 RenderView* renderView = view();
1068 int availableWidth = positioningAreaSize.width() - geometry.tileSize().width (); 1076 int availableWidth = positioningAreaSize.width() - geometry.tileSize().width ();
1069 int availableHeight = positioningAreaSize.height() - geometry.tileSize().hei ght(); 1077 int availableHeight = positioningAreaSize.height() - geometry.tileSize().hei ght();
1070 1078
(...skipping 1750 matching lines...) Expand 10 before | Expand all | Expand 10 after
2821 ASSERT(!beforeChild || toBoxModelObject == beforeChild->parent()); 2829 ASSERT(!beforeChild || toBoxModelObject == beforeChild->parent());
2822 for (RenderObject* child = startChild; child && child != endChild; ) { 2830 for (RenderObject* child = startChild; child && child != endChild; ) {
2823 // Save our next sibling as moveChildTo will clear it. 2831 // Save our next sibling as moveChildTo will clear it.
2824 RenderObject* nextSibling = child->nextSibling(); 2832 RenderObject* nextSibling = child->nextSibling();
2825 moveChildTo(toBoxModelObject, child, beforeChild, fullRemoveInsert); 2833 moveChildTo(toBoxModelObject, child, beforeChild, fullRemoveInsert);
2826 child = nextSibling; 2834 child = nextSibling;
2827 } 2835 }
2828 } 2836 }
2829 2837
2830 } // namespace WebCore 2838 } // namespace WebCore
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698