SampleTiling.cpp revision 84b18c7e3e042bf206e1ace3d1b6ea5bb929fe51
15738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
25738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*
35b790feeeb211c42bf78ca3ae9c26aa30e516765Jakub Pawlowski * Copyright 2011 Google Inc.
45738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
55738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Use of this source code is governed by a BSD-style license that can be
65738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * found in the LICENSE file.
75738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project */
85738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "SampleCode.h"
95738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "SkView.h"
105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "SkCanvas.h"
115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "SkPaint.h"
125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "SkPath.h"
135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "SkRegion.h"
145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "SkShader.h"
155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "SkUtils.h"
165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "SkColorPriv.h"
175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "SkColorFilter.h"
185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "SkPicture.h"
1949120dc867c7818511b5afec461dfc97d17eef58Marie Janssen#include "SkTypeface.h"
2049120dc867c7818511b5afec461dfc97d17eef58Marie Janssen
2149a86709488e5cfd5e23759da18bf9613e15b04dMarie Janssen// effects
2249a86709488e5cfd5e23759da18bf9613e15b04dMarie Janssen#include "SkGradientShader.h"
23f2af1c42ccb2f642b241c2261b42d0be61d45438Jack He#include "SkUnitMappers.h"
245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "SkBlurMask.h"
255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "SkBlurDrawLooper.h"
26b95c4ef4ac9e86953050a7ae6b3b4260df935713Sharvil Nanavati
27646134e0a04459f649cb50aa9f3272054630c345Ajay Panickerstatic void makebm(SkBitmap* bm, SkColorType ct, int w, int h) {
28d30195cbf09735da593e186c4c99cce6232b072eArman Uguray    bm->allocPixels(SkImageInfo::Make(w, h, ct, kPremul_SkAlphaType));
296bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson    bm->eraseColor(SK_ColorTRANSPARENT);
30b95c4ef4ac9e86953050a7ae6b3b4260df935713Sharvil Nanavati
31a5764686f719d8d779d8a5ff8cc64010b7893e36Marie Janssen    SkCanvas    canvas(*bm);
32a5764686f719d8d779d8a5ff8cc64010b7893e36Marie Janssen    SkPoint     pts[] = { { 0, 0 }, { SkIntToScalar(w), SkIntToScalar(h) } };
33db554581079863974af8e1289646f5deea6fc044Marie Janssen    SkColor     colors[] = { SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE };
34db554581079863974af8e1289646f5deea6fc044Marie Janssen    SkScalar    pos[] = { 0, SK_Scalar1/2, SK_Scalar1 };
357b266be449e4f915c419199c2312eb31f70e63bcAjay Panicker    SkPaint     paint;
3632b3a8a408b23aa28324ad9f56654c98fe2ac914Srinu Jella
379a58e68a98fbe1680535a7e7641de91e89273ad8Alain Vongsouvanh    SkUnitMapper*   um = NULL;
385cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen
39db554581079863974af8e1289646f5deea6fc044Marie Janssen    um = new SkCosineMapper;
40db554581079863974af8e1289646f5deea6fc044Marie Janssen//    um = new SkDiscreteMapper(12);
4147d68ee6229ccec3deeaaf694fa86438d97333a4Scott James Remnant
420f9b91e150e153229235c163861198e23600e636Sharvil Nanavati    SkAutoUnref au(um);
4344802768c447ab480d4227b3a852a97d923b816dSharvil Nanavati
44db554581079863974af8e1289646f5deea6fc044Marie Janssen    paint.setDither(true);
45b4a42e7b9c277cfd71a575cbdb104013855b80cdBluetooth Build Test    paint.setShader(SkGradientShader::CreateLinear(pts, colors, pos,
46bf5c3cb18f16198bc2657cd7a50874d17cd52cc8Ajay Panicker                SK_ARRAY_COUNT(colors), SkShader::kClamp_TileMode, um))->unref();
47e909ff50ffae0612fc0434cd2130469868b81ae4Jacky Cheung    canvas.drawPaint(paint);
48e909ff50ffae0612fc0434cd2130469868b81ae4Jacky Cheung}
49646134e0a04459f649cb50aa9f3272054630c345Ajay Panicker
50646134e0a04459f649cb50aa9f3272054630c345Ajay Panickerstatic void setup(SkPaint* paint, const SkBitmap& bm, bool filter,
5172a183d00c7534c80a4deb9fb41d38fd9e9455f6Ajay Panicker                  SkShader::TileMode tmx, SkShader::TileMode tmy) {
52646134e0a04459f649cb50aa9f3272054630c345Ajay Panicker    SkShader* shader = SkShader::CreateBitmapShader(bm, tmx, tmy);
53646134e0a04459f649cb50aa9f3272054630c345Ajay Panicker    paint->setShader(shader)->unref();
54646134e0a04459f649cb50aa9f3272054630c345Ajay Panicker    paint->setFilterLevel(filter ? SkPaint::kLow_FilterLevel : SkPaint::kNone_FilterLevel);
55f2d6434a6b7ad98e20c7a601d2a0950237514837Arman Uguray}
56f2d6434a6b7ad98e20c7a601d2a0950237514837Arman Uguray
576bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watsonstatic const SkColorType gColorTypes[] = {
586bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson    kN32_SkColorType,
596bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson    kRGB_565_SkColorType,
606bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson};
616bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watsonstatic const int gWidth = 32;
626bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watsonstatic const int gHeight = 32;
636bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson
646bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watsonclass TilingView : public SampleView {
65f2d6434a6b7ad98e20c7a601d2a0950237514837Arman Uguray    SkAutoTUnref<SkPicture> fTextPicture;
66b95c4ef4ac9e86953050a7ae6b3b4260df935713Sharvil Nanavati    SkBlurDrawLooper        fLooper;
677939ed0c9a50c769e9e648a2d7751e0894b485edzzypublic:
686bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson    TilingView()
696bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson            : fLooper(0x88000000,
70bf5c3cb18f16198bc2657cd7a50874d17cd52cc8Ajay Panicker                      SkBlurMask::ConvertRadiusToSigma(SkIntToScalar(1)),
71bf5c3cb18f16198bc2657cd7a50874d17cd52cc8Ajay Panicker                      SkIntToScalar(2), SkIntToScalar(2)) {
726bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson        for (size_t i = 0; i < SK_ARRAY_COUNT(gColorTypes); i++) {
736bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson            makebm(&fTexture[i], gColorTypes[i], gWidth, gHeight);
74f3fb316634973d26cc4b4f55656b86e2a15bd69cJakub Pawlowski        }
75335aa36bca8532874c23c1afe5bfc2aff7fc01a5Mike J. Chen    }
76190cf46ff6937bceff146aec026cf9f53c40e84dAjay Panicker
77190cf46ff6937bceff146aec026cf9f53c40e84dAjay Panicker    virtual ~TilingView() {
78190cf46ff6937bceff146aec026cf9f53c40e84dAjay Panicker    }
79190cf46ff6937bceff146aec026cf9f53c40e84dAjay Panicker
809a58e68a98fbe1680535a7e7641de91e89273ad8Alain Vongsouvanh    SkBitmap    fTexture[SK_ARRAY_COUNT(gColorTypes)];
81190cf46ff6937bceff146aec026cf9f53c40e84dAjay Panicker
82190cf46ff6937bceff146aec026cf9f53c40e84dAjay Panickerprotected:
83190cf46ff6937bceff146aec026cf9f53c40e84dAjay Panicker    // overrides from SkEventSink
84190cf46ff6937bceff146aec026cf9f53c40e84dAjay Panicker    virtual bool onQuery(SkEvent* evt) {
85bcfdd0ab24357c5dd842540e6c0e8f34ba7aac11Marie Janssen        if (SampleCode::TitleQ(*evt)) {
86646134e0a04459f649cb50aa9f3272054630c345Ajay Panicker            SampleCode::TitleR(evt, "Tiling");
87190cf46ff6937bceff146aec026cf9f53c40e84dAjay Panicker            return true;
886bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson        }
896bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson        return this->INHERITED::onQuery(evt);
90b95c4ef4ac9e86953050a7ae6b3b4260df935713Sharvil Nanavati    }
91a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub Pawlowski
926bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson    virtual void onDrawContent(SkCanvas* canvas) {
9386f97eda524568f2d264186844450db5e56dac36Matthew Xie        SkRect r = { 0, 0, SkIntToScalar(gWidth*2), SkIntToScalar(gHeight*2) };
94b707f447cbb916de2e0dfd2b4e9bf15818376e64Jakub Pawlowski
95b707f447cbb916de2e0dfd2b4e9bf15818376e64Jakub Pawlowski        static const char* gConfigNames[] = { "8888", "565", "4444" };
9686f97eda524568f2d264186844450db5e56dac36Matthew Xie
976bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson        static const bool           gFilters[] = { false, true };
9886f97eda524568f2d264186844450db5e56dac36Matthew Xie        static const char*          gFilterNames[] = {     "point",                     "bilinear" };
996bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson
1006bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson        static const SkShader::TileMode gModes[] = { SkShader::kClamp_TileMode, SkShader::kRepeat_TileMode, SkShader::kMirror_TileMode };
1016bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson        static const char*          gModeNames[] = {    "C",                    "R",                   "M" };
10286f97eda524568f2d264186844450db5e56dac36Matthew Xie
10386f97eda524568f2d264186844450db5e56dac36Matthew Xie        SkScalar y = SkIntToScalar(24);
104a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub Pawlowski        SkScalar x = SkIntToScalar(10);
1056bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson
10686f97eda524568f2d264186844450db5e56dac36Matthew Xie        SkPictureRecorder recorder;
107b707f447cbb916de2e0dfd2b4e9bf15818376e64Jakub Pawlowski        SkCanvas* textCanvas = NULL;
108b707f447cbb916de2e0dfd2b4e9bf15818376e64Jakub Pawlowski        if (fTextPicture->width() == 0) {
10986f97eda524568f2d264186844450db5e56dac36Matthew Xie            textCanvas = recorder.beginRecording(1000, 1000);
1106bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson        }
11186f97eda524568f2d264186844450db5e56dac36Matthew Xie
1126bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson        if (NULL != textCanvas) {
1136bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson            for (size_t kx = 0; kx < SK_ARRAY_COUNT(gModes); kx++) {
1146bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson                for (size_t ky = 0; ky < SK_ARRAY_COUNT(gModes); ky++) {
11586f97eda524568f2d264186844450db5e56dac36Matthew Xie                    SkPaint p;
11686f97eda524568f2d264186844450db5e56dac36Matthew Xie                    SkString str;
117a5764686f719d8d779d8a5ff8cc64010b7893e36Marie Janssen                    p.setAntiAlias(true);
118f3fb316634973d26cc4b4f55656b86e2a15bd69cJakub Pawlowski                    p.setDither(true);
1196bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson                    p.setLooper(&fLooper);
120b95c4ef4ac9e86953050a7ae6b3b4260df935713Sharvil Nanavati                    str.printf("[%s,%s]", gModeNames[kx], gModeNames[ky]);
1219b0fbce37260e69cb116be1cdcbceb1f43bf9346Zach Johnson
1229b0fbce37260e69cb116be1cdcbceb1f43bf9346Zach Johnson                    p.setTextAlign(SkPaint::kCenter_Align);
1236bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson                    textCanvas->drawText(str.c_str(), str.size(), x + r.width()/2, y, p);
124a5764686f719d8d779d8a5ff8cc64010b7893e36Marie Janssen
125bf5c3cb18f16198bc2657cd7a50874d17cd52cc8Ajay Panicker                    x += r.width() * 4 / 3;
1266bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson                }
127bf5c3cb18f16198bc2657cd7a50874d17cd52cc8Ajay Panicker            }
12872a183d00c7534c80a4deb9fb41d38fd9e9455f6Ajay Panicker        }
12972a183d00c7534c80a4deb9fb41d38fd9e9455f6Ajay Panicker
13072a183d00c7534c80a4deb9fb41d38fd9e9455f6Ajay Panicker        y += SkIntToScalar(16);
131190cf46ff6937bceff146aec026cf9f53c40e84dAjay Panicker
132b95c4ef4ac9e86953050a7ae6b3b4260df935713Sharvil Nanavati        for (size_t i = 0; i < SK_ARRAY_COUNT(gColorTypes); i++) {
133b4a42e7b9c277cfd71a575cbdb104013855b80cdBluetooth Build Test            for (size_t j = 0; j < SK_ARRAY_COUNT(gFilters); j++) {
1346bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson                x = SkIntToScalar(10);
13572a183d00c7534c80a4deb9fb41d38fd9e9455f6Ajay Panicker                for (size_t kx = 0; kx < SK_ARRAY_COUNT(gModes); kx++) {
136190cf46ff6937bceff146aec026cf9f53c40e84dAjay Panicker                    for (size_t ky = 0; ky < SK_ARRAY_COUNT(gModes); ky++) {
13772a183d00c7534c80a4deb9fb41d38fd9e9455f6Ajay Panicker                        SkPaint paint;
1389a58e68a98fbe1680535a7e7641de91e89273ad8Alain Vongsouvanh                        setup(&paint, fTexture[i], gFilters[j], gModes[kx], gModes[ky]);
1399a58e68a98fbe1680535a7e7641de91e89273ad8Alain Vongsouvanh                        paint.setDither(true);
1406bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson
1416bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson                        canvas->save();
1426bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson                        canvas->translate(x, y);
1439a58e68a98fbe1680535a7e7641de91e89273ad8Alain Vongsouvanh                        canvas->drawRect(r, paint);
1449a58e68a98fbe1680535a7e7641de91e89273ad8Alain Vongsouvanh                        canvas->restore();
14572a183d00c7534c80a4deb9fb41d38fd9e9455f6Ajay Panicker
1469a58e68a98fbe1680535a7e7641de91e89273ad8Alain Vongsouvanh                        x += r.width() * 4 / 3;
1479a58e68a98fbe1680535a7e7641de91e89273ad8Alain Vongsouvanh                    }
1486bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson                }
1496bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson                if (textCanvas) {
1506bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson                    SkPaint p;
1519a58e68a98fbe1680535a7e7641de91e89273ad8Alain Vongsouvanh                    SkString str;
1529a58e68a98fbe1680535a7e7641de91e89273ad8Alain Vongsouvanh                    p.setAntiAlias(true);
15372a183d00c7534c80a4deb9fb41d38fd9e9455f6Ajay Panicker                    p.setLooper(&fLooper);
1549a58e68a98fbe1680535a7e7641de91e89273ad8Alain Vongsouvanh                    str.printf("%s, %s", gConfigNames[i], gFilterNames[j]);
155713993d1784ab7c23aee1fa3cf1ab8676cc0aa69Jakub Pawlowski                    textCanvas->drawText(str.c_str(), str.size(), x, y + r.height() * 2 / 3, p);
15672a183d00c7534c80a4deb9fb41d38fd9e9455f6Ajay Panicker                }
157f3fb316634973d26cc4b4f55656b86e2a15bd69cJakub Pawlowski
158713993d1784ab7c23aee1fa3cf1ab8676cc0aa69Jakub Pawlowski                y += r.height() * 4 / 3;
159f3fb316634973d26cc4b4f55656b86e2a15bd69cJakub Pawlowski            }
160d77f1999ecece56c1cbb333f4ddc26f0b5bac2c5Marie Janssen        }
1617b266be449e4f915c419199c2312eb31f70e63bcAjay Panicker
162f3fb316634973d26cc4b4f55656b86e2a15bd69cJakub Pawlowski        fTextPicture.reset(recorder.endRecording());
1637b266be449e4f915c419199c2312eb31f70e63bcAjay Panicker
164646134e0a04459f649cb50aa9f3272054630c345Ajay Panicker        canvas->drawPicture(*fTextPicture);
165f3fb316634973d26cc4b4f55656b86e2a15bd69cJakub Pawlowski    }
166f3fb316634973d26cc4b4f55656b86e2a15bd69cJakub Pawlowski
167646134e0a04459f649cb50aa9f3272054630c345Ajay Panickerprivate:
168f3fb316634973d26cc4b4f55656b86e2a15bd69cJakub Pawlowski    typedef SampleView INHERITED;
169646134e0a04459f649cb50aa9f3272054630c345Ajay Panicker};
170646134e0a04459f649cb50aa9f3272054630c345Ajay Panicker
171646134e0a04459f649cb50aa9f3272054630c345Ajay Panicker//////////////////////////////////////////////////////////////////////////////
1726bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson
1736bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watsonstatic SkView* MyFactory() { return new TilingView; }
174f3fb316634973d26cc4b4f55656b86e2a15bd69cJakub Pawlowskistatic SkViewRegister reg(MyFactory);
1756bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson