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 */
88a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SampleCode.h"
98a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkView.h"
108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkCanvas.h"
118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkGradientShader.h"
128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkPath.h"
138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkRegion.h"
148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkShader.h"
158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkUtils.h"
168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "Sk1DPathEffect.h"
178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkCornerPathEffect.h"
188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkPathMeasure.h"
198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkRandom.h"
208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkColorPriv.h"
218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkColorFilter.h"
228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkDither.h"
23c3b3266b7db2f1a41d41ecac010c766b7ad8eebcreed#include "sk_tool_utils.h"
248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
25961ddb04a0a7aba843032d829ab867518e52559ereed@google.comstatic void make_bm(SkBitmap* bm) {
26a8c183125f2861067daf432cada06d431a795cd0commit-bot@chromium.org    const SkPMColor colors[] = {
27a8c183125f2861067daf432cada06d431a795cd0commit-bot@chromium.org        SkPreMultiplyColor(SK_ColorRED), SkPreMultiplyColor(SK_ColorGREEN),
28a8c183125f2861067daf432cada06d431a795cd0commit-bot@chromium.org        SkPreMultiplyColor(SK_ColorBLUE), SkPreMultiplyColor(SK_ColorWHITE)
298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    };
308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkColorTable* ctable = new SkColorTable(colors, 4);
31a8c183125f2861067daf432cada06d431a795cd0commit-bot@chromium.org    bm->allocPixels(SkImageInfo::Make(2, 2, kIndex_8_SkColorType,
32a8c183125f2861067daf432cada06d431a795cd0commit-bot@chromium.org                                      kOpaque_SkAlphaType),
33a8c183125f2861067daf432cada06d431a795cd0commit-bot@chromium.org                    NULL, ctable);
348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    ctable->unref();
35ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    *bm->getAddr8(0, 0) = 0;
378a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    *bm->getAddr8(1, 0) = 1;
388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    *bm->getAddr8(0, 1) = 2;
398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    *bm->getAddr8(1, 1) = 3;
408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
428a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic SkScalar draw_bm(SkCanvas* canvas, const SkBitmap& bm,
43961ddb04a0a7aba843032d829ab867518e52559ereed@google.com                        SkScalar x, SkScalar y, SkPaint* paint) {
448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    canvas->drawBitmap(bm, x, y, paint);
458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    return SkIntToScalar(bm.width()) * 5/4;
468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
48961ddb04a0a7aba843032d829ab867518e52559ereed@google.comstatic SkScalar draw_set(SkCanvas* c, const SkBitmap& bm, SkScalar x, SkPaint* p) {
498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    x += draw_bm(c, bm, x, 0, p);
504469938e92d779dff05e745559e67907bbf21e78reed@google.com    p->setFilterLevel(SkPaint::kLow_FilterLevel);
518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    x += draw_bm(c, bm, x, 0, p);
528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    p->setDither(true);
538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    return x + draw_bm(c, bm, x, 0, p);
548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
558a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
56961ddb04a0a7aba843032d829ab867518e52559ereed@google.comstatic SkScalar draw_row(SkCanvas* canvas, const SkBitmap& bm) {
578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkAutoCanvasRestore acr(canvas, true);
588a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkPaint paint;
608a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkScalar x = 0;
618a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    const int scale = 32;
628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    paint.setAntiAlias(true);
64c3b3266b7db2f1a41d41ecac010c766b7ad8eebcreed    const char* name = sk_tool_utils::colortype_name(bm.colorType());
658a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    canvas->drawText(name, strlen(name), x, SkIntToScalar(bm.height())*scale*5/8,
668a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                     paint);
678a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    canvas->translate(SkIntToScalar(48), 0);
688a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
698a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    canvas->scale(SkIntToScalar(scale), SkIntToScalar(scale));
70ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
718a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    x += draw_set(canvas, bm, 0, &paint);
728a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    paint.reset();
738a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    paint.setAlpha(0x80);
748a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    draw_set(canvas, bm, x, &paint);
758a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    return x * scale / 3;
768a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
778a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
78961ddb04a0a7aba843032d829ab867518e52559ereed@google.comclass FilterView : public SampleView {
798a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.compublic:
808a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkBitmap    fBM8, fBM4444, fBM16, fBM32;
818a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
82ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com    FilterView() {
838a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        make_bm(&fBM8);
848a2ad3cae710f05cca57e48dd1732d575dba2dc7commit-bot@chromium.org        fBM8.copyTo(&fBM4444, kARGB_4444_SkColorType);
858a2ad3cae710f05cca57e48dd1732d575dba2dc7commit-bot@chromium.org        fBM8.copyTo(&fBM16, kRGB_565_SkColorType);
8628fcae2ec77eb16a79e155f8d788b20457f1c951commit-bot@chromium.org        fBM8.copyTo(&fBM32, kN32_SkColorType);
87ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
88961ddb04a0a7aba843032d829ab867518e52559ereed@google.com        this->setBGColor(0xFFDDDDDD);
898a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
908a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
918a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprotected:
928a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    // overrides from SkEventSink
93961ddb04a0a7aba843032d829ab867518e52559ereed@google.com    virtual bool onQuery(SkEvent* evt) {
94961ddb04a0a7aba843032d829ab867518e52559ereed@google.com        if (SampleCode::TitleQ(*evt)) {
958a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            SampleCode::TitleR(evt, "Filter");
968a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            return true;
978a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        }
988a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        return this->INHERITED::onQuery(evt);
998a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
100ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
101961ddb04a0a7aba843032d829ab867518e52559ereed@google.com    virtual void onDrawContent(SkCanvas* canvas) {
1028a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkScalar x = SkIntToScalar(10);
1038a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkScalar y = SkIntToScalar(10);
104ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
1058a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        canvas->translate(x, y);
1068a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        y = draw_row(canvas, fBM8);
1078a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        canvas->translate(0, y);
1088a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        y = draw_row(canvas, fBM4444);
1098a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        canvas->translate(0, y);
1108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        y = draw_row(canvas, fBM16);
1118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        canvas->translate(0, y);
1128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        draw_row(canvas, fBM32);
1138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
114ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
1158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprivate:
116961ddb04a0a7aba843032d829ab867518e52559ereed@google.com    typedef SampleView INHERITED;
1178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com};
1188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com//////////////////////////////////////////////////////////////////////////////
1208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic SkView* MyFactory() { return new FilterView; }
1228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic SkViewRegister reg(MyFactory);
123