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 vtkTypeRevisionMacro(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
00098
00099
00105 int GetSize(vtkTextProperty *tprop, FT_Size *size);
00106
00112 int GetFace(vtkTextProperty *tprop, FT_Face *face);
00113
00117 int GetGlyphIndex(vtkTextProperty *tprop, char c, FT_UInt *gindex);
00118
00120
00131 enum
00132 {
00133 GLYPH_REQUEST_DEFAULT = 0,
00134 GLYPH_REQUEST_BITMAP = 1,
00135 GLYPH_REQUEST_OUTLINE = 2
00136 };
00137
00138 int GetGlyph(vtkTextProperty *tprop,
00139 char c,
00140 FT_Glyph *glyph,
00141 int request = GLYPH_REQUEST_DEFAULT);
00143
00145
00154 int GetBoundingBox(vtkTextProperty *tprop, const char *str, int bbox[4]);
00155 int IsBoundingBoxValid(int bbox[4]);
00157
00159
00161 int RenderString(vtkTextProperty *tprop,
00162 const char *str,
00163 vtkImageData *data);
00165
00167
00168 int RenderString(vtkTextProperty *tprop,
00169 const char *str,
00170 int x, int y,
00171 vtkImageData *data);
00173
00175
00183 void MapTextPropertyToId(vtkTextProperty *tprop, unsigned long *tprop_cache_id);
00184 void MapIdToTextProperty(unsigned long tprop_cache_id, vtkTextProperty *tprop);
00186
00188
00190 int GetSize(unsigned long tprop_cache_id, int font_size, FT_Size *size);
00191 int GetFace(unsigned long tprop_cache_id, FT_Face *face);
00192 int GetGlyphIndex(unsigned long tprop_cache_id, char c, 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();
00279 #endif
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