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

Side by Side Diff: Source/WebCore/rendering/RenderBoxModelObject.cpp

Issue 10379031: Merge 114095 - Background width (or height) is wrong if width (or height) * zoom < 1. (Closed) Base URL: http://svn.webkit.org/repository/webkit/branches/chromium/1084/
Patch Set: Created 8 years, 7 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 | « Source/WebCore/platform/graphics/IntSize.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) 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 937 matching lines...) Expand 10 before | Expand all | Expand 10 after
948 return IntSize(solutionWidth, size.height()); 948 return IntSize(solutionWidth, size.height());
949 } 949 }
950 950
951 // Only the second solution fits, assert that. 951 // Only the second solution fits, assert that.
952 ASSERT(solutionHeight <= size.height()); 952 ASSERT(solutionHeight <= size.height());
953 return IntSize(size.width(), solutionHeight); 953 return IntSize(size.width(), solutionHeight);
954 } 954 }
955 955
956 IntSize RenderBoxModelObject::calculateImageIntrinsicDimensions(StyleImage* imag e, const IntSize& positioningAreaSize) const 956 IntSize RenderBoxModelObject::calculateImageIntrinsicDimensions(StyleImage* imag e, const IntSize& positioningAreaSize) const
957 { 957 {
958 int resolvedWidth = 0; 958 // A generated image without a fixed size, will always return the container size as intrinsic size.
959 int resolvedHeight = 0; 959 if (image->isGeneratedImage() && image->usesImageContainerSize())
960 return IntSize(positioningAreaSize.width(), positioningAreaSize.height() );
961
962 Length intrinsicWidth;
963 Length intrinsicHeight;
960 FloatSize intrinsicRatio; 964 FloatSize intrinsicRatio;
965 image->computeIntrinsicDimensions(this, intrinsicWidth, intrinsicHeight, int rinsicRatio);
961 966
962 // A generated image without a fixed size, will always return the container size as intrinsic size. 967 // Intrinsic dimensions expressed as percentages must be resolved relative t o the dimensions of the rectangle
963 if (image->isGeneratedImage() && image->usesImageContainerSize()) { 968 // that establishes the coordinate system for the 'background-position' prop erty.
964 resolvedWidth = positioningAreaSize.width(); 969
965 resolvedHeight = positioningAreaSize.height(); 970 // FIXME: Remove unnecessary rounding when layout is off ints: webkit.org/b/ 63656
966 } else { 971 if (intrinsicWidth.isPercent() && intrinsicHeight.isPercent() && intrinsicRa tio.isEmpty()) {
967 Length intrinsicWidth; 972 // Resolve width/height percentages against positioningAreaSize, only if no intrinsic ratio is provided.
968 Length intrinsicHeight; 973 int resolvedWidth = static_cast<int>(round(positioningAreaSize.width() * intrinsicWidth.percent() / 100));
969 image->computeIntrinsicDimensions(this, intrinsicWidth, intrinsicHeight, intrinsicRatio); 974 int resolvedHeight = static_cast<int>(round(positioningAreaSize.height() * intrinsicHeight.percent() / 100));
970 975 return IntSize(resolvedWidth, resolvedHeight);
971 // Intrinsic dimensions expressed as percentages must be resolved relati ve to the dimensions of the rectangle
972 // that establishes the coordinate system for the 'background-position' property.
973
974 // FIXME: Remove unnecessary rounding when layout is off ints: webkit.or g/b/63656
975 if (intrinsicWidth.isPercent() && intrinsicHeight.isPercent() && intrins icRatio.isEmpty()) {
976 // Resolve width/height percentages against positioningAreaSize, onl y if no intrinsic ratio is provided.
977 resolvedWidth = static_cast<int>(round(positioningAreaSize.width() * intrinsicWidth.percent() / 100));
978 resolvedHeight = static_cast<int>(round(positioningAreaSize.height() * intrinsicHeight.percent() / 100));
979 } else {
980 if (intrinsicWidth.isFixed())
981 resolvedWidth = static_cast<int>(intrinsicWidth.value() * style( )->effectiveZoom());
982 if (intrinsicHeight.isFixed())
983 resolvedHeight = static_cast<int>(intrinsicHeight.value() * styl e()->effectiveZoom());
984 }
985 } 976 }
986 977
987 if (resolvedWidth > 0 && resolvedHeight > 0) 978 IntSize resolvedSize(intrinsicWidth.isFixed() ? intrinsicWidth.value() : 0, intrinsicHeight.isFixed() ? intrinsicHeight.value() : 0);
988 return IntSize(resolvedWidth, resolvedHeight); 979 IntSize minimumSize(resolvedSize.width() > 0 ? 1 : 0, resolvedSize.height() > 0 ? 1 : 0);
980 resolvedSize.scale(style()->effectiveZoom());
981 resolvedSize.clampToMinimumSize(minimumSize);
982
983 if (!resolvedSize.isEmpty())
984 return resolvedSize;
989 985
990 // If the image has one of either an intrinsic width or an intrinsic height: 986 // If the image has one of either an intrinsic width or an intrinsic height:
991 // * and an intrinsic aspect ratio, then the missing dimension is calculated from the given dimension and the ratio. 987 // * and an intrinsic aspect ratio, then the missing dimension is calculated from the given dimension and the ratio.
992 // * and no intrinsic aspect ratio, then the missing dimension is assumed to be the size of the rectangle that 988 // * and no intrinsic aspect ratio, then the missing dimension is assumed to be the size of the rectangle that
993 // establishes the coordinate system for the 'background-position' propert y. 989 // establishes the coordinate system for the 'background-position' propert y.
994 if ((resolvedWidth && !resolvedHeight) || (!resolvedWidth && resolvedHeight) ) 990 if (resolvedSize.width() > 0 || resolvedSize.height() > 0)
995 return resolveAgainstIntrinsicWidthOrHeightAndRatio(positioningAreaSize, intrinsicRatio, resolvedWidth, resolvedHeight); 991 return resolveAgainstIntrinsicWidthOrHeightAndRatio(positioningAreaSize, intrinsicRatio, resolvedSize.width(), resolvedSize.height());
996 992
997 // If the image has no intrinsic dimensions and has an intrinsic ratio the d imensions must be assumed to be the 993 // If the image has no intrinsic dimensions and has an intrinsic ratio the d imensions must be assumed to be the
998 // largest dimensions at that ratio such that neither dimension exceeds the dimensions of the rectangle that 994 // largest dimensions at that ratio such that neither dimension exceeds the dimensions of the rectangle that
999 // establishes the coordinate system for the 'background-position' property. 995 // establishes the coordinate system for the 'background-position' property.
1000 if (!resolvedWidth && !resolvedHeight && !intrinsicRatio.isEmpty()) 996 if (!intrinsicRatio.isEmpty())
1001 return resolveAgainstIntrinsicRatio(positioningAreaSize, intrinsicRatio) ; 997 return resolveAgainstIntrinsicRatio(positioningAreaSize, intrinsicRatio) ;
1002 998
1003 // If the image has no intrinsic ratio either, then the dimensions must be a ssumed to be the rectangle that 999 // If the image has no intrinsic ratio either, then the dimensions must be a ssumed to be the rectangle that
1004 // establishes the coordinate system for the 'background-position' property. 1000 // establishes the coordinate system for the 'background-position' property.
1005 return positioningAreaSize; 1001 return positioningAreaSize;
1006 } 1002 }
1007 1003
1008 IntSize RenderBoxModelObject::calculateFillTileSize(const FillLayer* fillLayer, const IntSize& positioningAreaSize) const 1004 IntSize RenderBoxModelObject::calculateFillTileSize(const FillLayer* fillLayer, const IntSize& positioningAreaSize) const
1009 { 1005 {
1010 StyleImage* image = fillLayer->image(); 1006 StyleImage* image = fillLayer->image();
(...skipping 1922 matching lines...) Expand 10 before | Expand all | Expand 10 after
2933 bool preserve3D = useTransforms && (o->style()->preserves3D() || style()->pr eserves3D()); 2929 bool preserve3D = useTransforms && (o->style()->preserves3D() || style()->pr eserves3D());
2934 if (useTransforms && shouldUseTransformFromContainer(o)) { 2930 if (useTransforms && shouldUseTransformFromContainer(o)) {
2935 TransformationMatrix t; 2931 TransformationMatrix t;
2936 getTransformFromContainer(o, containerOffset, t); 2932 getTransformFromContainer(o, containerOffset, t);
2937 transformState.applyTransform(t, preserve3D ? TransformState::Accumulate Transform : TransformState::FlattenTransform); 2933 transformState.applyTransform(t, preserve3D ? TransformState::Accumulate Transform : TransformState::FlattenTransform);
2938 } else 2934 } else
2939 transformState.move(containerOffset.width(), containerOffset.height(), p reserve3D ? TransformState::AccumulateTransform : TransformState::FlattenTransfo rm); 2935 transformState.move(containerOffset.width(), containerOffset.height(), p reserve3D ? TransformState::AccumulateTransform : TransformState::FlattenTransfo rm);
2940 } 2936 }
2941 2937
2942 } // namespace WebCore 2938 } // namespace WebCore
OLDNEW
« no previous file with comments | « Source/WebCore/platform/graphics/IntSize.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698