Index: gm/drawatlas.cpp |
diff --git a/gm/drawatlas.cpp b/gm/drawatlas.cpp |
new file mode 100644 |
index 0000000000000000000000000000000000000000..89bd49c0a2cf8b530076bced84cbed7d797f5bfa |
--- /dev/null |
+++ b/gm/drawatlas.cpp |
@@ -0,0 +1,103 @@ |
+/* |
+ * Copyright 2015 Google Inc. |
+ * |
+ * Use of this source code is governed by a BSD-style license that can be |
+ * found in the LICENSE file. |
+ */ |
+ |
+#include "gm.h" |
+#include "SkCanvas.h" |
+#include "SkRSXform.h" |
+#include "SkSurface.h" |
+ |
+class DrawAtlasGM : public skiagm::GM { |
+ 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(); |
+ // draw red everywhere, but we don't expect to see it in the draw, testing the notion |
+ // that drawAtlas draws a subset-region of the atlas. |
+ canvas->clear(SK_ColorRED); |
+ |
+ SkPaint paint; |
+ paint.setXfermodeMode(SkXfermode::kClear_Mode); |
+ SkRect r(target); |
+ r.inset(-1, -1); |
+ // zero out a place (with a 1-pixel border) to land our drawing. |
+ 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 }; |
+ 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; |
+ 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; ) |
+ |