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 208 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
219 // - fill-opacity/stroke-opacity/opacity set to 1 | 219 // - fill-opacity/stroke-opacity/opacity set to 1 |
220 // - masker/filter not applied when rendering the children | 220 // - masker/filter not applied when rendering the children |
221 // - fill is set to the initial fill paint server (solid, black) | 221 // - fill is set to the initial fill paint server (solid, black) |
222 // - stroke is set to the initial stroke paint server (none) | 222 // - stroke is set to the initial stroke paint server (none) |
223 PaintBehavior oldBehavior = frame()->view()->paintBehavior(); | 223 PaintBehavior oldBehavior = frame()->view()->paintBehavior(); |
224 frame()->view()->setPaintBehavior(oldBehavior | PaintBehaviorRenderingSVGMas
k); | 224 frame()->view()->setPaintBehavior(oldBehavior | PaintBehaviorRenderingSVGMas
k); |
225 | 225 |
226 // Draw all clipPath children into a global mask. | 226 // Draw all clipPath children into a global mask. |
227 for (Node* childNode = node()->firstChild(); childNode; childNode = childNod
e->nextSibling()) { | 227 for (Node* childNode = node()->firstChild(); childNode; childNode = childNod
e->nextSibling()) { |
228 RenderObject* renderer = childNode->renderer(); | 228 RenderObject* renderer = childNode->renderer(); |
229 if (!childNode->isSVGElement() || !toSVGElement(childNode)->isSVGStyledE
lement() || !renderer) | 229 if (!childNode->isSVGElement() || !renderer) |
230 continue; | 230 continue; |
231 if (renderer->needsLayout()) { | 231 if (renderer->needsLayout()) { |
232 frame()->view()->setPaintBehavior(oldBehavior); | 232 frame()->view()->setPaintBehavior(oldBehavior); |
233 return false; | 233 return false; |
234 } | 234 } |
235 RenderStyle* style = renderer->style(); | 235 RenderStyle* style = renderer->style(); |
236 if (!style || style->display() == NONE || style->visibility() != VISIBLE
) | 236 if (!style || style->display() == NONE || style->visibility() != VISIBLE
) |
237 continue; | 237 continue; |
238 | 238 |
239 WindRule newClipRule = style->svgStyle()->clipRule(); | 239 WindRule newClipRule = style->svgStyle()->clipRule(); |
(...skipping 21 matching lines...) Expand all Loading... |
261 | 261 |
262 frame()->view()->setPaintBehavior(oldBehavior); | 262 frame()->view()->setPaintBehavior(oldBehavior); |
263 return true; | 263 return true; |
264 } | 264 } |
265 | 265 |
266 void RenderSVGResourceClipper::calculateClipContentRepaintRect() | 266 void RenderSVGResourceClipper::calculateClipContentRepaintRect() |
267 { | 267 { |
268 // This is a rough heuristic to appraise the clip size and doesn't consider
clip on clip. | 268 // This is a rough heuristic to appraise the clip size and doesn't consider
clip on clip. |
269 for (Node* childNode = node()->firstChild(); childNode; childNode = childNod
e->nextSibling()) { | 269 for (Node* childNode = node()->firstChild(); childNode; childNode = childNod
e->nextSibling()) { |
270 RenderObject* renderer = childNode->renderer(); | 270 RenderObject* renderer = childNode->renderer(); |
271 if (!childNode->isSVGElement() || !toSVGElement(childNode)->isSVGStyledE
lement() || !renderer) | 271 if (!childNode->isSVGElement() || !renderer) |
272 continue; | 272 continue; |
273 if (!renderer->isSVGShape() && !renderer->isSVGText() && !childNode->has
TagName(SVGNames::useTag)) | 273 if (!renderer->isSVGShape() && !renderer->isSVGText() && !childNode->has
TagName(SVGNames::useTag)) |
274 continue; | 274 continue; |
275 RenderStyle* style = renderer->style(); | 275 RenderStyle* style = renderer->style(); |
276 if (!style || style->display() == NONE || style->visibility() != VISIBLE
) | 276 if (!style || style->display() == NONE || style->visibility() != VISIBLE
) |
277 continue; | 277 continue; |
278 m_clipBoundaries.unite(renderer->localToParentTransform().mapRect(render
er->repaintRectInLocalCoordinates())); | 278 m_clipBoundaries.unite(renderer->localToParentTransform().mapRect(render
er->repaintRectInLocalCoordinates())); |
279 } | 279 } |
280 m_clipBoundaries = static_cast<SVGClipPathElement*>(node())->animatedLocalTr
ansform().mapRect(m_clipBoundaries); | 280 m_clipBoundaries = static_cast<SVGClipPathElement*>(node())->animatedLocalTr
ansform().mapRect(m_clipBoundaries); |
281 } | 281 } |
282 | 282 |
283 bool RenderSVGResourceClipper::hitTestClipContent(const FloatRect& objectBoundin
gBox, const FloatPoint& nodeAtPoint) | 283 bool RenderSVGResourceClipper::hitTestClipContent(const FloatRect& objectBoundin
gBox, const FloatPoint& nodeAtPoint) |
284 { | 284 { |
285 FloatPoint point = nodeAtPoint; | 285 FloatPoint point = nodeAtPoint; |
286 if (!SVGRenderSupport::pointInClippingArea(this, point)) | 286 if (!SVGRenderSupport::pointInClippingArea(this, point)) |
287 return false; | 287 return false; |
288 | 288 |
289 SVGClipPathElement* clipPathElement = static_cast<SVGClipPathElement*>(node(
)); | 289 SVGClipPathElement* clipPathElement = static_cast<SVGClipPathElement*>(node(
)); |
290 if (clipPathElement->clipPathUnitsCurrentValue() == SVGUnitTypes::SVG_UNIT_T
YPE_OBJECTBOUNDINGBOX) { | 290 if (clipPathElement->clipPathUnitsCurrentValue() == SVGUnitTypes::SVG_UNIT_T
YPE_OBJECTBOUNDINGBOX) { |
291 AffineTransform transform; | 291 AffineTransform transform; |
292 transform.translate(objectBoundingBox.x(), objectBoundingBox.y()); | 292 transform.translate(objectBoundingBox.x(), objectBoundingBox.y()); |
293 transform.scaleNonUniform(objectBoundingBox.width(), objectBoundingBox.h
eight()); | 293 transform.scaleNonUniform(objectBoundingBox.width(), objectBoundingBox.h
eight()); |
294 point = transform.inverse().mapPoint(point); | 294 point = transform.inverse().mapPoint(point); |
295 } | 295 } |
296 | 296 |
297 point = clipPathElement->animatedLocalTransform().inverse().mapPoint(point); | 297 point = clipPathElement->animatedLocalTransform().inverse().mapPoint(point); |
298 | 298 |
299 for (Node* childNode = node()->firstChild(); childNode; childNode = childNod
e->nextSibling()) { | 299 for (Node* childNode = node()->firstChild(); childNode; childNode = childNod
e->nextSibling()) { |
300 RenderObject* renderer = childNode->renderer(); | 300 RenderObject* renderer = childNode->renderer(); |
301 if (!childNode->isSVGElement() || !toSVGElement(childNode)->isSVGStyledE
lement() || !renderer) | 301 if (!childNode->isSVGElement() || !renderer) |
302 continue; | 302 continue; |
303 if (!renderer->isSVGShape() && !renderer->isSVGText() && !childNode->has
TagName(SVGNames::useTag)) | 303 if (!renderer->isSVGShape() && !renderer->isSVGText() && !childNode->has
TagName(SVGNames::useTag)) |
304 continue; | 304 continue; |
305 IntPoint hitPoint; | 305 IntPoint hitPoint; |
306 HitTestResult result(hitPoint); | 306 HitTestResult result(hitPoint); |
307 if (renderer->nodeAtFloatPoint(HitTestRequest(HitTestRequest::SVGClipCon
tent | HitTestRequest::DisallowShadowContent), result, point, HitTestForeground)
) | 307 if (renderer->nodeAtFloatPoint(HitTestRequest(HitTestRequest::SVGClipCon
tent | HitTestRequest::DisallowShadowContent), result, point, HitTestForeground)
) |
308 return true; | 308 return true; |
309 } | 309 } |
310 | 310 |
311 return false; | 311 return false; |
(...skipping 13 matching lines...) Expand all Loading... |
325 AffineTransform transform; | 325 AffineTransform transform; |
326 transform.translate(objectBoundingBox.x(), objectBoundingBox.y()); | 326 transform.translate(objectBoundingBox.x(), objectBoundingBox.y()); |
327 transform.scaleNonUniform(objectBoundingBox.width(), objectBoundingBox.h
eight()); | 327 transform.scaleNonUniform(objectBoundingBox.width(), objectBoundingBox.h
eight()); |
328 return transform.mapRect(m_clipBoundaries); | 328 return transform.mapRect(m_clipBoundaries); |
329 } | 329 } |
330 | 330 |
331 return m_clipBoundaries; | 331 return m_clipBoundaries; |
332 } | 332 } |
333 | 333 |
334 } | 334 } |
OLD | NEW |