aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/atlastext/SkAtlasTextTarget.cpp
diff options
context:
space:
mode:
authorGravatar Brian Salomon <bsalomon@google.com>2017-12-13 10:59:33 -0500
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2017-12-20 14:00:44 +0000
commitb5086961f335d6757a88ce7507c445485aaba2e6 (patch)
treea635252858428f4f0f04144d532cc4ab96388d95 /src/atlastext/SkAtlasTextTarget.cpp
parente1367b4a064737cbcf78f2297fa89e0a032b2060 (diff)
Add matrix stack to SkAtlasTextTarget.
Makes SkAtlasTextRenderer::SDFVertex now has a 3 component position vector. Change-Id: I7ec1a8068fb84388a82e1748d6e9d02820d55abd Reviewed-on: https://skia-review.googlesource.com/84202 Commit-Queue: Brian Salomon <bsalomon@google.com> Reviewed-by: Jim Van Verth <jvanverth@google.com>
Diffstat (limited to 'src/atlastext/SkAtlasTextTarget.cpp')
-rw-r--r--src/atlastext/SkAtlasTextTarget.cpp50
1 files changed, 47 insertions, 3 deletions
diff --git a/src/atlastext/SkAtlasTextTarget.cpp b/src/atlastext/SkAtlasTextTarget.cpp
index 81dbb07a16..0a318e0c8e 100644
--- a/src/atlastext/SkAtlasTextTarget.cpp
+++ b/src/atlastext/SkAtlasTextTarget.cpp
@@ -21,10 +21,53 @@ static constexpr int kMaxBatchLookBack = 10;
SkAtlasTextTarget::SkAtlasTextTarget(sk_sp<SkAtlasTextContext> context, int width, int height,
void* handle)
- : fHandle(handle), fContext(std::move(context)), fWidth(width), fHeight(height) {}
+ : fHandle(handle)
+ , fContext(std::move(context))
+ , fWidth(width)
+ , fHeight(height)
+ , fMatrixStack(sizeof(SkMatrix), 4)
+ , fSaveCnt(0) {
+ fMatrixStack.push_back();
+ this->accessCTM()->reset();
+}
SkAtlasTextTarget::~SkAtlasTextTarget() { fContext->renderer()->targetDeleted(fHandle); }
+int SkAtlasTextTarget::save() {
+ const auto& currCTM = this->ctm();
+ *static_cast<SkMatrix*>(fMatrixStack.push_back()) = currCTM;
+ return fSaveCnt++;
+}
+
+void SkAtlasTextTarget::restore() {
+ if (fSaveCnt) {
+ fMatrixStack.pop_back();
+ fSaveCnt--;
+ }
+}
+
+void SkAtlasTextTarget::restoreToCount(int count) {
+ while (fSaveCnt > count) {
+ this->restore();
+ }
+}
+
+void SkAtlasTextTarget::translate(SkScalar dx, SkScalar dy) {
+ this->accessCTM()->preTranslate(dx, dy);
+}
+
+void SkAtlasTextTarget::scale(SkScalar sx, SkScalar sy) { this->accessCTM()->preScale(sx, sy); }
+
+void SkAtlasTextTarget::rotate(SkScalar degrees) { this->accessCTM()->preRotate(degrees); }
+
+void SkAtlasTextTarget::rotate(SkScalar degrees, SkScalar px, SkScalar py) {
+ this->accessCTM()->preRotate(degrees, px, py);
+}
+
+void SkAtlasTextTarget::skew(SkScalar sx, SkScalar sy) { this->accessCTM()->preSkew(sx, sy); }
+
+void SkAtlasTextTarget::concat(const SkMatrix& matrix) { this->accessCTM()->preConcat(matrix); }
+
//////////////////////////////////////////////////////////////////////////////
static const GrColorSpaceInfo kColorSpaceInfo(nullptr, kRGBA_8888_GrPixelConfig);
@@ -95,7 +138,7 @@ void SkInternalAtlasTextTarget::drawText(const SkGlyphID glyphs[], const SkPoint
auto atlasTextContext = grContext->contextPriv().drawingManager()->getAtlasTextContext();
size_t byteLength = sizeof(SkGlyphID) * glyphCnt;
const SkScalar* pos = &positions->fX;
- atlasTextContext->drawPosText(grContext, this, GrNoClip(), paint, SkMatrix::I(), props,
+ atlasTextContext->drawPosText(grContext, this, GrNoClip(), paint, this->ctm(), props,
(const char*)glyphs, byteLength, pos, 2, {0, 0}, bounds);
}
@@ -149,7 +192,8 @@ void GrAtlasTextOp::executeForTextTarget(SkAtlasTextTarget* target) {
GrAtlasTextBlob::VertexRegenerator::Result result;
do {
result = regenerator.regenerate();
- context.recordDraw(result.fFirstVertex, result.fGlyphsRegenerated, target->handle());
+ context.recordDraw(result.fFirstVertex, result.fGlyphsRegenerated,
+ fGeoData[i].fViewMatrix, target->handle());
if (!result.fFinished) {
// Make space in the atlas so we can continue generating vertices.
context.flush();