1fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/* 2fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Copyright 2015 Google Inc. 3fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * 4fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Use of this source code is governed by a BSD-style license that can be 5fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * found in the LICENSE file. 6fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */ 7fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 8fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SampleCode.h" 9fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkAnimTimer.h" 10fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkView.h" 11fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkCanvas.h" 12fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkDrawable.h" 13fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkPath.h" 14fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkRandom.h" 15fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkRSXform.h" 16fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkSurface.h" 17fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 18fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robottypedef void (*DrawAtlasProc)(SkCanvas*, SkImage*, const SkRSXform[], const SkRect[], 19fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const SkColor[], int, const SkRect*, const SkPaint*); 20fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 21fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstatic void draw_atlas(SkCanvas* canvas, SkImage* atlas, const SkRSXform xform[], 22fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const SkRect tex[], const SkColor colors[], int count, const SkRect* cull, 23fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const SkPaint* paint) { 24fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->drawAtlas(atlas, xform, tex, colors, count, SkBlendMode::kModulate, cull, paint); 25fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot} 26fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 27fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstatic void draw_atlas_sim(SkCanvas* canvas, SkImage* atlas, const SkRSXform xform[], 28fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const SkRect tex[], const SkColor colors[], int count, const SkRect* cull, 29fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const SkPaint* paint) { 30fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot for (int i = 0; i < count; ++i) { 31fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkMatrix matrix; 32fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot matrix.setRSXform(xform[i]); 33fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 34fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->save(); 35fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->concat(matrix); 36fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->drawImageRect(atlas, tex[i], tex[i].makeOffset(-tex[i].x(), -tex[i].y()), paint, 37fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkCanvas::kFast_SrcRectConstraint); 38fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->restore(); 39fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 40fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot} 41fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 42fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstatic sk_sp<SkImage> make_atlas(int atlasSize, int cellSize) { 43fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkImageInfo info = SkImageInfo::MakeN32Premul(atlasSize, atlasSize); 44fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot auto surface(SkSurface::MakeRaster(info)); 45fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkCanvas* canvas = surface->getCanvas(); 46fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 47fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkPaint paint; 48fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot paint.setAntiAlias(true); 49fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkRandom rand; 50fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 51fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const SkScalar half = cellSize * SK_ScalarHalf; 52fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const char* s = "01234567890!@#$%^&*=+<>?abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; 53fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot paint.setTextSize(28); 54fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot paint.setTextAlign(SkPaint::kCenter_Align); 55fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot int i = 0; 56fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot for (int y = 0; y < atlasSize; y += cellSize) { 57fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot for (int x = 0; x < atlasSize; x += cellSize) { 58fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot paint.setColor(rand.nextU()); 59fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot paint.setAlpha(0xFF); 60fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot int index = i % strlen(s); 61fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->drawText(&s[index], 1, x + half, y + half + half/2, paint); 62fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot i += 1; 63fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 64fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 65fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return surface->makeImageSnapshot(); 66fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot} 67fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 68fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass DrawAtlasDrawable : public SkDrawable { 69fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot enum { 70fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot kMaxScale = 2, 71fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot kCellSize = 32, 72fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot kAtlasSize = 512, 73fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot }; 74fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 75fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot struct Rec { 76fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkPoint fCenter; 77fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkVector fVelocity; 78fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkScalar fScale; 79fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkScalar fDScale; 80fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkScalar fRadian; 81fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkScalar fDRadian; 82fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkScalar fAlpha; 83fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkScalar fDAlpha; 84fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 85fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void advance(const SkRect& bounds) { 86fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fCenter += fVelocity; 87fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (fCenter.fX > bounds.right()) { 88fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkASSERT(fVelocity.fX > 0); 89fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fVelocity.fX = -fVelocity.fX; 90fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } else if (fCenter.fX < bounds.left()) { 91fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkASSERT(fVelocity.fX < 0); 92fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fVelocity.fX = -fVelocity.fX; 93fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 94fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (fCenter.fY > bounds.bottom()) { 95fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (fVelocity.fY > 0) { 96fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fVelocity.fY = -fVelocity.fY; 97fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 98fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } else if (fCenter.fY < bounds.top()) { 99fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (fVelocity.fY < 0) { 100fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fVelocity.fY = -fVelocity.fY; 101fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 102fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 103fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 104fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fScale += fDScale; 105fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (fScale > 2 || fScale < SK_Scalar1/2) { 106fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fDScale = -fDScale; 107fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 108fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 109fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fRadian += fDRadian; 110fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fRadian = SkScalarMod(fRadian, 2 * SK_ScalarPI); 111fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 112fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fAlpha += fDAlpha; 113fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (fAlpha > 1) { 114fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fAlpha = 1; 115fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fDAlpha = -fDAlpha; 116fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } else if (fAlpha < 0) { 117fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fAlpha = 0; 118fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fDAlpha = -fDAlpha; 119fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 120fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 121fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 122fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkRSXform asRSXform() const { 123fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return SkRSXform::MakeFromRadians(fScale, fRadian, fCenter.x(), fCenter.y(), 124fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkScalarHalf(kCellSize), SkScalarHalf(kCellSize)); 125fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 126fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot }; 127fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 128fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot DrawAtlasProc fProc; 129fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 130fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot enum { 131fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot N = 256, 132fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot }; 133fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 134fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot sk_sp<SkImage> fAtlas; 135fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot Rec fRec[N]; 136fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkRect fTex[N]; 137fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkRect fBounds; 138fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot bool fUseColors; 139fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 140fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic: 141fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot DrawAtlasDrawable(DrawAtlasProc proc, const SkRect& r) 142fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot : fProc(proc), fBounds(r), fUseColors(false) 143fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot { 144fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkRandom rand; 145fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fAtlas = make_atlas(kAtlasSize, kCellSize); 146fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const SkScalar kMaxSpeed = 5; 147fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const SkScalar cell = SkIntToScalar(kCellSize); 148fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot int i = 0; 149fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot for (int y = 0; y < kAtlasSize; y += kCellSize) { 150fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot for (int x = 0; x < kAtlasSize; x += kCellSize) { 151fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const SkScalar sx = SkIntToScalar(x); 152fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const SkScalar sy = SkIntToScalar(y); 153fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fTex[i].setXYWH(sx, sy, cell, cell); 154fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 155fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fRec[i].fCenter.set(sx + cell/2, sy + 3*cell/4); 156fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fRec[i].fVelocity.fX = rand.nextSScalar1() * kMaxSpeed; 157fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fRec[i].fVelocity.fY = rand.nextSScalar1() * kMaxSpeed; 158fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fRec[i].fScale = 1; 159fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fRec[i].fDScale = rand.nextSScalar1() / 16; 160fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fRec[i].fRadian = 0; 161fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fRec[i].fDRadian = rand.nextSScalar1() / 8; 162fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fRec[i].fAlpha = rand.nextUScalar1(); 163fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fRec[i].fDAlpha = rand.nextSScalar1() / 10; 164fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot i += 1; 165fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 166fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 167fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 168fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 169fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void toggleUseColors() { 170fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fUseColors = !fUseColors; 171fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 172fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 173fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprotected: 174fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void onDraw(SkCanvas* canvas) override { 175fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkRSXform xform[N]; 176fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkColor colors[N]; 177fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 178fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot for (int i = 0; i < N; ++i) { 179fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fRec[i].advance(fBounds); 180fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot xform[i] = fRec[i].asRSXform(); 181fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (fUseColors) { 182fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot colors[i] = SkColorSetARGB((int)(fRec[i].fAlpha * 0xFF), 0xFF, 0xFF, 0xFF); 183fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 184fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 185fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkPaint paint; 186fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot paint.setFilterQuality(kLow_SkFilterQuality); 187fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 188fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const SkRect cull = this->getBounds(); 189fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const SkColor* colorsPtr = fUseColors ? colors : nullptr; 190fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fProc(canvas, fAtlas.get(), xform, fTex, colorsPtr, N, &cull, &paint); 191fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 192fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 193fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkRect onGetBounds() override { 194fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const SkScalar border = kMaxScale * kCellSize; 195fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkRect r = fBounds; 196fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot r.outset(border, border); 197fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return r; 198fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 199fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 200fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate: 201fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot typedef SkDrawable INHERITED; 202fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}; 203fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 204fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass DrawAtlasView : public SampleView { 205fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const char* fName; 206fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot DrawAtlasDrawable* fDrawable; 207fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 208fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic: 209fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot DrawAtlasView(const char name[], DrawAtlasProc proc) : fName(name) { 210fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fDrawable = new DrawAtlasDrawable(proc, SkRect::MakeWH(640, 480)); 211fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 212fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 213fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot ~DrawAtlasView() override { 214fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fDrawable->unref(); 215fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 216fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 217fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprotected: 218fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot bool onQuery(SkEvent* evt) override { 219fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (SampleCode::TitleQ(*evt)) { 220fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SampleCode::TitleR(evt, fName); 221fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return true; 222fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 223fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkUnichar uni; 224fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (SampleCode::CharQ(*evt, &uni)) { 225fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot switch (uni) { 226fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot case 'C': fDrawable->toggleUseColors(); return true; 227fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot default: break; 228fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 229fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 230fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return this->INHERITED::onQuery(evt); 231fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 232fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 233fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void onDrawContent(SkCanvas* canvas) override { 234fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->drawDrawable(fDrawable); 235fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 236fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 237fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot bool onAnimate(const SkAnimTimer&) override { 238fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return true; 239fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 240fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#if 0 241fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // TODO: switch over to use this for our animation 242fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot bool onAnimate(const SkAnimTimer& timer) override { 243fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkScalar angle = SkDoubleToScalar(fmod(timer.secs() * 360 / 24, 360)); 244fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fAnimatingDrawable->setSweep(angle); 245fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return true; 246fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 247fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#endif 248fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 249fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate: 250fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot typedef SampleView INHERITED; 251fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}; 252fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 253fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot////////////////////////////////////////////////////////////////////////////// 254fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 255fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_SAMPLE( return new DrawAtlasView("DrawAtlas", draw_atlas); ) 256fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_SAMPLE( return new DrawAtlasView("DrawAtlasSim", draw_atlas_sim); ) 257