Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 /* | 1 /* |
| 2 * Copyright (C) 2004, 2005, 2007, 2008 Nikolas Zimmermann <zimmermann@kde.org> | 2 * Copyright (C) 2004, 2005, 2007, 2008 Nikolas Zimmermann <zimmermann@kde.org> |
| 3 * Copyright (C) 2004, 2005, 2006, 2007, 2008 Rob Buis <buis@kde.org> | 3 * Copyright (C) 2004, 2005, 2006, 2007, 2008 Rob Buis <buis@kde.org> |
| 4 * Copyright (C) Research In Motion Limited 2009-2010. All rights reserved. | 4 * Copyright (C) Research In Motion Limited 2009-2010. All rights reserved. |
| 5 * Copyright (C) 2011 Dirk Schulze <krit@webkit.org> | 5 * Copyright (C) 2011 Dirk Schulze <krit@webkit.org> |
| 6 * | 6 * |
| 7 * This library is free software; you can redistribute it and/or | 7 * This library is free software; you can redistribute it and/or |
| 8 * modify it under the terms of the GNU Library General Public | 8 * modify it under the terms of the GNU Library General Public |
| 9 * License as published by the Free Software Foundation; either | 9 * License as published by the Free Software Foundation; either |
| 10 * version 2 of the License, or (at your option) any later version. | 10 * version 2 of the License, or (at your option) any later version. |
| (...skipping 14 matching lines...) Expand all Loading... | |
| 25 | 25 |
| 26 #include "core/SVGNames.h" | 26 #include "core/SVGNames.h" |
| 27 #include "core/dom/ElementTraversal.h" | 27 #include "core/dom/ElementTraversal.h" |
| 28 #include "core/layout/HitTestResult.h" | 28 #include "core/layout/HitTestResult.h" |
| 29 #include "core/layout/svg/SVGLayoutSupport.h" | 29 #include "core/layout/svg/SVGLayoutSupport.h" |
| 30 #include "core/layout/svg/SVGResources.h" | 30 #include "core/layout/svg/SVGResources.h" |
| 31 #include "core/layout/svg/SVGResourcesCache.h" | 31 #include "core/layout/svg/SVGResourcesCache.h" |
| 32 #include "core/paint/CompositingRecorder.h" | 32 #include "core/paint/CompositingRecorder.h" |
| 33 #include "core/paint/PaintInfo.h" | 33 #include "core/paint/PaintInfo.h" |
| 34 #include "core/paint/TransformRecorder.h" | 34 #include "core/paint/TransformRecorder.h" |
| 35 #include "core/svg/SVGGeometryElement.h" | |
| 35 #include "core/svg/SVGUseElement.h" | 36 #include "core/svg/SVGUseElement.h" |
| 36 #include "platform/RuntimeEnabledFeatures.h" | 37 #include "platform/RuntimeEnabledFeatures.h" |
| 37 #include "platform/graphics/paint/ClipPathDisplayItem.h" | 38 #include "platform/graphics/paint/ClipPathDisplayItem.h" |
| 38 #include "platform/graphics/paint/CompositingDisplayItem.h" | 39 #include "platform/graphics/paint/CompositingDisplayItem.h" |
| 39 #include "platform/graphics/paint/DisplayItemList.h" | 40 #include "platform/graphics/paint/DisplayItemList.h" |
| 40 #include "platform/graphics/paint/DrawingDisplayItem.h" | 41 #include "platform/graphics/paint/DrawingDisplayItem.h" |
| 41 #include "platform/graphics/paint/SkPictureBuilder.h" | 42 #include "platform/graphics/paint/SkPictureBuilder.h" |
| 42 #include "third_party/skia/include/core/SkPicture.h" | 43 #include "third_party/skia/include/core/SkPicture.h" |
| 43 #include "third_party/skia/include/pathops/SkPathOps.h" | 44 #include "third_party/skia/include/pathops/SkPathOps.h" |
| 44 | 45 |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 79 | 80 |
| 80 for (SVGElement* childElement = Traversal<SVGElement>::firstChild(*element() ); childElement; childElement = Traversal<SVGElement>::nextSibling(*childElement )) { | 81 for (SVGElement* childElement = Traversal<SVGElement>::firstChild(*element() ); childElement; childElement = Traversal<SVGElement>::nextSibling(*childElement )) { |
| 81 LayoutObject* childLayoutObject = childElement->layoutObject(); | 82 LayoutObject* childLayoutObject = childElement->layoutObject(); |
| 82 if (!childLayoutObject) | 83 if (!childLayoutObject) |
| 83 continue; | 84 continue; |
| 84 // Only shapes or paths are supported for direct clipping. We need to fa llback to masking for texts. | 85 // Only shapes or paths are supported for direct clipping. We need to fa llback to masking for texts. |
| 85 if (childLayoutObject->isSVGText()) | 86 if (childLayoutObject->isSVGText()) |
| 86 return false; | 87 return false; |
| 87 if (!childElement->isSVGGraphicsElement()) | 88 if (!childElement->isSVGGraphicsElement()) |
| 88 continue; | 89 continue; |
| 89 SVGGraphicsElement* styled = toSVGGraphicsElement(childElement); | 90 SVGGraphicsElement* styled = toSVGGraphicsElement(childElement); |
|
fs
2015/06/22 10:57:44
Could drop this variable, and just use |childEleme
| |
| 90 const ComputedStyle* style = childLayoutObject->style(); | 91 const ComputedStyle* style = childLayoutObject->style(); |
| 91 if (!style || style->display() == NONE || style->visibility() != VISIBLE ) | 92 if (!style || style->display() == NONE || style->visibility() != VISIBLE ) |
| 92 continue; | 93 continue; |
| 93 const SVGComputedStyle& svgStyle = style->svgStyle(); | 94 const SVGComputedStyle& svgStyle = style->svgStyle(); |
| 94 // Current shape in clip-path gets clipped too. Fallback to masking. | 95 // Current shape in clip-path gets clipped too. Fallback to masking. |
| 95 if (!svgStyle.clipperResource().isEmpty()) | 96 if (!svgStyle.clipperResource().isEmpty()) |
| 96 return false; | 97 return false; |
| 97 | 98 |
| 98 // First clip shape. | 99 // First clip shape. |
| 99 if (clipPath.isEmpty()) { | 100 if (clipPath.isEmpty()) { |
| 100 styled->toClipPath(clipPath); | 101 if (isSVGGeometryElement(styled)) |
| 102 toSVGGeometryElement(styled)->toClipPath(clipPath); | |
| 103 else if (isSVGUseElement(styled)) | |
| 104 toSVGUseElement(styled)->toClipPath(clipPath); | |
| 101 | 105 |
| 102 continue; | 106 continue; |
| 103 } | 107 } |
| 104 | 108 |
| 105 // Multiple shapes require PathOps. | 109 // Multiple shapes require PathOps. |
| 106 if (!RuntimeEnabledFeatures::pathOpsSVGClippingEnabled()) | 110 if (!RuntimeEnabledFeatures::pathOpsSVGClippingEnabled()) |
| 107 return false; | 111 return false; |
| 108 | 112 |
| 109 // Second clip shape => start using the builder. | 113 // Second clip shape => start using the builder. |
| 110 if (!usingBuilder) { | 114 if (!usingBuilder) { |
| 111 clipPathBuilder.add(clipPath.skPath(), kUnion_SkPathOp); | 115 clipPathBuilder.add(clipPath.skPath(), kUnion_SkPathOp); |
| 112 usingBuilder = true; | 116 usingBuilder = true; |
| 113 } | 117 } |
| 114 | 118 |
| 115 Path subPath; | 119 Path subPath; |
| 116 styled->toClipPath(subPath); | 120 if (isSVGGeometryElement(styled)) |
| 121 toSVGGeometryElement(styled)->toClipPath(subPath); | |
| 122 else if (isSVGUseElement(styled)) | |
| 123 toSVGUseElement(styled)->toClipPath(subPath); | |
| 124 | |
| 117 clipPathBuilder.add(subPath.skPath(), kUnion_SkPathOp); | 125 clipPathBuilder.add(subPath.skPath(), kUnion_SkPathOp); |
| 118 } | 126 } |
| 119 | 127 |
| 120 if (usingBuilder) { | 128 if (usingBuilder) { |
| 121 SkPath resolvedPath; | 129 SkPath resolvedPath; |
| 122 clipPathBuilder.resolve(&resolvedPath); | 130 clipPathBuilder.resolve(&resolvedPath); |
| 123 clipPath = resolvedPath; | 131 clipPath = resolvedPath; |
| 124 } | 132 } |
| 125 | 133 |
| 126 // We are able to represent the clip as a path. Continue with direct clippin g, | 134 // We are able to represent the clip as a path. Continue with direct clippin g, |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 172 LayoutObject* layoutObject = childElement->layoutObject(); | 180 LayoutObject* layoutObject = childElement->layoutObject(); |
| 173 if (!layoutObject) | 181 if (!layoutObject) |
| 174 continue; | 182 continue; |
| 175 | 183 |
| 176 const ComputedStyle* style = layoutObject->style(); | 184 const ComputedStyle* style = layoutObject->style(); |
| 177 if (!style || style->display() == NONE || style->visibility() != VISIBLE ) | 185 if (!style || style->display() == NONE || style->visibility() != VISIBLE ) |
| 178 continue; | 186 continue; |
| 179 | 187 |
| 180 bool isUseElement = isSVGUseElement(*childElement); | 188 bool isUseElement = isSVGUseElement(*childElement); |
| 181 if (isUseElement) { | 189 if (isUseElement) { |
| 182 layoutObject = toSVGUseElement(*childElement).layoutObjectClipChild( ); | 190 const SVGGraphicsElement* clippingElement = toSVGUseElement(*childEl ement).targetGraphicsElementForClipping(); |
| 191 if (!clippingElement) { | |
| 192 layoutObject = nullptr; | |
|
fs
2015/06/22 10:57:44
This is a dead store (layoutObject will go out of
| |
| 193 continue; | |
| 194 } | |
| 195 layoutObject = clippingElement->layoutObject(); | |
| 183 if (!layoutObject) | 196 if (!layoutObject) |
| 184 continue; | 197 continue; |
| 185 } | 198 } |
| 186 | 199 |
| 187 // Only shapes, paths and texts are allowed for clipping. | 200 // Only shapes, paths and texts are allowed for clipping. |
| 188 if (!layoutObject->isSVGShape() && !layoutObject->isSVGText()) | 201 if (!layoutObject->isSVGShape() && !layoutObject->isSVGText()) |
| 189 continue; | 202 continue; |
| 190 | 203 |
| 191 if (isUseElement) | 204 if (isUseElement) |
| 192 layoutObject = childElement->layoutObject(); | 205 layoutObject = childElement->layoutObject(); |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 269 AffineTransform transform; | 282 AffineTransform transform; |
| 270 transform.translate(objectBoundingBox.x(), objectBoundingBox.y()); | 283 transform.translate(objectBoundingBox.x(), objectBoundingBox.y()); |
| 271 transform.scaleNonUniform(objectBoundingBox.width(), objectBoundingBox.h eight()); | 284 transform.scaleNonUniform(objectBoundingBox.width(), objectBoundingBox.h eight()); |
| 272 return transform.mapRect(m_clipBoundaries); | 285 return transform.mapRect(m_clipBoundaries); |
| 273 } | 286 } |
| 274 | 287 |
| 275 return m_clipBoundaries; | 288 return m_clipBoundaries; |
| 276 } | 289 } |
| 277 | 290 |
| 278 } | 291 } |
| OLD | NEW |