VTK  9.2.6
vtkFreeTypeTools.h
Go to the documentation of this file.
1/*=========================================================================
2
3 Program: Visualization Toolkit
4 Module: vtkFreeTypeTools.h
5
6 Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
7 All rights reserved.
8 See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
9
10 This software is distributed WITHOUT ANY WARRANTY; without even
11 the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
12 PURPOSE. See the above copyright notice for more information.
13
14=========================================================================*/
26#ifndef vtkFreeTypeTools_h
27#define vtkFreeTypeTools_h
28
29#include "vtkObject.h"
30#include "vtkRenderingFreeTypeModule.h" // For export macro
31#include "vtkSmartPointer.h" // For smart pointer
32#include "vtkTextRenderer.h" // For Metrics struct
33
34#include <array> // for std::array
35
36class vtkImageData;
37class vtkPath;
38class vtkTextProperty;
39class vtkStdString;
40
41// FreeType
42#include "vtk_freetype.h" //since ft2build.h could be in the path
43#include FT_FREETYPE_H
44#include FT_GLYPH_H
45#include FT_CACHE_H
46
47class FTFont;
48
49// PIMPL class for FTC_FaceID->vtkTextProperty lookup
50class vtkTextPropertyLookup;
51
52//----------------------------------------------------------------------------
53// Singleton cleanup
54class VTKRENDERINGFREETYPE_EXPORT vtkFreeTypeToolsCleanup
55{
56public:
59
60private:
62 vtkFreeTypeToolsCleanup& operator=(const vtkFreeTypeToolsCleanup&) = delete;
63};
64
65//----------------------------------------------------------------------------
66// Singleton font cache
67class VTKRENDERINGFREETYPE_EXPORT vtkFreeTypeTools : public vtkObject
68{
69public:
71 {
76 std::array<int, 4> BoundingBox; // xmin, xmax, ymin, ymax
77 std::string FamilyName;
79 bool Bold;
80 bool Italic;
81 };
83 {
86 };
87
89 void PrintSelf(ostream& os, vtkIndent indent) override;
90
95
100 static void SetInstance(vtkFreeTypeTools* instance);
101
103
107 vtkSetMacro(DebugTextures, bool);
108 vtkGetMacro(DebugTextures, bool);
109 vtkBooleanMacro(DebugTextures, bool);
111
115 FT_Library* GetLibrary();
116
123
130
137 std::array<int, 2> GetUnscaledKerning(
138 vtkTextProperty* tprop, vtkTypeUInt32 leftChar, vtkTypeUInt32 rightChar);
139
141
146 vtkSetClampMacro(MaximumNumberOfFaces, unsigned int, 1, VTK_UNSIGNED_INT_MAX);
147 vtkGetMacro(MaximumNumberOfFaces, unsigned int);
148 vtkSetClampMacro(MaximumNumberOfSizes, unsigned int, 1, VTK_UNSIGNED_INT_MAX);
149 vtkGetMacro(MaximumNumberOfSizes, unsigned int);
150 vtkSetClampMacro(MaximumNumberOfBytes, unsigned long, 1, VTK_UNSIGNED_LONG_MAX);
151 vtkGetMacro(MaximumNumberOfBytes, unsigned long);
153
155
163 bool GetBoundingBox(vtkTextProperty* tprop, const vtkStdString& str, int dpi, int bbox[4]);
165
167
172 vtkTextProperty* tprop, const vtkStdString& str, int dpi, vtkTextRenderer::Metrics& metrics);
174
176
186 bool RenderString(vtkTextProperty* tprop, const vtkStdString& str, int dpi, vtkImageData* data,
187 int textDims[2] = nullptr);
189
191
197 bool StringToPath(vtkTextProperty* tprop, const vtkStdString& str, int dpi, vtkPath* path);
199
201
207 const vtkStdString& str, vtkTextProperty* tprop, int dpi, int targetWidth, int targetHeight);
209
214 static vtkTypeUInt16 HashString(const char* str);
215
220 static vtkTypeUInt32 HashBuffer(const void* buffer, size_t n, vtkTypeUInt32 hash = 0);
221
223
233 void MapTextPropertyToId(vtkTextProperty* tprop, size_t* tprop_cache_id);
234 void MapIdToTextProperty(size_t tprop_cache_id, vtkTextProperty* tprop);
236
238
244 vtkSetMacro(ScaleToPowerTwo, bool);
245 vtkGetMacro(ScaleToPowerTwo, bool);
246 vtkBooleanMacro(ScaleToPowerTwo, bool);
248
250
255 vtkSetMacro(ForceCompiledFonts, bool);
256 vtkGetMacro(ForceCompiledFonts, bool);
257 vtkBooleanMacro(ForceCompiledFonts, bool);
259
266 static bool LookupFace(vtkTextProperty* tprop, FT_Library lib, FT_Face* face);
267
268protected:
272 virtual FT_Error CreateFTCManager();
273
275
278 class MetaData;
279 class ImageMetaData;
280 bool PrepareMetaData(vtkTextProperty* tprop, int dpi, MetaData& metaData);
281 bool PrepareImageMetaData(vtkTextProperty* tprop, vtkImageData* image, ImageMetaData& metaData);
283
288 void PrepareImageData(vtkImageData* data, int bbox[4]);
289
293 void RenderBackground(vtkTextProperty* tprop, vtkImageData* image, ImageMetaData& metaData);
294
302 bool GetSize(vtkTextProperty* tprop, FT_Size* size);
303
310 bool GetFace(vtkTextProperty* tprop, FT_Face* face);
311
317 bool GetGlyphIndex(vtkTextProperty* tprop, FT_UInt32 c, FT_UInt* gindex);
318
320
332 enum
333 {
334 GLYPH_REQUEST_DEFAULT = 0,
335 GLYPH_REQUEST_BITMAP = 1,
336 GLYPH_REQUEST_OUTLINE = 2
337 };
339 vtkTextProperty* tprop, FT_UInt32 c, FT_Glyph* glyph, int request = GLYPH_REQUEST_DEFAULT);
340 bool GetSize(size_t tprop_cache_id, int font_size, FT_Size* size);
341 bool GetSize(FTC_Scaler scaler, FT_Size* size);
342 bool GetFace(size_t tprop_cache_id, FT_Face* face);
343 bool GetGlyphIndex(size_t tprop_cache_id, FT_UInt32 c, FT_UInt* gindex);
344 bool GetGlyph(size_t tprop_cache_id, int font_size, FT_UInt gindex, FT_Glyph* glyph,
345 int request = GLYPH_REQUEST_DEFAULT);
347 FTC_Scaler scaler, FT_UInt gindex, FT_Glyph* glyph, int request = GLYPH_REQUEST_DEFAULT);
349
354
357
361 bool GetFace(vtkTextProperty* prop, size_t& prop_cache_id, FT_Face& face, bool& face_has_kerning);
362
364
367 FT_Bitmap* GetBitmap(FT_UInt32 c, size_t prop_cache_id, int prop_font_size, FT_UInt& gindex,
368 FT_BitmapGlyph& bitmap_glyph);
369 FT_Bitmap* GetBitmap(
370 FT_UInt32 c, FTC_Scaler scaler, FT_UInt& gindex, FT_BitmapGlyph& bitmap_glyph);
372
374
377 FT_Outline* GetOutline(FT_UInt32 c, size_t prop_cache_id, int prop_font_size, FT_UInt& gindex,
378 FT_OutlineGlyph& outline_glyph);
379 FT_Outline* GetOutline(
380 FT_UInt32 c, FTC_Scaler scaler, FT_UInt& gindex, FT_OutlineGlyph& outline_glyph);
382
387
391 vtkTextPropertyLookup* TextPropertyLookup;
392
396 FT_Library* Library;
397
399
402 FTC_Manager* CacheManager;
403 FTC_ImageCache* ImageCache;
404 FTC_CMapCache* CMapCache;
406
408
411 FTC_Manager* GetCacheManager();
412 FTC_ImageCache* GetImageCache();
413 FTC_CMapCache* GetCMapCache();
415
418 unsigned long MaximumNumberOfBytes;
419
422
425
426private:
427 vtkFreeTypeTools(const vtkFreeTypeTools&) = delete;
428 void operator=(const vtkFreeTypeTools&) = delete;
429
433 bool RenderStringInternal(
434 vtkTextProperty* tprop, const std::string& str, int dpi, vtkImageData* data, int textDims[2]);
435
439 bool StringToPathInternal(vtkTextProperty* tprop, const std::string& str, int dpi, vtkPath* path);
440
442
446 bool CalculateBoundingBox(const vtkStdString& str, MetaData& metaData);
447 bool CalculateBoundingBox(
448 const std::string& str, MetaData& metaData, const std::string& defaultHeightString);
450
456 template <typename DataType>
457 bool PopulateData(const std::string& str, DataType data, MetaData& metaData);
458
462 template <typename DataType>
463 bool RenderLine(std::string::const_iterator begin, std::string::const_iterator end, int lineIndex,
464 DataType data, MetaData& metaData);
465
467
470 bool RenderCharacter(FT_UInt32 codepoint, int& x, int& y, FT_UInt& previousGlyphIndex,
471 vtkImageData* image, MetaData& metaData);
472 bool RenderCharacter(FT_UInt32 codepoint, int& x, int& y, FT_UInt& previousGlyphIndex,
473 vtkPath* path, MetaData& metaData);
475
476 void OutlineToPath(int x, int y, FT_Outline* outline, vtkPath* path);
477
483 int FitStringToBBox(
484 const std::string& str, MetaData& metaData, int targetWidth, int targetHeight);
485
487
494 void GetLineMetrics(std::string::const_iterator begin, std::string::const_iterator end,
495 MetaData& metaData, int& width, int bbox[4]);
497};
498
499// This is here to implement the Schwarz counter idiom.
501
502#endif
FreeType library support.
bool GetFace(vtkTextProperty *tprop, FT_Face *face)
Given a text property, get the corresponding FreeType face.
void MapTextPropertyToId(vtkTextProperty *tprop, size_t *tprop_cache_id)
Given a text property 'tprop', get its unique ID in our cache framework.
static vtkFreeTypeTools * GetInstance()
Return the singleton instance with no reference counting.
FaceMetrics GetFaceMetrics(vtkTextProperty *tprop)
Return some metrics about a font face.
FT_Outline * GetOutline(FT_UInt32 c, size_t prop_cache_id, int prop_font_size, FT_UInt &gindex, FT_OutlineGlyph &outline_glyph)
Attempt to get the outline for the specified character.
bool PrepareMetaData(vtkTextProperty *tprop, int dpi, MetaData &metaData)
bool GetFace(size_t tprop_cache_id, FT_Face *face)
Given a text property and a character, get the corresponding FreeType glyph.
FTC_ImageCache * ImageCache
The cache manager, image cache and charmap cache.
bool GetMetrics(vtkTextProperty *tprop, const vtkStdString &str, int dpi, vtkTextRenderer::Metrics &metrics)
Given a text property and a string, get the metrics of the rendered string.
void ReleaseCacheManager()
FT_Outline * GetOutline(FT_UInt32 c, FTC_Scaler scaler, FT_UInt &gindex, FT_OutlineGlyph &outline_glyph)
Attempt to get the outline for the specified character.
vtkTextPropertyLookup * TextPropertyLookup
Lookup table that maps free type font cache face ids to vtkTextProperties.
bool GetSize(size_t tprop_cache_id, int font_size, FT_Size *size)
Given a text property and a character, get the corresponding FreeType glyph.
bool GetGlyph(size_t tprop_cache_id, int font_size, FT_UInt gindex, FT_Glyph *glyph, int request=GLYPH_REQUEST_DEFAULT)
Given a text property and a character, get the corresponding FreeType glyph.
FTC_Manager * GetCacheManager()
Get the FreeType cache manager, image cache and charmap cache.
static void SetInstance(vtkFreeTypeTools *instance)
Supply a user defined instance.
FTC_ImageCache * GetImageCache()
Get the FreeType cache manager, image cache and charmap cache.
bool GetFace(vtkTextProperty *prop, size_t &prop_cache_id, FT_Face &face, bool &face_has_kerning)
Attempt to get the typeface of the specified font.
static vtkFreeTypeTools * Instance
The singleton instance.
bool GetGlyph(FTC_Scaler scaler, FT_UInt gindex, FT_Glyph *glyph, int request=GLYPH_REQUEST_DEFAULT)
Given a text property and a character, get the corresponding FreeType glyph.
bool GetSize(vtkTextProperty *tprop, FT_Size *size)
Given a text property, get the corresponding FreeType size object (a structure storing both a face an...
FT_Library * GetLibrary()
Get the FreeType library singleton.
void PrepareImageData(vtkImageData *data, int bbox[4])
This function initializes the extent of the ImageData to eventually receive the text stored in str.
bool ScaleToPowerTwo
Should the image be scaled to the next highest power of 2?
bool GetGlyphIndex(size_t tprop_cache_id, FT_UInt32 c, FT_UInt *gindex)
Given a text property and a character, get the corresponding FreeType glyph.
bool GetGlyph(vtkTextProperty *tprop, FT_UInt32 c, FT_Glyph *glyph, int request=GLYPH_REQUEST_DEFAULT)
Given a text property and a character, get the corresponding FreeType glyph.
FT_Bitmap * GetBitmap(FT_UInt32 c, size_t prop_cache_id, int prop_font_size, FT_UInt &gindex, FT_BitmapGlyph &bitmap_glyph)
Now attempt to get the bitmap for the specified character.
FT_Bitmap * GetBitmap(FT_UInt32 c, FTC_Scaler scaler, FT_UInt &gindex, FT_BitmapGlyph &bitmap_glyph)
Now attempt to get the bitmap for the specified character.
std::array< int, 2 > GetUnscaledKerning(vtkTextProperty *tprop, vtkTypeUInt32 leftChar, vtkTypeUInt32 rightChar)
Return a 2D vector detailing the unscaled kerning offset for a pair of characters.
unsigned int MaximumNumberOfFaces
~vtkFreeTypeTools() override
void RenderBackground(vtkTextProperty *tprop, vtkImageData *image, ImageMetaData &metaData)
Draw the background quad on the image.
bool PrepareImageMetaData(vtkTextProperty *tprop, vtkImageData *image, ImageMetaData &metaData)
bool GetSize(FTC_Scaler scaler, FT_Size *size)
Given a text property and a character, get the corresponding FreeType glyph.
bool RenderString(vtkTextProperty *tprop, const vtkStdString &str, int dpi, vtkImageData *data, int textDims[2]=nullptr)
Given a text property and a string, this function initializes the vtkImageData *data and renders it i...
bool StringToPath(vtkTextProperty *tprop, const vtkStdString &str, int dpi, vtkPath *path)
Given a text property and a string, this function populates the vtkPath path with the outline of the ...
FTC_Manager * CacheManager
The cache manager, image cache and charmap cache.
unsigned int MaximumNumberOfSizes
static bool LookupFace(vtkTextProperty *tprop, FT_Library lib, FT_Face *face)
Lookup and set the FreeType font face face best matching the text property tprop using the compiled A...
void MapIdToTextProperty(size_t tprop_cache_id, vtkTextProperty *tprop)
Given a text property 'tprop', get its unique ID in our cache framework.
bool GetGlyphIndex(vtkTextProperty *tprop, FT_UInt32 c, FT_UInt *gindex)
Given a text property and a character, get the corresponding FreeType glyph index.
FTC_CMapCache * CMapCache
The cache manager, image cache and charmap cache.
bool GetBoundingBox(vtkTextProperty *tprop, const vtkStdString &str, int dpi, int bbox[4])
Given a text property and a string, get the bounding box {xmin, xmax, ymin, ymax} of the rendered str...
int GetConstrainedFontSize(const vtkStdString &str, vtkTextProperty *tprop, int dpi, int targetWidth, int targetHeight)
This function returns the font size (in points) required to fit the string in the target rectangle.
FTC_CMapCache * GetCMapCache()
Get the FreeType cache manager, image cache and charmap cache.
FT_Library * Library
FreeType library instance.
virtual FT_Error CreateFTCManager()
Create the FreeType Cache manager instance and set this->CacheManager.
GlyphOutline GetUnscaledGlyphOutline(vtkTextProperty *tprop, vtkTypeUInt32 charId)
Return a generic outline of a glyph with some additional metadata.
void PrintSelf(ostream &os, vtkIndent indent) override
Methods invoked by print to print information about the object including superclasses.
unsigned long MaximumNumberOfBytes
static vtkTypeUInt32 HashBuffer(const void *buffer, size_t n, vtkTypeUInt32 hash=0)
Hash a buffer of a given length.
static vtkTypeUInt16 HashString(const char *str)
Turn a string into a hash.
void InitializeCacheManager()
topologically and geometrically regular array of data
a simple class to control print indentation
Definition vtkIndent.h:34
abstract base class for most VTK objects
Definition vtkObject.h:57
concrete dataset representing a path defined by Bezier curves.
Definition vtkPath.h:33
Hold a reference to a vtkObjectBase instance.
Wrapper around std::string to keep symbols short.
represent text properties.
std::array< int, 4 > BoundingBox
vtkSmartPointer< vtkPath > Path
static vtkFreeTypeToolsCleanup vtkFreeTypeToolsCleanupInstance
#define VTK_UNSIGNED_LONG_MAX
Definition vtkType.h:161
#define VTK_UNSIGNED_INT_MAX
Definition vtkType.h:157