/* * Copyright 2019 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #ifndef SkStrikeSpec_DEFINED #define SkStrikeSpec_DEFINED #include "src/core/SkDescriptor.h" #include "src/core/SkStrikeCache.h" #include "src/core/SkStrikeForGPU.h" #if SK_SUPPORT_GPU #include "src/gpu/text/GrTextContext.h" class GrStrikeCache; class GrTextStrike; #endif class SkFont; class SkPaint; class SkStrikeCache; class SkSurfaceProps; class SkStrikeSpec { public: // Create a strike spec for mask style cache entries. static SkStrikeSpec MakeMask( const SkFont& font, const SkPaint& paint, const SkSurfaceProps& surfaceProps, SkScalerContextFlags scalerContextFlags, const SkMatrix& deviceMatrix); // Create a strike spec for path style cache entries. static SkStrikeSpec MakePath( const SkFont& font, const SkPaint& paint, const SkSurfaceProps& surfaceProps, SkScalerContextFlags scalerContextFlags); static SkStrikeSpec MakeSourceFallback(const SkFont& font, const SkPaint& paint, const SkSurfaceProps& surfaceProps, SkScalerContextFlags scalerContextFlags, SkScalar maxSourceGlyphDimension); // Create a canonical strike spec for device-less measurements. static SkStrikeSpec MakeCanonicalized( const SkFont& font, const SkPaint* paint = nullptr); // Create a strike spec without a device, and does not switch over to path for large sizes. // This means that strikeToSourceRatio() is always 1. static SkStrikeSpec MakeWithNoDevice(const SkFont& font, const SkPaint* paint = nullptr); // Make a canonical strike spec for device-less measurements using default typeface and size. static SkStrikeSpec MakeDefault(); // Make a strike spec for PDF Vector strikes static SkStrikeSpec MakePDFVector(const SkTypeface& typeface, int* size); #if SK_SUPPORT_GPU // Create a strike spec for scaled distance field text. static std::tuple MakeSDFT( const SkFont& font, const SkPaint& paint, const SkSurfaceProps& surfaceProps, const SkMatrix& deviceMatrix, const GrTextContext::Options& options); sk_sp findOrCreateGrStrike(GrStrikeCache* cache) const; #endif SkScopedStrikeForGPU findOrCreateScopedStrike(SkStrikeForGPUCacheInterface* cache) const; SkExclusiveStrikePtr findOrCreateExclusiveStrike( SkStrikeCache* cache = SkStrikeCache::GlobalStrikeCache()) const; SkScalar strikeToSourceRatio() const { return fStrikeToSourceRatio; } bool isEmpty() const { return SkScalarNearlyZero(fStrikeToSourceRatio); } const SkDescriptor& descriptor() const { return *fAutoDescriptor.getDesc(); } static bool ShouldDrawAsPath(const SkPaint& paint, const SkFont& font, const SkMatrix& matrix); private: void commonSetup( const SkFont& font, const SkPaint& paint, const SkSurfaceProps& surfaceProps, SkScalerContextFlags scalerContextFlags, const SkMatrix& deviceMatrix); SkAutoDescriptor fAutoDescriptor; sk_sp fMaskFilter; sk_sp fPathEffect; sk_sp fTypeface; SkScalar fStrikeToSourceRatio{1.0f}; }; class SkBulkGlyphMetrics { public: explicit SkBulkGlyphMetrics(const SkStrikeSpec& spec); SkSpan glyphs(SkSpan glyphIDs); const SkGlyph* glyph(SkGlyphID glyphID); private: static constexpr int kTypicalGlyphCount = 20; SkAutoSTArray fGlyphs; SkExclusiveStrikePtr fStrike; }; class SkBulkGlyphMetricsAndPaths { public: explicit SkBulkGlyphMetricsAndPaths(const SkStrikeSpec& spec); explicit SkBulkGlyphMetricsAndPaths(SkExclusiveStrikePtr&& strike); SkSpan glyphs(SkSpan glyphIDs); const SkGlyph* glyph(SkGlyphID glyphID); void findIntercepts(const SkScalar bounds[2], SkScalar scale, SkScalar xPos, const SkGlyph* glyph, SkScalar* array, int* count); private: static constexpr int kTypicalGlyphCount = 20; SkAutoSTArray fGlyphs; SkExclusiveStrikePtr fStrike; }; class SkBulkGlyphMetricsAndImages { public: explicit SkBulkGlyphMetricsAndImages(const SkStrikeSpec& spec); explicit SkBulkGlyphMetricsAndImages(SkExclusiveStrikePtr&& strike); SkSpan glyphs(SkSpan packedIDs); const SkGlyph* glyph(SkPackedGlyphID packedID); const SkDescriptor& descriptor() const; private: static constexpr int kTypicalGlyphCount = 64; SkAutoSTArray fGlyphs; SkExclusiveStrikePtr fStrike; }; #endif // SkStrikeSpec_DEFINED