Chromium Code Reviews| 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 |