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

Side by Side Diff: Source/core/rendering/shapes/Shape.cpp

Issue 195793009: [CSS Shapes] inset does not properly clamp large corner radii (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Remove the explicit inline Created 6 years, 9 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) 2012 Adobe Systems Incorporated. All rights reserved. 2 * Copyright (C) 2012 Adobe Systems Incorporated. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions 5 * modification, are permitted provided that the following conditions
6 * are met: 6 * are met:
7 * 7 *
8 * 1. Redistributions of source code must retain the above 8 * 1. Redistributions of source code must retain the above
9 * copyright notice, this list of conditions and the following 9 * copyright notice, this list of conditions and the following
10 * disclaimer. 10 * disclaimer.
(...skipping 18 matching lines...) Expand all
29 29
30 #include "config.h" 30 #include "config.h"
31 #include "core/rendering/shapes/Shape.h" 31 #include "core/rendering/shapes/Shape.h"
32 32
33 #include "core/css/BasicShapeFunctions.h" 33 #include "core/css/BasicShapeFunctions.h"
34 #include "core/fetch/ImageResource.h" 34 #include "core/fetch/ImageResource.h"
35 #include "core/rendering/shapes/BoxShape.h" 35 #include "core/rendering/shapes/BoxShape.h"
36 #include "core/rendering/shapes/PolygonShape.h" 36 #include "core/rendering/shapes/PolygonShape.h"
37 #include "core/rendering/shapes/RasterShape.h" 37 #include "core/rendering/shapes/RasterShape.h"
38 #include "core/rendering/shapes/RectangleShape.h" 38 #include "core/rendering/shapes/RectangleShape.h"
39 #include "core/rendering/style/RenderStyle.h"
39 #include "platform/LengthFunctions.h" 40 #include "platform/LengthFunctions.h"
40 #include "platform/geometry/FloatRoundedRect.h"
41 #include "platform/geometry/FloatSize.h" 41 #include "platform/geometry/FloatSize.h"
42 #include "platform/graphics/ImageBuffer.h" 42 #include "platform/graphics/ImageBuffer.h"
43 #include "platform/graphics/WindRule.h" 43 #include "platform/graphics/WindRule.h"
44 #include "wtf/MathExtras.h" 44 #include "wtf/MathExtras.h"
45 #include "wtf/OwnPtr.h" 45 #include "wtf/OwnPtr.h"
46 46
47 namespace WebCore { 47 namespace WebCore {
48 48
49 static PassOwnPtr<Shape> createInsetShape(const FloatRoundedRect& bounds) 49 static PassOwnPtr<Shape> createInsetShape(const FloatRoundedRect& bounds)
50 { 50 {
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
93 return point.transposedPoint(); 93 return point.transposedPoint();
94 } 94 }
95 95
96 static inline FloatSize physicalSizeToLogical(const FloatSize& size, WritingMode writingMode) 96 static inline FloatSize physicalSizeToLogical(const FloatSize& size, WritingMode writingMode)
97 { 97 {
98 if (isHorizontalWritingMode(writingMode)) 98 if (isHorizontalWritingMode(writingMode))
99 return size; 99 return size;
100 return size.transposedSize(); 100 return size.transposedSize();
101 } 101 }
102 102
103 static inline void ensureRadiiDoNotOverlap(FloatRect &bounds, FloatSize &radii) 103 static inline void ensureRadiiDoNotOverlap(FloatRect& bounds, FloatSize& radii)
104 { 104 {
105 float widthRatio = bounds.width() / (2 * radii.width()); 105 float widthRatio = bounds.width() / (2 * radii.width());
106 float heightRatio = bounds.height() / (2 * radii.height()); 106 float heightRatio = bounds.height() / (2 * radii.height());
107 float reductionRatio = std::min<float>(widthRatio, heightRatio); 107 float reductionRatio = std::min<float>(widthRatio, heightRatio);
108 if (reductionRatio < 1) { 108 if (reductionRatio < 1) {
109 radii.setWidth(reductionRatio * radii.width()); 109 radii.setWidth(reductionRatio * radii.width());
110 radii.setHeight(reductionRatio * radii.height()); 110 radii.setHeight(reductionRatio * radii.height());
111 } 111 }
112 } 112 }
113 113
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after
234 FloatRect rect(left, top, std::max<float>(boxWidth - left - right, 0), s td::max<float>(boxHeight - top - bottom, 0)); 234 FloatRect rect(left, top, std::max<float>(boxWidth - left - right, 0), s td::max<float>(boxHeight - top - bottom, 0));
235 FloatRect logicalRect = physicalRectToLogical(rect, logicalBoxSize.heigh t(), writingMode); 235 FloatRect logicalRect = physicalRectToLogical(rect, logicalBoxSize.heigh t(), writingMode);
236 236
237 FloatSize boxSize(boxWidth, boxHeight); 237 FloatSize boxSize(boxWidth, boxHeight);
238 FloatRoundedRect::Radii cornerRadii( 238 FloatRoundedRect::Radii cornerRadii(
239 floatSizeForLengthSize(inset.topLeftRadius(), boxSize), 239 floatSizeForLengthSize(inset.topLeftRadius(), boxSize),
240 floatSizeForLengthSize(inset.topRightRadius(), boxSize), 240 floatSizeForLengthSize(inset.topRightRadius(), boxSize),
241 floatSizeForLengthSize(inset.bottomLeftRadius(), boxSize), 241 floatSizeForLengthSize(inset.bottomLeftRadius(), boxSize),
242 floatSizeForLengthSize(inset.bottomRightRadius(), boxSize)); 242 floatSizeForLengthSize(inset.bottomRightRadius(), boxSize));
243 243
244 cornerRadii.scale(calcBorderRadiiConstraintScaleFor(logicalRect, cornerR adii));
245
244 shape = createInsetShape(FloatRoundedRect(logicalRect, cornerRadii)); 246 shape = createInsetShape(FloatRoundedRect(logicalRect, cornerRadii));
245 break; 247 break;
246 } 248 }
247 249
248 default: 250 default:
249 ASSERT_NOT_REACHED(); 251 ASSERT_NOT_REACHED();
250 } 252 }
251 253
252 shape->m_writingMode = writingMode; 254 shape->m_writingMode = writingMode;
253 shape->m_margin = floatValueForLength(margin, 0); 255 shape->m_margin = floatValueForLength(margin, 0);
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
304 FloatRoundedRect bounds(rect, roundedRect.radii()); 306 FloatRoundedRect bounds(rect, roundedRect.radii());
305 OwnPtr<Shape> shape = createInsetShape(bounds); 307 OwnPtr<Shape> shape = createInsetShape(bounds);
306 shape->m_writingMode = writingMode; 308 shape->m_writingMode = writingMode;
307 shape->m_margin = floatValueForLength(margin, 0); 309 shape->m_margin = floatValueForLength(margin, 0);
308 shape->m_padding = floatValueForLength(padding, 0); 310 shape->m_padding = floatValueForLength(padding, 0);
309 311
310 return shape.release(); 312 return shape.release();
311 } 313 }
312 314
313 } // namespace WebCore 315 } // namespace WebCore
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698