| Index: samplecode/SampleApp.cpp
|
| diff --git a/samplecode/SampleApp.cpp b/samplecode/SampleApp.cpp
|
| index 5b8ed96905ae64434b5d9348e424efc0595beb67..cd5793f6a3007bd62fc5a6228302f5abb8d48ff8 100644
|
| --- a/samplecode/SampleApp.cpp
|
| +++ b/samplecode/SampleApp.cpp
|
| @@ -11,6 +11,7 @@
|
| #include "Resources.h"
|
| #include "SampleCode.h"
|
| #include "SamplePipeControllers.h"
|
| +#include "SkAnimTimer.h"
|
| #include "SkCanvas.h"
|
| #include "SkCommandLineFlags.h"
|
| #include "SkData.h"
|
| @@ -102,6 +103,8 @@ static void post_event_to_sink(SkEvent* evt, SkEventSink* sink) {
|
| evt->setTargetID(sink->getSinkID())->post();
|
| }
|
|
|
| +static SkAnimTimer gAnimTimer;
|
| +
|
| ///////////////////////////////////////////////////////////////////////////////
|
|
|
| static const char* skip_until(const char* str, const char* skip) {
|
| @@ -577,39 +580,6 @@ bool SampleCode::FastTextQ(const SkEvent& evt) {
|
|
|
| ///////////////////////////////////////////////////////////////////////////////
|
|
|
| -static SkMSec gAnimTime;
|
| -static SkMSec gAnimTimePrev;
|
| -
|
| -SkMSec SampleCode::GetAnimTime() { return gAnimTime; }
|
| -SkMSec SampleCode::GetAnimTimeDelta() { return gAnimTime - gAnimTimePrev; }
|
| -SkScalar SampleCode::GetAnimSecondsDelta() {
|
| - return SkDoubleToScalar(GetAnimTimeDelta() / 1000.0);
|
| -}
|
| -
|
| -SkScalar SampleCode::GetAnimScalar(SkScalar speed, SkScalar period) {
|
| - // since gAnimTime can be up to 32 bits, we can't convert it to a float
|
| - // or we'll lose the low bits. Hence we use doubles for the intermediate
|
| - // calculations
|
| - double seconds = (double)gAnimTime / 1000.0;
|
| - double value = SkScalarToDouble(speed) * seconds;
|
| - if (period) {
|
| - value = ::fmod(value, SkScalarToDouble(period));
|
| - }
|
| - return SkDoubleToScalar(value);
|
| -}
|
| -
|
| -SkScalar SampleCode::GetAnimSinScalar(SkScalar amplitude,
|
| - SkScalar periodInSec,
|
| - SkScalar phaseInSec) {
|
| - if (!periodInSec) {
|
| - return 0;
|
| - }
|
| - double t = (double)gAnimTime / 1000.0 + phaseInSec;
|
| - t *= SkScalarToFloat(2 * SK_ScalarPI) / periodInSec;
|
| - amplitude = SK_ScalarHalf * amplitude;
|
| - return SkScalarMul(amplitude, SkDoubleToScalar(sin(t))) + amplitude;
|
| -}
|
| -
|
| enum TilingMode {
|
| kNo_Tiling,
|
| kAbs_128x128_Tiling,
|
| @@ -665,12 +635,7 @@ static bool curr_title(SkWindow* wind, SkString* title) {
|
| bool SampleWindow::sendAnimatePulse() {
|
| SkView* view = curr_view(this);
|
| if (SampleView::IsSampleView(view)) {
|
| - if (fDoAnimate) {
|
| - return ((SampleView*)view)->animatePulse(gAnimTime, gAnimTimePrev);
|
| - } else {
|
| - // 0 signals the view that we are no longer animating
|
| - ((SampleView*)view)->animatePulse(0, 0);
|
| - }
|
| + return ((SampleView*)view)->animate(gAnimTimer);
|
| }
|
| return false;
|
| }
|
| @@ -836,14 +801,11 @@ SampleWindow::SampleWindow(void* hwnd, int argc, char** argv, DeviceManager* dev
|
| fDeviceType = kANGLE_DeviceType;
|
| #endif
|
|
|
| - fDoAnimate = true;
|
| fUseClip = false;
|
| fNClip = false;
|
| fAnimating = false;
|
| fRotate = false;
|
| - fRotateAnimTime = 0;
|
| fPerspAnim = false;
|
| - fPerspAnimTime = 0;
|
| fRequestGrabImage = false;
|
| fPipeState = SkOSMenu::kOffState;
|
| fTilingMode = kNo_Tiling;
|
| @@ -974,6 +936,8 @@ SampleWindow::SampleWindow(void* hwnd, int argc, char** argv, DeviceManager* dev
|
| // constructor first. Hence we post an event to ourselves.
|
| // this->updateTitle();
|
| post_event_to_sink(new SkEvent(gUpdateWindowTitleEvtName), this);
|
| +
|
| + gAnimTimer.run();
|
| }
|
|
|
| SampleWindow::~SampleWindow() {
|
| @@ -1050,15 +1014,7 @@ static void drawText(SkCanvas* canvas, SkString string, SkScalar left, SkScalar
|
| #define YCLIP_N 8
|
|
|
| void SampleWindow::draw(SkCanvas* canvas) {
|
| - // update the animation time
|
| - if (!gAnimTimePrev && !gAnimTime) {
|
| - // first time make delta be 0
|
| - gAnimTime = SkTime::GetMSecs();
|
| - gAnimTimePrev = gAnimTime;
|
| - } else {
|
| - gAnimTimePrev = gAnimTime;
|
| - gAnimTime = SkTime::GetMSecs();
|
| - }
|
| + gAnimTimer.updateTime();
|
|
|
| if (fGesture.isActive()) {
|
| this->updateMatrix();
|
| @@ -1408,22 +1364,20 @@ void SampleWindow::afterChildren(SkCanvas* orig) {
|
|
|
| void SampleWindow::beforeChild(SkView* child, SkCanvas* canvas) {
|
| if (fRotate) {
|
| - fRotateAnimTime += SampleCode::GetAnimSecondsDelta();
|
| -
|
| SkScalar cx = this->width() / 2;
|
| SkScalar cy = this->height() / 2;
|
| canvas->translate(cx, cy);
|
| - canvas->rotate(fRotateAnimTime * 10);
|
| + canvas->rotate(gAnimTimer.scaled(10));
|
| canvas->translate(-cx, -cy);
|
| }
|
|
|
| if (fPerspAnim) {
|
| - fPerspAnimTime += SampleCode::GetAnimSecondsDelta();
|
| + SkScalar secs = gAnimTimer.scaled(1);
|
|
|
| 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) {
|
| + SkScalar t = SkScalarMod(secs, gAnimPeriod);
|
| + if (SkScalarFloorToInt(SkScalarDiv(secs, gAnimPeriod)) & 0x1) {
|
| t = gAnimPeriod - t;
|
| }
|
| t = 2 * t - gAnimPeriod;
|
| @@ -1669,20 +1623,6 @@ bool SampleWindow::onQuery(SkEvent* query) {
|
| return this->INHERITED::onQuery(query);
|
| }
|
|
|
| -#if 0 // UNUSED
|
| -static void cleanup_for_filename(SkString* name) {
|
| - char* str = name->writable_str();
|
| - for (size_t i = 0; i < name->size(); i++) {
|
| - switch (str[i]) {
|
| - case ':': str[i] = '-'; break;
|
| - case '/': str[i] = '-'; break;
|
| - case ' ': str[i] = '_'; break;
|
| - default: break;
|
| - }
|
| - }
|
| -}
|
| -#endif
|
| -
|
| DECLARE_bool(portableFonts);
|
|
|
| bool SampleWindow::onHandleChar(SkUnichar uni) {
|
| @@ -1727,8 +1667,14 @@ bool SampleWindow::onHandleChar(SkUnichar uni) {
|
| }
|
|
|
| switch (uni) {
|
| + case 27: // ESC
|
| + gAnimTimer.stop();
|
| + if (this->sendAnimatePulse()) {
|
| + this->inval(NULL);
|
| + }
|
| + break;
|
| case ' ':
|
| - fDoAnimate = !fDoAnimate;
|
| + gAnimTimer.togglePauseResume();
|
| if (this->sendAnimatePulse()) {
|
| this->inval(NULL);
|
| }
|
| @@ -1769,7 +1715,6 @@ bool SampleWindow::onHandleChar(SkUnichar uni) {
|
| break;
|
| case 'r':
|
| fRotate = !fRotate;
|
| - fRotateAnimTime = 0;
|
| this->inval(NULL);
|
| this->updateTitle();
|
| return true;
|
|
|