1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com 2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/* 3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2011 Google Inc. 4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * 5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be 6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file. 7ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com */ 847ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com#include "SampleCode.h" 9b7061176c7f414616fe2e79e832b3e0abe326af6robertphillips@google.com#include "SkBlurMask.h" 1047ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com#include "SkBlurMaskFilter.h" 11b7061176c7f414616fe2e79e832b3e0abe326af6robertphillips@google.com#include "SkCanvas.h" 1247ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com#include "SkColorPriv.h" 1347ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com#include "SkGradientShader.h" 1447ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com#include "SkUtils.h" 15b7061176c7f414616fe2e79e832b3e0abe326af6robertphillips@google.com#include "SkView.h" 1647ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com 1747ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.comstatic SkBitmap make_bitmap() { 180a6151d66cc32d91eca037c91e557158cf8a2be2reed@google.com SkPMColor c[256]; 1947ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com for (int i = 0; i < 256; i++) { 2047ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com c[i] = SkPackARGB32(255 - i, 0, 0, 0); 2147ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com } 220a6151d66cc32d91eca037c91e557158cf8a2be2reed@google.com 230a6151d66cc32d91eca037c91e557158cf8a2be2reed@google.com SkBitmap bm; 240a6151d66cc32d91eca037c91e557158cf8a2be2reed@google.com SkColorTable* ctable = new SkColorTable(c, 256); 250a6151d66cc32d91eca037c91e557158cf8a2be2reed@google.com 26a8c183125f2861067daf432cada06d431a795cd0commit-bot@chromium.org bm.allocPixels(SkImageInfo::Make(256, 256, kIndex_8_SkColorType, 27a8c183125f2861067daf432cada06d431a795cd0commit-bot@chromium.org kPremul_SkAlphaType), 28a8c183125f2861067daf432cada06d431a795cd0commit-bot@chromium.org NULL, ctable); 2947ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com ctable->unref(); 3047ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com 3147ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com bm.lockPixels(); 3247ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com const float cx = bm.width() * 0.5f; 3347ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com const float cy = bm.height() * 0.5f; 3447ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com for (int y = 0; y < bm.height(); y++) { 3547ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com float dy = y - cy; 3647ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com dy *= dy; 3747ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com uint8_t* p = bm.getAddr8(0, y); 3847ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com for (int x = 0; x < 256; x++) { 3947ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com float dx = x - cx; 4047ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com dx *= dx; 4147ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com float d = (dx + dy) / (cx/2); 4247ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com int id = (int)d; 4347ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com if (id > 255) { 4447ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com id = 255; 4547ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com } 4647ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com p[x] = id; 4747ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com } 4847ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com } 4947ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com bm.unlockPixels(); 5047ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com return bm; 5147ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com} 5247ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com 53e36ddf01311802dd5c5fe85d47a9bd84b2b84565senorblanco@chromium.orgclass BlurView : public SampleView { 5447ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com SkBitmap fBM; 5547ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.compublic: 56ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com BlurView() { 5702939ce4bddd3223d9e8cc98d4abd02939b7f70acaryclark@google.com if (false) { // avoid bit rot, suppress warning 5802939ce4bddd3223d9e8cc98d4abd02939b7f70acaryclark@google.com fBM = make_bitmap(); 5902939ce4bddd3223d9e8cc98d4abd02939b7f70acaryclark@google.com } 6047ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com } 610ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com 6247ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.comprotected: 6347ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com // overrides from SkEventSink 6447ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com virtual bool onQuery(SkEvent* evt) { 6547ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com if (SampleCode::TitleQ(*evt)) { 6647ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com SampleCode::TitleR(evt, "Blur"); 6747ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com return true; 6847ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com } 6947ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com return this->INHERITED::onQuery(evt); 7047ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com } 710ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com 7247ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com void drawBG(SkCanvas* canvas) { 7347ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com canvas->drawColor(0xFFDDDDDD); 7447ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com } 750ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com 76e36ddf01311802dd5c5fe85d47a9bd84b2b84565senorblanco@chromium.org virtual void onDrawContent(SkCanvas* canvas) { 7747ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com drawBG(canvas); 780ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com 79e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.org SkBlurStyle NONE = SkBlurStyle(-999); 80da449a38a2ac06f47f504cef7897afe322981daereed@android.com static const struct { 81e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.org SkBlurStyle fStyle; 82e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.org int fCx, fCy; 83da449a38a2ac06f47f504cef7897afe322981daereed@android.com } gRecs[] = { 84da449a38a2ac06f47f504cef7897afe322981daereed@android.com { NONE, 0, 0 }, 85e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.org { kInner_SkBlurStyle, -1, 0 }, 86e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.org { kNormal_SkBlurStyle, 0, 1 }, 87e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.org { kSolid_SkBlurStyle, 0, -1 }, 88e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.org { kOuter_SkBlurStyle, 1, 0 }, 89da449a38a2ac06f47f504cef7897afe322981daereed@android.com }; 9047ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com 9147ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com SkPaint paint; 9247ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com paint.setAntiAlias(true); 930ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com paint.setTextSize(25); 940ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com canvas->translate(-40, 0); 95da449a38a2ac06f47f504cef7897afe322981daereed@android.com 960ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com SkBlurMaskFilter::BlurFlags flags = SkBlurMaskFilter::kNone_BlurFlag; 970ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com for (int j = 0; j < 2; j++) { 980ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com canvas->save(); 990ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com paint.setColor(SK_ColorBLUE); 1000ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com for (size_t i = 0; i < SK_ARRAY_COUNT(gRecs); i++) { 1010ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com if (gRecs[i].fStyle != NONE) { 102b7061176c7f414616fe2e79e832b3e0abe326af6robertphillips@google.com SkMaskFilter* mf = SkBlurMaskFilter::Create(gRecs[i].fStyle, 103b7061176c7f414616fe2e79e832b3e0abe326af6robertphillips@google.com SkBlurMask::ConvertRadiusToSigma(SkIntToScalar(20)), 104b7061176c7f414616fe2e79e832b3e0abe326af6robertphillips@google.com flags); 1050ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com paint.setMaskFilter(mf)->unref(); 1060ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com } else { 1070ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com paint.setMaskFilter(NULL); 1080ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com } 109261b8e2ca1cf22303ad95267f0bdc6e87e1bbe70reed@google.com canvas->drawCircle(200 + gRecs[i].fCx*100.f, 110261b8e2ca1cf22303ad95267f0bdc6e87e1bbe70reed@google.com 200 + gRecs[i].fCy*100.f, 50, paint); 1110ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com } 1120ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com // draw text 1130ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com { 114e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.org SkMaskFilter* mf = SkBlurMaskFilter::Create(kNormal_SkBlurStyle, 115b7061176c7f414616fe2e79e832b3e0abe326af6robertphillips@google.com SkBlurMask::ConvertRadiusToSigma(SkIntToScalar(4)), 116b7061176c7f414616fe2e79e832b3e0abe326af6robertphillips@google.com flags); 117da449a38a2ac06f47f504cef7897afe322981daereed@android.com paint.setMaskFilter(mf)->unref(); 1180ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com SkScalar x = SkIntToScalar(70); 1190ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com SkScalar y = SkIntToScalar(400); 1200ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com paint.setColor(SK_ColorBLACK); 1210ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com canvas->drawText("Hamburgefons Style", 18, x, y, paint); 1220ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com canvas->drawText("Hamburgefons Style", 18, x, y + SkIntToScalar(50), paint); 123da449a38a2ac06f47f504cef7897afe322981daereed@android.com paint.setMaskFilter(NULL); 1240ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com paint.setColor(SK_ColorWHITE); 1250ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com x -= SkIntToScalar(2); 1260ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com y -= SkIntToScalar(2); 1270ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com canvas->drawText("Hamburgefons Style", 18, x, y, paint); 128da449a38a2ac06f47f504cef7897afe322981daereed@android.com } 1290ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com canvas->restore(); 13011a5ff376be94d15daf5bc66cdf857f5f2f297afreed@google.com flags = SkBlurMaskFilter::kHighQuality_BlurFlag; 1310ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com canvas->translate(350, 0); 132da449a38a2ac06f47f504cef7897afe322981daereed@android.com } 13347ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com } 1340ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com 13547ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.comprivate: 13647ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com typedef SkView INHERITED; 13747ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com}; 13847ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com 13947ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com////////////////////////////////////////////////////////////////////////////// 14047ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com 14147ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.comstatic SkView* MyFactory() { return new BlurView; } 14247ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.comstatic SkViewRegister reg(MyFactory); 143