huangcm
2025-09-01 53d8e046ac1bf2ebe94f671983e3d3be059df91a
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
/*
 * Copyright 2006 The Android Open Source Project
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */
 
#ifndef SkFlattenable_DEFINED
#define SkFlattenable_DEFINED
 
#include "SkRefCnt.h"
 
class SkData;
class SkReadBuffer;
class SkWriteBuffer;
 
struct SkSerialProcs;
struct SkDeserialProcs;
 
/** \class SkFlattenable
 
 SkFlattenable is the base class for objects that need to be flattened
 into a data stream for either transport or as part of the key to the
 font cache.
 */
class SK_API SkFlattenable : public SkRefCnt {
public:
    enum Type {
        kSkColorFilter_Type,
        kSkDrawable_Type,
        kSkDrawLooper_Type,
        kSkImageFilter_Type,
        kSkMaskFilter_Type,
        kSkPathEffect_Type,
        kSkPixelRef_Type,
        kSkUnused_Type4,    // used to be SkRasterizer
        kSkShaderBase_Type,
        kSkUnused_Type,     // used to be SkUnitMapper
        kSkUnused_Type2,
        kSkNormalSource_Type,
    };
 
    typedef sk_sp<SkFlattenable> (*Factory)(SkReadBuffer&);
 
    SkFlattenable() {}
 
    /** Implement this to return a factory function pointer that can be called
     to recreate your class given a buffer (previously written to by your
     override of flatten().
     */
    virtual Factory getFactory() const = 0;
 
    /**
     *  Returns the name of the object's class.
     */
    virtual const char* getTypeName() const = 0;
 
    static Factory NameToFactory(const char name[]);
    static const char* FactoryToName(Factory);
 
    static void Register(const char name[], Factory);
 
    /**
     *  Override this if your subclass needs to record data that it will need to recreate itself
     *  from its CreateProc (returned by getFactory()).
     *
     *  DEPRECATED public : will move to protected ... use serialize() instead
     */
    virtual void flatten(SkWriteBuffer&) const {}
 
    virtual Type getFlattenableType() const = 0;
 
    //
    // public ways to serialize / deserialize
    //
    sk_sp<SkData> serialize(const SkSerialProcs* = nullptr) const;
    size_t serialize(void* memory, size_t memory_size,
                     const SkSerialProcs* = nullptr) const;
    static sk_sp<SkFlattenable> Deserialize(Type, const void* data, size_t length,
                                            const SkDeserialProcs* procs = nullptr);
 
protected:
    class PrivateInitializer {
    public:
        static void InitEffects();
        static void InitImageFilters();
    };
 
private:
    static void RegisterFlattenablesIfNeeded();
    static void Finalize();
 
    friend class SkGraphics;
 
    typedef SkRefCnt INHERITED;
};
 
#define SK_REGISTER_FLATTENABLE(type) SkFlattenable::Register(#type, type::CreateProc)
 
#define SK_FLATTENABLE_HOOKS(type)                                   \
    static sk_sp<SkFlattenable> CreateProc(SkReadBuffer&);           \
    friend class SkFlattenable::PrivateInitializer;                  \
    Factory getFactory() const override { return type::CreateProc; } \
    const char* getTypeName() const override { return #type; }
 
#endif