Chromium Code Reviews| Index: samplecode/SampleAtlas.cpp |
| diff --git a/samplecode/SampleAtlas.cpp b/samplecode/SampleAtlas.cpp |
| index 079d679fb850690a5cb6bb04bcac3e6cf00074f4..0132b02154d4777bc11699910719d34024057178 100644 |
| --- a/samplecode/SampleAtlas.cpp |
| +++ b/samplecode/SampleAtlas.cpp |
| @@ -15,6 +15,29 @@ |
| #include "SkRSXform.h" |
| #include "SkSurface.h" |
| +typedef void (*DrawAtlasProc)(SkCanvas*, SkImage*, const SkRSXform[], const SkRect[], |
| + const SkColor[], int, const SkRect*, const SkPaint*); |
| + |
| +static void draw_atlas(SkCanvas* canvas, SkImage* atlas, const SkRSXform xform[], |
| + const SkRect tex[], const SkColor colors[], int count, const SkRect* cull, |
| + const SkPaint* paint) { |
| + canvas->drawAtlas(atlas, xform, tex, colors, count, SkXfermode::kModulate_Mode, cull, paint); |
| +} |
| + |
| +static void draw_atlas_sim(SkCanvas* canvas, SkImage* atlas, const SkRSXform xform[], |
|
robertphillips
2015/08/06 12:11:55
\n ?
|
| + const SkRect tex[], const SkColor colors[], int count, const SkRect* cull, |
| + const SkPaint* paint) { |
| + for (int i = 0; i < count; ++i) { |
| + SkMatrix matrix; |
| + matrix.setRSXform(xform[i]); |
| + |
| + canvas->save(); |
| + canvas->concat(matrix); |
| + canvas->drawImageRect(atlas, &tex[i], tex[i].makeOffset(-tex[i].x(), -tex[i].y()), paint); |
| + canvas->restore(); |
| + } |
| +} |
| + |
| static SkImage* make_atlas(int atlasSize, int cellSize) { |
| SkImageInfo info = SkImageInfo::MakeN32Premul(atlasSize, atlasSize); |
| SkAutoTUnref<SkSurface> surface(SkSurface::NewRaster(info)); |
| @@ -101,6 +124,8 @@ class DrawAtlasDrawable : public SkDrawable { |
| } |
| }; |
| + DrawAtlasProc fProc; |
| + |
| enum { |
| N = 256, |
| }; |
| @@ -112,7 +137,9 @@ class DrawAtlasDrawable : public SkDrawable { |
| bool fUseColors; |
| public: |
| - DrawAtlasDrawable(const SkRect& r) : fBounds(r), fUseColors(false) { |
| + DrawAtlasDrawable(DrawAtlasProc proc, const SkRect& r) |
| + : fProc(proc), fBounds(r), fUseColors(false) |
| + { |
| SkRandom rand; |
| fAtlas.reset(make_atlas(kAtlasSize, kCellSize)); |
| const SkScalar kMaxSpeed = 5; |
| @@ -159,8 +186,7 @@ protected: |
| const SkRect cull = this->getBounds(); |
| const SkColor* colorsPtr = fUseColors ? colors : NULL; |
| - canvas->drawAtlas(fAtlas, xform, fTex, colorsPtr, N, SkXfermode::kModulate_Mode, |
| - &cull, &paint); |
| + fProc(canvas, fAtlas, xform, fTex, colorsPtr, N, &cull, &paint); |
| } |
| SkRect onGetBounds() override { |
| @@ -175,11 +201,12 @@ private: |
| }; |
| class DrawAtlasView : public SampleView { |
| - DrawAtlasDrawable* fDrawable; |
| + const char* fName; |
| + DrawAtlasDrawable* fDrawable; |
| public: |
| - DrawAtlasView() { |
| - fDrawable = new DrawAtlasDrawable(SkRect::MakeWH(640, 480)); |
| + DrawAtlasView(const char name[], DrawAtlasProc proc) : fName(name) { |
| + fDrawable = new DrawAtlasDrawable(proc, SkRect::MakeWH(640, 480)); |
| } |
| ~DrawAtlasView() override { |
| @@ -189,7 +216,7 @@ public: |
| protected: |
| bool onQuery(SkEvent* evt) override { |
| if (SampleCode::TitleQ(*evt)) { |
| - SampleCode::TitleR(evt, "DrawAtlas"); |
| + SampleCode::TitleR(evt, fName); |
| return true; |
| } |
| SkUnichar uni; |
| @@ -222,5 +249,5 @@ private: |
| ////////////////////////////////////////////////////////////////////////////// |
| -static SkView* MyFactory() { return new DrawAtlasView; } |
| -static SkViewRegister reg(MyFactory); |
| +DEF_SAMPLE( return new DrawAtlasView("DrawAtlas", draw_atlas); ) |
| +DEF_SAMPLE( return new DrawAtlasView("DrawAtlasSim", draw_atlas_sim); ) |