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 "SkGraphics.h" 130b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkImageDecoder.h" 140b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkPath.h" 150b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkRandom.h" 160b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkRegion.h" 170b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkShader.h" 180b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkUtils.h" 190b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkXfermode.h" 200b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkColorPriv.h" 210b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkColorFilter.h" 220b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkTime.h" 230b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkTypeface.h" 240b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 250b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkOSFile.h" 260b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkStream.h" 270b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 280b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerstatic SkShader* make_shader0(SkIPoint* size) { 290b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkBitmap bm; 300b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger size->set(2, 2); 310b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger bm.setConfig(SkBitmap::kARGB_8888_Config, size->fX, size->fY); 320b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkPMColor color0 = SkPreMultiplyARGB(0x80, 0x80, 0xff, 0x80); 330b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkPMColor color1 = SkPreMultiplyARGB(0x40, 0xff, 0x00, 0xff); 340b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger bm.allocPixels(); 350b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger bm.eraseColor(color0); 360b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger bm.lockPixels(); 370b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger uint32_t* pixels = (uint32_t*) bm.getPixels(); 380b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger pixels[0] = pixels[2] = color0; 390b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger pixels[1] = pixels[3] = color1; 400b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger bm.unlockPixels(); 410b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 420b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger return SkShader::CreateBitmapShader(bm, SkShader::kRepeat_TileMode, 430b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkShader::kRepeat_TileMode); 440b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger} 450b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 460b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerstatic SkShader* make_shader1(const SkIPoint& size) { 470b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkPoint pts[] = { { 0, 0 }, 480b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger { SkIntToScalar(size.fX), SkIntToScalar(size.fY) } }; 490b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkColor colors[] = { SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE, SK_ColorRED }; 500b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger return SkGradientShader::CreateLinear(pts, colors, NULL, 510b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SK_ARRAY_COUNT(colors), SkShader::kMirror_TileMode, NULL); 520b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger} 530b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 540b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerclass VerticesView : public SampleView { 550b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkShader* fShader0; 560b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkShader* fShader1; 570b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 580b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerpublic: 590b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger VerticesView() { 600b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkIPoint size; 610b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 620b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger fShader0 = make_shader0(&size); 630b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger fShader1 = make_shader1(size); 640b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 650b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger make_strip(&fRecs[0], size.fX, size.fY); 660b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger make_fan(&fRecs[1], size.fX, size.fY); 670b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger make_tris(&fRecs[2]); 680b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 690b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger fScale = SK_Scalar1; 700b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 710b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger this->setBGColor(SK_ColorGRAY); 720b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 730b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 740b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger virtual ~VerticesView() { 750b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkSafeUnref(fShader0); 760b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkSafeUnref(fShader1); 770b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 780b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 790b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerprotected: 800b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger // overrides from SkEventSink 810b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger virtual bool onQuery(SkEvent* evt) { 820b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger if (SampleCode::TitleQ(*evt)) 830b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger { 840b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkString str("Vertices"); 850b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SampleCode::TitleR(evt, str.c_str()); 860b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger return true; 870b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 880b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger return this->INHERITED::onQuery(evt); 890b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 900b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 910b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkScalar fScale; 920b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 930b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger virtual void onDrawContent(SkCanvas* canvas) { 940b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkPaint paint; 950b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger paint.setDither(true); 960b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger paint.setFilterBitmap(true); 970b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 980b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger for (size_t i = 0; i < SK_ARRAY_COUNT(fRecs); i++) { 990b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger canvas->save(); 1000b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 1010b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger paint.setShader(NULL); 1020b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger canvas->drawVertices(fRecs[i].fMode, fRecs[i].fCount, 1030b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger fRecs[i].fVerts, fRecs[i].fTexs, 1040b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger NULL, NULL, NULL, 0, paint); 1050b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 1060b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger canvas->translate(SkIntToScalar(250), 0); 1070b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 1080b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger paint.setShader(fShader0); 1090b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger canvas->drawVertices(fRecs[i].fMode, fRecs[i].fCount, 1100b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger fRecs[i].fVerts, fRecs[i].fTexs, 1110b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger NULL, NULL, NULL, 0, paint); 1120b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 1130b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger canvas->translate(SkIntToScalar(250), 0); 1140b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 1150b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger paint.setShader(fShader1); 1160b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger canvas->drawVertices(fRecs[i].fMode, fRecs[i].fCount, 1170b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger fRecs[i].fVerts, fRecs[i].fTexs, 1180b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger NULL, NULL, NULL, 0, paint); 1190b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger canvas->restore(); 1200b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 1210b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger canvas->translate(0, SkIntToScalar(250)); 1220b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 1230b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 1240b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 1250b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger virtual SkView::Click* onFindClickHandler(SkScalar x, SkScalar y) { 1260b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger return new Click(this); 1270b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 1280b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 1290b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger virtual bool onClick(Click* click) { 1300b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger // fCurrX = click->fICurr.fX; 1310b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger // fCurrY = click->fICurr.fY; 1320b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger this->inval(NULL); 1330b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger return true; 1340b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 1350b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 1360b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerprivate: 1370b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger struct Rec { 1380b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkCanvas::VertexMode fMode; 1390b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger int fCount; 1400b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkPoint* fVerts; 1410b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkPoint* fTexs; 1420b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 1430b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger Rec() : fCount(0), fVerts(NULL), fTexs(NULL) {} 1440b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger ~Rec() { delete[] fVerts; delete[] fTexs; } 1450b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger }; 1460b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 1470b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger void make_tris(Rec* rec) { 1480b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger int n = 10; 1490b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkRandom rand; 1500b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 1510b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger rec->fMode = SkCanvas::kTriangles_VertexMode; 1520b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger rec->fCount = n * 3; 1530b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger rec->fVerts = new SkPoint[rec->fCount]; 1540b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 1550b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger for (int i = 0; i < n; i++) { 1560b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkPoint* v = &rec->fVerts[i*3]; 1570b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger for (int j = 0; j < 3; j++) { 1580b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger v[j].set(rand.nextUScalar1() * 250, rand.nextUScalar1() * 250); 1590b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 1600b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 1610b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 1620b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 1630b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger void make_fan(Rec* rec, int texWidth, int texHeight) { 1640b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger const SkScalar tx = SkIntToScalar(texWidth); 1650b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger const SkScalar ty = SkIntToScalar(texHeight); 1660b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger const int n = 24; 1670b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 1680b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger rec->fMode = SkCanvas::kTriangleFan_VertexMode; 1690b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger rec->fCount = n + 2; 1700b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger rec->fVerts = new SkPoint[rec->fCount]; 1710b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger rec->fTexs = new SkPoint[rec->fCount]; 1720b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 1730b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkPoint* v = rec->fVerts; 1740b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkPoint* t = rec->fTexs; 1750b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 1760b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger v[0].set(0, 0); 1770b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger t[0].set(0, 0); 1780b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger for (int i = 0; i < n; i++) { 1790b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkScalar cos; 1800b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkScalar sin = SkScalarSinCos(SK_ScalarPI * 2 * i / n, &cos); 1810b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger v[i+1].set(cos, sin); 1820b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger t[i+1].set(i*tx/n, ty); 1830b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 1840b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger v[n+1] = v[1]; 1850b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger t[n+1].set(tx, ty); 1860b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 1870b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkMatrix m; 1880b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger m.setScale(SkIntToScalar(100), SkIntToScalar(100)); 1890b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger m.postTranslate(SkIntToScalar(110), SkIntToScalar(110)); 1900b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger m.mapPoints(v, rec->fCount); 1910b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 1920b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 1930b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger void make_strip(Rec* rec, int texWidth, int texHeight) { 1940b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger const SkScalar tx = SkIntToScalar(texWidth); 1950b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger const SkScalar ty = SkIntToScalar(texHeight); 1960b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger const int n = 24; 1970b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 1980b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger rec->fMode = SkCanvas::kTriangleStrip_VertexMode; 1990b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger rec->fCount = 2 * (n + 1); 2000b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger rec->fVerts = new SkPoint[rec->fCount]; 2010b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger rec->fTexs = new SkPoint[rec->fCount]; 2020b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 2030b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkPoint* v = rec->fVerts; 2040b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkPoint* t = rec->fTexs; 2050b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 2060b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger for (int i = 0; i < n; i++) { 2070b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkScalar cos; 2080b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkScalar sin = SkScalarSinCos(SK_ScalarPI * 2 * i / n, &cos); 2090b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger v[i*2 + 0].set(cos/2, sin/2); 2100b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger v[i*2 + 1].set(cos, sin); 2110b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 2120b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger t[i*2 + 0].set(tx * i / n, ty); 2130b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger t[i*2 + 1].set(tx * i / n, 0); 2140b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 2150b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger v[2*n + 0] = v[0]; 2160b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger v[2*n + 1] = v[1]; 2170b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 2180b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger t[2*n + 0].set(tx, ty); 2190b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger t[2*n + 1].set(tx, 0); 2200b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 2210b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkMatrix m; 2220b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger m.setScale(SkIntToScalar(100), SkIntToScalar(100)); 2230b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger m.postTranslate(SkIntToScalar(110), SkIntToScalar(110)); 2240b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger m.mapPoints(v, rec->fCount); 2250b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 2260b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 2270b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger Rec fRecs[3]; 2280b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 2290b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger typedef SampleView INHERITED; 2300b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger}; 2310b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 2320b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger////////////////////////////////////////////////////////////////////////////// 2330b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 2340b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerstatic SkView* MyFactory() { return new VerticesView; } 2350b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerstatic SkViewRegister reg(MyFactory); 2360b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 237