skia2/site/user/api/SkMatrix_Reference.md
Cary Clark 09d80c0337 docs with more pop
Replace a hunk of documentation in docs/*.bmh
with #Populate, which instructs bookmaker to
retrieve the documentation from include/core.

Check spelling for all documentation retrieved
from include/core against Skia declarations
and a list of words in spelling.txt.

TBR=caryclark@google.com
Docs-Preview: https://skia.org/?cl=163491
Bug: skia:
Change-Id: If057c3a1336e312ad59c084a3a130f0276802496
Reviewed-on: https://skia-review.googlesource.com/c/163491
Commit-Queue: Cary Clark <caryclark@skia.org>
Reviewed-by: Cary Clark <caryclark@skia.org>
Auto-Submit: Cary Clark <caryclark@skia.org>
2018-10-31 16:45:32 +00:00

201 KiB

SkMatrix Reference


class SkMatrix {
public:
    static SkMatrix MakeScale(SkScalar sx, SkScalar sy);
    static SkMatrix MakeScale(SkScalar scale);
    static SkMatrix MakeTrans(SkScalar dx, SkScalar dy);
    static SkMatrix MakeAll(SkScalar scaleX, SkScalar skewX, SkScalar transX,
                     SkScalar skewY, SkScalar scaleY, SkScalar transY,
                     SkScalar pers0, SkScalar pers1, SkScalar pers2);

    enum TypeMask {
        kIdentity_Mask = 0,
        kTranslate_Mask = 0x01,
        kScale_Mask = 0x02,
        kAffine_Mask = 0x04,
        kPerspective_Mask = 0x08,
    };

    TypeMask getType() const;
    bool isIdentity() const;
    bool isScaleTranslate() const;
    bool isTranslate() const;
    bool rectStaysRect() const;
    bool preservesAxisAlignment() const;
    bool hasPerspective() const;
    bool isSimilarity(SkScalar tol = SK_ScalarNearlyZero) const;
    bool preservesRightAngles(SkScalar tol = SK_ScalarNearlyZero) const;

    static constexpr int kMScaleX = 0;
    static constexpr int kMSkewX = 1;
    static constexpr int kMTransX = 2;
    static constexpr int kMSkewY = 3;
    static constexpr int kMScaleY = 4;
    static constexpr int kMTransY = 5;
    static constexpr int kMPersp0 = 6;
    static constexpr int kMPersp1 = 7;
    static constexpr int kMPersp2 = 8;
    static constexpr int kAScaleX = 0;
    static constexpr int kASkewY = 1;
    static constexpr int kASkewX = 2;
    static constexpr int kAScaleY = 3;
    static constexpr int kATransX = 4;
    static constexpr int kATransY = 5;

    SkScalar operator[](int index)_const;
    SkScalar get(int index) const;
    SkScalar getScaleX() const;
    SkScalar getScaleY() const;
    SkScalar getSkewY() const;
    SkScalar getSkewX() const;
    SkScalar getTranslateX() const;
    SkScalar getTranslateY() const;
    SkScalar getPerspX() const;
    SkScalar getPerspY() const;
    SkScalar& operator[](int index);
    void set(int index, SkScalar value);
    void setScaleX(SkScalar v);
    void setScaleY(SkScalar v);
    void setSkewY(SkScalar v);
    void setSkewX(SkScalar v);
    void setTranslateX(SkScalar v);
    void setTranslateY(SkScalar v);
    void setPerspX(SkScalar v);
    void setPerspY(SkScalar v);
    void setAll(SkScalar scaleX, SkScalar skewX, SkScalar transX,
                SkScalar skewY, SkScalar scaleY, SkScalar transY,
                SkScalar persp0, SkScalar persp1, SkScalar persp2);
    void get9(SkScalar buffer[9]) const;
    void set9(const SkScalar buffer[9]);
    void reset();
    void setIdentity();
    void setTranslate(SkScalar dx, SkScalar dy);
    void setTranslate(const SkVector& v);
    void setScale(SkScalar sx, SkScalar sy, SkScalar px, SkScalar py);
    void setScale(SkScalar sx, SkScalar sy);
    void setRotate(SkScalar degrees, SkScalar px, SkScalar py);
    void setRotate(SkScalar degrees);
    void setSinCos(SkScalar sinValue, SkScalar cosValue,
                   SkScalar px, SkScalar py);
    void setSinCos(SkScalar sinValue, SkScalar cosValue);
    SkMatrix& setRSXform(const SkRSXform& rsxForm);
    void setSkew(SkScalar kx, SkScalar ky, SkScalar px, SkScalar py);
    void setSkew(SkScalar kx, SkScalar ky);
    void setConcat(const SkMatrix& a, const SkMatrix& b);
    void preTranslate(SkScalar dx, SkScalar dy);
    void preScale(SkScalar sx, SkScalar sy, SkScalar px, SkScalar py);
    void preScale(SkScalar sx, SkScalar sy);
    void preRotate(SkScalar degrees, SkScalar px, SkScalar py);
    void preRotate(SkScalar degrees);
    void preSkew(SkScalar kx, SkScalar ky, SkScalar px, SkScalar py);
    void preSkew(SkScalar kx, SkScalar ky);
    void preConcat(const SkMatrix& other);
    void postTranslate(SkScalar dx, SkScalar dy);
    void postScale(SkScalar sx, SkScalar sy, SkScalar px, SkScalar py);
    void postScale(SkScalar sx, SkScalar sy);
    bool postIDiv(int divx, int divy);
    void postRotate(SkScalar degrees, SkScalar px, SkScalar py);
    void postRotate(SkScalar degrees);
    void postSkew(SkScalar kx, SkScalar ky, SkScalar px, SkScalar py);
    void postSkew(SkScalar kx, SkScalar ky);
    void postConcat(const SkMatrix& other);

    enum ScaleToFit {
        kFill_ScaleToFit,
        kStart_ScaleToFit,
        kCenter_ScaleToFit,
        kEnd_ScaleToFit,
    };

    bool setRectToRect(const SkRect& src, const SkRect& dst, ScaleToFit stf);
    static SkMatrix MakeRectToRect(const SkRect& src, const SkRect& dst, ScaleToFit stf);
    bool setPolyToPoly(const SkPoint src[], const SkPoint dst[], int count);
    bool invert(SkMatrix* inverse) const;
    static void SetAffineIdentity(SkScalar affine[6]);
    bool asAffine(SkScalar affine[6]) const;
    void setAffine(const SkScalar affine[6]);
    void mapPoints(SkPoint dst[], const SkPoint src[], int count) const;
    void mapPoints(SkPoint pts[], int count) const;
    void mapHomogeneousPoints(SkPoint3 dst[], const SkPoint3 src[], int count) const;
    void mapXY(SkScalar x, SkScalar y, SkPoint* result) const;
    SkPoint mapXY(SkScalar x, SkScalar y) const;
    void mapVectors(SkVector dst[], const SkVector src[], int count) const;
    void mapVectors(SkVector vecs[], int count) const;
    void mapVector(SkScalar dx, SkScalar dy, SkVector* result) const;
    SkVector mapVector(SkScalar dx, SkScalar dy) const;
    bool mapRect(SkRect* dst, const SkRect& src) const;
    bool mapRect(SkRect* rect) const;
    SkRect mapRect(const SkRect& src) const;
    void mapRectToQuad(SkPoint dst[4], const SkRect& rect) const;
    void mapRectScaleTranslate(SkRect* dst, const SkRect& src) const;
    SkScalar mapRadius(SkScalar radius) const;
    bool isFixedStepInX() const;
    SkVector fixedStepInX(SkScalar y) const;
    bool cheapEqualTo(const SkMatrix& m) const;
    friend bool operator==(const SkMatrix& a, const SkMatrix& b);
    friend bool operator!=(const SkMatrix& a, const SkMatrix& b);
    void dump() const;
    SkScalar getMinScale() const;
    SkScalar getMaxScale() const;
    bool getMinMaxScales(SkScalar scaleFactors[2]) const;
    bool decomposeScale(SkSize* scale, SkMatrix* remaining = nullptr) const;
    static const SkMatrix& I();
    static const SkMatrix& InvalidMatrix();
    static SkMatrix Concat(const SkMatrix& a, const SkMatrix& b);
    void dirtyMatrixTypeCache();
    void setScaleTranslate(SkScalar sx, SkScalar sy, SkScalar tx, SkScalar ty);
    bool isFinite() const;
};

Matrix holds a 3x3 matrix for transforming coordinates. This allows mapping Points and Vectors with translation, scaling, skewing, rotation, and perspective.

Matrix elements are in row major order. Matrix does not have a constructor, so it must be explicitly initialized. setIdentity initializes Matrix so it has no effect. setTranslate, setScale, setSkew, setRotate, set9 and setAll initializes all Matrix elements with the corresponding mapping.

Matrix includes a hidden variable that classifies the type of matrix to improve performance. Matrix is not thread safe unless getType is called first.


static SkMatrix MakeScale(SkScalar sx, SkScalar sy)

Sets SkMatrix to scale by (sx, sy). Returned matrix is:

| sx 0 0 | | 0 sy 0 | | 0 0 1 |

Parameters

sx horizontal scale factor
sy vertical scale factor

Return Value

SkMatrix with scale

Example

See Also

setScale[2] postScale[2] preScale[2]


static SkMatrix MakeScale(SkScalar scale)

Sets SkMatrix to scale by (scale, scale). Returned matrix is:

| scale 0 0 | | 0 scale 0 | | 0 0 1 |

Parameters

scale horizontal and vertical scale factor

Return Value

SkMatrix with scale

Example

See Also

setScale[2] postScale[2] preScale[2]


static SkMatrix MakeTrans(SkScalar dx, SkScalar dy)

Sets SkMatrix to translate by (dx, dy). Returned matrix is:

| 1 0 dx | | 0 1 dy | | 0 0 1 |

Parameters

dx horizontal translation
dy vertical translation

Return Value

SkMatrix with translation

Example

See Also

setTranslate[2] postTranslate preTranslate


static SkMatrix MakeAll(SkScalar scaleX, SkScalar skewX, SkScalar transX, SkScalar skewY,
                        SkScalar scaleY, SkScalar transY, SkScalar pers0, SkScalar pers1,
                        SkScalar pers2)

Sets SkMatrix to:

| scaleX skewX transX | | skewY scaleY transY | | pers0 pers1 pers2 |

Parameters

scaleX horizontal scale factor
skewX horizontal skew factor
transX horizontal translation
skewY vertical skew factor
scaleY vertical scale factor
transY vertical translation
pers0 input x-axis perspective factor
pers1 input y-axis perspective factor
pers2 perspective scale factor

Return Value

SkMatrix constructed from parameters

Example

See Also

setAll set9 postConcat preConcat


    enum TypeMask {
        kIdentity_Mask = 0,
        kTranslate_Mask = 0x01,
        kScale_Mask = 0x02,
        kAffine_Mask = 0x04,
        kPerspective_Mask = 0x08,
    };

Enum of bit fields for mask returned by getType. Used to identify the complexity of Matrix, to optimize performance.

Constants

Const Value Description
SkMatrix::kIdentity_Mask 0 all bits clear if Matrix is identity
SkMatrix::kTranslate_Mask 1 set if Matrix has translation
SkMatrix::kScale_Mask 2 set if Matrix has x or y scale
SkMatrix::kAffine_Mask 4 set if Matrix skews or rotates
SkMatrix::kPerspective_Mask 8 set if Matrix has perspective

Example

Example Output

after reset: kIdentity_Mask
after postTranslate: kTranslate_Mask
after postScale: kTranslate_Mask kScale_Mask
after postScale: kTranslate_Mask kScale_Mask kAffine_Mask
after setPolyToPoly: kTranslate_Mask kScale_Mask kAffine_Mask kPerspective_Mask

See Also

getType


TypeMask getType() const

Returns a bit field describing the transformations the matrix may perform. The bit field is computed conservatively, so it may include false positives. For example, when kPerspective_Mask is set, all other bits are set.

Return Value

kIdentity_Mask, or combinations of: kTranslate_Mask, kScale_Mask,

kAffine_Mask, kPerspective_Mask

Example

Example Output

identity flags hex: 0 decimal: 0
set all  flags hex: f decimal: 15

See Also

TypeMask


bool isIdentity() const

Returns true if SkMatrix is identity. Identity matrix is:

| 1 0 0 | | 0 1 0 | | 0 0 1 |

Return Value

true if SkMatrix has no effect

Example

Example Output

is identity: true
is identity: false

See Also

reset() setIdentity getType


bool isScaleTranslate() const

Returns true if SkMatrix at most scales and translates. SkMatrix may be identity, contain only scale elements, only translate elements, or both. SkMatrix form is:

| scale-x 0 translate-x | | 0 scale-y translate-y | | 0 0 1 |

Return Value

true if SkMatrix is identity; or scales, translates, or both

Example

Example Output

is scale-translate: true
is scale-translate: true
is scale-translate: true
is scale-translate: true

See Also

setScale[2] isTranslate setTranslate[2] getType


bool isTranslate() const

Returns true if SkMatrix is identity, or translates. SkMatrix form is:

| 1 0 translate-x | | 0 1 translate-y | | 0 0 1 |

Return Value

true if SkMatrix is identity, or translates

Example

Example Output

is translate: true
is translate: true
is translate: false
is translate: false

See Also

setTranslate[2] getType


bool rectStaysRect() const

Returns true SkMatrix maps SkRect to another SkRect. If true, SkMatrix is identity, or scales, or rotates a multiple of 90 degrees, or mirrors on axes. In all cases, SkMatrix may also have translation. SkMatrix form is either:

| scale-x 0 translate-x | | 0 scale-y translate-y | | 0 0 1 |

or

| 0 rotate-x translate-x | | rotate-y 0 translate-y | | 0 0 1 |

for non-zero values of scale-x, scale-y, rotate-x, and rotate-y.

Also called preservesAxisAlignment(); use the one that provides better inline documentation.

Return Value

true if SkMatrix maps one SkRect into another

Example

Example Output

rectStaysRect: true
rectStaysRect: true
rectStaysRect: true
rectStaysRect: true

See Also

preservesAxisAlignment preservesRightAngles


bool preservesAxisAlignment() const

Returns true SkMatrix maps SkRect to another SkRect. If true, SkMatrix is identity, or scales, or rotates a multiple of 90 degrees, or mirrors on axes. In all cases, SkMatrix may also have translation. SkMatrix form is either:

| scale-x 0 translate-x | | 0 scale-y translate-y | | 0 0 1 |

or

| 0 rotate-x translate-x | | rotate-y 0 translate-y | | 0 0 1 |

for non-zero values of scale-x, scale-y, rotate-x, and rotate-y.

Also called rectStaysRect(); use the one that provides better inline documentation.

Return Value

true if SkMatrix maps one SkRect into another

Example

Example Output

preservesAxisAlignment: true
preservesAxisAlignment: true
preservesAxisAlignment: true
preservesAxisAlignment: true

See Also

rectStaysRect preservesRightAngles


bool hasPerspective() const

Returns true if the matrix contains perspective elements. SkMatrix form is:

| -- -- -- | | -- -- -- | | perspective-x perspective-y perspective-scale |

where perspective-x or perspective-y is non-zero, or perspective-scale is not one. All other elements may have any value.

Return Value

true if SkMatrix is in most general form

Example

See Also

setAll set9 MakeAll


bool isSimilarity(SkScalar tol = SK ScalarNearlyZero) const

Returns true if SkMatrix contains only translation, rotation, reflection, and uniform scale. Returns false if SkMatrix contains different scales, skewing, perspective, or degenerate forms that collapse to a line or point.

Describes that the SkMatrix makes rendering with and without the matrix are visually alike; a transformed circle remains a circle. Mathematically, this is referred to as similarity of a Euclidean space, or a similarity transformation.

Preserves right angles, keeping the arms of the angle equal lengths.

Parameters

tol to be deprecated

Return Value

true if SkMatrix only rotates, uniformly scales, translates

Example

String is drawn four times through but only two are visible. Drawing the pair with isSimilarity false reveals the pair not visible through the matrix.

See Also

isScaleTranslate preservesRightAngles rectStaysRect isFixedStepInX


bool preservesRightAngles(SkScalar tol = SK ScalarNearlyZero) const

Returns true if SkMatrix contains only translation, rotation, reflection, and scale. Scale may differ along rotated axes. Returns false if SkMatrix skewing, perspective, or degenerate forms that collapse to a line or point.

Preserves right angles, but not requiring that the arms of the angle retain equal lengths.

Parameters

tol to be deprecated

Return Value

true if SkMatrix only rotates, scales, translates

Example

Equal scale is both similar and preserves right angles. Unequal scale is not similar but preserves right angles. Skews are not similar and do not preserve right angles.

See Also

isScaleTranslate isSimilarity rectStaysRect isFixedStepInX


    static constexpr int kMScaleX = 0;
    static constexpr int kMSkewX = 1;
    static constexpr int kMTransX = 2;
    static constexpr int kMSkewY = 3;
    static constexpr int kMScaleY = 4;
    static constexpr int kMTransY = 5;
    static constexpr int kMPersp0 = 6;
    static constexpr int kMPersp1 = 7;
    static constexpr int kMPersp2 = 8;

Matrix organizes its values in row order. These members correspond to each value in Matrix.

Constants

Const Value Description
SkMatrix::kMScaleX 0 horizontal scale factor
SkMatrix::kMSkewX 1 horizontal skew factor
SkMatrix::kMTransX 2 horizontal translation
SkMatrix::kMSkewY 3 vertical skew factor
SkMatrix::kMScaleY 4 vertical scale factor
SkMatrix::kMTransY 5 vertical translation
SkMatrix::kMPersp0 6 input x perspective factor
SkMatrix::kMPersp1 7 input y perspective factor
SkMatrix::kMPersp2 8 perspective bias

Example

See Also

get() set()



Affine arrays are in column major order to match the matrix used by PDF and XPS.

Constants

Const Value Description
SkMatrix::kAScaleX 0 horizontal scale factor
SkMatrix::kASkewY 1 vertical skew factor
SkMatrix::kASkewX 2 horizontal skew factor
SkMatrix::kAScaleY 3 vertical scale factor
SkMatrix::kATransX 4 horizontal translation
SkMatrix::kATransY 5 vertical translation

See Also

SetAffineIdentity asAffine setAffine


SkScalar operator[](int index) const

Example

Example Output

matrix[SkMatrix::kMScaleX] == 42
matrix[SkMatrix::kMScaleY] == 24

See Also

get set


SkScalar get(int index) const

Returns one matrix value. Asserts if index is out of range and SK_DEBUG is defined.

Parameters

index one of: kMScaleX, kMSkewX, kMTransX, kMSkewY, kMScaleY, kMTransY,

kMPersp0, kMPersp1, kMPersp2

Return Value

value corresponding to index

Example

Example Output

matrix.get(SkMatrix::kMSkewX) == 42
matrix.get(SkMatrix::kMSkewY) == 24

See Also

operator[](int index) set


SkScalar getScaleX() const

Returns scale factor multiplied by x-axis input, contributing to x-axis output. With mapPoints(), scales SkPoint along the x-axis.

Return Value

horizontal scale factor

Example

Example Output

matrix.getScaleX() == 42

See Also

get getScaleY setScaleX setScale[2]


SkScalar getScaleY() const

Returns scale factor multiplied by y-axis input, contributing to y-axis output. With mapPoints(), scales SkPoint along the y-axis.

Return Value

vertical scale factor

Example

Example Output

matrix.getScaleY() == 24

See Also

get getScaleX setScaleY setScale[2]


SkScalar getSkewY() const

Returns scale factor multiplied by x-axis input, contributing to y-axis output. With mapPoints(), skews SkPoint along the y-axis. Skewing both axes can rotate SkPoint.

Return Value

vertical skew factor

Example

Example Output

matrix.getSkewY() == 24

See Also

get getSkewX setSkewY setSkew[2]


SkScalar getSkewX() const

Returns scale factor multiplied by y-axis input, contributing to x-axis output. With mapPoints(), skews SkPoint along the x-axis. Skewing both axes can rotate SkPoint.

Return Value

horizontal scale factor

Example

Example Output

matrix.getSkewX() == 42

See Also

get getSkewY setSkewX setSkew[2]


SkScalar getTranslateX() const

Returns translation contributing to x-axis output. With mapPoints(), moves SkPoint along the x-axis.

Return Value

horizontal translation factor

Example

Example Output

matrix.getTranslateX() == 42

See Also

get getTranslateY setTranslateX setTranslate[2]


SkScalar getTranslateY() const

Returns translation contributing to y-axis output. With mapPoints(), moves SkPoint along the y-axis.

Return Value

vertical translation factor

Example

Example Output

matrix.getTranslateY() == 24

See Also

get getTranslateX setTranslateY setTranslate[2]


SkScalar getPerspX() const

Returns factor scaling input x-axis relative to input y-axis.

Return Value

input x-axis perspective factor

Example

See Also

kMPersp0 getPerspY


SkScalar getPerspY() const

Returns factor scaling input y-axis relative to input x-axis.

Return Value

input y-axis perspective factor

Example

See Also

kMPersp1 getPerspX


SkScalar& operator[](int index)

Example

Example Output

with identity matrix: x = 24
after skew x mod:     x = 24
after 2nd skew x mod: x = 24
after dirty cache:    x = 66

See Also

get dirtyMatrixTypeCache set


void set(int index, SkScalar value)

Sets SkMatrix value. Asserts if index is out of range and SK_DEBUG is defined. Safer than operator[]; internal cache is always maintained.

Parameters

index one of: kMScaleX, kMSkewX, kMTransX, kMSkewY, kMScaleY, kMTransY,

kMPersp0, kMPersp1, kMPersp2

Parameters

value scalar to store in SkMatrix

Example

Example Output

with identity matrix: x = 24
after skew x mod:     x = 24
after 2nd skew x mod: x = 66

See Also

operator[] get


void setScaleX(SkScalar v)

Sets horizontal scale factor.

Parameters

v horizontal scale factor to store

Example

See Also

set setScale[2] setScaleY


void setScaleY(SkScalar v)

Sets vertical scale factor.

Parameters

v vertical scale factor to store

Example

See Also

set setScale[2] setScaleX


void setSkewY(SkScalar v)

Sets vertical skew factor.

Parameters

v vertical skew factor to store

Example

See Also

set setSkew[2] setSkewX


void setSkewX(SkScalar v)

Sets horizontal skew factor.

Parameters

v horizontal skew factor to store

Example

See Also

set setSkew[2] setSkewX


void setTranslateX(SkScalar v)

Sets horizontal translation.

Parameters

v horizontal translation to store

Example

See Also

set setTranslate[2] setTranslateY


void setTranslateY(SkScalar v)

Sets vertical translation.

Parameters

v vertical translation to store

Example

See Also

set setTranslate[2] setTranslateX


void setPerspX(SkScalar v)

Sets input x-axis perspective factor, which causes mapXY() to vary input x-axis values inversely proportional to input y-axis values.

Parameters

v perspective factor

Example

See Also

getPerspX set setAll set9 MakeAll


void setPerspY(SkScalar v)

Sets input y-axis perspective factor, which causes mapXY() to vary input y-axis values inversely proportional to input x-axis values.

Parameters

v perspective factor

Example

See Also

getPerspY set setAll set9 MakeAll


void setAll(SkScalar scaleX, SkScalar skewX, SkScalar transX, SkScalar skewY, SkScalar scaleY,
            SkScalar transY, SkScalar persp0, SkScalar persp1, SkScalar persp2)

Sets all values from parameters. Sets matrix to:

| scaleX skewX transX | | skewY scaleY transY | | persp0 persp1 persp2 |

Parameters

scaleX horizontal scale factor to store
skewX horizontal skew factor to store
transX horizontal translation to store
skewY vertical skew factor to store
scaleY vertical scale factor to store
transY vertical translation to store
persp0 input x-axis values perspective factor to store
persp1 input y-axis values perspective factor to store
persp2 perspective scale factor to store

Example

See Also

set9 MakeAll


void get9(SkScalar buffer[9]) const

Copies nine scalar values contained by SkMatrix into buffer, in member value ascending order: kMScaleX, kMSkewX, kMTransX, kMSkewY, kMScaleY, kMTransY, kMPersp0, kMPersp1, kMPersp2.

Parameters

buffer storage for nine scalar values

Example

Example Output

{4, 0, 3},
{0, 5, 4},
{0, 0, 1}

See Also

set9


void set9(const SkScalar buffer[9])

Sets SkMatrix to nine scalar values in buffer, in member value ascending order: kMScaleX, kMSkewX, kMTransX, kMSkewY, kMScaleY, kMTransY, kMPersp0, kMPersp1, kMPersp2.

Sets matrix to:

| buffer[0] buffer[1] buffer[2] | | buffer[3] buffer[4] buffer[5] | | buffer[6] buffer[7] buffer[8] |

In the future, set9 followed by get9 may not return the same values. Since SkMatrix maps non-homogeneous coordinates, scaling all nine values produces an equivalent transformation, possibly improving precision.

Parameters

buffer nine scalar values

Example

See Also

setAll get9 MakeAll


void reset()

Sets SkMatrix to identity; which has no effect on mapped SkPoint. Sets SkMatrix to:

| 1 0 0 | | 0 1 0 | | 0 0 1 |

Also called setIdentity(); use the one that provides better inline documentation.

Example

Example Output

m.isIdentity(): true

See Also

isIdentity setIdentity


void setIdentity()

Sets SkMatrix to identity; which has no effect on mapped SkPoint. Sets SkMatrix to:

| 1 0 0 | | 0 1 0 | | 0 0 1 |

Also called reset(); use the one that provides better inline documentation.

Example

Example Output

m.isIdentity(): true

See Also

isIdentity reset


void setTranslate(SkScalar dx, SkScalar dy)

Sets SkMatrix to translate by (dx, dy).

Parameters

dx horizontal translation
dy vertical translation

Example

See Also

setTranslateX setTranslateY


void setTranslate(const SkVector& v)

Sets SkMatrix to translate by (v.fX, v.fY).

Parameters

v vector containing horizontal and vertical translation

Example

See Also

setTranslateX setTranslateY MakeTrans


void setScale(SkScalar sx, SkScalar sy, SkScalar px, SkScalar py)

Sets SkMatrix to scale by sx and sy, about a pivot point at (px, py). The pivot point is unchanged when mapped with SkMatrix.

Parameters

sx horizontal scale factor
sy vertical scale factor
px pivot on x-axis
py pivot on y-axis

Example

See Also

setScaleX setScaleY MakeScale[2] preScale[2] postScale[2]


void setScale(SkScalar sx, SkScalar sy)

Sets SkMatrix to scale by sx and sy about at pivot point at (0, 0).

Parameters

sx horizontal scale factor
sy vertical scale factor

Example

See Also

setScaleX setScaleY MakeScale[2] preScale[2] postScale[2]


void setRotate(SkScalar degrees, SkScalar px, SkScalar py)

Sets SkMatrix to rotate by degrees about a pivot point at (px, py). The pivot point is unchanged when mapped with SkMatrix.

Positive degrees rotates clockwise.

Parameters

degrees angle of axes relative to upright axes
px pivot on x-axis
py pivot on y-axis

Example

See Also

setSinCos[2] preRotate[2] postRotate[2]


void setRotate(SkScalar degrees)

Sets SkMatrix to rotate by degrees about a pivot point at (0, 0). Positive degrees rotates clockwise.

Parameters

degrees angle of axes relative to upright axes

Example

See Also

setSinCos[2] preRotate[2] postRotate[2]


void setSinCos(SkScalar sinValue, SkScalar cosValue, SkScalar px, SkScalar py)

Sets SkMatrix to rotate by sinValue and cosValue, about a pivot point at (px, py). The pivot point is unchanged when mapped with SkMatrix.

Vector (sinValue, cosValue) describes the angle of rotation relative to (0, 1). Vector length specifies scale.

Parameters

sinValue rotation vector x-axis component
cosValue rotation vector y-axis component
px pivot on x-axis
py pivot on y-axis

Example

See Also

setRotate[2] setScale[2] setRSXform


void setSinCos(SkScalar sinValue, SkScalar cosValue)

Sets SkMatrix to rotate by sinValue and cosValue, about a pivot point at (0, 0).

Vector (sinValue, cosValue) describes the angle of rotation relative to (0, 1). Vector length specifies scale.

Parameters

sinValue rotation vector x-axis component
cosValue rotation vector y-axis component

Example

Canvas needs offset after applying Matrix to pivot about Rect center.

See Also

setRotate[2] setScale[2] setRSXform


SkMatrix& setRSXform(const SkRSXform& rsxForm)

Sets SkMatrix to rotate, scale, and translate using a compressed matrix form.

Vector (rsxForm.fSSin, rsxForm.fSCos) describes the angle of rotation relative to (0, 1). Vector length specifies scale. Mapped point is rotated and scaled by vector, then translated by (rsxForm.fTx, rsxForm.fTy).

Parameters

rsxForm compressed SkRSXform matrix

Return Value

reference to SkMatrix

Example

Canvas needs offset after applying Matrix to pivot about Rect center.

See Also

setSinCos[2] setScale[2] setTranslate[2]


void setSkew(SkScalar kx, SkScalar ky, SkScalar px, SkScalar py)

Sets SkMatrix to skew by kx and ky, about a pivot point at (px, py). The pivot point is unchanged when mapped with SkMatrix.

Parameters

kx horizontal skew factor
ky vertical skew factor
px pivot on x-axis
py pivot on y-axis

Example

See Also

setSkewX setSkewY preSkew[2] postSkew[2]


void setSkew(SkScalar kx, SkScalar ky)

Sets SkMatrix to skew by kx and ky, about a pivot point at (0, 0).

Parameters

kx horizontal skew factor
ky vertical skew factor

Example

See Also

setSkewX setSkewY preSkew[2] postSkew[2]


void setConcat(const SkMatrix& a, const SkMatrix& b)

Sets SkMatrix to SkMatrix a multiplied by SkMatrix b. Either a or b may be this.

Given:

| A B C | | J K L | a = | D E F |, b = | M N O | | G H I | | P Q R |

sets SkMatrix to:

| A B C | | J K L | | AJ+BM+CP AK+BN+CQ AL+BO+CR | a * b = | D E F | * | M N O | = | DJ+EM+FP DK+EN+FQ DL+EO+FR | | G H I | | P Q R | | GJ+HM+IP GK+HN+IQ GL+HO+IR |

Parameters

a SkMatrix on left side of multiply expression
b SkMatrix on right side of multiply expression

Example

setPolyToPoly creates perspective matrices, one the inverse of the other. Multiplying the matrix by its inverse turns into an identity matrix.

See Also

Concat preConcat postConcat SkCanvas::concat


void preTranslate(SkScalar dx, SkScalar dy)

Sets SkMatrix to SkMatrix multiplied by SkMatrix constructed from translation (dx, dy). This can be thought of as moving the point to be mapped before applying SkMatrix.

Given:

| A B C | | 1 0 dx | Matrix = | D E F |, T(dx, dy) = | 0 1 dy | | G H I | | 0 0 1 |

sets SkMatrix to:

| A B C | | 1 0 dx | | A B A*dx+B*dy+C | Matrix * T(dx, dy) = | D E F | | 0 1 dy | = | D E D*dx+E*dy+F | | G H I | | 0 0 1 | | G H G*dx+H*dy+I |

Parameters

dx x-axis translation before applying SkMatrix
dy y-axis translation before applying SkMatrix

Example

See Also

postTranslate setTranslate[2] MakeTrans


void preScale(SkScalar sx, SkScalar sy, SkScalar px, SkScalar py)

Sets SkMatrix to SkMatrix multiplied by SkMatrix constructed from scaling by (sx, sy) about pivot point (px, py). This can be thought of as scaling about a pivot point before applying SkMatrix.

Given:

| A B C | | sx 0 dx | Matrix = | D E F |, S(sx, sy, px, py) = | 0 sy dy | | G H I | | 0 0 1 |

where

dx = px - sx * px dy = py - sy * py

sets SkMatrix to:

| A B C | | sx 0 dx | | A*sx B*sy Adx+Bdy+C | Matrix * S(sx, sy, px, py) = | D E F | | 0 sy dy | = | D*sx E*sy Ddx+Edy+F | | G H I | | 0 0 1 | | G*sx H*sy Gdx+Hdy+I |

Parameters

sx horizontal scale factor
sy vertical scale factor
px pivot on x-axis
py pivot on y-axis

Example

See Also

postScale[2] setScale[2] MakeScale[2]


void preScale(SkScalar sx, SkScalar sy)

Sets SkMatrix to SkMatrix multiplied by SkMatrix constructed from scaling by (sx, sy) about pivot point (0, 0). This can be thought of as scaling about the origin before applying SkMatrix.

Given:

| A B C | | sx 0 0 | Matrix = | D E F |, S(sx, sy) = | 0 sy 0 | | G H I | | 0 0 1 |

sets SkMatrix to:

| A B C | | sx 0 0 | | A*sx B*sy C | Matrix * S(sx, sy) = | D E F | | 0 sy 0 | = | D*sx E*sy F | | G H I | | 0 0 1 | | G*sx H*sy I |

Parameters

sx horizontal scale factor
sy vertical scale factor

Example

See Also

postScale[2] setScale[2] MakeScale[2]


void preRotate(SkScalar degrees, SkScalar px, SkScalar py)

Sets SkMatrix to SkMatrix multiplied by SkMatrix constructed from rotating by degrees about pivot point (px, py). This can be thought of as rotating about a pivot point before applying SkMatrix.

Positive degrees rotates clockwise.

Given:

| A B C | | c -s dx | Matrix = | D E F |, R(degrees, px, py) = | s c dy | | G H I | | 0 0 1 |

where

c = cos(degrees) s = sin(degrees) dx = s * py + (1 - c) * px dy = -s * px + (1 - c) * py

sets SkMatrix to:

| A B C | | c -s dx | | Ac+Bs -As+Bc Adx+Bdy+C | Matrix * R(degrees, px, py) = | D E F | | s c dy | = | Dc+Es -Ds+Ec Ddx+Edy+F | | G H I | | 0 0 1 | | Gc+Hs -Gs+Hc Gdx+Hdy+I |

Parameters

degrees angle of axes relative to upright axes
px pivot on x-axis
py pivot on y-axis

Example

See Also

postRotate[2] setRotate[2]


void preRotate(SkScalar degrees)

Sets SkMatrix to SkMatrix multiplied by SkMatrix constructed from rotating by degrees about pivot point (0, 0). This can be thought of as rotating about the origin before applying SkMatrix.

Positive degrees rotates clockwise.

Given:

| A B C | | c -s 0 | Matrix = | D E F |, R(degrees, px, py) = | s c 0 | | G H I | | 0 0 1 |

where

c = cos(degrees) s = sin(degrees)

sets SkMatrix to:

| A B C | | c -s 0 | | Ac+Bs -As+Bc C | Matrix * R(degrees, px, py) = | D E F | | s c 0 | = | Dc+Es -Ds+Ec F | | G H I | | 0 0 1 | | Gc+Hs -Gs+Hc I |

Parameters

degrees angle of axes relative to upright axes

Example

See Also

postRotate[2] setRotate[2]


void preSkew(SkScalar kx, SkScalar ky, SkScalar px, SkScalar py)

Sets SkMatrix to SkMatrix multiplied by SkMatrix constructed from skewing by (kx, ky) about pivot point (px, py). This can be thought of as skewing about a pivot point before applying SkMatrix.

Given:

| A B C | | 1 kx dx | Matrix = | D E F |, K(kx, ky, px, py) = | ky 1 dy | | G H I | | 0 0 1 |

where

dx = -kx * py dy = -ky * px

sets SkMatrix to:

| A B C | | 1 kx dx | | A+B*ky A*kx+B Adx+Bdy+C | Matrix * K(kx, ky, px, py) = | D E F | | ky 1 dy | = | D+E*ky D*kx+E Ddx+Edy+F | | G H I | | 0 0 1 | | G+H*ky G*kx+H Gdx+Hdy+I |

Parameters

kx horizontal skew factor
ky vertical skew factor
px pivot on x-axis
py pivot on y-axis

Example

See Also

postSkew[2] setSkew[2]


void preSkew(SkScalar kx, SkScalar ky)

Sets SkMatrix to SkMatrix multiplied by SkMatrix constructed from skewing by (kx, ky) about pivot point (0, 0). This can be thought of as skewing about the origin before applying SkMatrix.

Given:

| A B C | | 1 kx 0 | Matrix = | D E F |, K(kx, ky) = | ky 1 0 | | G H I | | 0 0 1 |

sets SkMatrix to:

| A B C | | 1 kx 0 | | A+B*ky A*kx+B C | Matrix * K(kx, ky) = | D E F | | ky 1 0 | = | D+E*ky D*kx+E F | | G H I | | 0 0 1 | | G+H*ky G*kx+H I |

Parameters

kx horizontal skew factor
ky vertical skew factor

Example

See Also

postSkew[2] setSkew[2]


void preConcat(const SkMatrix& other)

Sets SkMatrix to SkMatrix multiplied by SkMatrix other. This can be thought of mapping by other before applying SkMatrix.

Given:

| A B C | | J K L | Matrix = | D E F |, other = | M N O | | G H I | | P Q R |

sets SkMatrix to:

| A B C | | J K L | | AJ+BM+CP AK+BN+CQ AL+BO+CR | Matrix * other = | D E F | * | M N O | = | DJ+EM+FP DK+EN+FQ DL+EO+FR | | G H I | | P Q R | | GJ+HM+IP GK+HN+IQ GL+HO+IR |

Parameters

other SkMatrix on right side of multiply expression

Example

setPolyToPoly creates perspective matrices, one the inverse of the other. Multiplying the matrix by its inverse turns into an identity matrix.

See Also

postConcat setConcat Concat


void postTranslate(SkScalar dx, SkScalar dy)

Sets SkMatrix to SkMatrix constructed from translation (dx, dy) multiplied by SkMatrix. This can be thought of as moving the point to be mapped after applying SkMatrix.

Given:

| J K L | | 1 0 dx | Matrix = | M N O |, T(dx, dy) = | 0 1 dy | | P Q R | | 0 0 1 |

sets SkMatrix to:

| 1 0 dx | | J K L | | J+dx*P K+dx*Q L+dx*R | T(dx, dy) * Matrix = | 0 1 dy | | M N O | = | M+dy*P N+dy*Q O+dy*R | | 0 0 1 | | P Q R | | P Q R |

Parameters

dx x-axis translation after applying SkMatrix
dy y-axis translation after applying SkMatrix

Example

Compare with preTranslate example.

See Also

preTranslate setTranslate[2] MakeTrans


void postScale(SkScalar sx, SkScalar sy, SkScalar px, SkScalar py)

Sets SkMatrix to SkMatrix constructed from scaling by (sx, sy) about pivot point (px, py), multiplied by SkMatrix. This can be thought of as scaling about a pivot point after applying SkMatrix.

Given:

| J K L | | sx 0 dx | Matrix = | M N O |, S(sx, sy, px, py) = | 0 sy dy | | P Q R | | 0 0 1 |

where

dx = px - sx * px dy = py - sy * py

sets SkMatrix to:

| sx 0 dx | | J K L | | sxJ+dxP sxK+dxQ sx*L+dx+R | S(sx, sy, px, py) * Matrix = | 0 sy dy | | M N O | = | syM+dyP syN+dyQ syO+dyR | | 0 0 1 | | P Q R | | P Q R |

Parameters

sx horizontal scale factor
sy vertical scale factor
px pivot on x-axis
py pivot on y-axis

Example

See Also

preScale[2] setScale[2] MakeScale[2]


void postScale(SkScalar sx, SkScalar sy)

Sets SkMatrix to SkMatrix constructed from scaling by (sx, sy) about pivot point (0, 0), multiplied by SkMatrix. This can be thought of as scaling about the origin after applying SkMatrix.

Given:

| J K L | | sx 0 0 | Matrix = | M N O |, S(sx, sy) = | 0 sy 0 | | P Q R | | 0 0 1 |

sets SkMatrix to:

| sx 0 0 | | J K L | | sx*J sx*K sx*L | S(sx, sy) * Matrix = | 0 sy 0 | | M N O | = | sy*M sy*N sy*O | | 0 0 1 | | P Q R | | P Q R |

Parameters

sx horizontal scale factor
sy vertical scale factor

Example

See Also

preScale[2] setScale[2] MakeScale[2]


bool postIDiv(int divx, int divy)

Sets Matrix to Matrix constructed from scaling by (1/divx, 1/divy), about pivot point (px, py), multiplied by Matrix.

Returns false if either divx or divy is zero.

Given:

         | J K L |                   | sx  0  0 |
Matrix = | M N O |,  I(divx, divy) = |  0 sy  0 |
         | P Q R |                   |  0  0  1 |

where

sx = 1 / divx
sy = 1 / divy

sets Matrix to:

                         | sx  0  0 | | J K L |   | sx*J sx*K sx*L |
I(divx, divy) * Matrix = |  0 sy  0 | | M N O | = | sy*M sy*N sy*O |
                         |  0  0  1 | | P Q R |   |    P    Q    R |

Parameters

divx integer divisor for inverse scale in x
divy integer divisor for inverse scale in y

Return Value

true on successful scale

Example

See Also

postScale[2] MakeScale[2]


void postRotate(SkScalar degrees, SkScalar px, SkScalar py)

Sets SkMatrix to SkMatrix constructed from rotating by degrees about pivot point (px, py), multiplied by SkMatrix. This can be thought of as rotating about a pivot point after applying SkMatrix.

Positive degrees rotates clockwise.

Given:

| J K L | | c -s dx | Matrix = | M N O |, R(degrees, px, py) = | s c dy | | P Q R | | 0 0 1 |

where

c = cos(degrees) s = sin(degrees) dx = s * py + (1 - c) * px dy = -s * px + (1 - c) * py

sets SkMatrix to:

|c -s dx| |J K L| |cJ-sM+dxP cK-sN+dxQ cL-sO+dx+R| R(degrees, px, py) * Matrix = |s c dy| |M N O| = |sJ+cM+dyP sK+cN+dyQ sL+cO+dy*R| |0 0 1| |P Q R| | P Q R|

Parameters

degrees angle of axes relative to upright axes
px pivot on x-axis
py pivot on y-axis

Example

See Also

preRotate[2] setRotate[2]


void postRotate(SkScalar degrees)

Sets SkMatrix to SkMatrix constructed from rotating by degrees about pivot point (0, 0), multiplied by SkMatrix. This can be thought of as rotating about the origin after applying SkMatrix.

Positive degrees rotates clockwise.

Given:

| J K L | | c -s 0 | Matrix = | M N O |, R(degrees, px, py) = | s c 0 | | P Q R | | 0 0 1 |

where

c = cos(degrees) s = sin(degrees)

sets SkMatrix to:

| c -s dx | | J K L | | cJ-sM cK-sN cL-sO | R(degrees, px, py) * Matrix = | s c dy | | M N O | = | sJ+cM sK+cN sL+cO | | 0 0 1 | | P Q R | | P Q R |

Parameters

degrees angle of axes relative to upright axes

Example

See Also

preRotate[2] setRotate[2]


void postSkew(SkScalar kx, SkScalar ky, SkScalar px, SkScalar py)

Sets SkMatrix to SkMatrix constructed from skewing by (kx, ky) about pivot point (px, py), multiplied by SkMatrix. This can be thought of as skewing about a pivot point after applying SkMatrix.

Given:

| J K L | | 1 kx dx | Matrix = | M N O |, K(kx, ky, px, py) = | ky 1 dy | | P Q R | | 0 0 1 |

where

dx = -kx * py dy = -ky * px

sets SkMatrix to:

| 1 kx dx| |J K L| |J+kxM+dxP K+kxN+dxQ L+kx*O+dx+R| K(kx, ky, px, py) * Matrix = |ky 1 dy| |M N O| = |kyJ+M+dyP kyK+N+dyQ kyL+O+dyR| | 0 0 1| |P Q R| | P Q R|

Parameters

kx horizontal skew factor
ky vertical skew factor
px pivot on x-axis
py pivot on y-axis

Example

See Also

preSkew[2] setSkew[2]


void postSkew(SkScalar kx, SkScalar ky)

Sets SkMatrix to SkMatrix constructed from skewing by (kx, ky) about pivot point (0, 0), multiplied by SkMatrix. This can be thought of as skewing about the origin after applying SkMatrix.

Given:

| J K L | | 1 kx 0 | Matrix = | M N O |, K(kx, ky) = | ky 1 0 | | P Q R | | 0 0 1 |

sets SkMatrix to:

| 1 kx 0 | | J K L | | J+kx*M K+kx*N L+kx*O | K(kx, ky) * Matrix = | ky 1 0 | | M N O | = | ky*J+M ky*K+N ky*L+O | | 0 0 1 | | P Q R | | P Q R |

Parameters

kx horizontal skew factor
ky vertical skew factor

Example

See Also

preSkew[2] setSkew[2]


void postConcat(const SkMatrix& other)

Sets SkMatrix to SkMatrix other multiplied by SkMatrix. This can be thought of mapping by other after applying SkMatrix.

Given:

| J K L | | A B C | Matrix = | M N O |, other = | D E F | | P Q R | | G H I |

sets SkMatrix to:

| A B C | | J K L | | AJ+BM+CP AK+BN+CQ AL+BO+CR | other * Matrix = | D E F | * | M N O | = | DJ+EM+FP DK+EN+FQ DL+EO+FR | | G H I | | P Q R | | GJ+HM+IP GK+HN+IQ GL+HO+IR |

Parameters

other SkMatrix on left side of multiply expression

Example

See Also

preConcat setConcat Concat


    enum ScaleToFit {
        kFill_ScaleToFit,
        kStart_ScaleToFit,
        kCenter_ScaleToFit,
        kEnd_ScaleToFit,
    };

ScaleToFit describes how Matrix is constructed to map one Rect to another. ScaleToFit may allow Matrix to have unequal horizontal and vertical scaling, or may restrict Matrix to square scaling. If restricted, ScaleToFit specifies how Matrix maps to the side or center of the destination Rect.

Constants

Const Value Description
SkMatrix::kFill_ScaleToFit 0 Computes Matrix that scales in x and y independently, so that source Rect is mapped to completely fill destination Rect. The aspect ratio of source Rect may change.
SkMatrix::kStart_ScaleToFit 1 Computes Matrix that maintains source Rect aspect ratio, mapping source Rect width or height to destination Rect. Aligns mapping to left and top edges of destination Rect.
SkMatrix::kCenter_ScaleToFit 2 Computes Matrix that maintains source Rect aspect ratio, mapping source Rect width or height to destination Rect. Aligns mapping to center of destination Rect.
SkMatrix::kEnd_ScaleToFit 3 Computes Matrix that maintains source Rect aspect ratio, mapping source Rect width or height to destination Rect. Aligns mapping to right and bottom edges of destination Rect.

Example

See Also

setRectToRect MakeRectToRect setPolyToPoly


bool setRectToRect(const SkRect& src, const SkRect& dst, ScaleToFit stf)

Sets SkMatrix to scale and translate src SkRect to dst SkRect. stf selects whether mapping completely fills dst or preserves the aspect ratio, and how to align src within dst. Returns false if src is empty, and sets SkMatrix to identity. Returns true if dst is empty, and sets SkMatrix to:

| 0 0 0 | | 0 0 0 | | 0 0 1 |

Parameters

src SkRect to map from
dst SkRect to map to
stf one of: kFill_ScaleToFit, kStart_ScaleToFit,

kCenter_ScaleToFit, kEnd_ScaleToFit

Return Value

true if SkMatrix can represent SkRect mapping

Example

Example Output

src: 0, 0, 0, 0  dst: 0, 0, 0, 0  success: false
[  1.0000   0.0000   0.0000][  0.0000   1.0000   0.0000][  0.0000   0.0000   1.0000]
src: 0, 0, 0, 0  dst: 5, 6, 8, 9  success: false
[  1.0000   0.0000   0.0000][  0.0000   1.0000   0.0000][  0.0000   0.0000   1.0000]
src: 1, 2, 3, 4  dst: 0, 0, 0, 0  success: true
[  0.0000   0.0000   0.0000][  0.0000   0.0000   0.0000][  0.0000   0.0000   1.0000]
src: 1, 2, 3, 4  dst: 5, 6, 8, 9  success: true
[  1.5000   0.0000   3.5000][  0.0000   1.5000   3.0000][  0.0000   0.0000   1.0000]

See Also

MakeRectToRect ScaleToFit setPolyToPoly SkRect::isEmpty


static SkMatrix MakeRectToRect(const SkRect& src, const SkRect& dst, ScaleToFit stf)

Returns SkMatrix set to scale and translate src SkRect to dst SkRect. stf selects whether mapping completely fills dst or preserves the aspect ratio, and how to align src within dst. Returns the identity SkMatrix if src is empty. If dst is empty, returns SkMatrix set to:

| 0 0 0 | | 0 0 0 | | 0 0 1 |

Parameters

src SkRect to map from
dst SkRect to map to
stf one of: kFill_ScaleToFit, kStart_ScaleToFit,

kCenter_ScaleToFit, kEnd_ScaleToFit

Return Value

SkMatrix mapping src to dst

Example

Example Output

src: 0, 0, 0, 0  dst: 0, 0, 0, 0
[  1.0000   0.0000   0.0000][  0.0000   1.0000   0.0000][  0.0000   0.0000   1.0000]
src: 0, 0, 0, 0  dst: 5, 6, 8, 9
[  1.0000   0.0000   0.0000][  0.0000   1.0000   0.0000][  0.0000   0.0000   1.0000]
src: 1, 2, 3, 4  dst: 0, 0, 0, 0
[  0.0000   0.0000   0.0000][  0.0000   0.0000   0.0000][  0.0000   0.0000   1.0000]
src: 1, 2, 3, 4  dst: 5, 6, 8, 9
[  1.5000   0.0000   3.5000][  0.0000   1.5000   3.0000][  0.0000   0.0000   1.0000]

See Also

setRectToRect ScaleToFit setPolyToPoly SkRect::isEmpty


bool setPolyToPoly(const SkPoint src[], const SkPoint dst[], int count)

Sets SkMatrix to map src to dst. count must be zero or greater, and four or less.

If count is zero, sets SkMatrix to identity and returns true. If count is one, sets SkMatrix to translate and returns true. If count is two or more, sets SkMatrix to map SkPoint if possible; returns false if SkMatrix cannot be constructed. If count is four, SkMatrix may include perspective.

Parameters

src SkPoint to map from
dst SkPoint to map to
count number of SkPoint in src and dst

Return Value

true if SkMatrix was constructed successfully

Example

See Also

setRectToRect MakeRectToRect


bool invert(SkMatrix* inverse) const

Sets inverse to reciprocal matrix, returning true if SkMatrix can be inverted. Geometrically, if SkMatrix maps from source to destination, inverse SkMatrix maps from destination to source. If SkMatrix can not be inverted, inverse is unchanged.

Parameters

inverse storage for inverted SkMatrix; may be nullptr

Return Value

true if SkMatrix can be inverted

Example

See Also

Concat


static void SetAffineIdentity(SkScalar affine[6])

Fills affine with identity values in column major order. Sets affine to:

| 1 0 0 | | 0 1 0 |

Affine 3 by 2 matrices in column major order are used by OpenGL and XPS.

Parameters

affine storage for 3 by 2 affine matrix

Example

Example Output

ScaleX: 1 SkewY: 0 SkewX: 0 ScaleY: 1 TransX: 0 TransY: 0

See Also

setAffine asAffine


bool asAffine(SkScalar affine[6]) const

Fills affine in column major order. Sets affine to:

| scale-x skew-x translate-x | | skew-y scale-y translate-y |

If SkMatrix contains perspective, returns false and leaves affine unchanged.

Parameters

affine storage for 3 by 2 affine matrix; may be nullptr

Return Value

true if SkMatrix does not contain perspective

Example

Example Output

ScaleX: 2 SkewY: 5 SkewX: 3 ScaleY: 6 TransX: 4 TransY: 7

See Also

setAffine SetAffineIdentity


void setAffine(const SkScalar affine[6])

Sets SkMatrix to affine values, passed in column major order. Given affine, column, then row, as:

| scale-x skew-x translate-x | | skew-y scale-y translate-y |

SkMatrix is set, row, then column, to:

| scale-x skew-x translate-x | | skew-y scale-y translate-y | | 0 0 1 |

Parameters

affine 3 by 2 affine matrix

Example

Example Output

ScaleX: 2 SkewY: 5 SkewX: 3 ScaleY: 6 TransX: 4 TransY: 7
[  2.0000   3.0000   4.0000][  5.0000   6.0000   7.0000][  0.0000   0.0000   1.0000]

See Also

asAffine SetAffineIdentity


void mapPoints(SkPoint dst[], const SkPoint src[], int count) const

Maps src SkPoint array of length count to dst SkPoint array of equal or greater length. SkPoint are mapped by multiplying each SkPoint by SkMatrix. Given:

| A B C | | x | Matrix = | D E F |, pt = | y | | G H I | | 1 |

where

for (i = 0; i < count; ++i) { x = src[i].fX y = src[i].fY }

each dst SkPoint is computed as:

|A B C| |x| Ax+By+C Dx+Ey+F Matrix * pt = |D E F| |y| = |Ax+By+C Dx+Ey+F Gx+Hy+I| = ------- , ------- |G H I| |1| Gx+Hy+I Gx+Hy+I

src and dst may point to the same storage.

Parameters

dst storage for mapped SkPoint
src SkPoint to transform
count number of SkPoint to transform

Example

See Also

mapXY[2] mapHomogeneousPoints mapVectors[2]


void mapPoints(SkPoint pts[], int count) const

Maps pts SkPoint array of length count in place. SkPoint are mapped by multiplying each SkPoint by SkMatrix. Given:

| A B C | | x | Matrix = | D E F |, pt = | y | | G H I | | 1 |

where

for (i = 0; i < count; ++i) { x = pts[i].fX y = pts[i].fY }

each resulting pts SkPoint is computed as:

|A B C| |x| Ax+By+C Dx+Ey+F Matrix * pt = |D E F| |y| = |Ax+By+C Dx+Ey+F Gx+Hy+I| = ------- , ------- |G H I| |1| Gx+Hy+I Gx+Hy+I

Parameters

pts storage for mapped SkPoint
count number of SkPoint to transform

Example

See Also

mapXY[2] mapHomogeneousPoints mapVectors[2]


void mapHomogeneousPoints(SkPoint3 dst[], const SkPoint3 src[], int count) const

Maps src SkPoint3 array of length count to dst SkPoint3 array, which must of length count or greater. SkPoint3 array is mapped by multiplying each SkPoint3 by SkMatrix. Given:

| A B C | | x | Matrix = | D E F |, src = | y | | G H I | | z |

each resulting dst SkPoint is computed as:

|A B C| |x| Matrix * src = |D E F| |y| = |Ax+By+Cz Dx+Ey+Fz Gx+Hy+Iz| |G H I| |z|

Parameters

dst storage for mapped SkPoint3 array
src SkPoint3 array to transform
count items in SkPoint3 array to transform

Example

See Also

mapPoints[2] mapXY[2] mapVectors[2]


void mapXY(SkScalar x, SkScalar y, SkPoint* result) const

Maps SkPoint (x, y) to result. SkPoint is mapped by multiplying by SkMatrix. Given:

| A B C | | x | Matrix = | D E F |, pt = | y | | G H I | | 1 |

result is computed as:

|A B C| |x| Ax+By+C Dx+Ey+F Matrix * pt = |D E F| |y| = |Ax+By+C Dx+Ey+F Gx+Hy+I| = ------- , ------- |G H I| |1| Gx+Hy+I Gx+Hy+I

Parameters

x x-axis value of SkPoint to map
y y-axis value of SkPoint to map
result storage for mapped SkPoint

Example

See Also

mapPoints[2] mapVectors[2]


SkPoint mapXY(SkScalar x, SkScalar y) const

Returns SkPoint (x, y) multiplied by SkMatrix. Given:

| A B C | | x | Matrix = | D E F |, pt = | y | | G H I | | 1 |

result is computed as:

|A B C| |x| Ax+By+C Dx+Ey+F Matrix * pt = |D E F| |y| = |Ax+By+C Dx+Ey+F Gx+Hy+I| = ------- , ------- |G H I| |1| Gx+Hy+I Gx+Hy+I

Parameters

x x-axis value of SkPoint to map
y y-axis value of SkPoint to map

Return Value

mapped SkPoint

Example

See Also

mapPoints[2] mapVectors[2]


void mapVectors(SkVector dst[], const SkVector src[], int count) const

Maps src vector array of length count to vector SkPoint array of equal or greater length. Vectors are mapped by multiplying each vector by SkMatrix, treating SkMatrix translation as zero. Given:

| A B 0 | | x | Matrix = | D E 0 |, src = | y | | G H I | | 1 |

where

for (i = 0; i < count; ++i) { x = src[i].fX y = src[i].fY }

each dst vector is computed as:

|A B 0| |x| Ax+By Dx+Ey Matrix * src = |D E 0| |y| = |Ax+By Dx+Ey Gx+Hy+I| = ------- , ------- |G H I| |1| Gx+Hy+I Gx+Hy+I

src and dst may point to the same storage.

Parameters

dst storage for mapped vectors
src vectors to transform
count number of vectors to transform

Example

See Also

mapVector[2] mapPoints[2] mapXY[2]


void mapVectors(SkVector vecs[], int count) const

Maps vecs vector array of length count in place, multiplying each vector by SkMatrix, treating SkMatrix translation as zero. Given:

| A B 0 | | x | Matrix = | D E 0 |, vec = | y | | G H I | | 1 |

where

for (i = 0; i < count; ++i) { x = vecs[i].fX y = vecs[i].fY }

each result vector is computed as:

|A B 0| |x| Ax+By Dx+Ey Matrix * vec = |D E 0| |y| = |Ax+By Dx+Ey Gx+Hy+I| = ------- , ------- |G H I| |1| Gx+Hy+I Gx+Hy+I

Parameters

vecs vectors to transform, and storage for mapped vectors
count number of vectors to transform

Example

See Also

mapVector[2] mapPoints[2] mapXY[2]


void mapVector(SkScalar dx, SkScalar dy, SkVector* result) const

Maps vector (dx, dy) to result. Vector is mapped by multiplying by SkMatrix, treating SkMatrix translation as zero. Given:

| A B 0 | | dx | Matrix = | D E 0 |, vec = | dy | | G H I | | 1 |

each result vector is computed as:

|A B 0| |dx| A*dx+B*dy D*dx+E*dy Matrix * vec = |D E 0| |dy| = |A*dx+B*dy D*dx+E*dy G*dx+H*dy+I| = ----------- , ----------- |G H I| | 1| G*dx+H*dy+I G*dx+*dHy+I

Parameters

dx x-axis value of vector to map
dy y-axis value of vector to map
result storage for mapped vector

Example

See Also

mapVectors[2] mapPoints[2] mapXY[2]


SkVector mapVector(SkScalar dx, SkScalar dy) const

Returns vector (dx, dy) multiplied by SkMatrix, treating SkMatrix translation as zero. Given:

| A B 0 | | dx | Matrix = | D E 0 |, vec = | dy | | G H I | | 1 |

each result vector is computed as:

|A B 0| |dx| A*dx+B*dy D*dx+E*dy Matrix * vec = |D E 0| |dy| = |A*dx+B*dy D*dx+E*dy G*dx+H*dy+I| = ----------- , ----------- |G H I| | 1| G*dx+H*dy+I G*dx+*dHy+I

Parameters

dx x-axis value of vector to map
dy y-axis value of vector to map

Return Value

mapped vector

Example

See Also

mapVectors[2] mapPoints[2] mapXY[2]


bool mapRect(SkRect* dst, const SkRect& src) const

Sets dst to bounds of src corners mapped by SkMatrix. Returns true if mapped corners are dst corners.

Returned value is the same as calling rectStaysRect().

Parameters

dst storage for bounds of mapped SkPoint
src SkRect to map

Return Value

true if dst is equivalent to mapped src

Example

See Also

mapPoints[2] rectStaysRect


bool mapRect(SkRect* rect) const

Sets rect to bounds of rect corners mapped by SkMatrix. Returns true if mapped corners are computed rect corners.

Returned value is the same as calling rectStaysRect().

Parameters

rect rectangle to map, and storage for bounds of mapped corners

Return Value

true if result is equivalent to mapped src

Example

See Also

mapRectScaleTranslate mapPoints[2] rectStaysRect


SkRect mapRect(const SkRect& src) const

Returns bounds of src corners mapped by SkMatrix.

Parameters

src rectangle to map

Return Value

mapped bounds

Example

See Also

mapRectToQuad mapRectScaleTranslate


void mapRectToQuad(SkPoint dst[4], const SkRect& rect) const

Maps four corners of rect to dst. SkPoint are mapped by multiplying each rect corner by SkMatrix. rect corner is processed in this order: (rect.fLeft, rect.fTop), (rect.fRight, rect.fTop), (rect.fRight, rect.fBottom), (rect.fLeft, rect.fBottom).

rect may be empty: rect.fLeft may be greater than or equal to rect.fRight; rect.fTop may be greater than or equal to rect.fBottom.

Given:

| A B C | | x | Matrix = | D E F |, pt = | y | | G H I | | 1 |

where pt is initialized from each of (rect.fLeft, rect.fTop), (rect.fRight, rect.fTop), (rect.fRight, rect.fBottom), (rect.fLeft, rect.fBottom), each dst SkPoint is computed as:

|A B C| |x| Ax+By+C Dx+Ey+F Matrix * pt = |D E F| |y| = |Ax+By+C Dx+Ey+F Gx+Hy+I| = ------- , ------- |G H I| |1| Gx+Hy+I Gx+Hy+I

Parameters

dst storage for mapped corner SkPoint
rect SkRect to map

Example

See Also

mapRect[2][3] mapRectScaleTranslate


void mapRectScaleTranslate(SkRect* dst, const SkRect& src) const

Sets dst to bounds of src corners mapped by SkMatrix. If matrix contains elements other than scale or translate: asserts if SK_DEBUG is defined; otherwise, results are undefined.

Parameters

dst storage for bounds of mapped SkPoint
src SkRect to map

Example

See Also

mapRect[2][3] mapRectToQuad isScaleTranslate rectStaysRect


SkScalar mapRadius(SkScalar radius) const

Returns geometric mean radius of ellipse formed by constructing circle of size radius, and mapping constructed circle with SkMatrix. The result squared is equal to the major axis length times the minor axis length. Result is not meaningful if SkMatrix contains perspective elements.

Parameters

radius circle size to map

Return Value

average mapped radius

Example

The area enclosed by a square with sides equal to mappedRadius is the same as the area enclosed by the ellipse major and minor axes.

See Also

mapVector[2]


bool isFixedStepInX() const

Returns true if a unit step on x-axis at some y-axis value mapped through SkMatrix can be represented by a constant vector. Returns true if getType() returns kIdentity_Mask, or combinations of: kTranslate_Mask, kScale_Mask, and kAffine_Mask.

May return true if getType() returns kPerspective_Mask, but only when SkMatrix does not include rotation or skewing along the y-axis.

Return Value

true if SkMatrix does not have complex perspective

Example

Example Output

[  1.0000   0.0000   0.0000][  0.0000   1.0000   0.0000][  0.0000   0.0000   1.0000]
isFixedStepInX: true
[  1.0000   0.0000   0.0000][  0.0000   2.0000   0.0000][  0.0000   0.0000   1.0000]
isFixedStepInX: true
[  1.0000   0.0000   0.0000][  0.0000   1.0000   0.0000][  0.0000   0.1000   1.0000]
isFixedStepInX: true
[  1.0000   0.0000   0.0000][  0.0000   2.0000   0.0000][  0.0000   0.1000   1.0000]
isFixedStepInX: true
[  1.0000   0.0000   0.0000][  0.0000   1.0000   0.0000][  0.1000   0.0000   1.0000]
isFixedStepInX: false
[  1.0000   0.0000   0.0000][  0.0000   2.0000   0.0000][  0.1000   0.0000   1.0000]
isFixedStepInX: false
[  1.0000   0.0000   0.0000][  0.0000   1.0000   0.0000][  0.1000   0.1000   1.0000]
isFixedStepInX: false
[  1.0000   0.0000   0.0000][  0.0000   2.0000   0.0000][  0.1000   0.1000   1.0000]
isFixedStepInX: false

See Also

fixedStepInX getType


SkVector fixedStepInX(SkScalar y) const

Returns vector representing a unit step on x-axis at y mapped through SkMatrix. If isFixedStepInX() is false, returned value is undefined.

Parameters

y position of line parallel to x-axis

Return Value

vector advance of mapped unit step on x-axis

Example

See Also

isFixedStepInX getType


bool cheapEqualTo(const SkMatrix& m) const

Returns true if SkMatrix equals m, using an efficient comparison.

Returns false when the sign of zero values is the different; when one matrix has positive zero value and the other has negative zero value.

Returns true even when both SkMatrix contain NaN.

NaN never equals any value, including itself. To improve performance, NaN values are treated as bit patterns that are equal if their bit patterns are equal.

Parameters

m SkMatrix to compare

Return Value

true if m and SkMatrix are represented by identical bit patterns

Example

Example Output

identity: a == b a.cheapEqualTo(b): true
neg zero: a == b a.cheapEqualTo(b): false
one NaN: a != b a.cheapEqualTo(b): false
both NaN: a != b a.cheapEqualTo(b): true

See Also

operator==(const SkMatrix& a, const SkMatrix& b)


bool operator==(const SkMatrix& a, const SkMatrix& b)

Compares a and b; returns true if a and b are numerically equal. Returns true even if sign of zero values are different. Returns false if either SkMatrix contains NaN, even if the other SkMatrix also contains NaN.

Parameters

a SkMatrix to compare
b SkMatrix to compare

Return Value

true if SkMatrix a and SkMatrix b are numerically equal

Example

Example Output

identity: a == b a.cheapEqualTo(b): true

See Also

cheapEqualTo operator!=(const SkMatrix& a, const SkMatrix& b)


bool operator!=(const SkMatrix& a, const SkMatrix& b)

Compares a and b; returns true if a and b are not numerically equal. Returns false even if sign of zero values are different. Returns true if either SkMatrix contains NaN, even if the other SkMatrix also contains NaN.

Parameters

a SkMatrix to compare
b SkMatrix to compare

Return Value

true if SkMatrix a and SkMatrix b are numerically not equal

Example

See Also

cheapEqualTo operator==(const SkMatrix& a, const SkMatrix& b)


void dump() const

Writes text representation of SkMatrix to standard output. Floating point values are written with limited precision; it may not be possible to reconstruct original SkMatrix from output.

Example

Example Output

[  0.7071  -0.7071   0.0000][  0.7071   0.7071   0.0000][  0.0000   0.0000   1.0000]
[  0.7071  -0.7071   0.0000][  0.7071   0.7071   0.0000][  0.0000   0.0000   1.0000]
matrix != nearlyEqual

See Also

SkPath::dump[2]


SkScalar getMinScale() const

Returns the minimum scaling factor of SkMatrix by decomposing the scaling and skewing elements. Returns -1 if scale factor overflows or SkMatrix contains perspective.

Return Value

minimum scale factor

Example

Example Output

matrix.getMinScale() 24

See Also

getMaxScale getMinMaxScales


SkScalar getMaxScale() const

Returns the maximum scaling factor of SkMatrix by decomposing the scaling and skewing elements. Returns -1 if scale factor overflows or SkMatrix contains perspective.

Return Value

maximum scale factor

Example

Example Output

matrix.getMaxScale() 42

See Also

getMinScale getMinMaxScales


bool getMinMaxScales(SkScalar scaleFactors[2]) const

Sets scaleFactors[0] to the minimum scaling factor, and scaleFactors[1] to the maximum scaling factor. Scaling factors are computed by decomposing the SkMatrix scaling and skewing elements.

Returns true if scaleFactors are found; otherwise, returns false and sets scaleFactors to undefined values.

Parameters

scaleFactors storage for minimum and maximum scale factors

Return Value

true if scale factors were computed correctly

Example

Example Output

matrix.getMinMaxScales() false 2 2

See Also

getMinScale getMaxScale


bool decomposeScale(SkSize* scale, SkMatrix* remaining = nullptr) const

Decomposes Matrix into scale components and whatever remains. Returns false if Matrix could not be decomposed.

Sets scale to portion of Matrix that scale axes. Sets remaining to Matrix with scaling factored out. remaining may be passed as nullptr to determine if Matrix can be decomposed without computing remainder.

Returns true if scale components are found. scale and remaining are unchanged if Matrix contains perspective; scale factors are not finite, or are nearly zero.

On success: Matrix = scale * Remaining.

Parameters

scale axes scaling factors; may be nullptr
remaining Matrix without scaling; may be nullptr

Return Value

true if scale can be computed

Example

Example Output

[  0.0000  -0.2500   0.0000][  0.5000   0.0000   0.0000][  0.0000   0.0000   1.0000]
success: true  scale: 0.5, 0.25
[  0.0000  -0.5000   0.0000][  2.0000   0.0000   0.0000][  0.0000   0.0000   1.0000]
[  0.0000  -0.2500   0.0000][  0.5000   0.0000   0.0000][  0.0000   0.0000   1.0000]

See Also

setScale[2] MakeScale[2]


static const SkMatrix& I()

Returns reference to const identity SkMatrix. Returned SkMatrix is set to:

| 1 0 0 | | 0 1 0 | | 0 0 1 |

Return Value

const identity SkMatrix

Example

Example Output

m1 == m2
m2 == m3

See Also

reset() setIdentity


static const SkMatrix& InvalidMatrix()

Returns reference to a const SkMatrix with invalid values. Returned SkMatrix is set to:

| SK_ScalarMax SK_ScalarMax SK_ScalarMax | | SK_ScalarMax SK_ScalarMax SK_ScalarMax | | SK_ScalarMax SK_ScalarMax SK_ScalarMax |

Return Value

const invalid SkMatrix

Example

Example Output

scaleX 3.40282e+38

See Also

SeeAlso getType


static SkMatrix Concat(const SkMatrix& a, const SkMatrix& b)

Returns SkMatrix a multiplied by SkMatrix b.

Given:

| A B C | | J K L | a = | D E F |, b = | M N O | | G H I | | P Q R |

sets SkMatrix to:

| A B C | | J K L | | AJ+BM+CP AK+BN+CQ AL+BO+CR | a * b = | D E F | * | M N O | = | DJ+EM+FP DK+EN+FQ DL+EO+FR | | G H I | | P Q R | | GJ+HM+IP GK+HN+IQ GL+HO+IR |

Parameters

a SkMatrix on left side of multiply expression
b SkMatrix on right side of multiply expression

Return Value

SkMatrix computed from a times b

Example

setPolyToPoly creates perspective matrices, one the inverse of the other. Multiplying the matrix by its inverse turns into an identity matrix.

See Also

preConcat postConcat


void dirtyMatrixTypeCache()

Sets internal cache to unknown state. Use to force update after repeated modifications to SkMatrix element reference returned by operator[](int index).

Example

Example Output

with identity matrix: x = 24
after skew x mod:     x = 24
after 2nd skew x mod: x = 24
after dirty cache:    x = 66

See Also

operator[](int index) getType


void setScaleTranslate(SkScalar sx, SkScalar sy, SkScalar tx, SkScalar ty)

Initializes SkMatrix with scale and translate elements.

| sx 0 tx | | 0 sy ty | | 0 0 1 |

Parameters

sx horizontal scale factor to store
sy vertical scale factor to store
tx horizontal translation to store
ty vertical translation to store

Example

Example Output

[  1.0000   0.0000   3.0000][  0.0000   2.0000   4.0000][  0.0000   0.0000   1.0000]

See Also

setScale[2] preTranslate postTranslate


bool isFinite() const

Returns true if all elements of the matrix are finite. Returns false if any element is infinity, or NaN.

Return Value

true if matrix has only finite elements

Example

Example Output

[  1.0000   0.0000      nan][  0.0000   1.0000   0.0000][  0.0000   0.0000   1.0000]
matrix is finite: false
matrix != matrix

See Also

operator==