1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/* 2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2011 Google Inc. 3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * 4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be 5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file. 6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com */ 7bf0001d0472d727266762c5967ec0d919a6df083reed@google.com 8271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com#include "SampleCode.h" 9271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com#include "SkView.h" 1075ae421c24ee7ab5a86334e43404b24a6a6fb1f4Mike Reed#include "SkBitmap.h" 11b7061176c7f414616fe2e79e832b3e0abe326af6robertphillips@google.com#include "SkBlurMask.h" 12271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com#include "SkCanvas.h" 13271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com#include "SkCornerPathEffect.h" 14271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com#include "SkGradientShader.h" 15271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com#include "SkGraphics.h" 16271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com#include "SkPath.h" 17271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com#include "SkRandom.h" 18271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com#include "SkRegion.h" 19271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com#include "SkShader.h" 20271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com#include "SkUtils.h" 21271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com#include "SkColorPriv.h" 22271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com#include "SkColorFilter.h" 23271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com#include "SkTime.h" 24271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com#include "SkTypeface.h" 25271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com 26271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com#include "SkStream.h" 27271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com#include "SkColorPriv.h" 28271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com#include "SkBlurMaskFilter.h" 29271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com 30271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.comstatic void setNamedTypeface(SkPaint* paint, const char name[]) { 31ee6a9919a362e16c1d84a870ce867d1ad7b8a141mboc paint->setTypeface(SkTypeface::MakeFromName(name, SkFontStyle())); 32271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com} 33271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com 34271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.comstatic uint16_t gBG[] = { 0xFFFF, 0xCCCF, 0xCCCF, 0xFFFF }; 35271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com 36271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.comclass XfermodesBlurView : public SampleView { 37271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com SkBitmap fBG; 38271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com SkBitmap fSrcB, fDstB; 39271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com 40374772bd61951f01bf84fe17bf53d8867681c9aereed void draw_mode(SkCanvas* canvas, SkBlendMode mode, int alpha, SkScalar x, SkScalar y) { 41271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com SkPaint p; 42efdfd51b68a300d5c6e28743fe0344ca05d1cec9reed p.setMaskFilter(SkBlurMaskFilter::Make(kNormal_SkBlurStyle, 43efdfd51b68a300d5c6e28743fe0344ca05d1cec9reed SkBlurMask::ConvertRadiusToSigma(5), 44efdfd51b68a300d5c6e28743fe0344ca05d1cec9reed SkBlurMaskFilter::kNone_BlurFlag)); 45271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com 46271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com SkScalar ww = SkIntToScalar(W); 47271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com SkScalar hh = SkIntToScalar(H); 48271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com 49271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com // draw a circle covering the upper 50271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com // left three quarters of the canvas 51271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com p.setColor(0xFFCC44FF); 52271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com SkRect r; 53271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com r.set(0, 0, ww*3/4, hh*3/4); 54271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com r.offset(x, y); 55271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com canvas->drawOval(r, p); 56271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com 57374772bd61951f01bf84fe17bf53d8867681c9aereed p.setBlendMode(mode); 58271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com 59271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com // draw a square overlapping the circle 60271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com // in the lower right of the canvas 61271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com p.setColor(0x00AA6633 | alpha << 24); 62271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com r.set(ww/3, hh/3, ww*19/20, hh*19/20); 63271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com r.offset(x, y); 64271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com canvas->drawRect(r, p); 65271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com } 66271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com 67271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.compublic: 68271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com const static int W = 64; 69271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com const static int H = 64; 7022c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com XfermodesBlurView() { 7100f8d6c75d22ce8f95f932c5b101354b196fa0dfcommit-bot@chromium.org fBG.installPixels(SkImageInfo::Make(2, 2, kARGB_4444_SkColorType, kPremul_SkAlphaType), 7200f8d6c75d22ce8f95f932c5b101354b196fa0dfcommit-bot@chromium.org gBG, 4); 73271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com } 74271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com 75271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.comprotected: 76271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com // overrides from SkEventSink 77271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com virtual bool onQuery(SkEvent* evt) { 78271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com if (SampleCode::TitleQ(*evt)) { 79271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com SampleCode::TitleR(evt, "XfermodesBlur"); 80271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com return true; 81271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com } 82271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com return this->INHERITED::onQuery(evt); 83271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com } 84271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com 85271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com virtual void onDrawContent(SkCanvas* canvas) { 86271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com canvas->translate(SkIntToScalar(10), SkIntToScalar(20)); 87271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com 8887fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com if (false) { 8987fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com SkPaint paint; 9087fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com paint.setAntiAlias(true); 9187fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com paint.setTextSize(50); 92ee6a9919a362e16c1d84a870ce867d1ad7b8a141mboc paint.setTypeface(SkTypeface::MakeFromName("Arial Unicode MS", SkFontStyle())); 9387fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com char buffer[10]; 9487fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com size_t len = SkUTF8_FromUnichar(0x8500, buffer); 9587fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com canvas->drawText(buffer, len, 40, 40, paint); 9687fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com return; 9787fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com } 980e0c94c8e9062a0e11f2bad55f1c1a83b34ddbc8reed@google.com if (false) { 9987fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com SkPaint paint; 10087fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com paint.setAntiAlias(true); 101ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com 10287fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com SkRect r0 = { 0, 0, 10.5f, 20 }; 10387fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com SkRect r1 = { 10.5f, 10, 20, 30 }; 10487fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com paint.setColor(SK_ColorRED); 10587fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com canvas->drawRect(r0, paint); 10687fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com paint.setColor(SK_ColorBLUE); 10787fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com canvas->drawRect(r1, paint); 10887fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com return; 10987fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com } 11087fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com 111d1e67e70ae566bd841a2926eb07446ad99c64e59Brian Osman const SkBlendMode gModes[] = { 112d1e67e70ae566bd841a2926eb07446ad99c64e59Brian Osman SkBlendMode::kClear, 113d1e67e70ae566bd841a2926eb07446ad99c64e59Brian Osman SkBlendMode::kSrc, 114d1e67e70ae566bd841a2926eb07446ad99c64e59Brian Osman SkBlendMode::kDst, 115d1e67e70ae566bd841a2926eb07446ad99c64e59Brian Osman SkBlendMode::kSrcOver, 116d1e67e70ae566bd841a2926eb07446ad99c64e59Brian Osman SkBlendMode::kDstOver, 117d1e67e70ae566bd841a2926eb07446ad99c64e59Brian Osman SkBlendMode::kSrcIn, 118d1e67e70ae566bd841a2926eb07446ad99c64e59Brian Osman SkBlendMode::kDstIn, 119d1e67e70ae566bd841a2926eb07446ad99c64e59Brian Osman SkBlendMode::kSrcOut, 120d1e67e70ae566bd841a2926eb07446ad99c64e59Brian Osman SkBlendMode::kDstOut, 121d1e67e70ae566bd841a2926eb07446ad99c64e59Brian Osman SkBlendMode::kSrcATop, 122d1e67e70ae566bd841a2926eb07446ad99c64e59Brian Osman SkBlendMode::kDstATop, 123d1e67e70ae566bd841a2926eb07446ad99c64e59Brian Osman SkBlendMode::kXor, 124d1e67e70ae566bd841a2926eb07446ad99c64e59Brian Osman SkBlendMode::kPlus, 125271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com }; 126271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com 127271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com const SkScalar w = SkIntToScalar(W); 128271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com const SkScalar h = SkIntToScalar(H); 129271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com SkMatrix m; 130271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com m.setScale(SkIntToScalar(6), SkIntToScalar(6)); 1318a21c9fe7f5fef9e87115defef27bd7218419f28reed auto s = SkShader::MakeBitmapShader(fBG, SkShader::kRepeat_TileMode, 1328a21c9fe7f5fef9e87115defef27bd7218419f28reed SkShader::kRepeat_TileMode, &m); 133271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com 134271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com SkPaint labelP; 135271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com labelP.setAntiAlias(true); 136271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com labelP.setLCDRenderText(true); 137271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com labelP.setTextAlign(SkPaint::kCenter_Align); 138271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com setNamedTypeface(&labelP, "Menlo Regular"); 139271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com 140271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com const int W = 5; 141271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com 142271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com SkScalar x0 = 0; 143271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com for (int twice = 0; twice < 2; twice++) { 144271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com SkScalar x = x0, y = 0; 145271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com for (size_t i = 0; i < SK_ARRAY_COUNT(gModes); i++) { 146271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com SkRect r; 147271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com r.set(x, y, x+w, y+h); 148271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com 149271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com SkPaint p; 150271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com p.setStyle(SkPaint::kFill_Style); 151271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com p.setShader(s); 152271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com canvas->drawRect(r, p); 153271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com 15496fcdcc219d2a0d3579719b84b28bede76efba64halcanary canvas->saveLayer(&r, nullptr); 155d1e67e70ae566bd841a2926eb07446ad99c64e59Brian Osman draw_mode(canvas, gModes[i], twice ? 0x88 : 0xFF, r.fLeft, r.fTop); 156271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com canvas->restore(); 157271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com 158271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com r.inset(-SK_ScalarHalf, -SK_ScalarHalf); 159271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com p.setStyle(SkPaint::kStroke_Style); 16096fcdcc219d2a0d3579719b84b28bede76efba64halcanary p.setShader(nullptr); 161271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com canvas->drawRect(r, p); 162271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com 163d1e67e70ae566bd841a2926eb07446ad99c64e59Brian Osman const char* label = SkBlendMode_Name(gModes[i]); 1642a475eae622adc1e8fa29206be1eaf862c23548eCary Clark canvas->drawString(label, 165271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com x + w/2, y - labelP.getTextSize()/2, labelP); 166271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com x += w + SkIntToScalar(10); 167271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com if ((i % W) == W - 1) { 168271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com x = x0; 169271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com y += h + SkIntToScalar(30); 170271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com } 171271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com } 172271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com x0 += SkIntToScalar(400); 173271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com } 174271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com } 175271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com 176271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.comprivate: 177271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com typedef SampleView INHERITED; 178271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com}; 179271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com 180271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com////////////////////////////////////////////////////////////////////////////// 181271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com 182271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.comstatic SkView* MyFactory() { return new XfermodesBlurView; } 183271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.comstatic SkViewRegister reg(MyFactory); 184