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 "SkView.h"
100b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkCanvas.h"
110b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkGradientShader.h"
120b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkUnitMappers.h"
130b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
140b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerstatic void makebm(SkBitmap* bm, SkBitmap::Config config, int w, int h) {
150b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    bm->setConfig(config, w, h);
160b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    bm->allocPixels();
170b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    bm->eraseColor(0);
180b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
190b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    SkCanvas    canvas(*bm);
200b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    SkScalar s = SkIntToScalar(w < h ? w : h);
210b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    SkPoint     pts[] = { { 0, 0 }, { s, s } };
220b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    SkColor     colors[] = { SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE };
230b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    SkScalar    pos[] = { 0, SK_Scalar1/2, SK_Scalar1 };
240b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    SkPaint     paint;
250b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
260b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    SkUnitMapper*   um = NULL;
270b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
280b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    um = new SkCosineMapper;
290b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
300b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    SkAutoUnref au(um);
310b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
320b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    paint.setDither(true);
330b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    paint.setShader(SkGradientShader::CreateLinear(pts, colors, pos,
340b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger                SK_ARRAY_COUNT(colors), SkShader::kClamp_TileMode, um))->unref();
350b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    canvas.drawPaint(paint);
360b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger}
370b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
380b15698a8c76bb8abc1b555c1d91892669b4118fDerek SollenbergerSkShader* MakeBitmapShader(SkShader::TileMode tx, SkShader::TileMode ty,
390b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger                           int w, int h) {
400b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    static SkBitmap bmp;
410b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    if (bmp.isNull()) {
420b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        makebm(&bmp, SkBitmap::kARGB_8888_Config, w/2, h/4);
430b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    }
440b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    return SkShader::CreateBitmapShader(bmp, tx, ty);
450b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger}
460b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
470b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger///////////////////////////////////////////////////////////////////////////////
480b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
490b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerstruct GradData {
500b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    int             fCount;
510b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    const SkColor*  fColors;
520b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    const SkScalar* fPos;
530b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger};
540b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
550b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerstatic const SkColor gColors[] = {
560b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE, SK_ColorWHITE, SK_ColorBLACK
570b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger};
580b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
590b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerstatic const GradData gGradData[] = {
600b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    { 2, gColors, NULL },
610b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    { 5, gColors, NULL },
620b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger};
630b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
640b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerstatic SkShader* MakeLinear(const SkPoint pts[2], const GradData& data,
650b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger                            SkShader::TileMode tm, SkUnitMapper* mapper) {
660b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    return SkGradientShader::CreateLinear(pts, data.fColors, data.fPos,
670b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger                                          data.fCount, tm, mapper);
680b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger}
690b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
700b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerstatic SkShader* MakeRadial(const SkPoint pts[2], const GradData& data,
710b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger                            SkShader::TileMode tm, SkUnitMapper* mapper) {
720b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    SkPoint center;
730b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    center.set(SkScalarAve(pts[0].fX, pts[1].fX),
740b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger               SkScalarAve(pts[0].fY, pts[1].fY));
750b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    return SkGradientShader::CreateRadial(center, center.fX, data.fColors,
760b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger                                          data.fPos, data.fCount, tm, mapper);
770b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger}
780b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
790b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerstatic SkShader* MakeSweep(const SkPoint pts[2], const GradData& data,
800b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger                           SkShader::TileMode tm, SkUnitMapper* mapper) {
810b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    SkPoint center;
820b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    center.set(SkScalarAve(pts[0].fX, pts[1].fX),
830b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger               SkScalarAve(pts[0].fY, pts[1].fY));
840b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    return SkGradientShader::CreateSweep(center.fX, center.fY, data.fColors,
850b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger                                         data.fPos, data.fCount, mapper);
860b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger}
870b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
880b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerstatic SkShader* Make2Radial(const SkPoint pts[2], const GradData& data,
890b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger                           SkShader::TileMode tm, SkUnitMapper* mapper) {
900b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    SkPoint center0, center1;
910b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    center0.set(SkScalarAve(pts[0].fX, pts[1].fX),
920b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger                SkScalarAve(pts[0].fY, pts[1].fY));
930b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    center1.set(SkScalarInterp(pts[0].fX, pts[1].fX, SkIntToScalar(3)/5),
940b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger                SkScalarInterp(pts[0].fY, pts[1].fY, SkIntToScalar(1)/4));
950b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    return SkGradientShader::CreateTwoPointRadial(
960b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger                            center1, (pts[1].fX - pts[0].fX) / 7,
970b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger                            center0, (pts[1].fX - pts[0].fX) / 2,
980b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger                            data.fColors, data.fPos, data.fCount, tm, mapper);
990b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger}
1000b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
1010b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergertypedef SkShader* (*GradMaker)(const SkPoint pts[2], const GradData& data,
1020b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger                     SkShader::TileMode tm, SkUnitMapper* mapper);
1030b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerstatic const GradMaker gGradMakers[] = {
1040b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    MakeLinear, MakeRadial, MakeSweep, Make2Radial
1050b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger};
1060b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
1070b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger///////////////////////////////////////////////////////////////////////////////
1080b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
1090b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerclass ShaderTextView : public SampleView {
1100b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerpublic:
1110b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger	ShaderTextView() {
1120b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        this->setBGColor(0xFFDDDDDD);
1130b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    }
1140b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
1150b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerprotected:
1160b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    // overrides from SkEventSink
1170b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    virtual bool onQuery(SkEvent* evt) {
1180b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        if (SampleCode::TitleQ(*evt)) {
1190b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            SampleCode::TitleR(evt, "Shader Text");
1200b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            return true;
1210b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        }
1220b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        return this->INHERITED::onQuery(evt);
1230b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    }
1240b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
1250b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    virtual void onDrawContent(SkCanvas* canvas) {
1260b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        const char text[] = "Shaded Text";
1270b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        const int textLen = SK_ARRAY_COUNT(text) - 1;
1281cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        static int pointSize = 36;
1290b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
1300b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        int w = pointSize * textLen;
1310b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        int h = pointSize;
1320b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
1330b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        SkPoint pts[2] = {
1340b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            { 0, 0 },
1350b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            { SkIntToScalar(w), SkIntToScalar(h) }
1360b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        };
1370b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        SkScalar textBase = SkIntToScalar(h/2);
1380b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
1390b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        SkShader::TileMode tileModes[] = {
1400b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            SkShader::kClamp_TileMode,
1410b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            SkShader::kRepeat_TileMode,
1420b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            SkShader::kMirror_TileMode
1430b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        };
1440b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
1450b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        static const int gradCount = SK_ARRAY_COUNT(gGradData) *
1460b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger                                     SK_ARRAY_COUNT(gGradMakers);
1470b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        static const int bmpCount = SK_ARRAY_COUNT(tileModes) *
1480b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger                                    SK_ARRAY_COUNT(tileModes);
1490b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        SkShader* shaders[gradCount + bmpCount];
1500b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
1510b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        int shdIdx = 0;
1520b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        for (size_t d = 0; d < SK_ARRAY_COUNT(gGradData); ++d) {
1530b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            for (size_t m = 0; m < SK_ARRAY_COUNT(gGradMakers); ++m) {
1540b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger                shaders[shdIdx++] = gGradMakers[m](pts,
1550b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger                                                   gGradData[d],
1560b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger                                                   SkShader::kClamp_TileMode,
1570b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger                                                   NULL);
1580b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            }
1590b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        }
1600b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        for (size_t tx = 0; tx < SK_ARRAY_COUNT(tileModes); ++tx) {
1610b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            for (size_t ty = 0; ty < SK_ARRAY_COUNT(tileModes); ++ty) {
1620b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger                shaders[shdIdx++] = MakeBitmapShader(tileModes[tx],
1630b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger                                                     tileModes[ty],
1640b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger                                                     w/8, h);
1650b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            }
1660b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        }
1670b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
1680b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        SkPaint paint;
1690b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        paint.setDither(true);
1700b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        paint.setAntiAlias(true);
1710b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        paint.setTextSize(SkIntToScalar(pointSize));
1720b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
1730b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        canvas->save();
1740b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        canvas->translate(SkIntToScalar(20), SkIntToScalar(10));
1750b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
1761cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        SkPath path;
1771cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        path.arcTo(SkRect::MakeXYWH(SkIntToScalar(-40), SkIntToScalar(15),
1781cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                    SkIntToScalar(300), SkIntToScalar(90)),
1791cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                    SkIntToScalar(225), SkIntToScalar(90),
1801cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                    false);
1811cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        path.close();
1821cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1830b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        static const int testsPerCol = 8;
1840b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        static const int rowHeight = 60;
1850b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        static const int colWidth = 300;
1860b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        canvas->save();
1870b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        for (size_t s = 0; s < SK_ARRAY_COUNT(shaders); s++) {
1880b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            canvas->save();
1891cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            int i = 2*s;
1901cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            canvas->translate(SkIntToScalar((i / testsPerCol) * colWidth),
1911cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                              SkIntToScalar((i % testsPerCol) * rowHeight));
1920b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            paint.setShader(shaders[s])->unref();
1930b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            canvas->drawText(text, textLen, 0, textBase, paint);
1940b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            canvas->restore();
1951cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            canvas->save();
1961cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            ++i;
1971cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            canvas->translate(SkIntToScalar((i / testsPerCol) * colWidth),
1981cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                              SkIntToScalar((i % testsPerCol) * rowHeight));
1991cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            canvas->drawTextOnPath(text, textLen, path, NULL, paint);
2001cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            canvas->restore();
2010b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        }
2020b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        canvas->restore();
2030b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
2040b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        canvas->translate(0, SkIntToScalar(370));
2050b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        this->inval(NULL);
2060b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    }
2070b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
2080b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerprivate:
2090b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    typedef SampleView INHERITED;
2100b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger};
2110b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
2120b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger///////////////////////////////////////////////////////////////////////////////
2130b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
2140b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerstatic SkView* MyFactory() { return new ShaderTextView; }
2150b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerstatic SkViewRegister reg(MyFactory);
2160b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
217