00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00025 #ifndef __vtkFreeTypeUtilities_h
00026 #define __vtkFreeTypeUtilities_h
00027
00028 #define VTK_FTFC_CACHE_CAPACITY 150
00029
00030 #include "vtkObject.h"
00031
00032 class vtkImageData;
00033 class vtkTextProperty;
00034
00035
00036
00037 #include "vtk_freetype.h"
00038 #include FT_FREETYPE_H
00039 #include FT_GLYPH_H
00040
00041 #if (FREETYPE_MAJOR >2 ||(FREETYPE_MAJOR == 2 && ( FREETYPE_MINOR > 1 || (FREETYPE_MINOR == 1 && FREETYPE_PATCH >= 9))))
00042 # include FT_CACHE_H
00043
00044 # define VTK_FREETYPE_CACHING_SUPPORTED
00045 #endif
00046
00047 class FTFont;
00048
00049
00050
00051
00052 class VTK_RENDERING_EXPORT vtkFreeTypeUtilitiesCleanup
00053 {
00054 public:
00055 vtkFreeTypeUtilitiesCleanup();
00056 ~vtkFreeTypeUtilitiesCleanup();
00057 };
00058
00059
00060
00061
00062 class VTK_RENDERING_EXPORT vtkFreeTypeUtilities : public vtkObject
00063 {
00064 public:
00065 vtkTypeMacro(vtkFreeTypeUtilities, vtkObject);
00066 void PrintSelf(ostream& os, vtkIndent indent);
00067
00074 static vtkFreeTypeUtilities *New();
00075
00077 static vtkFreeTypeUtilities* GetInstance();
00078
00081 static void SetInstance(vtkFreeTypeUtilities *instance);
00082
00084 FT_Library* GetLibrary();
00085
00087
00090 vtkSetClampMacro(MaximumNumberOfFaces,unsigned int,1,VTK_UNSIGNED_INT_MAX);
00091 vtkGetMacro(MaximumNumberOfFaces, unsigned int);
00092 vtkSetClampMacro(MaximumNumberOfSizes,unsigned int,1,VTK_UNSIGNED_INT_MAX);
00093 vtkGetMacro(MaximumNumberOfSizes, unsigned int);
00094 vtkSetClampMacro(MaximumNumberOfBytes,unsigned long,1,VTK_UNSIGNED_LONG_MAX);
00095 vtkGetMacro(MaximumNumberOfBytes, unsigned long);
00097
00103 int GetSize(vtkTextProperty *tprop, FT_Size *size);
00104
00110 int GetFace(vtkTextProperty *tprop, FT_Face *face);
00111
00115 int GetGlyphIndex(vtkTextProperty *tprop, FT_UInt32 c, FT_UInt *gindex);
00116
00117
00119
00130 enum
00131 {
00132 GLYPH_REQUEST_DEFAULT = 0,
00133 GLYPH_REQUEST_BITMAP = 1,
00134 GLYPH_REQUEST_OUTLINE = 2
00135 };
00136
00137 int GetGlyph(vtkTextProperty *tprop,
00138 FT_UInt32 c,
00139 FT_Glyph *glyph,
00140 int request = GLYPH_REQUEST_DEFAULT);
00142
00144
00153 int GetBoundingBox(vtkTextProperty *tprop, const char *str, int bbox[4]);
00154 int IsBoundingBoxValid(int bbox[4]);
00156
00158
00160 int RenderString(vtkTextProperty *tprop,
00161 const char *str,
00162 vtkImageData *data);
00164
00166
00167 int RenderString(vtkTextProperty *tprop,
00168 const char *str,
00169 int x, int y,
00170 vtkImageData *data);
00172
00174
00182 void MapTextPropertyToId(vtkTextProperty *tprop, unsigned long *tprop_cache_id);
00183 void MapIdToTextProperty(unsigned long tprop_cache_id, vtkTextProperty *tprop);
00185
00187
00189 int GetSize(unsigned long tprop_cache_id, int font_size, FT_Size *size);
00190 int GetFace(unsigned long tprop_cache_id, FT_Face *face);
00191 int GetGlyphIndex(unsigned long tprop_cache_id, FT_UInt32 c,
00192 FT_UInt *gindex);
00193 int GetGlyph(unsigned long tprop_cache_id,
00194 int font_size,
00195 FT_UInt gindex,
00196 FT_Glyph *glyph,
00197 int request = GLYPH_REQUEST_DEFAULT);
00199
00201
00206 void GetWidthHeightDescender(const char *str,
00207 vtkTextProperty *tprop,
00208 int *width,
00209 int *height,
00210 float *descender);
00212
00214
00216 void PrepareImageData(vtkImageData *data,
00217 vtkTextProperty *tprop,
00218 const char *str,
00219 int *x, int *y);
00221
00223
00225 int GetConstrainedFontSize(const char *str, vtkTextProperty *tprop,
00226 double orientation, int targetWidth,
00227 int targetHeight);
00229
00231
00232 void JustifyLine(const char *str, vtkTextProperty *tprop,
00233 int totalWidth, int *x, int *y);
00235
00236
00237
00238
00239 struct Entry
00240 {
00241 vtkTextProperty *TextProperty;
00242 FTFont *Font;
00243 float LargestAscender;
00244 float LargestDescender;
00245 };
00246
00247 vtkFreeTypeUtilities::Entry* GetFont(vtkTextProperty *tprop,
00248 double override_color[3] = NULL);
00249
00250 protected:
00251
00252 int PopulateImageData(vtkTextProperty *tprop, const char *str,
00253 int x, int y, vtkImageData *data, int use_shadow_color);
00254 vtkFreeTypeUtilities();
00255 virtual ~vtkFreeTypeUtilities();
00256
00257 private:
00258 vtkFreeTypeUtilities(const vtkFreeTypeUtilities&);
00259 void operator=(const vtkFreeTypeUtilities&);
00260
00261
00262
00263 static vtkFreeTypeUtilities* Instance;
00264 static vtkFreeTypeUtilitiesCleanup Cleanup;
00265
00266
00267
00268 #ifdef VTK_FREETYPE_CACHING_SUPPORTED
00269 FTC_Manager *CacheManager;
00270 FTC_ImageCache *ImageCache;
00271 FTC_CMapCache *CMapCache;
00272
00274
00275 FTC_Manager* GetCacheManager();
00276 FTC_ImageCache* GetImageCache();
00277 FTC_CMapCache* GetCMapCache();
00278 #endif
00279
00280
00281 unsigned int MaximumNumberOfFaces;
00282 unsigned int MaximumNumberOfSizes;
00283 unsigned long MaximumNumberOfBytes;
00284
00285 void InitializeCacheManager();
00286 void ReleaseCacheManager();
00287
00288
00289
00290 void PrintEntry(int i, char *msg = 0);
00291 void ReleaseEntry(int i);
00292
00293 void InitializeCache();
00294 void ReleaseCache();
00295
00296 Entry *Entries[VTK_FTFC_CACHE_CAPACITY];
00297 int NumberOfEntries;
00298 };
00299
00300 #endif