Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(220)

Side by Side Diff: third_party/WebKit/Source/core/svg/SVGSVGElement.cpp

Issue 2711503002: Compute a more correct "screen scope" transform for SVGSVGElement (Closed)
Patch Set: Tweak test Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « third_party/WebKit/Source/core/svg/SVGSVGElement.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2004, 2005, 2006 Nikolas Zimmermann <zimmermann@kde.org> 2 * Copyright (C) 2004, 2005, 2006 Nikolas Zimmermann <zimmermann@kde.org>
3 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2010 Rob Buis <buis@kde.org> 3 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2010 Rob Buis <buis@kde.org>
4 * Copyright (C) 2007 Apple Inc. All rights reserved. 4 * Copyright (C) 2007 Apple Inc. All rights reserved.
5 * Copyright (C) 2014 Google, Inc. 5 * Copyright (C) 2014 Google, Inc.
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 432 matching lines...) Expand 10 before | Expand all | Expand 10 after
443 SVGTransformTearOff* SVGSVGElement::createSVGTransform() { 443 SVGTransformTearOff* SVGSVGElement::createSVGTransform() {
444 return SVGTransformTearOff::create(SVGTransform::create(kSvgTransformMatrix), 444 return SVGTransformTearOff::create(SVGTransform::create(kSvgTransformMatrix),
445 0, PropertyIsNotAnimVal); 445 0, PropertyIsNotAnimVal);
446 } 446 }
447 447
448 SVGTransformTearOff* SVGSVGElement::createSVGTransformFromMatrix( 448 SVGTransformTearOff* SVGSVGElement::createSVGTransformFromMatrix(
449 SVGMatrixTearOff* matrix) { 449 SVGMatrixTearOff* matrix) {
450 return SVGTransformTearOff::create(matrix); 450 return SVGTransformTearOff::create(matrix);
451 } 451 }
452 452
453 AffineTransform SVGSVGElement::localCoordinateSpaceTransform( 453 AffineTransform SVGSVGElement::localCoordinateSpaceTransform() const {
454 SVGElement::CTMScope mode) const {
455 AffineTransform viewBoxTransform;
456 if (!hasEmptyViewBox()) {
457 FloatSize size = currentViewportSize();
458 viewBoxTransform = viewBoxToViewTransform(size.width(), size.height());
459 }
460
461 AffineTransform transform; 454 AffineTransform transform;
462 if (!isOutermostSVGSVGElement()) { 455 if (!isOutermostSVGSVGElement()) {
463 SVGLengthContext lengthContext(this); 456 SVGLengthContext lengthContext(this);
464 transform.translate(m_x->currentValue()->value(lengthContext), 457 transform.translate(m_x->currentValue()->value(lengthContext),
465 m_y->currentValue()->value(lengthContext)); 458 m_y->currentValue()->value(lengthContext));
466 } else if (mode == SVGElement::ScreenScope) {
467 if (LayoutObject* layoutObject = this->layoutObject()) {
468 FloatPoint location;
469 float zoomFactor = 1;
470
471 // At the SVG/HTML boundary (aka LayoutSVGRoot), we apply the
472 // localToBorderBoxTransform to map an element from SVG viewport
473 // coordinates to CSS box coordinates. LayoutSVGRoot's localToAbsolute
474 // method expects CSS box coordinates. We also need to adjust for the
475 // zoom level factored into CSS coordinates (bug #96361).
476 if (layoutObject->isSVGRoot()) {
477 location = toLayoutSVGRoot(layoutObject)
478 ->localToBorderBoxTransform()
479 .mapPoint(location);
480 zoomFactor = 1 / layoutObject->style()->effectiveZoom();
481 }
482
483 // Translate in our CSS parent coordinate space
484 // FIXME: This doesn't work correctly with CSS transforms.
485 location = layoutObject->localToAbsolute(location, UseTransforms);
486 location.scale(zoomFactor, zoomFactor);
487
488 // Be careful here! localToBorderBoxTransform() included the x/y offset
489 // coming from the viewBoxToViewTransform(), so we have to subtract it
490 // here (original cause of bug #27183)
491 transform.translate(location.x() - viewBoxTransform.e(),
492 location.y() - viewBoxTransform.f());
493
494 // Respect scroll offset.
495 if (FrameView* view = document().view()) {
496 LayoutSize scrollOffset(view->getScrollOffset());
497 scrollOffset.scale(zoomFactor);
498 transform.translate(-scrollOffset.width(), -scrollOffset.height());
499 }
500 }
501 } 459 }
502 460 if (!hasEmptyViewBox()) {
503 return transform.multiply(viewBoxTransform); 461 FloatSize size = currentViewportSize();
462 transform.multiply(viewBoxToViewTransform(size.width(), size.height()));
463 }
464 return transform;
504 } 465 }
505 466
506 bool SVGSVGElement::layoutObjectIsNeeded(const ComputedStyle& style) { 467 bool SVGSVGElement::layoutObjectIsNeeded(const ComputedStyle& style) {
507 // FIXME: We should respect display: none on the documentElement svg element 468 // FIXME: We should respect display: none on the documentElement svg element
508 // but many things in FrameView and SVGImage depend on the LayoutSVGRoot when 469 // but many things in FrameView and SVGImage depend on the LayoutSVGRoot when
509 // they should instead depend on the LayoutView. 470 // they should instead depend on the LayoutView.
510 // https://bugs.webkit.org/show_bug.cgi?id=103493 471 // https://bugs.webkit.org/show_bug.cgi?id=103493
511 if (document().documentElement() == this) 472 if (document().documentElement() == this)
512 return true; 473 return true;
513 474
(...skipping 249 matching lines...) Expand 10 before | Expand all | Expand 10 after
763 visitor->trace(m_width); 724 visitor->trace(m_width);
764 visitor->trace(m_height); 725 visitor->trace(m_height);
765 visitor->trace(m_translation); 726 visitor->trace(m_translation);
766 visitor->trace(m_timeContainer); 727 visitor->trace(m_timeContainer);
767 visitor->trace(m_viewSpec); 728 visitor->trace(m_viewSpec);
768 SVGGraphicsElement::trace(visitor); 729 SVGGraphicsElement::trace(visitor);
769 SVGFitToViewBox::trace(visitor); 730 SVGFitToViewBox::trace(visitor);
770 } 731 }
771 732
772 } // namespace blink 733 } // namespace blink
OLDNEW
« no previous file with comments | « third_party/WebKit/Source/core/svg/SVGSVGElement.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698