1 /* 2 * Copyright 2006-2012 The Android Open Source Project 3 * Copyright 2012 Mozilla Foundation 4 * 5 * Use of this source code is governed by a BSD-style license that can be 6 * found in the LICENSE file. 7 */ 8 9 #ifndef SKFONTHOST_FREETYPE_COMMON_H_ 10 #define SKFONTHOST_FREETYPE_COMMON_H_ 11 12 #include "SkGlyph.h" 13 #include "SkMutex.h" 14 #include "SkScalerContext.h" 15 #include "SkTypeface.h" 16 #include "SkTypes.h" 17 18 #include "SkFontMgr.h" 19 20 // These are forward declared to avoid pimpl but also hide the FreeType implementation. 21 typedef struct FT_LibraryRec_* FT_Library; 22 typedef struct FT_FaceRec_* FT_Face; 23 typedef struct FT_StreamRec_* FT_Stream; 24 typedef signed long FT_Pos; 25 26 27 #ifdef SK_DEBUG 28 const char* SkTraceFtrGetError(int); 29 #define SK_TRACEFTR(ERR, MSG, ...) \ 30 SkDebugf("%s:%lu:1: error: 0x%x '%s' " MSG "\n", __FILE__, __LINE__, ERR, \ 31 SkTraceFtrGetError((int)(ERR)), __VA_ARGS__) 32 #else 33 #define SK_TRACEFTR(ERR, ...) do { sk_ignore_unused_variable(ERR); } while (false) 34 #endif 35 36 37 class SkScalerContext_FreeType_Base : public SkScalerContext { 38 protected: 39 // See http://freetype.sourceforge.net/freetype2/docs/reference/ft2-bitmap_handling.html#FT_Bitmap_Embolden 40 // This value was chosen by eyeballing the result in Firefox and trying to match it. 41 static const FT_Pos kBitmapEmboldenStrength = 1 << 6; 42 43 SkScalerContext_FreeType_Base(sk_sp<SkTypeface> typeface, const SkScalerContextEffects& effects, 44 const SkDescriptor *desc) 45 : INHERITED(std::move(typeface), effects, desc) 46 {} 47 48 void generateGlyphImage(FT_Face face, const SkGlyph& glyph, const SkMatrix& bitmapTransform); 49 void generateGlyphPath(FT_Face face, SkPath* path); 50 private: 51 typedef SkScalerContext INHERITED; 52 }; 53 54 class SkTypeface_FreeType : public SkTypeface { 55 public: 56 /** For SkFontMgrs to make use of our ability to extract 57 * name and style from a stream, using FreeType's API. 58 */ 59 class Scanner : ::SkNoncopyable { 60 public: 61 Scanner(); 62 ~Scanner(); 63 struct AxisDefinition { 64 SkFourByteTag fTag; 65 SkFixed fMinimum; 66 SkFixed fDefault; 67 SkFixed fMaximum; 68 }; 69 using AxisDefinitions = SkSTArray<4, AxisDefinition, true>; 70 bool recognizedFont(SkStreamAsset* stream, int* numFonts) const; 71 bool scanFont(SkStreamAsset* stream, int ttcIndex, 72 SkString* name, SkFontStyle* style, bool* isFixedPitch, 73 AxisDefinitions* axes) const; 74 static void computeAxisValues( 75 AxisDefinitions axisDefinitions, 76 const SkFontArguments::VariationPosition position, 77 SkFixed* axisValues, 78 const SkString& name); 79 80 private: 81 FT_Face openFace(SkStreamAsset* stream, int ttcIndex, FT_Stream ftStream) const; 82 FT_Library fLibrary; 83 mutable SkMutex fLibraryMutex; 84 }; 85 86 protected: 87 SkTypeface_FreeType(const SkFontStyle& style, bool isFixedPitch) 88 : INHERITED(style, isFixedPitch) 89 {} 90 91 virtual SkScalerContext* onCreateScalerContext(const SkScalerContextEffects&, 92 const SkDescriptor*) const override; 93 void onFilterRec(SkScalerContextRec*) const override; 94 std::unique_ptr<SkAdvancedTypefaceMetrics> onGetAdvancedMetrics() const override; 95 int onGetUPEM() const override; 96 bool onGetKerningPairAdjustments(const uint16_t glyphs[], int count, 97 int32_t adjustments[]) const override; 98 int onCharsToGlyphs(const void* chars, Encoding, uint16_t glyphs[], 99 int glyphCount) const override; 100 int onCountGlyphs() const override; 101 102 LocalizedStrings* onCreateFamilyNameIterator() const override; 103 104 int onGetVariationDesignPosition(SkFontArguments::VariationPosition::Coordinate coordinates[], 105 int coordinateCount) const override; 106 int onGetTableTags(SkFontTableTag tags[]) const override; 107 size_t onGetTableData(SkFontTableTag, size_t offset, 108 size_t length, void* data) const override; 109 110 private: 111 typedef SkTypeface INHERITED; 112 }; 113 114 #endif // SKFONTHOST_FREETYPE_COMMON_H_ 115