diff options
author | 2016-09-13 08:09:45 -0700 | |
---|---|---|
committer | 2016-09-13 08:09:45 -0700 | |
commit | 54dc4878b02765efea39e68b218df1e4bfff4b88 (patch) | |
tree | 296347d73c08b8b1d0a0b244ca062434ac48caa1 /samplecode | |
parent | 5f1d0f61ea182829826d9d76cb85346d3e23305d (diff) |
add pipecanvas
BUG=skia:
GOLD_TRYBOT_URL= https://gold.skia.org/search?issue=2201323003
Review-Url: https://codereview.chromium.org/2201323003
Diffstat (limited to 'samplecode')
-rw-r--r-- | samplecode/SampleApp.cpp | 54 | ||||
-rw-r--r-- | samplecode/SampleApp.h | 7 |
2 files changed, 50 insertions, 11 deletions
diff --git a/samplecode/SampleApp.cpp b/samplecode/SampleApp.cpp index b6b9cde06c..4c930c247b 100644 --- a/samplecode/SampleApp.cpp +++ b/samplecode/SampleApp.cpp @@ -34,6 +34,9 @@ #include "SkWindow.h" #include "sk_tool_utils.h" +#include "SkReadBuffer.h" +#include "SkStream.h" + #if SK_SUPPORT_GPU # include "gl/GrGLInterface.h" # include "gl/GrGLUtil.h" @@ -540,6 +543,26 @@ private: /////////////////////////////////////////////////////////////////////////////// +class SampleTFSerializer : public SkTypefaceSerializer { +public: + sk_sp<SkData> serialize(SkTypeface* tf) override { + tf->ref(); + return SkData::MakeWithCopy(&tf, sizeof(tf)); + } +}; + +class SampleTFDeserializer : public SkTypefaceDeserializer { +public: + sk_sp<SkTypeface> deserialize(const void* data, size_t size) override { + SkASSERT(sizeof(SkTypeface*) == size); + SkTypeface* tf; + memcpy(&tf, data, size); + return sk_sp<SkTypeface>(tf); // this was ref'd in SampleTFSerializer + } +}; + +/////////////////////////////////////////////////////////////////////////////// + enum TilingMode { kNo_Tiling, kAbs_128x128_Tiling, @@ -696,11 +719,14 @@ DEFINE_string(pdfPath, "", "Path to direcotry of pdf files."); #endif #include "SkTaskGroup.h" +#include "SkForceLinking.h" SampleWindow::SampleWindow(void* hwnd, int argc, char** argv, DeviceManager* devManager) : INHERITED(hwnd) , fDevManager(nullptr) { + SkForceLinking(false); + SkCommandLineFlags::Parse(argc, argv); fCurrIndex = -1; @@ -851,6 +877,11 @@ SampleWindow::SampleWindow(void* hwnd, int argc, char** argv, DeviceManager* dev fSaveToPdf = false; fSaveToSKP = false; + if (true) { + fPipeSerializer.setTypefaceSerializer(new SampleTFSerializer); + fPipeDeserializer.setTypefaceDeserializer(new SampleTFDeserializer); + } + int sinkID = this->getSinkID(); fAppMenu = new SkOSMenu; fAppMenu->setTitle("Global Settings"); @@ -1304,7 +1335,10 @@ SkCanvas* SampleWindow::beforeChildren(SkCanvas* canvas) { } else if (fSaveToSKP) { canvas = fRecorder.beginRecording(9999, 9999, nullptr, 0); } else if (fUsePicture) { - canvas = fRecorder.beginRecording(9999, 9999, nullptr, 0); + fPipeStream.reset(new SkDynamicMemoryWStream); + canvas = fPipeSerializer.beginWrite(SkRect::MakeWH(this->width(), this->height()), + fPipeStream.get()); +// canvas = fRecorder.beginRecording(9999, 9999, nullptr, 0); } else { canvas = this->INHERITED::beforeChildren(canvas); } @@ -1366,17 +1400,15 @@ void SampleWindow::afterChildren(SkCanvas* orig) { } if (fUsePicture) { - sk_sp<SkPicture> picture(fRecorder.finishRecordingAsPicture()); - - // serialize/deserialize? - if (false) { - SkDynamicMemoryWStream wstream; - picture->serialize(&wstream); - - SkAutoTDelete<SkStream> rstream(wstream.detachAsStream()); - picture = SkPicture::MakeFromStream(rstream); + if (true) { + fPipeSerializer.endWrite(); + sk_sp<SkData> data(fPipeStream->detachAsData()); + fPipeDeserializer.playback(data->data(), data->size(), orig); + fPipeStream.reset(); + } else { + sk_sp<SkPicture> picture(fRecorder.finishRecordingAsPicture()); + orig->drawPicture(picture.get()); } - orig->drawPicture(picture.get()); } // Do this after presentGL and other finishing, rather than in afterChild diff --git a/samplecode/SampleApp.h b/samplecode/SampleApp.h index 75416426b4..2ac9f0553e 100644 --- a/samplecode/SampleApp.h +++ b/samplecode/SampleApp.h @@ -13,11 +13,14 @@ #include "SkPicture.h" #include "SkPictureRecorder.h" #include "SkScalar.h" +#include "SkStream.h" #include "SkTDArray.h" #include "SkTouchGesture.h" #include "SkWindow.h" #include "timer/Timer.h" +#include "SkPipe.h" + class GrContext; class GrRenderTarget; @@ -165,6 +168,10 @@ private: int fCurrIndex; + std::unique_ptr<SkDynamicMemoryWStream> fPipeStream; + SkPipeSerializer fPipeSerializer; + SkPipeDeserializer fPipeDeserializer; + SkPictureRecorder fRecorder; SkAutoTDelete<SkCanvas> fFlagsFilterCanvas; SkPath fClipPath; |