filter_operations_unittest.cc 42 KB

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