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

Side by Side Diff: third_party/WebKit/Source/core/layout/LayoutReplaced.cpp

Issue 1679743006: Expand IntrinsicSizingInfo for SVG (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@propagate-whether-svg-has
Patch Set: Created 4 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
OLDNEW
1 /* 1 /*
2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
3 * Copyright (C) 2000 Dirk Mueller (mueller@kde.org) 3 * Copyright (C) 2000 Dirk Mueller (mueller@kde.org)
4 * Copyright (C) 2004, 2006, 2007 Apple Inc. All rights reserved. 4 * Copyright (C) 2004, 2006, 2007 Apple Inc. All rights reserved.
5 * Copyright (C) Research In Motion Limited 2011-2012. All rights reserved. 5 * Copyright (C) Research In Motion Limited 2011-2012. All rights reserved.
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 14 matching lines...) Expand all
25 25
26 #include "core/editing/PositionWithAffinity.h" 26 #include "core/editing/PositionWithAffinity.h"
27 #include "core/layout/LayoutAnalyzer.h" 27 #include "core/layout/LayoutAnalyzer.h"
28 #include "core/layout/LayoutBlock.h" 28 #include "core/layout/LayoutBlock.h"
29 #include "core/layout/LayoutImage.h" 29 #include "core/layout/LayoutImage.h"
30 #include "core/layout/LayoutInline.h" 30 #include "core/layout/LayoutInline.h"
31 #include "core/layout/LayoutView.h" 31 #include "core/layout/LayoutView.h"
32 #include "core/paint/PaintInfo.h" 32 #include "core/paint/PaintInfo.h"
33 #include "core/paint/PaintLayer.h" 33 #include "core/paint/PaintLayer.h"
34 #include "core/paint/ReplacedPainter.h" 34 #include "core/paint/ReplacedPainter.h"
35 #include "core/svg/SVGSVGElement.h"
36 #include "platform/LengthFunctions.h" 35 #include "platform/LengthFunctions.h"
37 36
38 namespace blink { 37 namespace blink {
39 38
40 const int LayoutReplaced::defaultWidth = 300; 39 const int LayoutReplaced::defaultWidth = 300;
41 const int LayoutReplaced::defaultHeight = 150; 40 const int LayoutReplaced::defaultHeight = 150;
42 41
43 LayoutReplaced::LayoutReplaced(Element* element) 42 LayoutReplaced::LayoutReplaced(Element* element)
44 : LayoutBox(element) 43 : LayoutBox(element)
45 , m_intrinsicSize(defaultWidth, defaultHeight) 44 , m_intrinsicSize(defaultWidth, defaultHeight)
(...skipping 490 matching lines...) Expand 10 before | Expand all | Expand 10 after
536 ASSERT(!embeddedContentBox()); 535 ASSERT(!embeddedContentBox());
537 intrinsicSizingInfo.size = FloatSize(intrinsicLogicalWidth().toFloat(), intr insicLogicalHeight().toFloat()); 536 intrinsicSizingInfo.size = FloatSize(intrinsicLogicalWidth().toFloat(), intr insicLogicalHeight().toFloat());
538 537
539 // Figure out if we need to compute an intrinsic ratio. 538 // Figure out if we need to compute an intrinsic ratio.
540 if (intrinsicSizingInfo.size.isEmpty() || !layoutObjectHasAspectRatio(this)) 539 if (intrinsicSizingInfo.size.isEmpty() || !layoutObjectHasAspectRatio(this))
541 return; 540 return;
542 541
543 intrinsicSizingInfo.aspectRatio = intrinsicSizingInfo.size.width() / intrins icSizingInfo.size.height(); 542 intrinsicSizingInfo.aspectRatio = intrinsicSizingInfo.size.width() / intrins icSizingInfo.size.height();
544 } 543 }
545 544
546 static bool hasIntrinsicWidthForLayoutBox(LayoutBox* layoutObject)
547 {
548 if (layoutObject && layoutObject->isSVGRoot()) {
549 SVGSVGElement* svg = toSVGSVGElement(layoutObject->node());
550 ASSERT(svg);
551 return svg->hasIntrinsicWidth();
552 }
553
554 return false;
555 }
556
557 static bool hasIntrinsicHeightForLayoutBox(LayoutBox* layoutObject)
558 {
559 if (layoutObject && layoutObject->isSVGRoot()) {
560 SVGSVGElement* svg = toSVGSVGElement(layoutObject->node());
561 ASSERT(svg);
562 return svg->hasIntrinsicHeight();
563 }
564
565 return false;
566 }
567
568 LayoutUnit LayoutReplaced::computeReplacedLogicalWidth(ShouldComputePreferred sh ouldComputePreferred) const 545 LayoutUnit LayoutReplaced::computeReplacedLogicalWidth(ShouldComputePreferred sh ouldComputePreferred) const
569 { 546 {
570 if (style()->logicalWidth().isSpecified() || style()->logicalWidth().isIntri nsic()) 547 if (style()->logicalWidth().isSpecified() || style()->logicalWidth().isIntri nsic())
571 return computeReplacedLogicalWidthRespectingMinMaxWidth(computeReplacedL ogicalWidthUsing(MainOrPreferredSize, style()->logicalWidth()), shouldComputePre ferred); 548 return computeReplacedLogicalWidthRespectingMinMaxWidth(computeReplacedL ogicalWidthUsing(MainOrPreferredSize, style()->logicalWidth()), shouldComputePre ferred);
572 549
573 LayoutBox* contentLayoutObject = embeddedContentBox(); 550 LayoutBox* contentLayoutObject = embeddedContentBox();
574 551
575 // 10.3.2 Inline, replaced elements: http://www.w3.org/TR/CSS21/visudet.html #inline-replaced-width 552 // 10.3.2 Inline, replaced elements: http://www.w3.org/TR/CSS21/visudet.html #inline-replaced-width
576 IntrinsicSizingInfo intrinsicSizingInfo; 553 IntrinsicSizingInfo intrinsicSizingInfo;
577 computeIntrinsicSizingInfoForLayoutBox(contentLayoutObject, intrinsicSizingI nfo); 554 computeIntrinsicSizingInfoForLayoutBox(contentLayoutObject, intrinsicSizingI nfo);
578 FloatSize constrainedSize = constrainIntrinsicSizeToMinMax(intrinsicSizingIn fo); 555 FloatSize constrainedSize = constrainIntrinsicSizeToMinMax(intrinsicSizingIn fo);
579 556
580 if (style()->logicalWidth().isAuto()) { 557 if (style()->logicalWidth().isAuto()) {
581 bool computedHeightIsAuto = hasAutoHeightOrContainingBlockWithAutoHeight (); 558 bool computedHeightIsAuto = hasAutoHeightOrContainingBlockWithAutoHeight ();
582 // TODO(shanmuga.m@samsung.com): hasIntrinsicWidth/Height information sh ould be obtained 559 bool hasIntrinsicWidth = !intrinsicSizingInfo.emptyWidth;
fs 2016/02/09 18:37:54 Maybe consider adding accessors on IntrinsicSizing
davve 2016/02/11 08:52:37 Turned it around to avoid "empty" prefix. Hopefull
583 // from LayoutBox::computeIntrinsicSizingInfo().
584 bool hasIntrinsicWidth = constrainedSize.width() > 0 || hasIntrinsicWidt hForLayoutBox(contentLayoutObject);
585 560
586 // If 'height' and 'width' both have computed values of 'auto' and the e lement also has an intrinsic width, then that intrinsic width is the used value of 'width'. 561 // If 'height' and 'width' both have computed values of 'auto' and the e lement also has an intrinsic width, then that intrinsic width is the used value of 'width'.
587 if (computedHeightIsAuto && hasIntrinsicWidth) 562 if (computedHeightIsAuto && hasIntrinsicWidth)
588 return computeReplacedLogicalWidthRespectingMinMaxWidth(LayoutUnit(c onstrainedSize.width()), shouldComputePreferred); 563 return computeReplacedLogicalWidthRespectingMinMaxWidth(LayoutUnit(c onstrainedSize.width()), shouldComputePreferred);
589 564
590 bool hasIntrinsicHeight = constrainedSize.height() > 0 || hasIntrinsicHe ightForLayoutBox(contentLayoutObject); 565 bool hasIntrinsicHeight = !intrinsicSizingInfo.emptyHeight;
591 566
592 if (intrinsicSizingInfo.aspectRatio) { 567 if (intrinsicSizingInfo.aspectRatio) {
593 // If 'height' and 'width' both have computed values of 'auto' and t he element has no intrinsic width, but does have an intrinsic height and intrins ic ratio; 568 // If 'height' and 'width' both have computed values of 'auto' and t he element has no intrinsic width, but does have an intrinsic height and intrins ic ratio;
594 // or if 'width' has a computed value of 'auto', 'height' has some o ther computed value, and the element does have an intrinsic ratio; then the used value 569 // or if 'width' has a computed value of 'auto', 'height' has some o ther computed value, and the element does have an intrinsic ratio; then the used value
595 // of 'width' is: (used height) * (intrinsic ratio) 570 // of 'width' is: (used height) * (intrinsic ratio)
596 if (intrinsicSizingInfo.aspectRatio && ((computedHeightIsAuto && !ha sIntrinsicWidth && hasIntrinsicHeight) || !computedHeightIsAuto)) { 571 if (intrinsicSizingInfo.aspectRatio && ((computedHeightIsAuto && !ha sIntrinsicWidth && hasIntrinsicHeight) || !computedHeightIsAuto)) {
597 LayoutUnit logicalHeight = computeReplacedLogicalHeight(); 572 LayoutUnit logicalHeight = computeReplacedLogicalHeight();
598 return computeReplacedLogicalWidthRespectingMinMaxWidth(LayoutUn it(logicalHeight * intrinsicSizingInfo.aspectRatio), shouldComputePreferred); 573 return computeReplacedLogicalWidthRespectingMinMaxWidth(LayoutUn it(logicalHeight * intrinsicSizingInfo.aspectRatio), shouldComputePreferred);
599 } 574 }
600 575
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
637 return computeReplacedLogicalHeightRespectingMinMaxHeight(computeReplace dLogicalHeightUsing(MainOrPreferredSize, style()->logicalHeight())); 612 return computeReplacedLogicalHeightRespectingMinMaxHeight(computeReplace dLogicalHeightUsing(MainOrPreferredSize, style()->logicalHeight()));
638 613
639 LayoutBox* contentLayoutObject = embeddedContentBox(); 614 LayoutBox* contentLayoutObject = embeddedContentBox();
640 615
641 // 10.6.2 Inline, replaced elements: http://www.w3.org/TR/CSS21/visudet.html #inline-replaced-height 616 // 10.6.2 Inline, replaced elements: http://www.w3.org/TR/CSS21/visudet.html #inline-replaced-height
642 IntrinsicSizingInfo intrinsicSizingInfo; 617 IntrinsicSizingInfo intrinsicSizingInfo;
643 computeIntrinsicSizingInfoForLayoutBox(contentLayoutObject, intrinsicSizingI nfo); 618 computeIntrinsicSizingInfoForLayoutBox(contentLayoutObject, intrinsicSizingI nfo);
644 FloatSize constrainedSize = constrainIntrinsicSizeToMinMax(intrinsicSizingIn fo); 619 FloatSize constrainedSize = constrainIntrinsicSizeToMinMax(intrinsicSizingIn fo);
645 620
646 bool widthIsAuto = style()->logicalWidth().isAuto(); 621 bool widthIsAuto = style()->logicalWidth().isAuto();
647 // TODO(shanmuga.m@samsung.com): hasIntrinsicWidth/Height information should be obtained 622 bool hasIntrinsicHeight = !intrinsicSizingInfo.emptyHeight;
648 // from LayoutBox::computeIntrinsicSizingInfo().
649 bool hasIntrinsicHeight = constrainedSize.height() > 0 || hasIntrinsicHeight ForLayoutBox(contentLayoutObject);
650 623
651 // If 'height' and 'width' both have computed values of 'auto' and the eleme nt also has an intrinsic height, then that intrinsic height is the used value of 'height'. 624 // If 'height' and 'width' both have computed values of 'auto' and the eleme nt also has an intrinsic height, then that intrinsic height is the used value of 'height'.
652 if (widthIsAuto && hasIntrinsicHeight) 625 if (widthIsAuto && hasIntrinsicHeight)
653 return computeReplacedLogicalHeightRespectingMinMaxHeight(constrainedSiz e.height()); 626 return computeReplacedLogicalHeightRespectingMinMaxHeight(constrainedSiz e.height());
654 627
655 // Otherwise, if 'height' has a computed value of 'auto', and the element ha s an intrinsic ratio then the used value of 'height' is: 628 // Otherwise, if 'height' has a computed value of 'auto', and the element ha s an intrinsic ratio then the used value of 'height' is:
656 // (used width) / (intrinsic ratio) 629 // (used width) / (intrinsic ratio)
657 if (intrinsicSizingInfo.aspectRatio) 630 if (intrinsicSizingInfo.aspectRatio)
658 return computeReplacedLogicalHeightRespectingMinMaxHeight(LayoutUnit(ava ilableLogicalWidth() / intrinsicSizingInfo.aspectRatio)); 631 return computeReplacedLogicalHeightRespectingMinMaxHeight(LayoutUnit(ava ilableLogicalWidth() / intrinsicSizingInfo.aspectRatio));
659 632
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after
774 // We only include the space below the baseline in our layer's cached paint invalidation rect if the 747 // We only include the space below the baseline in our layer's cached paint invalidation rect if the
775 // image is selected. Since the selection state has changed update the rect. 748 // image is selected. Since the selection state has changed update the rect.
776 if (hasLayer()) 749 if (hasLayer())
777 setPreviousPaintInvalidationRect(boundsRectForPaintInvalidation(containe rForPaintInvalidation())); 750 setPreviousPaintInvalidationRect(boundsRectForPaintInvalidation(containe rForPaintInvalidation()));
778 751
779 if (canUpdateSelectionOnRootLineBoxes()) 752 if (canUpdateSelectionOnRootLineBoxes())
780 inlineBoxWrapper()->root().setHasSelectedChildren(state != SelectionNone ); 753 inlineBoxWrapper()->root().setHasSelectedChildren(state != SelectionNone );
781 } 754 }
782 755
783 } // namespace blink 756 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698