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