diff options
author | reed <reed@google.com> | 2015-06-25 16:25:25 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-06-25 16:25:25 -0700 |
commit | ca10953d9ca38a5486c11cc50ac3fd27d4281e12 (patch) | |
tree | 30df28f6aee0a1b2a05b857215843fc61b4cb3c7 /src/gpu | |
parent | b6d93ea428ca5d13641c35faca7d0380980a3a17 (diff) |
implement drawAtlas natively on gpu-device
BUG=skia:
Review URL: https://codereview.chromium.org/1216433002
Diffstat (limited to 'src/gpu')
-rw-r--r-- | src/gpu/SkGpuDevice.cpp | 44 | ||||
-rw-r--r-- | src/gpu/SkGpuDevice.h | 2 |
2 files changed, 46 insertions, 0 deletions
diff --git a/src/gpu/SkGpuDevice.cpp b/src/gpu/SkGpuDevice.cpp index d0f8d46ee8..17d837be42 100644 --- a/src/gpu/SkGpuDevice.cpp +++ b/src/gpu/SkGpuDevice.cpp @@ -1639,6 +1639,50 @@ void SkGpuDevice::drawVertices(const SkDraw& draw, SkCanvas::VertexMode vmode, /////////////////////////////////////////////////////////////////////////////// +static void append_quad_indices(uint16_t indices[], int quadIndex) { + int i = quadIndex * 4; + indices[0] = i + 0; indices[1] = i + 1; indices[2] = i + 2; + indices[3] = i + 2; indices[4] = i + 3; indices[5] = i + 0; +} + +void SkGpuDevice::drawAtlas(const SkDraw& d, const SkImage* atlas, const SkRSXform xform[], + const SkRect texRect[], const SkColor colors[], int count, + SkXfermode::Mode mode, const SkPaint& paint) { + if (paint.isAntiAlias()) { + this->INHERITED::drawAtlas(d, atlas, xform, texRect, colors, count, mode, paint); + return; + } + + SkPaint p(paint); + p.setShader(atlas->newShader(SkShader::kClamp_TileMode, SkShader::kClamp_TileMode))->unref(); + + const int vertCount = count * 4; + const int indexCount = count * 6; + SkAutoTMalloc<SkPoint> vertStorage(vertCount * 2); + SkPoint* verts = vertStorage.get(); + SkPoint* texs = verts + vertCount; + SkAutoTMalloc<uint16_t> indexStorage(indexCount); + uint16_t* indices = indexStorage.get(); + SkAutoTUnref<SkXfermode> xfer(SkXfermode::Create(mode)); + + for (int i = 0; i < count; ++i) { + xform[i].toQuad(texRect[i].width(), texRect[i].height(), verts); + texRect[i].toQuad(texs); + append_quad_indices(indices, i); + verts += 4; + texs += 4; + indices += 6; + } + + verts = vertStorage.get(); + texs = verts + vertCount; + indices = indexStorage.get(); + this->drawVertices(d, SkCanvas::kTriangles_VertexMode, vertCount, verts, texs, colors, xfer, + indices, indexCount, p); +} + +/////////////////////////////////////////////////////////////////////////////// + void SkGpuDevice::drawText(const SkDraw& draw, const void* text, size_t byteLength, SkScalar x, SkScalar y, const SkPaint& paint) { diff --git a/src/gpu/SkGpuDevice.h b/src/gpu/SkGpuDevice.h index 9fa756c29a..86507657cd 100644 --- a/src/gpu/SkGpuDevice.h +++ b/src/gpu/SkGpuDevice.h @@ -111,6 +111,8 @@ public: const SkColor colors[], SkXfermode* xmode, const uint16_t indices[], int indexCount, const SkPaint&) override; + void drawAtlas(const SkDraw&, const SkImage* atlas, const SkRSXform[], const SkRect[], + const SkColor[], int count, SkXfermode::Mode, const SkPaint&) override; virtual void drawDevice(const SkDraw&, SkBaseDevice*, int x, int y, const SkPaint&) override; void drawImage(const SkDraw&, const SkImage*, SkScalar x, SkScalar y, const SkPaint&) override; |