11cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
21cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger/*
31cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Copyright 2011 Google Inc.
41cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger *
51cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be
61cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * found in the LICENSE file.
71cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger */
80b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SampleCode.h"
90b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkBlurMaskFilter.h"
100b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkColorPriv.h"
110b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkGradientShader.h"
120b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkView.h"
130b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkCanvas.h"
140b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkUtils.h"
150b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
160b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerstatic SkBitmap make_bitmap() {
170b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    SkBitmap bm;
180b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    SkColorTable* ctable = new SkColorTable(256);
190b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
200b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    SkPMColor* c = ctable->lockColors();
210b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    for (int i = 0; i < 256; i++) {
220b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        c[i] = SkPackARGB32(255 - i, 0, 0, 0);
230b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    }
240b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    ctable->unlockColors(true);
250b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    bm.setConfig(SkBitmap::kIndex8_Config, 256, 256);
260b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    bm.allocPixels(ctable);
270b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    ctable->unref();
280b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
290b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    bm.lockPixels();
300b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    const float cx = bm.width() * 0.5f;
310b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    const float cy = bm.height() * 0.5f;
320b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    for (int y = 0; y < bm.height(); y++) {
330b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        float dy = y - cy;
340b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        dy *= dy;
350b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        uint8_t* p = bm.getAddr8(0, y);
360b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        for (int x = 0; x < 256; x++) {
370b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            float dx = x - cx;
380b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            dx *= dx;
390b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            float d = (dx + dy) / (cx/2);
400b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            int id = (int)d;
410b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            if (id > 255) {
420b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger                id = 255;
430b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            }
440b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            p[x] = id;
450b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        }
460b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    }
470b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    bm.unlockPixels();
480b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    return bm;
490b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger}
500b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
511cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerclass BlurView : public SampleView {
520b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    SkBitmap    fBM;
530b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerpublic:
540b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger	BlurView() {
550b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    }
560b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
570b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerprotected:
580b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    // overrides from SkEventSink
590b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    virtual bool onQuery(SkEvent* evt) {
600b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        if (SampleCode::TitleQ(*evt)) {
610b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            SampleCode::TitleR(evt, "Blur");
620b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            return true;
630b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        }
640b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        return this->INHERITED::onQuery(evt);
650b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    }
660b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
670b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    void drawBG(SkCanvas* canvas) {
680b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        canvas->drawColor(0xFFDDDDDD);
690b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    }
700b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
711cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual void onDrawContent(SkCanvas* canvas) {
720b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        drawBG(canvas);
730b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
740b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        SkBlurMaskFilter::BlurStyle NONE = SkBlurMaskFilter::BlurStyle(-999);
750b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        static const struct {
760b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            SkBlurMaskFilter::BlurStyle fStyle;
770b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            int                         fCx, fCy;
780b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        } gRecs[] = {
790b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            { NONE,                                 0,  0 },
800b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            { SkBlurMaskFilter::kInner_BlurStyle,  -1,  0 },
810b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            { SkBlurMaskFilter::kNormal_BlurStyle,  0,  1 },
820b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            { SkBlurMaskFilter::kSolid_BlurStyle,   0, -1 },
830b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            { SkBlurMaskFilter::kOuter_BlurStyle,   1,  0 },
840b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        };
850b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
860b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        SkPaint paint;
870b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        paint.setAntiAlias(true);
880b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        paint.setTextSize(25);
890b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        canvas->translate(-40, 0);
900b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
910b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        SkBlurMaskFilter::BlurFlags flags = SkBlurMaskFilter::kNone_BlurFlag;
920b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        for (int j = 0; j < 2; j++) {
930b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            canvas->save();
940b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            paint.setColor(SK_ColorBLUE);
950b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            for (size_t i = 0; i < SK_ARRAY_COUNT(gRecs); i++) {
960b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger                if (gRecs[i].fStyle != NONE) {
970b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger                    SkMaskFilter* mf = SkBlurMaskFilter::Create(20,
980b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger                                                                gRecs[i].fStyle,
990b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger                                                                flags);
1000b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger                    paint.setMaskFilter(mf)->unref();
1010b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger                } else {
1020b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger                    paint.setMaskFilter(NULL);
1030b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger                }
1040b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger                canvas->drawCircle(200 + gRecs[i].fCx*100.f,
1050b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger                                   200 + gRecs[i].fCy*100.f, 50, paint);
1060b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            }
1070b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            // draw text
1080b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            {
1090b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger                SkMaskFilter* mf = SkBlurMaskFilter::Create(4,
1100b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger                                                            SkBlurMaskFilter::kNormal_BlurStyle,
1110b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger                                                            flags);
1120b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger                paint.setMaskFilter(mf)->unref();
1130b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger                SkScalar x = SkIntToScalar(70);
1140b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger                SkScalar y = SkIntToScalar(400);
1150b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger                paint.setColor(SK_ColorBLACK);
1160b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger                canvas->drawText("Hamburgefons Style", 18, x, y, paint);
1170b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger                canvas->drawText("Hamburgefons Style", 18, x, y + SkIntToScalar(50), paint);
1180b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger                paint.setMaskFilter(NULL);
1190b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger                paint.setColor(SK_ColorWHITE);
1200b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger                x -= SkIntToScalar(2);
1210b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger                y -= SkIntToScalar(2);
1220b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger                canvas->drawText("Hamburgefons Style", 18, x, y, paint);
1230b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            }
1240b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            canvas->restore();
1250b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            flags = SkBlurMaskFilter::kHighQuality_BlurFlag;
1260b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            canvas->translate(350, 0);
1270b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        }
1280b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    }
1290b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
1300b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerprivate:
1310b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    typedef SkView INHERITED;
1320b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger};
1330b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
1340b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger//////////////////////////////////////////////////////////////////////////////
1350b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
1360b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerstatic SkView* MyFactory() { return new BlurView; }
1370b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerstatic SkViewRegister reg(MyFactory);
1380b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
139