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

Side by Side Diff: Source/core/paint/NinePieceImageGridTest.cpp

Issue 1180053009: Rewrite nine piece image painting code (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Address review comments Created 5 years, 6 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/core/paint/NinePieceImageGrid.cpp ('k') | Source/core/paint/NinePieceImagePainter.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "config.h"
6 #include "core/paint/NinePieceImageGrid.h"
7
8 #include "core/css/CSSGradientValue.h"
9 #include "core/layout/LayoutTestHelper.h"
10 #include "core/style/ComputedStyle.h"
11 #include "core/style/NinePieceImage.h"
12 #include "core/style/StyleGeneratedImage.h"
13 #include <gtest/gtest.h>
14
15 namespace blink {
16 namespace {
17
18 class NinePieceImageGridTest : public RenderingTest {
19 public:
20 NinePieceImageGridTest() { }
21
22 PassRefPtr<StyleImage> generatedImage()
23 {
24 RefPtr<CSSLinearGradientValue> gradient = CSSLinearGradientValue::create (Repeating);
25 RefPtr<StyleGeneratedImage> image = StyleGeneratedImage::create(gradient .get());
26 return image;
27 }
28
29 private:
30 virtual void SetUp() override
31 {
32 RenderingTest::SetUp();
33 }
34 };
35
36 TEST_F(NinePieceImageGridTest, NinePieceImagePainting_NoDrawables)
37 {
38 NinePieceImage ninePiece;
39 ninePiece.setImage(generatedImage());
40
41 IntSize imageSize(100, 100);
42 IntRect borderImageArea(0, 0, 100, 100);
43 IntRectOutsets borderWidths(0, 0, 0, 0);
44
45 NinePieceImageGrid grid = NinePieceImageGrid(ninePiece, imageSize, borderIma geArea, borderWidths);
46 for (NinePiece piece = MinPiece; piece < MaxPiece; ++piece) {
47 NinePieceImageGrid::NinePieceDrawInfo drawInfo = grid.getNinePieceDrawIn fo(piece);
48 EXPECT_FALSE(drawInfo.isDrawable);
49 }
50 }
51
52 TEST_F(NinePieceImageGridTest, NinePieceImagePainting_AllDrawable)
53 {
54 NinePieceImage ninePiece;
55 ninePiece.setImage(generatedImage());
56 ninePiece.setImageSlices(LengthBox(10, 10, 10, 10));
57 ninePiece.setFill(true);
58
59 IntSize imageSize(100, 100);
60 IntRect borderImageArea(0, 0, 100, 100);
61 IntRectOutsets borderWidths(10, 10, 10, 10);
62
63 NinePieceImageGrid grid = NinePieceImageGrid(ninePiece, imageSize, borderIma geArea, borderWidths);
64 for (NinePiece piece = MinPiece; piece < MaxPiece; ++piece) {
65 NinePieceImageGrid::NinePieceDrawInfo drawInfo = grid.getNinePieceDrawIn fo(piece);
66 EXPECT_TRUE(drawInfo.isDrawable);
67 }
68 }
69
70 TEST_F(NinePieceImageGridTest, NinePieceImagePainting_NoFillMiddleNotDrawable)
71 {
72 NinePieceImage ninePiece;
73 ninePiece.setImage(generatedImage());
74 ninePiece.setImageSlices(LengthBox(10, 10, 10, 10));
75 ninePiece.setFill(false); // default
76
77 IntSize imageSize(100, 100);
78 IntRect borderImageArea(0, 0, 100, 100);
79 IntRectOutsets borderWidths(10, 10, 10, 10);
80
81 NinePieceImageGrid grid = NinePieceImageGrid(ninePiece, imageSize, borderIma geArea, borderWidths);
82 for (NinePiece piece = MinPiece; piece < MaxPiece; ++piece) {
83 NinePieceImageGrid::NinePieceDrawInfo drawInfo = grid.getNinePieceDrawIn fo(piece);
84 if (piece != MiddlePiece)
85 EXPECT_TRUE(drawInfo.isDrawable);
86 else
87 EXPECT_FALSE(drawInfo.isDrawable);
88 }
89 }
90
91 TEST_F(NinePieceImageGridTest, NinePieceImagePainting_TopLeftDrawable)
92 {
93 NinePieceImage ninePiece;
94 ninePiece.setImage(generatedImage());
95 ninePiece.setImageSlices(LengthBox(10, 10, 10, 10));
96
97 IntSize imageSize(100, 100);
98 IntRect borderImageArea(0, 0, 100, 100);
99 IntRectOutsets borderWidths(10, 10, 10, 10);
100
101 const struct {
102 IntRectOutsets borderWidths;
103 bool expectedIsDrawable;
104 } testCases[] = {
105 { IntRectOutsets(0, 0, 0, 0), false },
106 { IntRectOutsets(10, 0, 0, 0), false },
107 { IntRectOutsets(0, 0, 0, 10), false },
108 { IntRectOutsets(10, 0, 0, 10), true },
109 };
110
111 for (const auto& testCase : testCases) {
112 NinePieceImageGrid grid = NinePieceImageGrid(ninePiece, imageSize, borde rImageArea, testCase.borderWidths);
113 for (NinePiece piece = MinPiece; piece < MaxPiece; ++piece) {
114 NinePieceImageGrid::NinePieceDrawInfo drawInfo = grid.getNinePieceDr awInfo(piece);
115 if (piece == TopLeftPiece)
116 EXPECT_EQ(drawInfo.isDrawable, testCase.expectedIsDrawable);
117 }
118 }
119 }
120
121 TEST_F(NinePieceImageGridTest, NinePieceImagePainting_ScaleDownBorder)
122 {
123 NinePieceImage ninePiece;
124 ninePiece.setImage(generatedImage());
125 ninePiece.setImageSlices(LengthBox(10, 10, 10, 10));
126
127 IntSize imageSize(100, 100);
128 IntRect borderImageArea(0, 0, 100, 100);
129 IntRectOutsets borderWidths(10, 10, 10, 10);
130
131 // Set border slices wide enough so that the widths are scaled
132 // down and corner pieces cover the entire border image area.
133 ninePiece.setBorderSlices(BorderImageLengthBox(6));
134
135 NinePieceImageGrid grid = NinePieceImageGrid(ninePiece, imageSize, borderIma geArea, borderWidths);
136 for (NinePiece piece = MinPiece; piece < MaxPiece; ++piece) {
137 NinePieceImageGrid::NinePieceDrawInfo drawInfo = grid.getNinePieceDrawIn fo(piece);
138 if (drawInfo.isCornerPiece)
139 EXPECT_EQ(drawInfo.destination.size(), FloatSize(50, 50));
140 else
141 EXPECT_TRUE(drawInfo.destination.size().isEmpty());
142 }
143 }
144
145 TEST_F(NinePieceImageGridTest, NinePieceImagePainting)
146 {
147 const struct {
148 IntSize imageSize;
149 IntRect borderImageArea;
150 IntRectOutsets borderWidths;
151 bool fill;
152 LengthBox imageSlices;
153 Image::TileRule horizontalRule;
154 Image::TileRule verticalRule;
155 struct {
156 bool isDrawable;
157 bool isCornerPiece;
158 FloatRect destination;
159 FloatRect source;
160 float tileScaleHorizontal;
161 float tileScaleVertical;
162 Image::TileRule horizontalRule;
163 Image::TileRule verticalRule;
164 } pieces[9];
165 } testCases[] = {
166 {
167 // Empty border and slices but with fill
168 IntSize(100, 100), IntRect(0, 0, 100, 100), IntRectOutsets(0, 0, 0, 0), true,
169 LengthBox(Length(0, Fixed), Length(0, Fixed), Length(0, Fixed), Leng th(0, Fixed)), Image::StretchTile, Image::StretchTile, {
170 { false, true, FloatRect(0, 0, 0, 0), FloatRect(0, 0, 0, 0), 1, 1, Image::StretchTile, Image::StretchTile },
171 { false, true, FloatRect(0, 0, 0, 0), FloatRect(0, 0, 0, 0), 1, 1, Image::StretchTile, Image::StretchTile },
172 { false, false, FloatRect(0, 0, 0, 0), FloatRect(0, 0, 0, 0), 0, 0, Image::StretchTile, Image::StretchTile },
173 { false, true, FloatRect(0, 0, 0, 0), FloatRect(0, 0, 0, 0), 1, 1, Image::StretchTile, Image::StretchTile },
174 { false, true, FloatRect(0, 0, 0, 0), FloatRect(0, 0, 0, 0), 1, 1, Image::StretchTile, Image::StretchTile },
175 { false, false, FloatRect(0, 0, 0, 0), FloatRect(0, 0, 0, 0), 0, 0, Image::StretchTile, Image::StretchTile },
176 { false, false, FloatRect(0, 0, 0, 0), FloatRect(0, 0, 0, 0), 0, 0, Image::StretchTile, Image::StretchTile },
177 { false, false, FloatRect(0, 0, 0, 0), FloatRect(0, 0, 0, 0), 0, 0, Image::StretchTile, Image::StretchTile },
178 { true, false, FloatRect(0, 0, 100, 100), FloatRect(0, 0, 100, 1 00), 1, 1, Image::StretchTile, Image::StretchTile },
179 }}, {
180 // Single border and fill
181 IntSize(100, 100), IntRect(0, 0, 100, 100), IntRectOutsets(0, 0, 10, 0), true,
182 LengthBox(Length(20, Percent), Length(20, Percent), Length(20, Perce nt), Length(20, Percent)), Image::StretchTile, Image::StretchTile, {
183 { false, true, FloatRect(0, 0, 0, 0), FloatRect(0, 0, 0, 0), 1, 1, Image::StretchTile, Image::StretchTile },
184 { false, true, FloatRect(0, 0, 0, 0), FloatRect(0, 0, 0, 0), 1, 1, Image::StretchTile, Image::StretchTile },
185 { false, false, FloatRect(0, 0, 0, 0), FloatRect(0, 0, 0, 0), 0, 0, Image::StretchTile, Image::StretchTile },
186 { false, true, FloatRect(0, 0, 0, 0), FloatRect(0, 0, 0, 0), 1, 1, Image::StretchTile, Image::StretchTile },
187 { false, true, FloatRect(0, 0, 0, 0), FloatRect(0, 0, 0, 0), 1, 1, Image::StretchTile, Image::StretchTile },
188 { false, false, FloatRect(0, 0, 0, 0), FloatRect(0, 0, 0, 0), 0, 0, Image::StretchTile, Image::StretchTile },
189 { false, false, FloatRect(0, 0, 0, 0), FloatRect(0, 0, 0, 0), 0, 0, Image::StretchTile, Image::StretchTile },
190 { true, false, FloatRect(0, 90, 100, 10), FloatRect(20, 80, 60, 20), 0.5, 0.5, Image::StretchTile, Image::StretchTile },
191 { true, false, FloatRect(0, 0, 100, 90), FloatRect(20, 20, 60, 6 0), 1.666667, 1.5, Image::StretchTile, Image::StretchTile },
192 }}, {
193 // All borders, no fill
194 IntSize(100, 100), IntRect(0, 0, 100, 100), IntRectOutsets(10, 10, 1 0, 10), false,
195 LengthBox(Length(20, Percent), Length(20, Percent), Length(20, Perce nt), Length(20, Percent)), Image::StretchTile, Image::StretchTile, {
196 { true, true, FloatRect(0, 0, 10, 10), FloatRect(0, 0, 20, 20), 1, 1, Image::StretchTile, Image::StretchTile },
197 { true, true, FloatRect(0, 90, 10, 10), FloatRect(0, 80, 20, 20) , 1, 1, Image::StretchTile, Image::StretchTile },
198 { true, false, FloatRect(0, 10, 10, 80), FloatRect(0, 20, 20, 60 ), 0.5, 0.5, Image::StretchTile, Image::StretchTile },
199 { true, true, FloatRect(90, 0, 10, 10), FloatRect(80, 0, 20, 20) , 1, 1, Image::StretchTile, Image::StretchTile },
200 { true, true, FloatRect(90, 90, 10, 10), FloatRect(80, 80, 20, 2 0), 1, 1, Image::StretchTile, Image::StretchTile },
201 { true, false, FloatRect(90, 10, 10, 80), FloatRect(80, 20, 20, 60), 0.5, 0.5, Image::StretchTile, Image::StretchTile },
202 { true, false, FloatRect(10, 0, 80, 10), FloatRect(20, 0, 60, 20 ), 0.5, 0.5, Image::StretchTile, Image::StretchTile },
203 { true, false, FloatRect(10, 90, 80, 10), FloatRect(20, 80, 60, 20), 0.5, 0.5, Image::StretchTile, Image::StretchTile },
204 { false, false, FloatRect(0, 0, 0, 0), FloatRect(0, 0, 0, 0), 0, 0, Image::StretchTile, Image::StretchTile },
205 }}, {
206 // Single border, no fill
207 IntSize(100, 100), IntRect(0, 0, 100, 100), IntRectOutsets(0, 0, 0, 10), false,
208 LengthBox(Length(20, Percent), Length(20, Percent), Length(20, Perce nt), Length(20, Percent)), Image::StretchTile, Image::RoundTile, {
209 { false, true, FloatRect(0, 0, 0, 0), FloatRect(0, 0, 0, 0), 1, 1, Image::StretchTile, Image::StretchTile },
210 { false, true, FloatRect(0, 0, 0, 0), FloatRect(0, 0, 0, 0), 1, 1, Image::StretchTile, Image::StretchTile },
211 { true, false, FloatRect(0, 0, 10, 100), FloatRect(0, 20, 20, 60 ), 0.5, 0.5, Image::StretchTile, Image::RoundTile },
212 { false, true, FloatRect(0, 0, 0, 0), FloatRect(0, 0, 0, 0), 1, 1, Image::StretchTile, Image::StretchTile },
213 { false, true, FloatRect(0, 0, 0, 0), FloatRect(0, 0, 0, 0), 1, 1, Image::StretchTile, Image::StretchTile },
214 { false, false, FloatRect(0, 0, 0, 0), FloatRect(0, 0, 0, 0), 0, 0, Image::StretchTile, Image::RoundTile },
215 { false, false, FloatRect(0, 0, 0, 0), FloatRect(0, 0, 0, 0), 0, 0, Image::StretchTile, Image::RoundTile },
216 { false, false, FloatRect(0, 0, 0, 0), FloatRect(0, 0, 0, 0), 0, 0, Image::StretchTile, Image::RoundTile },
217 { false, false, FloatRect(0, 0, 0, 0), FloatRect(0, 0, 0, 0), 0, 0, Image::StretchTile, Image::RoundTile },
218 }}, {
219 // All borders but no slices, with fill (stretch horizontally, space vertically)
220 IntSize(100, 100), IntRect(0, 0, 100, 100), IntRectOutsets(10, 10, 1 0, 10), true,
221 LengthBox(Length(0, Fixed), Length(0, Fixed), Length(0, Fixed), Leng th(0, Fixed)), Image::StretchTile, Image::SpaceTile, {
222 { false, true, FloatRect(0, 0, 0, 0), FloatRect(0, 0, 0, 0), 1, 1, Image::StretchTile, Image::StretchTile },
223 { false, true, FloatRect(0, 0, 0, 0), FloatRect(0, 0, 0, 0), 1, 1, Image::StretchTile, Image::StretchTile },
224 { false, false, FloatRect(0, 0, 0, 0), FloatRect(0, 0, 0, 0), 0, 0, Image::StretchTile, Image::SpaceTile },
225 { false, true, FloatRect(0, 0, 0, 0), FloatRect(0, 0, 0, 0), 1, 1, Image::StretchTile, Image::StretchTile },
226 { false, true, FloatRect(0, 0, 0, 0), FloatRect(0, 0, 0, 0), 1, 1, Image::StretchTile, Image::StretchTile },
227 { false, false, FloatRect(0, 0, 0, 0), FloatRect(0, 0, 0, 0), 0, 0, Image::StretchTile, Image::SpaceTile },
228 { false, false, FloatRect(0, 0, 0, 0), FloatRect(0, 0, 0, 0), 0, 0, Image::StretchTile, Image::SpaceTile },
229 { false, false, FloatRect(0, 0, 0, 0), FloatRect(0, 0, 0, 0), 0, 0, Image::StretchTile, Image::SpaceTile },
230 { true, false, FloatRect(10, 10, 80, 80), FloatRect(0, 0, 100, 1 00), 0.800000, 1, Image::StretchTile, Image::SpaceTile },
231 }},
232 };
233
234 for (auto& testCase : testCases) {
235 NinePieceImage ninePiece;
236 ninePiece.setImage(generatedImage());
237 ninePiece.setFill(testCase.fill);
238 ninePiece.setImageSlices(testCase.imageSlices);
239 ninePiece.setHorizontalRule((ENinePieceImageRule)testCase.horizontalRule );
240 ninePiece.setVerticalRule((ENinePieceImageRule)testCase.verticalRule);
241
242 NinePieceImageGrid grid = NinePieceImageGrid(ninePiece, testCase.imageSi ze, testCase.borderImageArea, testCase.borderWidths);
243 for (NinePiece piece = MinPiece; piece < MaxPiece; ++piece) {
244 NinePieceImageGrid::NinePieceDrawInfo drawInfo = grid.getNinePieceDr awInfo(piece);
245 EXPECT_EQ(testCase.pieces[piece].isDrawable, drawInfo.isDrawable);
246 if (!testCase.pieces[piece].isDrawable)
247 continue;
248
249 EXPECT_EQ(testCase.pieces[piece].destination.x(), drawInfo.destinati on.x());
250 EXPECT_EQ(testCase.pieces[piece].destination.y(), drawInfo.destinati on.y());
251 EXPECT_EQ(testCase.pieces[piece].destination.width(), drawInfo.desti nation.width());
252 EXPECT_EQ(testCase.pieces[piece].destination.height(), drawInfo.dest ination.height());
253 EXPECT_EQ(testCase.pieces[piece].source.x(), drawInfo.source.x());
254 EXPECT_EQ(testCase.pieces[piece].source.y(), drawInfo.source.y());
255 EXPECT_EQ(testCase.pieces[piece].source.width(), drawInfo.source.wid th());
256 EXPECT_EQ(testCase.pieces[piece].source.height(), drawInfo.source.he ight());
257
258 if (testCase.pieces[piece].isCornerPiece)
259 continue;
260
261 EXPECT_FLOAT_EQ(testCase.pieces[piece].tileScaleHorizontal, drawInfo .tileScale.width());
262 EXPECT_FLOAT_EQ(testCase.pieces[piece].tileScaleVertical, drawInfo.t ileScale.height());
263 EXPECT_EQ(testCase.pieces[piece].horizontalRule, drawInfo.tileRule.h orizontal);
264 EXPECT_EQ(testCase.pieces[piece].verticalRule, drawInfo.tileRule.ver tical);
265 }
266 }
267 }
268
269 } // namespace
270 } // namespace blink
271
OLDNEW
« no previous file with comments | « Source/core/paint/NinePieceImageGrid.cpp ('k') | Source/core/paint/NinePieceImagePainter.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698