diff options
Diffstat (limited to 'src/org/cyanogenmod/wallpapers/photophase/effects/Effects.java')
-rw-r--r-- | src/org/cyanogenmod/wallpapers/photophase/effects/Effects.java | 338 |
1 files changed, 338 insertions, 0 deletions
diff --git a/src/org/cyanogenmod/wallpapers/photophase/effects/Effects.java b/src/org/cyanogenmod/wallpapers/photophase/effects/Effects.java new file mode 100644 index 0000000..0ab3f6c --- /dev/null +++ b/src/org/cyanogenmod/wallpapers/photophase/effects/Effects.java @@ -0,0 +1,338 @@ +/* + * Copyright (C) 2013 The CyanogenMod Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.cyanogenmod.wallpapers.photophase.effects; + +import android.graphics.Color; +import android.media.effect.Effect; +import android.media.effect.EffectContext; +import android.media.effect.EffectFactory; + +import org.cyanogenmod.wallpapers.photophase.preferences.PreferencesProvider.Preferences; +import org.cyanogenmod.wallpapers.photophase.utils.Utils; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * A class that manages all the supported effects + */ +public class Effects { + + /** + * Enumeration of the supported effects + */ + public enum EFFECTS { + /** + * @see PhotoPhaseEffectFactory#EFFECT_NULL + */ + NO_EFFECT, + /** + * @see EffectFactory#EFFECT_AUTOFIX + */ + AUTOFIX, + /** + * @see PhotoPhaseEffectFactory#EFFECT_BLUR + */ + BLUR, + /** + * @see EffectFactory#EFFECT_CROSSPROCESS + */ + CROSSPROCESS, + /** + * @see EffectFactory#EFFECT_DOCUMENTARY + */ + DOCUMENTARY, + /** + * @see EffectFactory#EFFECT_DUOTONE + */ + DUOTONE, + /** + * @see PhotoPhaseEffectFactory#EFFECT_EMBOSS + */ + EMBOSS, + /** + * @see EffectFactory#EFFECT_FISHEYE + */ + FISHEYE, + /** + * @see PhotoPhaseEffectFactory#EFFECT_GLOW + */ + GLOW, + /** + * @see EffectFactory#EFFECT_GRAIN + */ + GRAIN, + /** + * @see EffectFactory#EFFECT_GRAYSCALE + */ + GRAYSCALE, + /** + * @see PhotoPhaseEffectFactory#EFFECT_HALFTONE + */ + HALFTONE, + /** + * @see EffectFactory#EFFECT_LOMOISH + */ + LOMOISH, + /** + * @see PhotoPhaseEffectFactory#EFFECT_MIRROR + */ + MIRROR, + /** + * @see EffectFactory#EFFECT_NEGATIVE + */ + NEGATIVE, + /** + * @see PhotoPhaseEffectFactory#EFFECT_OUTLINE + */ + OUTLINE, + /** + * @see PhotoPhaseEffectFactory#EFFECT_PIXELATE + */ + PIXELATE, + /** + * @see PhotoPhaseEffectFactory#EFFECT_POPART + */ + POPART, + /** + * @see EffectFactory#EFFECT_POSTERIZE + */ + POSTERIZE, + /** + * @see EffectFactory#EFFECT_SATURATE + */ + SATURATE, + /** + * @see PhotoPhaseEffectFactory#EFFECT_SCANLINES + */ + SCANLINES, + /** + * @see EffectFactory#EFFECT_SEPIA + */ + SEPIA, + /** + * @see EffectFactory#EFFECT_TEMPERATURE + */ + TEMPERATURE, + /** + * @see EffectFactory#EFFECT_TINT + */ + TINT, + /** + * @see EffectFactory#EFFECT_VIGNETTE + */ + VIGNETTE; + + /** + * Method that returns the effect from its ordinal position + * + * @param ordinal The ordinal position + * @return EFFECTS The effect or null if wasn't found + */ + public static EFFECTS fromOrdinal(int ordinal) { + for (EFFECTS effect : EFFECTS.values()) { + if (effect.ordinal() == ordinal) { + return effect; + } + } + return null; + } + } + + private final Map<EFFECTS, Effect> mCachedEffects; + private final EffectContext mEffectContext; + + /** + * Constructor of <code>Effects</code> + * + * @param effectContext The current effect context + */ + public Effects(EffectContext effectContext) { + super(); + mCachedEffects = new HashMap<Effects.EFFECTS, Effect>(); + mEffectContext = effectContext; + } + + /** + * Method that that release the cached data + */ + public void release() { + if (mCachedEffects != null) { + for (Effect effect : mCachedEffects.values()) { + effect.release(); + } + mCachedEffects.clear(); + } + } + + /** + * Method that return the next effect to use with the picture. + * + * @return Effect The next effect to use or null if no need to apply any effect + */ + @SuppressWarnings("boxing") + public Effect getNextEffect() { + // Get a new instance of a effect factory + EffectFactory effectFactory = mEffectContext.getFactory(); + Effect effect = null; + + // Get an effect based on the user preference + List<EFFECTS> effects = Arrays.asList(Preferences.General.Effects.getEffectTypes()); + EFFECTS nextEffect = null; + if (effects.size() > 0) { + int low = 0; + int high = effects.size() - 1; + int pos = Utils.getNextRandom(low, high); + nextEffect = effects.get(pos); + } + if (nextEffect == null) { + if (EffectFactory.isEffectSupported(PhotoPhaseEffectFactory.EFFECT_NULL)) { + effect = effectFactory.createEffect(PhotoPhaseEffectFactory.EFFECT_NULL); + mCachedEffects.put(nextEffect, effect); + } + return effect; + } + + // Has a cached effect? + if (mCachedEffects.containsKey(nextEffect)) { + return mCachedEffects.get(nextEffect); + } + + // Select the effect if is available + if (nextEffect.compareTo(EFFECTS.AUTOFIX) == 0) { + if (EffectFactory.isEffectSupported(EffectFactory.EFFECT_AUTOFIX)) { + effect = effectFactory.createEffect(EffectFactory.EFFECT_AUTOFIX); + effect.setParameter("scale", 0.5f); + } + } else if (nextEffect.compareTo(EFFECTS.BLUR) == 0) { + if (EffectFactory.isEffectSupported(PhotoPhaseEffectFactory.EFFECT_BLUR)) { + effect = effectFactory.createEffect(PhotoPhaseEffectFactory.EFFECT_BLUR); + } + } else if (nextEffect.compareTo(EFFECTS.CROSSPROCESS) == 0) { + if (EffectFactory.isEffectSupported(EffectFactory.EFFECT_CROSSPROCESS)) { + effect = effectFactory.createEffect(EffectFactory.EFFECT_CROSSPROCESS); + } + } else if (nextEffect.compareTo(EFFECTS.DOCUMENTARY) == 0) { + if (EffectFactory.isEffectSupported(EffectFactory.EFFECT_DOCUMENTARY)) { + effect = effectFactory.createEffect(EffectFactory.EFFECT_DOCUMENTARY); + } + } else if (nextEffect.compareTo(EFFECTS.DUOTONE) == 0) { + if (EffectFactory.isEffectSupported(EffectFactory.EFFECT_DUOTONE)) { + effect = effectFactory.createEffect(EffectFactory.EFFECT_DUOTONE); + effect.setParameter("first_color", Color.parseColor("#FF8CACFF")); + effect.setParameter("second_color", Color.WHITE); + } + } else if (nextEffect.compareTo(EFFECTS.EMBOSS) == 0) { + if (EffectFactory.isEffectSupported(PhotoPhaseEffectFactory.EFFECT_EMBOSS)) { + effect = effectFactory.createEffect(PhotoPhaseEffectFactory.EFFECT_EMBOSS); + } + } else if (nextEffect.compareTo(EFFECTS.FISHEYE) == 0) { + if (EffectFactory.isEffectSupported(EffectFactory.EFFECT_FISHEYE)) { + effect = effectFactory.createEffect(EffectFactory.EFFECT_FISHEYE); + effect.setParameter("scale", 1.0f); + } + } else if (nextEffect.compareTo(EFFECTS.GLOW) == 0) { + if (EffectFactory.isEffectSupported(PhotoPhaseEffectFactory.EFFECT_GLOW)) { + effect = effectFactory.createEffect(PhotoPhaseEffectFactory.EFFECT_GLOW); + } + } else if (nextEffect.compareTo(EFFECTS.GRAIN) == 0) { + if (EffectFactory.isEffectSupported(EffectFactory.EFFECT_GRAIN)) { + effect = effectFactory.createEffect(EffectFactory.EFFECT_GRAIN); + effect.setParameter("strength", 1.0f); + } + } else if (nextEffect.compareTo(EFFECTS.GRAYSCALE) == 0) { + if (EffectFactory.isEffectSupported(EffectFactory.EFFECT_GRAYSCALE)) { + effect = effectFactory.createEffect(EffectFactory.EFFECT_GRAYSCALE); + } + } else if (nextEffect.compareTo(EFFECTS.HALFTONE) == 0) { + if (EffectFactory.isEffectSupported(PhotoPhaseEffectFactory.EFFECT_HALFTONE)) { + effect = effectFactory.createEffect(PhotoPhaseEffectFactory.EFFECT_HALFTONE); + effect.setParameter("strength", 8.0f); + } + } else if (nextEffect.compareTo(EFFECTS.MIRROR) == 0) { + if (EffectFactory.isEffectSupported(PhotoPhaseEffectFactory.EFFECT_MIRROR)) { + effect = effectFactory.createEffect(PhotoPhaseEffectFactory.EFFECT_MIRROR); + } + } else if (nextEffect.compareTo(EFFECTS.LOMOISH) == 0) { + if (EffectFactory.isEffectSupported(EffectFactory.EFFECT_LOMOISH)) { + effect = effectFactory.createEffect(EffectFactory.EFFECT_LOMOISH); + } + } else if (nextEffect.compareTo(EFFECTS.NEGATIVE) == 0) { + if (EffectFactory.isEffectSupported(EffectFactory.EFFECT_NEGATIVE)) { + effect = effectFactory.createEffect(EffectFactory.EFFECT_NEGATIVE); + } + } else if (nextEffect.compareTo(EFFECTS.OUTLINE) == 0) { + if (EffectFactory.isEffectSupported(PhotoPhaseEffectFactory.EFFECT_OUTLINE)) { + effect = effectFactory.createEffect(PhotoPhaseEffectFactory.EFFECT_OUTLINE); + } + } else if (nextEffect.compareTo(EFFECTS.PIXELATE) == 0) { + if (EffectFactory.isEffectSupported(PhotoPhaseEffectFactory.EFFECT_PIXELATE)) { + effect = effectFactory.createEffect(PhotoPhaseEffectFactory.EFFECT_PIXELATE); + effect.setParameter("strength", 8.0f); + } + } else if (nextEffect.compareTo(EFFECTS.POPART) == 0) { + if (EffectFactory.isEffectSupported(PhotoPhaseEffectFactory.EFFECT_POPART)) { + effect = effectFactory.createEffect(PhotoPhaseEffectFactory.EFFECT_POPART); + } + } else if (nextEffect.compareTo(EFFECTS.POSTERIZE) == 0) { + if (EffectFactory.isEffectSupported(EffectFactory.EFFECT_POSTERIZE)) { + effect = effectFactory.createEffect(EffectFactory.EFFECT_POSTERIZE); + } + } else if (nextEffect.compareTo(EFFECTS.SATURATE) == 0) { + if (EffectFactory.isEffectSupported(EffectFactory.EFFECT_SATURATE)) { + effect = effectFactory.createEffect(EffectFactory.EFFECT_SATURATE); + effect.setParameter("scale", .5f); + } + } else if (nextEffect.compareTo(EFFECTS.SCANLINES) == 0) { + if (EffectFactory.isEffectSupported(PhotoPhaseEffectFactory.EFFECT_SCANLINES)) { + effect = effectFactory.createEffect(PhotoPhaseEffectFactory.EFFECT_SCANLINES); + } + } else if (nextEffect.compareTo(EFFECTS.SEPIA) == 0) { + if (EffectFactory.isEffectSupported(EffectFactory.EFFECT_SEPIA)) { + effect = effectFactory.createEffect(EffectFactory.EFFECT_SEPIA); + } + } else if (nextEffect.compareTo(EFFECTS.TEMPERATURE) == 0) { + if (EffectFactory.isEffectSupported(EffectFactory.EFFECT_TEMPERATURE)) { + effect = effectFactory.createEffect(EffectFactory.EFFECT_TEMPERATURE); + effect.setParameter("scale", .9f); + } + } else if (nextEffect.compareTo(EFFECTS.TINT) == 0) { + if (EffectFactory.isEffectSupported(EffectFactory.EFFECT_TINT)) { + effect = effectFactory.createEffect(EffectFactory.EFFECT_TINT); + } + } else if (nextEffect.compareTo(EFFECTS.VIGNETTE) == 0) { + if (EffectFactory.isEffectSupported(EffectFactory.EFFECT_VIGNETTE)) { + effect = effectFactory.createEffect(EffectFactory.EFFECT_VIGNETTE); + effect.setParameter("scale", .5f); + } + } + + // Instead of not to apply any effect, just use one null effect to follow the same + // effect model. This allow to use the same height when Effect.apply is applied for all + // the frames + if (effect == null && EffectFactory.isEffectSupported(PhotoPhaseEffectFactory.EFFECT_NULL)) { + effect = effectFactory.createEffect(PhotoPhaseEffectFactory.EFFECT_NULL); + nextEffect = EFFECTS.NO_EFFECT; + } + + // Cache the effects + mCachedEffects.put(nextEffect, effect); + return effect; + } +} |