From ab54e7394d81438f5256b632c71724b480a7f66b Mon Sep 17 00:00:00 2001 From: Florin Malita Date: Fri, 27 Jul 2018 09:47:15 -0400 Subject: Hide SkTextBlob::GlyphPositioning from public API Make private, add corresponding SkTextBlobRunIterator enum. Also move SkTextBlobRunIterator to SkTextBlobPriv.h. Change-Id: If3e0beabb0e8484b1ac73c6fc0827e920ca1f93b Reviewed-on: https://skia-review.googlesource.com/142501 Commit-Queue: Florin Malita Reviewed-by: Mike Reed Reviewed-by: Herb Derby Reviewed-by: Cary Clark --- src/core/SkDevice.cpp | 10 ++++------ src/core/SkGlyphRun.cpp | 10 ++++------ src/core/SkGlyphRun.h | 6 ++++-- src/core/SkOverdrawCanvas.cpp | 11 ++++------ src/core/SkPaint.cpp | 8 ++++---- src/core/SkRemoteGlyphCache.cpp | 6 +++--- src/core/SkTextBlob.cpp | 26 ++++++++++++++++++------ src/core/SkTextBlobPriv.h | 37 ++++++++++++++++++++++++++++++++++ src/core/SkTextBlobRunIterator.h | 43 ---------------------------------------- src/gpu/text/GrTextBlob.cpp | 1 - src/gpu/text/GrTextBlobCache.h | 2 +- src/gpu/text/GrTextContext.cpp | 2 +- src/gpu/text/GrTextContext.h | 1 - src/gpu/text/GrTextUtils.cpp | 1 - src/pdf/SkPDFDevice.cpp | 2 +- src/pdf/SkPDFDevice.h | 3 +-- 16 files changed, 84 insertions(+), 85 deletions(-) delete mode 100644 src/core/SkTextBlobRunIterator.h (limited to 'src') diff --git a/src/core/SkDevice.cpp b/src/core/SkDevice.cpp index f0829dc4da..b52a82efc1 100644 --- a/src/core/SkDevice.cpp +++ b/src/core/SkDevice.cpp @@ -26,7 +26,7 @@ #include "SkShader.h" #include "SkSpecialImage.h" #include "SkTLazy.h" -#include "SkTextBlobRunIterator.h" +#include "SkTextBlobPriv.h" #include "SkTextToPathIter.h" #include "SkTo.h" #include "SkUtils.h" @@ -153,7 +153,7 @@ void SkBaseDevice::drawTextBlob(const SkTextBlob* blob, SkScalar x, SkScalar y, it.applyFontToPaint(&runPaint); switch (it.positioning()) { - case SkTextBlob::kDefault_Positioning: { + case SkTextBlobRunIterator::kDefault_Positioning: { auto origin = SkPoint::Make(x + offset.x(), y + offset.y()); SkGlyphRunBuilder builder; builder.drawText(runPaint, (const char*) it.glyphs(), textLen, origin); @@ -161,16 +161,14 @@ void SkBaseDevice::drawTextBlob(const SkTextBlob* blob, SkScalar x, SkScalar y, glyphRunList.temporaryShuntToDrawPosText(this, SkPoint::Make(0, 0)); } break; - case SkTextBlob::kHorizontal_Positioning: + case SkTextBlobRunIterator::kHorizontal_Positioning: this->drawPosText(it.glyphs(), textLen, it.pos(), 1, SkPoint::Make(x, y + offset.y()), runPaint); break; - case SkTextBlob::kFull_Positioning: + case SkTextBlobRunIterator::kFull_Positioning: this->drawPosText(it.glyphs(), textLen, it.pos(), 2, SkPoint::Make(x, y), runPaint); break; - default: - SK_ABORT("unhandled positioning mode"); } } } diff --git a/src/core/SkGlyphRun.cpp b/src/core/SkGlyphRun.cpp index ca52289ea9..7683325c5b 100644 --- a/src/core/SkGlyphRun.cpp +++ b/src/core/SkGlyphRun.cpp @@ -24,7 +24,7 @@ #include "SkRasterClip.h" #include "SkStrikeCache.h" #include "SkTextBlob.h" -#include "SkTextBlobRunIterator.h" +#include "SkTextBlobPriv.h" #include "SkTo.h" #include "SkUtils.h" @@ -503,14 +503,14 @@ void SkGlyphRunBuilder::drawTextBlob(const SkPaint& paint, const SkTextBlob& blo size_t uniqueGlyphIDsSize = 0; switch (it.positioning()) { - case SkTextBlob::kDefault_Positioning: { + case SkTextBlobRunIterator::kDefault_Positioning: { uniqueGlyphIDsSize = this->simplifyDrawText( runPaint, glyphIDs, offset, currentDenseIndices, currentUniqueGlyphIDs, currentPositions, text, clusters); } break; - case SkTextBlob::kHorizontal_Positioning: { + case SkTextBlobRunIterator::kHorizontal_Positioning: { auto constY = offset.y(); uniqueGlyphIDsSize = this->simplifyDrawPosTextH( runPaint, glyphIDs, it.pos(), constY, @@ -518,14 +518,12 @@ void SkGlyphRunBuilder::drawTextBlob(const SkPaint& paint, const SkTextBlob& blo text, clusters); } break; - case SkTextBlob::kFull_Positioning: + case SkTextBlobRunIterator::kFull_Positioning: uniqueGlyphIDsSize = this->simplifyDrawPosText( runPaint, glyphIDs, (const SkPoint*)it.pos(), currentDenseIndices, currentUniqueGlyphIDs, currentPositions, text, clusters); break; - default: - SK_ABORT("unhandled positioning mode"); } currentDenseIndices += runSize; diff --git a/src/core/SkGlyphRun.h b/src/core/SkGlyphRun.h index b2d1aad265..1456e6c290 100644 --- a/src/core/SkGlyphRun.h +++ b/src/core/SkGlyphRun.h @@ -19,7 +19,7 @@ #include "SkPoint.h" #include "SkSurfaceProps.h" #include "SkTemplates.h" -#include "SkTextBlob.h" +#include "SkTextBlobPriv.h" #include "SkTypes.h" class SkBaseDevice; @@ -203,7 +203,9 @@ public: const SkScalar* pos() const { return (const SkScalar*)fList[fIndex].positions().data(); } const SkPoint& offset() const { return fZero; } void applyFontToPaint(SkPaint* paint) const { *paint = fList[fIndex].paint(); } - SkTextBlob::GlyphPositioning positioning() const { return SkTextBlob::kFull_Positioning; } + SkTextBlobRunIterator::GlyphPositioning positioning() const { + return SkTextBlobRunIterator::kFull_Positioning; + } const uint32_t* clusters() const { return fList[fIndex].clusters().data(); } uint32_t textSize() const { return fList[fIndex].text().size(); } const char* text() const { return fList[fIndex].text().data(); } diff --git a/src/core/SkOverdrawCanvas.cpp b/src/core/SkOverdrawCanvas.cpp index 35656e0829..249723e494 100644 --- a/src/core/SkOverdrawCanvas.cpp +++ b/src/core/SkOverdrawCanvas.cpp @@ -19,7 +19,7 @@ #include "SkRSXform.h" #include "SkStrikeCache.h" #include "SkTextBlob.h" -#include "SkTextBlobRunIterator.h" +#include "SkTextBlobPriv.h" #include "SkTo.h" namespace { @@ -154,20 +154,17 @@ void SkOverdrawCanvas::onDrawTextBlob(const SkTextBlob* blob, SkScalar x, SkScal const SkPoint& offset = it.offset(); it.applyFontToPaint(&runPaint); switch (it.positioning()) { - case SkTextBlob::kDefault_Positioning: + case SkTextBlobRunIterator::kDefault_Positioning: this->onDrawText(it.glyphs(), textLen, x + offset.x(), y + offset.y(), runPaint); break; - case SkTextBlob::kHorizontal_Positioning: + case SkTextBlobRunIterator::kHorizontal_Positioning: this->drawPosTextCommon(it.glyphs(), textLen, it.pos(), 1, SkPoint::Make(x, y + offset.y()), runPaint); break; - case SkTextBlob::kFull_Positioning: + case SkTextBlobRunIterator::kFull_Positioning: this->drawPosTextCommon(it.glyphs(), textLen, it.pos(), 2, SkPoint::Make(x, y), runPaint); break; - default: - SkASSERT(false); - break; } } } diff --git a/src/core/SkPaint.cpp b/src/core/SkPaint.cpp index 0fdf58b6e5..9b8431e591 100644 --- a/src/core/SkPaint.cpp +++ b/src/core/SkPaint.cpp @@ -33,7 +33,7 @@ #include "SkSurfacePriv.h" #include "SkTLazy.h" #include "SkTextBlob.h" -#include "SkTextBlobRunIterator.h" +#include "SkTextBlobPriv.h" #include "SkTextFormatParams.h" #include "SkTextToPathIter.h" #include "SkTo.h" @@ -1095,15 +1095,15 @@ int SkPaint::getTextBlobIntercepts(const SkTextBlob* blob, const SkScalar bounds SkScalar* runIntervals = intervals ? intervals + count : nullptr; switch (it.positioning()) { - case SkTextBlob::kDefault_Positioning: + case SkTextBlobRunIterator::kDefault_Positioning: count += runPaint.getTextIntercepts(it.glyphs(), runByteCount, it.offset().x(), it.offset().y(), bounds, runIntervals); break; - case SkTextBlob::kHorizontal_Positioning: + case SkTextBlobRunIterator::kHorizontal_Positioning: count += runPaint.getPosTextHIntercepts(it.glyphs(), runByteCount, it.pos(), it.offset().y(), bounds, runIntervals); break; - case SkTextBlob::kFull_Positioning: + case SkTextBlobRunIterator::kFull_Positioning: count += runPaint.getPosTextIntercepts(it.glyphs(), runByteCount, reinterpret_cast(it.pos()), bounds, runIntervals); diff --git a/src/core/SkRemoteGlyphCache.cpp b/src/core/SkRemoteGlyphCache.cpp index 58422627f5..9aa43ad049 100644 --- a/src/core/SkRemoteGlyphCache.cpp +++ b/src/core/SkRemoteGlyphCache.cpp @@ -267,7 +267,7 @@ private: FAIL_AND_RETURN } - if (it.positioning() == SkTextBlob::kDefault_Positioning) { + if (it.positioning() == SkTextBlobRunIterator::kDefault_Positioning) { // Default positioning needs advances. Can't do that. TRACE_EVENT0("skia", "kDefault_Positioning"); FAIL_AND_RETURN @@ -291,13 +291,13 @@ private: SkSTArenaAlloc<120> arena; SkFindAndPlaceGlyph::MapperInterface* mapper = nullptr; switch (it.positioning()) { - case SkTextBlob::kHorizontal_Positioning: + case SkTextBlobRunIterator::kHorizontal_Positioning: posFn = [](int index, const SkScalar* pos) { return SkPoint{pos[index], 0}; }; mapper = SkFindAndPlaceGlyph::CreateMapper( runMatrix, SkPoint::Make(position.x(), position.y() + it.offset().y()), 1, &arena); break; - case SkTextBlob::kFull_Positioning: + case SkTextBlobRunIterator::kFull_Positioning: posFn = [](int index, const SkScalar* pos) { return SkPoint{pos[2 * index], pos[2 * index + 1]}; }; diff --git a/src/core/SkTextBlob.cpp b/src/core/SkTextBlob.cpp index fcaeec8613..72e7da8011 100644 --- a/src/core/SkTextBlob.cpp +++ b/src/core/SkTextBlob.cpp @@ -5,7 +5,7 @@ * found in the LICENSE file. */ -#include "SkTextBlobRunIterator.h" +#include "SkTextBlob.h" #include "SkGlyphRun.h" #include "SkPaintPriv.h" @@ -333,7 +333,7 @@ namespace { union PositioningAndExtended { int32_t intValue; struct { - SkTextBlob::GlyphPositioning positioning; + uint8_t positioning; uint8_t extended; uint16_t padding; }; @@ -343,6 +343,12 @@ static_assert(sizeof(PositioningAndExtended) == sizeof(int32_t), ""); } // namespace +enum SkTextBlob::GlyphPositioning : uint8_t { + kDefault_Positioning = 0, // Default glyph advances -- zero scalars per glyph. + kHorizontal_Positioning = 1, // Horizontal positioning -- one scalar per glyph. + kFull_Positioning = 2 // Point positioning -- two scalars per glyph. +}; + unsigned SkTextBlob::ScalarsPerGlyph(GlyphPositioning pos) { // GlyphPositioning values are directly mapped to scalars-per-glyph. SkASSERT(pos <= 2); @@ -400,9 +406,16 @@ const SkPoint& SkTextBlobRunIterator::offset() const { return fCurrentRun->offset(); } -SkTextBlob::GlyphPositioning SkTextBlobRunIterator::positioning() const { +SkTextBlobRunIterator::GlyphPositioning SkTextBlobRunIterator::positioning() const { SkASSERT(!this->done()); - return fCurrentRun->positioning(); + static_assert(static_cast(SkTextBlob::kDefault_Positioning) == + kDefault_Positioning, ""); + static_assert(static_cast(SkTextBlob::kHorizontal_Positioning) == + kHorizontal_Positioning, ""); + static_assert(static_cast(SkTextBlob::kFull_Positioning) == + kFull_Positioning, ""); + + return SkTo(fCurrentRun->positioning()); } void SkTextBlobRunIterator::applyFontToPaint(SkPaint* paint) const { @@ -792,7 +805,8 @@ void SkTextBlobPriv::Flatten(const SkTextBlob& blob, SkWriteBuffer& buffer) { buffer.writeByteArray(it.glyphs(), it.glyphCount() * sizeof(uint16_t)); buffer.writeByteArray(it.pos(), it.glyphCount() * sizeof(SkScalar) * - SkTextBlob::ScalarsPerGlyph(it.positioning())); + SkTextBlob::ScalarsPerGlyph( + SkTo(it.positioning()))); if (pe.extended) { buffer.writeByteArray(it.clusters(), sizeof(uint32_t) * it.glyphCount()); buffer.writeByteArray(it.text(), it.textSize()); @@ -820,7 +834,7 @@ sk_sp SkTextBlobPriv::MakeFromBuffer(SkReadBuffer& reader) { PositioningAndExtended pe; pe.intValue = reader.read32(); - SkTextBlob::GlyphPositioning pos = pe.positioning; + const auto pos = SkTo(pe.positioning); if (glyphCount <= 0 || pos > SkTextBlob::kFull_Positioning) { return nullptr; } diff --git a/src/core/SkTextBlobPriv.h b/src/core/SkTextBlobPriv.h index 70fdf5a57e..bec6b882a0 100644 --- a/src/core/SkTextBlobPriv.h +++ b/src/core/SkTextBlobPriv.h @@ -30,4 +30,41 @@ public: static sk_sp MakeFromBuffer(SkReadBuffer&); }; +/** + * Iterate through all of the text runs of the text blob. For example: + * for (SkTextBlobRunIterator it(blob); !it.done(); it.next()) { + * ..... + * } + */ +class SkTextBlobRunIterator { +public: + SkTextBlobRunIterator(const SkTextBlob* blob); + + enum GlyphPositioning : uint8_t { + kDefault_Positioning = 0, // Default glyph advances -- zero scalars per glyph. + kHorizontal_Positioning = 1, // Horizontal positioning -- one scalar per glyph. + kFull_Positioning = 2 // Point positioning -- two scalars per glyph. + }; + + bool done() const; + void next(); + + uint32_t glyphCount() const; + const uint16_t* glyphs() const; + const SkScalar* pos() const; + const SkPoint& offset() const; + void applyFontToPaint(SkPaint*) const; + GlyphPositioning positioning() const; + uint32_t* clusters() const; + uint32_t textSize() const; + char* text() const; + + bool isLCD() const; + +private: + const SkTextBlob::RunRecord* fCurrentRun; + + SkDEBUGCODE(uint8_t* fStorageTop;) +}; + #endif // SkTextBlobPriv_DEFINED diff --git a/src/core/SkTextBlobRunIterator.h b/src/core/SkTextBlobRunIterator.h deleted file mode 100644 index 18f41d7dcb..0000000000 --- a/src/core/SkTextBlobRunIterator.h +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright 2015 Google Inc. - * - * Use of this source code is governed by a BSD-style license that can be - * found in the LICENSE file. - */ -#ifndef SkTextBlobRunIterator_DEFINED -#define SkTextBlobRunIterator_DEFINED - -#include "SkTextBlob.h" - -/** - * Iterate through all of the text runs of the text blob. For example: - * for (SkTextBlobRunIterator it(blob); !it.done(); it.next()) { - * ..... - * } - */ -class SkTextBlobRunIterator { -public: - SkTextBlobRunIterator(const SkTextBlob* blob); - - bool done() const; - void next(); - - uint32_t glyphCount() const; - const uint16_t* glyphs() const; - const SkScalar* pos() const; - const SkPoint& offset() const; - void applyFontToPaint(SkPaint*) const; - SkTextBlob::GlyphPositioning positioning() const; - uint32_t* clusters() const; - uint32_t textSize() const; - char* text() const; - - bool isLCD() const; - -private: - const SkTextBlob::RunRecord* fCurrentRun; - - SkDEBUGCODE(uint8_t* fStorageTop;) -}; - -#endif // SkTextBlobRunIterator_DEFINED diff --git a/src/gpu/text/GrTextBlob.cpp b/src/gpu/text/GrTextBlob.cpp index 7b4507eab0..6bd4c1c3bb 100644 --- a/src/gpu/text/GrTextBlob.cpp +++ b/src/gpu/text/GrTextBlob.cpp @@ -14,7 +14,6 @@ #include "SkGlyphCache.h" #include "SkMaskFilterBase.h" #include "SkPaintPriv.h" -#include "SkTextBlobRunIterator.h" #include "SkTextToPathIter.h" #include "ops/GrAtlasTextOp.h" #include diff --git a/src/gpu/text/GrTextBlobCache.h b/src/gpu/text/GrTextBlobCache.h index 110e0ad7fc..fe245c99d3 100644 --- a/src/gpu/text/GrTextBlobCache.h +++ b/src/gpu/text/GrTextBlobCache.h @@ -12,7 +12,7 @@ #include "SkMessageBus.h" #include "SkRefCnt.h" #include "SkTArray.h" -#include "SkTextBlobRunIterator.h" +#include "SkTextBlobPriv.h" #include "SkTHash.h" class GrTextBlobCache { diff --git a/src/gpu/text/GrTextContext.cpp b/src/gpu/text/GrTextContext.cpp index aeb99f1548..d57055a511 100644 --- a/src/gpu/text/GrTextContext.cpp +++ b/src/gpu/text/GrTextContext.cpp @@ -196,7 +196,7 @@ void GrTextContext::regenerateGlyphRunList(GrTextBlob* cacheBlob, } cacheBlob->setRunPaintFlags(run, runPaint.skPaint().getFlags()); - SkASSERT(it.positioning() == SkTextBlob::kFull_Positioning); + SkASSERT(it.positioning() == SkTextBlobRunIterator::kFull_Positioning); if (CanDrawAsDistanceFields(runPaint, viewMatrix, props, shaderCaps.supportsDistanceFieldText(), fOptions)) { this->drawDFPosText(cacheBlob, run, glyphCache, props, runPaint, diff --git a/src/gpu/text/GrTextContext.h b/src/gpu/text/GrTextContext.h index aa4626e411..0093f846b4 100644 --- a/src/gpu/text/GrTextContext.h +++ b/src/gpu/text/GrTextContext.h @@ -12,7 +12,6 @@ #include "GrDistanceFieldAdjustTable.h" #include "GrGeometryProcessor.h" #include "GrTextUtils.h" -#include "SkTextBlobRunIterator.h" #if GR_TEST_UTILS #include "GrDrawOpTest.h" diff --git a/src/gpu/text/GrTextUtils.cpp b/src/gpu/text/GrTextUtils.cpp index ec5389c464..ba033aaaa5 100644 --- a/src/gpu/text/GrTextUtils.cpp +++ b/src/gpu/text/GrTextUtils.cpp @@ -10,7 +10,6 @@ #include "SkGlyphCache.h" #include "SkGr.h" #include "SkPaint.h" -#include "SkTextBlobRunIterator.h" void GrTextUtils::Paint::initFilteredColor() { GrColor4f filteredColor = SkColorToUnpremulGrColor4f(fPaint->getColor(), *fDstColorSpaceInfo); diff --git a/src/pdf/SkPDFDevice.cpp b/src/pdf/SkPDFDevice.cpp index cdaeef0418..9cd2892a05 100644 --- a/src/pdf/SkPDFDevice.cpp +++ b/src/pdf/SkPDFDevice.cpp @@ -43,7 +43,7 @@ #include "SkString.h" #include "SkSurface.h" #include "SkTemplates.h" -#include "SkTextBlobRunIterator.h" +#include "SkTextBlob.h" #include "SkTextFormatParams.h" #include "SkTo.h" #include "SkUtils.h" diff --git a/src/pdf/SkPDFDevice.h b/src/pdf/SkPDFDevice.h index 2075202cb9..7bd1a0ee11 100644 --- a/src/pdf/SkPDFDevice.h +++ b/src/pdf/SkPDFDevice.h @@ -19,7 +19,7 @@ #include "SkSinglyLinkedList.h" #include "SkStream.h" #include "SkTDArray.h" -#include "SkTextBlob.h" +#include "SkTextBlobPriv.h" #include "SkKeyedImage.h" class SkGlyphRunList; @@ -241,7 +241,6 @@ private: int getFontResourceIndex(SkTypeface* typeface, uint16_t glyphID); - void internalDrawGlyphRun(const SkGlyphRun& glyphRun, SkPoint offset); void internalDrawPaint(const SkPaint& paint, ContentEntry* contentEntry); -- cgit v1.2.3