| Index: site/dev/contrib/flatten.md
|
| diff --git a/site/dev/contrib/flatten.md b/site/dev/contrib/flatten.md
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..c06a14b81214764db9fb826be91db0a4d9bc49fe
|
| --- /dev/null
|
| +++ b/site/dev/contrib/flatten.md
|
| @@ -0,0 +1,88 @@
|
| +Flattenables
|
| +============
|
| +
|
| +Many objects in Skia, such as SkShaders and other effects on SkPaint, need to be
|
| +flattened into a data stream for either transport or as part of the key to the
|
| +font cache. Classes for these objects should derive from SkFlattenable or one of
|
| +its subclasses. If you create a new flattenable class, you need to make sure you
|
| +do a few things so that it will work on all platforms:
|
| +
|
| +1: Override the method flatten (the default scope is protected):
|
| +
|
| +<!--?prettify?-->
|
| +~~~~
|
| +virtual void flatten(SkFlattenableWriteBuffer& buffer) const SK_OVERRIDE {
|
| + this->INHERITED::flatten(buffer);
|
| + // Write any private data that needs to be stored to recreate this object
|
| +}
|
| +~~~~
|
| +
|
| +2: Override the (protected) constructor that creates an object from an
|
| +SkFlattenableReadBuffer:
|
| +
|
| +<!--?prettify?-->
|
| +~~~~
|
| +SkNewClass(SkFlattenableReadBuffer& buffer)
|
| +: INHERITED(buffer) {
|
| + // Read the data from the buffer in the same order as it was written to the
|
| + // SkFlattenableWriteBuffer and construct the new object
|
| +}
|
| +~~~~
|
| +
|
| +3: Declare a set of deserialization procs for your object in the class declaration:
|
| +We have a macro for this:
|
| +
|
| +<!--?prettify?-->
|
| +~~~~
|
| +public:
|
| +
|
| +SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkNewClass)
|
| +~~~~
|
| +
|
| +4: If your class is declared in a .cpp file or in a private header file, create a
|
| +function to register its group:
|
| +This occurs in cases where the classes are hidden behind a factory, like many effects
|
| +and shaders are. Then in the parent class header file (such as SkGradientShader) you
|
| +need to add:
|
| +
|
| +<!--?prettify?-->
|
| +~~~~
|
| +public:
|
| +
|
| +SK_DECLARE_FLATTENABLE_REGISTRAR_GROUP()
|
| +~~~~
|
| +
|
| +Then in the cpp file you define all the members of the group together:
|
| +
|
| +<!--?prettify?-->
|
| +~~~~
|
| +SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkGroupClass)
|
| +
|
| + SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkMemberClass1)
|
| +
|
| + SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkMemberClass2)
|
| +
|
| + // etc
|
| +
|
| +SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END
|
| +~~~~
|
| +
|
| +
|
| +5: Register your flattenable with the global registrar:
|
| +You need to add one line to SkFlattenable::InitalizeFlattenables(). To register the
|
| +flattenable in a Skia build, that function is defined in SkGlobalInitialization_default.cpp.
|
| +For Chromium, it is in SkGlobalInitialization_chromium.cpp.
|
| +For a single flattenable add
|
| +
|
| +<!--?prettify?-->
|
| +~~~~
|
| +SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkNewClass)
|
| +~~~~
|
| +
|
| +For a group, add
|
| +
|
| +<!--?prettify?-->
|
| +~~~~
|
| +SkGroupClass::InitializeFlattenables();
|
| +~~~~
|
| +
|
|
|