SampleBlur.cpp revision ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976e
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" 947ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com#include "SkBlurMaskFilter.h" 1047ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com#include "SkColorPriv.h" 1147ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com#include "SkGradientShader.h" 1247ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com#include "SkView.h" 1347ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com#include "SkCanvas.h" 1447ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com#include "SkUtils.h" 1547ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com 1647ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.comstatic SkBitmap make_bitmap() { 1747ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com SkBitmap bm; 1847ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com SkColorTable* ctable = new SkColorTable(256); 1947ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com 2047ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com SkPMColor* c = ctable->lockColors(); 2147ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com for (int i = 0; i < 256; i++) { 2247ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com c[i] = SkPackARGB32(255 - i, 0, 0, 0); 2347ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com } 2447ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com ctable->unlockColors(true); 2547ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com bm.setConfig(SkBitmap::kIndex8_Config, 256, 256); 2647ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com bm.allocPixels(ctable); 2747ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com ctable->unref(); 2847ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com 2947ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com bm.lockPixels(); 3047ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com const float cx = bm.width() * 0.5f; 3147ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com const float cy = bm.height() * 0.5f; 3247ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com for (int y = 0; y < bm.height(); y++) { 3347ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com float dy = y - cy; 3447ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com dy *= dy; 3547ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com uint8_t* p = bm.getAddr8(0, y); 3647ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com for (int x = 0; x < 256; x++) { 3747ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com float dx = x - cx; 3847ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com dx *= dx; 3947ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com float d = (dx + dy) / (cx/2); 4047ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com int id = (int)d; 4147ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com if (id > 255) { 4247ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com id = 255; 4347ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com } 4447ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com p[x] = id; 4547ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com } 4647ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com } 4747ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com bm.unlockPixels(); 4847ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com return bm; 4947ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com} 5047ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com 51e36ddf01311802dd5c5fe85d47a9bd84b2b84565senorblanco@chromium.orgclass BlurView : public SampleView { 5247ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com SkBitmap fBM; 5347ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.compublic: 5447ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com BlurView() { 5547ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com } 560ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com 5747ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.comprotected: 5847ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com // overrides from SkEventSink 5947ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com virtual bool onQuery(SkEvent* evt) { 6047ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com if (SampleCode::TitleQ(*evt)) { 6147ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com SampleCode::TitleR(evt, "Blur"); 6247ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com return true; 6347ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com } 6447ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com return this->INHERITED::onQuery(evt); 6547ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com } 660ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com 6747ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com void drawBG(SkCanvas* canvas) { 6847ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com canvas->drawColor(0xFFDDDDDD); 6947ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com } 700ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com 71e36ddf01311802dd5c5fe85d47a9bd84b2b84565senorblanco@chromium.org virtual void onDrawContent(SkCanvas* canvas) { 7247ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com drawBG(canvas); 730ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com 74da449a38a2ac06f47f504cef7897afe322981daereed@android.com SkBlurMaskFilter::BlurStyle NONE = SkBlurMaskFilter::BlurStyle(-999); 75da449a38a2ac06f47f504cef7897afe322981daereed@android.com static const struct { 76da449a38a2ac06f47f504cef7897afe322981daereed@android.com SkBlurMaskFilter::BlurStyle fStyle; 77da449a38a2ac06f47f504cef7897afe322981daereed@android.com int fCx, fCy; 78da449a38a2ac06f47f504cef7897afe322981daereed@android.com } gRecs[] = { 79da449a38a2ac06f47f504cef7897afe322981daereed@android.com { NONE, 0, 0 }, 80da449a38a2ac06f47f504cef7897afe322981daereed@android.com { SkBlurMaskFilter::kInner_BlurStyle, -1, 0 }, 81da449a38a2ac06f47f504cef7897afe322981daereed@android.com { SkBlurMaskFilter::kNormal_BlurStyle, 0, 1 }, 82da449a38a2ac06f47f504cef7897afe322981daereed@android.com { SkBlurMaskFilter::kSolid_BlurStyle, 0, -1 }, 83da449a38a2ac06f47f504cef7897afe322981daereed@android.com { SkBlurMaskFilter::kOuter_BlurStyle, 1, 0 }, 84da449a38a2ac06f47f504cef7897afe322981daereed@android.com }; 8547ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com 8647ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com SkPaint paint; 8747ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com paint.setAntiAlias(true); 880ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com paint.setTextSize(25); 890ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com canvas->translate(-40, 0); 90da449a38a2ac06f47f504cef7897afe322981daereed@android.com 910ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com SkBlurMaskFilter::BlurFlags flags = SkBlurMaskFilter::kNone_BlurFlag; 920ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com for (int j = 0; j < 2; j++) { 930ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com canvas->save(); 940ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com paint.setColor(SK_ColorBLUE); 950ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com for (size_t i = 0; i < SK_ARRAY_COUNT(gRecs); i++) { 960ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com if (gRecs[i].fStyle != NONE) { 970ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com SkMaskFilter* mf = SkBlurMaskFilter::Create(20, 980ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com gRecs[i].fStyle, 990ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com flags); 1000ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com paint.setMaskFilter(mf)->unref(); 1010ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com } else { 1020ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com paint.setMaskFilter(NULL); 1030ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com } 104261b8e2ca1cf22303ad95267f0bdc6e87e1bbe70reed@google.com canvas->drawCircle(200 + gRecs[i].fCx*100.f, 105261b8e2ca1cf22303ad95267f0bdc6e87e1bbe70reed@google.com 200 + gRecs[i].fCy*100.f, 50, paint); 1060ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com } 1070ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com // draw text 1080ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com { 1090ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com SkMaskFilter* mf = SkBlurMaskFilter::Create(4, 1100ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com SkBlurMaskFilter::kNormal_BlurStyle, 1110ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com flags); 112da449a38a2ac06f47f504cef7897afe322981daereed@android.com paint.setMaskFilter(mf)->unref(); 1130ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com SkScalar x = SkIntToScalar(70); 1140ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com SkScalar y = SkIntToScalar(400); 1150ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com paint.setColor(SK_ColorBLACK); 1160ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com canvas->drawText("Hamburgefons Style", 18, x, y, paint); 1170ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com canvas->drawText("Hamburgefons Style", 18, x, y + SkIntToScalar(50), paint); 118da449a38a2ac06f47f504cef7897afe322981daereed@android.com paint.setMaskFilter(NULL); 1190ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com paint.setColor(SK_ColorWHITE); 1200ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com x -= SkIntToScalar(2); 1210ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com y -= SkIntToScalar(2); 1220ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com canvas->drawText("Hamburgefons Style", 18, x, y, paint); 123da449a38a2ac06f47f504cef7897afe322981daereed@android.com } 1240ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com canvas->restore(); 12511a5ff376be94d15daf5bc66cdf857f5f2f297afreed@google.com flags = SkBlurMaskFilter::kHighQuality_BlurFlag; 1260ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com canvas->translate(350, 0); 127da449a38a2ac06f47f504cef7897afe322981daereed@android.com } 12847ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com } 1290ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com 13047ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.comprivate: 13147ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com typedef SkView INHERITED; 13247ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com}; 13347ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com 13447ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com////////////////////////////////////////////////////////////////////////////// 13547ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com 13647ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.comstatic SkView* MyFactory() { return new BlurView; } 13747ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.comstatic SkViewRegister reg(MyFactory); 13847ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com 139