Add 'K' to SampleApp to trigger animated perspective rendering

Review URL: http://codereview.appspot.com/4967061/



git-svn-id: http://skia.googlecode.com/svn/trunk@2244 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/samplecode/SampleApp.cpp b/samplecode/SampleApp.cpp
index 3805ca6..7dbec17 100644
--- a/samplecode/SampleApp.cpp
+++ b/samplecode/SampleApp.cpp
@@ -432,6 +432,8 @@
     fRepeatDrawing = false;
     fAnimating = false;
     fRotate = false;
+    fPerspAnim = false;
+    fPerspAnimTime = 0;
     fScale = false;
     fRequestGrabImage = false;
     fUsePipe = false;
@@ -615,8 +617,14 @@
         return;
     }
     // update the animation time
-    gAnimTimePrev = gAnimTime;
-    gAnimTime = SkTime::GetMSecs();
+    if (!gAnimTimePrev && !gAnimTime) {
+        // first time make delta be 0
+        gAnimTime = SkTime::GetMSecs();
+        gAnimTimePrev = gAnimTime;
+    } else {
+        gAnimTimePrev = gAnimTime;
+        gAnimTime = SkTime::GetMSecs();
+    }
 
     SkScalar cx = fZoomCenterX;
     SkScalar cy = fZoomCenterY;
@@ -1023,6 +1031,22 @@
         canvas->rotate(SkIntToScalar(30));
         canvas->translate(-cx, -cy);
     }
+    if (fPerspAnim) {
+        fPerspAnimTime += SampleCode::GetAnimSecondsDelta();

+

+        static const SkScalar gAnimPeriod = 10 * SK_Scalar1;

+        static const SkScalar gAnimMag = SK_Scalar1 / 1000;

+        SkScalar t = SkScalarMod(fPerspAnimTime, gAnimPeriod);

+        if (SkScalarFloorToInt(SkScalarDiv(fPerspAnimTime, gAnimPeriod)) & 0x1) {

+            t = gAnimPeriod - t;

+        }

+        t = 2 * t - gAnimPeriod;

+        t = SkScalarMul(SkScalarDiv(t, gAnimPeriod), gAnimMag);

+        SkMatrix m;

+        m.reset();

+        m.setPerspY(t);

+        canvas->concat(m);
+    }
 
     canvas->setDrawFilter(new FlagsDrawFilter(fLCDState, fAAState,
                                        fFilterState, fHintingState))->unref();
@@ -1035,6 +1059,9 @@
     } else {
         (void)SampleView::SetRepeatDraw(child, 1);
     }
+    if (fPerspAnim) {
+        this->inval(NULL);
+    }
     //(void)SampleView::SetUsePipe(child, fUsePipe);
 }
 
@@ -1302,6 +1329,11 @@
             this->inval(NULL);
             this->updateTitle();
             return true;
+        case 'k':
+            fPerspAnim = !fPerspAnim;
+            this->inval(NULL);
+            this->updateTitle();
+            return true;
         case 's':
             fScale = !fScale;
             this->inval(NULL);
@@ -1555,6 +1587,9 @@
     if (fNClip) {
         title.prepend("<C> ");
     }
+    if (fPerspAnim) {
+        title.prepend("<K> ");
+    }
 
     title.prepend(trystate_str(fLCDState, "LCD ", "lcd "));
     title.prepend(trystate_str(fAAState, "AA ", "aa "));