1a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com/* 2a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com * Copyright 2011 Google Inc. 3a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com * 4a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com * Use of this source code is governed by a BSD-style license that can be 5a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com * found in the LICENSE file. 6a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com */ 7a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com 8a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com#include "SampleCode.h" 9a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com#include "SkView.h" 10a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com#include "SkCanvas.h" 11a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com#include "SkDevice.h" 12a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com#include "SkColorPriv.h" 13a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com#include "SkShader.h" 14a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com 15a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.comstatic const struct { 16a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com SkXfermode::Mode fMode; 17a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com const char* fLabel; 18a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com} gModes[] = { 19a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com { SkXfermode::kClear_Mode, "Clear" }, 20a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com { SkXfermode::kSrc_Mode, "Src" }, 21a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com { SkXfermode::kDst_Mode, "Dst" }, 22a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com { SkXfermode::kSrcOver_Mode, "SrcOver" }, 23a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com { SkXfermode::kDstOver_Mode, "DstOver" }, 24a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com { SkXfermode::kSrcIn_Mode, "SrcIn" }, 25a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com { SkXfermode::kDstIn_Mode, "DstIn" }, 26a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com { SkXfermode::kSrcOut_Mode, "SrcOut" }, 27a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com { SkXfermode::kDstOut_Mode, "DstOut" }, 28a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com { SkXfermode::kSrcATop_Mode, "SrcATop" }, 29a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com { SkXfermode::kDstATop_Mode, "DstATop" }, 30a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com { SkXfermode::kXor_Mode, "Xor" }, 31a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com}; 32a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com 33a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.comconst int gWidth = 64; 34a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.comconst int gHeight = 64; 35a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.comconst SkScalar W = SkIntToScalar(gWidth); 36a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.comconst SkScalar H = SkIntToScalar(gHeight); 37a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com 38a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.comstatic SkScalar drawCell(SkCanvas* canvas, SkXfermode* mode, 39a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com SkAlpha a0, SkAlpha a1) { 40a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com 41a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com SkPaint paint; 42a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com paint.setAntiAlias(true); 43a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com 44a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com SkRect r = SkRect::MakeWH(W, H); 45a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com r.inset(W/10, H/10); 46a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com 47a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com paint.setColor(SK_ColorBLUE); 48a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com paint.setAlpha(a0); 49a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com canvas->drawOval(r, paint); 50a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com 51a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com paint.setColor(SK_ColorRED); 52a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com paint.setAlpha(a1); 53a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com paint.setXfermode(mode); 54a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com 55a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com SkScalar offset = SK_Scalar1 / 3; 56a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com SkRect rect = SkRect::MakeXYWH(W / 4 + offset, 57a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com H / 4 + offset, 58a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com W / 2, H / 2); 59a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com canvas->drawRect(rect, paint); 60ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com 61a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com return H; 62a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com} 63a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com 64a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.comstatic SkShader* make_bg_shader() { 65a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com SkBitmap bm; 66a8c183125f2861067daf432cada06d431a795cd0commit-bot@chromium.org bm.allocN32Pixels(2, 2); 67a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com *bm.getAddr32(0, 0) = *bm.getAddr32(1, 1) = 0xFFFFFFFF; 68a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com *bm.getAddr32(1, 0) = *bm.getAddr32(0, 1) = SkPackARGB32(0xFF, 0xCC, 69a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com 0xCC, 0xCC); 70a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com 71a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com SkMatrix m; 72a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com m.setScale(SkIntToScalar(6), SkIntToScalar(6)); 739c9005a347e9996f357bd79591bd34f74f8bbc66commit-bot@chromium.org 749c9005a347e9996f357bd79591bd34f74f8bbc66commit-bot@chromium.org return SkShader::CreateBitmapShader(bm, 759c9005a347e9996f357bd79591bd34f74f8bbc66commit-bot@chromium.org SkShader::kRepeat_TileMode, 769c9005a347e9996f357bd79591bd34f74f8bbc66commit-bot@chromium.org SkShader::kRepeat_TileMode, 779c9005a347e9996f357bd79591bd34f74f8bbc66commit-bot@chromium.org &m); 78a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com} 79a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com 80a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.comclass AARectsModesView : public SampleView { 81a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com SkPaint fBGPaint; 82a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.compublic: 83a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com AARectsModesView () { 84a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com fBGPaint.setShader(make_bg_shader())->unref(); 85a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com } 86a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com 87a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.comprotected: 88a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com // overrides from SkEventSink 89a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com virtual bool onQuery(SkEvent* evt) { 90a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com if (SampleCode::TitleQ(*evt)) { 91a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com SampleCode::TitleR(evt, "AARectsModes"); 92a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com return true; 93a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com } 94a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com return this->INHERITED::onQuery(evt); 95a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com } 96a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com 97a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com virtual void onDrawContent(SkCanvas* canvas) { 98a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com const SkRect bounds = SkRect::MakeWH(W, H); 99a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com static const SkAlpha gAlphaValue[] = { 0xFF, 0x88, 0x88 }; 100a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com 101a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com canvas->translate(SkIntToScalar(4), SkIntToScalar(4)); 102a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com 103a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com for (int alpha = 0; alpha < 4; ++alpha) { 104a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com canvas->save(); 105a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com canvas->save(); 106a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com for (size_t i = 0; i < SK_ARRAY_COUNT(gModes); ++i) { 107a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com if (6 == i) { 108a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com canvas->restore(); 109a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com canvas->translate(W * 5, 0); 110a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com canvas->save(); 111a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com } 112a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com SkXfermode* mode = SkXfermode::Create(gModes[i].fMode); 113ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com 114a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com canvas->drawRect(bounds, fBGPaint); 115a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com canvas->saveLayer(&bounds, NULL); 116a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com SkScalar dy = drawCell(canvas, mode, 117a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com gAlphaValue[alpha & 1], 118a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com gAlphaValue[alpha & 2]); 119a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com canvas->restore(); 120a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com 121a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com canvas->translate(0, dy * 5 / 4); 122a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com SkSafeUnref(mode); 123a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com } 124a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com canvas->restore(); 125a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com canvas->restore(); 126a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com canvas->translate(W * 5 / 4, 0); 127a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com } 128a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com } 129ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com 130a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.comprivate: 131a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com typedef SampleView INHERITED; 132a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com}; 133a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com 134a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com/////////////////////////////////////////////////////////////////////////////// 135a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com 136a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.comstatic SkView* MyFactory() { return new AARectsModesView; } 137a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.comstatic SkViewRegister reg(MyFactory); 138