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