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=========================================================================*/
38#ifndef vtkFreeTypeTools_h
39#define vtkFreeTypeTools_h
40
41#include "vtkObject.h"
42#include "vtkRenderingFreeTypeModule.h" // For export macro
43#include "vtkSmartPointer.h" // For smart pointer
44#include "vtkTextRenderer.h" // For Metrics struct
45
46#include <array> // for std::array
47
48class vtkImageData;
49class vtkPath;
50class vtkTextProperty;
51class vtkStdString;
52
53// FreeType
54#include "vtk_freetype.h" //since ft2build.h could be in the path
55#include FT_FREETYPE_H
56#include FT_GLYPH_H
57#include FT_CACHE_H
58
59class FTFont;
60
61// PIMPL class for FTC_FaceID->vtkTextProperty lookup
62class vtkTextPropertyLookup;
63
64//----------------------------------------------------------------------------
65// Singleton cleanup
66class VTKRENDERINGFREETYPE_EXPORT vtkFreeTypeToolsCleanup
67{
68public:
71
72private:
74 vtkFreeTypeToolsCleanup& operator=(const vtkFreeTypeToolsCleanup&) = delete;
75};
76
77//----------------------------------------------------------------------------
78// Singleton font cache
79class VTKRENDERINGFREETYPE_EXPORT vtkFreeTypeTools : public vtkObject
80{
81public:
83 {
88 std::array<int, 4> BoundingBox; // xmin, xmax, ymin, ymax
89 std::string FamilyName;
91 bool Bold;
92 bool Italic;
93 };
95 {
98 };
99
101 void PrintSelf(ostream& os, vtkIndent indent) override;
102
107
112 static void SetInstance(vtkFreeTypeTools* instance);
113
115
119 vtkSetMacro(DebugTextures, bool);
120 vtkGetMacro(DebugTextures, bool);
121 vtkBooleanMacro(DebugTextures, bool);
123
127 FT_Library* GetLibrary();
128
135
142
149 std::array<int, 2> GetUnscaledKerning(
150 vtkTextProperty* tprop, vtkTypeUInt32 leftChar, vtkTypeUInt32 rightChar);
151
153
158 vtkSetClampMacro(MaximumNumberOfFaces, unsigned int, 1, VTK_UNSIGNED_INT_MAX);
159 vtkGetMacro(MaximumNumberOfFaces, unsigned int);
160 vtkSetClampMacro(MaximumNumberOfSizes, unsigned int, 1, VTK_UNSIGNED_INT_MAX);
161 vtkGetMacro(MaximumNumberOfSizes, unsigned int);
162 vtkSetClampMacro(MaximumNumberOfBytes, unsigned long, 1, VTK_UNSIGNED_LONG_MAX);
163 vtkGetMacro(MaximumNumberOfBytes, unsigned long);
165
167
175 bool GetBoundingBox(vtkTextProperty* tprop, const vtkStdString& str, int dpi, int bbox[4]);
177
179
184 vtkTextProperty* tprop, const vtkStdString& str, int dpi, vtkTextRenderer::Metrics& metrics);
186
188
198 bool RenderString(vtkTextProperty* tprop, const vtkStdString& str, int dpi, vtkImageData* data,
199 int textDims[2] = nullptr);
201
203
209 bool StringToPath(vtkTextProperty* tprop, const vtkStdString& str, int dpi, vtkPath* path);
211
213
219 const vtkStdString& str, vtkTextProperty* tprop, int dpi, int targetWidth, int targetHeight);
221
226 static vtkTypeUInt16 HashString(const char* str);
227
232 static vtkTypeUInt32 HashBuffer(const void* buffer, size_t n, vtkTypeUInt32 hash = 0);
233
235
245 void MapTextPropertyToId(vtkTextProperty* tprop, size_t* tprop_cache_id);
246 void MapIdToTextProperty(size_t tprop_cache_id, vtkTextProperty* tprop);
248
250
256 vtkSetMacro(ScaleToPowerTwo, bool);
257 vtkGetMacro(ScaleToPowerTwo, bool);
258 vtkBooleanMacro(ScaleToPowerTwo, bool);
260
262
267 vtkSetMacro(ForceCompiledFonts, bool);
268 vtkGetMacro(ForceCompiledFonts, bool);
269 vtkBooleanMacro(ForceCompiledFonts, bool);
271
278 static bool LookupFace(vtkTextProperty* tprop, FT_Library lib, FT_Face* face);
279
280protected:
284 virtual FT_Error CreateFTCManager();
285
287
290 class MetaData;
291 class ImageMetaData;
292 bool PrepareMetaData(vtkTextProperty* tprop, int dpi, MetaData& metaData);
293 bool PrepareImageMetaData(vtkTextProperty* tprop, vtkImageData* image, ImageMetaData& metaData);
295
300 void PrepareImageData(vtkImageData* data, int bbox[4]);
301
305 void RenderBackground(vtkTextProperty* tprop, vtkImageData* image, ImageMetaData& metaData);
306
314 bool GetSize(vtkTextProperty* tprop, FT_Size* size);
315
322 bool GetFace(vtkTextProperty* tprop, FT_Face* face);
323
329 bool GetGlyphIndex(vtkTextProperty* tprop, FT_UInt32 c, FT_UInt* gindex);
330
332
344 enum
345 {
346 GLYPH_REQUEST_DEFAULT = 0,
347 GLYPH_REQUEST_BITMAP = 1,
348 GLYPH_REQUEST_OUTLINE = 2
349 };
351 vtkTextProperty* tprop, FT_UInt32 c, FT_Glyph* glyph, int request = GLYPH_REQUEST_DEFAULT);
352 bool GetSize(size_t tprop_cache_id, int font_size, FT_Size* size);
353 bool GetSize(FTC_Scaler scaler, FT_Size* size);
354 bool GetFace(size_t tprop_cache_id, FT_Face* face);
355 bool GetGlyphIndex(size_t tprop_cache_id, FT_UInt32 c, FT_UInt* gindex);
356 bool GetGlyph(size_t tprop_cache_id, int font_size, FT_UInt gindex, FT_Glyph* glyph,
357 int request = GLYPH_REQUEST_DEFAULT);
359 FTC_Scaler scaler, FT_UInt gindex, FT_Glyph* glyph, int request = GLYPH_REQUEST_DEFAULT);
361
366
369
373 bool GetFace(vtkTextProperty* prop, size_t& prop_cache_id, FT_Face& face, bool& face_has_kerning);
374
376
379 FT_Bitmap* GetBitmap(FT_UInt32 c, size_t prop_cache_id, int prop_font_size, FT_UInt& gindex,
380 FT_BitmapGlyph& bitmap_glyph);
381 FT_Bitmap* GetBitmap(
382 FT_UInt32 c, FTC_Scaler scaler, FT_UInt& gindex, FT_BitmapGlyph& bitmap_glyph);
384
386
389 FT_Outline* GetOutline(FT_UInt32 c, size_t prop_cache_id, int prop_font_size, FT_UInt& gindex,
390 FT_OutlineGlyph& outline_glyph);
391 FT_Outline* GetOutline(
392 FT_UInt32 c, FTC_Scaler scaler, FT_UInt& gindex, FT_OutlineGlyph& outline_glyph);
394
399
403 vtkTextPropertyLookup* TextPropertyLookup;
404
408 FT_Library* Library;
409
411
414 FTC_Manager* CacheManager;
415 FTC_ImageCache* ImageCache;
416 FTC_CMapCache* CMapCache;
418
420
423 FTC_Manager* GetCacheManager();
424 FTC_ImageCache* GetImageCache();
425 FTC_CMapCache* GetCMapCache();
427
430 unsigned long MaximumNumberOfBytes;
431
434
437
438private:
439 vtkFreeTypeTools(const vtkFreeTypeTools&) = delete;
440 void operator=(const vtkFreeTypeTools&) = delete;
441
445 bool RenderStringInternal(
446 vtkTextProperty* tprop, const std::string& str, int dpi, vtkImageData* data, int textDims[2]);
447
451 bool StringToPathInternal(vtkTextProperty* tprop, const std::string& str, int dpi, vtkPath* path);
452
454
458 bool CalculateBoundingBox(const vtkStdString& str, MetaData& metaData);
459 bool CalculateBoundingBox(
460 const std::string& str, MetaData& metaData, const std::string& defaultHeightString);
462
468 template <typename DataType>
469 bool PopulateData(const std::string& str, DataType data, MetaData& metaData);
470
474 template <typename DataType>
475 bool RenderLine(std::string::const_iterator begin, std::string::const_iterator end, int lineIndex,
476 DataType data, MetaData& metaData);
477
479
482 bool RenderCharacter(FT_UInt32 codepoint, int& x, int& y, FT_UInt& previousGlyphIndex,
483 vtkImageData* image, MetaData& metaData);
484 bool RenderCharacter(FT_UInt32 codepoint, int& x, int& y, FT_UInt& previousGlyphIndex,
485 vtkPath* path, MetaData& metaData);
487
488 void OutlineToPath(int x, int y, FT_Outline* outline, vtkPath* path);
489
495 int FitStringToBBox(
496 const std::string& str, MetaData& metaData, int targetWidth, int targetHeight);
497
499
506 void GetLineMetrics(std::string::const_iterator begin, std::string::const_iterator end,
507 MetaData& metaData, int& width, int bbox[4]);
509};
510
511// This is here to implement the Schwarz counter idiom.
513
514#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:49
abstract base class for most VTK objects
Definition vtkObject.h:72
concrete dataset representing a path defined by Bezier curves.
Definition vtkPath.h:45
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