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
This commit is contained in:
bungeman@google.com 2011-10-07 21:55:56 +00:00
Родитель cf385232c4
Коммит 07faed1102
5 изменённых файлов: 32 добавлений и 35 удалений

Просмотреть файл

@ -58,9 +58,9 @@ static SkString dumpMatrix(SkDumpCanvas* canvas) {
SkScalarToFloat(m.get(SkMatrix::kMSkewX)), SkScalarToFloat(m.get(SkMatrix::kMSkewX)),
SkScalarToFloat(m.get(SkMatrix::kMSkewY))); SkScalarToFloat(m.get(SkMatrix::kMSkewY)));
str.appendf("Perspective (%0.4g, %0.4g, %0.4g) ", str.appendf("Perspective (%0.4g, %0.4g, %0.4g) ",
SkScalarToFloat(m.get(SkMatrix::kMPersp0)), SkScalarToFloat(SkPerspToScalar(m.get(SkMatrix::kMPersp0))),
SkScalarToFloat(m.get(SkMatrix::kMPersp1)), SkScalarToFloat(SkPerspToScalar(m.get(SkMatrix::kMPersp1))),
SkScalarToFloat(m.get(SkMatrix::kMPersp2))); SkScalarToFloat(SkPerspToScalar(m.get(SkMatrix::kMPersp2))));
return str; return str;
} }
@ -150,4 +150,4 @@ void SkDebugDumper::dump(SkDumpCanvas* canvas, SkDumpCanvas::Verb verb,
state->post(); state->post();
} }
} }
} }

Просмотреть файл

@ -90,7 +90,7 @@ protected:
canvas->translate(SkIntToScalar(100), SkIntToScalar(100)); canvas->translate(SkIntToScalar(100), SkIntToScalar(100));
SkMatrix mat; SkMatrix mat;
mat.reset(); mat.reset();
mat.setPerspY(SK_Scalar1 / 1000); mat.setPerspY(SkScalarToPersp(SK_Scalar1 / 1000));
canvas->concat(mat); canvas->concat(mat);
canvas->drawPaint(bkgnrd); canvas->drawPaint(bkgnrd);
canvas->restore(); canvas->restore();
@ -98,8 +98,8 @@ protected:
// draw the paths in perspective // draw the paths in perspective
SkMatrix persp; SkMatrix persp;
persp.reset(); persp.reset();
persp.setPerspX(-SK_Scalar1 / 1800); persp.setPerspX(SkScalarToPersp(-SK_Scalar1 / 1800));
persp.setPerspY(SK_Scalar1 / 500); persp.setPerspY(SkScalarToPersp(SK_Scalar1 / 500));
canvas->concat(persp); canvas->concat(persp);
canvas->translate(SkIntToScalar(20), SkIntToScalar(20)); canvas->translate(SkIntToScalar(20), SkIntToScalar(20));

Просмотреть файл

@ -14,6 +14,16 @@
class SkString; 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 /** \class SkMatrix
The SkMatrix class holds a 3x3 matrix for transforming coordinates. The SkMatrix class holds a 3x3 matrix for transforming coordinates.
@ -114,8 +124,8 @@ public:
SkScalar getSkewX() const { return fMat[kMSkewX]; } SkScalar getSkewX() const { return fMat[kMSkewX]; }
SkScalar getTranslateX() const { return fMat[kMTransX]; } SkScalar getTranslateX() const { return fMat[kMTransX]; }
SkScalar getTranslateY() const { return fMat[kMTransY]; } SkScalar getTranslateY() const { return fMat[kMTransY]; }
SkScalar getPerspX() const { return fMat[kMPersp0]; } SkPersp getPerspX() const { return fMat[kMPersp0]; }
SkScalar getPerspY() const { return fMat[kMPersp1]; } SkPersp getPerspY() const { return fMat[kMPersp1]; }
SkScalar& operator[](int index) { SkScalar& operator[](int index) {
SkASSERT((unsigned)index < 9); SkASSERT((unsigned)index < 9);
@ -135,12 +145,12 @@ public:
void setSkewX(SkScalar v) { this->set(kMSkewX, v); } void setSkewX(SkScalar v) { this->set(kMSkewX, v); }
void setTranslateX(SkScalar v) { this->set(kMTransX, v); } void setTranslateX(SkScalar v) { this->set(kMTransX, v); }
void setTranslateY(SkScalar v) { this->set(kMTransY, v); } void setTranslateY(SkScalar v) { this->set(kMTransY, v); }
void setPerspX(SkScalar v) { this->set(kMPersp0, v); } void setPerspX(SkPersp v) { this->set(kMPersp0, v); }
void setPerspY(SkScalar v) { this->set(kMPersp1, v); } void setPerspY(SkPersp v) { this->set(kMPersp1, v); }
void setAll(SkScalar scaleX, SkScalar skewX, SkScalar transX, void setAll(SkScalar scaleX, SkScalar skewX, SkScalar transX,
SkScalar skewY, SkScalar scaleY, SkScalar transY, SkScalar skewY, SkScalar scaleY, SkScalar transY,
SkScalar persp0, SkScalar persp1, SkScalar persp2) { SkPersp persp0, SkPersp persp1, SkPersp persp2) {
fMat[kMScaleX] = scaleX; fMat[kMScaleX] = scaleX;
fMat[kMSkewX] = skewX; fMat[kMSkewX] = skewX;
fMat[kMTransX] = transX; fMat[kMTransX] = transX;

Просмотреть файл

@ -119,10 +119,10 @@ void SkDrawMatrix::dump(SkAnimateMaker* maker) {
result = fMatrix.getTranslateY(); result = fMatrix.getTranslateY();
if (result) if (result)
SkDebugf("ty=\"%g\" ", SkScalarToFloat(result)); SkDebugf("ty=\"%g\" ", SkScalarToFloat(result));
result = fMatrix.getPerspX(); result = SkPerspToScalar(fMatrix.getPerspX());
if (result) if (result)
SkDebugf("perspect-x=\"%g\" ", SkScalarToFloat(result)); SkDebugf("perspect-x=\"%g\" ", SkScalarToFloat(result));
result = fMatrix.getPerspY(); result = SkPerspToScalar(fMatrix.getPerspY());
if (result) if (result)
SkDebugf("perspect-y=\"%g\" ", SkScalarToFloat(result)); SkDebugf("perspect-y=\"%g\" ", SkScalarToFloat(result));
SkDebugf("/>\n"); SkDebugf("/>\n");
@ -190,14 +190,9 @@ void SkDrawMatrix::onEndElement(SkAnimateMaker& ) {
fMatrix.setSkewY(vals[3]); fMatrix.setSkewY(vals[3]);
fMatrix.setScaleY(vals[4]); fMatrix.setScaleY(vals[4]);
fMatrix.setTranslateY(vals[5]); fMatrix.setTranslateY(vals[5]);
#ifdef SK_SCALAR_IS_FIXED fMatrix.setPerspX(SkScalarToPersp(vals[6]));
fMatrix.setPerspX(SkFixedToFract(vals[6])); fMatrix.setPerspY(SkScalarToPersp(vals[7]));
fMatrix.setPerspY(SkFixedToFract(vals[7])); // fMatrix.setPerspW(SkScalarToPersp(vals[8]));
#else
fMatrix.setPerspX(vals[6]);
fMatrix.setPerspY(vals[7]);
#endif
// fMatrix.setPerspW(vals[8]);
goto setConcat; goto setConcat;
} }
if (fChildHasID == false) { if (fChildHasID == false) {
@ -229,18 +224,10 @@ bool SkDrawMatrix::setProperty(int index, SkScriptValue& scriptValue) {
fMatrix.setTranslateY((*scriptValue.fOperand.fArray)[1].fScalar); fMatrix.setTranslateY((*scriptValue.fOperand.fArray)[1].fScalar);
return true; return true;
case SK_PROPERTY(perspectX): case SK_PROPERTY(perspectX):
#ifdef SK_SCALAR_IS_FIXED fMatrix.setPerspX(SkScalarToPersp((number)));
fMatrix.setPerspX(SkFixedToFract(number));
#else
fMatrix.setPerspX(number);
#endif
break; break;
case SK_PROPERTY(perspectY): case SK_PROPERTY(perspectY):
#ifdef SK_SCALAR_IS_FIXED fMatrix.setPerspY(SkScalarToPersp((number)));
fMatrix.setPerspY(SkFixedToFract(number));
#else
fMatrix.setPerspY(number);
#endif
break; break;
case SK_PROPERTY(rotate): { case SK_PROPERTY(rotate): {
SkMatrix temp; SkMatrix temp;

Просмотреть файл

@ -81,12 +81,12 @@ void test_matrix_max_stretch(skiatest::Reporter* reporter) {
SkMatrix perspX; SkMatrix perspX;
perspX.reset(); perspX.reset();
perspX.setPerspX(SK_Scalar1 / 1000); perspX.setPerspX(SkScalarToPersp(SK_Scalar1 / 1000));
REPORTER_ASSERT(reporter, -SK_Scalar1 == perspX.getMaxStretch()); REPORTER_ASSERT(reporter, -SK_Scalar1 == perspX.getMaxStretch());
SkMatrix perspY; SkMatrix perspY;
perspY.reset(); perspY.reset();
perspY.setPerspX(-SK_Scalar1 / 500); perspY.setPerspX(SkScalarToPersp(-SK_Scalar1 / 500));
REPORTER_ASSERT(reporter, -SK_Scalar1 == perspY.getMaxStretch()); REPORTER_ASSERT(reporter, -SK_Scalar1 == perspY.getMaxStretch());
SkMatrix baseMats[] = {scale, rot90Scale, rotate, SkMatrix baseMats[] = {scale, rot90Scale, rotate,
@ -234,7 +234,7 @@ void TestMatrix(skiatest::Reporter* reporter) {
REPORTER_ASSERT(reporter, affineEqual(TransY)); REPORTER_ASSERT(reporter, affineEqual(TransY));
#undef affineEqual #undef affineEqual
mat.set(SkMatrix::kMPersp1, SkIntToScalar(1)); mat.set(SkMatrix::kMPersp1, SkScalarToPersp(SK_Scalar1 / 2));
REPORTER_ASSERT(reporter, !mat.asAffine(affine)); REPORTER_ASSERT(reporter, !mat.asAffine(affine));
test_matrix_max_stretch(reporter); test_matrix_max_stretch(reporter);