aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--include/core/SkTextBlob.h13
-rw-r--r--src/core/SkTextBlob.cpp46
-rw-r--r--tests/TextBlobTest.cpp22
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());