1 /**************************************************************
2 *
3 * Licensed to the Apache Software Foundation (ASF) under one
4 * or more contributor license agreements. See the NOTICE file
5 * distributed with this work for additional information
6 * regarding copyright ownership. The ASF licenses this file
7 * to you under the Apache License, Version 2.0 (the
8 * "License"); you may not use this file except in compliance
9 * with the License. You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing,
14 * software distributed under the License is distributed on an
15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16 * KIND, either express or implied. See the License for the
17 * specific language governing permissions and limitations
18 * under the License.
19 *
20 *************************************************************/
21
22
23
24 #ifndef _SV_GCACHFTYP_HXX
25 #define _SV_GCACHFTYP_HXX
26
27 #include <glyphcache.hxx>
28 #include <rtl/textcvt.h>
29
30 #include <ft2build.h>
31 #include FT_FREETYPE_H
32
33 class FreetypeServerFont;
34 struct FT_GlyphRec_;
35
36 // -----------------------------------------------------------------------
37
38 // FtFontFile has the responsibility that a font file is only mapped once.
39 // (#86621#) the old directly ft-managed solution caused it to be mapped
40 // in up to nTTC*nSizes*nOrientation*nSynthetic times
41 class FtFontFile
42 {
43 public:
44 static FtFontFile* FindFontFile( const ::rtl::OString& rNativeFileName );
45
46 bool Map();
47 void Unmap();
48
GetBuffer() const49 const unsigned char* GetBuffer() const { return mpFileMap; }
GetFileSize() const50 int GetFileSize() const { return mnFileSize; }
GetFileName() const51 const ::rtl::OString* GetFileName() const { return &maNativeFileName; }
GetLangBoost() const52 int GetLangBoost() const { return mnLangBoost; }
53
54 private:
55 FtFontFile( const ::rtl::OString& rNativeFileName );
56
57 const ::rtl::OString maNativeFileName;
58 const unsigned char* mpFileMap;
59 int mnFileSize;
60 int mnRefCount;
61 int mnLangBoost;
62 };
63
64 // -----------------------------------------------------------------------
65
66 // FtFontInfo corresponds to an unscaled font face
67 class FtFontInfo
68 {
69 public:
70 FtFontInfo( const ImplDevFontAttributes&,
71 const ::rtl::OString& rNativeFileName,
72 int nFaceNum, sal_IntPtr nFontId, int nSynthetic,
73 const ExtraKernInfo* );
74 ~FtFontInfo();
75
76 const unsigned char* GetTable( const char*, sal_uLong* pLength=0 ) const;
77
78 FT_FaceRec_* GetFaceFT();
79 void ReleaseFaceFT( FT_FaceRec_* );
80
GetFontFileName() const81 const ::rtl::OString* GetFontFileName() const { return mpFontFile->GetFileName(); }
GetFaceNum() const82 int GetFaceNum() const { return mnFaceNum; }
GetSynthetic() const83 int GetSynthetic() const { return mnSynthetic; }
GetFontId() const84 sal_IntPtr GetFontId() const { return mnFontId; }
IsSymbolFont() const85 bool IsSymbolFont() const { return maDevFontAttributes.IsSymbolFont(); }
GetFontAttributes() const86 const ImplFontAttributes& GetFontAttributes() const { return maDevFontAttributes; }
87
88 void AnnounceFont( ImplDevFontList* );
89
90 int GetGlyphIndex( sal_UCS4 cChar ) const;
91 void CacheGlyphIndex( sal_UCS4 cChar, int nGI ) const;
92
93 bool GetFontCodeRanges( CmapResult& ) const;
94 const ImplFontCharMap* GetImplFontCharMap( void );
95
96 bool HasExtraKerning() const;
97 int GetExtraKernPairs( ImplKernPairData** ) const;
98 int GetExtraGlyphKernValue( int nLeftGlyph, int nRightGlyph ) const;
99
100 private:
101 FT_FaceRec_* maFaceFT;
102 FtFontFile* mpFontFile;
103 const int mnFaceNum;
104 int mnRefCount;
105 const int mnSynthetic;
106
107 sal_IntPtr mnFontId;
108 ImplDevFontAttributes maDevFontAttributes;
109
110 const ImplFontCharMap* mpFontCharMap;
111
112 // cache unicode->glyphid mapping because looking it up is expensive
113 // TODO: change to hash_multimap when a use case requires a m:n mapping
114 typedef ::std::hash_map<int,int> Int2IntMap;
115 mutable Int2IntMap* mpChar2Glyph;
116 mutable Int2IntMap* mpGlyph2Char;
117 void InitHashes() const;
118
119 const ExtraKernInfo* mpExtraKernInfo;
120 };
121
122 // these two inlines are very important for performance
123
GetGlyphIndex(sal_UCS4 cChar) const124 inline int FtFontInfo::GetGlyphIndex( sal_UCS4 cChar ) const
125 {
126 if( !mpChar2Glyph )
127 return -1;
128 Int2IntMap::const_iterator it = mpChar2Glyph->find( cChar );
129 if( it == mpChar2Glyph->end() )
130 return -1;
131 return it->second;
132 }
133
CacheGlyphIndex(sal_UCS4 cChar,int nIndex) const134 inline void FtFontInfo::CacheGlyphIndex( sal_UCS4 cChar, int nIndex ) const
135 {
136 if( !mpChar2Glyph )
137 InitHashes();
138 (*mpChar2Glyph)[ cChar ] = nIndex;
139 (*mpGlyph2Char)[ nIndex ] = cChar;
140 }
141
142 // -----------------------------------------------------------------------
143
144 class FreetypeManager
145 {
146 public:
147 FreetypeManager();
148 ~FreetypeManager();
149
150 long AddFontDir( const String& rUrlName );
151 void AddFontFile( const rtl::OString& rNormalizedName,
152 int nFaceNum, sal_IntPtr nFontId, const ImplDevFontAttributes&,
153 const ExtraKernInfo* );
154 void AnnounceFonts( ImplDevFontList* ) const;
155 void ClearFontList();
156
157 FreetypeServerFont* CreateFont( const ImplFontSelectData& );
158
159 private:
160 typedef ::std::hash_map<sal_IntPtr,FtFontInfo*> FontList;
161 FontList maFontList;
162
163 sal_IntPtr mnMaxFontId;
164 sal_IntPtr mnNextFontId;
165 };
166
167 // -----------------------------------------------------------------------
168
169 class FreetypeServerFont : public ServerFont
170 {
171 public:
172 FreetypeServerFont( const ImplFontSelectData&, FtFontInfo* );
173 virtual ~FreetypeServerFont();
174
GetFontFileName() const175 virtual const ::rtl::OString* GetFontFileName() const { return mpFontInfo->GetFontFileName(); }
GetFontFaceNum() const176 virtual int GetFontFaceNum() const { return mpFontInfo->GetFaceNum(); }
177 virtual bool TestFont() const;
178 virtual void* GetFtFace() const;
179 virtual void SetFontOptions( const ImplFontOptions&);
GetLoadFlags() const180 virtual int GetLoadFlags() const { return (mnLoadFlags & ~FT_LOAD_IGNORE_TRANSFORM); }
NeedsArtificialBold() const181 virtual bool NeedsArtificialBold() const { return mbArtBold; }
NeedsArtificialItalic() const182 virtual bool NeedsArtificialItalic() const { return mbArtItalic; }
183
184 virtual void FetchFontMetric( ImplFontMetricData&, long& rFactor ) const;
185 virtual const ImplFontCharMap* GetImplFontCharMap( void ) const;
186
187 virtual sal_GlyphId GetGlyphIndex( sal_UCS4 ) const;
188 sal_GlyphId GetRawGlyphIndex( sal_UCS4 ) const;
189 sal_GlyphId FixupGlyphIndex( sal_GlyphId, sal_UCS4 ) const;
190
191 virtual bool GetAntialiasAdvice( void ) const;
192 virtual bool GetGlyphBitmap1( sal_GlyphId, RawBitmap& ) const;
193 virtual bool GetGlyphBitmap8( sal_GlyphId, RawBitmap& ) const;
194 virtual bool GetGlyphOutline( sal_GlyphId, ::basegfx::B2DPolyPolygon& ) const;
195 virtual int GetGlyphKernValue( int nLeftGlyph, int nRightGlyph ) const;
196 virtual sal_uLong GetKernPairs( ImplKernPairData** ) const;
197
GetTable(const char * pName,sal_uLong * pLength)198 const unsigned char* GetTable( const char* pName, sal_uLong* pLength )
199 { return mpFontInfo->GetTable( pName, pLength ); }
200 int GetEmUnits() const;
GetMetricsFT() const201 const FT_Size_Metrics& GetMetricsFT() const { return maSizeFT->metrics; }
202
203 protected:
204 friend class GlyphCache;
205
206 int ApplyGlyphTransform( int nGlyphFlags, FT_GlyphRec_*, bool ) const;
207 virtual void InitGlyphData( sal_GlyphId, GlyphData& ) const;
208 bool ApplyGSUB( const ImplFontSelectData& );
209 virtual ServerFontLayoutEngine* GetLayoutEngine();
210
211 private:
212 int mnWidth;
213 int mnPrioEmbedded;
214 int mnPrioAntiAlias;
215 int mnPrioAutoHint;
216 FtFontInfo* mpFontInfo;
217 FT_Int mnLoadFlags;
218 double mfStretch;
219 FT_FaceRec_* maFaceFT;
220 FT_SizeRec_* maSizeFT;
221
222 bool mbFaceOk;
223 bool mbArtItalic;
224 bool mbArtBold;
225 bool mbUseGamma;
226
227 typedef ::std::hash_map<int,int> GlyphSubstitution;
228 GlyphSubstitution maGlyphSubstitution;
229 rtl_UnicodeToTextConverter maRecodeConverter;
230
231 ServerFontLayoutEngine* mpLayoutEngine;
232 };
233
234 // -----------------------------------------------------------------------
235
236 class ImplFTSFontData : public ImplFontData
237 {
238 private:
239 FtFontInfo* mpFtFontInfo;
240 enum { IFTSFONT_MAGIC = 0x1F150A1C };
241
242 public:
243 ImplFTSFontData( FtFontInfo*, const ImplDevFontAttributes& );
244
GetFtFontInfo() const245 FtFontInfo* GetFtFontInfo() const { return mpFtFontInfo; }
246
247 virtual ImplFontEntry* CreateFontInstance( ImplFontSelectData& ) const;
Clone() const248 virtual ImplFontData* Clone() const { return new ImplFTSFontData( *this ); }
GetFontId() const249 virtual sal_IntPtr GetFontId() const { return mpFtFontInfo->GetFontId(); }
250
CheckFontData(const ImplFontData & r)251 static bool CheckFontData( const ImplFontData& r ) { return r.CheckMagic( IFTSFONT_MAGIC ); }
252 };
253
254 // -----------------------------------------------------------------------
255
256 #endif // _SV_GCACHFTYP_HXX
257