diff options
author | Brian Salomon <bsalomon@google.com> | 2017-12-13 10:59:33 -0500 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2017-12-20 14:00:44 +0000 |
commit | b5086961f335d6757a88ce7507c445485aaba2e6 (patch) | |
tree | a635252858428f4f0f04144d532cc4ab96388d95 /src/atlastext/SkAtlasTextTarget.cpp | |
parent | e1367b4a064737cbcf78f2297fa89e0a032b2060 (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.cpp | 50 |
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(); |