OLD | NEW |
| (Empty) |
1 // Copyright 2013 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 <stddef.h> | |
6 | |
7 #include "cc/output/filter_operations.h" | |
8 #include "testing/gtest/include/gtest/gtest.h" | |
9 #include "third_party/skia/include/effects/SkBlurImageFilter.h" | |
10 #include "third_party/skia/include/effects/SkDropShadowImageFilter.h" | |
11 #include "third_party/skia/include/effects/SkOffsetImageFilter.h" | |
12 #include "third_party/skia/include/effects/SkXfermodeImageFilter.h" | |
13 #include "ui/gfx/geometry/point.h" | |
14 #include "ui/gfx/geometry/rect.h" | |
15 | |
16 namespace cc { | |
17 namespace { | |
18 | |
19 TEST(FilterOperationsTest, GetOutsetsBlur) { | |
20 FilterOperations ops; | |
21 ops.Append(FilterOperation::CreateBlurFilter(20)); | |
22 int top, right, bottom, left; | |
23 top = right = bottom = left = 0; | |
24 ops.GetOutsets(&top, &right, &bottom, &left); | |
25 EXPECT_EQ(60, top); | |
26 EXPECT_EQ(60, right); | |
27 EXPECT_EQ(60, bottom); | |
28 EXPECT_EQ(60, left); | |
29 } | |
30 | |
31 TEST(FilterOperationsTest, MapRectBlur) { | |
32 FilterOperations ops; | |
33 ops.Append(FilterOperation::CreateBlurFilter(20)); | |
34 EXPECT_EQ(gfx::Rect(-60, -60, 130, 130), | |
35 ops.MapRect(gfx::Rect(0, 0, 10, 10), SkMatrix::I())); | |
36 EXPECT_EQ(gfx::Rect(-120, -120, 260, 260), | |
37 ops.MapRect(gfx::Rect(0, 0, 20, 20), SkMatrix::MakeScale(2, 2))); | |
38 EXPECT_EQ(gfx::Rect(-60, -70, 130, 130), | |
39 ops.MapRect(gfx::Rect(0, -10, 10, 10), SkMatrix::MakeScale(1, -1))); | |
40 } | |
41 | |
42 TEST(FilterOperationsTest, MapRectBlurOverflow) { | |
43 // Passes if float-cast-overflow does not occur in ubsan builds. | |
44 // The blur spread exceeds INT_MAX. | |
45 FilterOperations ops; | |
46 ops.Append(FilterOperation::CreateBlurFilter(2e9f)); | |
47 ops.MapRect(gfx::Rect(0, 0, 10, 10), SkMatrix::I()); | |
48 } | |
49 | |
50 TEST(FilterOperationsTest, MapRectReverseBlur) { | |
51 FilterOperations ops; | |
52 ops.Append(FilterOperation::CreateBlurFilter(20)); | |
53 EXPECT_EQ(gfx::Rect(-60, -60, 130, 130), | |
54 ops.MapRectReverse(gfx::Rect(0, 0, 10, 10), SkMatrix::I())); | |
55 EXPECT_EQ( | |
56 gfx::Rect(-120, -120, 260, 260), | |
57 ops.MapRectReverse(gfx::Rect(0, 0, 20, 20), SkMatrix::MakeScale(2, 2))); | |
58 EXPECT_EQ(gfx::Rect(-60, -70, 130, 130), | |
59 ops.MapRectReverse(gfx::Rect(0, -10, 10, 10), | |
60 SkMatrix::MakeScale(1, -1))); | |
61 } | |
62 | |
63 TEST(FilterOperationsTest, GetOutsetsDropShadowReferenceFilter) { | |
64 // TODO(hendrikw): We need to make outsets for reference filters be in line | |
65 // with non-reference filters. See crbug.com/523534 | |
66 FilterOperations ops; | |
67 ops.Append( | |
68 FilterOperation::CreateReferenceFilter(SkDropShadowImageFilter::Make( | |
69 SkIntToScalar(3), SkIntToScalar(8), SkIntToScalar(4), | |
70 SkIntToScalar(9), SK_ColorBLACK, | |
71 SkDropShadowImageFilter::kDrawShadowAndForeground_ShadowMode, | |
72 nullptr))); | |
73 | |
74 int top, right, bottom, left; | |
75 top = right = bottom = left = 0; | |
76 ops.GetOutsets(&top, &right, &bottom, &left); | |
77 EXPECT_EQ(35, top); | |
78 EXPECT_EQ(9, right); | |
79 EXPECT_EQ(19, bottom); | |
80 EXPECT_EQ(15, left); | |
81 } | |
82 | |
83 TEST(FilterOperationsTest, MapRectDropShadowReferenceFilter) { | |
84 FilterOperations ops; | |
85 ops.Append( | |
86 FilterOperation::CreateReferenceFilter(SkDropShadowImageFilter::Make( | |
87 SkIntToScalar(3), SkIntToScalar(8), SkIntToScalar(4), | |
88 SkIntToScalar(9), SK_ColorBLACK, | |
89 SkDropShadowImageFilter::kDrawShadowAndForeground_ShadowMode, | |
90 nullptr))); | |
91 EXPECT_EQ(gfx::Rect(-9, -19, 34, 64), | |
92 ops.MapRect(gfx::Rect(0, 0, 10, 10), SkMatrix::I())); | |
93 EXPECT_EQ(gfx::Rect(-18, -38, 68, 128), | |
94 ops.MapRect(gfx::Rect(0, 0, 20, 20), SkMatrix::MakeScale(2, 2))); | |
95 EXPECT_EQ(gfx::Rect(-9, -45, 34, 64), | |
96 ops.MapRect(gfx::Rect(0, -10, 10, 10), SkMatrix::MakeScale(1, -1))); | |
97 } | |
98 | |
99 TEST(FilterOperationsTest, MapRectReverseDropShadowReferenceFilter) { | |
100 FilterOperations ops; | |
101 ops.Append( | |
102 FilterOperation::CreateReferenceFilter(SkDropShadowImageFilter::Make( | |
103 SkIntToScalar(3), SkIntToScalar(8), SkIntToScalar(4), | |
104 SkIntToScalar(9), SK_ColorBLACK, | |
105 SkDropShadowImageFilter::kDrawShadowAndForeground_ShadowMode, | |
106 nullptr))); | |
107 EXPECT_EQ(gfx::Rect(-15, -35, 34, 64), | |
108 ops.MapRectReverse(gfx::Rect(0, 0, 10, 10), SkMatrix::I())); | |
109 EXPECT_EQ( | |
110 gfx::Rect(-30, -70, 68, 128), | |
111 ops.MapRectReverse(gfx::Rect(0, 0, 20, 20), SkMatrix::MakeScale(2, 2))); | |
112 EXPECT_EQ(gfx::Rect(-15, -29, 34, 64), | |
113 ops.MapRectReverse(gfx::Rect(0, -10, 10, 10), | |
114 SkMatrix::MakeScale(1, -1))); | |
115 } | |
116 | |
117 TEST(FilterOperationsTest, MapRectOffsetReferenceFilter) { | |
118 sk_sp<SkImageFilter> filter = SkOffsetImageFilter::Make(30, 40, nullptr); | |
119 FilterOperations ops; | |
120 ops.Append(FilterOperation::CreateReferenceFilter(std::move(filter))); | |
121 EXPECT_EQ(gfx::Rect(30, 40, 10, 10), | |
122 ops.MapRect(gfx::Rect(0, 0, 10, 10), SkMatrix::I())); | |
123 EXPECT_EQ(gfx::Rect(60, 80, 20, 20), | |
124 ops.MapRect(gfx::Rect(0, 0, 20, 20), SkMatrix::MakeScale(2, 2))); | |
125 EXPECT_EQ(gfx::Rect(30, -50, 10, 10), | |
126 ops.MapRect(gfx::Rect(0, -10, 10, 10), SkMatrix::MakeScale(1, -1))); | |
127 } | |
128 | |
129 TEST(FilterOperationsTest, MapRectReverseOffsetReferenceFilter) { | |
130 sk_sp<SkImageFilter> filter = SkOffsetImageFilter::Make(30, 40, nullptr); | |
131 FilterOperations ops; | |
132 ops.Append(FilterOperation::CreateReferenceFilter(std::move(filter))); | |
133 EXPECT_EQ(gfx::Rect(-30, -40, 10, 10), | |
134 ops.MapRectReverse(gfx::Rect(0, 0, 10, 10), SkMatrix::I())); | |
135 EXPECT_EQ( | |
136 gfx::Rect(-60, -80, 20, 20), | |
137 ops.MapRectReverse(gfx::Rect(0, 0, 20, 20), SkMatrix::MakeScale(2, 2))); | |
138 EXPECT_EQ(gfx::Rect(-30, 30, 10, 10), | |
139 ops.MapRectReverse(gfx::Rect(0, -10, 10, 10), | |
140 SkMatrix::MakeScale(1, -1))); | |
141 } | |
142 | |
143 TEST(FilterOperationsTest, MapRectCombineNonCommutative) { | |
144 // Offsets by 100px in each axis, then scales the resulting image by 2. | |
145 FilterOperations ops; | |
146 ops.Append(FilterOperation::CreateReferenceFilter( | |
147 SkOffsetImageFilter::Make(100, 100, nullptr))); | |
148 SkMatrix scaleMatrix; | |
149 scaleMatrix.setScale(2, 2); | |
150 ops.Append( | |
151 FilterOperation::CreateReferenceFilter(SkImageFilter::MakeMatrixFilter( | |
152 scaleMatrix, kNone_SkFilterQuality, nullptr))); | |
153 | |
154 EXPECT_EQ(gfx::Rect(200, 200, 20, 20), | |
155 ops.MapRect(gfx::Rect(10, 10), SkMatrix::I())); | |
156 EXPECT_EQ(gfx::Rect(400, 400, 40, 40), | |
157 ops.MapRect(gfx::Rect(20, 20), SkMatrix::MakeScale(2, 2))); | |
158 EXPECT_EQ(gfx::Rect(200, -220, 20, 20), | |
159 ops.MapRect(gfx::Rect(0, -10, 10, 10), SkMatrix::MakeScale(1, -1))); | |
160 } | |
161 | |
162 TEST(FilterOperationsTest, MapRectReverseCombineNonCommutative) { | |
163 // Offsets by 100px in each axis, then scales the resulting image by 2. | |
164 FilterOperations ops; | |
165 ops.Append(FilterOperation::CreateReferenceFilter( | |
166 SkOffsetImageFilter::Make(100, 100, nullptr))); | |
167 SkMatrix scaleMatrix; | |
168 scaleMatrix.setScale(2, 2); | |
169 ops.Append( | |
170 FilterOperation::CreateReferenceFilter(SkImageFilter::MakeMatrixFilter( | |
171 scaleMatrix, kNone_SkFilterQuality, nullptr))); | |
172 | |
173 EXPECT_EQ(gfx::Rect(10, 10), | |
174 ops.MapRectReverse(gfx::Rect(200, 200, 20, 20), SkMatrix::I())); | |
175 EXPECT_EQ(gfx::Rect(20, 20), ops.MapRectReverse(gfx::Rect(400, 400, 40, 40), | |
176 SkMatrix::MakeScale(2, 2))); | |
177 EXPECT_EQ(gfx::Rect(0, -10, 10, 10), | |
178 ops.MapRectReverse(gfx::Rect(200, -220, 20, 20), | |
179 SkMatrix::MakeScale(1, -1))); | |
180 } | |
181 | |
182 TEST(FilterOperationsTest, GetOutsetsNullReferenceFilter) { | |
183 FilterOperations ops; | |
184 ops.Append(FilterOperation::CreateReferenceFilter(nullptr)); | |
185 | |
186 int top, right, bottom, left; | |
187 top = right = bottom = left = 0; | |
188 ops.GetOutsets(&top, &right, &bottom, &left); | |
189 EXPECT_EQ(0, top); | |
190 EXPECT_EQ(0, right); | |
191 EXPECT_EQ(0, bottom); | |
192 EXPECT_EQ(0, left); | |
193 } | |
194 | |
195 TEST(FilterOperationsTest, MapRectNullReferenceFilter) { | |
196 FilterOperations ops; | |
197 ops.Append(FilterOperation::CreateReferenceFilter(nullptr)); | |
198 EXPECT_EQ(gfx::Rect(0, 0, 10, 10), | |
199 ops.MapRect(gfx::Rect(0, 0, 10, 10), SkMatrix::I())); | |
200 EXPECT_EQ(gfx::Rect(0, 0, 20, 20), | |
201 ops.MapRect(gfx::Rect(0, 0, 20, 20), SkMatrix::MakeScale(2, 2))); | |
202 EXPECT_EQ(gfx::Rect(0, -10, 10, 10), | |
203 ops.MapRect(gfx::Rect(0, -10, 10, 10), SkMatrix::MakeScale(1, -1))); | |
204 } | |
205 | |
206 TEST(FilterOperationsTest, MapRectReverseNullReferenceFilter) { | |
207 FilterOperations ops; | |
208 ops.Append(FilterOperation::CreateReferenceFilter(nullptr)); | |
209 EXPECT_EQ(gfx::Rect(0, 0, 10, 10), | |
210 ops.MapRectReverse(gfx::Rect(0, 0, 10, 10), SkMatrix::I())); | |
211 EXPECT_EQ( | |
212 gfx::Rect(0, 0, 20, 20), | |
213 ops.MapRectReverse(gfx::Rect(0, 0, 20, 20), SkMatrix::MakeScale(2, 2))); | |
214 EXPECT_EQ(gfx::Rect(0, -10, 10, 10), | |
215 ops.MapRectReverse(gfx::Rect(0, -10, 10, 10), | |
216 SkMatrix::MakeScale(1, -1))); | |
217 } | |
218 | |
219 TEST(FilterOperationsTest, GetOutsetsDropShadow) { | |
220 FilterOperations ops; | |
221 ops.Append(FilterOperation::CreateDropShadowFilter(gfx::Point(3, 8), 20, 0)); | |
222 int top, right, bottom, left; | |
223 top = right = bottom = left = 0; | |
224 ops.GetOutsets(&top, &right, &bottom, &left); | |
225 EXPECT_EQ(52, top); | |
226 EXPECT_EQ(63, right); | |
227 EXPECT_EQ(68, bottom); | |
228 EXPECT_EQ(57, left); | |
229 } | |
230 | |
231 TEST(FilterOperationsTest, MapRectDropShadow) { | |
232 FilterOperations ops; | |
233 ops.Append(FilterOperation::CreateDropShadowFilter(gfx::Point(3, 8), 20, 0)); | |
234 EXPECT_EQ(gfx::Rect(-57, -52, 130, 130), | |
235 ops.MapRect(gfx::Rect(0, 0, 10, 10), SkMatrix::I())); | |
236 EXPECT_EQ(gfx::Rect(-114, -104, 260, 260), | |
237 ops.MapRect(gfx::Rect(0, 0, 20, 20), SkMatrix::MakeScale(2, 2))); | |
238 EXPECT_EQ(gfx::Rect(-57, -78, 130, 130), | |
239 ops.MapRect(gfx::Rect(0, -10, 10, 10), SkMatrix::MakeScale(1, -1))); | |
240 } | |
241 | |
242 TEST(FilterOperationsTest, MapRectReverseDropShadow) { | |
243 FilterOperations ops; | |
244 ops.Append(FilterOperation::CreateDropShadowFilter(gfx::Point(3, 8), 20, 0)); | |
245 EXPECT_EQ(gfx::Rect(-63, -68, 130, 130), | |
246 ops.MapRectReverse(gfx::Rect(0, 0, 10, 10), SkMatrix::I())); | |
247 EXPECT_EQ( | |
248 gfx::Rect(-126, -136, 260, 260), | |
249 ops.MapRectReverse(gfx::Rect(0, 0, 20, 20), SkMatrix::MakeScale(2, 2))); | |
250 EXPECT_EQ(gfx::Rect(-63, -62, 130, 130), | |
251 ops.MapRectReverse(gfx::Rect(0, -10, 10, 10), | |
252 SkMatrix::MakeScale(1, -1))); | |
253 } | |
254 | |
255 TEST(FilterOperationsTest, GetOutsetsDropShadowDoesNotContract) { | |
256 // Even with a drop-shadow, the original content is still drawn. Thus the | |
257 // content bounds are never contracted due to a drop-shadow. | |
258 FilterOperations ops; | |
259 ops.Append(FilterOperation::CreateDropShadowFilter(gfx::Point(3, 8), 0, 0)); | |
260 int top, right, bottom, left; | |
261 top = right = bottom = left = 0; | |
262 ops.GetOutsets(&top, &right, &bottom, &left); | |
263 EXPECT_EQ(0, top); | |
264 EXPECT_EQ(3, right); | |
265 EXPECT_EQ(8, bottom); | |
266 EXPECT_EQ(0, left); | |
267 } | |
268 | |
269 TEST(FilterOperationsTest, MapRectDropShadowDoesNotContract) { | |
270 // Even with a drop-shadow, the original content is still drawn. Thus the | |
271 // content bounds are never contracted due to a drop-shadow. | |
272 FilterOperations ops; | |
273 ops.Append(FilterOperation::CreateDropShadowFilter(gfx::Point(3, 8), 0, 0)); | |
274 EXPECT_EQ(gfx::Rect(0, 0, 13, 18), | |
275 ops.MapRect(gfx::Rect(0, 0, 10, 10), SkMatrix::I())); | |
276 } | |
277 | |
278 TEST(FilterOperationsTest, MapRectReverseDropShadowDoesNotContract) { | |
279 // Even with a drop-shadow, the original content is still drawn. Thus the | |
280 // content bounds are never contracted due to a drop-shadow. | |
281 FilterOperations ops; | |
282 ops.Append(FilterOperation::CreateDropShadowFilter(gfx::Point(3, 8), 0, 0)); | |
283 EXPECT_EQ(gfx::Rect(-3, -8, 13, 18), | |
284 ops.MapRectReverse(gfx::Rect(0, 0, 10, 10), SkMatrix::I())); | |
285 } | |
286 | |
287 TEST(FilterOperationsTest, MapRectTypeConversionDoesNotOverflow) { | |
288 // Must be bigger than half of the positive range so that the width/height | |
289 // overflow happens, but small enough that there aren't other issues before | |
290 // the overflow would happen. | |
291 SkScalar big_offset = | |
292 SkFloatToScalar(std::numeric_limits<int>::max()) * 2 / 3; | |
293 | |
294 FilterOperations ops; | |
295 ops.Append(FilterOperation::CreateReferenceFilter(SkXfermodeImageFilter::Make( | |
296 SkBlendMode::kSrcOver, | |
297 SkOffsetImageFilter::Make(-big_offset, -big_offset, nullptr), | |
298 SkOffsetImageFilter::Make(big_offset, big_offset, nullptr), nullptr))); | |
299 gfx::Rect rect = ops.MapRect(gfx::Rect(-10, -10, 20, 20), SkMatrix::I()); | |
300 EXPECT_GT(rect.width(), 0); | |
301 EXPECT_GT(rect.height(), 0); | |
302 } | |
303 | |
304 #define SAVE_RESTORE_AMOUNT(filter_name, filter_type, a) \ | |
305 { \ | |
306 FilterOperation op = FilterOperation::Create##filter_name##Filter(a); \ | |
307 EXPECT_EQ(FilterOperation::filter_type, op.type()); \ | |
308 EXPECT_EQ(a, op.amount()); \ | |
309 \ | |
310 FilterOperation op2 = FilterOperation::CreateEmptyFilter(); \ | |
311 op2.set_type(FilterOperation::filter_type); \ | |
312 \ | |
313 EXPECT_NE(a, op2.amount()); \ | |
314 \ | |
315 op2.set_amount(a); \ | |
316 \ | |
317 EXPECT_EQ(FilterOperation::filter_type, op2.type()); \ | |
318 EXPECT_EQ(a, op2.amount()); \ | |
319 } | |
320 | |
321 #define SAVE_RESTORE_OFFSET_AMOUNT_COLOR(filter_name, filter_type, a, b, c) \ | |
322 { \ | |
323 FilterOperation op = \ | |
324 FilterOperation::Create##filter_name##Filter(a, b, c); \ | |
325 EXPECT_EQ(FilterOperation::filter_type, op.type()); \ | |
326 EXPECT_EQ(a, op.drop_shadow_offset()); \ | |
327 EXPECT_EQ(b, op.amount()); \ | |
328 EXPECT_EQ(c, op.drop_shadow_color()); \ | |
329 \ | |
330 FilterOperation op2 = FilterOperation::CreateEmptyFilter(); \ | |
331 op2.set_type(FilterOperation::filter_type); \ | |
332 \ | |
333 EXPECT_NE(a, op2.drop_shadow_offset()); \ | |
334 EXPECT_NE(b, op2.amount()); \ | |
335 EXPECT_NE(c, op2.drop_shadow_color()); \ | |
336 \ | |
337 op2.set_drop_shadow_offset(a); \ | |
338 op2.set_amount(b); \ | |
339 op2.set_drop_shadow_color(c); \ | |
340 \ | |
341 EXPECT_EQ(FilterOperation::filter_type, op2.type()); \ | |
342 EXPECT_EQ(a, op2.drop_shadow_offset()); \ | |
343 EXPECT_EQ(b, op2.amount()); \ | |
344 EXPECT_EQ(c, op2.drop_shadow_color()); \ | |
345 } | |
346 | |
347 #define SAVE_RESTORE_MATRIX(filter_name, filter_type, a) \ | |
348 { \ | |
349 FilterOperation op = FilterOperation::Create##filter_name##Filter(a); \ | |
350 EXPECT_EQ(FilterOperation::filter_type, op.type()); \ | |
351 for (size_t i = 0; i < 20; ++i) \ | |
352 EXPECT_EQ(a[i], op.matrix()[i]); \ | |
353 \ | |
354 FilterOperation op2 = FilterOperation::CreateEmptyFilter(); \ | |
355 op2.set_type(FilterOperation::filter_type); \ | |
356 \ | |
357 for (size_t i = 0; i < 20; ++i) \ | |
358 EXPECT_NE(a[i], op2.matrix()[i]); \ | |
359 \ | |
360 op2.set_matrix(a); \ | |
361 \ | |
362 EXPECT_EQ(FilterOperation::filter_type, op2.type()); \ | |
363 for (size_t i = 0; i < 20; ++i) \ | |
364 EXPECT_EQ(a[i], op.matrix()[i]); \ | |
365 } | |
366 | |
367 #define SAVE_RESTORE_AMOUNT_INSET(filter_name, filter_type, a, b) \ | |
368 { \ | |
369 FilterOperation op = FilterOperation::Create##filter_name##Filter(a, b); \ | |
370 EXPECT_EQ(FilterOperation::filter_type, op.type()); \ | |
371 EXPECT_EQ(a, op.amount()); \ | |
372 EXPECT_EQ(b, op.zoom_inset()); \ | |
373 \ | |
374 FilterOperation op2 = FilterOperation::CreateEmptyFilter(); \ | |
375 op2.set_type(FilterOperation::filter_type); \ | |
376 \ | |
377 EXPECT_NE(a, op2.amount()); \ | |
378 EXPECT_NE(b, op2.zoom_inset()); \ | |
379 \ | |
380 op2.set_amount(a); \ | |
381 op2.set_zoom_inset(b); \ | |
382 \ | |
383 EXPECT_EQ(FilterOperation::filter_type, op2.type()); \ | |
384 EXPECT_EQ(a, op2.amount()); \ | |
385 EXPECT_EQ(b, op2.zoom_inset()); \ | |
386 } | |
387 | |
388 TEST(FilterOperationsTest, SaveAndRestore) { | |
389 SAVE_RESTORE_AMOUNT(Grayscale, GRAYSCALE, 0.6f); | |
390 SAVE_RESTORE_AMOUNT(Sepia, SEPIA, 0.6f); | |
391 SAVE_RESTORE_AMOUNT(Saturate, SATURATE, 0.6f); | |
392 SAVE_RESTORE_AMOUNT(HueRotate, HUE_ROTATE, 0.6f); | |
393 SAVE_RESTORE_AMOUNT(Invert, INVERT, 0.6f); | |
394 SAVE_RESTORE_AMOUNT(Brightness, BRIGHTNESS, 0.6f); | |
395 SAVE_RESTORE_AMOUNT(Contrast, CONTRAST, 0.6f); | |
396 SAVE_RESTORE_AMOUNT(Opacity, OPACITY, 0.6f); | |
397 SAVE_RESTORE_AMOUNT(Blur, BLUR, 0.6f); | |
398 SAVE_RESTORE_AMOUNT(SaturatingBrightness, SATURATING_BRIGHTNESS, 0.6f); | |
399 SAVE_RESTORE_OFFSET_AMOUNT_COLOR( | |
400 DropShadow, DROP_SHADOW, gfx::Point(3, 4), 0.4f, 0xffffff00); | |
401 | |
402 SkScalar matrix[20] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, | |
403 17, 18, 19, 20}; | |
404 SAVE_RESTORE_MATRIX(ColorMatrix, COLOR_MATRIX, matrix); | |
405 | |
406 SAVE_RESTORE_AMOUNT_INSET(Zoom, ZOOM, 0.5f, 32); | |
407 } | |
408 | |
409 TEST(FilterOperationsTest, BlendGrayscaleFilters) { | |
410 FilterOperation from = FilterOperation::CreateGrayscaleFilter(0.25f); | |
411 FilterOperation to = FilterOperation::CreateGrayscaleFilter(0.75f); | |
412 | |
413 FilterOperation blended = FilterOperation::Blend(&from, &to, -0.75); | |
414 FilterOperation expected = FilterOperation::CreateGrayscaleFilter(0.f); | |
415 EXPECT_EQ(expected, blended); | |
416 | |
417 blended = FilterOperation::Blend(&from, &to, 0.75); | |
418 expected = FilterOperation::CreateGrayscaleFilter(0.625f); | |
419 EXPECT_EQ(expected, blended); | |
420 | |
421 blended = FilterOperation::Blend(&from, &to, 1.8); | |
422 expected = FilterOperation::CreateGrayscaleFilter(1.f); | |
423 EXPECT_EQ(expected, blended); | |
424 } | |
425 | |
426 TEST(FilterOperationsTest, BlendGrayscaleWithNull) { | |
427 FilterOperation filter = FilterOperation::CreateGrayscaleFilter(1.f); | |
428 | |
429 FilterOperation blended = FilterOperation::Blend(&filter, NULL, 0.25); | |
430 FilterOperation expected = FilterOperation::CreateGrayscaleFilter(0.75f); | |
431 EXPECT_EQ(expected, blended); | |
432 | |
433 blended = FilterOperation::Blend(NULL, &filter, 0.25); | |
434 expected = FilterOperation::CreateGrayscaleFilter(0.25f); | |
435 EXPECT_EQ(expected, blended); | |
436 } | |
437 | |
438 TEST(FilterOperationsTest, BlendSepiaFilters) { | |
439 FilterOperation from = FilterOperation::CreateSepiaFilter(0.25f); | |
440 FilterOperation to = FilterOperation::CreateSepiaFilter(0.75f); | |
441 | |
442 FilterOperation blended = FilterOperation::Blend(&from, &to, -0.75); | |
443 FilterOperation expected = FilterOperation::CreateSepiaFilter(0.f); | |
444 EXPECT_EQ(expected, blended); | |
445 | |
446 blended = FilterOperation::Blend(&from, &to, 0.75); | |
447 expected = FilterOperation::CreateSepiaFilter(0.625f); | |
448 EXPECT_EQ(expected, blended); | |
449 | |
450 blended = FilterOperation::Blend(&from, &to, 1.8); | |
451 expected = FilterOperation::CreateSepiaFilter(1.f); | |
452 EXPECT_EQ(expected, blended); | |
453 } | |
454 | |
455 TEST(FilterOperationsTest, BlendSepiaWithNull) { | |
456 FilterOperation filter = FilterOperation::CreateSepiaFilter(1.f); | |
457 | |
458 FilterOperation blended = FilterOperation::Blend(&filter, NULL, 0.25); | |
459 FilterOperation expected = FilterOperation::CreateSepiaFilter(0.75f); | |
460 EXPECT_EQ(expected, blended); | |
461 | |
462 blended = FilterOperation::Blend(NULL, &filter, 0.25); | |
463 expected = FilterOperation::CreateSepiaFilter(0.25f); | |
464 EXPECT_EQ(expected, blended); | |
465 } | |
466 | |
467 TEST(FilterOperationsTest, BlendSaturateFilters) { | |
468 FilterOperation from = FilterOperation::CreateSaturateFilter(0.25f); | |
469 FilterOperation to = FilterOperation::CreateSaturateFilter(0.75f); | |
470 | |
471 FilterOperation blended = FilterOperation::Blend(&from, &to, -0.75); | |
472 FilterOperation expected = FilterOperation::CreateSaturateFilter(0.f); | |
473 EXPECT_EQ(expected, blended); | |
474 | |
475 blended = FilterOperation::Blend(&from, &to, 0.75); | |
476 expected = FilterOperation::CreateSaturateFilter(0.625f); | |
477 EXPECT_EQ(expected, blended); | |
478 | |
479 blended = FilterOperation::Blend(&from, &to, 2.0); | |
480 expected = FilterOperation::CreateSaturateFilter(1.25f); | |
481 EXPECT_EQ(expected, blended); | |
482 } | |
483 | |
484 TEST(FilterOperationsTest, BlendSaturateWithNull) { | |
485 FilterOperation filter = FilterOperation::CreateSaturateFilter(0.f); | |
486 | |
487 FilterOperation blended = FilterOperation::Blend(&filter, NULL, 0.25); | |
488 FilterOperation expected = FilterOperation::CreateSaturateFilter(0.25f); | |
489 EXPECT_EQ(expected, blended); | |
490 | |
491 blended = FilterOperation::Blend(NULL, &filter, 0.25); | |
492 expected = FilterOperation::CreateSaturateFilter(0.75f); | |
493 EXPECT_EQ(expected, blended); | |
494 } | |
495 | |
496 TEST(FilterOperationsTest, BlendHueRotateFilters) { | |
497 FilterOperation from = FilterOperation::CreateHueRotateFilter(3.f); | |
498 FilterOperation to = FilterOperation::CreateHueRotateFilter(7.f); | |
499 | |
500 FilterOperation blended = FilterOperation::Blend(&from, &to, -0.75); | |
501 FilterOperation expected = FilterOperation::CreateHueRotateFilter(0.f); | |
502 EXPECT_EQ(expected, blended); | |
503 | |
504 blended = FilterOperation::Blend(&from, &to, 0.75); | |
505 expected = FilterOperation::CreateHueRotateFilter(6.f); | |
506 EXPECT_EQ(expected, blended); | |
507 | |
508 blended = FilterOperation::Blend(&from, &to, 1.5); | |
509 expected = FilterOperation::CreateHueRotateFilter(9.f); | |
510 EXPECT_EQ(expected, blended); | |
511 } | |
512 | |
513 TEST(FilterOperationsTest, BlendHueRotateWithNull) { | |
514 FilterOperation filter = FilterOperation::CreateHueRotateFilter(1.f); | |
515 | |
516 FilterOperation blended = FilterOperation::Blend(&filter, NULL, 0.25); | |
517 FilterOperation expected = FilterOperation::CreateHueRotateFilter(0.75f); | |
518 EXPECT_EQ(expected, blended); | |
519 | |
520 blended = FilterOperation::Blend(NULL, &filter, 0.25); | |
521 expected = FilterOperation::CreateHueRotateFilter(0.25f); | |
522 EXPECT_EQ(expected, blended); | |
523 } | |
524 | |
525 TEST(FilterOperationsTest, BlendInvertFilters) { | |
526 FilterOperation from = FilterOperation::CreateInvertFilter(0.25f); | |
527 FilterOperation to = FilterOperation::CreateInvertFilter(0.75f); | |
528 | |
529 FilterOperation blended = FilterOperation::Blend(&from, &to, -0.75); | |
530 FilterOperation expected = FilterOperation::CreateInvertFilter(0.f); | |
531 EXPECT_EQ(expected, blended); | |
532 | |
533 blended = FilterOperation::Blend(&from, &to, 0.75); | |
534 expected = FilterOperation::CreateInvertFilter(0.625f); | |
535 EXPECT_EQ(expected, blended); | |
536 | |
537 blended = FilterOperation::Blend(&from, &to, 1.8); | |
538 expected = FilterOperation::CreateInvertFilter(1.f); | |
539 EXPECT_EQ(expected, blended); | |
540 } | |
541 | |
542 TEST(FilterOperationsTest, BlendInvertWithNull) { | |
543 FilterOperation filter = FilterOperation::CreateInvertFilter(1.f); | |
544 | |
545 FilterOperation blended = FilterOperation::Blend(&filter, NULL, 0.25); | |
546 FilterOperation expected = FilterOperation::CreateInvertFilter(0.75f); | |
547 EXPECT_EQ(expected, blended); | |
548 | |
549 blended = FilterOperation::Blend(NULL, &filter, 0.25); | |
550 expected = FilterOperation::CreateInvertFilter(0.25f); | |
551 EXPECT_EQ(expected, blended); | |
552 } | |
553 | |
554 TEST(FilterOperationsTest, BlendBrightnessFilters) { | |
555 FilterOperation from = FilterOperation::CreateBrightnessFilter(3.f); | |
556 FilterOperation to = FilterOperation::CreateBrightnessFilter(7.f); | |
557 | |
558 FilterOperation blended = FilterOperation::Blend(&from, &to, -0.9); | |
559 FilterOperation expected = FilterOperation::CreateBrightnessFilter(0.f); | |
560 EXPECT_EQ(expected, blended); | |
561 | |
562 blended = FilterOperation::Blend(&from, &to, 0.75); | |
563 expected = FilterOperation::CreateBrightnessFilter(6.f); | |
564 EXPECT_EQ(expected, blended); | |
565 | |
566 blended = FilterOperation::Blend(&from, &to, 1.5); | |
567 expected = FilterOperation::CreateBrightnessFilter(9.f); | |
568 EXPECT_EQ(expected, blended); | |
569 } | |
570 | |
571 TEST(FilterOperationsTest, BlendBrightnessWithNull) { | |
572 FilterOperation filter = FilterOperation::CreateBrightnessFilter(0.f); | |
573 | |
574 FilterOperation blended = FilterOperation::Blend(&filter, NULL, 0.25); | |
575 FilterOperation expected = FilterOperation::CreateBrightnessFilter(0.25f); | |
576 EXPECT_EQ(expected, blended); | |
577 | |
578 blended = FilterOperation::Blend(NULL, &filter, 0.25); | |
579 expected = FilterOperation::CreateBrightnessFilter(0.75f); | |
580 EXPECT_EQ(expected, blended); | |
581 } | |
582 | |
583 TEST(FilterOperationsTest, BlendContrastFilters) { | |
584 FilterOperation from = FilterOperation::CreateContrastFilter(3.f); | |
585 FilterOperation to = FilterOperation::CreateContrastFilter(7.f); | |
586 | |
587 FilterOperation blended = FilterOperation::Blend(&from, &to, -0.9); | |
588 FilterOperation expected = FilterOperation::CreateContrastFilter(0.f); | |
589 EXPECT_EQ(expected, blended); | |
590 | |
591 blended = FilterOperation::Blend(&from, &to, 0.75); | |
592 expected = FilterOperation::CreateContrastFilter(6.f); | |
593 EXPECT_EQ(expected, blended); | |
594 | |
595 blended = FilterOperation::Blend(&from, &to, 1.5); | |
596 expected = FilterOperation::CreateContrastFilter(9.f); | |
597 EXPECT_EQ(expected, blended); | |
598 } | |
599 | |
600 TEST(FilterOperationsTest, BlendContrastWithNull) { | |
601 FilterOperation filter = FilterOperation::CreateContrastFilter(0.f); | |
602 | |
603 FilterOperation blended = FilterOperation::Blend(&filter, NULL, 0.25); | |
604 FilterOperation expected = FilterOperation::CreateContrastFilter(0.25f); | |
605 EXPECT_EQ(expected, blended); | |
606 | |
607 blended = FilterOperation::Blend(NULL, &filter, 0.25); | |
608 expected = FilterOperation::CreateContrastFilter(0.75f); | |
609 EXPECT_EQ(expected, blended); | |
610 } | |
611 | |
612 TEST(FilterOperationsTest, BlendOpacityFilters) { | |
613 FilterOperation from = FilterOperation::CreateOpacityFilter(0.25f); | |
614 FilterOperation to = FilterOperation::CreateOpacityFilter(0.75f); | |
615 | |
616 FilterOperation blended = FilterOperation::Blend(&from, &to, -0.75); | |
617 FilterOperation expected = FilterOperation::CreateOpacityFilter(0.f); | |
618 EXPECT_EQ(expected, blended); | |
619 | |
620 blended = FilterOperation::Blend(&from, &to, 0.75); | |
621 expected = FilterOperation::CreateOpacityFilter(0.625f); | |
622 EXPECT_EQ(expected, blended); | |
623 | |
624 blended = FilterOperation::Blend(&from, &to, 1.8); | |
625 expected = FilterOperation::CreateOpacityFilter(1.f); | |
626 EXPECT_EQ(expected, blended); | |
627 } | |
628 | |
629 TEST(FilterOperationsTest, BlendOpacityWithNull) { | |
630 FilterOperation filter = FilterOperation::CreateOpacityFilter(0.f); | |
631 | |
632 FilterOperation blended = FilterOperation::Blend(&filter, NULL, 0.25); | |
633 FilterOperation expected = FilterOperation::CreateOpacityFilter(0.25f); | |
634 EXPECT_EQ(expected, blended); | |
635 | |
636 blended = FilterOperation::Blend(NULL, &filter, 0.25); | |
637 expected = FilterOperation::CreateOpacityFilter(0.75f); | |
638 EXPECT_EQ(expected, blended); | |
639 } | |
640 | |
641 TEST(FilterOperationsTest, BlendBlurFilters) { | |
642 FilterOperation from = FilterOperation::CreateBlurFilter(3.f); | |
643 FilterOperation to = FilterOperation::CreateBlurFilter(7.f); | |
644 | |
645 FilterOperation blended = FilterOperation::Blend(&from, &to, -0.9); | |
646 FilterOperation expected = FilterOperation::CreateBlurFilter(0.f); | |
647 EXPECT_EQ(expected, blended); | |
648 | |
649 blended = FilterOperation::Blend(&from, &to, 0.75); | |
650 expected = FilterOperation::CreateBlurFilter(6.f); | |
651 EXPECT_EQ(expected, blended); | |
652 | |
653 blended = FilterOperation::Blend(&from, &to, 1.5); | |
654 expected = FilterOperation::CreateBlurFilter(9.f); | |
655 EXPECT_EQ(expected, blended); | |
656 } | |
657 | |
658 TEST(FilterOperationsTest, BlendBlurWithNull) { | |
659 FilterOperation filter = FilterOperation::CreateBlurFilter(1.f); | |
660 | |
661 FilterOperation blended = FilterOperation::Blend(&filter, NULL, 0.25); | |
662 FilterOperation expected = FilterOperation::CreateBlurFilter(0.75f); | |
663 EXPECT_EQ(expected, blended); | |
664 | |
665 blended = FilterOperation::Blend(NULL, &filter, 0.25); | |
666 expected = FilterOperation::CreateBlurFilter(0.25f); | |
667 EXPECT_EQ(expected, blended); | |
668 } | |
669 | |
670 TEST(FilterOperationsTest, BlendDropShadowFilters) { | |
671 FilterOperation from = FilterOperation::CreateDropShadowFilter( | |
672 gfx::Point(0, 0), 2.f, SkColorSetARGB(15, 34, 68, 136)); | |
673 FilterOperation to = FilterOperation::CreateDropShadowFilter( | |
674 gfx::Point(3, 5), 6.f, SkColorSetARGB(51, 30, 60, 120)); | |
675 | |
676 FilterOperation blended = FilterOperation::Blend(&from, &to, -0.75); | |
677 FilterOperation expected = FilterOperation::CreateDropShadowFilter( | |
678 gfx::Point(-2, -4), 0.f, SkColorSetARGB(0, 0, 0, 0)); | |
679 EXPECT_EQ(expected, blended); | |
680 | |
681 blended = FilterOperation::Blend(&from, &to, 0.25); | |
682 expected = FilterOperation::CreateDropShadowFilter( | |
683 gfx::Point(1, 1), 3.f, SkColorSetARGB(24, 32, 64, 128)); | |
684 EXPECT_EQ(expected, blended); | |
685 | |
686 blended = FilterOperation::Blend(&from, &to, 0.75); | |
687 expected = FilterOperation::CreateDropShadowFilter( | |
688 gfx::Point(2, 4), 5.f, SkColorSetARGB(42, 30, 61, 121)); | |
689 EXPECT_EQ(expected, blended); | |
690 | |
691 blended = FilterOperation::Blend(&from, &to, 1.5); | |
692 expected = FilterOperation::CreateDropShadowFilter( | |
693 gfx::Point(5, 8), 8.f, SkColorSetARGB(69, 30, 59, 118)); | |
694 EXPECT_EQ(expected, blended); | |
695 } | |
696 | |
697 TEST(FilterOperationsTest, BlendDropShadowWithNull) { | |
698 FilterOperation filter = FilterOperation::CreateDropShadowFilter( | |
699 gfx::Point(4, 4), 4.f, SkColorSetARGB(255, 40, 0, 0)); | |
700 | |
701 FilterOperation blended = FilterOperation::Blend(&filter, NULL, 0.25); | |
702 FilterOperation expected = FilterOperation::CreateDropShadowFilter( | |
703 gfx::Point(3, 3), 3.f, SkColorSetARGB(191, 40, 0, 0)); | |
704 EXPECT_EQ(expected, blended); | |
705 | |
706 blended = FilterOperation::Blend(NULL, &filter, 0.25); | |
707 expected = FilterOperation::CreateDropShadowFilter( | |
708 gfx::Point(1, 1), 1.f, SkColorSetARGB(64, 40, 0, 0)); | |
709 EXPECT_EQ(expected, blended); | |
710 } | |
711 | |
712 TEST(FilterOperationsTest, BlendZoomFilters) { | |
713 FilterOperation from = FilterOperation::CreateZoomFilter(2.f, 3); | |
714 FilterOperation to = FilterOperation::CreateZoomFilter(6.f, 0); | |
715 | |
716 FilterOperation blended = FilterOperation::Blend(&from, &to, -0.75); | |
717 FilterOperation expected = FilterOperation::CreateZoomFilter(1.f, 5); | |
718 EXPECT_EQ(expected, blended); | |
719 | |
720 blended = FilterOperation::Blend(&from, &to, 0.75); | |
721 expected = FilterOperation::CreateZoomFilter(5.f, 1); | |
722 EXPECT_EQ(expected, blended); | |
723 | |
724 blended = FilterOperation::Blend(&from, &to, 1.5); | |
725 expected = FilterOperation::CreateZoomFilter(8.f, 0); | |
726 EXPECT_EQ(expected, blended); | |
727 } | |
728 | |
729 TEST(FilterOperationsTest, BlendZoomWithNull) { | |
730 FilterOperation filter = FilterOperation::CreateZoomFilter(2.f, 1); | |
731 | |
732 FilterOperation blended = FilterOperation::Blend(&filter, NULL, 0.25); | |
733 FilterOperation expected = FilterOperation::CreateZoomFilter(1.75f, 1); | |
734 EXPECT_EQ(expected, blended); | |
735 | |
736 blended = FilterOperation::Blend(NULL, &filter, 0.25); | |
737 expected = FilterOperation::CreateZoomFilter(1.25f, 0); | |
738 EXPECT_EQ(expected, blended); | |
739 } | |
740 | |
741 TEST(FilterOperationsTest, BlendSaturatingBrightnessFilters) { | |
742 FilterOperation from = FilterOperation::CreateSaturatingBrightnessFilter(3.f); | |
743 FilterOperation to = FilterOperation::CreateSaturatingBrightnessFilter(7.f); | |
744 | |
745 FilterOperation blended = FilterOperation::Blend(&from, &to, -0.75); | |
746 FilterOperation expected = | |
747 FilterOperation::CreateSaturatingBrightnessFilter(0.f); | |
748 EXPECT_EQ(expected, blended); | |
749 | |
750 blended = FilterOperation::Blend(&from, &to, 0.75); | |
751 expected = FilterOperation::CreateSaturatingBrightnessFilter(6.f); | |
752 EXPECT_EQ(expected, blended); | |
753 | |
754 blended = FilterOperation::Blend(&from, &to, 1.5); | |
755 expected = FilterOperation::CreateSaturatingBrightnessFilter(9.f); | |
756 EXPECT_EQ(expected, blended); | |
757 } | |
758 | |
759 TEST(FilterOperationsTest, BlendSaturatingBrightnessWithNull) { | |
760 FilterOperation filter = | |
761 FilterOperation::CreateSaturatingBrightnessFilter(1.f); | |
762 | |
763 FilterOperation blended = FilterOperation::Blend(&filter, NULL, 0.25); | |
764 FilterOperation expected = | |
765 FilterOperation::CreateSaturatingBrightnessFilter(0.75f); | |
766 EXPECT_EQ(expected, blended); | |
767 | |
768 blended = FilterOperation::Blend(NULL, &filter, 0.25); | |
769 expected = FilterOperation::CreateSaturatingBrightnessFilter(0.25f); | |
770 EXPECT_EQ(expected, blended); | |
771 } | |
772 | |
773 TEST(FilterOperationsTest, BlendReferenceFilters) { | |
774 sk_sp<SkImageFilter> from_filter(SkBlurImageFilter::Make(1.f, 1.f, nullptr)); | |
775 sk_sp<SkImageFilter> to_filter(SkBlurImageFilter::Make(2.f, 2.f, nullptr)); | |
776 FilterOperation from = | |
777 FilterOperation::CreateReferenceFilter(std::move(from_filter)); | |
778 FilterOperation to = | |
779 FilterOperation::CreateReferenceFilter(std::move(to_filter)); | |
780 | |
781 FilterOperation blended = FilterOperation::Blend(&from, &to, -0.75); | |
782 EXPECT_EQ(from, blended); | |
783 | |
784 blended = FilterOperation::Blend(&from, &to, 0.5); | |
785 EXPECT_EQ(from, blended); | |
786 | |
787 blended = FilterOperation::Blend(&from, &to, 0.6); | |
788 EXPECT_EQ(to, blended); | |
789 | |
790 blended = FilterOperation::Blend(&from, &to, 1.5); | |
791 EXPECT_EQ(to, blended); | |
792 } | |
793 | |
794 TEST(FilterOperationsTest, BlendReferenceWithNull) { | |
795 sk_sp<SkImageFilter> image_filter(SkBlurImageFilter::Make(1.f, 1.f, nullptr)); | |
796 FilterOperation filter = | |
797 FilterOperation::CreateReferenceFilter(std::move(image_filter)); | |
798 FilterOperation null_filter = FilterOperation::CreateReferenceFilter(nullptr); | |
799 | |
800 FilterOperation blended = FilterOperation::Blend(&filter, NULL, 0.25); | |
801 EXPECT_EQ(filter, blended); | |
802 blended = FilterOperation::Blend(&filter, NULL, 0.75); | |
803 EXPECT_EQ(null_filter, blended); | |
804 | |
805 blended = FilterOperation::Blend(NULL, &filter, 0.25); | |
806 EXPECT_EQ(null_filter, blended); | |
807 blended = FilterOperation::Blend(NULL, &filter, 0.75); | |
808 EXPECT_EQ(filter, blended); | |
809 } | |
810 | |
811 // Tests blending non-empty sequences that have the same length and matching | |
812 // operations. | |
813 TEST(FilterOperationsTest, BlendMatchingSequences) { | |
814 FilterOperations from; | |
815 FilterOperations to; | |
816 | |
817 from.Append(FilterOperation::CreateBlurFilter(0.f)); | |
818 to.Append(FilterOperation::CreateBlurFilter(2.f)); | |
819 | |
820 from.Append(FilterOperation::CreateSaturateFilter(4.f)); | |
821 to.Append(FilterOperation::CreateSaturateFilter(0.f)); | |
822 | |
823 from.Append(FilterOperation::CreateZoomFilter(2.0f, 1)); | |
824 to.Append(FilterOperation::CreateZoomFilter(10.f, 9)); | |
825 | |
826 FilterOperations blended = to.Blend(from, -0.75); | |
827 FilterOperations expected; | |
828 expected.Append(FilterOperation::CreateBlurFilter(0.f)); | |
829 expected.Append(FilterOperation::CreateSaturateFilter(7.f)); | |
830 expected.Append(FilterOperation::CreateZoomFilter(1.f, 0)); | |
831 EXPECT_EQ(blended, expected); | |
832 | |
833 blended = to.Blend(from, 0.75); | |
834 expected.Clear(); | |
835 expected.Append(FilterOperation::CreateBlurFilter(1.5f)); | |
836 expected.Append(FilterOperation::CreateSaturateFilter(1.f)); | |
837 expected.Append(FilterOperation::CreateZoomFilter(8.f, 7)); | |
838 EXPECT_EQ(blended, expected); | |
839 | |
840 blended = to.Blend(from, 1.5); | |
841 expected.Clear(); | |
842 expected.Append(FilterOperation::CreateBlurFilter(3.f)); | |
843 expected.Append(FilterOperation::CreateSaturateFilter(0.f)); | |
844 expected.Append(FilterOperation::CreateZoomFilter(14.f, 13)); | |
845 EXPECT_EQ(blended, expected); | |
846 } | |
847 | |
848 TEST(FilterOperationsTest, BlendEmptyAndNonEmptySequences) { | |
849 FilterOperations empty; | |
850 FilterOperations filters; | |
851 | |
852 filters.Append(FilterOperation::CreateGrayscaleFilter(0.75f)); | |
853 filters.Append(FilterOperation::CreateBrightnessFilter(2.f)); | |
854 filters.Append(FilterOperation::CreateHueRotateFilter(10.0f)); | |
855 | |
856 FilterOperations blended = empty.Blend(filters, -0.75); | |
857 FilterOperations expected; | |
858 expected.Append(FilterOperation::CreateGrayscaleFilter(1.f)); | |
859 expected.Append(FilterOperation::CreateBrightnessFilter(2.75f)); | |
860 expected.Append(FilterOperation::CreateHueRotateFilter(17.5f)); | |
861 EXPECT_EQ(blended, expected); | |
862 | |
863 blended = empty.Blend(filters, 0.75); | |
864 expected.Clear(); | |
865 expected.Append(FilterOperation::CreateGrayscaleFilter(0.1875f)); | |
866 expected.Append(FilterOperation::CreateBrightnessFilter(1.25f)); | |
867 expected.Append(FilterOperation::CreateHueRotateFilter(2.5f)); | |
868 EXPECT_EQ(blended, expected); | |
869 | |
870 blended = empty.Blend(filters, 1.5); | |
871 expected.Clear(); | |
872 expected.Append(FilterOperation::CreateGrayscaleFilter(0.f)); | |
873 expected.Append(FilterOperation::CreateBrightnessFilter(0.5f)); | |
874 expected.Append(FilterOperation::CreateHueRotateFilter(-5.f)); | |
875 EXPECT_EQ(blended, expected); | |
876 | |
877 blended = filters.Blend(empty, -0.75); | |
878 expected.Clear(); | |
879 expected.Append(FilterOperation::CreateGrayscaleFilter(0.f)); | |
880 expected.Append(FilterOperation::CreateBrightnessFilter(0.25f)); | |
881 expected.Append(FilterOperation::CreateHueRotateFilter(-7.5f)); | |
882 EXPECT_EQ(blended, expected); | |
883 | |
884 blended = filters.Blend(empty, 0.75); | |
885 expected.Clear(); | |
886 expected.Append(FilterOperation::CreateGrayscaleFilter(0.5625f)); | |
887 expected.Append(FilterOperation::CreateBrightnessFilter(1.75f)); | |
888 expected.Append(FilterOperation::CreateHueRotateFilter(7.5f)); | |
889 EXPECT_EQ(blended, expected); | |
890 | |
891 blended = filters.Blend(empty, 1.5); | |
892 expected.Clear(); | |
893 expected.Append(FilterOperation::CreateGrayscaleFilter(1.f)); | |
894 expected.Append(FilterOperation::CreateBrightnessFilter(2.5f)); | |
895 expected.Append(FilterOperation::CreateHueRotateFilter(15.f)); | |
896 EXPECT_EQ(blended, expected); | |
897 } | |
898 | |
899 TEST(FilterOperationsTest, BlendEmptySequences) { | |
900 FilterOperations empty; | |
901 | |
902 FilterOperations blended = empty.Blend(empty, -0.75); | |
903 EXPECT_EQ(blended, empty); | |
904 | |
905 blended = empty.Blend(empty, 0.75); | |
906 EXPECT_EQ(blended, empty); | |
907 | |
908 blended = empty.Blend(empty, 1.5); | |
909 EXPECT_EQ(blended, empty); | |
910 } | |
911 | |
912 // Tests blending non-empty sequences that have non-matching operations. | |
913 TEST(FilterOperationsTest, BlendNonMatchingSequences) { | |
914 FilterOperations from; | |
915 FilterOperations to; | |
916 | |
917 from.Append(FilterOperation::CreateSaturateFilter(3.f)); | |
918 from.Append(FilterOperation::CreateBlurFilter(2.f)); | |
919 to.Append(FilterOperation::CreateSaturateFilter(4.f)); | |
920 to.Append(FilterOperation::CreateHueRotateFilter(0.5f)); | |
921 | |
922 FilterOperations blended = to.Blend(from, -0.75); | |
923 EXPECT_EQ(to, blended); | |
924 blended = to.Blend(from, 0.75); | |
925 EXPECT_EQ(to, blended); | |
926 blended = to.Blend(from, 1.5); | |
927 EXPECT_EQ(to, blended); | |
928 } | |
929 | |
930 // Tests blending non-empty sequences of different sizes. | |
931 TEST(FilterOperationsTest, BlendRaggedSequences) { | |
932 FilterOperations from; | |
933 FilterOperations to; | |
934 | |
935 from.Append(FilterOperation::CreateSaturateFilter(3.f)); | |
936 from.Append(FilterOperation::CreateBlurFilter(2.f)); | |
937 to.Append(FilterOperation::CreateSaturateFilter(4.f)); | |
938 | |
939 FilterOperations blended = to.Blend(from, -0.75); | |
940 FilterOperations expected; | |
941 expected.Append(FilterOperation::CreateSaturateFilter(2.25f)); | |
942 expected.Append(FilterOperation::CreateBlurFilter(3.5f)); | |
943 EXPECT_EQ(expected, blended); | |
944 | |
945 blended = to.Blend(from, 0.75); | |
946 expected.Clear(); | |
947 expected.Append(FilterOperation::CreateSaturateFilter(3.75f)); | |
948 expected.Append(FilterOperation::CreateBlurFilter(0.5f)); | |
949 EXPECT_EQ(expected, blended); | |
950 | |
951 blended = to.Blend(from, 1.5); | |
952 expected.Clear(); | |
953 expected.Append(FilterOperation::CreateSaturateFilter(4.5f)); | |
954 expected.Append(FilterOperation::CreateBlurFilter(0.f)); | |
955 EXPECT_EQ(expected, blended); | |
956 | |
957 from.Append(FilterOperation::CreateOpacityFilter(1.f)); | |
958 to.Append(FilterOperation::CreateOpacityFilter(1.f)); | |
959 blended = to.Blend(from, -0.75); | |
960 EXPECT_EQ(to, blended); | |
961 blended = to.Blend(from, 0.75); | |
962 EXPECT_EQ(to, blended); | |
963 blended = to.Blend(from, 1.5); | |
964 EXPECT_EQ(to, blended); | |
965 } | |
966 | |
967 TEST(FilterOperationsTest, ToString) { | |
968 FilterOperations filters; | |
969 EXPECT_EQ(std::string("{\"FilterOperations\":[]}"), filters.ToString()); | |
970 | |
971 filters.Append(FilterOperation::CreateSaturateFilter(3.f)); | |
972 filters.Append(FilterOperation::CreateBlurFilter(2.f)); | |
973 EXPECT_EQ(std::string("{\"FilterOperations\":[{\"amount\":3.0,\"type\":2}," | |
974 "{\"amount\":2.0,\"type\":8}]}"), | |
975 filters.ToString()); | |
976 } | |
977 | |
978 } // namespace | |
979 } // namespace cc | |
OLD | NEW |