|
1 /* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 4 -*- |
|
2 * This Source Code Form is subject to the terms of the Mozilla Public |
|
3 * License, v. 2.0. If a copy of the MPL was not distributed with this |
|
4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ |
|
5 |
|
6 #ifndef GFX_FT2FONTS_H |
|
7 #define GFX_FT2FONTS_H |
|
8 |
|
9 #include "mozilla/MemoryReporting.h" |
|
10 #include "cairo.h" |
|
11 #include "gfxTypes.h" |
|
12 #include "gfxFont.h" |
|
13 #include "gfxFT2FontBase.h" |
|
14 #include "gfxContext.h" |
|
15 #include "gfxFontUtils.h" |
|
16 #include "gfxUserFontSet.h" |
|
17 |
|
18 class FT2FontEntry; |
|
19 |
|
20 class gfxFT2Font : public gfxFT2FontBase { |
|
21 public: // new functions |
|
22 gfxFT2Font(cairo_scaled_font_t *aCairoFont, |
|
23 FT2FontEntry *aFontEntry, |
|
24 const gfxFontStyle *aFontStyle, |
|
25 bool aNeedsBold); |
|
26 virtual ~gfxFT2Font (); |
|
27 |
|
28 FT2FontEntry *GetFontEntry(); |
|
29 |
|
30 static already_AddRefed<gfxFT2Font> |
|
31 GetOrMakeFont(const nsAString& aName, const gfxFontStyle *aStyle, |
|
32 bool aNeedsBold = false); |
|
33 |
|
34 static already_AddRefed<gfxFT2Font> |
|
35 GetOrMakeFont(FT2FontEntry *aFontEntry, const gfxFontStyle *aStyle, |
|
36 bool aNeedsBold = false); |
|
37 |
|
38 struct CachedGlyphData { |
|
39 CachedGlyphData() |
|
40 : glyphIndex(0xffffffffU) { } |
|
41 |
|
42 CachedGlyphData(uint32_t gid) |
|
43 : glyphIndex(gid) { } |
|
44 |
|
45 uint32_t glyphIndex; |
|
46 int32_t lsbDelta; |
|
47 int32_t rsbDelta; |
|
48 int32_t xAdvance; |
|
49 }; |
|
50 |
|
51 const CachedGlyphData* GetGlyphDataForChar(uint32_t ch) { |
|
52 CharGlyphMapEntryType *entry = mCharGlyphCache.PutEntry(ch); |
|
53 |
|
54 if (!entry) |
|
55 return nullptr; |
|
56 |
|
57 if (entry->mData.glyphIndex == 0xffffffffU) { |
|
58 // this is a new entry, fill it |
|
59 FillGlyphDataForChar(ch, &entry->mData); |
|
60 } |
|
61 |
|
62 return &entry->mData; |
|
63 } |
|
64 |
|
65 virtual void AddSizeOfExcludingThis(mozilla::MallocSizeOf aMallocSizeOf, |
|
66 FontCacheSizes* aSizes) const; |
|
67 virtual void AddSizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf, |
|
68 FontCacheSizes* aSizes) const; |
|
69 |
|
70 #ifdef USE_SKIA |
|
71 virtual mozilla::TemporaryRef<mozilla::gfx::GlyphRenderingOptions> GetGlyphRenderingOptions(); |
|
72 #endif |
|
73 |
|
74 protected: |
|
75 virtual bool ShapeText(gfxContext *aContext, |
|
76 const char16_t *aText, |
|
77 uint32_t aOffset, |
|
78 uint32_t aLength, |
|
79 int32_t aScript, |
|
80 gfxShapedText *aShapedText, |
|
81 bool aPreferPlatformShaping); |
|
82 |
|
83 void FillGlyphDataForChar(uint32_t ch, CachedGlyphData *gd); |
|
84 |
|
85 void AddRange(const char16_t *aText, |
|
86 uint32_t aOffset, |
|
87 uint32_t aLength, |
|
88 gfxShapedText *aShapedText); |
|
89 |
|
90 typedef nsBaseHashtableET<nsUint32HashKey, CachedGlyphData> CharGlyphMapEntryType; |
|
91 typedef nsTHashtable<CharGlyphMapEntryType> CharGlyphMap; |
|
92 CharGlyphMap mCharGlyphCache; |
|
93 }; |
|
94 |
|
95 #ifndef ANDROID // not needed on Android, uses the standard gfxFontGroup directly |
|
96 class gfxFT2FontGroup : public gfxFontGroup { |
|
97 public: // new functions |
|
98 gfxFT2FontGroup (const nsAString& families, |
|
99 const gfxFontStyle *aStyle, |
|
100 gfxUserFontSet *aUserFontSet); |
|
101 virtual ~gfxFT2FontGroup (); |
|
102 |
|
103 protected: // from gfxFontGroup |
|
104 |
|
105 virtual gfxFontGroup *Copy(const gfxFontStyle *aStyle); |
|
106 |
|
107 |
|
108 protected: // new functions |
|
109 |
|
110 static bool FontCallback (const nsAString & fontName, |
|
111 const nsACString & genericName, |
|
112 bool aUseFontSet, |
|
113 void *closure); |
|
114 bool mEnableKerning; |
|
115 |
|
116 void GetPrefFonts(nsIAtom *aLangGroup, |
|
117 nsTArray<nsRefPtr<gfxFontEntry> >& aFontEntryList); |
|
118 void GetCJKPrefFonts(nsTArray<nsRefPtr<gfxFontEntry> >& aFontEntryList); |
|
119 void FamilyListToArrayList(const nsString& aFamilies, |
|
120 nsIAtom *aLangGroup, |
|
121 nsTArray<nsRefPtr<gfxFontEntry> > *aFontEntryList); |
|
122 already_AddRefed<gfxFT2Font> WhichFontSupportsChar(const nsTArray<nsRefPtr<gfxFontEntry> >& aFontEntryList, |
|
123 uint32_t aCh); |
|
124 already_AddRefed<gfxFont> WhichPrefFontSupportsChar(uint32_t aCh); |
|
125 already_AddRefed<gfxFont> |
|
126 WhichSystemFontSupportsChar(uint32_t aCh, int32_t aRunScript); |
|
127 |
|
128 nsTArray<gfxTextRange> mRanges; |
|
129 nsString mString; |
|
130 }; |
|
131 #endif // !ANDROID |
|
132 |
|
133 #endif /* GFX_FT2FONTS_H */ |
|
134 |