SampleTiling.cpp revision f21833999d90ad9c8c584cff3238797b39cfc00b
18a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SampleCode.h"
28a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkView.h"
38a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkCanvas.h"
48a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkPaint.h"
58a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkPath.h"
68a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkRegion.h"
78a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkShader.h"
88a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkUtils.h"
98a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkColorPriv.h"
108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkColorFilter.h"
11f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com#include "SkPicture.h"
128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkTypeface.h"
138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com// effects
158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkGradientShader.h"
168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkUnitMappers.h"
178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkBlurDrawLooper.h"
188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic void makebm(SkBitmap* bm, SkBitmap::Config config, int w, int h) {
208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    bm->setConfig(config, w, h);
218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    bm->allocPixels();
228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    bm->eraseColor(0);
238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkCanvas    canvas(*bm);
258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkPoint     pts[] = { 0, 0, SkIntToScalar(w), SkIntToScalar(h) };
268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkColor     colors[] = { SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE };
278a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkScalar    pos[] = { 0, SK_Scalar1/2, SK_Scalar1 };
288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkPaint     paint;
298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkUnitMapper*   um = NULL;
318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    um = new SkCosineMapper;
338a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com//    um = new SkDiscreteMapper(12);
348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkAutoUnref au(um);
368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
378a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    paint.setDither(true);
388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    paint.setShader(SkGradientShader::CreateLinear(pts, colors, pos,
398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                SK_ARRAY_COUNT(colors), SkShader::kClamp_TileMode, um))->unref();
408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    canvas.drawPaint(paint);
418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
428a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic void setup(SkPaint* paint, const SkBitmap& bm, bool filter,
448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                  SkShader::TileMode tmx, SkShader::TileMode tmy) {
458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkShader* shader = SkShader::CreateBitmapShader(bm, tmx, tmy);
468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    paint->setShader(shader)->unref();
478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    paint->setFilterBitmap(filter);
488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic const SkBitmap::Config gConfigs[] = {
518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkBitmap::kARGB_8888_Config,
528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkBitmap::kRGB_565_Config,
538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkBitmap::kARGB_4444_Config
548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com};
558a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic const int gWidth = 32;
568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic const int gHeight = 32;
578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
58f21833999d90ad9c8c584cff3238797b39cfc00breed@google.comclass TilingView : public SampleView {
59f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    SkPicture           fTextPicture;
608a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkBlurDrawLooper    fLooper;
618a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.compublic:
628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com	TilingView()
638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            : fLooper(SkIntToScalar(1), SkIntToScalar(2), SkIntToScalar(2),
648a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                      0x88000000) {
658a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        for (int i = 0; i < SK_ARRAY_COUNT(gConfigs); i++) {
668a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            makebm(&fTexture[i], gConfigs[i], gWidth, gHeight);
678a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        }
688a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
698a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
708a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkBitmap    fTexture[SK_ARRAY_COUNT(gConfigs)];
718a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
728a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprotected:
738a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    // overrides from SkEventSink
748a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    virtual bool onQuery(SkEvent* evt) {
758a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        if (SampleCode::TitleQ(*evt)) {
768a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            SampleCode::TitleR(evt, "Tiling");
778a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            return true;
788a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        }
798a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        return this->INHERITED::onQuery(evt);
808a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
818a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
82f21833999d90ad9c8c584cff3238797b39cfc00breed@google.com    virtual void onDrawContent(SkCanvas* canvas) {
838a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkRect r = { 0, 0, SkIntToScalar(gWidth*2), SkIntToScalar(gHeight*2) };
848a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
858a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        static const char* gConfigNames[] = { "8888", "565", "4444" };
868a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
878a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        static const bool           gFilters[] = { false, true };
888a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        static const char*          gFilterNames[] = {     "point",                     "bilinear" };
898a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
908a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        static const SkShader::TileMode gModes[] = { SkShader::kClamp_TileMode, SkShader::kRepeat_TileMode, SkShader::kMirror_TileMode };
918a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        static const char*          gModeNames[] = {    "C",                    "R",                   "M" };
928a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
938a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkScalar y = SkIntToScalar(24);
948a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkScalar x = SkIntToScalar(10);
958a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
96f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        SkCanvas* textCanvas = NULL;
97f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        if (fTextPicture.width() == 0) {
98f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com            textCanvas = fTextPicture.beginRecording(1000, 1000);
99f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        }
100f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com
101f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        if (textCanvas) {
102f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com            for (int kx = 0; kx < SK_ARRAY_COUNT(gModes); kx++) {
103f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com                for (int ky = 0; ky < SK_ARRAY_COUNT(gModes); ky++) {
104f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com                    SkPaint p;
105f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com                    SkString str;
106f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com                    p.setAntiAlias(true);
107f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com                    p.setDither(true);
108f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com                    p.setLooper(&fLooper);
109f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com                    str.printf("[%s,%s]", gModeNames[kx], gModeNames[ky]);
110f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com
111f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com                    p.setTextAlign(SkPaint::kCenter_Align);
112f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com                    textCanvas->drawText(str.c_str(), str.size(), x + r.width()/2, y, p);
113f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com
114f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com                    x += r.width() * 4 / 3;
115f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com                }
1168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            }
1178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        }
1188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        y += SkIntToScalar(16);
1208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        for (int i = 0; i < SK_ARRAY_COUNT(gConfigs); i++) {
1228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            for (int j = 0; j < SK_ARRAY_COUNT(gFilters); j++) {
1238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                x = SkIntToScalar(10);
1248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                for (int kx = 0; kx < SK_ARRAY_COUNT(gModes); kx++) {
1258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                    for (int ky = 0; ky < SK_ARRAY_COUNT(gModes); ky++) {
1268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                        SkPaint paint;
1278a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                        setup(&paint, fTexture[i], gFilters[j], gModes[kx], gModes[ky]);
1288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                        paint.setDither(true);
1298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                        canvas->save();
1318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                        canvas->translate(x, y);
1328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                        canvas->drawRect(r, paint);
1338a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                        canvas->restore();
1348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                        x += r.width() * 4 / 3;
1368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                    }
1378a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                }
138f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com                if (textCanvas) {
1398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                    SkPaint p;
1408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                    SkString str;
1418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                    p.setAntiAlias(true);
1428a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                    p.setLooper(&fLooper);
1438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                    str.printf("%s, %s", gConfigNames[i], gFilterNames[j]);
144f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com                    textCanvas->drawText(str.c_str(), str.size(), x, y + r.height() * 2 / 3, p);
1458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                }
1468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                y += r.height() * 4 / 3;
1488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            }
1498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        }
150f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com
151f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        canvas->drawPicture(fTextPicture);
1528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
1538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    virtual SkView::Click* onFindClickHandler(SkScalar x, SkScalar y) {
1558a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        this->inval(NULL);
1568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        return this->INHERITED::onFindClickHandler(x, y);
1578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
1588a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    virtual bool onClick(Click* click) {
1608a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        return this->INHERITED::onClick(click);
1618a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
1628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprivate:
164f21833999d90ad9c8c584cff3238797b39cfc00breed@google.com    typedef SampleView INHERITED;
1658a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com};
1668a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1678a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com//////////////////////////////////////////////////////////////////////////////
1688a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1698a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic SkView* MyFactory() { return new TilingView; }
1708a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic SkViewRegister reg(MyFactory);
1718a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
172