From 5a1368327d01caaf98062efa8823ca5882c2d2bb Mon Sep 17 00:00:00 2001 From: Herb Derby Date: Thu, 28 Oct 2021 13:04:53 -0400 Subject: [PATCH] GrTextBlob: cleanup and update comments Change-Id: I4d7ba9077ea2314d626450e6064de452b8ff1a08 Reviewed-on: https://skia-review.googlesource.com/c/skia/+/464922 Commit-Queue: Herb Derby Reviewed-by: Ben Wagner --- src/gpu/text/GrTextBlob.cpp | 17 ++++++++--------- src/gpu/text/GrTextBlob.h | 32 ++++++++++++++++++-------------- 2 files changed, 26 insertions(+), 23 deletions(-) diff --git a/src/gpu/text/GrTextBlob.cpp b/src/gpu/text/GrTextBlob.cpp index dd60ba8a41..e77f415c9d 100644 --- a/src/gpu/text/GrTextBlob.cpp +++ b/src/gpu/text/GrTextBlob.cpp @@ -70,7 +70,6 @@ struct ARGB3DVertex { }; #if SK_GPU_V1 - AtlasTextOp::MaskType op_mask_type(GrMaskFormat grMaskFormat) { switch (grMaskFormat) { case kA8_GrMaskFormat: return AtlasTextOp::MaskType::kGrayscaleCoverage; @@ -157,7 +156,8 @@ std::tuple check_integer_translate( if (initialMatrix.getScaleX() != drawMatrix.getScaleX() || initialMatrix.getScaleY() != drawMatrix.getScaleY() || initialMatrix.getSkewX() != drawMatrix.getSkewX() || - initialMatrix.getSkewY() != drawMatrix.getSkewY()) { + initialMatrix.getSkewY() != drawMatrix.getSkewY()) + { return {false, {0, 0}}; } @@ -165,7 +165,7 @@ std::tuple check_integer_translate( // blob, but only for integer translations. // Calculate the translation in source space to a translation in device space by mapping // (0, 0) through both the initial matrix and the draw matrix; take the difference. - SkVector translation = drawMatrix.mapXY(0, 0) - initialMatrix.mapXY(0, 0); + SkVector translation = drawMatrix.mapOrigin() - initialMatrix.mapOrigin(); return {SkScalarIsInt(translation.x()) && SkScalarIsInt(translation.y()), translation}; } @@ -563,8 +563,8 @@ GrSubRunOwner DirectMaskSubRun::Make(const SkZip& drawa return nullptr; } - // If some of the glyphs were excluded by the bounds, then this subrun can't be generally be - // used for other draws. Mark the subrun as not general. + // If some glyphs were excluded by the bounds, then this subrun can't be generally be used + // for other draws. Mark the subrun as not general. bool glyphsExcluded = goodPosCount != drawables.size(); SkSpan leftTop{glyphLeftTop, goodPosCount}; return alloc->makeUnique( @@ -572,8 +572,7 @@ GrSubRunOwner DirectMaskSubRun::Make(const SkZip& drawa GlyphVector{strikeSpec, {glyphIDs, goodPosCount}}, glyphsExcluded); } -bool -DirectMaskSubRun::canReuse(const SkPaint& paint, const SkMatrix& drawMatrix) const { +bool DirectMaskSubRun::canReuse(const SkPaint& paint, const SkMatrix& drawMatrix) const { auto [reuse, translation] = check_integer_translate(fBlob->initialMatrix(), drawMatrix); // If glyphs were excluded because of position bounds, then this subrun can only be reused if @@ -722,8 +721,8 @@ DirectMaskSubRun::regenerateAtlas(int begin, int end, GrMeshDrawTarget* target) // The 99% case. No clip. Non-color only. void direct_2D(SkZip quadData, + const GrGlyph*, + const DirectMaskSubRun::DevicePosition> quadData, GrColor color, SkIPoint integralOriginOffset) { for (auto[quad, glyph, leftTop] : quadData) { diff --git a/src/gpu/text/GrTextBlob.h b/src/gpu/text/GrTextBlob.h index 245770ceca..a8e51387d2 100644 --- a/src/gpu/text/GrTextBlob.h +++ b/src/gpu/text/GrTextBlob.h @@ -41,6 +41,14 @@ class SkTextBlobRunIterator; namespace skgpu { namespace v1 { class SurfaceDrawContext; }} +// -- SubRun Discussion ---------------------------------------------------------------------------- +// There are two distinct types of SubRun, those that the GrTextBlob hold in the GrTextBlobCache, +// and those that are not cached at all. The type of SubRun that is not cached has NoCache +// appended to their name such as DirectMaskSubRunNoCache. The type of SubRun that is cached +// provides two interfaces the GrSubRun interface which used by the text blob caching system, and +// the GrAtlasSubRun which allows drawing by the AtlasTextOp system. The *NoCache SubRuns only +// provide the GrAtlasSubRun interface. + // -- GrAtlasSubRun -------------------------------------------------------------------------------- // GrAtlasSubRun is the API that AtlasTextOp uses to generate vertex data for drawing. // There are three different ways GrAtlasSubRun is specialized. @@ -49,10 +57,12 @@ namespace skgpu { namespace v1 { class SurfaceDrawContext; }} // SubRun are in device space. This SubRun handles color glyphs. // * TransformedMaskSubRun - handles glyph where the image in the atlas needs to be // transformed to the screen. It is usually used for large color glyph which can't be -// drawn with paths or scaled distance fields. The destination rectangles are in source -// space. +// drawn with paths or scaled distance fields, but will be used to draw bitmap glyphs to +// the screen, if the matrix does not map 1:1 to the screen. The destination rectangles +// are in source space. // * SDFTSubRun - scaled distance field text handles largish single color glyphs that still // can fit in the atlas; the sizes between direct SubRun, and path SubRun. The destination +// rectangles are in source space. class GrAtlasSubRun; using GrAtlasSubRunOwner = std::unique_ptr; @@ -90,14 +100,13 @@ public: }; // -- GrSubRun ------------------------------------------------------------------------------------- -// GrSubRun is the API the GrTextBlob uses for the SubRun. +// GrSubRun provides an interface used by GrTextBlob to manage the caching system. // There are several types of SubRun, which can be broken into five classes: // * PathSubRun - handle very large single color glyphs using paths to render the glyph. // * DirectMaskSubRun - handle the majority of the glyphs where the cache entry's pixels are in // 1:1 correspondence to the device pixels. // * TransformedMaskSubRun - handle large bitmap/argb glyphs that need to be scaled to the screen. // * SDFTSubRun - use signed distance fields to draw largish glyphs to the screen. -// * GrAtlasSubRun - this is an abstract class used for atlas drawing. class GrSubRun; using GrSubRunOwner = std::unique_ptr; class GrSubRun { @@ -160,7 +169,7 @@ struct GrSubRunList { }; // A GrTextBlob contains a fully processed SkTextBlob, suitable for nearly immediate drawing -// on the GPU. These are initially created with valid positions and colors, but invalid +// on the GPU. These are initially created with valid positions and colors, but with invalid // texture coordinates. // // A GrTextBlob contains a number of SubRuns that are created in the blob's arena. Each SubRun @@ -170,9 +179,9 @@ struct GrSubRunList { // GrGlyph*... | vertexData... | SubRun | GrGlyph*... | vertexData... | SubRun etc. // // In these classes, I'm trying to follow the convention about matrices and origins. -// * draw Matrix|Origin - describes the current draw command. +// * drawMatrix and drawOrigin - describes transformations for the current draw command. // * initial Matrix - describes the combined initial matrix and origin the GrTextBlob was created -// with. +// with. // // class GrTextBlob final : public SkNVRefCnt, public SkGlyphRunPainterInterface { @@ -231,18 +240,13 @@ public: bool hasPerspective() const; const SkMatrix& initialMatrix() const { return fInitialMatrix; } - std::tuple scaleBounds() const { - return {fMaxMinScale, fMinMaxScale}; - } - + std::tuple scaleBounds() const { return {fMaxMinScale, fMinMaxScale}; } bool canReuse(const SkPaint& paint, const SkMatrix& drawMatrix) const; const Key& key() const; size_t size() const; - const GrSubRunList& subRunList() const { - return fSubRunList; - } + const GrSubRunList& subRunList() const { return fSubRunList; } private: GrTextBlob(int allocSize, const SkMatrix& drawMatrix, SkColor initialLuminance);