Exploring Font Attributes and Glyph Metrics

PythonPythonBeginner
Practice Now

This tutorial is from open-source community. Access the source code

Introduction

In this lab, you will learn about the attributes of an .FT2Font object that describe global font properties. You will also learn how to use individual character metrics using the .Glyph object, as returned by .load_char.

VM Tips

After the VM startup is done, click the top left corner to switch to the Notebook tab to access Jupyter Notebook for practice.

Sometimes, you may need to wait a few seconds for Jupyter Notebook to finish loading. The validation of operations cannot be automated because of limitations in Jupyter Notebook.

If you face issues during learning, feel free to ask Labby. Provide feedback after the session, and we will promptly resolve the problem for you.

Import necessary libraries

In this step, we will import the necessary libraries.

import os
import matplotlib
import matplotlib.ft2font as ft

Load Font

In this step, we will load the font that we will be working with. We will use a font shipped with Matplotlib.

font = ft.FT2Font(
    os.path.join(matplotlib.get_data_path(),
                 'fonts/ttf/DejaVuSans-Oblique.ttf'))

Print Font Properties

In this step, we will print the properties of the font.

print('Num faces:  ', font.num_faces)        ## number of faces in file
print('Num glyphs: ', font.num_glyphs)       ## number of glyphs in the face
print('Family name:', font.family_name)      ## face family name
print('Style name: ', font.style_name)       ## face style name
print('PS name:    ', font.postscript_name)  ## the postscript name
print('Num fixed:  ', font.num_fixed_sizes)  ## number of embedded bitmaps

Print Additional Font Properties

In this step, we will print additional font properties that are only available if the face is scalable.

if font.scalable:
    ## the face global bounding box (xmin, ymin, xmax, ymax)
    print('Bbox:               ', font.bbox)
    ## number of font units covered by the EM
    print('EM:                 ', font.units_per_EM)
    ## the ascender in 26.6 units
    print('Ascender:           ', font.ascender)
    ## the descender in 26.6 units
    print('Descender:          ', font.descender)
    ## the height in 26.6 units
    print('Height:             ', font.height)
    ## maximum horizontal cursor advance
    print('Max adv width:      ', font.max_advance_width)
    ## same for vertical layout
    print('Max adv height:     ', font.max_advance_height)
    ## vertical position of the underline bar
    print('Underline pos:      ', font.underline_position)
    ## vertical thickness of the underline
    print('Underline thickness:', font.underline_thickness)

Print Font Styles

In this step, we will print the font styles.

for style in ('Italic',
              'Bold',
              'Scalable',
              'Fixed sizes',
              'Fixed width',
              'SFNT',
              'Horizontal',
              'Vertical',
              'Kerning',
              'Fast glyphs',
              'Multiple masters',
              'Glyph names',
              'External stream'):
    bitpos = getattr(ft, style.replace(' ', '_').upper()) - 1
    print(f"{style+':':17}", bool(font.style_flags & (1 << bitpos)))

Summary

In this lab, you learned about the attributes of an .FT2Font object that describe global font properties. You also learned how to use individual character metrics using the .Glyph object, as returned by .load_char.

Other Python Tutorials you may like