Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(6)

Side by Side Diff: src/effects/SkFlattenableUtils.cpp

Issue 23021015: Initial error handling code (Closed) Base URL: https://skia.googlecode.com/svn/trunk
Patch Set: New serialization method Created 7 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698