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 */ 747ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com#include "SampleCode.h" 8b7061176c7f414616fe2e79e832b3e0abe326af6robertphillips@google.com#include "SkBlurMask.h" 947ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com#include "SkBlurMaskFilter.h" 10b7061176c7f414616fe2e79e832b3e0abe326af6robertphillips@google.com#include "SkCanvas.h" 1147ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com#include "SkColorPriv.h" 1247ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com#include "SkGradientShader.h" 1347ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com#include "SkUtils.h" 14b7061176c7f414616fe2e79e832b3e0abe326af6robertphillips@google.com#include "SkView.h" 1547ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com 1647ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.comstatic SkBitmap make_bitmap() { 170a6151d66cc32d91eca037c91e557158cf8a2be2reed@google.com SkPMColor c[256]; 1847ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com for (int i = 0; i < 256; i++) { 1947ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com c[i] = SkPackARGB32(255 - i, 0, 0, 0); 2047ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com } 210a6151d66cc32d91eca037c91e557158cf8a2be2reed@google.com 220a6151d66cc32d91eca037c91e557158cf8a2be2reed@google.com SkBitmap bm; 230a6151d66cc32d91eca037c91e557158cf8a2be2reed@google.com SkColorTable* ctable = new SkColorTable(c, 256); 240a6151d66cc32d91eca037c91e557158cf8a2be2reed@google.com 25a8c183125f2861067daf432cada06d431a795cd0commit-bot@chromium.org bm.allocPixels(SkImageInfo::Make(256, 256, kIndex_8_SkColorType, 26a8c183125f2861067daf432cada06d431a795cd0commit-bot@chromium.org kPremul_SkAlphaType), 2796fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr, ctable); 2847ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com ctable->unref(); 2947ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com 3047ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com bm.lockPixels(); 3147ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com const float cx = bm.width() * 0.5f; 3247ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com const float cy = bm.height() * 0.5f; 3347ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com for (int y = 0; y < bm.height(); y++) { 3447ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com float dy = y - cy; 3547ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com dy *= dy; 3647ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com uint8_t* p = bm.getAddr8(0, y); 3747ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com for (int x = 0; x < 256; x++) { 3847ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com float dx = x - cx; 3947ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com dx *= dx; 4047ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com float d = (dx + dy) / (cx/2); 4147ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com int id = (int)d; 4247ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com if (id > 255) { 4347ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com id = 255; 4447ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com } 4547ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com p[x] = id; 4647ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com } 4747ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com } 4847ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com bm.unlockPixels(); 4947ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com return bm; 5047ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com} 5147ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com 52e36ddf01311802dd5c5fe85d47a9bd84b2b84565senorblanco@chromium.orgclass BlurView : public SampleView { 5347ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com SkBitmap fBM; 5447ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.compublic: 55ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com BlurView() { 5602939ce4bddd3223d9e8cc98d4abd02939b7f70acaryclark@google.com if (false) { // avoid bit rot, suppress warning 5702939ce4bddd3223d9e8cc98d4abd02939b7f70acaryclark@google.com fBM = make_bitmap(); 5802939ce4bddd3223d9e8cc98d4abd02939b7f70acaryclark@google.com } 5947ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com } 600ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com 6147ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.comprotected: 6247ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com // overrides from SkEventSink 6347ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com virtual bool onQuery(SkEvent* evt) { 6447ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com if (SampleCode::TitleQ(*evt)) { 6547ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com SampleCode::TitleR(evt, "Blur"); 6647ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com return true; 6747ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com } 6847ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com return this->INHERITED::onQuery(evt); 6947ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com } 700ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com 7147ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com void drawBG(SkCanvas* canvas) { 7247ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com canvas->drawColor(0xFFDDDDDD); 7347ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com } 740ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com 75e36ddf01311802dd5c5fe85d47a9bd84b2b84565senorblanco@chromium.org virtual void onDrawContent(SkCanvas* canvas) { 7647ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com drawBG(canvas); 770ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com 78e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.org SkBlurStyle NONE = SkBlurStyle(-999); 79da449a38a2ac06f47f504cef7897afe322981daereed@android.com static const struct { 80e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.org SkBlurStyle fStyle; 81e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.org int fCx, fCy; 82da449a38a2ac06f47f504cef7897afe322981daereed@android.com } gRecs[] = { 83da449a38a2ac06f47f504cef7897afe322981daereed@android.com { NONE, 0, 0 }, 84e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.org { kInner_SkBlurStyle, -1, 0 }, 85e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.org { kNormal_SkBlurStyle, 0, 1 }, 86e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.org { kSolid_SkBlurStyle, 0, -1 }, 87e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.org { kOuter_SkBlurStyle, 1, 0 }, 88da449a38a2ac06f47f504cef7897afe322981daereed@android.com }; 8947ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com 9047ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com SkPaint paint; 9147ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com paint.setAntiAlias(true); 920ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com paint.setTextSize(25); 930ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com canvas->translate(-40, 0); 94da449a38a2ac06f47f504cef7897afe322981daereed@android.com 950ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com SkBlurMaskFilter::BlurFlags flags = SkBlurMaskFilter::kNone_BlurFlag; 960ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com for (int j = 0; j < 2; j++) { 970ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com canvas->save(); 980ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com paint.setColor(SK_ColorBLUE); 990ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com for (size_t i = 0; i < SK_ARRAY_COUNT(gRecs); i++) { 1000ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com if (gRecs[i].fStyle != NONE) { 101efdfd51b68a300d5c6e28743fe0344ca05d1cec9reed paint.setMaskFilter(SkBlurMaskFilter::Make(gRecs[i].fStyle, 102b7061176c7f414616fe2e79e832b3e0abe326af6robertphillips@google.com SkBlurMask::ConvertRadiusToSigma(SkIntToScalar(20)), 103efdfd51b68a300d5c6e28743fe0344ca05d1cec9reed flags)); 1040ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com } else { 10596fcdcc219d2a0d3579719b84b28bede76efba64halcanary paint.setMaskFilter(nullptr); 1060ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com } 107261b8e2ca1cf22303ad95267f0bdc6e87e1bbe70reed@google.com canvas->drawCircle(200 + gRecs[i].fCx*100.f, 108261b8e2ca1cf22303ad95267f0bdc6e87e1bbe70reed@google.com 200 + gRecs[i].fCy*100.f, 50, paint); 1090ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com } 1100ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com // draw text 1110ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com { 112efdfd51b68a300d5c6e28743fe0344ca05d1cec9reed paint.setMaskFilter(SkBlurMaskFilter::Make(kNormal_SkBlurStyle, 113efdfd51b68a300d5c6e28743fe0344ca05d1cec9reed SkBlurMask::ConvertRadiusToSigma(4), 114efdfd51b68a300d5c6e28743fe0344ca05d1cec9reed flags)); 1150ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com SkScalar x = SkIntToScalar(70); 1160ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com SkScalar y = SkIntToScalar(400); 1170ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com paint.setColor(SK_ColorBLACK); 1180ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com canvas->drawText("Hamburgefons Style", 18, x, y, paint); 1190ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com canvas->drawText("Hamburgefons Style", 18, x, y + SkIntToScalar(50), paint); 12096fcdcc219d2a0d3579719b84b28bede76efba64halcanary paint.setMaskFilter(nullptr); 1210ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com paint.setColor(SK_ColorWHITE); 1220ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com x -= SkIntToScalar(2); 1230ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com y -= SkIntToScalar(2); 1240ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com canvas->drawText("Hamburgefons Style", 18, x, y, paint); 125da449a38a2ac06f47f504cef7897afe322981daereed@android.com } 1260ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com canvas->restore(); 12711a5ff376be94d15daf5bc66cdf857f5f2f297afreed@google.com flags = SkBlurMaskFilter::kHighQuality_BlurFlag; 1280ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com canvas->translate(350, 0); 129da449a38a2ac06f47f504cef7897afe322981daereed@android.com } 13047ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com } 1310ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com 13247ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.comprivate: 13347ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com typedef SkView INHERITED; 13447ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com}; 13547ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com 13647ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com////////////////////////////////////////////////////////////////////////////// 13747ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com 13847ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.comstatic SkView* MyFactory() { return new BlurView; } 13947ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.comstatic SkViewRegister reg(MyFactory); 140