Skip to content

Pango.LayoutIter

record (struct)

A PangoLayoutIter can be used to iterate over the visual extents of a PangoLayout.

To obtain a PangoLayoutIter, use Layout.get_iter.

The PangoLayoutIter structure is opaque, and has no user-visible fields.

Methods

at_last_line

def at_last_line(self) -> bool

Determines whether iter is on the last line of the layout.

copy

def copy(self) -> LayoutIter | None

Copies a PangoLayoutIter.

free

def free(self) -> None

Frees an iterator that's no longer in use.

get_baseline

def get_baseline(self) -> int

Gets the Y position of the current line's baseline, in layout coordinates.

Layout coordinates have the origin at the top left of the entire layout.

get_char_extents

def get_char_extents(self) -> Rectangle

Gets the extents of the current character, in layout coordinates.

Layout coordinates have the origin at the top left of the entire layout.

Only logical extents can sensibly be obtained for characters; ink extents make sense only down to the level of clusters.

get_cluster_extents

def get_cluster_extents(self) -> tuple[Rectangle, Rectangle]

Gets the extents of the current cluster, in layout coordinates.

Layout coordinates have the origin at the top left of the entire layout.

get_index

def get_index(self) -> int

Gets the current byte index.

Note that iterating forward by char moves in visual order, not logical order, so indexes may not be sequential. Also, the index may be equal to the length of the text in the layout, if on the None run (see LayoutIter.get_run).

get_layout

def get_layout(self) -> Layout | None

Gets the layout associated with a PangoLayoutIter.

get_layout_extents

def get_layout_extents(self) -> tuple[Rectangle, Rectangle]

Obtains the extents of the PangoLayout being iterated over.

get_line

def get_line(self) -> LayoutLine | None

Gets the current line.

Use the faster LayoutIter.get_line_readonly if you do not plan to modify the contents of the line (glyphs, glyph widths, etc.).

get_line_extents

def get_line_extents(self) -> tuple[Rectangle, Rectangle]

Obtains the extents of the current line.

Extents are in layout coordinates (origin is the top-left corner of the entire PangoLayout). Thus the extents returned by this function will be the same width/height but not at the same x/y as the extents returned from LayoutLine.get_extents.

get_line_readonly

def get_line_readonly(self) -> LayoutLine | None

Gets the current line for read-only access.

This is a faster alternative to LayoutIter.get_line, but the user is not expected to modify the contents of the line (glyphs, glyph widths, etc.).

get_line_yrange

def get_line_yrange(self) -> tuple[int, int]

Divides the vertical space in the PangoLayout being iterated over between the lines in the layout, and returns the space belonging to the current line.

A line's range includes the line's logical extents. plus half of the spacing above and below the line, if Layout.set_spacing has been called to set layout spacing. The Y positions are in layout coordinates (origin at top left of the entire layout).

Note: Since 1.44, Pango uses line heights for placing lines, and there may be gaps between the ranges returned by this function.

get_run

def get_run(self) -> LayoutRun | None

Gets the current run.

When iterating by run, at the end of each line, there's a position with a None run, so this function can return None. The None run at the end of each line ensures that all lines have at least one run, even lines consisting of only a newline.

Use the faster LayoutIter.get_run_readonly if you do not plan to modify the contents of the run (glyphs, glyph widths, etc.).

get_run_baseline

def get_run_baseline(self) -> int

Gets the Y position of the current run's baseline, in layout coordinates.

Layout coordinates have the origin at the top left of the entire layout.

The run baseline can be different from the line baseline, for example due to superscript or subscript positioning.

get_run_extents

def get_run_extents(self) -> tuple[Rectangle, Rectangle]

Gets the extents of the current run in layout coordinates.

Layout coordinates have the origin at the top left of the entire layout.

get_run_readonly

def get_run_readonly(self) -> LayoutRun | None

Gets the current run for read-only access.

When iterating by run, at the end of each line, there's a position with a None run, so this function can return None. The None run at the end of each line ensures that all lines have at least one run, even lines consisting of only a newline.

This is a faster alternative to LayoutIter.get_run, but the user is not expected to modify the contents of the run (glyphs, glyph widths, etc.).

next_char

def next_char(self) -> bool

Moves iter forward to the next character in visual order.

If iter was already at the end of the layout, returns False.

next_cluster

def next_cluster(self) -> bool

Moves iter forward to the next cluster in visual order.

If iter was already at the end of the layout, returns False.

next_line

def next_line(self) -> bool

Moves iter forward to the start of the next line.

If iter is already on the last line, returns False.

next_run

def next_run(self) -> bool

Moves iter forward to the next run in visual order.

If iter was already at the end of the layout, returns False.