Ensure blob typeface information survives SkGPipe serialization.
When flattening text blobs to the temp buffer, we need to collect
typeface info and ship it across the pipe explicitly.
R=mtklein@google.com, reed@google.com, robertphillips@google.com, bungeman@google.com
BUG=412445
Author: fmalita@chromium.org
Review URL: https://codereview.chromium.org/563783003
diff --git a/src/pipe/SkGPipeRead.cpp b/src/pipe/SkGPipeRead.cpp
index 4bd4fa6..8cb0e34 100644
--- a/src/pipe/SkGPipeRead.cpp
+++ b/src/pipe/SkGPipeRead.cpp
@@ -194,8 +194,8 @@
*fTypefaces.append() = SkTypeface::Deserialize(&stream);
}
- void setTypeface(SkPaint* paint, unsigned id) {
- paint->setTypeface(id ? fTypefaces[id - 1] : NULL);
+ SkTypeface* getTypeface(unsigned id) const {
+ return id ? fTypefaces[id - 1] : NULL;
}
private:
@@ -676,11 +676,22 @@
SkScalar x = reader->readScalar();
SkScalar y = reader->readScalar();
+ int typefaceCount = reader->readU32();
+ SkAutoSTMalloc<16, SkTypeface*> typefaceArray(typefaceCount);
+ if (state->getFlags() & SkGPipeWriter::kCrossProcess_Flag) {
+ for (int i = 0; i < typefaceCount; ++i) {
+ typefaceArray[i] = state->getTypeface(reader->readU32());
+ }
+ } else {
+ reader->read(typefaceArray.get(), typefaceCount * sizeof(SkTypeface*));
+ }
+
size_t blobSize = reader->readU32();
const void* data = reader->skip(SkAlign4(blobSize));
if (state->shouldDraw()) {
SkReadBuffer blobBuffer(data, blobSize);
+ blobBuffer.setTypefaceArray(typefaceArray.get(), typefaceCount);
SkAutoTUnref<const SkTextBlob> blob(SkTextBlob::CreateFromBuffer(blobBuffer));
SkASSERT(blob.get());
@@ -731,7 +742,8 @@
case kTypeface_PaintOp:
SkASSERT(SkToBool(state->getFlags() &
SkGPipeWriter::kCrossProcess_Flag));
- state->setTypeface(p, data); break;
+ p->setTypeface(state->getTypeface(data));
+ break;
default: SkDEBUGFAIL("bad paintop"); return;
}
SkASSERT(reader->offset() <= stop);