diff options
| author | bsalomon@google.com <bsalomon@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2011-10-31 14:18:20 +0000 |
|---|---|---|
| committer | bsalomon@google.com <bsalomon@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2011-10-31 14:18:20 +0000 |
| commit | 48dd1a26ec07c5baa04856202e4e7e2a53e4d7e5 (patch) | |
| tree | a9ceb415616952a40de7f286a556e20e4841bbf3 /samplecode/SampleApp.cpp | |
| parent | 562a2ac95b8cd8b359574f8c4d6300b0475938db (diff) | |
Import all GMs as Samples.
Review URL: http://codereview.appspot.com/5332043/
git-svn-id: http://skia.googlecode.com/svn/trunk@2564 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'samplecode/SampleApp.cpp')
| -rw-r--r-- | samplecode/SampleApp.cpp | 87 |
1 files changed, 75 insertions, 12 deletions
diff --git a/samplecode/SampleApp.cpp b/samplecode/SampleApp.cpp index b0d471ded3..7947e742ee 100644 --- a/samplecode/SampleApp.cpp +++ b/samplecode/SampleApp.cpp @@ -56,7 +56,7 @@ SkTDArray<char> gTempDataStore; #define USE_ARROWS_FOR_ZOOM true //#define DEFAULT_TO_GPU -extern SkView* create_overview(int, const SkViewFactory[]); +extern SkView* create_overview(int, const SkViewFactory*[]); extern bool is_overview(SkView* view); extern SkView* create_transition(SkView*, SkView*, int); extern bool is_transition(SkView* view); @@ -240,16 +240,73 @@ static bool isInvalEvent(const SkEvent& evt) { } ////////////////// +SkFuncViewFactory::SkFuncViewFactory(SkViewCreateFunc func) + : fCreateFunc(func) { +} + +SkView* SkFuncViewFactory::operator() () const SK_OVERRIDE { + return (*fCreateFunc)(); +} + +#include "GMSampleView.h" + +SkGMSampleViewFactory::SkGMSampleViewFactory(GMFactoryFunc func) + : fFunc(func) { +} + +SkView* SkGMSampleViewFactory::operator() () const { + return new GMSampleView(fFunc(NULL)); +} + SkViewRegister* SkViewRegister::gHead; -SkViewRegister::SkViewRegister(SkViewFactory fact) : fFact(fact) { +SkViewRegister::SkViewRegister(SkViewFactory* fact) : fFact(fact) { + fFact->ref(); + fChain = gHead; + gHead = this; +} + +SkViewRegister::SkViewRegister(SkViewCreateFunc func) { + fFact = new SkFuncViewFactory(func); + fChain = gHead; + gHead = this; +} + +SkViewRegister::SkViewRegister(GMFactoryFunc func) { + fFact = new SkGMSampleViewFactory(func); + fChain = gHead; + gHead = this; +} + +class AutoUnrefArray { +public: + AutoUnrefArray() {} + ~AutoUnrefArray() { + int count = fObjs.count(); + for (int i = 0; i < count; ++i) { + fObjs[i]->unref(); + } + } + SkRefCnt*& push_back() { return *fObjs.append(); } + +private: + SkTDArray<SkRefCnt*> fObjs; +}; + +// registers GMs as Samples +// This can't be performed during static initialization because it could be +// run before GMRegistry has been fully built. +void SkGMRegistyToSampleRegistry() { static bool gOnce; + static AutoUnrefArray fRegisters; + if (!gOnce) { - gHead = NULL; + const skiagm::GMRegistry* gmreg = skiagm::GMRegistry::Head(); + while (gmreg) { + fRegisters.push_back() = new SkViewRegister(gmreg->factory()); + gmreg = gmreg->next(); + } gOnce = true; } - - fChain = gHead; - gHead = this; } #if 0 @@ -416,6 +473,11 @@ GrContext* SampleCode::GetGr() { return gSampleWindow ? gSampleWindow->getGrContext() : NULL; } +// some GMs rely on having a skiagm::GetGr function defined +namespace skiagm { + GrContext* GetGr() { return SampleCode::GetGr(); } +} + ////////////////////////////////////////////////////////////////////////////// static SkView* curr_view(SkWindow* wind) { @@ -570,6 +632,7 @@ SampleWindow::SampleWindow(void* hwnd, int argc, char** argv, DeviceManager* dev this->setVisibleP(true); this->setClipToBounds(false); + SkGMRegistyToSampleRegistry(); { const SkViewRegister* reg = SkViewRegister::Head(); while (reg) { @@ -591,7 +654,7 @@ SampleWindow::SampleWindow(void* hwnd, int argc, char** argv, DeviceManager* dev fprintf(stderr, "Unknown sample \"%s\"\n", argv[1]); } } - this->loadView(fSamples[fCurrIndex]()); + this->loadView((*fSamples[fCurrIndex])()); fPDFData = NULL; @@ -1158,26 +1221,26 @@ void SampleWindow::changeZoomLevel(float delta) { bool SampleWindow::previousSample() { fCurrIndex = (fCurrIndex - 1 + fSamples.count()) % fSamples.count(); - this->loadView(create_transition(curr_view(this), fSamples[fCurrIndex](), + this->loadView(create_transition(curr_view(this), (*fSamples[fCurrIndex])(), fTransitionPrev)); return true; } bool SampleWindow::nextSample() { fCurrIndex = (fCurrIndex + 1) % fSamples.count(); - this->loadView(create_transition(curr_view(this), fSamples[fCurrIndex](), + this->loadView(create_transition(curr_view(this), (*fSamples[fCurrIndex])(), fTransitionNext)); return true; } bool SampleWindow::goToSample(int i) { fCurrIndex = (i) % fSamples.count(); - this->loadView(create_transition(curr_view(this),fSamples[fCurrIndex](), 6)); + this->loadView(create_transition(curr_view(this),(*fSamples[fCurrIndex])(), 6)); return true; } SkString SampleWindow::getSampleTitle(int i) { - SkView* view = fSamples[i](); + SkView* view = (*fSamples[i])(); SkString title; SampleCode::RequestTitle(view, &title); view->unref(); @@ -1288,7 +1351,7 @@ bool SampleWindow::onQuery(SkEvent* query) { return true; } if (query->isType("get-slide-title")) { - SkView* view = fSamples[query->getFast32()](); + SkView* view = (*fSamples[query->getFast32()])(); SkEvent evt(gTitleEvtName); if (view->doQuery(&evt)) { query->setString("title", evt.findString(gTitleEvtName)); |
