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

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

Issue 82083002: Move viewport unit resolution to style recalc time (Closed) Base URL: https://chromium.googlesource.com/chromium/blink@master
Patch Set: rebased.. Created 7 years 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
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2004, 2005, 2007 Nikolas Zimmermann <zimmermann@kde.org> 2 * Copyright (C) 2004, 2005, 2007 Nikolas Zimmermann <zimmermann@kde.org>
3 * Copyright (C) 2004, 2005, 2007, 2008, 2009 Rob Buis <buis@kde.org> 3 * Copyright (C) 2004, 2005, 2007, 2008, 2009 Rob Buis <buis@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. 5 * Copyright (C) 2009 Google, Inc.
6 * Copyright (C) Research In Motion Limited 2011. All rights reserved. 6 * Copyright (C) Research In Motion Limited 2011. All rights reserved.
7 * 7 *
8 * This library is free software; you can redistribute it and/or 8 * This library is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Library General Public 9 * modify it under the terms of the GNU Library General Public
10 * License as published by the Free Software Foundation; either 10 * License as published by the Free Software Foundation; either
(...skipping 24 matching lines...) Expand all
35 #include "core/rendering/LayoutRepainter.h" 35 #include "core/rendering/LayoutRepainter.h"
36 #include "core/rendering/RenderPart.h" 36 #include "core/rendering/RenderPart.h"
37 #include "core/rendering/RenderView.h" 37 #include "core/rendering/RenderView.h"
38 #include "core/rendering/svg/RenderSVGResourceContainer.h" 38 #include "core/rendering/svg/RenderSVGResourceContainer.h"
39 #include "core/rendering/svg/SVGRenderingContext.h" 39 #include "core/rendering/svg/SVGRenderingContext.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 "core/svg/SVGSVGElement.h" 43 #include "core/svg/SVGSVGElement.h"
44 #include "core/svg/graphics/SVGImage.h" 44 #include "core/svg/graphics/SVGImage.h"
45 #include "platform/LengthFunctions.h"
45 46
46 using namespace std; 47 using namespace std;
47 48
48 namespace WebCore { 49 namespace WebCore {
49 50
50 RenderSVGRoot::RenderSVGRoot(SVGElement* node) 51 RenderSVGRoot::RenderSVGRoot(SVGElement* node)
51 : RenderReplaced(node) 52 : RenderReplaced(node)
52 , m_objectBoundingBoxValid(false) 53 , m_objectBoundingBoxValid(false)
53 , m_isLayoutSizeChanged(false) 54 , m_isLayoutSizeChanged(false)
54 , m_needsBoundariesOrTransformUpdate(true) 55 , m_needsBoundariesOrTransformUpdate(true)
(...skipping 20 matching lines...) Expand all
75 76
76 // The intrinsic aspect ratio of the viewport of SVG content is necessary fo r example, when including SVG from an ‘object’ 77 // The intrinsic aspect ratio of the viewport of SVG content is necessary fo r example, when including SVG from an ‘object’
77 // element in HTML styled with CSS. It is possible (indeed, common) for an S VG graphic to have an intrinsic aspect ratio but 78 // element in HTML styled with CSS. It is possible (indeed, common) for an S VG graphic to have an intrinsic aspect ratio but
78 // not to have an intrinsic width or height. The intrinsic aspect ratio must be calculated based upon the following rules: 79 // not to have an intrinsic width or height. The intrinsic aspect ratio must be calculated based upon the following rules:
79 // - The aspect ratio is calculated by dividing a width by a height. 80 // - The aspect ratio is calculated by dividing a width by a height.
80 // - If the ‘width’ and ‘height’ of the rootmost ‘svg’ element are both spec ified with unit identifiers (in, mm, cm, pt, pc, 81 // - If the ‘width’ and ‘height’ of the rootmost ‘svg’ element are both spec ified with unit identifiers (in, mm, cm, pt, pc,
81 // px, em, ex) or in user units, then the aspect ratio is calculated from the ‘width’ and ‘height’ attributes after 82 // px, em, ex) or in user units, then the aspect ratio is calculated from the ‘width’ and ‘height’ attributes after
82 // resolving both values to user units. 83 // resolving both values to user units.
83 if (intrinsicWidthAttribute.isFixed() || intrinsicHeightAttribute.isFixed()) { 84 if (intrinsicWidthAttribute.isFixed() || intrinsicHeightAttribute.isFixed()) {
84 if (intrinsicWidthAttribute.isFixed()) 85 if (intrinsicWidthAttribute.isFixed())
85 intrinsicSize.setWidth(floatValueForLength(intrinsicWidthAttribute, 0, 0)); 86 intrinsicSize.setWidth(floatValueForLength(intrinsicWidthAttribute, 0));
86 if (intrinsicHeightAttribute.isFixed()) 87 if (intrinsicHeightAttribute.isFixed())
87 intrinsicSize.setHeight(floatValueForLength(intrinsicHeightAttribute , 0, 0)); 88 intrinsicSize.setHeight(floatValueForLength(intrinsicHeightAttribute , 0));
88 if (!intrinsicSize.isEmpty()) 89 if (!intrinsicSize.isEmpty())
89 intrinsicRatio = intrinsicSize.width() / static_cast<double>(intrins icSize.height()); 90 intrinsicRatio = intrinsicSize.width() / static_cast<double>(intrins icSize.height());
90 return; 91 return;
91 } 92 }
92 93
93 // - If either/both of the ‘width’ and ‘height’ of the rootmost ‘svg’ elemen t are in percentage units (or omitted), the 94 // - If either/both of the ‘width’ and ‘height’ of the rootmost ‘svg’ elemen t are in percentage units (or omitted), the
94 // aspect ratio is calculated from the width and height values of the ‘vie wBox’ specified for the current SVG document 95 // aspect ratio is calculated from the width and height values of the ‘vie wBox’ specified for the current SVG document
95 // fragment. If the ‘viewBox’ is not correctly specified, or set to 'none' , the intrinsic aspect ratio cannot be 96 // fragment. If the ‘viewBox’ is not correctly specified, or set to 'none' , the intrinsic aspect ratio cannot be
96 // calculated and is considered unspecified. 97 // calculated and is considered unspecified.
97 intrinsicSize = svg->viewBoxCurrentValue().size(); 98 intrinsicSize = svg->viewBoxCurrentValue().size();
(...skipping 26 matching lines...) Expand all
124 if (!frame) 125 if (!frame)
125 return false; 126 return false;
126 127
127 // If our frame has an owner renderer, we're embedded through eg. object/emb ed/iframe, 128 // If our frame has an owner renderer, we're embedded through eg. object/emb ed/iframe,
128 // but we only negotiate if we're in an SVG document. 129 // but we only negotiate if we're in an SVG document.
129 if (!frame->ownerRenderer()) 130 if (!frame->ownerRenderer())
130 return false; 131 return false;
131 return frame->document()->isSVGDocument(); 132 return frame->document()->isSVGDocument();
132 } 133 }
133 134
134 static inline LayoutUnit resolveLengthAttributeForSVG(const Length& length, floa t scale, float maxSize, RenderView* renderView) 135 static inline LayoutUnit resolveLengthAttributeForSVG(const Length& length, floa t scale, float maxSize)
135 { 136 {
136 return static_cast<LayoutUnit>(valueForLength(length, maxSize, renderView) * (length.isFixed() ? scale : 1)); 137 return static_cast<LayoutUnit>(valueForLength(length, maxSize) * (length.isF ixed() ? scale : 1));
137 } 138 }
138 139
139 LayoutUnit RenderSVGRoot::computeReplacedLogicalWidth(ShouldComputePreferred sho uldComputePreferred) const 140 LayoutUnit RenderSVGRoot::computeReplacedLogicalWidth(ShouldComputePreferred sho uldComputePreferred) const
140 { 141 {
141 SVGSVGElement* svg = toSVGSVGElement(node()); 142 SVGSVGElement* svg = toSVGSVGElement(node());
142 ASSERT(svg); 143 ASSERT(svg);
143 144
144 // When we're embedded through SVGImage (border-image/background-image/<html :img>/...) we're forced to resize to a specific size. 145 // When we're embedded through SVGImage (border-image/background-image/<html :img>/...) we're forced to resize to a specific size.
145 if (!m_containerSize.isEmpty()) 146 if (!m_containerSize.isEmpty())
146 return m_containerSize.width(); 147 return m_containerSize.width();
147 148
148 if (style()->logicalWidth().isSpecified() || style()->logicalMaxWidth().isSp ecified()) 149 if (style()->logicalWidth().isSpecified() || style()->logicalMaxWidth().isSp ecified())
149 return RenderReplaced::computeReplacedLogicalWidth(shouldComputePreferre d); 150 return RenderReplaced::computeReplacedLogicalWidth(shouldComputePreferre d);
150 151
151 if (svg->widthAttributeEstablishesViewport()) 152 if (svg->widthAttributeEstablishesViewport())
152 return resolveLengthAttributeForSVG(svg->intrinsicWidth(SVGSVGElement::I gnoreCSSProperties), style()->effectiveZoom(), containingBlock()->availableLogic alWidth(), view()); 153 return resolveLengthAttributeForSVG(svg->intrinsicWidth(SVGSVGElement::I gnoreCSSProperties), style()->effectiveZoom(), containingBlock()->availableLogic alWidth());
153 154
154 // SVG embedded through object/embed/iframe. 155 // SVG embedded through object/embed/iframe.
155 if (isEmbeddedThroughFrameContainingSVGDocument()) 156 if (isEmbeddedThroughFrameContainingSVGDocument())
156 return document().frame()->ownerRenderer()->availableLogicalWidth(); 157 return document().frame()->ownerRenderer()->availableLogicalWidth();
157 158
158 // SVG embedded via SVGImage (background-image/border-image/etc) / Inline SV G. 159 // SVG embedded via SVGImage (background-image/border-image/etc) / Inline SV G.
159 return RenderReplaced::computeReplacedLogicalWidth(shouldComputePreferred); 160 return RenderReplaced::computeReplacedLogicalWidth(shouldComputePreferred);
160 } 161 }
161 162
162 LayoutUnit RenderSVGRoot::computeReplacedLogicalHeight() const 163 LayoutUnit RenderSVGRoot::computeReplacedLogicalHeight() const
(...skipping 13 matching lines...) Expand all
176 if (height.isPercent()) { 177 if (height.isPercent()) {
177 RenderBlock* cb = containingBlock(); 178 RenderBlock* cb = containingBlock();
178 ASSERT(cb); 179 ASSERT(cb);
179 while (cb->isAnonymous()) { 180 while (cb->isAnonymous()) {
180 cb = cb->containingBlock(); 181 cb = cb->containingBlock();
181 cb->addPercentHeightDescendant(const_cast<RenderSVGRoot*>(this)) ; 182 cb->addPercentHeightDescendant(const_cast<RenderSVGRoot*>(this)) ;
182 } 183 }
183 } else 184 } else
184 RenderBlock::removePercentHeightDescendant(const_cast<RenderSVGRoot* >(this)); 185 RenderBlock::removePercentHeightDescendant(const_cast<RenderSVGRoot* >(this));
185 186
186 return resolveLengthAttributeForSVG(height, style()->effectiveZoom(), co ntainingBlock()->availableLogicalHeight(IncludeMarginBorderPadding), view()); 187 return resolveLengthAttributeForSVG(height, style()->effectiveZoom(), co ntainingBlock()->availableLogicalHeight(IncludeMarginBorderPadding));
187 } 188 }
188 189
189 // SVG embedded through object/embed/iframe. 190 // SVG embedded through object/embed/iframe.
190 if (isEmbeddedThroughFrameContainingSVGDocument()) 191 if (isEmbeddedThroughFrameContainingSVGDocument())
191 return document().frame()->ownerRenderer()->availableLogicalHeight(Inclu deMarginBorderPadding); 192 return document().frame()->ownerRenderer()->availableLogicalHeight(Inclu deMarginBorderPadding);
192 193
193 // SVG embedded via SVGImage (background-image/border-image/etc) / Inline SV G. 194 // SVG embedded via SVGImage (background-image/border-image/etc) / Inline SV G.
194 return RenderReplaced::computeReplacedLogicalHeight(); 195 return RenderReplaced::computeReplacedLogicalHeight();
195 } 196 }
196 197
(...skipping 251 matching lines...) Expand 10 before | Expand all | Expand 10 after
448 449
449 bool RenderSVGRoot::hasRelativeLogicalHeight() const 450 bool RenderSVGRoot::hasRelativeLogicalHeight() const
450 { 451 {
451 SVGSVGElement* svg = toSVGSVGElement(node()); 452 SVGSVGElement* svg = toSVGSVGElement(node());
452 ASSERT(svg); 453 ASSERT(svg);
453 454
454 return svg->intrinsicHeight(SVGSVGElement::IgnoreCSSProperties).isPercent(); 455 return svg->intrinsicHeight(SVGSVGElement::IgnoreCSSProperties).isPercent();
455 } 456 }
456 457
457 } 458 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698