arrayTools: Various array and rectangle tools

Routines for calculating bounding boxes, point in rectangle calculations and so on.

fontTools.misc.arrayTools.calcBounds(array)[source]

Calculate the bounding rectangle of a 2D points array.

Parameters

array – A sequence of 2D tuples.

Returns

A four-item tuple representing the bounding rectangle (xMin, yMin, xMax, yMax).

fontTools.misc.arrayTools.calcIntBounds(array, round=<function otRound>)[source]

Calculate the integer bounding rectangle of a 2D points array.

Values are rounded to closest integer towards +Infinity using the fontTools.misc.fixedTools.otRound() function by default, unless an optional round function is passed.

Parameters
  • array – A sequence of 2D tuples.

  • round – A rounding function of type f(x: float) -> int.

Returns

(xMin, yMin, xMax, yMax).

Return type

A four-item tuple of integers representing the bounding rectangle

fontTools.misc.arrayTools.updateBounds(bounds, p, min=<built-in function min>, max=<built-in function max>)[source]

Add a point to a bounding rectangle.

Parameters
  • bounds – A bounding rectangle expressed as a tuple (xMin, yMin, xMax, yMax).

  • p – A 2D tuple representing a point.

  • min – functions to compute the minimum and maximum.

  • max – functions to compute the minimum and maximum.

Returns

The updated bounding rectangle (xMin, yMin, xMax, yMax).

fontTools.misc.arrayTools.pointInRect(p, rect)[source]

Test if a point is inside a bounding rectangle.

Parameters
  • p – A 2D tuple representing a point.

  • rect – A bounding rectangle expressed as a tuple (xMin, yMin, xMax, yMax).

Returns

True if the point is inside the rectangle, False otherwise.

fontTools.misc.arrayTools.pointsInRect(array, rect)[source]

Determine which points are inside a bounding rectangle.

Parameters
  • array – A sequence of 2D tuples.

  • rect – A bounding rectangle expressed as a tuple (xMin, yMin, xMax, yMax).

Returns

A list containing the points inside the rectangle.

fontTools.misc.arrayTools.vectorLength(vector)[source]

Calculate the length of the given vector.

Parameters

vector – A 2D tuple.

Returns

The Euclidean length of the vector.

fontTools.misc.arrayTools.asInt16(array)[source]

Round a list of floats to 16-bit signed integers.

Parameters

array – List of float values.

Returns

A list of rounded integers.

fontTools.misc.arrayTools.normRect(rect)[source]

Normalize a bounding box rectangle.

This function “turns the rectangle the right way up”, so that the following holds:

xMin <= xMax and yMin <= yMax
Parameters

rect – A bounding rectangle expressed as a tuple (xMin, yMin, xMax, yMax).

Returns

A normalized bounding rectangle.

fontTools.misc.arrayTools.scaleRect(rect, x, y)[source]

Scale a bounding box rectangle.

Parameters
  • rect – A bounding rectangle expressed as a tuple (xMin, yMin, xMax, yMax).

  • x – Factor to scale the rectangle along the X axis.

  • Y – Factor to scale the rectangle along the Y axis.

Returns

A scaled bounding rectangle.

fontTools.misc.arrayTools.offsetRect(rect, dx, dy)[source]

Offset a bounding box rectangle.

Parameters
  • rect – A bounding rectangle expressed as a tuple (xMin, yMin, xMax, yMax).

  • dx – Amount to offset the rectangle along the X axis.

  • dY – Amount to offset the rectangle along the Y axis.

Returns

An offset bounding rectangle.

fontTools.misc.arrayTools.insetRect(rect, dx, dy)[source]

Inset a bounding box rectangle on all sides.

Parameters
  • rect – A bounding rectangle expressed as a tuple (xMin, yMin, xMax, yMax).

  • dx – Amount to inset the rectangle along the X axis.

  • dY – Amount to inset the rectangle along the Y axis.

Returns

An inset bounding rectangle.

fontTools.misc.arrayTools.sectRect(rect1, rect2)[source]

Test for rectangle-rectangle intersection.

Parameters
  • rect1 – First bounding rectangle, expressed as tuples (xMin, yMin, xMax, yMax).

  • rect2 – Second bounding rectangle.

Returns

A boolean and a rectangle. If the input rectangles intersect, returns True and the intersecting rectangle. Returns False and (0, 0, 0, 0) if the input rectangles don’t intersect.

fontTools.misc.arrayTools.unionRect(rect1, rect2)[source]

Determine union of bounding rectangles.

Parameters
  • rect1 – First bounding rectangle, expressed as tuples (xMin, yMin, xMax, yMax).

  • rect2 – Second bounding rectangle.

Returns

The smallest rectangle in which both input rectangles are fully enclosed.

fontTools.misc.arrayTools.rectCenter(rect)[source]

Determine rectangle center.

Parameters

rect – Bounding rectangle, expressed as tuples (xMin, yMin, xMax, yMax).

Returns

A 2D tuple representing the point at the center of the rectangle.

fontTools.misc.arrayTools.intRect(rect)[source]

Round a rectangle to integer values.

Guarantees that the resulting rectangle is NOT smaller than the original.

Parameters

rect – Bounding rectangle, expressed as tuples (xMin, yMin, xMax, yMax).

Returns

A rounded bounding rectangle.

class fontTools.misc.arrayTools.Vector(values, keep=False)[source]

A math-like vector.

Represents an n-dimensional numeric vector. Vector objects support vector addition and subtraction, scalar multiplication and division, negation, rounding, and comparison tests.

values

Sequence of values stored in the vector.

toInt()[source]

Synonym for round.

dot(other)[source]

Performs vector dot product, returning sum of a[0] * b[0], a[1] * b[1], ...

fontTools.misc.arrayTools.pairwise(iterable, reverse=False)[source]

Iterate over current and next items in iterable.

Parameters
  • iterable – An iterable

  • reverse – If true, iterate in reverse order.

Returns

A iterable yielding two elements per iteration.

Example

>>> tuple(pairwise([]))
()
>>> tuple(pairwise([], reverse=True))
()
>>> tuple(pairwise([0]))
((0, 0),)
>>> tuple(pairwise([0], reverse=True))
((0, 0),)
>>> tuple(pairwise([0, 1]))
((0, 1), (1, 0))
>>> tuple(pairwise([0, 1], reverse=True))
((1, 0), (0, 1))
>>> tuple(pairwise([0, 1, 2]))
((0, 1), (1, 2), (2, 0))
>>> tuple(pairwise([0, 1, 2], reverse=True))
((2, 1), (1, 0), (0, 2))
>>> tuple(pairwise(['a', 'b', 'c', 'd']))
(('a', 'b'), ('b', 'c'), ('c', 'd'), ('d', 'a'))
>>> tuple(pairwise(['a', 'b', 'c', 'd'], reverse=True))
(('d', 'c'), ('c', 'b'), ('b', 'a'), ('a', 'd'))