In SkGPipe, only serialize SkTypefaces in cross process mode.
Also make SkGPipeController ref the recording canvas to ensure that
objects used by SkGPipeCanvas (e.g. SharedHeap and fTypefaceSet, which
hold references to objects to which pointers are written to the stream)
survive to be played back even if SkGPipeWriter.endRecording() is called.
BUG=
TEST=TypefaceGM
Review URL: https://codereview.appspot.com/6447055
git-svn-id: http://skia.googlecode.com/svn/trunk@4817 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/src/pipe/SkGPipeWrite.cpp b/src/pipe/SkGPipeWrite.cpp
index a6ffae1..66cde1b 100644
--- a/src/pipe/SkGPipeWrite.cpp
+++ b/src/pipe/SkGPipeWrite.cpp
@@ -522,7 +522,7 @@
}
uint32_t writeBufferFlags;
- if (fFlags & SkGPipeWriter::kCrossProcess_Flag) {
+ if (SkToBool(fFlags & SkGPipeWriter::kCrossProcess_Flag)) {
writeBufferFlags = (SkFlattenableWriteBuffer::kInlineFactoryNames_Flag
| SkFlattenableWriteBuffer::kCrossProcess_Flag);
} else {
@@ -1213,8 +1213,18 @@
}
if (!SkTypeface::Equal(base.getTypeface(), paint.getTypeface())) {
- uint32_t id = this->getTypefaceID(paint.getTypeface());
- *ptr++ = PaintOp_packOpData(kTypeface_PaintOp, id);
+ if (SkToBool(fFlags & SkGPipeWriter::kCrossProcess_Flag)) {
+ uint32_t id = this->getTypefaceID(paint.getTypeface());
+ *ptr++ = PaintOp_packOpData(kTypeface_PaintOp, id);
+ } else if (this->needOpBytes(sizeof(void*))) {
+ // Add to the set for ref counting.
+ fTypefaceSet.add(paint.getTypeface());
+ // It is safe to write the typeface to the stream before the rest
+ // of the paint unless we ever send a kReset_PaintOp, which we
+ // currently never do.
+ this->writeOp(kSetTypeface_DrawOp);
+ fWriter.writePtr(paint.getTypeface());
+ }
base.setTypeface(paint.getTypeface());
}
@@ -1251,23 +1261,36 @@
#include "SkGPipe.h"
-SkGPipeWriter::SkGPipeWriter() : fWriter(0) {
+SkGPipeController::~SkGPipeController() {
+ SkSafeUnref(fCanvas);
+}
+
+void SkGPipeController::setCanvas(SkGPipeCanvas* canvas) {
+ SkRefCnt_SafeAssign(fCanvas, canvas);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+SkGPipeWriter::SkGPipeWriter()
+: fFactorySet(SkNEW(SkFactorySet))
+, fWriter(0) {
fCanvas = NULL;
}
SkGPipeWriter::~SkGPipeWriter() {
this->endRecording();
- SkSafeUnref(fCanvas);
+ fFactorySet->unref();
}
SkCanvas* SkGPipeWriter::startRecording(SkGPipeController* controller, uint32_t flags) {
if (NULL == fCanvas) {
fWriter.reset(NULL, 0);
- fFactorySet.reset();
+ fFactorySet->reset();
fCanvas = SkNEW_ARGS(SkGPipeCanvas, (controller, &fWriter,
(flags & kCrossProcess_Flag) ?
- &fFactorySet : NULL, flags));
+ fFactorySet : NULL, flags));
}
+ controller->setCanvas(fCanvas);
return fCanvas;
}