aboutsummaryrefslogtreecommitdiffhomepage
path: root/samplecode
diff options
context:
space:
mode:
authorGravatar reed <reed@google.com>2016-09-13 08:09:45 -0700
committerGravatar Commit bot <commit-bot@chromium.org>2016-09-13 08:09:45 -0700
commit54dc4878b02765efea39e68b218df1e4bfff4b88 (patch)
tree296347d73c08b8b1d0a0b244ca062434ac48caa1 /samplecode
parent5f1d0f61ea182829826d9d76cb85346d3e23305d (diff)
add pipecanvas
Diffstat (limited to 'samplecode')
-rw-r--r--samplecode/SampleApp.cpp54
-rw-r--r--samplecode/SampleApp.h7
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;