Index: src/effects/SkFlattenableUtils.cpp |
diff --git a/src/effects/SkFlattenableUtils.cpp b/src/effects/SkFlattenableUtils.cpp |
new file mode 100644 |
index 0000000000000000000000000000000000000000..ad644c02bf2f7fac4b3481986a0350d0ab8b7737 |
--- /dev/null |
+++ b/src/effects/SkFlattenableUtils.cpp |
@@ -0,0 +1,203 @@ |
+/* |
+ * Copyright 2013 Google Inc. |
+ * |
+ * Use of this source code is governed by a BSD-style license that can be |
+ * found in the LICENSE file. |
+ */ |
+ |
+#include "SkFlattenableUtils.h" |
+#include "Sk1DPathEffect.h" |
+#include "Sk2DPathEffect.h" |
+#include "SkAnnotation.h" |
+#include "SkArithmeticMode.h" |
+#include "SkAvoidXfermode.h" |
+#include "SkBicubicImageFilter.h" |
+#include "SkBitmapProcShader.h" |
+#include "SkBitmapSource.h" |
+#include "SkBlurDrawLooper.h" |
+#include "SkBlurImageFilter.h" |
+#include "SkBlurMaskFilter.h" |
+#include "SkColorFilterImageFilter.h" |
+#include "SkColorMatrixFilter.h" |
+#include "SkColorShader.h" |
+#include "SkColorTable.h" |
+#include "SkComposeImageFilter.h" |
+#include "SkComposeShader.h" |
+#include "SkCornerPathEffect.h" |
+#include "SkData.h" |
+#include "SkDataSet.h" |
+#include "SkDataTable.h" |
+#include "SkDiscretePathEffect.h" |
+#include "SkDisplacementMapEffect.h" |
+#include "SkDropShadowImageFilter.h" |
+#include "SkEmbossMaskFilter.h" |
+#include "SkEmptyShader.h" |
+#include "SkFilterShader.h" |
+#include "SkImageRef_GlobalPool.h" |
+#include "SkKernel33MaskFilter.h" |
+#include "SkLayerDrawLooper.h" |
+#include "SkLayerRasterizer.h" |
+#include "SkLerpXfermode.h" |
+#include "SkLightingImageFilter.h" |
+#include "SkLumaXfermode.h" |
+#include "SkMagnifierImageFilter.h" |
+#include "SkMallocPixelRef.h" |
+#include "SkMatrixConvolutionImageFilter.h" |
+#include "SkMergeImageFilter.h" |
+#include "SkMorphologyImageFilter.h" |
+#include "SkOffsetImageFilter.h" |
+#include "SkPathEffect.h" |
+#include "SkPerlinNoiseShader.h" |
+#include "SkPixelXorXfermode.h" |
+#include "SkRectShaderImageFilter.h" |
+#include "SkStippleMaskFilter.h" |
+#include "SkTableColorFilter.h" |
+#include "SkTableMaskFilter.h" |
+#include "SkTestImageFilters.h" |
+#include "SkTileImageFilter.h" |
+#include "SkTransparentShader.h" |
+#include "SkUnitMappers.h" |
+#include "SkXfermode.h" |
+#include "SkXfermodeImageFilter.h" |
+#include "gradients/SkLinearGradient.h" |
+#include "gradients/SkRadialGradient.h" |
+#include "gradients/SkSweepGradient.h" |
+#include "gradients/SkTwoPointConicalGradient.h" |
+#include "gradients/SkTwoPointRadialGradient.h" |
+ |
+namespace { |
+ |
+#define REGISTER_TYPE(type) \ |
+ typeFunctions[SkFlattenable::k##type##_Type] = \ |
+ TypeFunctions(type::CreateProc, type::IsA); |
+#define REGISTER_TYPE_BASE(type, base) \ |
+ typeFunctions[SkFlattenable::k##type##_Type] = TypeFunctions( \ |
+ base::GetFactory(SkFlattenable::k##type##_Type), \ |
+ base::GetTypeCheck(SkFlattenable::k##type##_Type)); |
+ |
+struct TypeFunctions { |
+ TypeFunctions() : fFactory(0), fTypeCheck(0) {} |
+ TypeFunctions(SkFlattenable::Factory factory, SkFlattenable::TypeCheck typeCheck) : |
+ fFactory(factory), fTypeCheck(typeCheck) {} |
+ SkFlattenable::Factory fFactory; |
+ SkFlattenable::TypeCheck fTypeCheck; |
+}; |
+ |
+const TypeFunctions& GetFunctions(SkFlattenable::Type type) { |
+ static TypeFunctions typeFunctions[SkFlattenable::kTypeCount]; |
+ static bool init = false; |
+ if (!init) { |
+ // None : nothing to do |
+ // SkFlattenable : nothing to do |
+ // SkLightingImageFilter : uninstantiatable - nothing to do |
+ // BATShader : not implemented - TODO |
+ // Sk3DShader : local to SkBlitter.cpp - TODO |
+ // SkLumaMaskXfermodeSrcOver : local to SkLumaXfermode.cpp - TODO |
+ // SkDataPixelRef : in image library - skip |
+ // SkTriColorShader : not implemented - TODO |
+ |
+ REGISTER_TYPE(Sk2DPathEffect); |
+ REGISTER_TYPE(SkAnnotation); |
+ REGISTER_TYPE(SkAvoidXfermode); |
+ REGISTER_TYPE(SkBicubicImageFilter); |
+ REGISTER_TYPE(SkBitmapProcShader); |
+ REGISTER_TYPE(SkBitmapSource); |
+ REGISTER_TYPE(SkBlurDrawLooper); |
+ REGISTER_TYPE(SkBlurImageFilter); |
+ REGISTER_TYPE(SkColorFilterImageFilter); |
+ REGISTER_TYPE(SkColorMatrixFilter); |
+ REGISTER_TYPE(SkColorShader); |
+ REGISTER_TYPE(SkColorTable); |
+ REGISTER_TYPE(SkComposeImageFilter); |
+ REGISTER_TYPE(SkComposePathEffect); |
+ REGISTER_TYPE(SkComposeShader); |
+ REGISTER_TYPE(SkCornerPathEffect); |
+ REGISTER_TYPE(SkCosineMapper); |
+ REGISTER_TYPE(SkData); |
+ REGISTER_TYPE(SkDataSet); |
+ REGISTER_TYPE(SkDataTable); |
+ REGISTER_TYPE(SkDilateImageFilter); |
+ REGISTER_TYPE(SkDiscreteMapper); |
+ REGISTER_TYPE(SkDiscretePathEffect); |
+ REGISTER_TYPE(SkDisplacementMapEffect); |
+ REGISTER_TYPE(SkDownSampleImageFilter); |
+ REGISTER_TYPE(SkDropShadowImageFilter); |
+ REGISTER_TYPE(SkEmbossMaskFilter); |
+ REGISTER_TYPE(SkEmptyShader); |
+ REGISTER_TYPE(SkErodeImageFilter); |
+ REGISTER_TYPE(SkFilterShader); |
+ REGISTER_TYPE(SkImageRef_GlobalPool); |
+ REGISTER_TYPE(SkKernel33MaskFilter); |
+ REGISTER_TYPE(SkLayerDrawLooper); |
+ REGISTER_TYPE(SkLayerRasterizer); |
+ REGISTER_TYPE(SkLerpXfermode); |
+ REGISTER_TYPE(SkLinearGradient); |
+ REGISTER_TYPE(SkLine2DPathEffect); |
+ REGISTER_TYPE(SkLumaMaskXfermode); |
+ REGISTER_TYPE(SkMagnifierImageFilter); |
+ REGISTER_TYPE(SkMallocPixelRef); |
+ REGISTER_TYPE(SkMatrixConvolutionImageFilter); |
+ REGISTER_TYPE(SkMergeImageFilter); |
+ REGISTER_TYPE(SkOffsetImageFilter); |
+ REGISTER_TYPE(SkPath1DPathEffect); |
+ REGISTER_TYPE(SkPath2DPathEffect); |
+ REGISTER_TYPE(SkPerlinNoiseShader); |
+ REGISTER_TYPE(SkPixelXorXfermode); |
+ REGISTER_TYPE(SkProcXfermode); |
+ REGISTER_TYPE(SkRadialGradient); |
+ REGISTER_TYPE(SkRectShaderImageFilter); |
+ REGISTER_TYPE(SkStippleMaskFilter); |
+ REGISTER_TYPE(SkSumPathEffect); |
+ REGISTER_TYPE(SkSweepGradient); |
+ REGISTER_TYPE(SkTableMaskFilter); |
+ REGISTER_TYPE(SkTileImageFilter); |
+ REGISTER_TYPE(SkTransparentShader); |
+ REGISTER_TYPE(SkTwoPointConicalGradient); |
+ REGISTER_TYPE(SkTwoPointRadialGradient); |
+ REGISTER_TYPE(SkXfermodeImageFilter); |
+ |
+ REGISTER_TYPE_BASE(SkArithmeticMode_scalar, SkArithmeticMode); |
+ REGISTER_TYPE_BASE(SkBlurMaskFilterImpl, SkBlurMaskFilter); |
+ REGISTER_TYPE_BASE(SkLightingColorFilter, SkColorFilter); |
+ REGISTER_TYPE_BASE(SkLightingColorFilter_JustAdd, SkColorFilter); |
+ REGISTER_TYPE_BASE(SkLightingColorFilter_JustMul, SkColorFilter); |
+ REGISTER_TYPE_BASE(SkLightingColorFilter_NoPin, SkColorFilter); |
+ REGISTER_TYPE_BASE(SkLightingColorFilter_SingleMul, SkColorFilter); |
+ REGISTER_TYPE_BASE(SkLightingColorFilter_JustAdd, SkColorFilter); |
+ REGISTER_TYPE_BASE(SkModeColorFilter, SkColorFilter); |
+ REGISTER_TYPE_BASE(Src_SkModeColorFilter, SkColorFilter); |
+ REGISTER_TYPE_BASE(SrcOver_SkModeColorFilter, SkColorFilter); |
+ REGISTER_TYPE_BASE(SkDiffuseLightingImageFilter, SkLightingImageFilter); |
+ REGISTER_TYPE_BASE(SkDistantLight, SkLightingImageFilter); |
+ REGISTER_TYPE_BASE(SkPointLight, SkLightingImageFilter); |
+ REGISTER_TYPE_BASE(SkSpecularLightingImageFilter, SkLightingImageFilter); |
+ REGISTER_TYPE_BASE(SkSpotLight, SkLightingImageFilter); |
+ REGISTER_TYPE_BASE(SkClearXfermode, SkProcXfermode); |
+ REGISTER_TYPE_BASE(SkDstInXfermode, SkProcXfermode); |
+ REGISTER_TYPE_BASE(SkDstOutXfermode, SkProcXfermode); |
+ REGISTER_TYPE_BASE(SkProcCoeffXfermode, SkProcXfermode); |
+ REGISTER_TYPE_BASE(SkSrcXfermode, SkProcXfermode); |
+ REGISTER_TYPE_BASE(SkTable_ColorFilter, SkTableColorFilter); |
+ |
+ init = true; |
+ } |
+ return typeFunctions[(type >= 0) && (type < SkFlattenable::kTypeCount) ? |
+ type : SkFlattenable::kNone_Type]; |
+} |
+ |
+} // end namespace |
+ |
+namespace SkFlattenableUtils { |
+ |
+// Returns the factory function required to create the given type |
+SkFlattenable::Factory TypeToFactory(SkFlattenable::Type type) { |
+ return GetFunctions(type).fFactory; |
+} |
+ |
+// Checks if typeA is a typeB |
+bool TypeIsA(SkFlattenable::Type typeA, SkFlattenable::Type typeB) { |
+ SkFlattenable::TypeCheck typeCheck = GetFunctions(typeA).fTypeCheck; |
+ return typeCheck ? (*typeCheck)(typeB) : false; |
+} |
+ |
+} // end SkFlattenableUtils namespace |