/*
 * Copyright 2011 Google Inc.
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */

#include "SkFlattenable.h"

#if defined(SK_DISABLE_EFFECT_DESERIALIZATION)

    void SkFlattenable::PrivateInitializer::InitEffects() {}
    void SkFlattenable::PrivateInitializer::InitImageFilters() {}

#else

    #include "../../src/effects/SkDashImpl.h"
    #include "../../src/effects/SkEmbossMaskFilter.h"
    #include "../../src/effects/SkOpPE.h"
    #include "../../src/effects/SkTrimPE.h"
    #include "Sk1DPathEffect.h"
    #include "Sk2DPathEffect.h"
    #include "SkBitmapProcShader.h"
    #include "SkColorFilter.h"
    #include "SkColorFilterShader.h"
    #include "SkColorMatrixFilterRowMajor255.h"
    #include "SkColorShader.h"
    #include "SkComposeShader.h"
    #include "SkCornerPathEffect.h"
    #include "SkDiscretePathEffect.h"
    #include "SkEmptyShader.h"
    #include "SkGradientShader.h"
    #include "SkHighContrastFilter.h"
    #include "SkImageShader.h"
    #include "SkLayerDrawLooper.h"
    #include "SkLightingShader.h"
    #include "SkLocalMatrixShader.h"
    #include "SkLumaColorFilter.h"
    #include "SkMixerBase.h"
    #include "SkMixerShader.h"
    #include "SkNormalSource.h"
    #include "SkOverdrawColorFilter.h"
    #include "SkPathEffect.h"
    #include "SkPerlinNoiseShader.h"
    #include "SkPictureShader.h"
    #include "SkRecordedDrawable.h"
    #include "SkShaderBase.h"
    #include "SkShaderMaskFilter.h"
    #include "SkTableColorFilter.h"

    #include "SkAlphaThresholdFilter.h"
    #include "SkBlurImageFilter.h"
    #include "SkColorFilterImageFilter.h"
    #include "SkComposeImageFilter.h"
    #include "SkDisplacementMapEffect.h"
    #include "SkDropShadowImageFilter.h"
    #include "SkImageSource.h"
    #include "SkLightingImageFilter.h"
    #include "SkLocalMatrixImageFilter.h"
    #include "SkMagnifierImageFilter.h"
    #include "SkMatrixConvolutionImageFilter.h"
    #include "SkMatrixImageFilter.h"
    #include "SkMergeImageFilter.h"
    #include "SkMorphologyImageFilter.h"
    #include "SkOffsetImageFilter.h"
    #include "SkPaintImageFilter.h"
    #include "SkPictureImageFilter.h"
    #include "SkTileImageFilter.h"
    #include "SkXfermodeImageFilter.h"

    /*
     *  Register most effects for deserialization.
     *
     *  None of these are strictly required for Skia to operate, so if you're
     *  not using deserialization yourself, you can define
     *  SK_DISABLE_EFFECT_SERIALIZATION, or modify/replace this file as needed.
     */
    void SkFlattenable::PrivateInitializer::InitEffects() {
        // Shaders.
        SK_REGISTER_FLATTENABLE(SkColor4Shader);
        SK_REGISTER_FLATTENABLE(SkColorFilterShader);
        SK_REGISTER_FLATTENABLE(SkColorShader);
        SK_REGISTER_FLATTENABLE(SkComposeShader);
        SK_REGISTER_FLATTENABLE(SkEmptyShader);
        SK_REGISTER_FLATTENABLE(SkLocalMatrixShader);
        SK_REGISTER_FLATTENABLE(SkPictureShader);
        SK_REGISTER_FLATTENABLE(SkShader_Mixer);
        SkGradientShader::RegisterFlattenables();
        SkLightingShader::RegisterFlattenables();
        SkPerlinNoiseShader::RegisterFlattenables();
        SkShaderBase::RegisterFlattenables();

        // Color filters.
        SK_REGISTER_FLATTENABLE(SkColorMatrixFilterRowMajor255);
        SK_REGISTER_FLATTENABLE(SkLumaColorFilter);
        SkColorFilter::RegisterFlattenables();
        SkHighContrastFilter::RegisterFlattenables();
        SkOverdrawColorFilter::RegisterFlattenables();
        SkTableColorFilter::RegisterFlattenables();

        // Mask filters.
        SK_REGISTER_FLATTENABLE(SkEmbossMaskFilter);
        SkMaskFilter::RegisterFlattenables();
        SkShaderMaskFilter::RegisterFlattenables();

        // Path effects.
        SK_REGISTER_FLATTENABLE(SkCornerPathEffect);
        SK_REGISTER_FLATTENABLE(SkDashImpl);
        SK_REGISTER_FLATTENABLE(SkDiscretePathEffect);
        SK_REGISTER_FLATTENABLE(SkLine2DPathEffect);
        SK_REGISTER_FLATTENABLE(SkMatrixPE);
        SK_REGISTER_FLATTENABLE(SkOpPE);
        SK_REGISTER_FLATTENABLE(SkPath1DPathEffect);
        SK_REGISTER_FLATTENABLE(SkPath2DPathEffect);
        SK_REGISTER_FLATTENABLE(SkStrokePE);
        SK_REGISTER_FLATTENABLE(SkTrimPE);
        SkPathEffect::RegisterFlattenables();

        // Misc.
        SK_REGISTER_FLATTENABLE(SkLayerDrawLooper);
        SK_REGISTER_FLATTENABLE(SkRecordedDrawable);
        SkNormalSource::RegisterFlattenables();
        SkMixerBase::RegisterFlattenables();
    }

    /*
     *  Register SkImageFilters for deserialization.
     *
     *  None of these are strictly required for Skia to operate, so if you're
     *  not using deserialization yourself, you can define
     *  SK_DISABLE_EFFECT_SERIALIZATION, or modify/replace this file as needed.
     */
    void SkFlattenable::PrivateInitializer::InitImageFilters() {
        SkAlphaThresholdFilter::RegisterFlattenables();
        SkImageFilter::RegisterFlattenables();
        SkArithmeticImageFilter::RegisterFlattenables();
        SkXfermodeImageFilter::RegisterFlattenables();
        SK_REGISTER_FLATTENABLE(SkDilateImageFilter);
        SK_REGISTER_FLATTENABLE(SkDisplacementMapEffect);
        SK_REGISTER_FLATTENABLE(SkDropShadowImageFilter);
        SK_REGISTER_FLATTENABLE(SkErodeImageFilter);
        SK_REGISTER_FLATTENABLE(SkImageSource);
        SK_REGISTER_FLATTENABLE(SkLocalMatrixImageFilter);
        SK_REGISTER_FLATTENABLE(SkPaintImageFilter);
        SK_REGISTER_FLATTENABLE(SkPictureImageFilter);
        SK_REGISTER_FLATTENABLE(SkTileImageFilter);
        SK_REGISTER_FLATTENABLE(SkMagnifierImageFilter);
        SK_REGISTER_FLATTENABLE(SkMatrixConvolutionImageFilter);
        SK_REGISTER_FLATTENABLE(SkMatrixImageFilter);
        SK_REGISTER_FLATTENABLE(SkOffsetImageFilter);
        SK_REGISTER_FLATTENABLE(SkComposeImageFilter);
        SK_REGISTER_FLATTENABLE(SkMergeImageFilter);
        SK_REGISTER_FLATTENABLE(SkColorFilterImageFilter);
        SkLightingImageFilter::RegisterFlattenables();
    }

#endif
