| OLD | NEW |
| 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 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 42 LayoutSVGRoot::LayoutSVGRoot(SVGElement* node) | 42 LayoutSVGRoot::LayoutSVGRoot(SVGElement* node) |
| 43 : LayoutReplaced(node), | 43 : LayoutReplaced(node), |
| 44 m_objectBoundingBoxValid(false), | 44 m_objectBoundingBoxValid(false), |
| 45 m_isLayoutSizeChanged(false), | 45 m_isLayoutSizeChanged(false), |
| 46 m_didScreenScaleFactorChange(false), | 46 m_didScreenScaleFactorChange(false), |
| 47 m_needsBoundariesOrTransformUpdate(true), | 47 m_needsBoundariesOrTransformUpdate(true), |
| 48 m_hasBoxDecorationBackground(false), | 48 m_hasBoxDecorationBackground(false), |
| 49 m_hasNonIsolatedBlendingDescendants(false), | 49 m_hasNonIsolatedBlendingDescendants(false), |
| 50 m_hasNonIsolatedBlendingDescendantsDirty(false) { | 50 m_hasNonIsolatedBlendingDescendantsDirty(false) { |
| 51 SVGSVGElement* svg = toSVGSVGElement(node); | 51 SVGSVGElement* svg = toSVGSVGElement(node); |
| 52 ASSERT(svg); | 52 DCHECK(svg); |
| 53 | 53 |
| 54 LayoutSize intrinsicSize(svg->intrinsicWidth(), svg->intrinsicHeight()); | 54 LayoutSize intrinsicSize(svg->intrinsicWidth(), svg->intrinsicHeight()); |
| 55 if (!svg->hasIntrinsicWidth()) | 55 if (!svg->hasIntrinsicWidth()) |
| 56 intrinsicSize.setWidth(LayoutUnit(defaultWidth)); | 56 intrinsicSize.setWidth(LayoutUnit(defaultWidth)); |
| 57 if (!svg->hasIntrinsicHeight()) | 57 if (!svg->hasIntrinsicHeight()) |
| 58 intrinsicSize.setHeight(LayoutUnit(defaultHeight)); | 58 intrinsicSize.setHeight(LayoutUnit(defaultHeight)); |
| 59 setIntrinsicSize(intrinsicSize); | 59 setIntrinsicSize(intrinsicSize); |
| 60 } | 60 } |
| 61 | 61 |
| 62 LayoutSVGRoot::~LayoutSVGRoot() {} | 62 LayoutSVGRoot::~LayoutSVGRoot() {} |
| 63 | 63 |
| 64 void LayoutSVGRoot::computeIntrinsicSizingInfo( | 64 void LayoutSVGRoot::computeIntrinsicSizingInfo( |
| 65 IntrinsicSizingInfo& intrinsicSizingInfo) const { | 65 IntrinsicSizingInfo& intrinsicSizingInfo) const { |
| 66 // https://www.w3.org/TR/SVG/coords.html#IntrinsicSizing | 66 // https://www.w3.org/TR/SVG/coords.html#IntrinsicSizing |
| 67 | 67 |
| 68 SVGSVGElement* svg = toSVGSVGElement(node()); | 68 SVGSVGElement* svg = toSVGSVGElement(node()); |
| 69 ASSERT(svg); | 69 DCHECK(svg); |
| 70 | 70 |
| 71 intrinsicSizingInfo.size = | 71 intrinsicSizingInfo.size = |
| 72 FloatSize(svg->intrinsicWidth(), svg->intrinsicHeight()); | 72 FloatSize(svg->intrinsicWidth(), svg->intrinsicHeight()); |
| 73 intrinsicSizingInfo.hasWidth = svg->hasIntrinsicWidth(); | 73 intrinsicSizingInfo.hasWidth = svg->hasIntrinsicWidth(); |
| 74 intrinsicSizingInfo.hasHeight = svg->hasIntrinsicHeight(); | 74 intrinsicSizingInfo.hasHeight = svg->hasIntrinsicHeight(); |
| 75 | 75 |
| 76 if (!intrinsicSizingInfo.size.isEmpty()) { | 76 if (!intrinsicSizingInfo.size.isEmpty()) { |
| 77 intrinsicSizingInfo.aspectRatio = intrinsicSizingInfo.size; | 77 intrinsicSizingInfo.aspectRatio = intrinsicSizingInfo.size; |
| 78 } else { | 78 } else { |
| 79 FloatSize viewBoxSize = svg->viewBox()->currentValue()->value().size(); | 79 FloatSize viewBoxSize = svg->viewBox()->currentValue()->value().size(); |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 131 return LayoutUnit(m_containerSize.height()); | 131 return LayoutUnit(m_containerSize.height()); |
| 132 | 132 |
| 133 if (isEmbeddedThroughFrameContainingSVGDocument()) | 133 if (isEmbeddedThroughFrameContainingSVGDocument()) |
| 134 return containingBlock()->availableLogicalHeight( | 134 return containingBlock()->availableLogicalHeight( |
| 135 IncludeMarginBorderPadding); | 135 IncludeMarginBorderPadding); |
| 136 | 136 |
| 137 return LayoutReplaced::computeReplacedLogicalHeight(estimatedUsedWidth); | 137 return LayoutReplaced::computeReplacedLogicalHeight(estimatedUsedWidth); |
| 138 } | 138 } |
| 139 | 139 |
| 140 void LayoutSVGRoot::layout() { | 140 void LayoutSVGRoot::layout() { |
| 141 ASSERT(needsLayout()); | 141 DCHECK(needsLayout()); |
| 142 LayoutAnalyzer::Scope analyzer(*this); | 142 LayoutAnalyzer::Scope analyzer(*this); |
| 143 | 143 |
| 144 LayoutSize oldSize = size(); | 144 LayoutSize oldSize = size(); |
| 145 updateLogicalWidth(); | 145 updateLogicalWidth(); |
| 146 updateLogicalHeight(); | 146 updateLogicalHeight(); |
| 147 | 147 |
| 148 // The local-to-border-box transform is a function with the following as | 148 // The local-to-border-box transform is a function with the following as |
| 149 // input: | 149 // input: |
| 150 // | 150 // |
| 151 // * effective zoom | 151 // * effective zoom |
| (...skipping 20 matching lines...) Expand all Loading... |
| 172 // The scale of one or more of the SVG elements may have changed, content | 172 // The scale of one or more of the SVG elements may have changed, content |
| 173 // (the entire SVG) could have moved or new content may have been exposed, so | 173 // (the entire SVG) could have moved or new content may have been exposed, so |
| 174 // mark the entire subtree as needing paint invalidation checking. | 174 // mark the entire subtree as needing paint invalidation checking. |
| 175 if (transformChange != SVGTransformChange::None || viewportMayHaveChanged) { | 175 if (transformChange != SVGTransformChange::None || viewportMayHaveChanged) { |
| 176 setMayNeedPaintInvalidationSubtree(); | 176 setMayNeedPaintInvalidationSubtree(); |
| 177 if (RuntimeEnabledFeatures::slimmingPaintInvalidationEnabled()) | 177 if (RuntimeEnabledFeatures::slimmingPaintInvalidationEnabled()) |
| 178 setNeedsPaintPropertyUpdate(); | 178 setNeedsPaintPropertyUpdate(); |
| 179 } | 179 } |
| 180 | 180 |
| 181 SVGSVGElement* svg = toSVGSVGElement(node()); | 181 SVGSVGElement* svg = toSVGSVGElement(node()); |
| 182 ASSERT(svg); | 182 DCHECK(svg); |
| 183 // When hasRelativeLengths() is false, no descendants have relative lengths | 183 // When hasRelativeLengths() is false, no descendants have relative lengths |
| 184 // (hence no one is interested in viewport size changes). | 184 // (hence no one is interested in viewport size changes). |
| 185 m_isLayoutSizeChanged = viewportMayHaveChanged && svg->hasRelativeLengths(); | 185 m_isLayoutSizeChanged = viewportMayHaveChanged && svg->hasRelativeLengths(); |
| 186 | 186 |
| 187 SVGLayoutSupport::layoutChildren( | 187 SVGLayoutSupport::layoutChildren( |
| 188 firstChild(), false, m_didScreenScaleFactorChange, m_isLayoutSizeChanged); | 188 firstChild(), false, m_didScreenScaleFactorChange, m_isLayoutSizeChanged); |
| 189 | 189 |
| 190 if (m_needsBoundariesOrTransformUpdate) { | 190 if (m_needsBoundariesOrTransformUpdate) { |
| 191 updateCachedBoundaries(); | 191 updateCachedBoundaries(); |
| 192 m_needsBoundariesOrTransformUpdate = false; | 192 m_needsBoundariesOrTransformUpdate = false; |
| (...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 343 absolutePoint = transform.inverse().mapPoint(absolutePoint); | 343 absolutePoint = transform.inverse().mapPoint(absolutePoint); |
| 344 | 344 |
| 345 return closestDescendant->positionForPoint(LayoutPoint(absolutePoint)); | 345 return closestDescendant->positionForPoint(LayoutPoint(absolutePoint)); |
| 346 } | 346 } |
| 347 | 347 |
| 348 // LayoutBox methods will expect coordinates w/o any transforms in coordinates | 348 // LayoutBox methods will expect coordinates w/o any transforms in coordinates |
| 349 // relative to our borderBox origin. This method gives us exactly that. | 349 // relative to our borderBox origin. This method gives us exactly that. |
| 350 SVGTransformChange LayoutSVGRoot::buildLocalToBorderBoxTransform() { | 350 SVGTransformChange LayoutSVGRoot::buildLocalToBorderBoxTransform() { |
| 351 SVGTransformChangeDetector changeDetector(m_localToBorderBoxTransform); | 351 SVGTransformChangeDetector changeDetector(m_localToBorderBoxTransform); |
| 352 SVGSVGElement* svg = toSVGSVGElement(node()); | 352 SVGSVGElement* svg = toSVGSVGElement(node()); |
| 353 ASSERT(svg); | 353 DCHECK(svg); |
| 354 float scale = style()->effectiveZoom(); | 354 float scale = style()->effectiveZoom(); |
| 355 m_localToBorderBoxTransform = svg->viewBoxToViewTransform( | 355 m_localToBorderBoxTransform = svg->viewBoxToViewTransform( |
| 356 contentWidth() / scale, contentHeight() / scale); | 356 contentWidth() / scale, contentHeight() / scale); |
| 357 | 357 |
| 358 FloatPoint translate = svg->currentTranslate(); | 358 FloatPoint translate = svg->currentTranslate(); |
| 359 LayoutSize borderAndPadding(borderLeft() + paddingLeft(), | 359 LayoutSize borderAndPadding(borderLeft() + paddingLeft(), |
| 360 borderTop() + paddingTop()); | 360 borderTop() + paddingTop()); |
| 361 AffineTransform viewToBorderBoxTransform( | 361 AffineTransform viewToBorderBoxTransform( |
| 362 scale, 0, 0, scale, borderAndPadding.width() + translate.x(), | 362 scale, 0, 0, scale, borderAndPadding.width() + translate.x(), |
| 363 borderAndPadding.height() + translate.y()); | 363 borderAndPadding.height() + translate.y()); |
| (...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 484 if (result.addNodeToListBasedTestResult(node(), locationInContainer, | 484 if (result.addNodeToListBasedTestResult(node(), locationInContainer, |
| 485 boundsRect) == StopHitTesting) | 485 boundsRect) == StopHitTesting) |
| 486 return true; | 486 return true; |
| 487 } | 487 } |
| 488 } | 488 } |
| 489 | 489 |
| 490 return false; | 490 return false; |
| 491 } | 491 } |
| 492 | 492 |
| 493 } // namespace blink | 493 } // namespace blink |
| OLD | NEW |