OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2011 Google Inc. | 2 * Copyright 2011 Google Inc. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
6 */ | 6 */ |
7 | 7 |
8 #include "SampleApp.h" | 8 #include "SampleApp.h" |
9 | 9 |
10 #include "OverView.h" | 10 #include "OverView.h" |
11 #include "Resources.h" | 11 #include "Resources.h" |
12 #include "SampleCode.h" | 12 #include "SampleCode.h" |
13 #include "SamplePipeControllers.h" | 13 #include "SamplePipeControllers.h" |
| 14 #include "SkAnimTimer.h" |
14 #include "SkCanvas.h" | 15 #include "SkCanvas.h" |
15 #include "SkCommandLineFlags.h" | 16 #include "SkCommandLineFlags.h" |
16 #include "SkData.h" | 17 #include "SkData.h" |
17 #include "SkDevice.h" | 18 #include "SkDevice.h" |
18 #include "SkDocument.h" | 19 #include "SkDocument.h" |
19 #include "SkGPipe.h" | 20 #include "SkGPipe.h" |
20 #include "SkGraphics.h" | 21 #include "SkGraphics.h" |
21 #include "SkImageEncoder.h" | 22 #include "SkImageEncoder.h" |
22 #include "SkOSFile.h" | 23 #include "SkOSFile.h" |
23 #include "SkPaint.h" | 24 #include "SkPaint.h" |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
95 #define FPS_REPEAT_COUNT (10 * FPS_REPEAT_MULTIPLIER) | 96 #define FPS_REPEAT_COUNT (10 * FPS_REPEAT_MULTIPLIER) |
96 | 97 |
97 static SampleWindow* gSampleWindow; | 98 static SampleWindow* gSampleWindow; |
98 | 99 |
99 static bool gShowGMBounds; | 100 static bool gShowGMBounds; |
100 | 101 |
101 static void post_event_to_sink(SkEvent* evt, SkEventSink* sink) { | 102 static void post_event_to_sink(SkEvent* evt, SkEventSink* sink) { |
102 evt->setTargetID(sink->getSinkID())->post(); | 103 evt->setTargetID(sink->getSinkID())->post(); |
103 } | 104 } |
104 | 105 |
| 106 static SkAnimTimer gAnimTimer; |
| 107 |
105 /////////////////////////////////////////////////////////////////////////////// | 108 /////////////////////////////////////////////////////////////////////////////// |
106 | 109 |
107 static const char* skip_until(const char* str, const char* skip) { | 110 static const char* skip_until(const char* str, const char* skip) { |
108 if (!str) { | 111 if (!str) { |
109 return NULL; | 112 return NULL; |
110 } | 113 } |
111 return strstr(str, skip); | 114 return strstr(str, skip); |
112 } | 115 } |
113 | 116 |
114 static const char* skip_past(const char* str, const char* skip) { | 117 static const char* skip_past(const char* str, const char* skip) { |
(...skipping 455 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
570 size[1] = height; | 573 size[1] = height; |
571 evt->setScalars(gPrefSizeEvtName, 2, size); | 574 evt->setScalars(gPrefSizeEvtName, 2, size); |
572 } | 575 } |
573 | 576 |
574 bool SampleCode::FastTextQ(const SkEvent& evt) { | 577 bool SampleCode::FastTextQ(const SkEvent& evt) { |
575 return evt.isType(gFastTextEvtName, sizeof(gFastTextEvtName) - 1); | 578 return evt.isType(gFastTextEvtName, sizeof(gFastTextEvtName) - 1); |
576 } | 579 } |
577 | 580 |
578 /////////////////////////////////////////////////////////////////////////////// | 581 /////////////////////////////////////////////////////////////////////////////// |
579 | 582 |
580 static SkMSec gAnimTime; | |
581 static SkMSec gAnimTimePrev; | |
582 | |
583 SkMSec SampleCode::GetAnimTime() { return gAnimTime; } | |
584 SkMSec SampleCode::GetAnimTimeDelta() { return gAnimTime - gAnimTimePrev; } | |
585 SkScalar SampleCode::GetAnimSecondsDelta() { | |
586 return SkDoubleToScalar(GetAnimTimeDelta() / 1000.0); | |
587 } | |
588 | |
589 SkScalar SampleCode::GetAnimScalar(SkScalar speed, SkScalar period) { | |
590 // since gAnimTime can be up to 32 bits, we can't convert it to a float | |
591 // or we'll lose the low bits. Hence we use doubles for the intermediate | |
592 // calculations | |
593 double seconds = (double)gAnimTime / 1000.0; | |
594 double value = SkScalarToDouble(speed) * seconds; | |
595 if (period) { | |
596 value = ::fmod(value, SkScalarToDouble(period)); | |
597 } | |
598 return SkDoubleToScalar(value); | |
599 } | |
600 | |
601 SkScalar SampleCode::GetAnimSinScalar(SkScalar amplitude, | |
602 SkScalar periodInSec, | |
603 SkScalar phaseInSec) { | |
604 if (!periodInSec) { | |
605 return 0; | |
606 } | |
607 double t = (double)gAnimTime / 1000.0 + phaseInSec; | |
608 t *= SkScalarToFloat(2 * SK_ScalarPI) / periodInSec; | |
609 amplitude = SK_ScalarHalf * amplitude; | |
610 return SkScalarMul(amplitude, SkDoubleToScalar(sin(t))) + amplitude; | |
611 } | |
612 | |
613 enum TilingMode { | 583 enum TilingMode { |
614 kNo_Tiling, | 584 kNo_Tiling, |
615 kAbs_128x128_Tiling, | 585 kAbs_128x128_Tiling, |
616 kAbs_256x256_Tiling, | 586 kAbs_256x256_Tiling, |
617 kRel_4x4_Tiling, | 587 kRel_4x4_Tiling, |
618 kRel_1x16_Tiling, | 588 kRel_1x16_Tiling, |
619 kRel_16x1_Tiling, | 589 kRel_16x1_Tiling, |
620 | 590 |
621 kLast_TilingMode_Enum | 591 kLast_TilingMode_Enum |
622 }; | 592 }; |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
658 title->set(evt.findString(gTitleEvtName)); | 628 title->set(evt.findString(gTitleEvtName)); |
659 return true; | 629 return true; |
660 } | 630 } |
661 } | 631 } |
662 return false; | 632 return false; |
663 } | 633 } |
664 | 634 |
665 bool SampleWindow::sendAnimatePulse() { | 635 bool SampleWindow::sendAnimatePulse() { |
666 SkView* view = curr_view(this); | 636 SkView* view = curr_view(this); |
667 if (SampleView::IsSampleView(view)) { | 637 if (SampleView::IsSampleView(view)) { |
668 if (fDoAnimate) { | 638 return ((SampleView*)view)->animate(gAnimTimer); |
669 return ((SampleView*)view)->animatePulse(gAnimTime, gAnimTimePrev); | |
670 } else { | |
671 // 0 signals the view that we are no longer animating | |
672 ((SampleView*)view)->animatePulse(0, 0); | |
673 } | |
674 } | 639 } |
675 return false; | 640 return false; |
676 } | 641 } |
677 | 642 |
678 void SampleWindow::setZoomCenter(float x, float y) | 643 void SampleWindow::setZoomCenter(float x, float y) |
679 { | 644 { |
680 fZoomCenterX = x; | 645 fZoomCenterX = x; |
681 fZoomCenterY = y; | 646 fZoomCenterY = y; |
682 } | 647 } |
683 | 648 |
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
829 | 794 |
830 fDeviceType = kRaster_DeviceType; | 795 fDeviceType = kRaster_DeviceType; |
831 | 796 |
832 #if DEFAULT_TO_GPU | 797 #if DEFAULT_TO_GPU |
833 fDeviceType = kGPU_DeviceType; | 798 fDeviceType = kGPU_DeviceType; |
834 #endif | 799 #endif |
835 #if SK_ANGLE && DEFAULT_TO_ANGLE | 800 #if SK_ANGLE && DEFAULT_TO_ANGLE |
836 fDeviceType = kANGLE_DeviceType; | 801 fDeviceType = kANGLE_DeviceType; |
837 #endif | 802 #endif |
838 | 803 |
839 fDoAnimate = true; | |
840 fUseClip = false; | 804 fUseClip = false; |
841 fNClip = false; | 805 fNClip = false; |
842 fAnimating = false; | 806 fAnimating = false; |
843 fRotate = false; | 807 fRotate = false; |
844 fRotateAnimTime = 0; | |
845 fPerspAnim = false; | 808 fPerspAnim = false; |
846 fPerspAnimTime = 0; | |
847 fRequestGrabImage = false; | 809 fRequestGrabImage = false; |
848 fPipeState = SkOSMenu::kOffState; | 810 fPipeState = SkOSMenu::kOffState; |
849 fTilingMode = kNo_Tiling; | 811 fTilingMode = kNo_Tiling; |
850 fMeasureFPS = false; | 812 fMeasureFPS = false; |
851 fLCDState = SkOSMenu::kMixedState; | 813 fLCDState = SkOSMenu::kMixedState; |
852 fAAState = SkOSMenu::kMixedState; | 814 fAAState = SkOSMenu::kMixedState; |
853 fSubpixelState = SkOSMenu::kMixedState; | 815 fSubpixelState = SkOSMenu::kMixedState; |
854 fHintingState = 0; | 816 fHintingState = 0; |
855 fFilterLevelIndex = 0; | 817 fFilterLevelIndex = 0; |
856 fFlipAxis = 0; | 818 fFlipAxis = 0; |
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
967 // onSizeChange gets called. | 929 // onSizeChange gets called. |
968 if (this->height() && this->width()) { | 930 if (this->height() && this->width()) { |
969 this->onSizeChange(); | 931 this->onSizeChange(); |
970 } | 932 } |
971 | 933 |
972 // can't call this synchronously, since it may require a subclass to | 934 // can't call this synchronously, since it may require a subclass to |
973 // to implement, or the caller may need us to have returned from the | 935 // to implement, or the caller may need us to have returned from the |
974 // constructor first. Hence we post an event to ourselves. | 936 // constructor first. Hence we post an event to ourselves. |
975 // this->updateTitle(); | 937 // this->updateTitle(); |
976 post_event_to_sink(new SkEvent(gUpdateWindowTitleEvtName), this); | 938 post_event_to_sink(new SkEvent(gUpdateWindowTitleEvtName), this); |
| 939 |
| 940 gAnimTimer.run(); |
977 } | 941 } |
978 | 942 |
979 SampleWindow::~SampleWindow() { | 943 SampleWindow::~SampleWindow() { |
980 SkSafeUnref(fTypeface); | 944 SkSafeUnref(fTypeface); |
981 SkSafeUnref(fDevManager); | 945 SkSafeUnref(fDevManager); |
982 } | 946 } |
983 | 947 |
984 | 948 |
985 int SampleWindow::findByTitle(const char title[]) { | 949 int SampleWindow::findByTitle(const char title[]) { |
986 int i, count = fSamples.count(); | 950 int i, count = fSamples.count(); |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1043 canvas->drawText(c_str, size, left + SK_Scalar1, top + SK_Scalar1, paint
); | 1007 canvas->drawText(c_str, size, left + SK_Scalar1, top + SK_Scalar1, paint
); |
1044 } | 1008 } |
1045 paint.setColor(desiredColor); | 1009 paint.setColor(desiredColor); |
1046 canvas->drawText(c_str, size, left, top, paint); | 1010 canvas->drawText(c_str, size, left, top, paint); |
1047 } | 1011 } |
1048 | 1012 |
1049 #define XCLIP_N 8 | 1013 #define XCLIP_N 8 |
1050 #define YCLIP_N 8 | 1014 #define YCLIP_N 8 |
1051 | 1015 |
1052 void SampleWindow::draw(SkCanvas* canvas) { | 1016 void SampleWindow::draw(SkCanvas* canvas) { |
1053 // update the animation time | 1017 gAnimTimer.updateTime(); |
1054 if (!gAnimTimePrev && !gAnimTime) { | |
1055 // first time make delta be 0 | |
1056 gAnimTime = SkTime::GetMSecs(); | |
1057 gAnimTimePrev = gAnimTime; | |
1058 } else { | |
1059 gAnimTimePrev = gAnimTime; | |
1060 gAnimTime = SkTime::GetMSecs(); | |
1061 } | |
1062 | 1018 |
1063 if (fGesture.isActive()) { | 1019 if (fGesture.isActive()) { |
1064 this->updateMatrix(); | 1020 this->updateMatrix(); |
1065 } | 1021 } |
1066 | 1022 |
1067 if (fMeasureFPS) { | 1023 if (fMeasureFPS) { |
1068 fMeasureFPS_Time = 0; | 1024 fMeasureFPS_Time = 0; |
1069 } | 1025 } |
1070 | 1026 |
1071 if (fNClip) { | 1027 if (fNClip) { |
(...skipping 329 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1401 } | 1357 } |
1402 | 1358 |
1403 // Do this after presentGL and other finishing, rather than in afterChild | 1359 // Do this after presentGL and other finishing, rather than in afterChild |
1404 if (fMeasureFPS && fMeasureFPS_StartTime) { | 1360 if (fMeasureFPS && fMeasureFPS_StartTime) { |
1405 fMeasureFPS_Time += SkTime::GetMSecs() - fMeasureFPS_StartTime; | 1361 fMeasureFPS_Time += SkTime::GetMSecs() - fMeasureFPS_StartTime; |
1406 } | 1362 } |
1407 } | 1363 } |
1408 | 1364 |
1409 void SampleWindow::beforeChild(SkView* child, SkCanvas* canvas) { | 1365 void SampleWindow::beforeChild(SkView* child, SkCanvas* canvas) { |
1410 if (fRotate) { | 1366 if (fRotate) { |
1411 fRotateAnimTime += SampleCode::GetAnimSecondsDelta(); | |
1412 | |
1413 SkScalar cx = this->width() / 2; | 1367 SkScalar cx = this->width() / 2; |
1414 SkScalar cy = this->height() / 2; | 1368 SkScalar cy = this->height() / 2; |
1415 canvas->translate(cx, cy); | 1369 canvas->translate(cx, cy); |
1416 canvas->rotate(fRotateAnimTime * 10); | 1370 canvas->rotate(gAnimTimer.scaled(10)); |
1417 canvas->translate(-cx, -cy); | 1371 canvas->translate(-cx, -cy); |
1418 } | 1372 } |
1419 | 1373 |
1420 if (fPerspAnim) { | 1374 if (fPerspAnim) { |
1421 fPerspAnimTime += SampleCode::GetAnimSecondsDelta(); | 1375 SkScalar secs = gAnimTimer.scaled(1); |
1422 | 1376 |
1423 static const SkScalar gAnimPeriod = 10 * SK_Scalar1; | 1377 static const SkScalar gAnimPeriod = 10 * SK_Scalar1; |
1424 static const SkScalar gAnimMag = SK_Scalar1 / 1000; | 1378 static const SkScalar gAnimMag = SK_Scalar1 / 1000; |
1425 SkScalar t = SkScalarMod(fPerspAnimTime, gAnimPeriod); | 1379 SkScalar t = SkScalarMod(secs, gAnimPeriod); |
1426 if (SkScalarFloorToInt(SkScalarDiv(fPerspAnimTime, gAnimPeriod)) & 0x1)
{ | 1380 if (SkScalarFloorToInt(SkScalarDiv(secs, gAnimPeriod)) & 0x1) { |
1427 t = gAnimPeriod - t; | 1381 t = gAnimPeriod - t; |
1428 } | 1382 } |
1429 t = 2 * t - gAnimPeriod; | 1383 t = 2 * t - gAnimPeriod; |
1430 t = SkScalarMul(SkScalarDiv(t, gAnimPeriod), gAnimMag); | 1384 t = SkScalarMul(SkScalarDiv(t, gAnimPeriod), gAnimMag); |
1431 SkMatrix m; | 1385 SkMatrix m; |
1432 m.reset(); | 1386 m.reset(); |
1433 #if 1 | 1387 #if 1 |
1434 m.setPerspY(t); | 1388 m.setPerspY(t); |
1435 #else | 1389 #else |
1436 m.setPerspY(SK_Scalar1 / 1000); | 1390 m.setPerspY(SK_Scalar1 / 1000); |
(...skipping 225 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1662 SkEvent evt(gFastTextEvtName); | 1616 SkEvent evt(gFastTextEvtName); |
1663 return curr_view(this)->doQuery(&evt); | 1617 return curr_view(this)->doQuery(&evt); |
1664 } | 1618 } |
1665 if (query->isType("ignore-window-bitmap")) { | 1619 if (query->isType("ignore-window-bitmap")) { |
1666 query->setFast32(this->getGrContext() != NULL); | 1620 query->setFast32(this->getGrContext() != NULL); |
1667 return true; | 1621 return true; |
1668 } | 1622 } |
1669 return this->INHERITED::onQuery(query); | 1623 return this->INHERITED::onQuery(query); |
1670 } | 1624 } |
1671 | 1625 |
1672 #if 0 // UNUSED | |
1673 static void cleanup_for_filename(SkString* name) { | |
1674 char* str = name->writable_str(); | |
1675 for (size_t i = 0; i < name->size(); i++) { | |
1676 switch (str[i]) { | |
1677 case ':': str[i] = '-'; break; | |
1678 case '/': str[i] = '-'; break; | |
1679 case ' ': str[i] = '_'; break; | |
1680 default: break; | |
1681 } | |
1682 } | |
1683 } | |
1684 #endif | |
1685 | |
1686 DECLARE_bool(portableFonts); | 1626 DECLARE_bool(portableFonts); |
1687 | 1627 |
1688 bool SampleWindow::onHandleChar(SkUnichar uni) { | 1628 bool SampleWindow::onHandleChar(SkUnichar uni) { |
1689 { | 1629 { |
1690 SkView* view = curr_view(this); | 1630 SkView* view = curr_view(this); |
1691 if (view) { | 1631 if (view) { |
1692 SkEvent evt(gCharEvtName); | 1632 SkEvent evt(gCharEvtName); |
1693 evt.setFast32(uni); | 1633 evt.setFast32(uni); |
1694 if (view->doQuery(&evt)) { | 1634 if (view->doQuery(&evt)) { |
1695 return true; | 1635 return true; |
(...skipping 24 matching lines...) Expand all Loading... |
1720 fScrollTestX = fScrollTestY = 0; | 1660 fScrollTestX = fScrollTestY = 0; |
1721 } else { | 1661 } else { |
1722 fScrollTestX += dx; | 1662 fScrollTestX += dx; |
1723 fScrollTestY += dy; | 1663 fScrollTestY += dy; |
1724 } | 1664 } |
1725 this->inval(NULL); | 1665 this->inval(NULL); |
1726 return true; | 1666 return true; |
1727 } | 1667 } |
1728 | 1668 |
1729 switch (uni) { | 1669 switch (uni) { |
1730 case ' ': | 1670 case 27: // ESC |
1731 fDoAnimate = !fDoAnimate; | 1671 gAnimTimer.stop(); |
1732 if (this->sendAnimatePulse()) { | 1672 if (this->sendAnimatePulse()) { |
1733 this->inval(NULL); | 1673 this->inval(NULL); |
1734 } | 1674 } |
| 1675 break; |
| 1676 case ' ': |
| 1677 gAnimTimer.togglePauseResume(); |
| 1678 if (this->sendAnimatePulse()) { |
| 1679 this->inval(NULL); |
| 1680 } |
1735 break; | 1681 break; |
1736 case 'B': | 1682 case 'B': |
1737 post_event_to_sink(SkNEW_ARGS(SkEvent, ("PictFileView::toggleBBox"))
, curr_view(this)); | 1683 post_event_to_sink(SkNEW_ARGS(SkEvent, ("PictFileView::toggleBBox"))
, curr_view(this)); |
1738 // Cannot call updateTitle() synchronously, because the toggleBBox e
vent is still in | 1684 // Cannot call updateTitle() synchronously, because the toggleBBox e
vent is still in |
1739 // the queue. | 1685 // the queue. |
1740 post_event_to_sink(SkNEW_ARGS(SkEvent, (gUpdateWindowTitleEvtName)),
this); | 1686 post_event_to_sink(SkNEW_ARGS(SkEvent, (gUpdateWindowTitleEvtName)),
this); |
1741 this->inval(NULL); | 1687 this->inval(NULL); |
1742 break; | 1688 break; |
1743 case 'D': | 1689 case 'D': |
1744 toggleDistanceFieldFonts(); | 1690 toggleDistanceFieldFonts(); |
(...skipping 17 matching lines...) Expand all Loading... |
1762 this->inval(NULL); | 1708 this->inval(NULL); |
1763 break; | 1709 break; |
1764 case 'i': | 1710 case 'i': |
1765 this->zoomIn(); | 1711 this->zoomIn(); |
1766 break; | 1712 break; |
1767 case 'o': | 1713 case 'o': |
1768 this->zoomOut(); | 1714 this->zoomOut(); |
1769 break; | 1715 break; |
1770 case 'r': | 1716 case 'r': |
1771 fRotate = !fRotate; | 1717 fRotate = !fRotate; |
1772 fRotateAnimTime = 0; | |
1773 this->inval(NULL); | 1718 this->inval(NULL); |
1774 this->updateTitle(); | 1719 this->updateTitle(); |
1775 return true; | 1720 return true; |
1776 case 'k': | 1721 case 'k': |
1777 fPerspAnim = !fPerspAnim; | 1722 fPerspAnim = !fPerspAnim; |
1778 this->inval(NULL); | 1723 this->inval(NULL); |
1779 this->updateTitle(); | 1724 this->updateTitle(); |
1780 return true; | 1725 return true; |
1781 #if SK_SUPPORT_GPU | 1726 #if SK_SUPPORT_GPU |
1782 case '\\': | 1727 case '\\': |
(...skipping 661 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2444 setenv("ANDROID_ROOT", "/android/device/data", 0); | 2389 setenv("ANDROID_ROOT", "/android/device/data", 0); |
2445 #endif | 2390 #endif |
2446 SkGraphics::Init(); | 2391 SkGraphics::Init(); |
2447 SkEvent::Init(); | 2392 SkEvent::Init(); |
2448 } | 2393 } |
2449 | 2394 |
2450 void application_term() { | 2395 void application_term() { |
2451 SkEvent::Term(); | 2396 SkEvent::Term(); |
2452 SkGraphics::Term(); | 2397 SkGraphics::Term(); |
2453 } | 2398 } |
OLD | NEW |