| Index: src/core/SkMatrixPriv.h
|
| diff --git a/src/core/SkMatrixPriv.h b/src/core/SkMatrixPriv.h
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..91185f08d148771b21b3e4d14afc8e634defabfb
|
| --- /dev/null
|
| +++ b/src/core/SkMatrixPriv.h
|
| @@ -0,0 +1,70 @@
|
| +/*
|
| + * Copyright 2016 Google Inc.
|
| + *
|
| + * Use of this source code is governed by a BSD-style license that can be
|
| + * found in the LICENSE file.
|
| + */
|
| +
|
| +#ifndef SkMatrixPriv_DEFINE
|
| +#define SkMatrixPriv_DEFINE
|
| +
|
| +#include "SkMatrix.h"
|
| +#include "SkNx.h"
|
| +
|
| +class SkMatrixPriv {
|
| +public:
|
| + /**
|
| + * Attempt to map the rect through the inverse of the matrix. If it is not invertible,
|
| + * then this returns false and dst is unchanged.
|
| + */
|
| + static bool SK_WARN_UNUSED_RESULT InverseMapRect(const SkMatrix& mx,
|
| + SkRect* dst, const SkRect& src) {
|
| + if (mx.getType() <= SkMatrix::kTranslate_Mask) {
|
| + SkScalar tx = mx.getTranslateX();
|
| + SkScalar ty = mx.getTranslateY();
|
| + Sk4f trans(tx, ty, tx, ty);
|
| + (Sk4f::Load(&src.fLeft) - trans).store(&dst->fLeft);
|
| + return true;
|
| + }
|
| + // Insert other special-cases here (e.g. scale+translate)
|
| +
|
| + // general case
|
| + SkMatrix inverse;
|
| + if (mx.invert(&inverse)) {
|
| + inverse.mapRect(dst, src);
|
| + return true;
|
| + }
|
| + return false;
|
| + }
|
| +
|
| + static void MapPointsWithStride(const SkMatrix& mx, SkPoint pts[], size_t stride, int count) {
|
| + SkASSERT(stride >= sizeof(SkPoint));
|
| + SkASSERT(0 == stride % sizeof(SkScalar));
|
| +
|
| + SkMatrix::TypeMask tm = mx.getType();
|
| +
|
| + if (SkMatrix::kIdentity_Mask == tm) {
|
| + return;
|
| + }
|
| + if (SkMatrix::kTranslate_Mask == tm) {
|
| + const SkScalar tx = mx.getTranslateX();
|
| + const SkScalar ty = mx.getTranslateY();
|
| + Sk2s trans(tx, ty);
|
| + for (int i = 0; i < count; ++i) {
|
| + (Sk2s::Load(&pts->fX) + trans).store(&pts->fX);
|
| + pts = (SkPoint*)((intptr_t)pts + stride);
|
| + }
|
| + return;
|
| + }
|
| + // Insert other special-cases here (e.g. scale+translate)
|
| +
|
| + // general case
|
| + SkMatrix::MapXYProc proc = mx.getMapXYProc();
|
| + for (int i = 0; i < count; ++i) {
|
| + proc(mx, pts->fX, pts->fY, pts);
|
| + pts = (SkPoint*)((intptr_t)pts + stride);
|
| + }
|
| + }
|
| +};
|
| +
|
| +#endif
|
|
|