dropshadowimagefilter.cpp 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. /*
  2. * Copyright 2013 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 "gm/gm.h"
  8. #include "include/core/SkBitmap.h"
  9. #include "include/core/SkBlendMode.h"
  10. #include "include/core/SkCanvas.h"
  11. #include "include/core/SkColor.h"
  12. #include "include/core/SkColorFilter.h"
  13. #include "include/core/SkFont.h"
  14. #include "include/core/SkImageFilter.h"
  15. #include "include/core/SkPaint.h"
  16. #include "include/core/SkRect.h"
  17. #include "include/core/SkRefCnt.h"
  18. #include "include/core/SkScalar.h"
  19. #include "include/core/SkTypeface.h"
  20. #include "include/core/SkTypes.h"
  21. #include "include/effects/SkColorFilterImageFilter.h"
  22. #include "include/effects/SkDropShadowImageFilter.h"
  23. #include "include/utils/SkTextUtils.h"
  24. #include "tools/ToolUtils.h"
  25. #include <utility>
  26. ///////////////////////////////////////////////////////////////////////////////
  27. static void draw_paint(SkCanvas* canvas, const SkRect& r, sk_sp<SkImageFilter> imf) {
  28. SkPaint paint;
  29. paint.setImageFilter(std::move(imf));
  30. paint.setColor(SK_ColorBLACK);
  31. canvas->save();
  32. canvas->clipRect(r);
  33. canvas->drawPaint(paint);
  34. canvas->restore();
  35. }
  36. static void draw_path(SkCanvas* canvas, const SkRect& r, sk_sp<SkImageFilter> imf) {
  37. SkPaint paint;
  38. paint.setColor(SK_ColorGREEN);
  39. paint.setImageFilter(std::move(imf));
  40. paint.setAntiAlias(true);
  41. canvas->save();
  42. canvas->clipRect(r);
  43. canvas->drawCircle(r.centerX(), r.centerY(), r.width()/3, paint);
  44. canvas->restore();
  45. }
  46. static void draw_text(SkCanvas* canvas, const SkRect& r, sk_sp<SkImageFilter> imf) {
  47. SkPaint paint;
  48. paint.setImageFilter(std::move(imf));
  49. paint.setColor(SK_ColorGREEN);
  50. paint.setAntiAlias(true);
  51. SkFont font(ToolUtils::create_portable_typeface(), r.height() / 2);
  52. canvas->save();
  53. canvas->clipRect(r);
  54. SkTextUtils::DrawString(canvas, "Text", r.centerX(), r.centerY(), font, paint, SkTextUtils::kCenter_Align);
  55. canvas->restore();
  56. }
  57. static void draw_bitmap(SkCanvas* canvas, const SkRect& r, sk_sp<SkImageFilter> imf) {
  58. SkPaint paint;
  59. SkIRect bounds;
  60. r.roundOut(&bounds);
  61. SkBitmap bm;
  62. bm.allocN32Pixels(bounds.width(), bounds.height());
  63. bm.eraseColor(SK_ColorTRANSPARENT);
  64. SkCanvas c(bm);
  65. draw_path(&c, r, nullptr);
  66. paint.setImageFilter(std::move(imf));
  67. canvas->save();
  68. canvas->clipRect(r);
  69. canvas->drawBitmap(bm, 0, 0, &paint);
  70. canvas->restore();
  71. }
  72. ///////////////////////////////////////////////////////////////////////////////
  73. DEF_SIMPLE_GM(dropshadowimagefilter, canvas, 400, 656) {
  74. void (*drawProc[])(SkCanvas*, const SkRect&, sk_sp<SkImageFilter>) = {
  75. draw_bitmap, draw_path, draw_paint, draw_text
  76. };
  77. sk_sp<SkColorFilter> cf(SkColorFilters::Blend(SK_ColorMAGENTA, SkBlendMode::kSrcIn));
  78. sk_sp<SkImageFilter> cfif(SkColorFilterImageFilter::Make(std::move(cf), nullptr));
  79. SkImageFilter::CropRect cropRect(SkRect::Make(SkIRect::MakeXYWH(10, 10, 44, 44)),
  80. SkImageFilter::CropRect::kHasAll_CropEdge);
  81. SkImageFilter::CropRect bogusRect(SkRect::Make(SkIRect::MakeXYWH(-100, -100, 10, 10)),
  82. SkImageFilter::CropRect::kHasAll_CropEdge);
  83. sk_sp<SkImageFilter> filters[] = {
  84. nullptr,
  85. SkDropShadowImageFilter::Make(7.0f, 0.0f, 0.0f, 3.0f, SK_ColorBLUE,
  86. SkDropShadowImageFilter::kDrawShadowAndForeground_ShadowMode, nullptr),
  87. SkDropShadowImageFilter::Make(0.0f, 7.0f, 3.0f, 0.0f, SK_ColorBLUE,
  88. SkDropShadowImageFilter::kDrawShadowAndForeground_ShadowMode, nullptr),
  89. SkDropShadowImageFilter::Make(7.0f, 7.0f, 3.0f, 3.0f, SK_ColorBLUE,
  90. SkDropShadowImageFilter::kDrawShadowAndForeground_ShadowMode, nullptr),
  91. SkDropShadowImageFilter::Make(7.0f, 7.0f, 3.0f, 3.0f, SK_ColorBLUE,
  92. SkDropShadowImageFilter::kDrawShadowAndForeground_ShadowMode, std::move(cfif)),
  93. SkDropShadowImageFilter::Make(7.0f, 7.0f, 3.0f, 3.0f, SK_ColorBLUE,
  94. SkDropShadowImageFilter::kDrawShadowAndForeground_ShadowMode, nullptr, &cropRect),
  95. SkDropShadowImageFilter::Make(7.0f, 7.0f, 3.0f, 3.0f, SK_ColorBLUE,
  96. SkDropShadowImageFilter::kDrawShadowAndForeground_ShadowMode, nullptr, &bogusRect),
  97. SkDropShadowImageFilter::Make(7.0f, 7.0f, 3.0f, 3.0f, SK_ColorBLUE,
  98. SkDropShadowImageFilter::kDrawShadowOnly_ShadowMode, nullptr),
  99. };
  100. SkRect r = SkRect::MakeWH(SkIntToScalar(64), SkIntToScalar(64));
  101. SkScalar MARGIN = SkIntToScalar(16);
  102. SkScalar DX = r.width() + MARGIN;
  103. SkScalar DY = r.height() + MARGIN;
  104. canvas->translate(MARGIN, MARGIN);
  105. for (size_t j = 0; j < SK_ARRAY_COUNT(drawProc); ++j) {
  106. canvas->save();
  107. for (size_t i = 0; i < SK_ARRAY_COUNT(filters); ++i) {
  108. drawProc[j](canvas, r, filters[i]);
  109. canvas->translate(0, DY);
  110. }
  111. canvas->restore();
  112. canvas->translate(DX, 0);
  113. }
  114. }