aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core
diff options
context:
space:
mode:
authorGravatar Mike Reed <reed@google.com>2017-04-28 12:31:05 -0400
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2017-04-28 17:38:53 +0000
commit185ba21bffc2df9ddfc1e351505a7a622821df1f (patch)
treea5c26994b48e2a90e095bd369f56372d1980043d /src/core
parent2fcd4a480deecb23e9fdde07e63d18d2735c9287 (diff)
change drawAtlas to behave like drawVertices
Bug: skia:6571 Change-Id: If60c30755ec0548df0e9bdeca2f3af0bc87764ca Reviewed-on: https://skia-review.googlesource.com/14642 Reviewed-by: Brian Salomon <bsalomon@google.com> Reviewed-by: Florin Malita <fmalita@chromium.org> Commit-Queue: Mike Reed <reed@google.com>
Diffstat (limited to 'src/core')
-rw-r--r--src/core/SkDevice.cpp57
1 files changed, 35 insertions, 22 deletions
diff --git a/src/core/SkDevice.cpp b/src/core/SkDevice.cpp
index 9d38e16d04..f608134503 100644
--- a/src/core/SkDevice.cpp
+++ b/src/core/SkDevice.cpp
@@ -24,6 +24,7 @@
#include "SkTLazy.h"
#include "SkTextBlobRunIterator.h"
#include "SkTextToPathIter.h"
+#include "SkUtils.h"
#include "SkVertices.h"
SkBaseDevice::SkBaseDevice(const SkImageInfo& info, const SkSurfaceProps& surfaceProps)
@@ -235,36 +236,48 @@ void SkBaseDevice::drawBitmapLattice(const SkBitmap& bitmap,
}
}
+static SkPoint* quad_to_tris(SkPoint tris[6], const SkPoint quad[4]) {
+ tris[0] = quad[0];
+ tris[1] = quad[1];
+ tris[2] = quad[2];
+
+ tris[3] = quad[0];
+ tris[4] = quad[2];
+ tris[5] = quad[3];
+
+ return tris + 6;
+}
+
void SkBaseDevice::drawAtlas(const SkImage* atlas, const SkRSXform xform[],
- const SkRect tex[], const SkColor colors[], int count,
+ const SkRect tex[], const SkColor colors[], int quadCount,
SkBlendMode mode, const SkPaint& paint) {
- SkPath path;
- path.setIsVolatile(true);
-
- for (int i = 0; i < count; ++i) {
- SkPoint quad[4];
- xform[i].toQuad(tex[i].width(), tex[i].height(), quad);
+ const int triCount = quadCount << 1;
+ const int vertexCount = triCount * 3;
+ uint32_t flags = SkVertices::kHasTexCoords_BuilderFlag;
+ if (colors) {
+ flags |= SkVertices::kHasColors_BuilderFlag;
+ }
+ SkVertices::Builder builder(SkVertices::kTriangles_VertexMode, vertexCount, 0, flags);
- SkMatrix localM;
- localM.setRSXform(xform[i]);
- localM.preTranslate(-tex[i].left(), -tex[i].top());
+ SkPoint* vPos = builder.positions();
+ SkPoint* vTex = builder.texCoords();
+ SkColor* vCol = builder.colors();
+ for (int i = 0; i < quadCount; ++i) {
+ SkPoint tmp[4];
+ xform[i].toQuad(tex[i].width(), tex[i].height(), tmp);
+ vPos = quad_to_tris(vPos, tmp);
- SkPaint pnt(paint);
- sk_sp<SkShader> shader = atlas->makeShader(&localM);
- if (!shader) {
- break;
- }
- pnt.setShader(std::move(shader));
+ tex[i].toQuad(tmp);
+ vTex = quad_to_tris(vTex, tmp);
if (colors) {
- pnt.setColorFilter(SkColorFilter::MakeModeFilter(colors[i], (SkBlendMode)mode));
+ sk_memset32(vCol, colors[i], 6);
+ vCol += 6;
}
-
- path.rewind();
- path.addPoly(quad, 4, true);
- path.setConvexity(SkPath::kConvex_Convexity);
- this->drawPath(path, pnt, nullptr, true);
}
+ SkPaint p(paint);
+ p.setShader(atlas->makeShader());
+ this->drawVertices(builder.detach().get(), mode, p);
}
///////////////////////////////////////////////////////////////////////////////////////////////////