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