androidblendmodes.cpp 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. /*
  2. * Copyright 2018 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/SkFont.h"
  13. #include "include/core/SkImageInfo.h"
  14. #include "include/core/SkPaint.h"
  15. #include "include/core/SkRect.h"
  16. #include "include/core/SkSize.h"
  17. #include "include/core/SkString.h"
  18. #include "include/core/SkTypeface.h"
  19. #include "include/utils/SkTextUtils.h"
  20. #include "tools/ToolUtils.h"
  21. #include <initializer_list>
  22. namespace skiagm {
  23. // This GM recreates the blend mode images from the Android documentation
  24. class AndroidBlendModesGM : public GM {
  25. public:
  26. AndroidBlendModesGM() {
  27. this->setBGColor(SK_ColorBLACK);
  28. }
  29. protected:
  30. SkString onShortName() override {
  31. return SkString("androidblendmodes");
  32. }
  33. SkISize onISize() override {
  34. return SkISize::Make(kNumCols * kBitmapSize, kNumRows * kBitmapSize);
  35. }
  36. void onOnceBeforeDraw() override {
  37. SkImageInfo ii = SkImageInfo::MakeN32Premul(kBitmapSize, kBitmapSize);
  38. {
  39. fCompositeSrc.allocPixels(ii);
  40. SkCanvas tmp(fCompositeSrc);
  41. tmp.clear(SK_ColorTRANSPARENT);
  42. SkPaint p;
  43. p.setAntiAlias(true);
  44. p.setColor(ToolUtils::color_to_565(kBlue));
  45. tmp.drawRect(SkRect::MakeLTRB(16, 96, 160, 240), p);
  46. }
  47. {
  48. fCompositeDst.allocPixels(ii);
  49. SkCanvas tmp(fCompositeDst);
  50. tmp.clear(SK_ColorTRANSPARENT);
  51. SkPaint p;
  52. p.setAntiAlias(true);
  53. p.setColor(ToolUtils::color_to_565(kRed));
  54. tmp.drawCircle(160, 95, 80, p);
  55. }
  56. }
  57. void drawTile(SkCanvas* canvas, int xOffset, int yOffset, SkBlendMode mode) {
  58. canvas->translate(xOffset, yOffset);
  59. canvas->clipRect(SkRect::MakeXYWH(0, 0, 256, 256));
  60. canvas->saveLayer(nullptr, nullptr);
  61. SkPaint p;
  62. canvas->drawBitmap(fCompositeDst, 0, 0, &p);
  63. p.setBlendMode(mode);
  64. canvas->drawBitmap(fCompositeSrc, 0, 0, &p);
  65. }
  66. void onDraw(SkCanvas* canvas) override {
  67. SkFont font(ToolUtils::create_portable_typeface());
  68. ToolUtils::draw_checkerboard(canvas, kWhite, kGrey, 32);
  69. int xOffset = 0, yOffset = 0;
  70. // Android doesn't expose all the blend modes
  71. // Note that the Android documentation calls:
  72. // Skia's kPlus, add
  73. // Skia's kModulate, multiply
  74. for (SkBlendMode mode : { SkBlendMode::kPlus /* add */, SkBlendMode::kClear,
  75. SkBlendMode::kDarken, SkBlendMode::kDst,
  76. SkBlendMode::kDstATop, SkBlendMode::kDstIn,
  77. SkBlendMode::kDstOut, SkBlendMode::kDstOver,
  78. SkBlendMode::kLighten, SkBlendMode::kModulate /* multiply */,
  79. SkBlendMode::kOverlay, SkBlendMode::kScreen,
  80. SkBlendMode::kSrc, SkBlendMode::kSrcATop,
  81. SkBlendMode::kSrcIn, SkBlendMode::kSrcOut,
  82. SkBlendMode::kSrcOver, SkBlendMode::kXor } ) {
  83. int saveCount = canvas->save();
  84. this->drawTile(canvas, xOffset, yOffset, mode);
  85. canvas->restoreToCount(saveCount);
  86. SkTextUtils::DrawString(canvas, SkBlendMode_Name(mode),
  87. xOffset + kBitmapSize/2.0f,
  88. yOffset + kBitmapSize,
  89. font, SkPaint(), SkTextUtils::kCenter_Align);
  90. xOffset += 256;
  91. if (xOffset >= 1024) {
  92. xOffset = 0;
  93. yOffset += 256;
  94. }
  95. }
  96. }
  97. private:
  98. static const int kBitmapSize = 256;
  99. static const int kNumRows = 5;
  100. static const int kNumCols = 4;
  101. static const SkColor kBlue = SkColorSetARGB(255, 22, 150, 243);
  102. static const SkColor kRed = SkColorSetARGB(255, 233, 30, 99);
  103. static const SkColor kWhite = SkColorSetARGB(255, 243, 243, 243);
  104. static const SkColor kGrey = SkColorSetARGB(255, 222, 222, 222);
  105. SkBitmap fCompositeSrc;
  106. SkBitmap fCompositeDst;
  107. typedef GM INHERITED;
  108. };
  109. //////////////////////////////////////////////////////////////////////////////
  110. DEF_GM(return new AndroidBlendModesGM;)
  111. }