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_GLYPHCACHE_HXX 25 #define _SV_GLYPHCACHE_HXX 26 27 #include <vcl/dllapi.h> 28 29 class GlyphCache; 30 class GlyphMetric; 31 class GlyphData; 32 class ServerFont; 33 class GlyphCachePeer; 34 class ServerFontLayoutEngine; 35 class ServerFontLayout; 36 class ExtraKernInfo; 37 struct ImplKernPairData; 38 class ImplFontOptions; 39 40 #include <tools/gen.hxx> 41 #include <hash_map> 42 #include <hash_set> 43 44 namespace basegfx { class B2DPolyPolygon; } 45 46 class RawBitmap; 47 48 #include <outfont.hxx> 49 #include <impfont.hxx> 50 51 class ServerFontLayout; 52 #include <sallayout.hxx> 53 54 // ======================================================================= 55 56 class VCL_PLUGIN_PUBLIC GlyphCache 57 { 58 public: 59 explicit GlyphCache( GlyphCachePeer& ); 60 /*virtual*/ ~GlyphCache(); 61 62 static GlyphCache& GetInstance(); 63 void LoadFonts(); 64 65 void ClearFontPath(); 66 void AddFontPath( const String& rFontPath ); 67 void AddFontFile( const rtl::OString& rNormalizedName, 68 int nFaceNum, sal_IntPtr nFontId, const ImplDevFontAttributes&, 69 const ExtraKernInfo* = NULL ); 70 void AnnounceFonts( ImplDevFontList* ) const; 71 72 ServerFont* CacheFont( const ImplFontSelectData& ); 73 void UncacheFont( ServerFont& ); 74 void InvalidateAllGlyphs(); 75 76 protected: 77 GlyphCachePeer& mrPeer; 78 79 private: 80 friend class ServerFont; 81 // used by ServerFont class only 82 void AddedGlyph( ServerFont&, GlyphData& ); 83 void RemovingGlyph( ServerFont&, GlyphData&, int nGlyphIndex ); 84 void UsingGlyph( ServerFont&, GlyphData& ); 85 void GrowNotify(); 86 87 private: 88 sal_uLong CalcByteCount() const; 89 void GarbageCollect(); 90 91 // the GlyphCache's FontList matches a font request to a serverfont instance 92 // the FontList key's mpFontData member is reinterpreted as integer font id 93 struct IFSD_Equal{ bool operator()( const ImplFontSelectData&, const ImplFontSelectData& ) const; }; 94 struct IFSD_Hash{ size_t operator()( const ImplFontSelectData& ) const; }; 95 typedef ::std::hash_map<ImplFontSelectData,ServerFont*,IFSD_Hash,IFSD_Equal > FontList; 96 FontList maFontList; 97 sal_uLong mnMaxSize; // max overall cache size in bytes 98 mutable sal_uLong mnBytesUsed; 99 mutable long mnLruIndex; 100 mutable int mnGlyphCount; 101 ServerFont* mpCurrentGCFont; 102 103 class FreetypeManager* mpFtManager; 104 }; 105 106 // ======================================================================= 107 108 class GlyphMetric 109 { 110 public: 111 Point GetOffset() const { return maOffset; } 112 Point GetDelta() const { return maDelta; } 113 Size GetSize() const { return maSize; } 114 long GetCharWidth() const { return mnAdvanceWidth; } 115 116 protected: 117 friend class GlyphData; 118 void SetOffset( int nX, int nY ) { maOffset = Point( nX, nY); } 119 void SetDelta( int nX, int nY ) { maDelta = Point( nX, nY); } 120 void SetSize( const Size& s ) { maSize = s; } 121 void SetCharWidth( long nW ) { mnAdvanceWidth = nW; } 122 123 private: 124 long mnAdvanceWidth; 125 Point maDelta; 126 Point maOffset; 127 Size maSize; 128 }; 129 130 // ----------------------------------------------------------------------- 131 132 // the glyph specific data needed by a GlyphCachePeer is usually trivial, 133 // not attaching it to the corresponding GlyphData would be overkill 134 struct ExtGlyphData 135 { 136 int meInfo; 137 void* mpData; 138 139 ExtGlyphData() : meInfo(0), mpData(NULL) {} 140 }; 141 142 // ----------------------------------------------------------------------- 143 144 class GlyphData 145 { 146 public: 147 const GlyphMetric& GetMetric() const { return maMetric; } 148 Size GetSize() const { return maMetric.GetSize(); } 149 150 void SetSize( const Size& s) { maMetric.SetSize( s ); } 151 void SetOffset( int nX, int nY ) { maMetric.SetOffset( nX, nY ); } 152 void SetDelta( int nX, int nY ) { maMetric.SetDelta( nX, nY ); } 153 void SetCharWidth( long nW ) { maMetric.SetCharWidth( nW ); } 154 155 void SetLruValue( int n ) const { mnLruValue = n; } 156 long GetLruValue() const { return mnLruValue;} 157 158 ExtGlyphData& ExtDataRef() { return maExtData; } 159 const ExtGlyphData& ExtDataRef() const { return maExtData; } 160 161 private: 162 GlyphMetric maMetric; 163 ExtGlyphData maExtData; 164 165 // used by GlyphCache for cache LRU algorithm 166 mutable long mnLruValue; 167 }; 168 169 // ======================================================================= 170 171 class VCL_PLUGIN_PUBLIC ServerFont 172 { 173 public: 174 virtual const ::rtl::OString* GetFontFileName() const { return NULL; } 175 virtual int GetFontFaceNumber() const { return 0; } 176 virtual bool TestFont() const { return true; } 177 virtual void* GetFtFace() const { return 0; } 178 virtual int GetLoadFlags() const { return 0; } 179 virtual void SetFontOptions( const ImplFontOptions&) {} 180 virtual bool NeedsArtificialBold() const { return false; } 181 virtual bool NeedsArtificialItalic() const { return false; } 182 183 const ImplFontSelectData& GetFontSelData() const { return maFontSelData; } 184 185 virtual void FetchFontMetric( ImplFontMetricData&, long& rFactor ) const = 0; 186 virtual sal_uLong GetKernPairs( ImplKernPairData** ) const { return 0; } 187 virtual int GetGlyphKernValue( int, int ) const { return 0; } 188 virtual const ImplFontCharMap* GetImplFontCharMap() const = 0; 189 Point TransformPoint( const Point& ) const; 190 191 GlyphData& GetGlyphData( int nGlyphIndex ); 192 const GlyphMetric& GetGlyphMetric( int nGlyphIndex ) 193 { return GetGlyphData( nGlyphIndex ).GetMetric(); } 194 195 virtual int GetGlyphIndex( sal_UCS4 ) const = 0; 196 virtual bool GetGlyphOutline( int nGlyphIndex, ::basegfx::B2DPolyPolygon& ) const = 0; 197 virtual bool GetAntialiasAdvice( void ) const = 0; 198 bool IsGlyphInvisible( int nGlyphIndex ); 199 virtual bool GetGlyphBitmap1( int nGlyphIndex, RawBitmap& ) const = 0; 200 virtual bool GetGlyphBitmap8( int nGlyphIndex, RawBitmap& ) const = 0; 201 202 void SetExtended( int nInfo, void* ppVoid ); 203 int GetExtInfo() { return mnExtInfo; } 204 void* GetExtPointer() { return mpExtData; } 205 206 protected: 207 friend class GlyphCache; 208 friend class ServerFontLayout; 209 explicit ServerFont( const ImplFontSelectData& ); 210 virtual ~ServerFont(); 211 212 void AddRef() const { ++mnRefCount; } 213 long GetRefCount() const { return mnRefCount; } 214 long Release() const; 215 sal_uLong GetByteCount() const { return mnBytesUsed; } 216 217 virtual void InitGlyphData( int nGlyphIndex, GlyphData& ) const = 0; 218 virtual void GarbageCollect( long ); 219 void ReleaseFromGarbageCollect(); 220 221 virtual ServerFontLayoutEngine* GetLayoutEngine() { return NULL; } 222 223 private: 224 typedef ::std::hash_map<int,GlyphData> GlyphList; 225 mutable GlyphList maGlyphList; 226 227 const ImplFontSelectData maFontSelData; 228 229 // info for GlyphcachePeer 230 int mnExtInfo; 231 void* mpExtData; 232 233 // used by GlyphCache for cache LRU algorithm 234 mutable long mnRefCount; 235 mutable sal_uLong mnBytesUsed; 236 237 ServerFont* mpPrevGCFont; 238 ServerFont* mpNextGCFont; 239 240 protected: 241 // 16.16 fixed point values used for a rotated font 242 long mnCos; 243 long mnSin; 244 private: 245 int mnZWJ; 246 int mnZWNJ; 247 bool mbCollectedZW; 248 }; 249 250 // ======================================================================= 251 252 // a class for cache entries for physical font instances that are based on serverfonts 253 class VCL_PLUGIN_PUBLIC ImplServerFontEntry : public ImplFontEntry 254 { 255 private: 256 ServerFont* mpServerFont; 257 ImplFontOptions maFontOptions; 258 bool mbGotFontOptions; 259 bool mbValidFontOptions; 260 261 public: 262 ImplServerFontEntry( ImplFontSelectData& ); 263 virtual ~ImplServerFontEntry(); 264 void SetServerFont( ServerFont* p) { mpServerFont = p; } 265 void HandleFontOptions(); 266 }; 267 268 // ======================================================================= 269 270 class VCL_PLUGIN_PUBLIC ServerFontLayout : public GenericSalLayout 271 { 272 private: 273 ServerFont& mrServerFont; 274 275 // enforce proper copy semantic 276 SAL_DLLPRIVATE ServerFontLayout( const ServerFontLayout& ); 277 SAL_DLLPRIVATE ServerFontLayout& operator=( const ServerFontLayout& ); 278 279 public: 280 ServerFontLayout( ServerFont& ); 281 virtual bool LayoutText( ImplLayoutArgs& ); 282 virtual void AdjustLayout( ImplLayoutArgs& ); 283 virtual void DrawText( SalGraphics& ) const; 284 ServerFont& GetServerFont() const { return mrServerFont; } 285 }; 286 287 // ======================================================================= 288 289 class ServerFontLayoutEngine 290 { 291 public: 292 virtual ~ServerFontLayoutEngine() {} 293 virtual bool operator()( ServerFontLayout&, ImplLayoutArgs& ); 294 }; 295 296 // ======================================================================= 297 298 class GlyphCachePeer 299 { 300 protected: 301 GlyphCachePeer() : mnBytesUsed(0) {} 302 virtual ~GlyphCachePeer() {} 303 304 public: 305 sal_Int32 GetByteCount() const { return mnBytesUsed; } 306 virtual void RemovingFont( ServerFont& ) {} 307 virtual void RemovingGlyph( ServerFont&, GlyphData&, int ) {} 308 309 protected: 310 sal_Int32 mnBytesUsed; 311 }; 312 313 // ======================================================================= 314 315 class VCL_PLUGIN_PUBLIC RawBitmap 316 { 317 public: 318 RawBitmap(); 319 ~RawBitmap(); 320 bool Rotate( int nAngle ); 321 322 public: 323 unsigned char* mpBits; 324 sal_uLong mnAllocated; 325 326 sal_uLong mnWidth; 327 sal_uLong mnHeight; 328 329 sal_uLong mnScanlineSize; 330 sal_uLong mnBitCount; 331 332 int mnXOffset; 333 int mnYOffset; 334 }; 335 336 // ======================================================================= 337 338 inline void ServerFont::SetExtended( int nInfo, void* pVoid ) 339 { 340 mnExtInfo = nInfo; 341 mpExtData = pVoid; 342 } 343 344 // ======================================================================= 345 346 // ExtraKernInfo allows an on-demand query of extra kerning info #i29881# 347 // The kerning values have to be scaled to match the font size before use 348 class VCL_PLUGIN_PUBLIC ExtraKernInfo 349 { 350 public: 351 ExtraKernInfo( sal_IntPtr nFontId ); 352 virtual ~ExtraKernInfo() {} 353 354 bool HasKernPairs() const; 355 int GetUnscaledKernPairs( ImplKernPairData** ) const; 356 int GetUnscaledKernValue( sal_Unicode cLeft, sal_Unicode cRight ) const; 357 358 protected: 359 mutable bool mbInitialized; 360 virtual void Initialize() const = 0; 361 362 protected: 363 sal_IntPtr mnFontId; 364 365 // container to map a unicode pair to an unscaled kerning value 366 struct PairEqual{ int operator()(const ImplKernPairData& rA, const ImplKernPairData& rB) const 367 { return (rA.mnChar1 == rB.mnChar1) && (rA.mnChar2 == rB.mnChar2); } }; 368 struct PairHash{ int operator()(const ImplKernPairData& rA) const 369 { return (rA.mnChar1) * 256 ^ rA.mnChar2; } }; 370 typedef std::hash_set< ImplKernPairData, PairHash, PairEqual > UnicodeKernPairs; 371 mutable UnicodeKernPairs maUnicodeKernPairs; 372 }; 373 374 // ======================================================================= 375 376 #endif // _SV_GLYPHCACHE_HXX 377