Setting perspective in fixed point.
http://codereview.appspot.com/5088043/
git-svn-id: http://skia.googlecode.com/svn/trunk@2435 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/experimental/Debugger/SkDebugDumper.cpp b/experimental/Debugger/SkDebugDumper.cpp
index 2f63462..29b5049 100644
--- a/experimental/Debugger/SkDebugDumper.cpp
+++ b/experimental/Debugger/SkDebugDumper.cpp
@@ -58,9 +58,9 @@
SkScalarToFloat(m.get(SkMatrix::kMSkewX)),
SkScalarToFloat(m.get(SkMatrix::kMSkewY)));
str.appendf("Perspective (%0.4g, %0.4g, %0.4g) ",
- SkScalarToFloat(m.get(SkMatrix::kMPersp0)),
- SkScalarToFloat(m.get(SkMatrix::kMPersp1)),
- SkScalarToFloat(m.get(SkMatrix::kMPersp2)));
+ SkScalarToFloat(SkPerspToScalar(m.get(SkMatrix::kMPersp0))),
+ SkScalarToFloat(SkPerspToScalar(m.get(SkMatrix::kMPersp1))),
+ SkScalarToFloat(SkPerspToScalar(m.get(SkMatrix::kMPersp2))));
return str;
}
@@ -150,4 +150,4 @@
state->post();
}
}
-}
\ No newline at end of file
+}
diff --git a/gm/filltypespersp.cpp b/gm/filltypespersp.cpp
index 9105473..33f3242 100644
--- a/gm/filltypespersp.cpp
+++ b/gm/filltypespersp.cpp
@@ -90,7 +90,7 @@
canvas->translate(SkIntToScalar(100), SkIntToScalar(100));
SkMatrix mat;
mat.reset();
- mat.setPerspY(SK_Scalar1 / 1000);
+ mat.setPerspY(SkScalarToPersp(SK_Scalar1 / 1000));
canvas->concat(mat);
canvas->drawPaint(bkgnrd);
canvas->restore();
@@ -98,8 +98,8 @@
// draw the paths in perspective
SkMatrix persp;
persp.reset();
- persp.setPerspX(-SK_Scalar1 / 1800);
- persp.setPerspY(SK_Scalar1 / 500);
+ persp.setPerspX(SkScalarToPersp(-SK_Scalar1 / 1800));
+ persp.setPerspY(SkScalarToPersp(SK_Scalar1 / 500));
canvas->concat(persp);
canvas->translate(SkIntToScalar(20), SkIntToScalar(20));
diff --git a/include/core/SkMatrix.h b/include/core/SkMatrix.h
index 8c7f54b..8fdb818 100644
--- a/include/core/SkMatrix.h
+++ b/include/core/SkMatrix.h
@@ -14,6 +14,16 @@
class SkString;
+#ifdef SK_SCALAR_IS_FLOAT
+ typedef SkScalar SkPersp;
+ #define SkScalarToPersp(x) (x)
+ #define SkPerspToScalar(x) (x)
+#else
+ typedef SkFract SkPersp;
+ #define SkScalarToPersp(x) SkFixedToFract(x)
+ #define SkPerspToScalar(x) SkFractToFixed(x)
+#endif
+
/** \class SkMatrix
The SkMatrix class holds a 3x3 matrix for transforming coordinates.
@@ -114,8 +124,8 @@
SkScalar getSkewX() const { return fMat[kMSkewX]; }
SkScalar getTranslateX() const { return fMat[kMTransX]; }
SkScalar getTranslateY() const { return fMat[kMTransY]; }
- SkScalar getPerspX() const { return fMat[kMPersp0]; }
- SkScalar getPerspY() const { return fMat[kMPersp1]; }
+ SkPersp getPerspX() const { return fMat[kMPersp0]; }
+ SkPersp getPerspY() const { return fMat[kMPersp1]; }
SkScalar& operator[](int index) {
SkASSERT((unsigned)index < 9);
@@ -135,12 +145,12 @@
void setSkewX(SkScalar v) { this->set(kMSkewX, v); }
void setTranslateX(SkScalar v) { this->set(kMTransX, v); }
void setTranslateY(SkScalar v) { this->set(kMTransY, v); }
- void setPerspX(SkScalar v) { this->set(kMPersp0, v); }
- void setPerspY(SkScalar v) { this->set(kMPersp1, v); }
+ void setPerspX(SkPersp v) { this->set(kMPersp0, v); }
+ void setPerspY(SkPersp v) { this->set(kMPersp1, v); }
void setAll(SkScalar scaleX, SkScalar skewX, SkScalar transX,
SkScalar skewY, SkScalar scaleY, SkScalar transY,
- SkScalar persp0, SkScalar persp1, SkScalar persp2) {
+ SkPersp persp0, SkPersp persp1, SkPersp persp2) {
fMat[kMScaleX] = scaleX;
fMat[kMSkewX] = skewX;
fMat[kMTransX] = transX;
diff --git a/src/animator/SkDrawMatrix.cpp b/src/animator/SkDrawMatrix.cpp
index fcf33e3..96e8292 100644
--- a/src/animator/SkDrawMatrix.cpp
+++ b/src/animator/SkDrawMatrix.cpp
@@ -119,10 +119,10 @@
result = fMatrix.getTranslateY();
if (result)
SkDebugf("ty=\"%g\" ", SkScalarToFloat(result));
- result = fMatrix.getPerspX();
+ result = SkPerspToScalar(fMatrix.getPerspX());
if (result)
SkDebugf("perspect-x=\"%g\" ", SkScalarToFloat(result));
- result = fMatrix.getPerspY();
+ result = SkPerspToScalar(fMatrix.getPerspY());
if (result)
SkDebugf("perspect-y=\"%g\" ", SkScalarToFloat(result));
SkDebugf("/>\n");
@@ -190,14 +190,9 @@
fMatrix.setSkewY(vals[3]);
fMatrix.setScaleY(vals[4]);
fMatrix.setTranslateY(vals[5]);
-#ifdef SK_SCALAR_IS_FIXED
- fMatrix.setPerspX(SkFixedToFract(vals[6]));
- fMatrix.setPerspY(SkFixedToFract(vals[7]));
-#else
- fMatrix.setPerspX(vals[6]);
- fMatrix.setPerspY(vals[7]);
-#endif
-// fMatrix.setPerspW(vals[8]);
+ fMatrix.setPerspX(SkScalarToPersp(vals[6]));
+ fMatrix.setPerspY(SkScalarToPersp(vals[7]));
+// fMatrix.setPerspW(SkScalarToPersp(vals[8]));
goto setConcat;
}
if (fChildHasID == false) {
@@ -229,18 +224,10 @@
fMatrix.setTranslateY((*scriptValue.fOperand.fArray)[1].fScalar);
return true;
case SK_PROPERTY(perspectX):
-#ifdef SK_SCALAR_IS_FIXED
- fMatrix.setPerspX(SkFixedToFract(number));
-#else
- fMatrix.setPerspX(number);
-#endif
+ fMatrix.setPerspX(SkScalarToPersp((number)));
break;
case SK_PROPERTY(perspectY):
-#ifdef SK_SCALAR_IS_FIXED
- fMatrix.setPerspY(SkFixedToFract(number));
-#else
- fMatrix.setPerspY(number);
-#endif
+ fMatrix.setPerspY(SkScalarToPersp((number)));
break;
case SK_PROPERTY(rotate): {
SkMatrix temp;
diff --git a/tests/MatrixTest.cpp b/tests/MatrixTest.cpp
index abc0d54..7bad9de 100644
--- a/tests/MatrixTest.cpp
+++ b/tests/MatrixTest.cpp
@@ -81,12 +81,12 @@
SkMatrix perspX;
perspX.reset();
- perspX.setPerspX(SK_Scalar1 / 1000);
+ perspX.setPerspX(SkScalarToPersp(SK_Scalar1 / 1000));
REPORTER_ASSERT(reporter, -SK_Scalar1 == perspX.getMaxStretch());
SkMatrix perspY;
perspY.reset();
- perspY.setPerspX(-SK_Scalar1 / 500);
+ perspY.setPerspX(SkScalarToPersp(-SK_Scalar1 / 500));
REPORTER_ASSERT(reporter, -SK_Scalar1 == perspY.getMaxStretch());
SkMatrix baseMats[] = {scale, rot90Scale, rotate,
@@ -234,7 +234,7 @@
REPORTER_ASSERT(reporter, affineEqual(TransY));
#undef affineEqual
- mat.set(SkMatrix::kMPersp1, SkIntToScalar(1));
+ mat.set(SkMatrix::kMPersp1, SkScalarToPersp(SK_Scalar1 / 2));
REPORTER_ASSERT(reporter, !mat.asAffine(affine));
test_matrix_max_stretch(reporter);