Chromium Code Reviews| Index: gm/spritebitmap.cpp |
| diff --git a/gm/spritebitmap.cpp b/gm/spritebitmap.cpp |
| index 7c8677d143cb735315c54d159b9dd334c457309d..5659964e3bcbc31621ad19a53121849c20076d76 100644 |
| --- a/gm/spritebitmap.cpp |
| +++ b/gm/spritebitmap.cpp |
| @@ -8,6 +8,8 @@ |
| #include "gm.h" |
| #include "SkCanvas.h" |
| #include "SkBlurImageFilter.h" |
| +#include "SkRSXform.h" |
| +#include "SkSurface.h" |
| static void make_bm(SkBitmap* bm) { |
| bm->allocN32Pixels(100, 100); |
| @@ -93,7 +95,95 @@ protected: |
| private: |
| typedef GM INHERITED; |
| }; |
| +DEF_GM( return new SpriteBitmapGM; ) |
| ////////////////////////////////////////////////////////////////////////////// |
|
robertphillips
2015/06/24 15:11:02
should this go in its own file ?
// This GM ...
reed1
2015/06/24 16:17:47
Done.
|
| -DEF_GM( return new SpriteBitmapGM; ) |
| +class DrawAtlasGM : public skiagm::GM { |
|
robertphillips
2015/06/24 15:11:01
So we're not really using the entire atlas ?
reed1
2015/06/24 16:17:47
I'll add dox. I wanted explicitly to use a subset
|
| + static SkImage* MakeAtlas(SkCanvas* caller, const SkRect& target) { |
| + SkImageInfo info = SkImageInfo::MakeN32Premul(100, 100); |
| + SkAutoTUnref<SkSurface> surface(caller->newSurface(info)); |
| + if (NULL == surface) { |
| + surface.reset(SkSurface::NewRaster(info)); |
| + } |
| + SkCanvas* canvas = surface->getCanvas(); |
| + canvas->clear(SK_ColorRED); |
| + |
| + SkPaint paint; |
| + paint.setXfermodeMode(SkXfermode::kClear_Mode); |
| + SkRect r(target); |
| + r.inset(-1, -1); |
| + canvas->drawRect(r, paint); |
| + paint.setXfermode(NULL); |
| + paint.setColor(SK_ColorBLUE); |
| + paint.setAntiAlias(true); |
| + canvas->drawOval(target, paint); |
| + return surface->newImageSnapshot(); |
| + } |
| + |
| + SkAutoTUnref<SkImage> fAtlas; |
| + |
| +public: |
| + DrawAtlasGM() {} |
| + |
| +protected: |
| + |
| + SkString onShortName() override { |
| + return SkString("draw-atlas"); |
| + } |
| + |
| + SkISize onISize() override { |
| + return SkISize::Make(640, 480); |
| + } |
| + |
| + void onDraw(SkCanvas* canvas) override { |
| + const SkRect target = { 50, 50, 80, 90 }; |
|
robertphillips
2015/06/24 15:11:01
If we're going to use this pattern more widely (cr
reed1
2015/06/24 16:17:47
Perhaps so.
|
| + if (NULL == fAtlas) { |
| + fAtlas.reset(MakeAtlas(canvas, target)); |
| + } |
| + |
| + const struct { |
| + SkScalar fScale; |
| + SkScalar fDegrees; |
| + SkScalar fTx; |
| + SkScalar fTy; |
| + |
| + void apply(SkRSXform* xform) const { |
| + const SkScalar rad = SkDegreesToRadians(fDegrees); |
| + xform->fSCos = fScale * SkScalarCos(rad); |
| + xform->fSSin = fScale * SkScalarSin(rad); |
| + xform->fTx = fTx; |
| + xform->fTy = fTy; |
| + } |
| + } rec[] = { |
| + { 1, 0, 10, 10 }, // just translate |
| + { 2, 0, 110, 10 }, // scale + translate |
| + { 1, 30, 210, 10 }, // rotate + translate |
| + { 2, -30, 310, 30 }, // scale + rotate + translate |
| + }; |
| + |
| + const int N = SK_ARRAY_COUNT(rec); |
| + SkRSXform xform[N]; |
| + SkRect tex[N]; |
| + SkColor colors[N]; |
| + |
| + for (int i = 0; i < N; ++i) { |
| + rec[i].apply(&xform[i]); |
| + tex[i] = target; |
|
robertphillips
2015/06/24 15:11:02
Do we need to 565/8888 safety these colors ?
reed1
2015/06/24 16:17:47
Perhaps, though I'm antialiasing and blending, so
|
| + colors[i] = 0x80FF0000 + (i * 40 * 256); |
| + } |
| + |
| + SkPaint paint; |
| + paint.setFilterQuality(kLow_SkFilterQuality); |
| + paint.setAntiAlias(true); |
| + |
| + canvas->drawAtlas(fAtlas, xform, tex, N, NULL, &paint); |
| + canvas->translate(0, 100); |
| + canvas->drawAtlas(fAtlas, xform, tex, colors, N, SkXfermode::kSrcIn_Mode, NULL, &paint); |
| + } |
| + |
| +private: |
| + typedef GM INHERITED; |
| +}; |
| +DEF_GM( return new DrawAtlasGM; ) |
| + |