OLD | NEW |
---|---|
1 | 1 |
2 /* | 2 /* |
3 * Copyright 2006 The Android Open Source Project | 3 * Copyright 2006 The Android Open Source Project |
4 * | 4 * |
5 * Use of this source code is governed by a BSD-style license that can be | 5 * Use of this source code is governed by a BSD-style license that can be |
6 * found in the LICENSE file. | 6 * found in the LICENSE file. |
7 */ | 7 */ |
8 | 8 |
9 | 9 |
10 #ifndef SkFlattenable_DEFINED | 10 #ifndef SkFlattenable_DEFINED |
11 #define SkFlattenable_DEFINED | 11 #define SkFlattenable_DEFINED |
12 | 12 |
13 #include "SkRefCnt.h" | 13 #include "SkRefCnt.h" |
14 | 14 |
15 class SkFlattenableReadBuffer; | 15 class SkFlattenableReadBuffer; |
16 class SkFlattenableWriteBuffer; | 16 class SkFlattenableWriteBuffer; |
17 | 17 |
18 #define SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(flattenable) \ | 18 #define SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(flattenable) \ |
19 SkFlattenable::Registrar(#flattenable, flattenable::CreateProc); | 19 SkFlattenable::Registrar(#flattenable, flattenable::CreateProc); |
20 | 20 |
21 #define SK_DECLARE_FLATTENABLE_REGISTRAR_GROUP() static void InitializeFlattenab les(); | 21 #define SK_DECLARE_FLATTENABLE_REGISTRAR_GROUP() static void InitializeFlattenab les(); |
22 | 22 |
23 #define SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(flattenable) \ | 23 #define SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(flattenable) \ |
24 void flattenable::InitializeFlattenables() { | 24 void flattenable::InitializeFlattenables() { |
25 | 25 |
26 #define SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END \ | 26 #define SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END \ |
27 } | 27 } |
28 | 28 |
29 #define SK_DECLARE_UNFLATTENABLE_OBJECT() \ | 29 #define SK_DECLARE_UNFLATTENABLE_OBJECT() \ |
30 virtual Factory getFactory() SK_OVERRIDE { return NULL; }; \ | 30 virtual Factory getFactory() SK_OVERRIDE { return NULL; }; |
31 | 31 |
32 #define SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(flattenable) \ | 32 #define SK_DEFINE_FLATTENABLE_TYPE_FCNT(flattenable) \ |
mtklein
2013/09/24 22:52:18
OK, I give up. What's FCNT stand for / short for?
sugoi1
2013/09/25 21:15:27
Sorry, typo, I meant FNCT, as in function. The nam
| |
33 static bool IsA(SkFlattenable::Type type) { \ | |
34 return (flattenable::GetType() == type) || INHERITED::IsA(type); \ | |
35 } \ | |
36 virtual SkFlattenable::Type getFlattenableType() SK_OVERRIDE { \ | |
37 return flattenable::GetType(); \ | |
38 } | |
39 | |
40 #define SK_DEFINE_FLATTENABLE_TYPE(flattenable) \ | |
mtklein
2013/09/24 22:52:18
Normally I love macros which cleverly do things li
sugoi1
2013/09/25 21:15:27
I not against this, but I sort of like the fact th
| |
41 static SkFlattenable::Type GetType() { \ | |
42 return SkFlattenable::k##flattenable; \ | |
43 } \ | |
44 SK_DEFINE_FLATTENABLE_TYPE_FCNT(flattenable) | |
45 | |
46 /** Only for SkFlattenable derived objects that have implementations hidden in a cpp file | |
47 */ | |
48 #define SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_UTILS() \ | |
mtklein
2013/09/24 22:52:18
May SK_DECLARE_FLATTENABLE_DESERIALIZATION and SK_
sugoi1
2013/09/25 21:15:27
I didn't invent the PUBLIC name, it was there befo
| |
49 static SkFlattenable::Factory GetFactory(SkFlattenable::Type); \ | |
50 static SkFlattenable::TypeCheck GetTypeCheck(SkFlattenable::Type); | |
51 | |
52 #define SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION(flattenable) \ | |
33 virtual Factory getFactory() SK_OVERRIDE { return CreateProc; } \ | 53 virtual Factory getFactory() SK_OVERRIDE { return CreateProc; } \ |
34 static SkFlattenable* CreateProc(SkFlattenableReadBuffer& buffer) { \ | 54 static SkFlattenable* CreateProc(SkFlattenableReadBuffer& buffer) { \ |
35 return SkNEW_ARGS(flattenable, (buffer)); \ | 55 return SkNEW_ARGS(flattenable, (buffer)); \ |
36 } | 56 } |
37 | 57 |
58 /** For SkFlattenable derived objects defined within the skia library | |
59 */ | |
60 #define SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(flattenable) \ | |
mtklein
2013/09/24 22:52:18
I think we'll be better off in the long term if we
sugoi1
2013/09/25 21:15:27
All right, I'll try to combine them into fewer mac
| |
61 SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION(flattenable) \ | |
62 SK_DEFINE_FLATTENABLE_TYPE(flattenable) | |
63 | |
64 /** For SkFlattenable derived objects defined outside of the skia (sample code, gms, etc). | |
65 Since these external object won't go through the ipc serialization, they are not given | |
66 a "Type" in the SkFlattenable::Type enum and there is no need to modify SkFl attenable.h | |
67 to add these derived classes. Note that the type is set to SkFlattenable::kN one here. | |
68 */ | |
69 #define SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS_EXTERN(flattenable) \ | |
70 SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION(flattenable) \ | |
71 static SkFlattenable::Type GetType() { \ | |
72 return SkFlattenable::kNone; \ | |
73 } \ | |
74 SK_DEFINE_FLATTENABLE_TYPE_FCNT(flattenable) | |
75 | |
38 /** \class SkFlattenable | 76 /** \class SkFlattenable |
39 | 77 |
40 SkFlattenable is the base class for objects that need to be flattened | 78 SkFlattenable is the base class for objects that need to be flattened |
41 into a data stream for either transport or as part of the key to the | 79 into a data stream for either transport or as part of the key to the |
42 font cache. | 80 font cache. |
43 */ | 81 */ |
44 class SK_API SkFlattenable : public SkRefCnt { | 82 class SK_API SkFlattenable : public SkRefCnt { |
45 public: | 83 public: |
84 enum Type { | |
mtklein
2013/09/24 22:52:18
Do you have any opinion on whether we want to limi
mtklein
2013/09/24 22:52:18
It'll help to add some comments here about how thi
sugoi1
2013/09/25 21:15:27
I don't see any reason to exclude types from it. T
sugoi1
2013/09/25 21:15:27
I added the comment about not reordering and a not
| |
85 kNone, | |
mtklein
2013/09/24 22:52:18
Oh I so hate to ask you to do this, but you're goi
sugoi1
2013/09/25 21:15:27
No problem, that's easy enough.
| |
86 kSkFlattenable, | |
87 kBATShader, | |
88 kSk2DPathEffect, | |
89 kSk3DShader, | |
90 kSkAnnotation, | |
91 kSkArithmeticMode_scalar, | |
92 kSkAvoidXfermode, | |
93 kSkBicubicImageFilter, | |
94 kSkBitmapProcShader, | |
95 kSkBitmapSource, | |
96 kSkBlurDrawLooper, | |
97 kSkBlurImageFilter, | |
98 kSkBlurMaskFilterImpl, | |
99 kSkClearXfermode, | |
100 kSkColorFilter, | |
101 kSkColorFilterImageFilter, | |
102 kSkColorMatrixFilter, | |
103 kSkColorShader, | |
104 kSkColorTable, | |
105 kSkComposeImageFilter, | |
106 kSkComposePathEffect, | |
107 kSkComposeShader, | |
108 kSkCornerPathEffect, | |
109 kSkCosineMapper, | |
110 kSkData, | |
111 kSkDataPixelRef, | |
112 kSkDataSet, | |
113 kSkDataTable, | |
114 kSkDiffuseLightingImageFilter, | |
115 kSkDilateImageFilter, | |
116 kSkDiscreteMapper, | |
117 kSkDiscretePathEffect, | |
118 kSkDisplacementMapEffect, | |
119 kSkDistantLight, | |
120 kSkDownSampleImageFilter, | |
121 kSkDrawLooper, | |
122 kSkDropShadowImageFilter, | |
123 kSkDstInXfermode, | |
124 kSkDstOutXfermode, | |
125 kSkEmbossMaskFilter, | |
126 kSkEmptyShader, | |
127 kSkErodeImageFilter, | |
128 kSkFilterShader, | |
129 kSkImageFilter, | |
130 kSkImageRef_GlobalPool, | |
131 kSkKernel33MaskFilter, | |
132 kSkLayerDrawLooper, | |
133 kSkLayerRasterizer, | |
134 kSkLerpXfermode, | |
135 kSkLight, | |
136 kSkLightingColorFilter, | |
137 kSkLightingColorFilter_JustAdd, | |
138 kSkLightingColorFilter_JustMul, | |
139 kSkLightingColorFilter_NoPin, | |
140 kSkLightingColorFilter_SingleMul, | |
141 kSkLinearGradient, | |
142 kSkLine2DPathEffect, | |
143 kSkLumaMaskXfermode, | |
144 kSkLumaMaskXfermodeSrcOver, | |
145 kSkMagnifierImageFilter, | |
146 kSkMallocPixelRef, | |
147 kSkMaskFilter, | |
148 kSkMatrixConvolutionImageFilter, | |
149 kSkMergeImageFilter, | |
150 kSkModeColorFilter, | |
151 kSkOffsetImageFilter, | |
152 kSkPathEffect, | |
153 kSkPath1DPathEffect, | |
154 kSkPath2DPathEffect, | |
155 kSkPerlinNoiseShader, | |
156 kSkPixelRef, | |
157 kSkPixelXorXfermode, | |
158 kSkPointLight, | |
159 kSkProcCoeffXfermode, | |
160 kSkProcXfermode, | |
161 kSkRadialGradient, | |
162 kSkRasterizer, | |
163 kSkRectShaderImageFilter, | |
164 kSkShader, | |
165 kSkSpecularLightingImageFilter, | |
166 kSkSpotLight, | |
167 kSkSrcXfermode, | |
168 kSkStippleMaskFilter, | |
169 kSkSumPathEffect, | |
170 kSkSweepGradient, | |
171 kSkTable_ColorFilter, | |
172 kSkTableMaskFilter, | |
173 kSkTransparentShader, | |
174 kSkTriColorShader, | |
175 kSkTwoPointConicalGradient, | |
176 kSkTwoPointRadialGradient, | |
177 kSkUnitMapper, | |
178 kSkXfermode, | |
179 kSkXfermodeImageFilter, | |
180 kSrc_SkModeColorFilter, | |
181 kSrcOver_SkModeColorFilter, | |
182 kTypeCount | |
183 }; | |
mtklein
2013/09/24 22:52:18
Can you add a comment betwe kSrcOver_SkModeColorFi
sugoi1
2013/09/25 21:15:27
Done.
| |
184 | |
46 SK_DECLARE_INST_COUNT(SkFlattenable) | 185 SK_DECLARE_INST_COUNT(SkFlattenable) |
47 | 186 |
48 typedef SkFlattenable* (*Factory)(SkFlattenableReadBuffer&); | 187 typedef SkFlattenable* (*Factory)(SkFlattenableReadBuffer&); |
188 typedef bool (*TypeCheck)(SkFlattenable::Type); | |
49 | 189 |
50 SkFlattenable() {} | 190 SkFlattenable() {} |
51 | 191 |
52 /** Implement this to return a factory function pointer that can be called | 192 /** Implement this to return a factory function pointer that can be called |
53 to recreate your class given a buffer (previously written to by your | 193 to recreate your class given a buffer (previously written to by your |
54 override of flatten(). | 194 override of flatten(). |
55 */ | 195 */ |
56 virtual Factory getFactory() = 0; | 196 virtual Factory getFactory() = 0; |
57 | 197 |
58 static Factory NameToFactory(const char name[]); | 198 static Factory NameToFactory(const char name[]); |
59 static const char* FactoryToName(Factory); | 199 static const char* FactoryToName(Factory); |
60 static void Register(const char name[], Factory); | 200 static void Register(const char name[], Factory); |
61 | 201 |
202 /** Returns the class id | |
mtklein
2013/09/24 22:52:18
Let's flesh out this (and related comments):
/**
sugoi1
2013/09/25 21:15:27
Done.
| |
203 */ | |
204 static SkFlattenable::Type GetType() { | |
205 return SkFlattenable::kSkFlattenable; | |
206 } | |
207 | |
208 /** Returns the class id of an object | |
209 */ | |
210 virtual SkFlattenable::Type getFlattenableType() = 0; | |
211 | |
212 /** Returns whether the current object is of the given type | |
213 */ | |
214 static bool IsA(SkFlattenable::Type type) { | |
215 return (GetType() == type); | |
216 } | |
217 | |
218 /** Returns the factory function required to create the given type | |
219 */ | |
220 static Factory TypeToFactory(Type type); | |
221 | |
222 /** Checks if typeA is a typeB | |
223 * For example, if typeA is kSkImageFilter and typeB is kSkFlattenable, thi s would return true | |
224 * Inversely, if typeA is kSkFlattenable and typeB is kSkImageFilter, this would return false | |
225 */ | |
226 static bool TypeIsA(SkFlattenable::Type typeA, SkFlattenable::Type typeB); | |
mtklein
2013/09/24 22:52:18
Does this need to be public?
sugoi1
2013/09/25 21:15:27
It needs to be accessible inside SkValidatingReadB
| |
227 | |
62 class Registrar { | 228 class Registrar { |
63 public: | 229 public: |
64 Registrar(const char name[], Factory factory) { | 230 Registrar(const char name[], Factory factory) { |
65 SkFlattenable::Register(name, factory); | 231 SkFlattenable::Register(name, factory); |
66 } | 232 } |
67 }; | 233 }; |
68 | 234 |
69 protected: | 235 protected: |
70 SkFlattenable(SkFlattenableReadBuffer&) {} | 236 SkFlattenable(SkFlattenableReadBuffer&) {} |
71 /** Override this to write data specific to your subclass into the buffer, | 237 /** Override this to write data specific to your subclass into the buffer, |
72 being sure to call your super-class' version first. This data will later | 238 being sure to call your super-class' version first. This data will later |
73 be passed to your Factory function, returned by getFactory(). | 239 be passed to your Factory function, returned by getFactory(). |
74 */ | 240 */ |
75 virtual void flatten(SkFlattenableWriteBuffer&) const; | 241 virtual void flatten(SkFlattenableWriteBuffer&) const; |
76 | 242 |
77 private: | 243 private: |
78 static void InitializeFlattenables(); | 244 static void InitializeFlattenables(); |
79 | 245 |
80 friend class SkGraphics; | 246 friend class SkGraphics; |
81 friend class SkFlattenableWriteBuffer; | 247 friend class SkFlattenableWriteBuffer; |
82 | 248 |
83 typedef SkRefCnt INHERITED; | 249 typedef SkRefCnt INHERITED; |
84 }; | 250 }; |
85 | 251 |
86 #endif | 252 #endif |
OLD | NEW |