Skip to content

FreeType » Docs » Core API » Sizing and Scaling


Sizing and Scaling

Synopsis

The functions and structures collected in this section are related to selecting and manipulating the size of a font globally.

FT_Size

Defined in FT_FREETYPE_H (freetype/freetype.h).

  typedef struct FT_SizeRec_*  FT_Size;

A handle to an object that models a face scaled to a given character size.

note

An FT_Face has one active FT_Size object that is used by functions like FT_Load_Glyph to determine the scaling transformation that in turn is used to load and hint glyphs and metrics.

A newly created FT_Size object contains only meaningless zero values. You must use FT_Set_Char_Size, FT_Set_Pixel_Sizes, FT_Request_Size or even FT_Select_Size to change the content (i.e., the scaling values) of the active FT_Size. Otherwise, the scaling and hinting will not be performed.

You can use FT_New_Size to create additional size objects for a given FT_Face, but they won't be used by other functions until you activate it through FT_Activate_Size. Only one size can be activated at any given time per face.

also

See FT_SizeRec for the publicly accessible fields of a given size object.


FT_SizeRec

Defined in FT_FREETYPE_H (freetype/freetype.h).

  typedef struct  FT_SizeRec_
  {
    FT_Face           face;      /* parent face object              */
    FT_Generic        generic;   /* generic pointer for client uses */
    FT_Size_Metrics   metrics;   /* size metrics                    */
    FT_Size_Internal  internal;

  } FT_SizeRec;

FreeType root size class structure. A size object models a face object at a given size.

fields

face

Handle to the parent face object.

generic

A typeless pointer, unused by the FreeType library or any of its drivers. It can be used by client applications to link their own data to each size object.

metrics

Metrics for this size object. This field is read-only.


FT_Size_Metrics

Defined in FT_FREETYPE_H (freetype/freetype.h).

  typedef struct  FT_Size_Metrics_
  {
    FT_UShort  x_ppem;      /* horizontal pixels per EM               */
    FT_UShort  y_ppem;      /* vertical pixels per EM                 */

    FT_Fixed   x_scale;     /* scaling values used to convert font    */
    FT_Fixed   y_scale;     /* units to 26.6 fractional pixels        */

    FT_Pos     ascender;    /* ascender in 26.6 frac. pixels          */
    FT_Pos     descender;   /* descender in 26.6 frac. pixels         */
    FT_Pos     height;      /* text height in 26.6 frac. pixels       */
    FT_Pos     max_advance; /* max horizontal advance, in 26.6 pixels */

  } FT_Size_Metrics;

The size metrics structure gives the metrics of a size object.

fields

x_ppem

The width of the scaled EM square in pixels, hence the term ‘ppem’ (pixels per EM). It is also referred to as ‘nominal width’.

y_ppem

The height of the scaled EM square in pixels, hence the term ‘ppem’ (pixels per EM). It is also referred to as ‘nominal height’.

x_scale

A 16.16 fractional scaling value to convert horizontal metrics from font units to 26.6 fractional pixels. Only relevant for scalable font formats.

y_scale

A 16.16 fractional scaling value to convert vertical metrics from font units to 26.6 fractional pixels. Only relevant for scalable font formats.

ascender

The ascender in 26.6 fractional pixels, rounded up to an integer value. See FT_FaceRec for the details.

descender

The descender in 26.6 fractional pixels, rounded down to an integer value. See FT_FaceRec for the details.

height

The height in 26.6 fractional pixels, rounded to an integer value. See FT_FaceRec for the details.

max_advance

The maximum advance width in 26.6 fractional pixels, rounded to an integer value. See FT_FaceRec for the details.

note

The scaling values, if relevant, are determined first during a size changing operation. The remaining fields are then set by the driver. For scalable formats, they are usually set to scaled values of the corresponding fields in FT_FaceRec. Some values like ascender or descender are rounded for historical reasons; more precise values (for outline fonts) can be derived by scaling the corresponding FT_FaceRec values manually, with code similar to the following.

  scaled_ascender = FT_MulFix( face->ascender,
                               size_metrics->y_scale );

Note that due to glyph hinting and the selected rendering mode these values are usually not exact; consequently, they must be treated as unreliable with an error margin of at least one pixel!

Indeed, the only way to get the exact metrics is to render all glyphs. As this would be a definite performance hit, it is up to client applications to perform such computations.

The FT_Size_Metrics structure is valid for bitmap fonts also.

TrueType fonts with native bytecode hinting

All applications that handle TrueType fonts with native hinting must be aware that TTFs expect different rounding of vertical font dimensions. The application has to cater for this, especially if it wants to rely on a TTF's vertical data (for example, to properly align box characters vertically).

Only the application knows in advance that it is going to use native hinting for TTFs! FreeType, on the other hand, selects the hinting mode not at the time of creating an FT_Size object but much later, namely while calling FT_Load_Glyph.

Here is some pseudo code that illustrates a possible solution.

  font_format = FT_Get_Font_Format( face );

  if ( !strcmp( font_format, "TrueType" ) &&
       do_native_bytecode_hinting         )
  {
    ascender  = ROUND( FT_MulFix( face->ascender,
                                  size_metrics->y_scale ) );
    descender = ROUND( FT_MulFix( face->descender,
                                  size_metrics->y_scale ) );
  }
  else
  {
    ascender  = size_metrics->ascender;
    descender = size_metrics->descender;
  }

  height      = size_metrics->height;
  max_advance = size_metrics->max_advance;


FT_Bitmap_Size

Defined in FT_FREETYPE_H (freetype/freetype.h).

  typedef struct  FT_Bitmap_Size_
  {
    FT_Short  height;
    FT_Short  width;

    FT_Pos    size;

    FT_Pos    x_ppem;
    FT_Pos    y_ppem;

  } FT_Bitmap_Size;

This structure models the metrics of a bitmap strike (i.e., a set of glyphs for a given point size and resolution) in a bitmap font. It is used for the available_sizes field of FT_Face.

fields

height

The vertical distance, in pixels, between two consecutive baselines. It is always positive.

width

The average width, in pixels, of all glyphs in the strike.

size

The nominal size of the strike in 26.6 fractional points. This field is not very useful.

x_ppem

The horizontal ppem (nominal width) in 26.6 fractional pixels.

y_ppem

The vertical ppem (nominal height) in 26.6 fractional pixels.

note

Windows FNT: The nominal size given in a FNT font is not reliable. If the driver finds it incorrect, it sets size to some calculated values, and x_ppem and y_ppem to the pixel width and height given in the font, respectively.

TrueType embedded bitmaps: size, width, and height values are not contained in the bitmap strike itself. They are computed from the global font parameters.


FT_Set_Char_Size

Defined in FT_FREETYPE_H (freetype/freetype.h).

  FT_EXPORT( FT_Error )
  FT_Set_Char_Size( FT_Face     face,
                    FT_F26Dot6  char_width,
                    FT_F26Dot6  char_height,
                    FT_UInt     horz_resolution,
                    FT_UInt     vert_resolution );

Call FT_Request_Size to request the nominal size (in points).

inout

face

A handle to a target face object.

input

char_width

The nominal width, in 26.6 fractional points.

char_height

The nominal height, in 26.6 fractional points.

horz_resolution

The horizontal resolution in dpi.

vert_resolution

The vertical resolution in dpi.

return

FreeType error code. 0 means success.

note

While this function allows fractional points as input values, the resulting ppem value for the given resolution is always rounded to the nearest integer.

If either the character width or height is zero, it is set equal to the other value.

If either the horizontal or vertical resolution is zero, it is set equal to the other value.

A character width or height smaller than 1pt is set to 1pt; if both resolution values are zero, they are set to 72dpi.

Don't use this function if you are using the FreeType cache API.


FT_Set_Pixel_Sizes

Defined in FT_FREETYPE_H (freetype/freetype.h).

  FT_EXPORT( FT_Error )
  FT_Set_Pixel_Sizes( FT_Face  face,
                      FT_UInt  pixel_width,
                      FT_UInt  pixel_height );

Call FT_Request_Size to request the nominal size (in pixels).

inout

face

A handle to the target face object.

input

pixel_width

The nominal width, in pixels.

pixel_height

The nominal height, in pixels.

return

FreeType error code. 0 means success.

note

You should not rely on the resulting glyphs matching or being constrained to this pixel size. Refer to FT_Request_Size to understand how requested sizes relate to actual sizes.

Don't use this function if you are using the FreeType cache API.


FT_Request_Size

Defined in FT_FREETYPE_H (freetype/freetype.h).

  FT_EXPORT( FT_Error )
  FT_Request_Size( FT_Face          face,
                   FT_Size_Request  req );

Resize the scale of the active FT_Size object in a face.

inout

face

A handle to a target face object.

input

req

A pointer to a FT_Size_RequestRec.

return

FreeType error code. 0 means success.

note

Although drivers may select the bitmap strike matching the request, you should not rely on this if you intend to select a particular bitmap strike. Use FT_Select_Size instead in that case.

The relation between the requested size and the resulting glyph size is dependent entirely on how the size is defined in the source face. The font designer chooses the final size of each glyph relative to this size. For more information refer to ‘https://www.freetype.org/freetype2/docs/glyphs/glyphs-2.html’.

Contrary to FT_Set_Char_Size, this function doesn't have special code to normalize zero-valued widths, heights, or resolutions, which are treated as FT_LOAD_NO_SCALE.

Don't use this function if you are using the FreeType cache API.


FT_Select_Size

Defined in FT_FREETYPE_H (freetype/freetype.h).

  FT_EXPORT( FT_Error )
  FT_Select_Size( FT_Face  face,
                  FT_Int   strike_index );

Select a bitmap strike. To be more precise, this function sets the scaling factors of the active FT_Size object in a face so that bitmaps from this particular strike are taken by FT_Load_Glyph and friends.

inout

face

A handle to a target face object.

input

strike_index

The index of the bitmap strike in the available_sizes field of FT_FaceRec structure.

return

FreeType error code. 0 means success.

note

For bitmaps embedded in outline fonts it is common that only a subset of the available glyphs at a given ppem value is available. FreeType silently uses outlines if there is no bitmap for a given glyph index.

For GX and OpenType variation fonts, a bitmap strike makes sense only if the default instance is active (that is, no glyph variation takes place); otherwise, FreeType simply ignores bitmap strikes. The same is true for all named instances that are different from the default instance.

Don't use this function if you are using the FreeType cache API.


FT_Size_Request_Type

Defined in FT_FREETYPE_H (freetype/freetype.h).

  typedef enum  FT_Size_Request_Type_
  {
    FT_SIZE_REQUEST_TYPE_NOMINAL,
    FT_SIZE_REQUEST_TYPE_REAL_DIM,
    FT_SIZE_REQUEST_TYPE_BBOX,
    FT_SIZE_REQUEST_TYPE_CELL,
    FT_SIZE_REQUEST_TYPE_SCALES,

    FT_SIZE_REQUEST_TYPE_MAX

  } FT_Size_Request_Type;

An enumeration type that lists the supported size request types, i.e., what input size (in font units) maps to the requested output size (in pixels, as computed from the arguments of FT_Size_Request).

values

FT_SIZE_REQUEST_TYPE_NOMINAL

The nominal size. The units_per_EM field of FT_FaceRec is used to determine both scaling values.

This is the standard scaling found in most applications. In particular, use this size request type for TrueType fonts if they provide optical scaling or something similar. Note, however, that units_per_EM is a rather abstract value which bears no relation to the actual size of the glyphs in a font.

FT_SIZE_REQUEST_TYPE_REAL_DIM

The real dimension. The sum of the ascender and (minus of) the descender fields of FT_FaceRec is used to determine both scaling values.

FT_SIZE_REQUEST_TYPE_BBOX

The font bounding box. The width and height of the bbox field of FT_FaceRec are used to determine the horizontal and vertical scaling value, respectively.

FT_SIZE_REQUEST_TYPE_CELL

The max_advance_width field of FT_FaceRec is used to determine the horizontal scaling value; the vertical scaling value is determined the same way as FT_SIZE_REQUEST_TYPE_REAL_DIM does. Finally, both scaling values are set to the smaller one. This type is useful if you want to specify the font size for, say, a window of a given dimension and 80x24 cells.

FT_SIZE_REQUEST_TYPE_SCALES

Specify the scaling values directly.

note

The above descriptions only apply to scalable formats. For bitmap formats, the behaviour is up to the driver.

See the note section of FT_Size_Metrics if you wonder how size requesting relates to scaling values.


FT_Size_RequestRec

Defined in FT_FREETYPE_H (freetype/freetype.h).

  typedef struct  FT_Size_RequestRec_
  {
    FT_Size_Request_Type  type;
    FT_Long               width;
    FT_Long               height;
    FT_UInt               horiResolution;
    FT_UInt               vertResolution;

  } FT_Size_RequestRec;

A structure to model a size request.

fields

type

See FT_Size_Request_Type.

width

The desired width, given as a 26.6 fractional point value (with 72pt = 1in).

height

The desired height, given as a 26.6 fractional point value (with 72pt = 1in).

horiResolution

The horizontal resolution (dpi, i.e., pixels per inch). If set to zero, width is treated as a 26.6 fractional pixel value, which gets internally rounded to an integer.

vertResolution

The vertical resolution (dpi, i.e., pixels per inch). If set to zero, height is treated as a 26.6 fractional pixel value, which gets internally rounded to an integer.

note

If width is zero, the horizontal scaling value is set equal to the vertical scaling value, and vice versa.

If type is FT_SIZE_REQUEST_TYPE_SCALES, width and height are interpreted directly as 16.16 fractional scaling values, without any further modification, and both horiResolution and vertResolution are ignored.


FT_Size_Request

Defined in FT_FREETYPE_H (freetype/freetype.h).

  typedef struct FT_Size_RequestRec_  *FT_Size_Request;

A handle to a size request structure.


FT_Set_Transform

Defined in FT_FREETYPE_H (freetype/freetype.h).

  FT_EXPORT( void )
  FT_Set_Transform( FT_Face     face,
                    FT_Matrix*  matrix,
                    FT_Vector*  delta );

Set the transformation that is applied to glyph images when they are loaded into a glyph slot through FT_Load_Glyph.

inout

face

A handle to the source face object.

input

matrix

A pointer to the transformation's 2x2 matrix. Use NULL for the identity matrix.

delta

A pointer to the translation vector. Use NULL for the null vector.

note

This function is provided as a convenience, but keep in mind that FT_Matrix coefficients are only 16.16 fixed-point values, which can limit the accuracy of the results. Using floating-point computations to perform the transform directly in client code instead will always yield better numbers.

The transformation is only applied to scalable image formats after the glyph has been loaded. It means that hinting is unaltered by the transformation and is performed on the character size given in the last call to FT_Set_Char_Size or FT_Set_Pixel_Sizes.

Note that this also transforms the face.glyph.advance field, but not the values in face.glyph.metrics.


FT_Get_Transform

Defined in FT_FREETYPE_H (freetype/freetype.h).

  FT_EXPORT( void )
  FT_Get_Transform( FT_Face     face,
                    FT_Matrix*  matrix,
                    FT_Vector*  delta );

Return the transformation that is applied to glyph images when they are loaded into a glyph slot through FT_Load_Glyph. See FT_Set_Transform for more details.

input

face

A handle to the source face object.

output

matrix

A pointer to a transformation's 2x2 matrix. Set this to NULL if you are not interested in the value.

delta

A pointer to a translation vector. Set this to NULL if you are not interested in the value.

since

2.11