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