OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2007, 2008 Rob Buis <buis@kde.org> | 2 * Copyright (C) 2007, 2008 Rob Buis <buis@kde.org> |
3 * Copyright (C) 2007 Nikolas Zimmermann <zimmermann@kde.org> | 3 * Copyright (C) 2007 Nikolas Zimmermann <zimmermann@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. All rights reserved. | 5 * Copyright (C) 2009 Google, Inc. All rights reserved. |
6 * Copyright (C) 2009 Dirk Schulze <krit@webkit.org> | 6 * Copyright (C) 2009 Dirk Schulze <krit@webkit.org> |
7 * Copyright (C) Research In Motion Limited 2009-2010. All rights reserved. | 7 * Copyright (C) Research In Motion Limited 2009-2010. All rights reserved. |
8 * | 8 * |
9 * This library is free software; you can redistribute it and/or | 9 * This library is free software; you can redistribute it and/or |
10 * modify it under the terms of the GNU Library General Public | 10 * modify it under the terms of the GNU Library General Public |
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
155 } | 155 } |
156 | 156 |
157 void SVGLayoutSupport::mapAncestorToLocal(const LayoutObject& object, | 157 void SVGLayoutSupport::mapAncestorToLocal(const LayoutObject& object, |
158 const LayoutBoxModelObject* ancestor, | 158 const LayoutBoxModelObject* ancestor, |
159 TransformState& transformState, | 159 TransformState& transformState, |
160 MapCoordinatesFlags flags) { | 160 MapCoordinatesFlags flags) { |
161 // |object| is either a LayoutSVGModelObject or a LayoutSVGBlock here. In | 161 // |object| is either a LayoutSVGModelObject or a LayoutSVGBlock here. In |
162 // the former case, |object| can never be an ancestor while in the latter | 162 // the former case, |object| can never be an ancestor while in the latter |
163 // the caller is responsible for doing the ancestor check. Because of this, | 163 // the caller is responsible for doing the ancestor check. Because of this, |
164 // computing the transform to the SVG root is always what we want to do here. | 164 // computing the transform to the SVG root is always what we want to do here. |
165 ASSERT(ancestor != &object); | 165 DCHECK_NE(ancestor, &object); |
166 ASSERT(object.isSVGContainer() || object.isSVGShape() || | 166 DCHECK(object.isSVGContainer() || object.isSVGShape() || |
167 object.isSVGImage() || object.isSVGText() || | 167 object.isSVGImage() || object.isSVGText() || |
168 object.isSVGForeignObject()); | 168 object.isSVGForeignObject()); |
169 AffineTransform localToSVGRoot; | 169 AffineTransform localToSVGRoot; |
170 const LayoutSVGRoot& svgRoot = | 170 const LayoutSVGRoot& svgRoot = |
171 computeTransformToSVGRoot(object, localToSVGRoot); | 171 computeTransformToSVGRoot(object, localToSVGRoot); |
172 | 172 |
173 MapCoordinatesFlags mode = flags | UseTransforms | ApplyContainerFlip; | 173 MapCoordinatesFlags mode = flags | UseTransforms | ApplyContainerFlip; |
174 svgRoot.mapAncestorToLocal(ancestor, transformState, mode); | 174 svgRoot.mapAncestorToLocal(ancestor, transformState, mode); |
175 | 175 |
176 transformState.applyTransform(localToSVGRoot); | 176 transformState.applyTransform(localToSVGRoot); |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
260 | 260 |
261 localVisualRect = strokeBoundingBox; | 261 localVisualRect = strokeBoundingBox; |
262 adjustVisualRectWithResources(container, localVisualRect); | 262 adjustVisualRectWithResources(container, localVisualRect); |
263 } | 263 } |
264 | 264 |
265 const LayoutSVGRoot* SVGLayoutSupport::findTreeRootObject( | 265 const LayoutSVGRoot* SVGLayoutSupport::findTreeRootObject( |
266 const LayoutObject* start) { | 266 const LayoutObject* start) { |
267 while (start && !start->isSVGRoot()) | 267 while (start && !start->isSVGRoot()) |
268 start = start->parent(); | 268 start = start->parent(); |
269 | 269 |
270 ASSERT(start); | 270 DCHECK(start); |
271 ASSERT(start->isSVGRoot()); | 271 DCHECK(start->isSVGRoot()); |
272 return toLayoutSVGRoot(start); | 272 return toLayoutSVGRoot(start); |
273 } | 273 } |
274 | 274 |
275 bool SVGLayoutSupport::layoutSizeOfNearestViewportChanged( | 275 bool SVGLayoutSupport::layoutSizeOfNearestViewportChanged( |
276 const LayoutObject* start) { | 276 const LayoutObject* start) { |
277 for (; start; start = start->parent()) { | 277 for (; start; start = start->parent()) { |
278 if (start->isSVGRoot()) | 278 if (start->isSVGRoot()) |
279 return toLayoutSVGRoot(start)->isLayoutSizeChanged(); | 279 return toLayoutSVGRoot(start)->isLayoutSizeChanged(); |
280 if (start->isSVGViewportContainer()) | 280 if (start->isSVGViewportContainer()) |
281 return toLayoutSVGViewportContainer(start)->isLayoutSizeChanged(); | 281 return toLayoutSVGViewportContainer(start)->isLayoutSizeChanged(); |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
354 layoutScope.setNeedsLayout(child, LayoutInvalidationReason::SvgChanged); | 354 layoutScope.setNeedsLayout(child, LayoutInvalidationReason::SvgChanged); |
355 | 355 |
356 // Lay out any referenced resources before the child. | 356 // Lay out any referenced resources before the child. |
357 layoutResourcesIfNeeded(child); | 357 layoutResourcesIfNeeded(child); |
358 child->layoutIfNeeded(); | 358 child->layoutIfNeeded(); |
359 } | 359 } |
360 } | 360 } |
361 } | 361 } |
362 | 362 |
363 void SVGLayoutSupport::layoutResourcesIfNeeded(const LayoutObject* object) { | 363 void SVGLayoutSupport::layoutResourcesIfNeeded(const LayoutObject* object) { |
364 ASSERT(object); | 364 DCHECK(object); |
365 | 365 |
366 SVGResources* resources = | 366 SVGResources* resources = |
367 SVGResourcesCache::cachedResourcesForLayoutObject(object); | 367 SVGResourcesCache::cachedResourcesForLayoutObject(object); |
368 if (resources) | 368 if (resources) |
369 resources->layoutIfNeeded(); | 369 resources->layoutIfNeeded(); |
370 } | 370 } |
371 | 371 |
372 bool SVGLayoutSupport::isOverflowHidden(const LayoutObject* object) { | 372 bool SVGLayoutSupport::isOverflowHidden(const LayoutObject* object) { |
373 // LayoutSVGRoot should never query for overflow state - it should always clip | 373 // LayoutSVGRoot should never query for overflow state - it should always clip |
374 // itself to the initial viewport size. | 374 // itself to the initial viewport size. |
375 ASSERT(!object->isDocumentElement()); | 375 DCHECK(!object->isDocumentElement()); |
376 | 376 |
377 return object->style()->overflowX() == EOverflow::kHidden || | 377 return object->style()->overflowX() == EOverflow::kHidden || |
378 object->style()->overflowX() == EOverflow::kScroll; | 378 object->style()->overflowX() == EOverflow::kScroll; |
379 } | 379 } |
380 | 380 |
381 void SVGLayoutSupport::adjustVisualRectWithResources( | 381 void SVGLayoutSupport::adjustVisualRectWithResources( |
382 const LayoutObject* layoutObject, | 382 const LayoutObject* layoutObject, |
383 FloatRect& visualRect) { | 383 FloatRect& visualRect) { |
384 ASSERT(layoutObject); | 384 DCHECK(layoutObject); |
385 | 385 |
386 SVGResources* resources = | 386 SVGResources* resources = |
387 SVGResourcesCache::cachedResourcesForLayoutObject(layoutObject); | 387 SVGResourcesCache::cachedResourcesForLayoutObject(layoutObject); |
388 if (!resources) | 388 if (!resources) |
389 return; | 389 return; |
390 | 390 |
391 if (LayoutSVGResourceFilter* filter = resources->filter()) | 391 if (LayoutSVGResourceFilter* filter = resources->filter()) |
392 visualRect = filter->resourceBoundingBox(layoutObject); | 392 visualRect = filter->resourceBoundingBox(layoutObject); |
393 | 393 |
394 if (LayoutSVGResourceClipper* clipper = resources->clipper()) | 394 if (LayoutSVGResourceClipper* clipper = resources->clipper()) |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
442 DashArray dashArray; | 442 DashArray dashArray; |
443 for (const Length& dashLength : svgDashArray.vector()) | 443 for (const Length& dashLength : svgDashArray.vector()) |
444 dashArray.push_back(lengthContext.valueForLength(dashLength, style)); | 444 dashArray.push_back(lengthContext.valueForLength(dashLength, style)); |
445 return dashArray; | 445 return dashArray; |
446 } | 446 } |
447 | 447 |
448 void SVGLayoutSupport::applyStrokeStyleToStrokeData(StrokeData& strokeData, | 448 void SVGLayoutSupport::applyStrokeStyleToStrokeData(StrokeData& strokeData, |
449 const ComputedStyle& style, | 449 const ComputedStyle& style, |
450 const LayoutObject& object, | 450 const LayoutObject& object, |
451 float dashScaleFactor) { | 451 float dashScaleFactor) { |
452 ASSERT(object.node()); | 452 DCHECK(object.node()); |
453 ASSERT(object.node()->isSVGElement()); | 453 DCHECK(object.node()->isSVGElement()); |
454 | 454 |
455 const SVGComputedStyle& svgStyle = style.svgStyle(); | 455 const SVGComputedStyle& svgStyle = style.svgStyle(); |
456 | 456 |
457 SVGLengthContext lengthContext(toSVGElement(object.node())); | 457 SVGLengthContext lengthContext(toSVGElement(object.node())); |
458 strokeData.setThickness(lengthContext.valueForLength(svgStyle.strokeWidth())); | 458 strokeData.setThickness(lengthContext.valueForLength(svgStyle.strokeWidth())); |
459 strokeData.setLineCap(svgStyle.capStyle()); | 459 strokeData.setLineCap(svgStyle.capStyle()); |
460 strokeData.setLineJoin(svgStyle.joinStyle()); | 460 strokeData.setLineJoin(svgStyle.joinStyle()); |
461 strokeData.setMiterLimit(svgStyle.strokeMiterLimit()); | 461 strokeData.setMiterLimit(svgStyle.strokeMiterLimit()); |
462 | 462 |
463 DashArray dashArray = | 463 DashArray dashArray = |
464 resolveSVGDashArray(*svgStyle.strokeDashArray(), style, lengthContext); | 464 resolveSVGDashArray(*svgStyle.strokeDashArray(), style, lengthContext); |
465 float dashOffset = | 465 float dashOffset = |
466 lengthContext.valueForLength(svgStyle.strokeDashOffset(), style); | 466 lengthContext.valueForLength(svgStyle.strokeDashOffset(), style); |
467 // Apply scaling from 'pathLength'. | 467 // Apply scaling from 'pathLength'. |
468 if (dashScaleFactor != 1) { | 468 if (dashScaleFactor != 1) { |
469 ASSERT(dashScaleFactor >= 0); | 469 DCHECK_GE(dashScaleFactor, 0); |
470 dashOffset *= dashScaleFactor; | 470 dashOffset *= dashScaleFactor; |
471 for (auto& dashItem : dashArray) | 471 for (auto& dashItem : dashArray) |
472 dashItem *= dashScaleFactor; | 472 dashItem *= dashScaleFactor; |
473 } | 473 } |
474 strokeData.setLineDash(dashArray, dashOffset); | 474 strokeData.setLineDash(dashArray, dashOffset); |
475 } | 475 } |
476 | 476 |
477 bool SVGLayoutSupport::isLayoutableTextNode(const LayoutObject* object) { | 477 bool SVGLayoutSupport::isLayoutableTextNode(const LayoutObject* object) { |
478 ASSERT(object->isText()); | 478 DCHECK(object->isText()); |
479 // <br> is marked as text, but is not handled by the SVG layout code-path. | 479 // <br> is marked as text, but is not handled by the SVG layout code-path. |
480 return object->isSVGInlineText() && | 480 return object->isSVGInlineText() && |
481 !toLayoutSVGInlineText(object)->hasEmptyText(); | 481 !toLayoutSVGInlineText(object)->hasEmptyText(); |
482 } | 482 } |
483 | 483 |
484 bool SVGLayoutSupport::willIsolateBlendingDescendantsForStyle( | 484 bool SVGLayoutSupport::willIsolateBlendingDescendantsForStyle( |
485 const ComputedStyle& style) { | 485 const ComputedStyle& style) { |
486 const SVGComputedStyle& svgStyle = style.svgStyle(); | 486 const SVGComputedStyle& svgStyle = style.svgStyle(); |
487 | 487 |
488 return style.hasIsolation() || style.opacity() < 1 || style.hasBlendMode() || | 488 return style.hasIsolation() || style.opacity() < 1 || style.hasBlendMode() || |
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
609 } | 609 } |
610 | 610 |
611 LayoutObject* SVGLayoutSupport::findClosestLayoutSVGText( | 611 LayoutObject* SVGLayoutSupport::findClosestLayoutSVGText( |
612 LayoutObject* layoutObject, | 612 LayoutObject* layoutObject, |
613 const FloatPoint& point) { | 613 const FloatPoint& point) { |
614 return searchTreeForFindClosestLayoutSVGText(layoutObject, point) | 614 return searchTreeForFindClosestLayoutSVGText(layoutObject, point) |
615 .candidateLayoutObject; | 615 .candidateLayoutObject; |
616 } | 616 } |
617 | 617 |
618 } // namespace blink | 618 } // namespace blink |
OLD | NEW |