/*
 * Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This code is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 only, as
 * published by the Free Software Foundation.  Oracle designates this
 * particular file as subject to the "Classpath" exception as provided
 * by Oracle in the LICENSE file that accompanied this code.
 *
 * This code is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * version 2 for more details (a copy is included in the LICENSE file that
 * accompanied this code).
 *
 * You should have received a copy of the GNU General Public License version
 * 2 along with this work; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 * or visit www.oracle.com if you need additional information or have any
 * questions.
 */

package javafx.css.converter;

import javafx.css.Size;
import javafx.css.ParsedValue;
import javafx.css.StyleConverter;
import javafx.scene.effect.BlurType;
import javafx.scene.effect.DropShadow;
import javafx.scene.effect.Effect;
import javafx.scene.effect.InnerShadow;
import javafx.scene.paint.Color;
import javafx.scene.text.Font;

import java.util.Map;

Since:9
/** * @since 9 */
public class EffectConverter extends StyleConverter<ParsedValue[], Effect> { // lazy, thread-safe instatiation private static class Holder { static final EffectConverter EFFECT_CONVERTER = new EffectConverter(); static final DropShadowConverter DROP_SHADOW_INSTANCE = new DropShadowConverter(); static final InnerShadowConverter INNER_SHADOW_INSTANCE = new InnerShadowConverter(); } public static StyleConverter<ParsedValue[], Effect> getInstance() { return Holder.EFFECT_CONVERTER; } @Override public Effect convert(ParsedValue<ParsedValue[], Effect> value, Font font) { throw new IllegalArgumentException("Parsed value is not an Effect"); } protected EffectConverter() { super(); } @Override public String toString() { return "EffectConverter"; } public static final class DropShadowConverter extends EffectConverter { public static DropShadowConverter getInstance() { return Holder.DROP_SHADOW_INSTANCE; } private DropShadowConverter() { super(); } // dropshadow( <blur-type> , <color> , <number> , <number> , <number> , <number> ) // <blur-type> = [ gaussian | one-pass-box | three-pass-box | two-pass-box ] // <color> The shadow Color. // <number> The radius of the shadow blur kernel. In the range // [0.0 ... 127.0], typical value 10. // <number> he spread of the shadow. The spread is the portion of // the radius where the contribution of the source material // will be 100%. The remaining portion of the radius will // have a contribution controlled by the blur kernel. A // spread of 0.0 will result in a distribution of the shadow // determined entirely by the blur algorithm. A spread of // 1.0 will result in a solid growth outward of the source // material opacity to the limit of the radius with a very // sharp cutoff to transparency at the radius. In the range // [0.0 ... 1.0] a value of 0.0 is no spread. // <number> The shadow offset in the x direction, in pixels. // <number> The shadow offset in the y direction, in pixels. @Override public Effect convert(ParsedValue<ParsedValue[], Effect> value, Font font) { Effect effect = super.getCachedValue(value); if (effect != null) return effect; final ParsedValue[] values = value.getValue(); final BlurType blurType = (BlurType) values[0].convert(font); final Color color = (Color) values[1].convert(font); final Double radius = ((Size) values[2].convert(font)).pixels(font); final Double spread = ((Size) values[3].convert(font)).pixels(font); final Double offsetX = ((Size) values[4].convert(font)).pixels(font); final Double offsetY = ((Size) values[5].convert(font)).pixels(font); DropShadow dropShadow = new DropShadow(); if (blurType != null) { dropShadow.setBlurType(blurType); } if (color != null) { dropShadow.setColor(color); } if (spread != null) { dropShadow.setSpread(spread); } if (radius != null) { dropShadow.setRadius(radius); } if (offsetX != null) { dropShadow.setOffsetX(offsetX); } if (offsetY != null) { dropShadow.setOffsetY(offsetY); } super.cacheValue(value, dropShadow); return dropShadow; } @Override public String toString() { return "DropShadowConverter"; } } public static final class InnerShadowConverter extends EffectConverter { public static InnerShadowConverter getInstance() { return Holder.INNER_SHADOW_INSTANCE; } private InnerShadowConverter() { super(); } // innershadow( <blur-type> , <color> , <number> , <number> , <number> , <number> ) // <blur-type> = [ gaussian | one-pass-box | three-pass-box | two-pass-box ] // <color> The shadow Color. // <number> The radius of the shadow blur kernel. In the range // [0.0 ... 127.0], typical value 10. // <number> The choke of the shadow. The choke is the portion of the // radius where the contribution of the source material will // be 100%. The remaining portion of the radius will have a // contribution controlled by the blur kernel. A choke of 0.0 // will result in a distribution of the shadow determined // entirely by the blur algorithm. A choke of 1.0 will result // in a solid growth inward of the shadow from the edges to // the limit of the radius with a very sharp cutoff to // transparency inside the radius. In the range [0.0 ... 1.0] // a value of 0.0 is no spread. // <number> The shadow offset in the x direction, in pixels. // <number> The shadow offset in the y direction, in pixels. @Override public Effect convert(ParsedValue<ParsedValue[], Effect> value, Font font) { Effect effect = super.getCachedValue(value); if (effect != null) return effect; final ParsedValue[] values = value.getValue(); final BlurType blurType = (BlurType) values[0].convert(font); final Color color = (Color) values[1].convert(font); final Double radius = ((Size) values[2].convert(font)).pixels(font); final Double choke = ((Size) values[3].convert(font)).pixels(font); final Double offsetX = ((Size) values[4].convert(font)).pixels(font); final Double offsetY = ((Size) values[5].convert(font)).pixels(font); InnerShadow innerShadow = new InnerShadow(); if (blurType != null) { innerShadow.setBlurType(blurType); } if (color != null) { innerShadow.setColor(color); } if (radius != null) { innerShadow.setRadius(radius); } if (choke != null) { innerShadow.setChoke(choke); } if (offsetX != null) { innerShadow.setOffsetX(offsetX); } if (offsetY != null) { innerShadow.setOffsetY(offsetY); } super.cacheValue(value, innerShadow); return innerShadow; } @Override public String toString() { return "InnerShadowConverter"; } } private static Map<ParsedValue<ParsedValue[], Effect>, Effect> cache; public static void clearCache() { if (cache != null) cache.clear(); } }