1cb93a386Sopenharmony_ci/* 2cb93a386Sopenharmony_ci * Copyright 2011 Google Inc. 3cb93a386Sopenharmony_ci * 4cb93a386Sopenharmony_ci * Use of this source code is governed by a BSD-style license that can be 5cb93a386Sopenharmony_ci * found in the LICENSE file. 6cb93a386Sopenharmony_ci */ 7cb93a386Sopenharmony_ci 8cb93a386Sopenharmony_ci#include "include/core/SkBitmap.h" 9cb93a386Sopenharmony_ci#include "include/core/SkCanvas.h" 10cb93a386Sopenharmony_ci#include "include/core/SkColorPriv.h" 11cb93a386Sopenharmony_ci#include "include/core/SkShader.h" 12cb93a386Sopenharmony_ci#include "samplecode/Sample.h" 13cb93a386Sopenharmony_ci 14cb93a386Sopenharmony_cistatic const SkBlendMode gModes[] = { 15cb93a386Sopenharmony_ci SkBlendMode::kClear, 16cb93a386Sopenharmony_ci SkBlendMode::kSrc, 17cb93a386Sopenharmony_ci SkBlendMode::kDst, 18cb93a386Sopenharmony_ci SkBlendMode::kSrcOver, 19cb93a386Sopenharmony_ci SkBlendMode::kDstOver, 20cb93a386Sopenharmony_ci SkBlendMode::kSrcIn, 21cb93a386Sopenharmony_ci SkBlendMode::kDstIn, 22cb93a386Sopenharmony_ci SkBlendMode::kSrcOut, 23cb93a386Sopenharmony_ci SkBlendMode::kDstOut, 24cb93a386Sopenharmony_ci SkBlendMode::kSrcATop, 25cb93a386Sopenharmony_ci SkBlendMode::kDstATop, 26cb93a386Sopenharmony_ci SkBlendMode::kXor, 27cb93a386Sopenharmony_ci}; 28cb93a386Sopenharmony_ci 29cb93a386Sopenharmony_ciconst int gWidth = 64; 30cb93a386Sopenharmony_ciconst int gHeight = 64; 31cb93a386Sopenharmony_ciconst SkScalar W = SkIntToScalar(gWidth); 32cb93a386Sopenharmony_ciconst SkScalar H = SkIntToScalar(gHeight); 33cb93a386Sopenharmony_ci 34cb93a386Sopenharmony_cistatic SkScalar drawCell(SkCanvas* canvas, SkBlendMode mode, SkAlpha a0, SkAlpha a1) { 35cb93a386Sopenharmony_ci SkPaint paint; 36cb93a386Sopenharmony_ci paint.setAntiAlias(true); 37cb93a386Sopenharmony_ci 38cb93a386Sopenharmony_ci SkRect r = SkRect::MakeWH(W, H); 39cb93a386Sopenharmony_ci r.inset(W/10, H/10); 40cb93a386Sopenharmony_ci 41cb93a386Sopenharmony_ci paint.setColor(SK_ColorBLUE); 42cb93a386Sopenharmony_ci paint.setAlpha(a0); 43cb93a386Sopenharmony_ci canvas->drawOval(r, paint); 44cb93a386Sopenharmony_ci 45cb93a386Sopenharmony_ci paint.setColor(SK_ColorRED); 46cb93a386Sopenharmony_ci paint.setAlpha(a1); 47cb93a386Sopenharmony_ci paint.setBlendMode(mode); 48cb93a386Sopenharmony_ci 49cb93a386Sopenharmony_ci SkScalar offset = SK_Scalar1 / 3; 50cb93a386Sopenharmony_ci SkRect rect = SkRect::MakeXYWH(W / 4 + offset, 51cb93a386Sopenharmony_ci H / 4 + offset, 52cb93a386Sopenharmony_ci W / 2, H / 2); 53cb93a386Sopenharmony_ci canvas->drawRect(rect, paint); 54cb93a386Sopenharmony_ci 55cb93a386Sopenharmony_ci return H; 56cb93a386Sopenharmony_ci} 57cb93a386Sopenharmony_ci 58cb93a386Sopenharmony_cistatic sk_sp<SkShader> make_bg_shader() { 59cb93a386Sopenharmony_ci SkBitmap bm; 60cb93a386Sopenharmony_ci bm.allocN32Pixels(2, 2); 61cb93a386Sopenharmony_ci *bm.getAddr32(0, 0) = *bm.getAddr32(1, 1) = 0xFFFFFFFF; 62cb93a386Sopenharmony_ci *bm.getAddr32(1, 0) = *bm.getAddr32(0, 1) = SkPackARGB32(0xFF, 0xCC, 63cb93a386Sopenharmony_ci 0xCC, 0xCC); 64cb93a386Sopenharmony_ci 65cb93a386Sopenharmony_ci return bm.makeShader(SkTileMode::kRepeat, SkTileMode::kRepeat, SkSamplingOptions(), 66cb93a386Sopenharmony_ci SkMatrix::Scale(6, 6)); 67cb93a386Sopenharmony_ci} 68cb93a386Sopenharmony_ci 69cb93a386Sopenharmony_ciclass AARectsModesView : public Sample { 70cb93a386Sopenharmony_ci SkPaint fBGPaint; 71cb93a386Sopenharmony_ci 72cb93a386Sopenharmony_ci void onOnceBeforeDraw() override { 73cb93a386Sopenharmony_ci fBGPaint.setShader(make_bg_shader()); 74cb93a386Sopenharmony_ci } 75cb93a386Sopenharmony_ci 76cb93a386Sopenharmony_ci SkString name() override { return SkString("AARectsModes"); } 77cb93a386Sopenharmony_ci 78cb93a386Sopenharmony_ci void onDrawContent(SkCanvas* canvas) override { 79cb93a386Sopenharmony_ci const SkRect bounds = SkRect::MakeWH(W, H); 80cb93a386Sopenharmony_ci static const SkAlpha gAlphaValue[] = { 0xFF, 0x88, 0x88 }; 81cb93a386Sopenharmony_ci 82cb93a386Sopenharmony_ci canvas->translate(SkIntToScalar(4), SkIntToScalar(4)); 83cb93a386Sopenharmony_ci 84cb93a386Sopenharmony_ci for (int alpha = 0; alpha < 4; ++alpha) { 85cb93a386Sopenharmony_ci canvas->save(); 86cb93a386Sopenharmony_ci canvas->save(); 87cb93a386Sopenharmony_ci for (size_t i = 0; i < SK_ARRAY_COUNT(gModes); ++i) { 88cb93a386Sopenharmony_ci if (6 == i) { 89cb93a386Sopenharmony_ci canvas->restore(); 90cb93a386Sopenharmony_ci canvas->translate(W * 5, 0); 91cb93a386Sopenharmony_ci canvas->save(); 92cb93a386Sopenharmony_ci } 93cb93a386Sopenharmony_ci 94cb93a386Sopenharmony_ci canvas->drawRect(bounds, fBGPaint); 95cb93a386Sopenharmony_ci canvas->saveLayer(&bounds, nullptr); 96cb93a386Sopenharmony_ci SkScalar dy = drawCell(canvas, gModes[i], gAlphaValue[alpha & 1], 97cb93a386Sopenharmony_ci gAlphaValue[alpha & 2]); 98cb93a386Sopenharmony_ci canvas->restore(); 99cb93a386Sopenharmony_ci 100cb93a386Sopenharmony_ci canvas->translate(0, dy * 5 / 4); 101cb93a386Sopenharmony_ci } 102cb93a386Sopenharmony_ci canvas->restore(); 103cb93a386Sopenharmony_ci canvas->restore(); 104cb93a386Sopenharmony_ci canvas->translate(W * 5 / 4, 0); 105cb93a386Sopenharmony_ci } 106cb93a386Sopenharmony_ci } 107cb93a386Sopenharmony_ci}; 108cb93a386Sopenharmony_ciDEF_SAMPLE( return new AARectsModesView(); ) 109