OLD | NEW |
---|---|
(Empty) | |
1 /* | |
2 * Copyright 2013 Google Inc. | |
3 * | |
4 * Use of this source code is governed by a BSD-style license that can be | |
5 * found in the LICENSE file. | |
6 */ | |
7 | |
8 #include "SkFlattenableUtils.h" | |
9 #include "Sk1DPathEffect.h" | |
10 #include "Sk2DPathEffect.h" | |
11 #include "SkAnnotation.h" | |
12 #include "SkArithmeticMode.h" | |
13 #include "SkAvoidXfermode.h" | |
14 #include "SkBicubicImageFilter.h" | |
15 #include "SkBitmapProcShader.h" | |
16 #include "SkBitmapSource.h" | |
17 #include "SkBlurDrawLooper.h" | |
18 #include "SkBlurImageFilter.h" | |
19 #include "SkBlurMaskFilter.h" | |
20 #include "SkColorFilterImageFilter.h" | |
21 #include "SkColorMatrixFilter.h" | |
22 #include "SkColorShader.h" | |
23 #include "SkColorTable.h" | |
24 #include "SkComposeImageFilter.h" | |
25 #include "SkComposeShader.h" | |
26 #include "SkCornerPathEffect.h" | |
27 #include "SkData.h" | |
28 #include "SkDataSet.h" | |
29 #include "SkDataTable.h" | |
30 #include "SkDiscretePathEffect.h" | |
31 #include "SkDisplacementMapEffect.h" | |
32 #include "SkDropShadowImageFilter.h" | |
33 #include "SkEmbossMaskFilter.h" | |
34 #include "SkEmptyShader.h" | |
35 #include "SkFilterShader.h" | |
36 #include "SkImageRef_GlobalPool.h" | |
37 #include "SkKernel33MaskFilter.h" | |
38 #include "SkLayerDrawLooper.h" | |
39 #include "SkLayerRasterizer.h" | |
40 #include "SkLerpXfermode.h" | |
41 #include "SkLightingImageFilter.h" | |
42 #include "SkLumaXfermode.h" | |
43 #include "SkMagnifierImageFilter.h" | |
44 #include "SkMallocPixelRef.h" | |
45 #include "SkMatrixConvolutionImageFilter.h" | |
46 #include "SkMergeImageFilter.h" | |
47 #include "SkMorphologyImageFilter.h" | |
48 #include "SkOffsetImageFilter.h" | |
49 #include "SkPathEffect.h" | |
50 #include "SkPerlinNoiseShader.h" | |
51 #include "SkPixelXorXfermode.h" | |
52 #include "SkRectShaderImageFilter.h" | |
53 #include "SkStippleMaskFilter.h" | |
54 #include "SkTableColorFilter.h" | |
55 #include "SkTableMaskFilter.h" | |
56 #include "SkTestImageFilters.h" | |
57 #include "SkTransparentShader.h" | |
58 #include "SkUnitMappers.h" | |
59 #include "SkXfermode.h" | |
60 #include "SkXfermodeImageFilter.h" | |
61 #include "gradients/SkLinearGradient.h" | |
62 #include "gradients/SkRadialGradient.h" | |
63 #include "gradients/SkSweepGradient.h" | |
64 #include "gradients/SkTwoPointConicalGradient.h" | |
65 #include "gradients/SkTwoPointRadialGradient.h" | |
66 | |
67 namespace { | |
68 | |
69 struct TypeFunctions { | |
70 TypeFunctions() : fFactory(0), fTypeCheck(0) {} | |
71 TypeFunctions(SkFlattenable::Factory factory, SkFlattenable::TypeCheck typeC heck) : | |
72 fFactory(factory), fTypeCheck(typeCheck) {} | |
73 SkFlattenable::Factory fFactory; | |
74 SkFlattenable::TypeCheck fTypeCheck; | |
75 }; | |
76 | |
77 const TypeFunctions& GetFunctions(SkFlattenable::Type type) { | |
mtklein
2013/09/24 22:52:18
We're going to have to come up with some way to ma
sugoi1
2013/09/25 21:15:27
Agreed. I'll try to think of a way to make the cod
| |
78 static TypeFunctions typeFunctions[SkFlattenable::kTypeCount]; | |
79 static bool init = false; | |
80 if (!init) { | |
81 // SkFlattenable::kNone : nothing to do | |
82 // SkFlattenable::kSkFlattenable : nothing to do | |
83 // SkFlattenable::kBATShader : not implemented - TODO | |
84 typeFunctions[SkFlattenable::kSk2DPathEffect] = | |
85 TypeFunctions(Sk2DPathEffect::CreateProc, Sk2DPathEffect::IsA); | |
86 // SkFlattenable::kSk3DShader : local to SkBlitter.cpp - TODO | |
87 typeFunctions[SkFlattenable::kSkAnnotation] = | |
88 TypeFunctions(SkAnnotation::CreateProc, SkAnnotation::IsA); | |
89 typeFunctions[SkFlattenable::kSkArithmeticMode_scalar] = TypeFunctions( | |
90 SkArithmeticMode::GetFactory(SkFlattenable::kSkArithmeticMode_scalar ), | |
91 SkArithmeticMode::GetTypeCheck(SkFlattenable::kSkArithmeticMode_scal ar)); | |
92 typeFunctions[SkFlattenable::kSkAvoidXfermode] = | |
93 TypeFunctions(SkAvoidXfermode::CreateProc, SkAvoidXfermode::IsA); | |
94 typeFunctions[SkFlattenable::kSkBicubicImageFilter] = | |
95 TypeFunctions(SkBicubicImageFilter::CreateProc, SkBicubicImageFilter ::IsA); | |
96 typeFunctions[SkFlattenable::kSkBitmapProcShader] = | |
97 TypeFunctions(SkBitmapProcShader::CreateProc, SkBitmapProcShader::Is A); | |
98 typeFunctions[SkFlattenable::kSkBitmapSource] = | |
99 TypeFunctions(SkBitmapSource::CreateProc, SkBitmapSource::IsA); | |
100 typeFunctions[SkFlattenable::kSkBlurDrawLooper] = | |
101 TypeFunctions(SkBlurDrawLooper::CreateProc, SkBlurDrawLooper::IsA); | |
102 typeFunctions[SkFlattenable::kSkBlurImageFilter] = | |
103 TypeFunctions(SkBlurImageFilter::CreateProc, SkBlurImageFilter::IsA) ; | |
104 typeFunctions[SkFlattenable::kSkBlurMaskFilterImpl] = TypeFunctions( | |
105 SkBlurMaskFilter::GetFactory(SkFlattenable::kSkBlurMaskFilterImpl), | |
106 SkBlurMaskFilter::GetTypeCheck(SkFlattenable::kSkBlurMaskFilterImpl) ); | |
107 typeFunctions[SkFlattenable::kSkClearXfermode] = TypeFunctions( | |
108 SkProcXfermode::GetFactory(SkFlattenable::kSkClearXfermode), | |
109 SkProcXfermode::GetTypeCheck(SkFlattenable::kSkClearXfermode)); | |
110 typeFunctions[SkFlattenable::kSkColorFilterImageFilter] = | |
111 TypeFunctions(SkColorFilterImageFilter::CreateProc, SkColorFilterIma geFilter::IsA); | |
112 typeFunctions[SkFlattenable::kSkColorMatrixFilter] = | |
113 TypeFunctions(SkColorMatrixFilter::CreateProc, SkColorMatrixFilter:: IsA); | |
114 typeFunctions[SkFlattenable::kSkColorShader] = | |
115 TypeFunctions(SkColorShader::CreateProc, SkColorShader::IsA); | |
116 typeFunctions[SkFlattenable::kSkColorTable] = | |
117 TypeFunctions(SkColorTable::CreateProc, SkColorTable::IsA); | |
118 typeFunctions[SkFlattenable::kSkComposeImageFilter] = | |
119 TypeFunctions(SkComposeImageFilter::CreateProc, SkComposeImageFilter ::IsA); | |
120 typeFunctions[SkFlattenable::kSkComposePathEffect] = | |
121 TypeFunctions(SkComposePathEffect::CreateProc, SkComposePathEffect:: IsA); | |
122 typeFunctions[SkFlattenable::kSkComposeShader] = | |
123 TypeFunctions(SkComposeShader::CreateProc, SkComposeShader::IsA); | |
124 typeFunctions[SkFlattenable::kSkCornerPathEffect] = | |
125 TypeFunctions(SkCornerPathEffect::CreateProc, SkCornerPathEffect::Is A); | |
126 typeFunctions[SkFlattenable::kSkCosineMapper] = | |
127 TypeFunctions(SkCosineMapper::CreateProc, SkCosineMapper::IsA); | |
128 typeFunctions[SkFlattenable::kSkData] = | |
129 TypeFunctions(SkData::CreateProc, SkData::IsA); | |
130 // SkFlattenable::kSkDataPixelRef : in image library - skip | |
131 typeFunctions[SkFlattenable::kSkDataSet] = | |
132 TypeFunctions(SkDataSet::CreateProc, SkDataSet::IsA); | |
133 typeFunctions[SkFlattenable::kSkDataTable] = | |
134 TypeFunctions(SkDataTable::CreateProc, SkDataTable::IsA); | |
135 typeFunctions[SkFlattenable::kSkDiffuseLightingImageFilter] = TypeFuncti ons( | |
136 SkLightingImageFilter::GetFactory(SkFlattenable::kSkDiffuseLightingI mageFilter), | |
137 SkLightingImageFilter::GetTypeCheck(SkFlattenable::kSkDiffuseLightin gImageFilter)); | |
138 typeFunctions[SkFlattenable::kSkDilateImageFilter] = | |
139 TypeFunctions(SkDilateImageFilter::CreateProc, SkDilateImageFilter:: IsA); | |
140 typeFunctions[SkFlattenable::kSkDiscreteMapper] = | |
141 TypeFunctions(SkDiscreteMapper::CreateProc, SkDiscreteMapper::IsA); | |
142 typeFunctions[SkFlattenable::kSkDiscretePathEffect] = | |
143 TypeFunctions(SkDiscretePathEffect::CreateProc, SkDiscretePathEffect ::IsA); | |
144 typeFunctions[SkFlattenable::kSkDisplacementMapEffect] = | |
145 TypeFunctions(SkDisplacementMapEffect::CreateProc, SkDisplacementMap Effect::IsA); | |
146 typeFunctions[SkFlattenable::kSkDistantLight] = TypeFunctions( | |
147 SkLightingImageFilter::GetFactory(SkFlattenable::kSkDistantLight), | |
148 SkLightingImageFilter::GetTypeCheck(SkFlattenable::kSkDistantLight)) ; | |
149 typeFunctions[SkFlattenable::kSkDownSampleImageFilter] = | |
150 TypeFunctions(SkDownSampleImageFilter::CreateProc, SkDownSampleImage Filter::IsA); | |
151 typeFunctions[SkFlattenable::kSkDropShadowImageFilter] = | |
152 TypeFunctions(SkDropShadowImageFilter::CreateProc, SkDropShadowImage Filter::IsA); | |
153 typeFunctions[SkFlattenable::kSkDstInXfermode] = TypeFunctions( | |
154 SkProcXfermode::GetFactory(SkFlattenable::kSkDstInXfermode), | |
155 SkProcXfermode::GetTypeCheck(SkFlattenable::kSkDstInXfermode)); | |
156 typeFunctions[SkFlattenable::kSkDstOutXfermode] = TypeFunctions( | |
157 SkProcXfermode::GetFactory(SkFlattenable::kSkDstOutXfermode), | |
158 SkProcXfermode::GetTypeCheck(SkFlattenable::kSkDstOutXfermode)); | |
159 typeFunctions[SkFlattenable::kSkEmbossMaskFilter] = | |
160 TypeFunctions(SkEmbossMaskFilter::CreateProc, SkEmbossMaskFilter::Is A); | |
161 typeFunctions[SkFlattenable::kSkEmptyShader] = | |
162 TypeFunctions(SkEmptyShader::CreateProc, SkEmptyShader::IsA); | |
163 typeFunctions[SkFlattenable::kSkErodeImageFilter] = | |
164 TypeFunctions(SkErodeImageFilter::CreateProc, SkErodeImageFilter::Is A); | |
165 typeFunctions[SkFlattenable::kSkFilterShader] = | |
166 TypeFunctions(SkFilterShader::CreateProc, SkFilterShader::IsA); | |
167 typeFunctions[SkFlattenable::kSkImageRef_GlobalPool] = | |
168 TypeFunctions(SkImageRef_GlobalPool::CreateProc, SkImageRef_GlobalPo ol::IsA); | |
169 typeFunctions[SkFlattenable::kSkKernel33MaskFilter] = | |
170 TypeFunctions(SkKernel33MaskFilter::CreateProc, SkKernel33MaskFilter ::IsA); | |
171 typeFunctions[SkFlattenable::kSkLayerDrawLooper] = | |
172 TypeFunctions(SkLayerDrawLooper::CreateProc, SkLayerDrawLooper::IsA) ; | |
173 typeFunctions[SkFlattenable::kSkLayerRasterizer] = | |
174 TypeFunctions(SkLayerRasterizer::CreateProc, SkLayerRasterizer::IsA) ; | |
175 typeFunctions[SkFlattenable::kSkLerpXfermode] = | |
176 TypeFunctions(SkLerpXfermode::CreateProc, SkLerpXfermode::IsA); | |
177 typeFunctions[SkFlattenable::kSkLightingColorFilter] = TypeFunctions( | |
178 SkColorFilter::GetFactory(SkFlattenable::kSkLightingColorFilter), | |
179 SkColorFilter::GetTypeCheck(SkFlattenable::kSkLightingColorFilter)); | |
180 typeFunctions[SkFlattenable::kSkLightingColorFilter_JustAdd] = TypeFunct ions( | |
181 SkColorFilter::GetFactory(SkFlattenable::kSkLightingColorFilter_Just Add), | |
182 SkColorFilter::GetTypeCheck(SkFlattenable::kSkLightingColorFilter_Ju stAdd)); | |
183 typeFunctions[SkFlattenable::kSkLightingColorFilter_JustMul] = TypeFunct ions( | |
184 SkColorFilter::GetFactory(SkFlattenable::kSkLightingColorFilter_Just Mul), | |
185 SkColorFilter::GetTypeCheck(SkFlattenable::kSkLightingColorFilter_Ju stMul)); | |
186 typeFunctions[SkFlattenable::kSkLightingColorFilter_NoPin] = TypeFunctio ns( | |
187 SkColorFilter::GetFactory(SkFlattenable::kSkLightingColorFilter_NoPi n), | |
188 SkColorFilter::GetTypeCheck(SkFlattenable::kSkLightingColorFilter_No Pin)); | |
189 typeFunctions[SkFlattenable::kSkLightingColorFilter_SingleMul] = TypeFun ctions( | |
190 SkColorFilter::GetFactory(SkFlattenable::kSkLightingColorFilter_Sing leMul), | |
191 SkColorFilter::GetTypeCheck(SkFlattenable::kSkLightingColorFilter_Si ngleMul)); | |
192 typeFunctions[SkFlattenable::kSkLinearGradient] = | |
193 TypeFunctions(SkLinearGradient::CreateProc, SkLinearGradient::IsA); | |
194 typeFunctions[SkFlattenable::kSkLine2DPathEffect] = | |
195 TypeFunctions(SkLine2DPathEffect::CreateProc, SkLine2DPathEffect::Is A); | |
196 typeFunctions[SkFlattenable::kSkLumaMaskXfermode] = | |
197 TypeFunctions(SkLumaMaskXfermode::CreateProc, SkLumaMaskXfermode::Is A); | |
198 // SkFlattenable::kSkLumaMaskXfermodeSrcOver : local to SkLumaXfermode.c pp - TODO | |
199 typeFunctions[SkFlattenable::kSkMagnifierImageFilter] = | |
200 TypeFunctions(SkMagnifierImageFilter::CreateProc, SkMagnifierImageFi lter::IsA); | |
201 typeFunctions[SkFlattenable::kSkMallocPixelRef] = | |
202 TypeFunctions(SkMallocPixelRef::CreateProc, SkMallocPixelRef::IsA); | |
203 typeFunctions[SkFlattenable::kSkMatrixConvolutionImageFilter] = | |
204 TypeFunctions(SkMatrixConvolutionImageFilter::CreateProc, SkMatrixCo nvolutionImageFilter::IsA); | |
205 typeFunctions[SkFlattenable::kSkMergeImageFilter] = | |
206 TypeFunctions(SkMergeImageFilter::CreateProc, SkMergeImageFilter::Is A); | |
207 typeFunctions[SkFlattenable::kSkModeColorFilter] = TypeFunctions( | |
208 SkColorFilter::GetFactory(SkFlattenable::kSkModeColorFilter), | |
209 SkColorFilter::GetTypeCheck(SkFlattenable::kSkModeColorFilter)); | |
210 typeFunctions[SkFlattenable::kSkOffsetImageFilter] = | |
211 TypeFunctions(SkOffsetImageFilter::CreateProc, SkOffsetImageFilter:: IsA); | |
212 typeFunctions[SkFlattenable::kSkPath1DPathEffect] = | |
213 TypeFunctions(SkPath1DPathEffect::CreateProc, SkPath1DPathEffect::Is A); | |
214 typeFunctions[SkFlattenable::kSkPath2DPathEffect] = | |
215 TypeFunctions(SkPath2DPathEffect::CreateProc, SkPath2DPathEffect::Is A); | |
216 typeFunctions[SkFlattenable::kSkPerlinNoiseShader] = | |
217 TypeFunctions(SkPerlinNoiseShader::CreateProc, SkPerlinNoiseShader:: IsA); | |
218 typeFunctions[SkFlattenable::kSkPixelXorXfermode] = | |
219 TypeFunctions(SkPixelXorXfermode::CreateProc, SkPixelXorXfermode::Is A); | |
220 typeFunctions[SkFlattenable::kSkPointLight] = TypeFunctions( | |
221 SkLightingImageFilter::GetFactory(SkFlattenable::kSkPointLight), | |
222 SkLightingImageFilter::GetTypeCheck(SkFlattenable::kSkPointLight)); | |
223 typeFunctions[SkFlattenable::kSkProcCoeffXfermode] = TypeFunctions( | |
224 SkProcXfermode::GetFactory(SkFlattenable::kSkProcCoeffXfermode), | |
225 SkProcXfermode::GetTypeCheck(SkFlattenable::kSkProcCoeffXfermode)); | |
226 typeFunctions[SkFlattenable::kSkProcXfermode] = | |
227 TypeFunctions(SkProcXfermode::CreateProc, SkProcXfermode::IsA); | |
228 typeFunctions[SkFlattenable::kSkRadialGradient] = | |
229 TypeFunctions(SkRadialGradient::CreateProc, SkRadialGradient::IsA); | |
230 typeFunctions[SkFlattenable::kSkRectShaderImageFilter] = | |
231 TypeFunctions(SkRectShaderImageFilter::CreateProc, SkRectShaderImage Filter::IsA); | |
232 typeFunctions[SkFlattenable::kSkSpecularLightingImageFilter] = TypeFunct ions( | |
233 SkLightingImageFilter::GetFactory(SkFlattenable::kSkSpecularLighting ImageFilter), | |
234 SkLightingImageFilter::GetTypeCheck(SkFlattenable::kSkSpecularLighti ngImageFilter)); | |
235 typeFunctions[SkFlattenable::kSkSpotLight] = TypeFunctions( | |
236 SkLightingImageFilter::GetFactory(SkFlattenable::kSkSpotLight), | |
237 SkLightingImageFilter::GetTypeCheck(SkFlattenable::kSkSpotLight)); | |
238 typeFunctions[SkFlattenable::kSkSrcXfermode] = TypeFunctions( | |
239 SkProcXfermode::GetFactory(SkFlattenable::kSkSrcXfermode), | |
240 SkProcXfermode::GetTypeCheck(SkFlattenable::kSkSrcXfermode)); | |
241 typeFunctions[SkFlattenable::kSkStippleMaskFilter] = | |
242 TypeFunctions(SkStippleMaskFilter::CreateProc, SkStippleMaskFilter:: IsA); | |
243 typeFunctions[SkFlattenable::kSkSumPathEffect] = | |
244 TypeFunctions(SkSumPathEffect::CreateProc, SkSumPathEffect::IsA); | |
245 typeFunctions[SkFlattenable::kSkSweepGradient] = | |
246 TypeFunctions(SkSweepGradient::CreateProc, SkSweepGradient::IsA); | |
247 typeFunctions[SkFlattenable::kSkTable_ColorFilter] = TypeFunctions( | |
248 SkTableColorFilter::GetFactory(SkFlattenable::kSkTable_ColorFilter), | |
249 SkTableColorFilter::GetTypeCheck(SkFlattenable::kSkTable_ColorFilter )); | |
250 typeFunctions[SkFlattenable::kSkTableMaskFilter] = | |
251 TypeFunctions(SkTableMaskFilter::CreateProc, SkTableMaskFilter::IsA) ; | |
252 typeFunctions[SkFlattenable::kSkTransparentShader] = | |
253 TypeFunctions(SkTransparentShader::CreateProc, SkTransparentShader:: IsA); | |
254 // SkFlattenable::kSkTriColorShader : not implemented - TODO | |
255 typeFunctions[SkFlattenable::kSkTwoPointConicalGradient] = | |
256 TypeFunctions(SkTwoPointConicalGradient::CreateProc, SkTwoPointConic alGradient::IsA); | |
257 typeFunctions[SkFlattenable::kSkTwoPointRadialGradient] = | |
258 TypeFunctions(SkTwoPointRadialGradient::CreateProc, SkTwoPointRadial Gradient::IsA); | |
259 typeFunctions[SkFlattenable::kSkXfermodeImageFilter] = | |
260 TypeFunctions(SkXfermodeImageFilter::CreateProc, SkXfermodeImageFilt er::IsA); | |
261 typeFunctions[SkFlattenable::kSrc_SkModeColorFilter] = TypeFunctions( | |
262 SkColorFilter::GetFactory(SkFlattenable::kSrc_SkModeColorFilter), | |
263 SkColorFilter::GetTypeCheck(SkFlattenable::kSrc_SkModeColorFilter)); | |
264 typeFunctions[SkFlattenable::kSrcOver_SkModeColorFilter] = TypeFunctions ( | |
265 SkColorFilter::GetFactory(SkFlattenable::kSrcOver_SkModeColorFilter) , | |
266 SkColorFilter::GetTypeCheck(SkFlattenable::kSrcOver_SkModeColorFilte r)); | |
267 | |
268 init = true; | |
269 } | |
270 return typeFunctions[(type < SkFlattenable::kTypeCount) ? type : SkFlattenab le::kNone]; | |
271 } | |
272 | |
273 } // end namespace | |
274 | |
275 namespace SkFlattenableUtils { | |
276 | |
277 // Returns the factory function required to create the given type | |
278 SkFlattenable::Factory TypeToFactory(SkFlattenable::Type type) { | |
279 return GetFunctions(type).fFactory; | |
280 } | |
281 | |
282 // Checks if typeA is a typeB | |
283 bool TypeIsA(SkFlattenable::Type typeA, SkFlattenable::Type typeB) { | |
284 SkFlattenable::TypeCheck typeCheck = GetFunctions(typeA).fTypeCheck; | |
285 return typeCheck ? (*typeCheck)(typeB) : false; | |
286 } | |
287 | |
288 } // end SkFlattenableUtils namespace | |
OLD | NEW |