diff options
author | jvanverth <jvanverth@google.com> | 2016-06-16 09:52:35 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2016-06-16 09:52:35 -0700 |
commit | c7027ab03f2e8bab4c74bc1b047642622d3d682b (patch) | |
tree | 72baa4e6345d6e3bbdb2b0165130a637a9778f19 | |
parent | c4ce6b592487305de251bbebaf8eeee38371b877 (diff) |
Add samples to Viewer.
This adds support with animation, assuming the sample has
implemented onAnimate. Event handling has not been
implemented.
BUG=skia:
GOLD_TRYBOT_URL= https://gold.skia.org/search?issue=2056343004
Committed: https://skia.googlesource.com/skia/+/76963e73704a42a18c29d6fbdcccb566e5c67658
Review-Url: https://codereview.chromium.org/2056343004
-rw-r--r-- | gyp/SampleApp.gyp | 123 | ||||
-rw-r--r-- | gyp/samples.gypi | 140 | ||||
-rw-r--r-- | gyp/viewer.gyp | 32 | ||||
-rw-r--r-- | samplecode/ClockFaceView.cpp | 11 | ||||
-rw-r--r-- | samplecode/SampleApp.cpp | 157 | ||||
-rw-r--r-- | samplecode/SampleAtlas.cpp | 4 | ||||
-rw-r--r-- | samplecode/SampleClock.cpp | 4 | ||||
-rw-r--r-- | samplecode/SampleCode.cpp | 170 | ||||
-rw-r--r-- | samplecode/SampleCode.h | 9 | ||||
-rw-r--r-- | src/fonts/SkTestScalerContext.cpp | 2 | ||||
-rw-r--r-- | tools/viewer/ImageSlide.cpp | 2 | ||||
-rw-r--r-- | tools/viewer/ImageSlide.h | 2 | ||||
-rw-r--r-- | tools/viewer/SKPSlide.cpp | 2 | ||||
-rw-r--r-- | tools/viewer/SKPSlide.h | 2 | ||||
-rwxr-xr-x | tools/viewer/SampleSlide.cpp | 45 | ||||
-rwxr-xr-x | tools/viewer/SampleSlide.h | 34 | ||||
-rw-r--r-- | tools/viewer/Slide.h | 6 | ||||
-rw-r--r-- | tools/viewer/Viewer.cpp | 11 |
18 files changed, 461 insertions, 295 deletions
diff --git a/gyp/SampleApp.gyp b/gyp/SampleApp.gyp index 45051af05b..347af56073 100644 --- a/gyp/SampleApp.gyp +++ b/gyp/SampleApp.gyp @@ -20,140 +20,20 @@ '../gm', # needed to pull gm.h '../samplecode', # To pull SampleApp.h and SampleCode.h '../tools/debugger', - '../tools', - '../experimental', ], 'includes': [ 'gmslides.gypi', + 'samples.gypi', ], 'sources': [ '../gm/gm.cpp', - '../samplecode/GMSampleView.h', - '../samplecode/GMSampleView.cpp', - '../samplecode/ClockFaceView.cpp', - '../samplecode/OverView.cpp', - '../samplecode/OverView.h', - '../samplecode/PerlinPatch.cpp', - '../samplecode/Sample2PtRadial.cpp', - '../samplecode/SampleAAClip.cpp', - '../samplecode/SampleAAGeometry.cpp', - '../samplecode/SampleAARects.cpp', - '../samplecode/SampleAARectModes.cpp', - '../samplecode/SampleAll.cpp', - '../samplecode/SampleAnimatedText.cpp', - '../samplecode/SampleAnimBlur.cpp', '../samplecode/SampleApp.cpp', - '../samplecode/SampleArc.cpp', - '../samplecode/SampleAtlas.cpp', - '../samplecode/SampleBigBlur.cpp', - '../samplecode/SampleBigGradient.cpp', - '../samplecode/SampleBitmapRect.cpp', - '../samplecode/SampleBlur.cpp', - '../samplecode/SampleCamera.cpp', - '../samplecode/SampleChart.cpp', - '../samplecode/SampleCircle.cpp', - '../samplecode/SampleClip.cpp', - '../samplecode/SampleClipDrawMatch.cpp', - '../samplecode/SampleClock.cpp', - '../samplecode/SampleCode.h', - '../samplecode/SampleColorFilter.cpp', - '../samplecode/SampleComplexClip.cpp', - '../samplecode/SampleConcavePaths.cpp', - '../samplecode/SampleDegenerateTwoPtRadials.cpp', - '../samplecode/SampleDither.cpp', - '../samplecode/SampleDitherBitmap.cpp', - '../samplecode/SampleEffects.cpp', - '../samplecode/SampleEmboss.cpp', - '../samplecode/SampleFatBits.cpp', - '../samplecode/SampleFillType.cpp', - '../samplecode/SampleFilter.cpp', - '../samplecode/SampleFilter2.cpp', - '../samplecode/SampleFilterQuality.cpp', - '../samplecode/SampleFilterFuzz.cpp', - '../samplecode/SampleFontCache.cpp', - '../samplecode/SampleFontScalerTest.cpp', - '../samplecode/SampleFuzz.cpp', - '../samplecode/SampleGradients.cpp', - '../samplecode/SampleHairCurves.cpp', - '../samplecode/SampleHairline.cpp', - '../samplecode/SampleHairModes.cpp', - '../samplecode/SampleHT.cpp', - '../samplecode/SampleIdentityScale.cpp', - '../samplecode/SampleLayerMask.cpp', - '../samplecode/SampleLayers.cpp', - '../samplecode/SampleLCD.cpp', - '../samplecode/SampleLighting.cpp', - '../samplecode/SampleLines.cpp', - '../samplecode/SampleLitAtlas.cpp', - '../samplecode/SampleLua.cpp', - '../samplecode/SampleManyRects.cpp', - '../samplecode/SampleMeasure.cpp', - '../samplecode/SampleMegaStroke.cpp', - '../samplecode/SamplePatch.cpp', - '../samplecode/SamplePath.cpp', - '../samplecode/SamplePathClip.cpp', - '../samplecode/SamplePathFuzz.cpp', - '../samplecode/SamplePathEffects.cpp', - '../samplecode/SamplePathOverstroke.cpp', - '../samplecode/SamplePictFile.cpp', - '../samplecode/SamplePoints.cpp', - '../samplecode/SamplePolyToPoly.cpp', - '../samplecode/SampleQuadStroker.cpp', - '../samplecode/SampleRectanizer.cpp', - '../samplecode/SampleRegion.cpp', - '../samplecode/SampleRepeatTile.cpp', - '../samplecode/SampleShaders.cpp', - '../samplecode/SampleShaderText.cpp', - '../samplecode/SampleShip.cpp', - '../samplecode/SampleSkLayer.cpp', - '../samplecode/SampleSlides.cpp', - '../samplecode/SampleStringArt.cpp', - '../samplecode/SampleStrokePath.cpp', - '../samplecode/SampleSubpixelTranslate.cpp', - '../samplecode/SampleText.cpp', - '../samplecode/SampleTextAlpha.cpp', - '../samplecode/SampleTextBox.cpp', - '../samplecode/SampleTextOnPath.cpp', - '../samplecode/SampleTextureDomain.cpp', - '../samplecode/SampleTiling.cpp', - '../samplecode/SampleTinyBitmap.cpp', - '../samplecode/SampleUnpremul.cpp', - '../samplecode/SampleVertices.cpp', - '../samplecode/SampleXfermodesBlur.cpp', - '../samplecode/SampleXfer.cpp', - # DrawingBoard - #'../experimental/DrawingBoard/SkColorPalette.h', - #'../experimental/DrawingBoard/SkColorPalette.cpp', - #'../experimental/DrawingBoard/SkNetPipeController.h', - #'../experimental/DrawingBoard/SkNetPipeController.cpp', - #'../experimental/DrawingBoard/SampleDrawingClient.cpp', - #'../experimental/DrawingBoard/SampleDrawingServer.cpp', - - # Networking - #'../experimental/Networking/SampleNetPipeReader.cpp', - #'../experimental/Networking/SkSockets.cpp', - #'../experimental/Networking/SkSockets.h', - - # PerlinNoise2 - '../experimental/SkPerlinNoiseShader2/SkPerlinNoiseShader2.cpp', - '../experimental/SkPerlinNoiseShader2/SkPerlinNoiseShader2.h', - - # Lua - '../src/utils/SkLuaCanvas.cpp', - '../src/utils/SkLua.cpp', - ], - 'sources!': [ - '../samplecode/SampleSkLayer.cpp', #relies on SkMatrix44 which doesn't compile - '../samplecode/SampleFontCache.cpp', ], 'dependencies': [ 'etc1.gyp:libetc1', - 'experimental.gyp:experimental', 'flags.gyp:flags', 'jsoncpp.gyp:jsoncpp', - 'lua.gyp:lua', - 'pdf.gyp:pdf', 'skia_lib.gyp:skia_lib', 'gputest.gyp:skgputest', 'tools.gyp:resources', @@ -161,7 +41,6 @@ 'tools.gyp:timer', 'tools.gyp:url_data_manager', 'views.gyp:views', - 'xml.gyp:xml', ], 'msvs_settings': { 'VCLinkerTool': { diff --git a/gyp/samples.gypi b/gyp/samples.gypi new file mode 100644 index 0000000000..5a130d9713 --- /dev/null +++ b/gyp/samples.gypi @@ -0,0 +1,140 @@ +# Copyright 2015 Google Inc. +# +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. +# Include this gypi to include all 'sample' files +{ + 'include_dirs': [ + '../include/views', + '../experimental', + '../samplecode', + '../tools', + ], + 'sources': [ + # Samples + '../samplecode/GMSampleView.h', + '../samplecode/GMSampleView.cpp', + '../samplecode/ClockFaceView.cpp', + '../samplecode/OverView.cpp', + '../samplecode/OverView.h', + '../samplecode/PerlinPatch.cpp', + '../samplecode/Sample2PtRadial.cpp', + '../samplecode/SampleAAClip.cpp', + '../samplecode/SampleAAGeometry.cpp', + '../samplecode/SampleAARects.cpp', + '../samplecode/SampleAARectModes.cpp', + '../samplecode/SampleAll.cpp', + '../samplecode/SampleAnimatedText.cpp', + '../samplecode/SampleAnimBlur.cpp', + '../samplecode/SampleArc.cpp', + '../samplecode/SampleAtlas.cpp', + '../samplecode/SampleBigBlur.cpp', + '../samplecode/SampleBigGradient.cpp', + '../samplecode/SampleBitmapRect.cpp', + '../samplecode/SampleBlur.cpp', + '../samplecode/SampleCamera.cpp', + '../samplecode/SampleChart.cpp', + '../samplecode/SampleCircle.cpp', + '../samplecode/SampleClip.cpp', + '../samplecode/SampleClipDrawMatch.cpp', + '../samplecode/SampleClock.cpp', + '../samplecode/SampleCode.cpp', + '../samplecode/SampleCode.h', + '../samplecode/SampleColorFilter.cpp', + '../samplecode/SampleComplexClip.cpp', + '../samplecode/SampleConcavePaths.cpp', + '../samplecode/SampleDegenerateTwoPtRadials.cpp', + '../samplecode/SampleDither.cpp', + '../samplecode/SampleDitherBitmap.cpp', + '../samplecode/SampleEffects.cpp', + '../samplecode/SampleEmboss.cpp', + '../samplecode/SampleFatBits.cpp', + '../samplecode/SampleFillType.cpp', + '../samplecode/SampleFilter.cpp', + '../samplecode/SampleFilter2.cpp', + '../samplecode/SampleFilterQuality.cpp', + '../samplecode/SampleFilterFuzz.cpp', + '../samplecode/SampleFontCache.cpp', + '../samplecode/SampleFontScalerTest.cpp', + '../samplecode/SampleFuzz.cpp', + '../samplecode/SampleGradients.cpp', + '../samplecode/SampleHairCurves.cpp', + '../samplecode/SampleHairline.cpp', + '../samplecode/SampleHairModes.cpp', + '../samplecode/SampleHT.cpp', + '../samplecode/SampleIdentityScale.cpp', + '../samplecode/SampleLayerMask.cpp', + '../samplecode/SampleLayers.cpp', + '../samplecode/SampleLCD.cpp', + '../samplecode/SampleLighting.cpp', + '../samplecode/SampleLines.cpp', + '../samplecode/SampleLitAtlas.cpp', + '../samplecode/SampleLua.cpp', + '../samplecode/SampleManyRects.cpp', + '../samplecode/SampleMeasure.cpp', + '../samplecode/SampleMegaStroke.cpp', + '../samplecode/SamplePatch.cpp', + '../samplecode/SamplePath.cpp', + '../samplecode/SamplePathClip.cpp', + '../samplecode/SamplePathFuzz.cpp', + '../samplecode/SamplePathEffects.cpp', + '../samplecode/SamplePictFile.cpp', + '../samplecode/SamplePoints.cpp', + '../samplecode/SamplePolyToPoly.cpp', + '../samplecode/SampleQuadStroker.cpp', + '../samplecode/SampleRectanizer.cpp', + '../samplecode/SampleRegion.cpp', + '../samplecode/SampleRepeatTile.cpp', + '../samplecode/SampleShaders.cpp', + '../samplecode/SampleShaderText.cpp', + '../samplecode/SampleShip.cpp', + '../samplecode/SampleSkLayer.cpp', + '../samplecode/SampleSlides.cpp', + '../samplecode/SampleStringArt.cpp', + '../samplecode/SampleStrokePath.cpp', + '../samplecode/SampleSubpixelTranslate.cpp', + '../samplecode/SampleText.cpp', + '../samplecode/SampleTextAlpha.cpp', + '../samplecode/SampleTextBox.cpp', + '../samplecode/SampleTextOnPath.cpp', + '../samplecode/SampleTextureDomain.cpp', + '../samplecode/SampleTiling.cpp', + '../samplecode/SampleTinyBitmap.cpp', + '../samplecode/SampleUnpremul.cpp', + '../samplecode/SampleVertices.cpp', + '../samplecode/SampleXfermodesBlur.cpp', + '../samplecode/SampleXfer.cpp', + + # DrawingBoard + #'../experimental/DrawingBoard/SkColorPalette.h', + #'../experimental/DrawingBoard/SkColorPalette.cpp', + #'../experimental/DrawingBoard/SkNetPipeController.h', + #'../experimental/DrawingBoard/SkNetPipeController.cpp', + #'../experimental/DrawingBoard/SampleDrawingClient.cpp', + #'../experimental/DrawingBoard/SampleDrawingServer.cpp', + + # Networking + #'../experimental/Networking/SampleNetPipeReader.cpp', + #'../experimental/Networking/SkSockets.cpp', + #'../experimental/Networking/SkSockets.h', + + # PerlinNoise2 + '../experimental/SkPerlinNoiseShader2/SkPerlinNoiseShader2.cpp', + '../experimental/SkPerlinNoiseShader2/SkPerlinNoiseShader2.h', + + # Lua + '../src/utils/SkLuaCanvas.cpp', + '../src/utils/SkLua.cpp', + ], + 'sources!': [ + '../samplecode/SampleSkLayer.cpp', #relies on SkMatrix44 which doesn't compi + '../samplecode/SampleFontCache.cpp', #relies on pthread.h + ], + 'dependencies': [ + 'experimental.gyp:experimental', + 'lua.gyp:lua', + 'pdf.gyp:pdf', + 'views.gyp:views', + 'xml.gyp:xml', + ], +} diff --git a/gyp/viewer.gyp b/gyp/viewer.gyp index 1013e070ae..012281a68e 100644 --- a/gyp/viewer.gyp +++ b/gyp/viewer.gyp @@ -14,26 +14,41 @@ 'type': 'executable', 'includes' : [ 'gmslides.gypi', + 'samples.gypi', ], 'include_dirs': [ '../bench', '../gm', - '../include/views', '../include/private', '../src/core', '../src/effects', '../src/gpu', - '../src/images', '../src/image', + '../src/images', + '../src/pathops', '../src/views/unix', '../tools/timer', ], 'sources': [ '../gm/gm.cpp', + '<!@(python find.py ../tools/viewer "*.cpp")', + + # views (subset of files for the Android build) + '../src/views/SkEvent.cpp', + '../src/views/SkEventSink.cpp', + '../src/views/SkOSMenu.cpp', + '../src/views/SkTagList.cpp', + '../src/views/SkTagList.h', '../src/views/SkTouchGesture.cpp', + '../src/views/SkView.cpp', + '../src/views/SkViewPriv.cpp', + '../src/views/SkViewPriv.h', '../src/views/unix/keysym2ucs.c', - '<!@(python find.py ../tools/viewer "*.cpp")', ], + 'sources!': [ + '../samplecode/SampleSkLayer.cpp', #relies on SkMatrix44 which doesn't compile + '../samplecode/SampleFontCache.cpp', #relies on pthread.h + ], 'dependencies': [ 'flags.gyp:flags', 'gputest.gyp:skgputest', @@ -52,6 +67,11 @@ 'android_deps.gyp:Android_EntryPoint', 'android_deps.gyp:native_app_glue', ], + # views depends on SkOSWindow_android, which we don't want to include + # so we only include the minimum set of views files in sources + 'dependencies!': [ + 'views.gyp:views', + ], 'link_settings': { 'libraries': [ '-landroid', @@ -66,11 +86,13 @@ }, }], ['skia_os != "android"', { - 'sources/': [ ['exclude', '_android.(h|cpp)$'], + 'sources/': [ + ['exclude', '_android.(h|cpp)$'], + ['exclude', 'src/views'], ], }], ['skia_os != "linux"', { - 'sources/': [ + 'sources/': [ ['exclude', '_unix.(h|cpp)$'], ['exclude', 'keysym2ucs.c'], ], diff --git a/samplecode/ClockFaceView.cpp b/samplecode/ClockFaceView.cpp index ef0fec7577..9cee95b84c 100644 --- a/samplecode/ClockFaceView.cpp +++ b/samplecode/ClockFaceView.cpp @@ -72,7 +72,14 @@ public: : Sk2DPathEffect(matrix), fRadius(radius), fPts(pts) {} SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(Dot2DPathEffect) - + class Registrar { + public: + Registrar() { + SkFlattenable::Register("Dot2DPathEffect", + Dot2DPathEffect::CreateProc, + Dot2DPathEffect::GetFlattenableType()); + } + }; protected: void begin(const SkIRect& uvBounds, SkPath* dst) const override { if (fPts) { @@ -101,6 +108,8 @@ private: typedef Sk2DPathEffect INHERITED; }; +static Dot2DPathEffect::Registrar gReg0; + sk_sp<SkFlattenable> Dot2DPathEffect::CreateProc(SkReadBuffer& buffer) { SkMatrix matrix; buffer.readMatrix(&matrix); diff --git a/samplecode/SampleApp.cpp b/samplecode/SampleApp.cpp index 971044cf87..40ead7482f 100644 --- a/samplecode/SampleApp.cpp +++ b/samplecode/SampleApp.cpp @@ -400,45 +400,8 @@ static bool isInvalEvent(const SkEvent& evt) { } ////////////////// -SkFuncViewFactory::SkFuncViewFactory(SkViewCreateFunc func) - : fCreateFunc(func) { -} - -SkView* SkFuncViewFactory::operator() () const { - return (*fCreateFunc)(); -} - #include "GMSampleView.h" -SkGMSampleViewFactory::SkGMSampleViewFactory(GMFactoryFunc func) - : fFunc(func) { -} - -SkView* SkGMSampleViewFactory::operator() () const { - skiagm::GM* gm = fFunc(nullptr); - gm->setMode(skiagm::GM::kSample_Mode); - return new GMSampleView(gm); -} - -SkViewRegister* SkViewRegister::gHead; -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() {} @@ -567,72 +530,6 @@ private: typedef SkPaintFilterCanvas INHERITED; }; -////////////////////////////////////////////////////////////////////////////// - -#define MAX_ZOOM_LEVEL 8 -#define MIN_ZOOM_LEVEL -8 - -static const char gCharEvtName[] = "SampleCode_Char_Event"; -static const char gKeyEvtName[] = "SampleCode_Key_Event"; -static const char gTitleEvtName[] = "SampleCode_Title_Event"; -static const char gPrefSizeEvtName[] = "SampleCode_PrefSize_Event"; -static const char gFastTextEvtName[] = "SampleCode_FastText_Event"; -static const char gUpdateWindowTitleEvtName[] = "SampleCode_UpdateWindowTitle"; - -bool SampleCode::CharQ(const SkEvent& evt, SkUnichar* outUni) { - if (evt.isType(gCharEvtName, sizeof(gCharEvtName) - 1)) { - if (outUni) { - *outUni = evt.getFast32(); - } - return true; - } - return false; -} - -bool SampleCode::KeyQ(const SkEvent& evt, SkKey* outKey) { - if (evt.isType(gKeyEvtName, sizeof(gKeyEvtName) - 1)) { - if (outKey) { - *outKey = (SkKey)evt.getFast32(); - } - return true; - } - return false; -} - -bool SampleCode::TitleQ(const SkEvent& evt) { - return evt.isType(gTitleEvtName, sizeof(gTitleEvtName) - 1); -} - -void SampleCode::TitleR(SkEvent* evt, const char title[]) { - SkASSERT(evt && TitleQ(*evt)); - evt->setString(gTitleEvtName, title); -} - -bool SampleCode::RequestTitle(SkView* view, SkString* title) { - SkEvent evt(gTitleEvtName); - if (view->doQuery(&evt)) { - title->set(evt.findString(gTitleEvtName)); - return true; - } - return false; -} - -bool SampleCode::PrefSizeQ(const SkEvent& evt) { - return evt.isType(gPrefSizeEvtName, sizeof(gPrefSizeEvtName) - 1); -} - -void SampleCode::PrefSizeR(SkEvent* evt, SkScalar width, SkScalar height) { - SkASSERT(evt && PrefSizeQ(*evt)); - SkScalar size[2]; - size[0] = width; - size[1] = height; - evt->setScalars(gPrefSizeEvtName, 2, size); -} - -bool SampleCode::FastTextQ(const SkEvent& evt) { - return evt.isType(gFastTextEvtName, sizeof(gFastTextEvtName) - 1); -} - /////////////////////////////////////////////////////////////////////////////// enum TilingMode { @@ -2214,60 +2111,6 @@ void SampleWindow::onSizeChange() { /////////////////////////////////////////////////////////////////////////////// -static const char is_sample_view_tag[] = "sample-is-sample-view"; -static const char repeat_count_tag[] = "sample-set-repeat-count"; - -bool SampleView::IsSampleView(SkView* view) { - SkEvent evt(is_sample_view_tag); - return view->doQuery(&evt); -} - -bool SampleView::SetRepeatDraw(SkView* view, int count) { - SkEvent evt(repeat_count_tag); - evt.setFast32(count); - return view->doEvent(evt); -} - -bool SampleView::onEvent(const SkEvent& evt) { - if (evt.isType(repeat_count_tag)) { - fRepeatCount = evt.getFast32(); - return true; - } - return this->INHERITED::onEvent(evt); -} - -bool SampleView::onQuery(SkEvent* evt) { - if (evt->isType(is_sample_view_tag)) { - return true; - } - return this->INHERITED::onQuery(evt); -} - -void SampleView::onDraw(SkCanvas* canvas) { - if (!fHaveCalledOnceBeforeDraw) { - fHaveCalledOnceBeforeDraw = true; - this->onOnceBeforeDraw(); - } - this->onDrawBackground(canvas); - - for (int i = 0; i < fRepeatCount; i++) { - SkAutoCanvasRestore acr(canvas, true); - this->onDrawContent(canvas); -#if SK_SUPPORT_GPU - // Ensure the GrContext doesn't batch across draw loops. - if (GrContext* context = canvas->getGrContext()) { - context->flush(); - } -#endif - } -} - -void SampleView::onDrawBackground(SkCanvas* canvas) { - canvas->drawColor(fBGColor); -} - -/////////////////////////////////////////////////////////////////////////////// - template <typename T> void SkTBSort(T array[], int count) { for (int i = 1; i < count - 1; i++) { bool didSwap = false; diff --git a/samplecode/SampleAtlas.cpp b/samplecode/SampleAtlas.cpp index 7cf1bb3761..3daf312f6a 100644 --- a/samplecode/SampleAtlas.cpp +++ b/samplecode/SampleAtlas.cpp @@ -232,9 +232,11 @@ protected: void onDrawContent(SkCanvas* canvas) override { canvas->drawDrawable(fDrawable); - this->inval(nullptr); } + bool onAnimate(const SkAnimTimer&) override { + return true; + } #if 0 // TODO: switch over to use this for our animation bool onAnimate(const SkAnimTimer& timer) override { diff --git a/samplecode/SampleClock.cpp b/samplecode/SampleClock.cpp index ae7462d1dc..ff3a5b1927 100644 --- a/samplecode/SampleClock.cpp +++ b/samplecode/SampleClock.cpp @@ -215,8 +215,10 @@ protected: #endif canvas->restore(); + } - this->inval(nullptr); + bool onAnimate(const SkAnimTimer&) override { + return true; } private: diff --git a/samplecode/SampleCode.cpp b/samplecode/SampleCode.cpp new file mode 100644 index 0000000000..7b9c0ff223 --- /dev/null +++ b/samplecode/SampleCode.cpp @@ -0,0 +1,170 @@ +/* + * Copyright 2016 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#include "SampleCode.h" +#include "SkCanvas.h" + +#if SK_SUPPORT_GPU +# include "GrContext.h" +# if SK_ANGLE +# include "gl/angle/GLTestContext_angle.h" +# endif +#else +class GrContext; +#endif + +////////////////////////////////////////////////////////////////////////////// + +bool SampleCode::CharQ(const SkEvent& evt, SkUnichar* outUni) { + if (evt.isType(gCharEvtName, sizeof(gCharEvtName) - 1)) { + if (outUni) { + *outUni = evt.getFast32(); + } + return true; + } + return false; +} + +bool SampleCode::KeyQ(const SkEvent& evt, SkKey* outKey) { + if (evt.isType(gKeyEvtName, sizeof(gKeyEvtName) - 1)) { + if (outKey) { + *outKey = (SkKey)evt.getFast32(); + } + return true; + } + return false; +} + +bool SampleCode::TitleQ(const SkEvent& evt) { + return evt.isType(gTitleEvtName, sizeof(gTitleEvtName) - 1); +} + +void SampleCode::TitleR(SkEvent* evt, const char title[]) { + SkASSERT(evt && TitleQ(*evt)); + evt->setString(gTitleEvtName, title); +} + +bool SampleCode::RequestTitle(SkView* view, SkString* title) { + SkEvent evt(gTitleEvtName); + if (view->doQuery(&evt)) { + title->set(evt.findString(gTitleEvtName)); + return true; + } + return false; +} + +bool SampleCode::PrefSizeQ(const SkEvent& evt) { + return evt.isType(gPrefSizeEvtName, sizeof(gPrefSizeEvtName) - 1); +} + +void SampleCode::PrefSizeR(SkEvent* evt, SkScalar width, SkScalar height) { + SkASSERT(evt && PrefSizeQ(*evt)); + SkScalar size[2]; + size[0] = width; + size[1] = height; + evt->setScalars(gPrefSizeEvtName, 2, size); +} + +bool SampleCode::FastTextQ(const SkEvent& evt) { + return evt.isType(gFastTextEvtName, sizeof(gFastTextEvtName) - 1); +} + +SkViewRegister* SkViewRegister::gHead; +SkViewRegister::SkViewRegister(SkViewFactory* fact) : fFact(fact) { + fFact->ref(); + fChain = gHead; + gHead = this; +} + +/////////////////////////////////////////////////////////////////////////////// + +SkFuncViewFactory::SkFuncViewFactory(SkViewCreateFunc func) + : fCreateFunc(func) { +} + +SkView* SkFuncViewFactory::operator() () const { + return (*fCreateFunc)(); +} + +#include "GMSampleView.h" + +SkGMSampleViewFactory::SkGMSampleViewFactory(GMFactoryFunc func) + : fFunc(func) { +} + +SkView* SkGMSampleViewFactory::operator() () const { + skiagm::GM* gm = fFunc(nullptr); + gm->setMode(skiagm::GM::kSample_Mode); + return new GMSampleView(gm); +} + +SkViewRegister::SkViewRegister(SkViewCreateFunc func) { + fFact = new SkFuncViewFactory(func); + fChain = gHead; + gHead = this; +} + +SkViewRegister::SkViewRegister(GMFactoryFunc func) { + fFact = new SkGMSampleViewFactory(func); + fChain = gHead; + gHead = this; +} + +/////////////////////////////////////////////////////////////////////////////// + +static const char is_sample_view_tag[] = "sample-is-sample-view"; +static const char repeat_count_tag[] = "sample-set-repeat-count"; + +bool SampleView::IsSampleView(SkView* view) { + SkEvent evt(is_sample_view_tag); + return view->doQuery(&evt); +} + +bool SampleView::SetRepeatDraw(SkView* view, int count) { + SkEvent evt(repeat_count_tag); + evt.setFast32(count); + return view->doEvent(evt); +} + +bool SampleView::onEvent(const SkEvent& evt) { + if (evt.isType(repeat_count_tag)) { + fRepeatCount = evt.getFast32(); + return true; + } + return this->INHERITED::onEvent(evt); +} + +bool SampleView::onQuery(SkEvent* evt) { + if (evt->isType(is_sample_view_tag)) { + return true; + } + return this->INHERITED::onQuery(evt); +} + +void SampleView::onDraw(SkCanvas* canvas) { + if (!fHaveCalledOnceBeforeDraw) { + fHaveCalledOnceBeforeDraw = true; + this->onOnceBeforeDraw(); + } + this->onDrawBackground(canvas); + + for (int i = 0; i < fRepeatCount; i++) { + SkAutoCanvasRestore acr(canvas, true); + this->onDrawContent(canvas); +#if SK_SUPPORT_GPU + // Ensure the GrContext doesn't batch across draw loops. + if (GrContext* context = canvas->getGrContext()) { + context->flush(); + } +#endif + } +} + +void SampleView::onDrawBackground(SkCanvas* canvas) { + canvas->drawColor(fBGColor); +} + diff --git a/samplecode/SampleCode.h b/samplecode/SampleCode.h index e4ccfb2af6..fe72e4b970 100644 --- a/samplecode/SampleCode.h +++ b/samplecode/SampleCode.h @@ -21,6 +21,15 @@ class SkAnimTimer; static SkView* SK_MACRO_APPEND_LINE(F_)() { code } \ static SkViewRegister SK_MACRO_APPEND_LINE(R_)(SK_MACRO_APPEND_LINE(F_)); +#define MAX_ZOOM_LEVEL 8 +#define MIN_ZOOM_LEVEL -8 + +static const char gCharEvtName[] = "SampleCode_Char_Event"; +static const char gKeyEvtName[] = "SampleCode_Key_Event"; +static const char gTitleEvtName[] = "SampleCode_Title_Event"; +static const char gPrefSizeEvtName[] = "SampleCode_PrefSize_Event"; +static const char gFastTextEvtName[] = "SampleCode_FastText_Event"; +static const char gUpdateWindowTitleEvtName[] = "SampleCode_UpdateWindowTitle"; class SampleCode { public: diff --git a/src/fonts/SkTestScalerContext.cpp b/src/fonts/SkTestScalerContext.cpp index a2748564a5..ebe2ee1c52 100644 --- a/src/fonts/SkTestScalerContext.cpp +++ b/src/fonts/SkTestScalerContext.cpp @@ -20,7 +20,7 @@ SkTestFont::SkTestFont(const SkTestFontData& fontData) : INHERITED() , fCharCodes(fontData.fCharCodes) - , fCharCodesCount(fontData.fCharCodesCount) + , fCharCodesCount(fontData.fCharCodes ? fontData.fCharCodesCount : 0) , fWidths(fontData.fWidths) , fMetrics(fontData.fMetrics) , fName(fontData.fName) diff --git a/tools/viewer/ImageSlide.cpp b/tools/viewer/ImageSlide.cpp index 4a03185733..de5ce4ca1e 100644 --- a/tools/viewer/ImageSlide.cpp +++ b/tools/viewer/ImageSlide.cpp @@ -35,7 +35,7 @@ void ImageSlide::draw(SkCanvas* canvas) { } } -void ImageSlide::load() { +void ImageSlide::load(SkScalar, SkScalar) { sk_sp<SkData> encoded = SkData::MakeFromFileName(fPath.c_str()); fImage = SkImage::MakeFromEncoded(encoded); fImage->asLegacyBitmap(&fOriginalBitmap, SkImage::kRO_LegacyBitmapMode); diff --git a/tools/viewer/ImageSlide.h b/tools/viewer/ImageSlide.h index 88254ddc03..0dd816e878 100644 --- a/tools/viewer/ImageSlide.h +++ b/tools/viewer/ImageSlide.h @@ -21,7 +21,7 @@ public: SkISize getDimensions() const override; void draw(SkCanvas* canvas) override; - void load() override; + void load(SkScalar winWidth, SkScalar winHeight) override; void unload() override; private: diff --git a/tools/viewer/SKPSlide.cpp b/tools/viewer/SKPSlide.cpp index 6a9899b92f..9419253f0c 100644 --- a/tools/viewer/SKPSlide.cpp +++ b/tools/viewer/SKPSlide.cpp @@ -48,7 +48,7 @@ static sk_sp<SkPicture> read_picture(const char path[]) { return pic; } -void SKPSlide::load() { +void SKPSlide::load(SkScalar, SkScalar) { fPic = read_picture(fPath.c_str()); fCullRect = fPic->cullRect().roundOut(); } diff --git a/tools/viewer/SKPSlide.h b/tools/viewer/SKPSlide.h index 42845fa30d..ff92ed1a39 100644 --- a/tools/viewer/SKPSlide.h +++ b/tools/viewer/SKPSlide.h @@ -19,7 +19,7 @@ public: SkISize getDimensions() const override { return fCullRect.size(); } void draw(SkCanvas* canvas) override; - void load() override; + void load(SkScalar winWidth, SkScalar winHeight) override; void unload() override; private: diff --git a/tools/viewer/SampleSlide.cpp b/tools/viewer/SampleSlide.cpp new file mode 100755 index 0000000000..5e02ff1da7 --- /dev/null +++ b/tools/viewer/SampleSlide.cpp @@ -0,0 +1,45 @@ +/* +* Copyright 2016 Google Inc. +* +* Use of this source code is governed by a BSD-style license that can be +* found in the LICENSE file. +*/ + +#include "SampleSlide.h" + +#include "SkCanvas.h" +#include "SkCommonFlags.h" +#include "SkOSFile.h" +#include "SkStream.h" + +SampleSlide::SampleSlide(const SkViewFactory* factory) : fViewFactory(factory) { + SkView* view = (*factory)(); + SampleCode::RequestTitle(view, &fName); + view->unref(); +} + +SampleSlide::~SampleSlide() {} + +void SampleSlide::draw(SkCanvas* canvas) { + fView->draw(canvas); +} + +void SampleSlide::load(SkScalar winWidth, SkScalar winHeight) { + fView = (*fViewFactory)(); + fView->setVisibleP(true); + fView->setClipToBounds(false); + fView->setSize(winWidth, winHeight); +} + +void SampleSlide::unload() { + fView->unref(); + fView = nullptr; +} + +#if defined(SK_BUILD_FOR_ANDROID) +// these are normally defined in SkOSWindow_unix, but we don't +// want to include that +void SkEvent::SignalNonEmptyQueue() {} + +void SkEvent::SignalQueueTimer(SkMSec delay) {} +#endif diff --git a/tools/viewer/SampleSlide.h b/tools/viewer/SampleSlide.h new file mode 100755 index 0000000000..3d772d093d --- /dev/null +++ b/tools/viewer/SampleSlide.h @@ -0,0 +1,34 @@ +/* +* Copyright 2016 Google Inc. +* +* Use of this source code is governed by a BSD-style license that can be +* found in the LICENSE file. +*/ + +#ifndef SampleSlide_DEFINED +#define SampleSlide_DEFINED + +#include "Slide.h" +#include "SampleCode.h" + +class SampleSlide : public Slide { +public: + SampleSlide(const SkViewFactory* factory); + ~SampleSlide() override; + + void draw(SkCanvas* canvas) override; + void load(SkScalar winWidth, SkScalar winHeight) override; + void unload() override; + bool animate(const SkAnimTimer& timer) override { + if (SampleView::IsSampleView(fView)) { + return ((SampleView*)fView)->animate(timer); + } + return false; + } + +private: + const SkViewFactory* fViewFactory; + SkView* fView; +}; + +#endif diff --git a/tools/viewer/Slide.h b/tools/viewer/Slide.h index cdc225b0a8..bc0ffd4016 100644 --- a/tools/viewer/Slide.h +++ b/tools/viewer/Slide.h @@ -19,11 +19,13 @@ class Slide : public SkRefCnt { public: virtual ~Slide() {} - virtual SkISize getDimensions() const = 0; + virtual SkISize getDimensions() const { + return SkISize::Make(0, 0); + } virtual void draw(SkCanvas* canvas) = 0; virtual bool animate(const SkAnimTimer&) { return false; } - virtual void load() {} + virtual void load(SkScalar winWidth, SkScalar winHeight) {} virtual void unload() {} SkString getName() { return fName; } diff --git a/tools/viewer/Viewer.cpp b/tools/viewer/Viewer.cpp index 7052a3ac79..43697f88b8 100644 --- a/tools/viewer/Viewer.cpp +++ b/tools/viewer/Viewer.cpp @@ -9,6 +9,7 @@ #include "GMSlide.h" #include "ImageSlide.h" +#include "SampleSlide.h" #include "SKPSlide.h" #include "SkCanvas.h" @@ -205,6 +206,14 @@ void Viewer::initSlides() { fSlides[fSlides.count() - i - 1] = temp; } + // samples + const SkViewRegister* reg = SkViewRegister::Head(); + while (reg) { + sk_sp<Slide> slide(new SampleSlide(reg->factory())); + fSlides.push_back(slide); + reg = reg->next(); + } + // SKPs for (int i = 0; i < FLAGS_skps.count(); i++) { if (SkStrEndsWith(FLAGS_skps[i], ".skp")) { @@ -270,7 +279,7 @@ void Viewer::setupCurrentSlide(int previousSlide) { } // prepare dimensions for image slides - fSlides[fCurrentSlide]->load(); + fSlides[fCurrentSlide]->load(SkIntToScalar(fWindow->width()), SkIntToScalar(fWindow->height())); fGesture.reset(); fDefaultMatrix.reset(); |