11ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com/* 21ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com * Copyright 2011 Google Inc. 31ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com * 41ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com * Use of this source code is governed by a BSD-style license that can be 51ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com * found in the LICENSE file. 61ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com */ 71ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com 81ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com#include "SampleCode.h" 91ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com#include "SkView.h" 101ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com#include "SkCanvas.h" 111ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com#include "SkColorPriv.h" 121ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com#include "SkShader.h" 131ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com 14d1e67e70ae566bd841a2926eb07446ad99c64e59Brian Osmanstatic const SkBlendMode gModes[] = { 15d1e67e70ae566bd841a2926eb07446ad99c64e59Brian Osman SkBlendMode::kClear, 16d1e67e70ae566bd841a2926eb07446ad99c64e59Brian Osman SkBlendMode::kSrc, 17d1e67e70ae566bd841a2926eb07446ad99c64e59Brian Osman SkBlendMode::kDst, 18d1e67e70ae566bd841a2926eb07446ad99c64e59Brian Osman SkBlendMode::kSrcOver, 19d1e67e70ae566bd841a2926eb07446ad99c64e59Brian Osman SkBlendMode::kDstOver, 20d1e67e70ae566bd841a2926eb07446ad99c64e59Brian Osman SkBlendMode::kSrcIn, 21d1e67e70ae566bd841a2926eb07446ad99c64e59Brian Osman SkBlendMode::kDstIn, 22d1e67e70ae566bd841a2926eb07446ad99c64e59Brian Osman SkBlendMode::kSrcOut, 23d1e67e70ae566bd841a2926eb07446ad99c64e59Brian Osman SkBlendMode::kDstOut, 24d1e67e70ae566bd841a2926eb07446ad99c64e59Brian Osman SkBlendMode::kSrcATop, 25d1e67e70ae566bd841a2926eb07446ad99c64e59Brian Osman SkBlendMode::kDstATop, 26d1e67e70ae566bd841a2926eb07446ad99c64e59Brian Osman SkBlendMode::kXor, 271ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com}; 281ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com 291ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.comconst int gWidth = 64; 301ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.comconst int gHeight = 64; 311ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.comconst SkScalar W = SkIntToScalar(gWidth); 321ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.comconst SkScalar H = SkIntToScalar(gHeight); 331ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com 34374772bd61951f01bf84fe17bf53d8867681c9aereedstatic SkScalar drawCell(SkCanvas* canvas, SkBlendMode mode, SkAlpha a0, SkAlpha a1) { 351ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com SkPaint paint; 361ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com paint.setAntiAlias(true); 371ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com 381ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com SkRect r = SkRect::MakeWH(W, H); 391ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com r.inset(W/10, H/10); 401ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com 411ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com paint.setColor(SK_ColorBLUE); 421ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com paint.setAlpha(a0); 431ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com canvas->drawOval(r, paint); 441ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com 451ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com paint.setColor(SK_ColorRED); 461ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com paint.setAlpha(a1); 47374772bd61951f01bf84fe17bf53d8867681c9aereed paint.setBlendMode(mode); 481ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com for (int angle = 0; angle < 24; ++angle) { 491ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com SkScalar x = SkScalarCos(SkIntToScalar(angle) * (SK_ScalarPI * 2) / 24) * gWidth; 501ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com SkScalar y = SkScalarSin(SkIntToScalar(angle) * (SK_ScalarPI * 2) / 24) * gHeight; 511ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com paint.setStrokeWidth(SK_Scalar1 * angle * 2 / 24); 521ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com canvas->drawLine(W/2, H/2, W/2 + x, H/2 + y, paint); 531ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com } 54ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com 551ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com return H; 561ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com} 571ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com 588a21c9fe7f5fef9e87115defef27bd7218419f28reedstatic sk_sp<SkShader> make_bg_shader() { 591ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com SkBitmap bm; 60a8c183125f2861067daf432cada06d431a795cd0commit-bot@chromium.org bm.allocN32Pixels(2, 2); 611ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com *bm.getAddr32(0, 0) = *bm.getAddr32(1, 1) = 0xFFFFFFFF; 621ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com *bm.getAddr32(1, 0) = *bm.getAddr32(0, 1) = SkPackARGB32(0xFF, 0xCC, 0xCC, 0xCC); 631ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com 641ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com SkMatrix m; 651ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com m.setScale(SkIntToScalar(6), SkIntToScalar(6)); 669c9005a347e9996f357bd79591bd34f74f8bbc66commit-bot@chromium.org 678a21c9fe7f5fef9e87115defef27bd7218419f28reed return SkShader::MakeBitmapShader(bm, SkShader::kRepeat_TileMode, 688a21c9fe7f5fef9e87115defef27bd7218419f28reed SkShader::kRepeat_TileMode, &m); 691ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com} 701ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com 711ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.comclass HairModesView : public SampleView { 721ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com SkPaint fBGPaint; 731ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.compublic: 74ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com HairModesView() { 758a21c9fe7f5fef9e87115defef27bd7218419f28reed fBGPaint.setShader(make_bg_shader()); 761ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com } 771ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com 781ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.comprotected: 791ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com // overrides from SkEventSink 801ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com virtual bool onQuery(SkEvent* evt) { 811ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com if (SampleCode::TitleQ(*evt)) { 821ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com SampleCode::TitleR(evt, "HairlineModes"); 831ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com return true; 841ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com } 851ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com return this->INHERITED::onQuery(evt); 861ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com } 871ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com 881ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com virtual void onDrawContent(SkCanvas* canvas) { 891ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com const SkRect bounds = SkRect::MakeWH(W, H); 901ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com static const SkAlpha gAlphaValue[] = { 0xFF, 0x88, 0x88 }; 911ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com 921ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com canvas->translate(SkIntToScalar(4), SkIntToScalar(4)); 931ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com 941ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com for (int alpha = 0; alpha < 4; ++alpha) { 951ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com canvas->save(); 961ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com canvas->save(); 971ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com for (size_t i = 0; i < SK_ARRAY_COUNT(gModes); ++i) { 981ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com if (6 == i) { 991ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com canvas->restore(); 1001ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com canvas->translate(W * 5, 0); 1011ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com canvas->save(); 1021ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com } 1031ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com canvas->drawRect(bounds, fBGPaint); 10496fcdcc219d2a0d3579719b84b28bede76efba64halcanary canvas->saveLayer(&bounds, nullptr); 105d1e67e70ae566bd841a2926eb07446ad99c64e59Brian Osman SkScalar dy = drawCell(canvas, gModes[i], 1061ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com gAlphaValue[alpha & 1], 1071ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com gAlphaValue[alpha & 2]); 1081ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com canvas->restore(); 1091ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com 1101ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com canvas->translate(0, dy * 5 / 4); 1111ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com } 1121ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com canvas->restore(); 1131ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com canvas->restore(); 1141ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com canvas->translate(W * 5 / 4, 0); 1151ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com } 1161ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com } 117ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com 1181ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.comprivate: 1191ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com typedef SampleView INHERITED; 1201ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com}; 1211ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com 1221ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com/////////////////////////////////////////////////////////////////////////////// 1231ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com 1241ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.comstatic SkView* MyFactory() { return new HairModesView; } 1251ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.comstatic SkViewRegister reg(MyFactory); 126