/* * 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/SkStrikeInterface.h" #if SK_SUPPORT_GPU #include "src/gpu/text/GrStrikeCache.h" #include "src/gpu/text/GrTextContext.h" #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 SkScopedStrike findOrCreateScopedStrike(SkStrikeCacheInterface* cache) const; SkExclusiveStrikePtr findOrCreateExclusiveStrike( SkStrikeCache* cache = SkStrikeCache::GlobalStrikeCache()) const; SkScalar strikeToSourceRatio() const { return 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); private: static constexpr int kTypicalGlyphCount = 20; SkAutoSTArray fGlyphs; SkExclusiveStrikePtr fStrike; }; class SkBulkGlyphMetricsAndPaths { public: explicit SkBulkGlyphMetricsAndPaths(const SkStrikeSpec& spec); SkSpan glyphs(SkSpan glyphIDs); private: static constexpr int kTypicalGlyphCount = 20; SkAutoSTArray fGlyphs; SkExclusiveStrikePtr fStrike; }; class SkBulkGlyphMetricsAndImages { public: explicit SkBulkGlyphMetricsAndImages(const SkStrikeSpec& spec); SkSpan glyphs(SkSpan glyphIDs); private: static constexpr int kTypicalGlyphCount = 20; SkAutoSTArray fGlyphs; SkExclusiveStrikePtr fStrike; }; #endif // SkStrikeSpec_DEFINED