Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a775f0fc authored by Romain Guy's avatar Romain Guy Committed by Steve Kondik
Browse files

Fast loadInverse() implementation for the common case

Most matrices used by the UI toolkit are translation matrices, whose
inverses can be quickly computed by using the negated translation
vector.

Change-Id: I54a28a634a586085779bfc26f3a4160cd5ab2b22
parent 0e4c53e4
Loading
Loading
Loading
Loading
+32 −4
Original line number Diff line number Diff line
@@ -203,6 +203,34 @@ void Matrix4::copyTo(SkMatrix& v) const {
}

void Matrix4::loadInverse(const Matrix4& v) {
    // Fast case for common translation matrices
    if (v.isPureTranslate()) {
        // Reset the matrix
        // Unnamed fields are never written to except by
        // loadIdentity(), they don't need to be reset
        data[kScaleX]       = 1.0f;
        data[kSkewX]        = 0.0f;

        data[kScaleY]       = 1.0f;
        data[kSkewY]        = 0.0f;

        data[kScaleZ]       = 1.0f;

        data[kPerspective0] = 0.0f;
        data[kPerspective1] = 0.0f;
        data[kPerspective2] = 1.0f;

        // No need to deal with kTranslateZ because isPureTranslate()
        // only returns true when the kTranslateZ component is 0
        data[kTranslateX]   = -v.data[kTranslateX];
        data[kTranslateY]   = -v.data[kTranslateY];
        data[kTranslateZ]   = 0.0f;

        // A "pure translate" matrix can be identity or translation
        mType = v.getType();
        return;
    }

    double scale = 1.0 /
            (v.data[kScaleX] * ((double) v.data[kScaleY]  * v.data[kPerspective2] -
                    (double) v.data[kTranslateY] * v.data[kPerspective1]) +