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 8 #include "gm/gm.h" 9 #include "include/core/SkBitmap.h" 10 #include "include/core/SkBlendMode.h" 11 #include "include/core/SkCanvas.h" 12 #include "include/core/SkColor.h" 13 #include "include/core/SkColorPriv.h" 14 #include "include/core/SkFont.h" 15 #include "include/core/SkMatrix.h" 16 #include "include/core/SkPaint.h" 17 #include "include/core/SkRect.h" 18 #include "include/core/SkRefCnt.h" 19 #include "include/core/SkScalar.h" 20 #include "include/core/SkShader.h" 21 #include "include/core/SkSize.h" 22 #include "include/core/SkString.h" 23 #include "include/core/SkTileMode.h" 24 #include "include/core/SkTypeface.h" 25 #include "include/utils/SkTextUtils.h" 26 #include "tools/ToolUtils.h" 27 #include <stdint.h> 28 #include <string.h> 29 30 namespace skiagm { 31 32 class Xfermodes2GM : public GM { 33 public: Xfermodes2GM()34 Xfermodes2GM() {} 35 36 protected: onShortName()37 SkString onShortName() override { 38 return SkString("xfermodes2"); 39 } 40 onISize()41 SkISize onISize() override { 42 return SkISize::Make(455, 475); 43 } 44 onDraw(SkCanvas * canvas)45 void onDraw(SkCanvas* canvas) override { 46 canvas->translate(SkIntToScalar(10), SkIntToScalar(20)); 47 48 const SkScalar w = SkIntToScalar(kSize); 49 const SkScalar h = SkIntToScalar(kSize); 50 51 SkFont font(ToolUtils::create_portable_typeface()); 52 53 const int W = 6; 54 55 SkScalar x = 0, y = 0; 56 for (size_t m = 0; m <= (size_t)SkBlendMode::kLastMode; m++) { 57 SkBlendMode mode = static_cast<SkBlendMode>(m); 58 59 canvas->save(); 60 61 canvas->translate(x, y); 62 SkPaint p; 63 p.setAntiAlias(false); 64 p.setStyle(SkPaint::kFill_Style); 65 p.setShader(fBG); 66 SkRect r = SkRect::MakeWH(w, h); 67 canvas->drawRect(r, p); 68 69 canvas->saveLayer(&r, nullptr); 70 71 p.setShader(fDst); 72 canvas->drawRect(r, p); 73 p.setShader(fSrc); 74 p.setBlendMode(mode); 75 canvas->drawRect(r, p); 76 77 canvas->restore(); 78 79 r.inset(-SK_ScalarHalf, -SK_ScalarHalf); 80 p.setStyle(SkPaint::kStroke_Style); 81 p.setShader(nullptr); 82 p.setBlendMode(SkBlendMode::kSrcOver); 83 canvas->drawRect(r, p); 84 85 canvas->restore(); 86 87 #if 1 88 SkTextUtils::DrawString(canvas, SkBlendMode_Name(mode), x + w/2, y - font.getSize()/2, font, SkPaint(), 89 SkTextUtils::kCenter_Align); 90 #endif 91 x += w + SkIntToScalar(10); 92 if ((m % W) == W - 1) { 93 x = 0; 94 y += h + SkIntToScalar(30); 95 } 96 } 97 } 98 99 private: onOnceBeforeDraw()100 void onOnceBeforeDraw() override { 101 const uint32_t kCheckData[] = { 102 SkPackARGB32(0xFF, 0x42, 0x41, 0x42), 103 SkPackARGB32(0xFF, 0xD6, 0xD3, 0xD6), 104 SkPackARGB32(0xFF, 0xD6, 0xD3, 0xD6), 105 SkPackARGB32(0xFF, 0x42, 0x41, 0x42) 106 }; 107 SkBitmap bg; 108 bg.allocN32Pixels(2, 2, true); 109 memcpy(bg.getPixels(), kCheckData, sizeof(kCheckData)); 110 111 SkMatrix lm; 112 lm.setScale(SkIntToScalar(16), SkIntToScalar(16)); 113 fBG = bg.makeShader(SkTileMode::kRepeat, SkTileMode::kRepeat, SkSamplingOptions(), lm); 114 115 SkBitmap srcBmp; 116 srcBmp.allocN32Pixels(kSize, kSize); 117 SkPMColor* pixels = reinterpret_cast<SkPMColor*>(srcBmp.getPixels()); 118 119 for (int y = 0; y < kSize; ++y) { 120 int c = y * (1 << kShift); 121 SkPMColor rowColor = SkPackARGB32(c, c, 0, c/2); 122 for (int x = 0; x < kSize; ++x) { 123 pixels[kSize * y + x] = rowColor; 124 } 125 } 126 fSrc = srcBmp.makeShader(SkSamplingOptions()); 127 SkBitmap dstBmp; 128 dstBmp.allocN32Pixels(kSize, kSize); 129 pixels = reinterpret_cast<SkPMColor*>(dstBmp.getPixels()); 130 131 for (int x = 0; x < kSize; ++x) { 132 int c = x * (1 << kShift); 133 SkPMColor colColor = SkPackARGB32(c, 0, c, c/2); 134 for (int y = 0; y < kSize; ++y) { 135 pixels[kSize * y + x] = colColor; 136 } 137 } 138 fDst = dstBmp.makeShader(SkSamplingOptions()); 139 } 140 141 enum { 142 kShift = 2, 143 kSize = 256 >> kShift, 144 }; 145 146 sk_sp<SkShader> fBG; 147 sk_sp<SkShader> fSrc; 148 sk_sp<SkShader> fDst; 149 150 using INHERITED = GM; 151 }; 152 153 ////////////////////////////////////////////////////////////////////////////// 154 155 DEF_GM( return new Xfermodes2GM; ) 156 157 } // namespace skiagm 158