11cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger/* 21cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Copyright 2011 Google Inc. 31cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * 41cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be 51cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * found in the LICENSE file. 61cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger */ 71cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 81cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "SampleCode.h" 91cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "SkView.h" 101cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "SkCanvas.h" 111cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "SkDevice.h" 121cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "SkColorPriv.h" 131cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "SkShader.h" 141cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 151cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerstatic SkCanvas* create_canvas(int w, int h) { 161cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkBitmap bm; 171cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger bm.setConfig(SkBitmap::kARGB_8888_Config, w, h); 181cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger bm.allocPixels(); 191cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger bm.eraseColor(0); 201cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger return new SkCanvas(bm); 211cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger} 221cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 231cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerstatic const SkBitmap& extract_bitmap(SkCanvas* canvas) { 241cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger return canvas->getDevice()->accessBitmap(false); 251cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger} 261cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 271cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerstatic const struct { 281cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkXfermode::Mode fMode; 291cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger const char* fLabel; 301cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger} gModes[] = { 311cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger { SkXfermode::kClear_Mode, "Clear" }, 321cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger { SkXfermode::kSrc_Mode, "Src" }, 331cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger { SkXfermode::kDst_Mode, "Dst" }, 341cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger { SkXfermode::kSrcOver_Mode, "SrcOver" }, 351cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger { SkXfermode::kDstOver_Mode, "DstOver" }, 361cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger { SkXfermode::kSrcIn_Mode, "SrcIn" }, 371cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger { SkXfermode::kDstIn_Mode, "DstIn" }, 381cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger { SkXfermode::kSrcOut_Mode, "SrcOut" }, 391cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger { SkXfermode::kDstOut_Mode, "DstOut" }, 401cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger { SkXfermode::kSrcATop_Mode, "SrcATop" }, 411cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger { SkXfermode::kDstATop_Mode, "DstATop" }, 421cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger { SkXfermode::kXor_Mode, "Xor" }, 431cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}; 441cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 451cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerconst int gWidth = 64; 461cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerconst int gHeight = 64; 471cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerconst SkScalar W = SkIntToScalar(gWidth); 481cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerconst SkScalar H = SkIntToScalar(gHeight); 491cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 501cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerstatic SkScalar drawCell(SkCanvas* canvas, SkXfermode* mode, 511cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkAlpha a0, SkAlpha a1) { 521cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 531cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkPaint paint; 541cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger paint.setAntiAlias(true); 551cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 561cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkRect r = SkRect::MakeWH(W, H); 571cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger r.inset(W/10, H/10); 581cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 591cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger paint.setColor(SK_ColorBLUE); 601cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger paint.setAlpha(a0); 611cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger canvas->drawOval(r, paint); 621cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 631cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger paint.setColor(SK_ColorRED); 641cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger paint.setAlpha(a1); 651cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger paint.setXfermode(mode); 661cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 671cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkScalar offset = SK_Scalar1 / 3; 681cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkRect rect = SkRect::MakeXYWH(W / 4 + offset, 691cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger H / 4 + offset, 701cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger W / 2, H / 2); 711cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger canvas->drawRect(rect, paint); 721cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 731cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger return H; 741cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger} 751cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 761cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerstatic SkShader* make_bg_shader() { 771cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkBitmap bm; 781cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger bm.setConfig(SkBitmap::kARGB_8888_Config, 2, 2); 791cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger bm.allocPixels(); 801cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger *bm.getAddr32(0, 0) = *bm.getAddr32(1, 1) = 0xFFFFFFFF; 811cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger *bm.getAddr32(1, 0) = *bm.getAddr32(0, 1) = SkPackARGB32(0xFF, 0xCC, 821cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 0xCC, 0xCC); 831cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 841cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkShader* s = SkShader::CreateBitmapShader(bm, 851cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkShader::kRepeat_TileMode, 861cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkShader::kRepeat_TileMode); 871cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 881cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkMatrix m; 891cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger m.setScale(SkIntToScalar(6), SkIntToScalar(6)); 901cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger s->setLocalMatrix(m); 911cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger return s; 921cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger} 931cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 941cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerclass AARectsModesView : public SampleView { 951cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkPaint fBGPaint; 961cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerpublic: 971cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger AARectsModesView () { 981cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger fBGPaint.setShader(make_bg_shader())->unref(); 991cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger } 1001cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 1011cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerprotected: 1021cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger // overrides from SkEventSink 1031cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger virtual bool onQuery(SkEvent* evt) { 1041cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger if (SampleCode::TitleQ(*evt)) { 1051cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SampleCode::TitleR(evt, "AARectsModes"); 1061cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger return true; 1071cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger } 1081cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger return this->INHERITED::onQuery(evt); 1091cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger } 1101cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 1111cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger virtual void onDrawContent(SkCanvas* canvas) { 1121cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger const SkRect bounds = SkRect::MakeWH(W, H); 1131cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger static const SkAlpha gAlphaValue[] = { 0xFF, 0x88, 0x88 }; 1141cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 1151cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger canvas->translate(SkIntToScalar(4), SkIntToScalar(4)); 1161cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 1171cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger for (int alpha = 0; alpha < 4; ++alpha) { 1181cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger canvas->save(); 1191cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger canvas->save(); 1201cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger for (size_t i = 0; i < SK_ARRAY_COUNT(gModes); ++i) { 1211cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger if (6 == i) { 1221cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger canvas->restore(); 1231cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger canvas->translate(W * 5, 0); 1241cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger canvas->save(); 1251cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger } 1261cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkXfermode* mode = SkXfermode::Create(gModes[i].fMode); 1271cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 1281cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger canvas->drawRect(bounds, fBGPaint); 1291cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger canvas->saveLayer(&bounds, NULL); 1301cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkScalar dy = drawCell(canvas, mode, 1311cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger gAlphaValue[alpha & 1], 1321cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger gAlphaValue[alpha & 2]); 1331cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger canvas->restore(); 1341cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 1351cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger canvas->translate(0, dy * 5 / 4); 1361cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkSafeUnref(mode); 1371cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger } 1381cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger canvas->restore(); 1391cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger canvas->restore(); 1401cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger canvas->translate(W * 5 / 4, 0); 1411cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger } 1421cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger } 1431cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 1441cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerprivate: 1451cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger typedef SampleView INHERITED; 1461cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}; 1471cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 1481cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger/////////////////////////////////////////////////////////////////////////////// 1491cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 1501cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerstatic SkView* MyFactory() { return new AARectsModesView; } 1511cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerstatic SkViewRegister reg(MyFactory); 1521cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 153