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

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

Issue 2290173005: Synthesize preserveAspectRatio='none' for non-viewBoxed <img> (Closed)
Patch Set: New baselines Created 4 years, 3 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
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 549 matching lines...) Expand 10 before | Expand all | Expand 10 after
560 } 560 }
561 561
562 bool SVGSVGElement::selfHasRelativeLengths() const 562 bool SVGSVGElement::selfHasRelativeLengths() const
563 { 563 {
564 return m_x->currentValue()->isRelative() 564 return m_x->currentValue()->isRelative()
565 || m_y->currentValue()->isRelative() 565 || m_y->currentValue()->isRelative()
566 || m_width->currentValue()->isRelative() 566 || m_width->currentValue()->isRelative()
567 || m_height->currentValue()->isRelative(); 567 || m_height->currentValue()->isRelative();
568 } 568 }
569 569
570 bool SVGSVGElement::shouldSynthesizeViewBox() const
571 {
572 return layoutObject()
573 && layoutObject()->isSVGRoot()
574 && toLayoutSVGRoot(layoutObject())->isEmbeddedThroughSVGImage();
575 }
576
570 FloatRect SVGSVGElement::currentViewBoxRect() const 577 FloatRect SVGSVGElement::currentViewBoxRect() const
davve 2016/09/01 17:46:42 I bothers me a bit that currentViewBoxRect() may r
fs 2016/09/01 17:57:24 Yeah, I noticed this too... Did feel that I should
571 { 578 {
572 if (m_useCurrentView) { 579 if (m_useCurrentView) {
573 DCHECK(m_viewSpec); 580 DCHECK(m_viewSpec);
574 return m_viewSpec->viewBox()->currentValue()->value(); 581 return m_viewSpec->viewBox()->currentValue()->value();
575 } 582 }
576 583
577 FloatRect useViewBox = viewBox()->currentValue()->value(); 584 FloatRect useViewBox = viewBox()->currentValue()->value();
578 if (!useViewBox.isEmpty()) 585 if (!useViewBox.isEmpty())
579 return useViewBox; 586 return useViewBox;
580 if (!layoutObject() || !layoutObject()->isSVGRoot()) 587 if (!shouldSynthesizeViewBox())
581 return FloatRect();
582 if (!toLayoutSVGRoot(layoutObject())->isEmbeddedThroughSVGImage())
583 return FloatRect(); 588 return FloatRect();
584 589
585 // If no viewBox is specified but non-relative width/height values, then we 590 // If no viewBox is specified but non-relative width/height values, then we
586 // should always synthesize a viewBox if we're embedded through a SVGImage. 591 // should always synthesize a viewBox if we're embedded through a SVGImage.
587 return FloatRect(FloatPoint(), FloatSize(intrinsicWidth(), intrinsicHeight() )); 592 FloatSize synthesizedViewBoxSize(intrinsicWidth(), intrinsicHeight());
593 if (!hasIntrinsicWidth())
594 synthesizedViewBoxSize.setWidth(width()->currentValue()->scaleByPercenta ge(currentViewportSize().width()));
davve 2016/09/01 17:46:42 So a <svg .. width="50%" height="50%"> would produ
fs 2016/09/01 17:57:24 Yeah, maybe a bit odd, but I guess it could make s
595 if (!hasIntrinsicHeight())
596 synthesizedViewBoxSize.setHeight(height()->currentValue()->scaleByPercen tage(currentViewportSize().height()));
597 return FloatRect(FloatPoint(), synthesizedViewBoxSize);
598 }
599
600 SVGPreserveAspectRatio* SVGSVGElement::currentPreserveAspectRatio() const
601 {
602 if (m_useCurrentView) {
603 DCHECK(m_viewSpec);
604 return m_viewSpec->preserveAspectRatio()->currentValue();
605 }
606 if (!viewBox()->currentValue()->isValid() && shouldSynthesizeViewBox()) {
607 // If no viewBox is specified and we're embedded through SVGImage, then
608 // synthesize a pAR with the value 'none'.
609 SVGPreserveAspectRatio* synthesizedPAR = SVGPreserveAspectRatio::create( );
610 synthesizedPAR->setAlign(SVGPreserveAspectRatio::kSvgPreserveaspectratio None);
611 return synthesizedPAR;
612 }
613 return preserveAspectRatio()->currentValue();
588 } 614 }
589 615
590 FloatSize SVGSVGElement::currentViewportSize() const 616 FloatSize SVGSVGElement::currentViewportSize() const
591 { 617 {
592 if (!layoutObject()) 618 if (!layoutObject())
593 return FloatSize(); 619 return FloatSize();
594 620
595 if (layoutObject()->isSVGRoot()) { 621 if (layoutObject()->isSVGRoot()) {
596 LayoutRect contentBoxRect = toLayoutSVGRoot(layoutObject())->contentBoxR ect(); 622 LayoutRect contentBoxRect = toLayoutSVGRoot(layoutObject())->contentBoxR ect();
597 return FloatSize(contentBoxRect.width() / layoutObject()->style()->effec tiveZoom(), contentBoxRect.height() / layoutObject()->style()->effectiveZoom()); 623 return FloatSize(contentBoxRect.width() / layoutObject()->style()->effec tiveZoom(), contentBoxRect.height() / layoutObject()->style()->effectiveZoom());
(...skipping 26 matching lines...) Expand all
624 { 650 {
625 if (height()->currentValue()->typeWithCalcResolved() == CSSPrimitiveValue::U nitType::Percentage) 651 if (height()->currentValue()->typeWithCalcResolved() == CSSPrimitiveValue::U nitType::Percentage)
626 return 0; 652 return 0;
627 653
628 SVGLengthContext lengthContext(this); 654 SVGLengthContext lengthContext(this);
629 return height()->currentValue()->value(lengthContext); 655 return height()->currentValue()->value(lengthContext);
630 } 656 }
631 657
632 AffineTransform SVGSVGElement::viewBoxToViewTransform(float viewWidth, float vie wHeight) const 658 AffineTransform SVGSVGElement::viewBoxToViewTransform(float viewWidth, float vie wHeight) const
633 { 659 {
660 AffineTransform ctm = SVGFitToViewBox::viewBoxToViewTransform(currentViewBox Rect(), currentPreserveAspectRatio(), viewWidth, viewHeight);
634 if (!m_useCurrentView) 661 if (!m_useCurrentView)
635 return SVGFitToViewBox::viewBoxToViewTransform(currentViewBoxRect(), pre serveAspectRatio()->currentValue(), viewWidth, viewHeight); 662 return ctm;
636 DCHECK(m_viewSpec); 663 DCHECK(m_viewSpec);
637 664
638 AffineTransform ctm = SVGFitToViewBox::viewBoxToViewTransform(currentViewBox Rect(), m_viewSpec->preserveAspectRatio()->currentValue(), viewWidth, viewHeight );
639 SVGTransformList* transformList = m_viewSpec->transform(); 665 SVGTransformList* transformList = m_viewSpec->transform();
640 if (transformList->isEmpty()) 666 if (transformList->isEmpty())
641 return ctm; 667 return ctm;
642 668
643 AffineTransform transform; 669 AffineTransform transform;
644 if (transformList->concatenate(transform)) 670 if (transformList->concatenate(transform))
645 ctm *= transform; 671 ctm *= transform;
646 672
647 return ctm; 673 return ctm;
648 } 674 }
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
736 visitor->trace(m_width); 762 visitor->trace(m_width);
737 visitor->trace(m_height); 763 visitor->trace(m_height);
738 visitor->trace(m_translation); 764 visitor->trace(m_translation);
739 visitor->trace(m_timeContainer); 765 visitor->trace(m_timeContainer);
740 visitor->trace(m_viewSpec); 766 visitor->trace(m_viewSpec);
741 SVGGraphicsElement::trace(visitor); 767 SVGGraphicsElement::trace(visitor);
742 SVGFitToViewBox::trace(visitor); 768 SVGFitToViewBox::trace(visitor);
743 } 769 }
744 770
745 } // namespace blink 771 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698