PaintImageFilterTest.cpp 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. /*
  2. * Copyright 2016 Google Inc.
  3. *
  4. * Use of this source code is governed by a BSD-style license that can be
  5. * found in the LICENSE file.
  6. */
  7. #include "include/core/SkBitmap.h"
  8. #include "include/core/SkCanvas.h"
  9. #include "include/core/SkShader.h"
  10. #include "include/effects/SkGradientShader.h"
  11. #include "include/effects/SkPaintImageFilter.h"
  12. #include "tests/Test.h"
  13. static void test_unscaled(skiatest::Reporter* reporter) {
  14. int w = 10, h = 10;
  15. SkRect r = SkRect::MakeWH(SkIntToScalar(w), SkIntToScalar(h));
  16. SkBitmap filterResult, paintResult;
  17. filterResult.allocN32Pixels(w, h);
  18. SkCanvas canvasFilter(filterResult);
  19. canvasFilter.clear(0x00000000);
  20. paintResult.allocN32Pixels(w, h);
  21. SkCanvas canvasPaint(paintResult);
  22. canvasPaint.clear(0x00000000);
  23. SkPoint center = SkPoint::Make(SkIntToScalar(5), SkIntToScalar(5));
  24. SkColor colors[] = {SK_ColorBLUE, SK_ColorRED, SK_ColorGREEN};
  25. SkScalar pos[] = {0, SK_ScalarHalf, SK_Scalar1};
  26. SkScalar radius = SkIntToScalar(5);
  27. SkPaint gradientPaint;
  28. gradientPaint.setShader(SkGradientShader::MakeRadial(
  29. center, radius, colors, pos, SK_ARRAY_COUNT(colors), SkTileMode::kClamp));
  30. // Test using the image filter
  31. {
  32. SkPaint paint;
  33. SkImageFilter::CropRect cr(r);
  34. paint.setImageFilter(SkPaintImageFilter::Make(gradientPaint, &cr));
  35. canvasFilter.drawRect(r, paint);
  36. }
  37. // Test using the paint directly
  38. {
  39. canvasPaint.drawRect(r, gradientPaint);
  40. }
  41. // Assert that both paths yielded the same result
  42. for (int y = 0; y < r.height(); ++y) {
  43. const SkPMColor* filterPtr = filterResult.getAddr32(0, y);
  44. const SkPMColor* paintPtr = paintResult.getAddr32(0, y);
  45. for (int x = 0; x < r.width(); ++x, ++filterPtr, ++paintPtr) {
  46. REPORTER_ASSERT(reporter, *filterPtr == *paintPtr);
  47. }
  48. }
  49. }
  50. static void test_scaled(skiatest::Reporter* reporter) {
  51. int w = 10, h = 10;
  52. SkRect r = SkRect::MakeWH(SkIntToScalar(w), SkIntToScalar(h));
  53. SkBitmap filterResult, paintResult;
  54. filterResult.allocN32Pixels(w, h);
  55. SkCanvas canvasFilter(filterResult);
  56. canvasFilter.clear(0x00000000);
  57. paintResult.allocN32Pixels(w, h);
  58. SkCanvas canvasPaint(paintResult);
  59. canvasPaint.clear(0x00000000);
  60. SkPoint center = SkPoint::Make(SkIntToScalar(5), SkIntToScalar(5));
  61. SkColor colors[] = {SK_ColorBLUE, SK_ColorRED, SK_ColorGREEN};
  62. SkScalar pos[] = {0, SK_ScalarHalf, SK_Scalar1};
  63. SkScalar radius = SkIntToScalar(5);
  64. SkPaint gradientPaint;
  65. gradientPaint.setShader(SkGradientShader::MakeRadial(
  66. center, radius, colors, pos, SK_ARRAY_COUNT(colors), SkTileMode::kClamp));
  67. // Test using the image filter
  68. {
  69. SkPaint paint;
  70. SkImageFilter::CropRect cr(r);
  71. paint.setImageFilter(SkPaintImageFilter::Make(gradientPaint, &cr));
  72. canvasFilter.scale(SkIntToScalar(2), SkIntToScalar(2));
  73. canvasFilter.drawRect(r, paint);
  74. }
  75. // Test using the paint directly
  76. {
  77. canvasPaint.scale(SkIntToScalar(2), SkIntToScalar(2));
  78. canvasPaint.drawRect(r, gradientPaint);
  79. }
  80. // Assert that both paths yielded the same result
  81. for (int y = 0; y < r.height(); ++y) {
  82. const SkPMColor* filterPtr = filterResult.getAddr32(0, y);
  83. const SkPMColor* paintPtr = paintResult.getAddr32(0, y);
  84. for (int x = 0; x < r.width(); ++x, ++filterPtr, ++paintPtr) {
  85. REPORTER_ASSERT(reporter, *filterPtr == *paintPtr);
  86. }
  87. }
  88. }
  89. DEF_TEST(PaintImageFilter, reporter) {
  90. test_unscaled(reporter);
  91. test_scaled(reporter);
  92. }