1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-08-09 13:22:24 +03:00
Files
occt/src/Font/Font_FTFont.hxx
kgv 51204152b9 0030663: Visualization - synthesize italic style for a font having no italic style [backport OCCT720]
Font_FTFont now defines shear transformation to synthesize italic style for fonts having no such style.
Font_FontMgr::FindFont() and command "vfont -find" have been extended with -strict option
to check whether the given font is actually registered or not.
Font_FTFont::Init() - added constructor from memory buffer.
Second Font_FTFont::Init() override has been renamed to Font_FTFont::FindAndInit()
to avoid ambiguity between two similar methods taking full font path and font name as string.

# Conflicts:
#	src/AIS/AIS_Dimension.cxx
#	src/OpenGl/OpenGl_Text.cxx
2020-02-17 12:40:48 +03:00

281 lines
12 KiB
C++
Executable File

// Created on: 2013-01-28
// Created by: Kirill GAVRILOV
// Copyright (c) 2013-2014 OPEN CASCADE SAS
//
// This file is part of Open CASCADE Technology software library.
//
// This library is free software; you can redistribute it and/or modify it under
// the terms of the GNU Lesser General Public License version 2.1 as published
// by the Free Software Foundation, with special exception defined in the file
// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
// distribution for complete text of the license and disclaimer of any warranty.
//
// Alternatively, this file may be used under the terms of Open CASCADE
// commercial license or contractual agreement.
#ifndef _Font_FTFont_H__
#define _Font_FTFont_H__
#include <Font_FontAspect.hxx>
#include <Font_Rect.hxx>
#include <Font_StrictLevel.hxx>
#include <Graphic3d_HorizontalTextAlignment.hxx>
#include <Graphic3d_VerticalTextAlignment.hxx>
#include <Image_PixMap.hxx>
#include <NCollection_String.hxx>
#include <TCollection_AsciiString.hxx>
// forward declarations to avoid including of FreeType headers
typedef struct FT_FaceRec_* FT_Face;
typedef struct FT_Vector_ FT_Vector;
class Font_FTLibrary;
//! Font initialization parameters.
struct Font_FTFontParams
{
unsigned int PointSize; //!< face size in points (1/72 inch)
unsigned int Resolution; //!< resolution of the target device in dpi for FT_Set_Char_Size()
bool ToSynthesizeItalic; //!< generate italic style (e.g. for font family having no italic style); FALSE by default
bool IsSingleStrokeFont; //!< single-stroke (one-line) font, FALSE by default
//! Empty constructor.
Font_FTFontParams() : PointSize (0), Resolution (72u), ToSynthesizeItalic (false), IsSingleStrokeFont (false) {}
//! Constructor.
Font_FTFontParams (unsigned int thePointSize,
unsigned int theResolution)
: PointSize (thePointSize), Resolution (theResolution), ToSynthesizeItalic (false), IsSingleStrokeFont (false) {}
};
DEFINE_STANDARD_HANDLE(Font_FTFont, Standard_Transient)
//! Wrapper over FreeType font.
//! Notice that this class uses internal buffers for loaded glyphs
//! and it is absolutely UNSAFE to load/read glyph from concurrent threads!
class Font_FTFont : public Standard_Transient
{
DEFINE_STANDARD_RTTIEXT(Font_FTFont, Standard_Transient)
public:
//! Find the font Initialize the font.
//! @param theFontName the font name
//! @param theFontAspect the font style
//! @param theParams initialization parameters
//! @param theStrictLevel search strict level for using aliases and fallback
//! @return true on success
Standard_EXPORT static Handle(Font_FTFont) FindAndCreate (const TCollection_AsciiString& theFontName,
const Font_FontAspect theFontAspect,
const Font_FTFontParams& theParams,
const Font_StrictLevel theStrictLevel = Font_StrictLevel_Any);
public:
//! Create uninitialized instance.
Standard_EXPORT Font_FTFont (const Handle(Font_FTLibrary)& theFTLib = Handle(Font_FTLibrary)());
//! Destructor.
Standard_EXPORT virtual ~Font_FTFont();
//! @return true if font is loaded
inline bool IsValid() const
{
return myFTFace != NULL;
}
//! @return image plane for currently rendered glyph
inline const Image_PixMap& GlyphImage() const
{
return myGlyphImg;
}
//! Initialize the font from the given file path.
//! @param theFontPath path to the font
//! @param theParams initialization parameters
//! @return true on success
bool Init (const TCollection_AsciiString& theFontPath,
const Font_FTFontParams& theParams)
{
return Init (Handle(NCollection_Buffer)(), theFontPath, theParams);
}
//! Initialize the font from the given file path or memory buffer.
//! @param theData memory to read from, should NOT be freed after initialization!
//! when NULL, function will attempt to open theFileName file
//! @param theFileName optional path to the font
//! @param theParams initialization parameters
//! @return true on success
Standard_EXPORT bool Init (const Handle(NCollection_Buffer)& theData,
const TCollection_AsciiString& theFileName,
const Font_FTFontParams& theParams);
//! Find (using Font_FontMgr) and initialize the font from the given name.
//! @param theFontName the font name
//! @param theFontAspect the font style
//! @param theParams initialization parameters
//! @param theStrictLevel search strict level for using aliases and fallback
//! @return true on success
Standard_EXPORT bool FindAndInit (const TCollection_AsciiString& theFontName,
Font_FontAspect theFontAspect,
const Font_FTFontParams& theParams,
Font_StrictLevel theStrictLevel = Font_StrictLevel_Any);
//! Return TRUE if this is single-stroke (one-line) font, FALSE by default.
//! Such fonts define single-line glyphs instead of closed contours, so that they are rendered incorrectly by normal software.
bool IsSingleStrokeFont() const { return myFontParams.IsSingleStrokeFont; }
//! Set if this font should be rendered as single-stroke (one-line).
void SetSingleStrokeFont (bool theIsSingleLine) { myFontParams.IsSingleStrokeFont = theIsSingleLine; }
//! Return TRUE if italic style should be synthesized; FALSE by default.
bool ToSynthesizeItalic() const { return myFontParams.ToSynthesizeItalic; }
//! Release currently loaded font.
Standard_EXPORT virtual void Release();
//! Render specified glyph into internal buffer (bitmap).
Standard_EXPORT bool RenderGlyph (const Standard_Utf32Char theChar);
//! @return maximal glyph width in pixels (rendered to bitmap).
Standard_EXPORT unsigned int GlyphMaxSizeX() const;
//! @return maximal glyph height in pixels (rendered to bitmap).
Standard_EXPORT unsigned int GlyphMaxSizeY() const;
//! @return vertical distance from the horizontal baseline to the highest character coordinate.
Standard_EXPORT float Ascender() const;
//! @return vertical distance from the horizontal baseline to the lowest character coordinate.
Standard_EXPORT float Descender() const;
//! @return default line spacing (the baseline-to-baseline distance).
Standard_EXPORT float LineSpacing() const;
//! Configured point size
unsigned int PointSize() const
{
return myFontParams.PointSize;
}
//! Setup glyph scaling along X-axis.
//! By default glyphs are not scaled (scaling factor = 1.0)
void SetWidthScaling (const float theScaleFactor)
{
myWidthScaling = theScaleFactor;
}
//! Compute horizontal advance to the next character with kerning applied when applicable.
//! Assuming text rendered horizontally.
//! @param theUCharNext the next character to compute advance from current one
Standard_EXPORT float AdvanceX (Standard_Utf32Char theUCharNext) const;
//! Compute horizontal advance to the next character with kerning applied when applicable.
//! Assuming text rendered horizontally.
//! @param theUChar the character to be loaded as current one
//! @param theUCharNext the next character to compute advance from current one
Standard_EXPORT float AdvanceX (Standard_Utf32Char theUChar,
Standard_Utf32Char theUCharNext);
//! Compute vertical advance to the next character with kerning applied when applicable.
//! Assuming text rendered vertically.
//! @param theUCharNext the next character to compute advance from current one
Standard_EXPORT float AdvanceY (Standard_Utf32Char theUCharNext) const;
//! Compute vertical advance to the next character with kerning applied when applicable.
//! Assuming text rendered vertically.
//! @param theUChar the character to be loaded as current one
//! @param theUCharNext the next character to compute advance from current one
Standard_EXPORT float AdvanceY (Standard_Utf32Char theUChar,
Standard_Utf32Char theUCharNext);
//! @return glyphs number in this font.
Standard_EXPORT Standard_Integer GlyphsNumber() const;
//! Retrieve glyph bitmap rectangle
Standard_EXPORT void GlyphRect (Font_Rect& theRect) const;
//! Computes bounding box of the given text using plain-text formatter (Font_TextFormatter).
//! Note that bounding box takes into account the text alignment options.
//! Its corners are relative to the text alignment anchor point, their coordinates can be negative.
Standard_EXPORT Font_Rect BoundingBox (const NCollection_String& theString,
const Graphic3d_HorizontalTextAlignment theAlignX,
const Graphic3d_VerticalTextAlignment theAlignY);
public:
//! Initialize the font.
//! @param theFontPath path to the font
//! @param thePointSize the face size in points (1/72 inch)
//! @param theResolution the resolution of the target device in dpi
//! @return true on success
Standard_DEPRECATED ("Deprecated method, Font_FTFontParams should be used for passing parameters")
bool Init (const NCollection_String& theFontPath,
unsigned int thePointSize,
unsigned int theResolution)
{
Font_FTFontParams aParams;
aParams.PointSize = thePointSize;
aParams.Resolution = theResolution;
return Init (theFontPath.ToCString(), aParams);
}
//! Initialize the font.
//! @param theFontName the font name
//! @param theFontAspect the font style
//! @param thePointSize the face size in points (1/72 inch)
//! @param theResolution the resolution of the target device in dpi
//! @return true on success
Standard_DEPRECATED ("Deprecated method, Font_FTFontParams should be used for passing parameters")
bool Init (const NCollection_String& theFontName,
Font_FontAspect theFontAspect,
unsigned int thePointSize,
unsigned int theResolution)
{
Font_FTFontParams aParams;
aParams.PointSize = thePointSize;
aParams.Resolution = theResolution;
return FindAndInit (theFontName.ToCString(), theFontAspect, aParams);
}
protected:
//! Convert value to 26.6 fixed-point format for FT library API.
template <typename theInput_t>
int32_t toFTPoints (const theInput_t thePointSize) const
{
return (int32_t)thePointSize * 64;
}
//! Convert value from 26.6 fixed-point format for FT library API.
template <typename theReturn_t, typename theFTUnits_t>
inline theReturn_t fromFTPoints (const theFTUnits_t theFTUnits) const
{
return (theReturn_t)theFTUnits / 64.0f;
}
protected:
//! Load glyph without rendering it.
Standard_EXPORT bool loadGlyph (const Standard_Utf32Char theUChar);
//! Wrapper for FT_Get_Kerning - retrieve kerning values.
Standard_EXPORT bool getKerning (FT_Vector& theKern,
Standard_Utf32Char theUCharCurr,
Standard_Utf32Char theUCharNext) const;
protected:
Handle(Font_FTLibrary) myFTLib; //!< handle to the FT library object
Handle(NCollection_Buffer) myBuffer; //!< memory buffer
FT_Face myFTFace; //!< FT face object
TCollection_AsciiString myFontPath; //!< font path
Font_FTFontParams myFontParams; //!< font initialization parameters
float myWidthScaling; //!< scale glyphs along X-axis
int32_t myLoadFlags; //!< default load flags
Image_PixMap myGlyphImg; //!< cached glyph plane
Standard_Utf32Char myUChar; //!< currently loaded unicode character
};
#endif // _Font_FTFont_H__