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 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
120 Path subPath; | 120 Path subPath; |
121 styled->toClipPath(subPath); | 121 styled->toClipPath(subPath); |
122 subPath.setWindRule(svgStyle->clipRule()); | 122 subPath.setWindRule(svgStyle->clipRule()); |
123 if (!clipPath.unionPath(subPath)) | 123 if (!clipPath.unionPath(subPath)) |
124 return false; | 124 return false; |
125 } else { | 125 } else { |
126 return false; | 126 return false; |
127 } | 127 } |
128 } | 128 } |
129 // Only one visible shape/path was found. Directly continue clipping and tra
nsform the content to userspace if necessary. | 129 // Only one visible shape/path was found. Directly continue clipping and tra
nsform the content to userspace if necessary. |
130 if (static_cast<SVGClipPathElement*>(node())->clipPathUnitsCurrentValue() ==
SVGUnitTypes::SVG_UNIT_TYPE_OBJECTBOUNDINGBOX) { | 130 if (toSVGClipPathElement(node())->clipPathUnitsCurrentValue() == SVGUnitType
s::SVG_UNIT_TYPE_OBJECTBOUNDINGBOX) { |
131 AffineTransform transform; | 131 AffineTransform transform; |
132 transform.translate(objectBoundingBox.x(), objectBoundingBox.y()); | 132 transform.translate(objectBoundingBox.x(), objectBoundingBox.y()); |
133 transform.scaleNonUniform(objectBoundingBox.width(), objectBoundingBox.h
eight()); | 133 transform.scaleNonUniform(objectBoundingBox.width(), objectBoundingBox.h
eight()); |
134 clipPath.transform(transform); | 134 clipPath.transform(transform); |
135 } | 135 } |
136 | 136 |
137 // Transform path by animatedLocalTransform. | 137 // Transform path by animatedLocalTransform. |
138 clipPath.transform(animatedLocalTransform); | 138 clipPath.transform(animatedLocalTransform); |
139 | 139 |
140 // The SVG specification wants us to clip everything, if clip-path doesn't h
ave a child. | 140 // The SVG specification wants us to clip everything, if clip-path doesn't h
ave a child. |
141 if (clipPath.isEmpty()) | 141 if (clipPath.isEmpty()) |
142 clipPath.addRect(FloatRect()); | 142 clipPath.addRect(FloatRect()); |
143 context->clipPath(clipPath, clipRule); | 143 context->clipPath(clipPath, clipRule); |
144 return true; | 144 return true; |
145 } | 145 } |
146 | 146 |
147 bool RenderSVGResourceClipper::applyClippingToContext(RenderObject* object, cons
t FloatRect& objectBoundingBox, | 147 bool RenderSVGResourceClipper::applyClippingToContext(RenderObject* object, cons
t FloatRect& objectBoundingBox, |
148 const FloatRect& repaintRe
ct, GraphicsContext* context) | 148 const FloatRect& repaintRe
ct, GraphicsContext* context) |
149 { | 149 { |
150 bool missingClipperData = !m_clipper.contains(object); | 150 bool missingClipperData = !m_clipper.contains(object); |
151 if (missingClipperData) | 151 if (missingClipperData) |
152 m_clipper.set(object, new ClipperData); | 152 m_clipper.set(object, new ClipperData); |
153 | 153 |
154 bool shouldCreateClipData = false; | 154 bool shouldCreateClipData = false; |
155 AffineTransform animatedLocalTransform = static_cast<SVGClipPathElement*>(no
de())->animatedLocalTransform(); | 155 AffineTransform animatedLocalTransform = toSVGClipPathElement(node())->anima
tedLocalTransform(); |
156 ClipperData* clipperData = m_clipper.get(object); | 156 ClipperData* clipperData = m_clipper.get(object); |
157 if (!clipperData->clipMaskImage) { | 157 if (!clipperData->clipMaskImage) { |
158 if (pathOnlyClipping(context, animatedLocalTransform, objectBoundingBox)
) | 158 if (pathOnlyClipping(context, animatedLocalTransform, objectBoundingBox)
) |
159 return true; | 159 return true; |
160 shouldCreateClipData = true; | 160 shouldCreateClipData = true; |
161 } | 161 } |
162 | 162 |
163 AffineTransform absoluteTransform; | 163 AffineTransform absoluteTransform; |
164 SVGRenderingContext::calculateTransformationToOutermostCoordinateSystem(obje
ct, absoluteTransform); | 164 SVGRenderingContext::calculateTransformationToOutermostCoordinateSystem(obje
ct, absoluteTransform); |
165 | 165 |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
201 bool RenderSVGResourceClipper::drawContentIntoMaskImage(ClipperData* clipperData
, const FloatRect& objectBoundingBox) | 201 bool RenderSVGResourceClipper::drawContentIntoMaskImage(ClipperData* clipperData
, const FloatRect& objectBoundingBox) |
202 { | 202 { |
203 ASSERT(frame()); | 203 ASSERT(frame()); |
204 ASSERT(clipperData); | 204 ASSERT(clipperData); |
205 ASSERT(clipperData->clipMaskImage); | 205 ASSERT(clipperData->clipMaskImage); |
206 | 206 |
207 GraphicsContext* maskContext = clipperData->clipMaskImage->context(); | 207 GraphicsContext* maskContext = clipperData->clipMaskImage->context(); |
208 ASSERT(maskContext); | 208 ASSERT(maskContext); |
209 | 209 |
210 AffineTransform maskContentTransformation; | 210 AffineTransform maskContentTransformation; |
211 SVGClipPathElement* clipPath = static_cast<SVGClipPathElement*>(node()); | 211 if (toSVGClipPathElement(node())->clipPathUnitsCurrentValue() == SVGUnitType
s::SVG_UNIT_TYPE_OBJECTBOUNDINGBOX) { |
212 if (clipPath->clipPathUnitsCurrentValue() == SVGUnitTypes::SVG_UNIT_TYPE_OBJ
ECTBOUNDINGBOX) { | |
213 maskContentTransformation.translate(objectBoundingBox.x(), objectBoundin
gBox.y()); | 212 maskContentTransformation.translate(objectBoundingBox.x(), objectBoundin
gBox.y()); |
214 maskContentTransformation.scaleNonUniform(objectBoundingBox.width(), obj
ectBoundingBox.height()); | 213 maskContentTransformation.scaleNonUniform(objectBoundingBox.width(), obj
ectBoundingBox.height()); |
215 maskContext->concatCTM(maskContentTransformation); | 214 maskContext->concatCTM(maskContentTransformation); |
216 } | 215 } |
217 | 216 |
218 // Switch to a paint behavior where all children of this <clipPath> will be
rendered using special constraints: | 217 // Switch to a paint behavior where all children of this <clipPath> will be
rendered using special constraints: |
219 // - fill-opacity/stroke-opacity/opacity set to 1 | 218 // - fill-opacity/stroke-opacity/opacity set to 1 |
220 // - masker/filter not applied when rendering the children | 219 // - masker/filter not applied when rendering the children |
221 // - fill is set to the initial fill paint server (solid, black) | 220 // - fill is set to the initial fill paint server (solid, black) |
222 // - stroke is set to the initial stroke paint server (none) | 221 // - stroke is set to the initial stroke paint server (none) |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
270 RenderObject* renderer = childNode->renderer(); | 269 RenderObject* renderer = childNode->renderer(); |
271 if (!childNode->isSVGElement() || !renderer) | 270 if (!childNode->isSVGElement() || !renderer) |
272 continue; | 271 continue; |
273 if (!renderer->isSVGShape() && !renderer->isSVGText() && !childNode->has
TagName(SVGNames::useTag)) | 272 if (!renderer->isSVGShape() && !renderer->isSVGText() && !childNode->has
TagName(SVGNames::useTag)) |
274 continue; | 273 continue; |
275 RenderStyle* style = renderer->style(); | 274 RenderStyle* style = renderer->style(); |
276 if (!style || style->display() == NONE || style->visibility() != VISIBLE
) | 275 if (!style || style->display() == NONE || style->visibility() != VISIBLE
) |
277 continue; | 276 continue; |
278 m_clipBoundaries.unite(renderer->localToParentTransform().mapRect(render
er->repaintRectInLocalCoordinates())); | 277 m_clipBoundaries.unite(renderer->localToParentTransform().mapRect(render
er->repaintRectInLocalCoordinates())); |
279 } | 278 } |
280 m_clipBoundaries = static_cast<SVGClipPathElement*>(node())->animatedLocalTr
ansform().mapRect(m_clipBoundaries); | 279 m_clipBoundaries = toSVGClipPathElement(node())->animatedLocalTransform().ma
pRect(m_clipBoundaries); |
281 } | 280 } |
282 | 281 |
283 bool RenderSVGResourceClipper::hitTestClipContent(const FloatRect& objectBoundin
gBox, const FloatPoint& nodeAtPoint) | 282 bool RenderSVGResourceClipper::hitTestClipContent(const FloatRect& objectBoundin
gBox, const FloatPoint& nodeAtPoint) |
284 { | 283 { |
285 FloatPoint point = nodeAtPoint; | 284 FloatPoint point = nodeAtPoint; |
286 if (!SVGRenderSupport::pointInClippingArea(this, point)) | 285 if (!SVGRenderSupport::pointInClippingArea(this, point)) |
287 return false; | 286 return false; |
288 | 287 |
289 SVGClipPathElement* clipPathElement = static_cast<SVGClipPathElement*>(node(
)); | 288 SVGClipPathElement* clipPathElement = toSVGClipPathElement(node()); |
290 if (clipPathElement->clipPathUnitsCurrentValue() == SVGUnitTypes::SVG_UNIT_T
YPE_OBJECTBOUNDINGBOX) { | 289 if (clipPathElement->clipPathUnitsCurrentValue() == SVGUnitTypes::SVG_UNIT_T
YPE_OBJECTBOUNDINGBOX) { |
291 AffineTransform transform; | 290 AffineTransform transform; |
292 transform.translate(objectBoundingBox.x(), objectBoundingBox.y()); | 291 transform.translate(objectBoundingBox.x(), objectBoundingBox.y()); |
293 transform.scaleNonUniform(objectBoundingBox.width(), objectBoundingBox.h
eight()); | 292 transform.scaleNonUniform(objectBoundingBox.width(), objectBoundingBox.h
eight()); |
294 point = transform.inverse().mapPoint(point); | 293 point = transform.inverse().mapPoint(point); |
295 } | 294 } |
296 | 295 |
297 point = clipPathElement->animatedLocalTransform().inverse().mapPoint(point); | 296 point = clipPathElement->animatedLocalTransform().inverse().mapPoint(point); |
298 | 297 |
299 for (Node* childNode = node()->firstChild(); childNode; childNode = childNod
e->nextSibling()) { | 298 for (Node* childNode = node()->firstChild(); childNode; childNode = childNod
e->nextSibling()) { |
(...skipping 13 matching lines...) Expand all Loading... |
313 | 312 |
314 FloatRect RenderSVGResourceClipper::resourceBoundingBox(RenderObject* object) | 313 FloatRect RenderSVGResourceClipper::resourceBoundingBox(RenderObject* object) |
315 { | 314 { |
316 // Resource was not layouted yet. Give back the boundingBox of the object. | 315 // Resource was not layouted yet. Give back the boundingBox of the object. |
317 if (selfNeedsLayout()) | 316 if (selfNeedsLayout()) |
318 return object->objectBoundingBox(); | 317 return object->objectBoundingBox(); |
319 | 318 |
320 if (m_clipBoundaries.isEmpty()) | 319 if (m_clipBoundaries.isEmpty()) |
321 calculateClipContentRepaintRect(); | 320 calculateClipContentRepaintRect(); |
322 | 321 |
323 if (static_cast<SVGClipPathElement*>(node())->clipPathUnitsCurrentValue() ==
SVGUnitTypes::SVG_UNIT_TYPE_OBJECTBOUNDINGBOX) { | 322 if (toSVGClipPathElement(node())->clipPathUnitsCurrentValue() == SVGUnitType
s::SVG_UNIT_TYPE_OBJECTBOUNDINGBOX) { |
324 FloatRect objectBoundingBox = object->objectBoundingBox(); | 323 FloatRect objectBoundingBox = object->objectBoundingBox(); |
325 AffineTransform transform; | 324 AffineTransform transform; |
326 transform.translate(objectBoundingBox.x(), objectBoundingBox.y()); | 325 transform.translate(objectBoundingBox.x(), objectBoundingBox.y()); |
327 transform.scaleNonUniform(objectBoundingBox.width(), objectBoundingBox.h
eight()); | 326 transform.scaleNonUniform(objectBoundingBox.width(), objectBoundingBox.h
eight()); |
328 return transform.mapRect(m_clipBoundaries); | 327 return transform.mapRect(m_clipBoundaries); |
329 } | 328 } |
330 | 329 |
331 return m_clipBoundaries; | 330 return m_clipBoundaries; |
332 } | 331 } |
333 | 332 |
334 } | 333 } |
OLD | NEW |