SampleXfermodesBlur.cpp 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. /*
  2. * Copyright 2011 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/SkColorFilter.h"
  10. #include "include/core/SkColorPriv.h"
  11. #include "include/core/SkFont.h"
  12. #include "include/core/SkGraphics.h"
  13. #include "include/core/SkPath.h"
  14. #include "include/core/SkRegion.h"
  15. #include "include/core/SkShader.h"
  16. #include "include/core/SkTime.h"
  17. #include "include/core/SkTypeface.h"
  18. #include "include/effects/SkCornerPathEffect.h"
  19. #include "include/effects/SkGradientShader.h"
  20. #include "include/utils/SkRandom.h"
  21. #include "include/utils/SkTextUtils.h"
  22. #include "samplecode/Sample.h"
  23. #include "src/core/SkBlurMask.h"
  24. #include "src/utils/SkUTF.h"
  25. #include "include/core/SkColorPriv.h"
  26. #include "include/core/SkStream.h"
  27. #include "include/effects/SkBlurMaskFilter.h"
  28. static void setNamedTypeface(SkFont* font, const char name[]) {
  29. font->setTypeface(SkTypeface::MakeFromName(name, SkFontStyle()));
  30. }
  31. static uint16_t gBG[] = { 0xFFFF, 0xCCCF, 0xCCCF, 0xFFFF };
  32. class XfermodesBlurView : public Sample {
  33. SkBitmap fBG;
  34. SkBitmap fSrcB, fDstB;
  35. void draw_mode(SkCanvas* canvas, SkBlendMode mode, int alpha, SkScalar x, SkScalar y) {
  36. SkPaint p;
  37. p.setMaskFilter(SkMaskFilter::MakeBlur(kNormal_SkBlurStyle,
  38. SkBlurMask::ConvertRadiusToSigma(5)));
  39. SkScalar ww = SkIntToScalar(W);
  40. SkScalar hh = SkIntToScalar(H);
  41. // draw a circle covering the upper
  42. // left three quarters of the canvas
  43. p.setColor(0xFFCC44FF);
  44. SkRect r;
  45. r.set(0, 0, ww*3/4, hh*3/4);
  46. r.offset(x, y);
  47. canvas->drawOval(r, p);
  48. p.setBlendMode(mode);
  49. // draw a square overlapping the circle
  50. // in the lower right of the canvas
  51. p.setColor(0x00AA6633 | alpha << 24);
  52. r.set(ww/3, hh/3, ww*19/20, hh*19/20);
  53. r.offset(x, y);
  54. canvas->drawRect(r, p);
  55. }
  56. public:
  57. const static int W = 64;
  58. const static int H = 64;
  59. XfermodesBlurView() {
  60. fBG.installPixels(SkImageInfo::Make(2, 2, kARGB_4444_SkColorType, kPremul_SkAlphaType),
  61. gBG, 4);
  62. }
  63. protected:
  64. virtual SkString name() { return SkString("XfermodesBlur"); }
  65. virtual void onDrawContent(SkCanvas* canvas) {
  66. canvas->translate(SkIntToScalar(10), SkIntToScalar(20));
  67. const SkBlendMode gModes[] = {
  68. SkBlendMode::kClear,
  69. SkBlendMode::kSrc,
  70. SkBlendMode::kDst,
  71. SkBlendMode::kSrcOver,
  72. SkBlendMode::kDstOver,
  73. SkBlendMode::kSrcIn,
  74. SkBlendMode::kDstIn,
  75. SkBlendMode::kSrcOut,
  76. SkBlendMode::kDstOut,
  77. SkBlendMode::kSrcATop,
  78. SkBlendMode::kDstATop,
  79. SkBlendMode::kXor,
  80. SkBlendMode::kPlus,
  81. };
  82. const SkScalar w = SkIntToScalar(W);
  83. const SkScalar h = SkIntToScalar(H);
  84. SkMatrix m;
  85. m.setScale(SkIntToScalar(6), SkIntToScalar(6));
  86. auto s = fBG.makeShader(SkTileMode::kRepeat, SkTileMode::kRepeat, &m);
  87. SkFont font;
  88. font.setEdging(SkFont::Edging::kSubpixelAntiAlias);
  89. setNamedTypeface(&font, "Menlo Regular");
  90. const int W = 5;
  91. SkScalar x0 = 0;
  92. for (int twice = 0; twice < 2; twice++) {
  93. SkScalar x = x0, y = 0;
  94. for (size_t i = 0; i < SK_ARRAY_COUNT(gModes); i++) {
  95. SkRect r;
  96. r.set(x, y, x+w, y+h);
  97. SkPaint p;
  98. p.setStyle(SkPaint::kFill_Style);
  99. p.setShader(s);
  100. canvas->drawRect(r, p);
  101. canvas->saveLayer(&r, nullptr);
  102. draw_mode(canvas, gModes[i], twice ? 0x88 : 0xFF, r.fLeft, r.fTop);
  103. canvas->restore();
  104. r.inset(-SK_ScalarHalf, -SK_ScalarHalf);
  105. p.setStyle(SkPaint::kStroke_Style);
  106. p.setShader(nullptr);
  107. canvas->drawRect(r, p);
  108. const char* label = SkBlendMode_Name(gModes[i]);
  109. SkTextUtils::DrawString(canvas, label, x + w/2, y - font.getSize()/2, font, SkPaint(),
  110. SkTextUtils::kCenter_Align);
  111. x += w + SkIntToScalar(10);
  112. if ((i % W) == W - 1) {
  113. x = x0;
  114. y += h + SkIntToScalar(30);
  115. }
  116. }
  117. x0 += SkIntToScalar(400);
  118. }
  119. }
  120. private:
  121. typedef Sample INHERITED;
  122. };
  123. //////////////////////////////////////////////////////////////////////////////
  124. DEF_SAMPLE( return new XfermodesBlurView(); )