Chromium Code Reviews

Side by Side Diff: Source/core/rendering/svg/SVGRenderSupport.cpp

Issue 741123002: Get rid of computeFloatRectForPaintInvalidation (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 6 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View unified diff | | Annotate | Revision Log
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2007, 2008 Rob Buis <buis@kde.org> 2 * Copyright (C) 2007, 2008 Rob Buis <buis@kde.org>
3 * Copyright (C) 2007 Nikolas Zimmermann <zimmermann@kde.org> 3 * Copyright (C) 2007 Nikolas Zimmermann <zimmermann@kde.org>
4 * Copyright (C) 2007 Eric Seidel <eric@webkit.org> 4 * Copyright (C) 2007 Eric Seidel <eric@webkit.org>
5 * Copyright (C) 2009 Google, Inc. All rights reserved. 5 * Copyright (C) 2009 Google, Inc. All rights reserved.
6 * Copyright (C) 2009 Dirk Schulze <krit@webkit.org> 6 * Copyright (C) 2009 Dirk Schulze <krit@webkit.org>
7 * Copyright (C) Research In Motion Limited 2009-2010. All rights reserved. 7 * Copyright (C) Research In Motion Limited 2009-2010. 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 26 matching lines...)
37 #include "core/rendering/svg/RenderSVGShape.h" 37 #include "core/rendering/svg/RenderSVGShape.h"
38 #include "core/rendering/svg/RenderSVGText.h" 38 #include "core/rendering/svg/RenderSVGText.h"
39 #include "core/rendering/svg/RenderSVGViewportContainer.h" 39 #include "core/rendering/svg/RenderSVGViewportContainer.h"
40 #include "core/rendering/svg/SVGResources.h" 40 #include "core/rendering/svg/SVGResources.h"
41 #include "core/rendering/svg/SVGResourcesCache.h" 41 #include "core/rendering/svg/SVGResourcesCache.h"
42 #include "core/svg/SVGElement.h" 42 #include "core/svg/SVGElement.h"
43 #include "platform/geometry/TransformState.h" 43 #include "platform/geometry/TransformState.h"
44 44
45 namespace blink { 45 namespace blink {
46 46
47 static inline LayoutRect enclosingIntRectIfNotEmpty(const FloatRect& rect)
48 {
49 if (rect.isEmpty())
50 return LayoutRect();
51 return enclosingIntRect(rect);
52 }
53
47 LayoutRect SVGRenderSupport::clippedOverflowRectForPaintInvalidation(const Rende rObject* object, const RenderLayerModelObject* paintInvalidationContainer, const PaintInvalidationState* paintInvalidationState) 54 LayoutRect SVGRenderSupport::clippedOverflowRectForPaintInvalidation(const Rende rObject* object, const RenderLayerModelObject* paintInvalidationContainer, const PaintInvalidationState* paintInvalidationState)
48 { 55 {
49 // Return early for any cases where we don't actually paint 56 // Return early for any cases where we don't actually paint
50 if (object->style()->visibility() != VISIBLE && !object->enclosingLayer()->h asVisibleContent()) 57 if (object->style()->visibility() != VISIBLE && !object->enclosingLayer()->h asVisibleContent())
51 return LayoutRect(); 58 return LayoutRect();
52 59
53 // Pass our local paint rect to computeRectForPaintInvalidation() which will 60 // Pass our local paint rect to computeRectForPaintInvalidation() which will
54 // map to parent coords and recurse up the parent chain. 61 // map to parent coords and recurse up the parent chain.
55 FloatRect paintInvalidationRect = object->paintInvalidationRectInLocalCoordi nates(); 62 FloatRect paintInvalidationRect = object->paintInvalidationRectInLocalCoordi nates();
56 paintInvalidationRect.inflate(object->style()->outlineWidth()); 63 paintInvalidationRect.inflate(object->style()->outlineWidth());
57 64
58 if (paintInvalidationState && paintInvalidationState->canMapToContainer(pain tInvalidationContainer)) { 65 if (paintInvalidationState && paintInvalidationState->canMapToContainer(pain tInvalidationContainer)) {
59 // Compute accumulated SVG transform and apply to local paint rect. 66 // Compute accumulated SVG transform and apply to local paint rect.
60 AffineTransform transform = paintInvalidationState->svgTransform() * obj ect->localToParentTransform(); 67 AffineTransform transform = paintInvalidationState->svgTransform() * obj ect->localToParentTransform();
61 paintInvalidationRect = transform.mapRect(paintInvalidationRect); 68 paintInvalidationRect = transform.mapRect(paintInvalidationRect);
62 // FIXME: These are quirks carried forward from RenderSVGRoot::computeFl oatRectForPaintInvalidation. 69 // FIXME: These are quirks carried forward from RenderSVGRoot::computeFl oatRectForPaintInvalidation.
pdr. 2014/11/21 08:32:05 This comment is no longer valid (similarly RenderS
fs 2014/11/21 11:23:15 Right. Updated.
63 LayoutRect rect; 70 LayoutRect rect = enclosingIntRectIfNotEmpty(paintInvalidationRect);
64 if (!paintInvalidationRect.isEmpty())
65 rect = enclosingIntRect(paintInvalidationRect);
66 // Offset by SVG root paint offset and apply clipping as needed. 71 // Offset by SVG root paint offset and apply clipping as needed.
67 rect.move(paintInvalidationState->paintOffset()); 72 rect.move(paintInvalidationState->paintOffset());
68 if (paintInvalidationState->isClipped()) 73 if (paintInvalidationState->isClipped())
69 rect.intersect(paintInvalidationState->clipRect()); 74 rect.intersect(paintInvalidationState->clipRect());
70 return rect; 75 return rect;
71 } 76 }
72 77
73 object->computeFloatRectForPaintInvalidation(paintInvalidationContainer, pai ntInvalidationRect, paintInvalidationState); 78 LayoutRect rect;
74 return enclosingLayoutRect(paintInvalidationRect); 79 const RenderSVGRoot* svgRoot = mapRectToSVGRootForPaintInvalidation(object, paintInvalidationRect, rect);
80 svgRoot->mapRectToPaintInvalidationBacking(paintInvalidationContainer, rect, paintInvalidationState);
81 return rect;
75 } 82 }
76 83
77 void SVGRenderSupport::computeFloatRectForPaintInvalidation(const RenderObject* object, const RenderLayerModelObject* paintInvalidationContainer, FloatRect& pai ntInvalidationRect, const PaintInvalidationState* paintInvalidationState) 84 const RenderSVGRoot* SVGRenderSupport::mapRectToSVGRootForPaintInvalidation(cons t RenderObject* object, const FloatRect& localPaintInvalidationRect, LayoutRect& rect)
78 { 85 {
79 // Translate to coords in our parent renderer, and then call computeFloatRec tForPaintInvalidation() on our parent. 86 ASSERT(object && object->isSVG() && !object->isSVGRoot());
80 paintInvalidationRect = object->localToParentTransform().mapRect(paintInvali dationRect); 87
81 object->parent()->computeFloatRectForPaintInvalidation(paintInvalidationCont ainer, paintInvalidationRect, paintInvalidationState); 88 FloatRect paintInvalidationRect = localPaintInvalidationRect;
89 // FIXME: Building the transform to the SVG root border box and then doing
90 // mapRect() with that would be slightly more efficient, but requires some
91 // additions to AffineTransform (preMultiply, preTranslate) to avoid
92 // excessive copying and to get a similar fast-path for translations.
93 const RenderObject* parent = object;
94 do {
95 paintInvalidationRect = parent->localToParentTransform().mapRect(paintIn validationRect);
96 parent = parent->parent();
97 } while (!parent->isSVGRoot());
98
99 const RenderSVGRoot* svgRoot = toRenderSVGRoot(parent);
100
101 paintInvalidationRect = svgRoot->localToBorderBoxTransform().mapRect(paintIn validationRect);
102 rect = enclosingIntRectIfNotEmpty(paintInvalidationRect);
103 return svgRoot;
82 } 104 }
83 105
84 void SVGRenderSupport::mapLocalToContainer(const RenderObject* object, const Ren derLayerModelObject* paintInvalidationContainer, TransformState& transformState, bool* wasFixed, const PaintInvalidationState* paintInvalidationState) 106 void SVGRenderSupport::mapLocalToContainer(const RenderObject* object, const Ren derLayerModelObject* paintInvalidationContainer, TransformState& transformState, bool* wasFixed, const PaintInvalidationState* paintInvalidationState)
85 { 107 {
86 transformState.applyTransform(object->localToParentTransform()); 108 transformState.applyTransform(object->localToParentTransform());
87 109
88 if (paintInvalidationState && paintInvalidationState->canMapToContainer(pain tInvalidationContainer)) { 110 if (paintInvalidationState && paintInvalidationState->canMapToContainer(pain tInvalidationContainer)) {
89 // |svgTransform| contains localToBorderBoxTransform mentioned below. 111 // |svgTransform| contains localToBorderBoxTransform mentioned below.
90 transformState.applyTransform(paintInvalidationState->svgTransform()); 112 transformState.applyTransform(paintInvalidationState->svgTransform());
91 transformState.move(paintInvalidationState->paintOffset()); 113 transformState.move(paintInvalidationState->paintOffset());
(...skipping 330 matching lines...)
422 } 444 }
423 445
424 bool SVGRenderSupport::isRenderableTextNode(const RenderObject* object) 446 bool SVGRenderSupport::isRenderableTextNode(const RenderObject* object)
425 { 447 {
426 ASSERT(object->isText()); 448 ASSERT(object->isText());
427 // <br> is marked as text, but is not handled by the SVG rendering code-path . 449 // <br> is marked as text, but is not handled by the SVG rendering code-path .
428 return object->isSVGInlineText() && !toRenderSVGInlineText(object)->hasEmpty Text(); 450 return object->isSVGInlineText() && !toRenderSVGInlineText(object)->hasEmpty Text();
429 } 451 }
430 452
431 } 453 }
OLDNEW
« Source/core/rendering/svg/SVGRenderSupport.h ('K') | « Source/core/rendering/svg/SVGRenderSupport.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine