diff options
Diffstat (limited to 'tools/viewer/Viewer.cpp')
-rw-r--r-- | tools/viewer/Viewer.cpp | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/tools/viewer/Viewer.cpp b/tools/viewer/Viewer.cpp index 8c320938fb..c2e03b18cd 100644 --- a/tools/viewer/Viewer.cpp +++ b/tools/viewer/Viewer.cpp @@ -30,6 +30,7 @@ #include "SkOnce.h" #include "SkOSFile.h" #include "SkOSPath.h" +#include "SkPictureRecorder.h" #include "SkRandom.h" #include "SkScan.h" #include "SkStream.h" @@ -265,6 +266,7 @@ Viewer::Viewer(int argc, char** argv, void* platformData) , fCumulativeMeasurementCount(0) , fDisplayStats(false) , fRefresh(false) + , fSaveToSKP(false) , fShowImGuiDebugWindow(false) , fShowSlidePicker(false) , fShowImGuiTestWindow(false) @@ -481,6 +483,10 @@ Viewer::Viewer(int argc, char** argv, void* platformData) this->updateTitle(); fWindow->inval(); }); + fCommands.addCommand('K', "IO", "Save slide to SKP", [this]() { + fSaveToSKP = true; + fWindow->inval(); + }); // set up slides this->initSlides(); @@ -866,6 +872,23 @@ void Viewer::drawSlide(SkCanvas* canvas) { } } + if (fSaveToSKP) { + SkPictureRecorder recorder; + SkCanvas* recorderCanvas = recorder.beginRecording( + SkRect::Make(fSlides[fCurrentSlide]->getDimensions())); + // In xform-canvas mode, record the transformed output + std::unique_ptr<SkCanvas> xformCanvas = nullptr; + if (ColorMode::kColorManagedSRGB8888_NonLinearBlending == fColorMode) { + xformCanvas = SkCreateColorSpaceXformCanvas(recorderCanvas, cs); + recorderCanvas = xformCanvas.get(); + } + fSlides[fCurrentSlide]->draw(recorderCanvas); + sk_sp<SkPicture> picture(recorder.finishRecordingAsPicture()); + SkFILEWStream stream("sample_app.skp"); + picture->serialize(&stream); + fSaveToSKP = false; + } + // If we're in F16, or we're zooming, or we're in color correct 8888 and the gamut isn't sRGB, // we need to render offscreen. We also need to render offscreen if we're in any raster mode, // because the window surface is actually GL. |