aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core/SkTextBlob.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/SkTextBlob.cpp')
-rw-r--r--src/core/SkTextBlob.cpp46
1 files changed, 34 insertions, 12 deletions
diff --git a/src/core/SkTextBlob.cpp b/src/core/SkTextBlob.cpp
index a6cd744efc..ac8aec7f25 100644
--- a/src/core/SkTextBlob.cpp
+++ b/src/core/SkTextBlob.cpp
@@ -815,21 +815,23 @@ sk_sp<SkTextBlob> SkTextBlob::MakeFromBuffer(SkReadBuffer& reader) {
class SkTypefaceCatalogerWriteBuffer : public SkBinaryWriteBuffer {
public:
- SkTypefaceCatalogerWriteBuffer(const SkTypefaceCataloger& cataloger)
+ SkTypefaceCatalogerWriteBuffer(SkTypefaceCatalogerProc proc, void* ctx)
: SkBinaryWriteBuffer(SkBinaryWriteBuffer::kCrossProcess_Flag)
- , fCataloger(cataloger)
+ , fCatalogerProc(proc)
+ , fCatalogerCtx(ctx)
{}
void writeTypeface(SkTypeface* typeface) override {
- fCataloger(typeface);
+ fCatalogerProc(typeface, fCatalogerCtx);
this->write32(typeface ? typeface->uniqueID() : 0);
}
- const SkTypefaceCataloger& fCataloger;
+ SkTypefaceCatalogerProc fCatalogerProc;
+ void* fCatalogerCtx;
};
-sk_sp<SkData> SkTextBlob::serialize(const SkTypefaceCataloger& cataloger) const {
- SkTypefaceCatalogerWriteBuffer buffer(cataloger);
+sk_sp<SkData> SkTextBlob::serialize(SkTypefaceCatalogerProc proc, void* ctx) const {
+ SkTypefaceCatalogerWriteBuffer buffer(proc, ctx);
this->flatten(buffer);
size_t total = buffer.bytesWritten();
@@ -840,20 +842,40 @@ sk_sp<SkData> SkTextBlob::serialize(const SkTypefaceCataloger& cataloger) const
class SkTypefaceResolverReadBuffer : public SkReadBuffer {
public:
- SkTypefaceResolverReadBuffer(const void* data, size_t size, const SkTypefaceResolver& resolver)
+ SkTypefaceResolverReadBuffer(const void* data, size_t size, SkTypefaceResolverProc proc,
+ void* ctx)
: SkReadBuffer(data, size)
- , fResolver(resolver)
+ , fResolverProc(proc)
+ , fResolverCtx(ctx)
{}
sk_sp<SkTypeface> readTypeface() override {
- return fResolver(this->read32());
+ return fResolverProc(this->read32(), fResolverCtx);
}
- const SkTypefaceResolver& fResolver;
+ SkTypefaceResolverProc fResolverProc;
+ void* fResolverCtx;
};
sk_sp<SkTextBlob> SkTextBlob::Deserialize(const void* data, size_t length,
- const SkTypefaceResolver& resolver) {
- SkTypefaceResolverReadBuffer buffer(data, length, resolver);
+ SkTypefaceResolverProc proc, void* ctx) {
+ SkTypefaceResolverReadBuffer buffer(data, length, proc, ctx);
return SkTextBlob::MakeFromBuffer(buffer);
}
+
+#ifdef SK_SUPPORT_LEGACY_TEXTBLOB_SERIAL_API
+sk_sp<SkData> SkTextBlob::serialize(const SkTypefaceCataloger& cataloger) const {
+ return this->serialize([](SkTypeface* tf, void* ctx) {
+ const SkTypefaceCataloger& cataloger = *(const SkTypefaceCataloger*)ctx;
+ cataloger(tf);
+ }, (void*)&cataloger);
+}
+
+sk_sp<SkTextBlob> SkTextBlob::Deserialize(const void* data, size_t length,
+ const SkTypefaceResolver& resolver) {
+ return Deserialize(data, length, [](uint32_t id, void* ctx) {
+ const SkTypefaceResolver& resolver = *(const SkTypefaceResolver*)ctx;
+ return resolver(id);
+ }, (void*)&resolver);
+}
+#endif