OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "core/paint/NinePieceImageGrid.h" | 5 #include "core/paint/NinePieceImageGrid.h" |
6 | 6 |
7 #include "core/style/ComputedStyle.h" | 7 #include "core/style/ComputedStyle.h" |
8 #include "core/style/NinePieceImage.h" | 8 #include "core/style/NinePieceImage.h" |
9 #include "platform/LengthFunctions.h" | 9 #include "platform/LengthFunctions.h" |
10 #include "platform/geometry/FloatSize.h" | 10 #include "platform/geometry/FloatSize.h" |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
52 m_right.width = computeEdgeWidth(ninePieceImage.borderSlices().right(), | 52 m_right.width = computeEdgeWidth(ninePieceImage.borderSlices().right(), |
53 borderWidths.right(), m_right.slice, | 53 borderWidths.right(), m_right.slice, |
54 borderImageArea.width()); | 54 borderImageArea.width()); |
55 m_bottom.width = computeEdgeWidth(ninePieceImage.borderSlices().bottom(), | 55 m_bottom.width = computeEdgeWidth(ninePieceImage.borderSlices().bottom(), |
56 borderWidths.bottom(), m_bottom.slice, | 56 borderWidths.bottom(), m_bottom.slice, |
57 borderImageArea.height()); | 57 borderImageArea.height()); |
58 m_left.width = computeEdgeWidth(ninePieceImage.borderSlices().left(), | 58 m_left.width = computeEdgeWidth(ninePieceImage.borderSlices().left(), |
59 borderWidths.left(), m_left.slice, | 59 borderWidths.left(), m_left.slice, |
60 borderImageArea.width()); | 60 borderImageArea.width()); |
61 | 61 |
62 // The spec says: Given Lwidth as the width of the border image area, Lheight
as its height, and Wside as the border | 62 // The spec says: Given Lwidth as the width of the border image area, Lheight |
63 // image width offset for the side, let f = min(Lwidth/(Wleft+Wright), Lheight
/(Wtop+Wbottom)). If f < 1, then all W | 63 // as its height, and Wside as the border image width offset for the side, let |
64 // are reduced by multiplying them by f. | 64 // f = min(Lwidth/(Wleft+Wright), Lheight/(Wtop+Wbottom)). If f < 1, then all |
| 65 // W are reduced by multiplying them by f. |
65 int borderSideWidth = std::max(1, m_left.width + m_right.width); | 66 int borderSideWidth = std::max(1, m_left.width + m_right.width); |
66 int borderSideHeight = std::max(1, m_top.width + m_bottom.width); | 67 int borderSideHeight = std::max(1, m_top.width + m_bottom.width); |
67 float borderSideScaleFactor = | 68 float borderSideScaleFactor = |
68 std::min((float)borderImageArea.width() / borderSideWidth, | 69 std::min((float)borderImageArea.width() / borderSideWidth, |
69 (float)borderImageArea.height() / borderSideHeight); | 70 (float)borderImageArea.height() / borderSideHeight); |
70 if (borderSideScaleFactor < 1) { | 71 if (borderSideScaleFactor < 1) { |
71 m_top.width *= borderSideScaleFactor; | 72 m_top.width *= borderSideScaleFactor; |
72 m_right.width *= borderSideScaleFactor; | 73 m_right.width *= borderSideScaleFactor; |
73 m_bottom.width *= borderSideScaleFactor; | 74 m_bottom.width *= borderSideScaleFactor; |
74 m_left.width *= borderSideScaleFactor; | 75 m_left.width *= borderSideScaleFactor; |
75 } | 76 } |
76 } | 77 } |
77 | 78 |
78 // Given a rectangle, construct a subrectangle using offset, width and height. N
egative offsets are relative to the | 79 // Given a rectangle, construct a subrectangle using offset, width and height. |
79 // extent of the given rectangle. | 80 // Negative offsets are relative to the extent of the given rectangle. |
80 static FloatRect subrect(IntRect rect, | 81 static FloatRect subrect(IntRect rect, |
81 float offsetX, | 82 float offsetX, |
82 float offsetY, | 83 float offsetY, |
83 float width, | 84 float width, |
84 float height) { | 85 float height) { |
85 float baseX = rect.x(); | 86 float baseX = rect.x(); |
86 if (offsetX < 0) | 87 if (offsetX < 0) |
87 baseX = rect.maxX(); | 88 baseX = rect.maxX(); |
88 | 89 |
89 float baseY = rect.y(); | 90 float baseY = rect.y(); |
(...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
251 middleScaleFactor.setWidth(m_top.scale()); | 252 middleScaleFactor.setWidth(m_top.scale()); |
252 else if (m_bottom.isDrawable()) | 253 else if (m_bottom.isDrawable()) |
253 middleScaleFactor.setWidth(m_bottom.scale()); | 254 middleScaleFactor.setWidth(m_bottom.scale()); |
254 | 255 |
255 if (m_left.isDrawable()) | 256 if (m_left.isDrawable()) |
256 middleScaleFactor.setHeight(m_left.scale()); | 257 middleScaleFactor.setHeight(m_left.scale()); |
257 else if (m_right.isDrawable()) | 258 else if (m_right.isDrawable()) |
258 middleScaleFactor.setHeight(m_right.scale()); | 259 middleScaleFactor.setHeight(m_right.scale()); |
259 | 260 |
260 if (!sourceSize.isEmpty()) { | 261 if (!sourceSize.isEmpty()) { |
261 // For "stretch" rules, just override the scale factor and replace. We only
have to do this for the center tile, | 262 // For "stretch" rules, just override the scale factor and replace. We only |
262 // since sides don't even use the scale factor unless they have a rule other
than "stretch". The middle however | 263 // have to do this for the center tile, since sides don't even use the scale |
263 // can have "stretch" specified in one axis but not the other, so we have to
correct the scale here. | 264 // factor unless they have a rule other than "stretch". The middle however |
| 265 // can have "stretch" specified in one axis but not the other, so we have to |
| 266 // correct the scale here. |
264 if (m_horizontalTileRule == (Image::TileRule)StretchImageRule) | 267 if (m_horizontalTileRule == (Image::TileRule)StretchImageRule) |
265 middleScaleFactor.setWidth((float)destinationSize.width() / | 268 middleScaleFactor.setWidth((float)destinationSize.width() / |
266 sourceSize.width()); | 269 sourceSize.width()); |
267 | 270 |
268 if (m_verticalTileRule == (Image::TileRule)StretchImageRule) | 271 if (m_verticalTileRule == (Image::TileRule)StretchImageRule) |
269 middleScaleFactor.setHeight((float)destinationSize.height() / | 272 middleScaleFactor.setHeight((float)destinationSize.height() / |
270 sourceSize.height()); | 273 sourceSize.height()); |
271 } | 274 } |
272 | 275 |
273 drawInfo.tileScale = middleScaleFactor; | 276 drawInfo.tileScale = middleScaleFactor; |
(...skipping 11 matching lines...) Expand all Loading... |
285 piece == BottomRightPiece; | 288 piece == BottomRightPiece; |
286 | 289 |
287 if (drawInfo.isCornerPiece) | 290 if (drawInfo.isCornerPiece) |
288 setDrawInfoCorner(drawInfo, piece); | 291 setDrawInfoCorner(drawInfo, piece); |
289 else if (piece != MiddlePiece) | 292 else if (piece != MiddlePiece) |
290 setDrawInfoEdge(drawInfo, piece); | 293 setDrawInfoEdge(drawInfo, piece); |
291 else | 294 else |
292 setDrawInfoMiddle(drawInfo); | 295 setDrawInfoMiddle(drawInfo); |
293 | 296 |
294 if (imageScaleFactor != 1) { | 297 if (imageScaleFactor != 1) { |
295 // The nine piece grid is computed in unscaled image coordinates but must be
drawn using | 298 // The nine piece grid is computed in unscaled image coordinates but must be |
296 // scaled image coordinates. | 299 // drawn using scaled image coordinates. |
297 drawInfo.source.scale(imageScaleFactor); | 300 drawInfo.source.scale(imageScaleFactor); |
298 | 301 |
299 // Compensate for source scaling by scaling down the individual tiles. | 302 // Compensate for source scaling by scaling down the individual tiles. |
300 drawInfo.tileScale.scale(1 / imageScaleFactor); | 303 drawInfo.tileScale.scale(1 / imageScaleFactor); |
301 } | 304 } |
302 | 305 |
303 return drawInfo; | 306 return drawInfo; |
304 } | 307 } |
305 | 308 |
306 } // namespace blink | 309 } // namespace blink |
OLD | NEW |