diff options
-rw-r--r-- | include/core/SkTextBlob.h | 13 | ||||
-rw-r--r-- | src/core/SkTextBlob.cpp | 46 | ||||
-rw-r--r-- | tests/TextBlobTest.cpp | 22 |
3 files changed, 58 insertions, 23 deletions
diff --git a/include/core/SkTextBlob.h b/include/core/SkTextBlob.h index a4d2dba9a0..2fe852c762 100644 --- a/include/core/SkTextBlob.h +++ b/include/core/SkTextBlob.h @@ -17,8 +17,13 @@ class SkReadBuffer; class SkWriteBuffer; +#ifdef SK_SUPPORT_LEGACY_TEXTBLOB_SERIAL_API typedef std::function<void(SkTypeface*)> SkTypefaceCataloger; typedef std::function<sk_sp<SkTypeface>(uint32_t)> SkTypefaceResolver; +#endif + +typedef void (*SkTypefaceCatalogerProc)(SkTypeface*, void* ctx); +typedef sk_sp<SkTypeface> (*SkTypefaceResolverProc)(uint32_t id, void* ctx); /** \class SkTextBlob @@ -65,14 +70,20 @@ public: * During this process, each time a typeface is encountered, it is passed to the catalog, * allowing the caller to what typeface IDs will need to be resolved in Deserialize(). */ - sk_sp<SkData> serialize(const SkTypefaceCataloger&) const; + sk_sp<SkData> serialize(SkTypefaceCatalogerProc, void* ctx) const; /** * Re-create a text blob previously serialized. Since the serialized form records the uniqueIDs * of its typefaces, deserialization requires that the caller provide the corresponding * SkTypefaces for those IDs. */ + static sk_sp<SkTextBlob> Deserialize(const void* data, size_t size, + SkTypefaceResolverProc, void* ctx); + +#ifdef SK_SUPPORT_LEGACY_TEXTBLOB_SERIAL_API + sk_sp<SkData> serialize(const SkTypefaceCataloger&) const; static sk_sp<SkTextBlob> Deserialize(const void* data, size_t size, const SkTypefaceResolver&); +#endif private: friend class SkNVRefCnt<SkTextBlob>; 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 diff --git a/tests/TextBlobTest.cpp b/tests/TextBlobTest.cpp index c00970fa23..d8d4865b29 100644 --- a/tests/TextBlobTest.cpp +++ b/tests/TextBlobTest.cpp @@ -434,23 +434,25 @@ DEF_TEST(TextBlob_serialize, reporter) { sk_sp<SkTextBlob> blob0 = builder.make(); SkTDArray<SkTypeface*> array; - sk_sp<SkData> data = blob0->serialize([&array](SkTypeface* tf) { - if (array.find(tf) < 0) { - *array.append() = tf; + sk_sp<SkData> data = blob0->serialize([](SkTypeface* tf, void* ctx) { + auto array = (SkTDArray<SkTypeface*>*)ctx; + if (array->find(tf) < 0) { + *array->append() = tf; } - }); + }, &array); REPORTER_ASSERT(reporter, array.count() > 0); sk_sp<SkTextBlob> blob1 = SkTextBlob::Deserialize(data->data(), data->size(), - [&array, reporter](uint32_t uniqueID) { - for (int i = 0; i < array.count(); ++i) { - if (array[i]->uniqueID() == uniqueID) { - return sk_ref_sp(array[i]); + [](uint32_t uniqueID, void* ctx) { + auto array = (SkTDArray<SkTypeface*>*)ctx; + for (int i = 0; i < array->count(); ++i) { + if ((*array)[i]->uniqueID() == uniqueID) { + return sk_ref_sp((*array)[i]); } } - REPORTER_ASSERT(reporter, false); + SkASSERT(false); return sk_sp<SkTypeface>(nullptr); - }); + }, &array); sk_sp<SkImage> img0 = render(blob0.get()); sk_sp<SkImage> img1 = render(blob1.get()); |