OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) | 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) |
3 * (C) 1999 Antti Koivisto (koivisto@kde.org) | 3 * (C) 1999 Antti Koivisto (koivisto@kde.org) |
4 * (C) 2005 Allan Sandfeld Jensen (kde@carewolf.com) | 4 * (C) 2005 Allan Sandfeld Jensen (kde@carewolf.com) |
5 * (C) 2005, 2006 Samuel Weinig (sam.weinig@gmail.com) | 5 * (C) 2005, 2006 Samuel Weinig (sam.weinig@gmail.com) |
6 * Copyright (C) 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved. | 6 * Copyright (C) 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved. |
7 * Copyright (C) 2010 Google Inc. All rights reserved. | 7 * Copyright (C) 2010 Google Inc. 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 672 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
683 } | 683 } |
684 | 684 |
685 LayoutUnit LayoutBoxModelObject::computedCSSPadding(const Length& padding) const | 685 LayoutUnit LayoutBoxModelObject::computedCSSPadding(const Length& padding) const |
686 { | 686 { |
687 LayoutUnit w; | 687 LayoutUnit w; |
688 if (padding.hasPercent()) | 688 if (padding.hasPercent()) |
689 w = containingBlockLogicalWidthForContent(); | 689 w = containingBlockLogicalWidthForContent(); |
690 return minimumValueForLength(padding, w); | 690 return minimumValueForLength(padding, w); |
691 } | 691 } |
692 | 692 |
693 static inline LayoutUnit resolveWidthForRatio(LayoutUnit height, const FloatSize
& intrinsicRatio) | |
694 { | |
695 return LayoutUnit(height * intrinsicRatio.width() / intrinsicRatio.height())
; | |
696 } | |
697 | |
698 static inline LayoutUnit resolveHeightForRatio(LayoutUnit width, const FloatSize
& intrinsicRatio) | |
699 { | |
700 return LayoutUnit(width * intrinsicRatio.height() / intrinsicRatio.width()); | |
701 } | |
702 | |
703 static inline LayoutSize resolveAgainstIntrinsicWidthOrHeightAndRatio(const Layo
utSize& size, const FloatSize& intrinsicRatio, LayoutUnit useWidth, LayoutUnit u
seHeight) | |
704 { | |
705 if (intrinsicRatio.isEmpty()) { | |
706 if (useWidth) | |
707 return LayoutSize(useWidth, size.height()); | |
708 return LayoutSize(size.width(), useHeight); | |
709 } | |
710 | |
711 if (useWidth) | |
712 return LayoutSize(useWidth, resolveHeightForRatio(useWidth, intrinsicRat
io)); | |
713 return LayoutSize(resolveWidthForRatio(useHeight, intrinsicRatio), useHeight
); | |
714 } | |
715 | |
716 static inline LayoutSize resolveAgainstIntrinsicRatio(const LayoutSize& size, co
nst FloatSize& intrinsicRatio) | |
717 { | |
718 // Two possible solutions: (size.width(), solutionHeight) or (solutionWidth,
size.height()) | |
719 // "... must be assumed to be the largest dimensions..." = easiest answer: t
he rect with the largest surface area. | |
720 | |
721 LayoutUnit solutionWidth = resolveWidthForRatio(size.height(), intrinsicRati
o); | |
722 LayoutUnit solutionHeight = resolveHeightForRatio(size.width(), intrinsicRat
io); | |
723 if (solutionWidth <= size.width()) { | |
724 if (solutionHeight <= size.height()) { | |
725 // If both solutions fit, choose the one covering the larger area. | |
726 LayoutUnit areaOne = solutionWidth * size.height(); | |
727 LayoutUnit areaTwo = size.width() * solutionHeight; | |
728 if (areaOne < areaTwo) | |
729 return LayoutSize(size.width(), solutionHeight); | |
730 return LayoutSize(solutionWidth, size.height()); | |
731 } | |
732 | |
733 // Only the first solution fits. | |
734 return LayoutSize(solutionWidth, size.height()); | |
735 } | |
736 | |
737 // Only the second solution fits, assert that. | |
738 ASSERT(solutionHeight <= size.height()); | |
739 return LayoutSize(size.width(), solutionHeight); | |
740 } | |
741 | |
742 LayoutSize LayoutBoxModelObject::calculateImageIntrinsicDimensions(StyleImage* i
mage, const LayoutSize& positioningAreaSize, ScaleByEffectiveZoomOrNot shouldSca
leOrNot) const | |
743 { | |
744 // A generated image without a fixed size, will always return the container
size as intrinsic size. | |
745 if (image->isGeneratedImage() && image->usesImageContainerSize()) | |
746 return positioningAreaSize; | |
747 | |
748 FloatSize intrinsicSize; | |
749 FloatSize intrinsicRatio; | |
750 image->computeIntrinsicDimensions(this, intrinsicSize, intrinsicRatio); | |
751 | |
752 LayoutSize resolvedSize(intrinsicSize); | |
753 LayoutSize minimumSize(resolvedSize.width() > LayoutUnit() ? LayoutUnit(1) :
LayoutUnit(), | |
754 resolvedSize.height() > LayoutUnit() ? LayoutUnit(1) : LayoutUnit()); | |
755 if (shouldScaleOrNot == ScaleByEffectiveZoom) | |
756 resolvedSize.scale(style()->effectiveZoom()); | |
757 resolvedSize.clampToMinimumSize(minimumSize); | |
758 | |
759 if (!resolvedSize.isEmpty()) | |
760 return resolvedSize; | |
761 | |
762 // If the image has one of either an intrinsic width or an intrinsic height: | |
763 // * and an intrinsic aspect ratio, then the missing dimension is calculated
from the given dimension and the ratio. | |
764 // * and no intrinsic aspect ratio, then the missing dimension is assumed to
be the size of the rectangle that | |
765 // establishes the coordinate system for the 'background-position' propert
y. | |
766 if (resolvedSize.width() > LayoutUnit() || resolvedSize.height() > LayoutUni
t()) | |
767 return resolveAgainstIntrinsicWidthOrHeightAndRatio(positioningAreaSize,
intrinsicRatio, resolvedSize.width(), resolvedSize.height()); | |
768 | |
769 // If the image has no intrinsic dimensions and has an intrinsic ratio the d
imensions must be assumed to be the | |
770 // largest dimensions at that ratio such that neither dimension exceeds the
dimensions of the rectangle that | |
771 // establishes the coordinate system for the 'background-position' property. | |
772 if (!intrinsicRatio.isEmpty()) | |
773 return resolveAgainstIntrinsicRatio(positioningAreaSize, intrinsicRatio)
; | |
774 | |
775 // If the image has no intrinsic ratio either, then the dimensions must be a
ssumed to be the rectangle that | |
776 // establishes the coordinate system for the 'background-position' property. | |
777 return positioningAreaSize; | |
778 } | |
779 | |
780 bool LayoutBoxModelObject::boxShadowShouldBeAppliedToBackground(BackgroundBleedA
voidance bleedAvoidance, const InlineFlowBox* inlineFlowBox) const | 693 bool LayoutBoxModelObject::boxShadowShouldBeAppliedToBackground(BackgroundBleedA
voidance bleedAvoidance, const InlineFlowBox* inlineFlowBox) const |
781 { | 694 { |
782 if (bleedAvoidance != BackgroundBleedNone) | 695 if (bleedAvoidance != BackgroundBleedNone) |
783 return false; | 696 return false; |
784 | 697 |
785 if (style()->hasAppearance()) | 698 if (style()->hasAppearance()) |
786 return false; | 699 return false; |
787 | 700 |
788 const ShadowList* shadowList = style()->boxShadow(); | 701 const ShadowList* shadowList = style()->boxShadow(); |
789 if (!shadowList) | 702 if (!shadowList) |
(...skipping 289 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1079 if (rootElementStyle->hasBackground()) | 992 if (rootElementStyle->hasBackground()) |
1080 return false; | 993 return false; |
1081 | 994 |
1082 if (node() != document().firstBodyElement()) | 995 if (node() != document().firstBodyElement()) |
1083 return false; | 996 return false; |
1084 | 997 |
1085 return true; | 998 return true; |
1086 } | 999 } |
1087 | 1000 |
1088 } // namespace blink | 1001 } // namespace blink |
OLD | NEW |