Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1157)

Unified Diff: gm/drawatlas.cpp

Issue 1181913003: add SkCanvas::drawAtlas (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: fix warnings Created 5 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | gm/spritebitmap.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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; )
+
« no previous file with comments | « no previous file | gm/spritebitmap.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698