1 /* 2 * Copyright 2019 Google Inc. 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 8 #ifndef SkStrikeSpec_DEFINED 9 #define SkStrikeSpec_DEFINED 10 11 #include "src/core/SkDescriptor.h" 12 #include "src/core/SkStrikeCache.h" 13 #include "src/core/SkStrikeForGPU.h" 14 15 #if SK_SUPPORT_GPU 16 #include "src/gpu/text/GrTextContext.h" 17 class GrStrikeCache; 18 class GrTextStrike; 19 #endif 20 21 class SkFont; 22 class SkPaint; 23 class SkStrikeCache; 24 class SkSurfaceProps; 25 26 class SkStrikeSpec { 27 public: 28 // Create a strike spec for mask style cache entries. 29 static SkStrikeSpec MakeMask( 30 const SkFont& font, 31 const SkPaint& paint, 32 const SkSurfaceProps& surfaceProps, 33 SkScalerContextFlags scalerContextFlags, 34 const SkMatrix& deviceMatrix); 35 36 // Create a strike spec for path style cache entries. 37 static SkStrikeSpec MakePath( 38 const SkFont& font, 39 const SkPaint& paint, 40 const SkSurfaceProps& surfaceProps, 41 SkScalerContextFlags scalerContextFlags); 42 43 static SkStrikeSpec MakeSourceFallback(const SkFont& font, 44 const SkPaint& paint, 45 const SkSurfaceProps& surfaceProps, 46 SkScalerContextFlags scalerContextFlags, 47 SkScalar maxSourceGlyphDimension); 48 49 // Create a canonical strike spec for device-less measurements. 50 static SkStrikeSpec MakeCanonicalized( 51 const SkFont& font, const SkPaint* paint = nullptr); 52 53 // Create a strike spec without a device, and does not switch over to path for large sizes. 54 // This means that strikeToSourceRatio() is always 1. 55 static SkStrikeSpec MakeWithNoDevice(const SkFont& font, const SkPaint* paint = nullptr); 56 57 // Make a canonical strike spec for device-less measurements using default typeface and size. 58 static SkStrikeSpec MakeDefault(); 59 60 // Make a strike spec for PDF Vector strikes 61 static SkStrikeSpec MakePDFVector(const SkTypeface& typeface, int* size); 62 63 #if SK_SUPPORT_GPU 64 // Create a strike spec for scaled distance field text. 65 static std::tuple<SkStrikeSpec, SkScalar, SkScalar> MakeSDFT( 66 const SkFont& font, 67 const SkPaint& paint, 68 const SkSurfaceProps& surfaceProps, 69 const SkMatrix& deviceMatrix, 70 const GrTextContext::Options& options); 71 72 sk_sp<GrTextStrike> findOrCreateGrStrike(GrStrikeCache* cache) const; 73 #endif 74 75 SkScopedStrikeForGPU findOrCreateScopedStrike(SkStrikeForGPUCacheInterface* cache) const; 76 77 SkExclusiveStrikePtr findOrCreateExclusiveStrike( 78 SkStrikeCache* cache = SkStrikeCache::GlobalStrikeCache()) const; 79 strikeToSourceRatio()80 SkScalar strikeToSourceRatio() const { return fStrikeToSourceRatio; } isEmpty()81 bool isEmpty() const { return SkScalarNearlyZero(fStrikeToSourceRatio); } descriptor()82 const SkDescriptor& descriptor() const { return *fAutoDescriptor.getDesc(); } 83 static bool ShouldDrawAsPath(const SkPaint& paint, const SkFont& font, const SkMatrix& matrix); 84 85 private: 86 void commonSetup( 87 const SkFont& font, 88 const SkPaint& paint, 89 const SkSurfaceProps& surfaceProps, 90 SkScalerContextFlags scalerContextFlags, 91 const SkMatrix& deviceMatrix); 92 93 SkAutoDescriptor fAutoDescriptor; 94 sk_sp<SkMaskFilter> fMaskFilter; 95 sk_sp<SkPathEffect> fPathEffect; 96 sk_sp<SkTypeface> fTypeface; 97 SkScalar fStrikeToSourceRatio{1.0f}; 98 }; 99 100 class SkBulkGlyphMetrics { 101 public: 102 explicit SkBulkGlyphMetrics(const SkStrikeSpec& spec); 103 SkSpan<const SkGlyph*> glyphs(SkSpan<const SkGlyphID> glyphIDs); 104 const SkGlyph* glyph(SkGlyphID glyphID); 105 106 private: 107 static constexpr int kTypicalGlyphCount = 20; 108 SkAutoSTArray<kTypicalGlyphCount, const SkGlyph*> fGlyphs; 109 SkExclusiveStrikePtr fStrike; 110 }; 111 112 class SkBulkGlyphMetricsAndPaths { 113 public: 114 explicit SkBulkGlyphMetricsAndPaths(const SkStrikeSpec& spec); 115 explicit SkBulkGlyphMetricsAndPaths(SkExclusiveStrikePtr&& strike); 116 SkSpan<const SkGlyph*> glyphs(SkSpan<const SkGlyphID> glyphIDs); 117 const SkGlyph* glyph(SkGlyphID glyphID); 118 void findIntercepts(const SkScalar bounds[2], SkScalar scale, SkScalar xPos, 119 const SkGlyph* glyph, SkScalar* array, int* count); 120 121 private: 122 static constexpr int kTypicalGlyphCount = 20; 123 SkAutoSTArray<kTypicalGlyphCount, const SkGlyph*> fGlyphs; 124 SkExclusiveStrikePtr fStrike; 125 }; 126 127 class SkBulkGlyphMetricsAndImages { 128 public: 129 explicit SkBulkGlyphMetricsAndImages(const SkStrikeSpec& spec); 130 explicit SkBulkGlyphMetricsAndImages(SkExclusiveStrikePtr&& strike); 131 SkSpan<const SkGlyph*> glyphs(SkSpan<const SkPackedGlyphID> packedIDs); 132 const SkGlyph* glyph(SkPackedGlyphID packedID); 133 const SkDescriptor& descriptor() const; 134 135 136 private: 137 static constexpr int kTypicalGlyphCount = 64; 138 SkAutoSTArray<kTypicalGlyphCount, const SkGlyph*> fGlyphs; 139 SkExclusiveStrikePtr fStrike; 140 }; 141 142 #endif // SkStrikeSpec_DEFINED 143