/*
* Copyright (c) 2008, 2013, 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 com.sun.scenario.effect;
A high-level effect that renders a shadow of the given content behind
the content with the specified color, radius, and offset.
/**
* A high-level effect that renders a shadow of the given content behind
* the content with the specified color, radius, and offset.
*/
public class DropShadow extends DelegateEffect {
private AbstractShadow shadow;
private final Offset offset;
private final Merge merge;
Constructs a new DropShadow
effect, with the default blur radius (10.0), x offset (0.0), and y offset (0.0), using the default input for source data. This is a shorthand equivalent to: new DropShadow(DefaultInput, DefaultInput)
/**
* Constructs a new {@code DropShadow} effect, with the default
* blur radius (10.0), x offset (0.0), and y offset (0.0), using the
* default input for source data.
* This is a shorthand equivalent to:
* <pre>
* new DropShadow(DefaultInput, DefaultInput)
* </pre>
*/
public DropShadow() {
this(DefaultInput, DefaultInput);
}
Constructs a new DropShadow
effect, with the default blur radius (10.0), x offset (0.0), and y offset (0.0). This is a shorthand equivalent to: new DropShadow(input, input);
Params: - input – the single input
Effect
/**
* Constructs a new {@code DropShadow} effect, with the default
* blur radius (10.0), x offset (0.0), and y offset (0.0).
* This is a shorthand equivalent to:
* <pre>
* new DropShadow(input, input);
* </pre>
*
* @param input the single input {@code Effect}
*/
public DropShadow(Effect input) {
this(input, input);
}
Constructs a new DropShadow
effect, with the default blur radius (10.0), x offset (0.0), and y offset (0.0).
This constructor is intended for advanced developers only. Most
developers will only ever need to use the default constructor.
The shadowSourceInput
is used to create the background shadow, and the contentInput
is used to render the content over that shadow.
Params: - shadowSourceInput – the input
Effect
used to create the background shadow - contentInput – the input
Effect
used to render the content over the shadow
/**
* Constructs a new {@code DropShadow} effect, with the default
* blur radius (10.0), x offset (0.0), and y offset (0.0).
* <p>
* This constructor is intended for advanced developers only. Most
* developers will only ever need to use the default constructor.
* <p>
* The {@code shadowSourceInput} is used to create the background shadow,
* and the {@code contentInput} is used to render the content over that
* shadow.
*
* @param shadowSourceInput the input {@code Effect} used to create
* the background shadow
* @param contentInput the input {@code Effect} used to render the content
* over the shadow
*/
public DropShadow(Effect shadowSourceInput, Effect contentInput) {
super(shadowSourceInput, contentInput);
//
// (ssInput)
// |
// Shadow
// |
// Offset (cInput)
// | |
// Merge
// |
//
this.shadow = new GaussianShadow(10f, Color4f.BLACK, shadowSourceInput);
this.offset = new Offset(0, 0, shadow);
this.merge = new Merge(offset, contentInput);
}
public AbstractShadow.ShadowMode getShadowMode() {
return shadow.getMode();
}
public void setShadowMode(AbstractShadow.ShadowMode mode) {
AbstractShadow.ShadowMode old = shadow.getMode();
AbstractShadow s = shadow.implFor(mode);
if (s != shadow) {
offset.setInput(s);
}
this.shadow = s;
}
protected Effect getDelegate() {
return merge;
}
Returns the shadow source input for this Effect
. Returns: the shadow source input for this Effect
/**
* Returns the shadow source input for this {@code Effect}.
*
* @return the shadow source input for this {@code Effect}
*/
public final Effect getShadowSourceInput() {
return shadow.getInput();
}
Sets the shadow source input for this Effect
. Params: - shadowSourceInput – the shadow source input for this
Effect
Throws: - IllegalArgumentException – if
shadowSourceInput
is null
/**
* Sets the shadow source input for this {@code Effect}.
*
* @param shadowSourceInput the shadow source input for this {@code Effect}
* @throws IllegalArgumentException if {@code shadowSourceInput} is null
*/
public void setShadowSourceInput(Effect shadowSourceInput) {
shadow.setInput(shadowSourceInput);
}
Returns the content input for this Effect
. Returns: the content input for this Effect
/**
* Returns the content input for this {@code Effect}.
*
* @return the content input for this {@code Effect}
*/
public final Effect getContentInput() {
return merge.getTopInput();
}
Sets the content input for this Effect
. Params: - contentInput – the content input for this
Effect
Throws: - IllegalArgumentException – if
contentInput
is null
/**
* Sets the content input for this {@code Effect}.
*
* @param contentInput the content input for this {@code Effect}
* @throws IllegalArgumentException if {@code contentInput} is null
*/
public void setContentInput(Effect contentInput) {
merge.setTopInput(contentInput);
}
Returns the radius of the Gaussian kernel.
Returns: the radius of the Gaussian kernel
/**
* Returns the radius of the Gaussian kernel.
*
* @return the radius of the Gaussian kernel
*/
public float getRadius() {
return shadow.getGaussianRadius();
}
Sets the radius of the shadow blur kernel.
Min: 0.0
Max: 127.0
Default: 10.0
Identity: 0.0
Params: - radius – the radius of the shadow blur kernel
Throws: - IllegalArgumentException – if
radius
is outside the allowable range
/**
* Sets the radius of the shadow blur kernel.
* <pre>
* Min: 0.0
* Max: 127.0
* Default: 10.0
* Identity: 0.0
* </pre>
*
* @param radius the radius of the shadow blur kernel
* @throws IllegalArgumentException if {@code radius} is outside the
* allowable range
*/
public void setRadius(float radius) {
float old = shadow.getGaussianRadius();
shadow.setGaussianRadius(radius);
}
public float getGaussianRadius() {
return shadow.getGaussianRadius();
}
public float getGaussianWidth() {
return shadow.getGaussianWidth();
}
public float getGaussianHeight() {
return shadow.getGaussianHeight();
}
public void setGaussianRadius(float r) {
setRadius(r);
}
public void setGaussianWidth(float w) {
float old = shadow.getGaussianWidth();
shadow.setGaussianWidth(w);
}
public void setGaussianHeight(float h) {
float old = shadow.getGaussianHeight();
shadow.setGaussianHeight(h);
}
Gets the spread of the shadow effect.
Returns: the spread of the shadow effect
/**
* Gets the spread of the shadow effect.
*
* @return the spread of the shadow effect
*/
public float getSpread() {
return shadow.getSpread();
}
Sets the spread of the shadow effect. 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 Gaussian kernel. A spread of 0.0
will result in a pure Gaussian distribution of the shadow. 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. Min: 0.0
Max: 1.0
Default: 0.0
Identity: 0.0
Params: - spread – the spread of the shadow effect
Throws: - IllegalArgumentException – if
spread
is outside the allowable range
/**
* Sets the spread of the shadow effect.
* 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 Gaussian kernel.
* A spread of {@code 0.0} will result in a pure Gaussian distribution
* of the shadow.
* A spread of {@code 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.
* <pre>
* Min: 0.0
* Max: 1.0
* Default: 0.0
* Identity: 0.0
* </pre>
*
* @param spread the spread of the shadow effect
* @throws IllegalArgumentException if {@code spread} is outside the
* allowable range
*/
public void setSpread(float spread) {
float old = shadow.getSpread();
shadow.setSpread(spread);
}
Returns the shadow color.
Returns: the shadow color
/**
* Returns the shadow color.
*
* @return the shadow color
*/
public Color4f getColor() {
return shadow.getColor();
}
Sets the shadow color.
Min: n/a
Max: n/a
Default: Color4f.BLACK
Identity: n/a
Params: - color – the shadow color
Throws: - IllegalArgumentException – if
color
is null
/**
* Sets the shadow color.
* <pre>
* Min: n/a
* Max: n/a
* Default: Color4f.BLACK
* Identity: n/a
* </pre>
*
* @param color the shadow color
* @throws IllegalArgumentException if {@code color} is null
*/
public void setColor(Color4f color) {
Color4f old = shadow.getColor();
shadow.setColor(color);
}
Returns the offset in the x direction, in pixels.
Returns: the offset in the x direction, in pixels.
/**
* Returns the offset in the x direction, in pixels.
*
* @return the offset in the x direction, in pixels.
*/
public int getOffsetX() {
return offset.getX();
}
Sets the offset in the x direction, in pixels.
Min: Integer.MIN_VALUE
Max: Integer.MAX_VALUE
Default: 0
Identity: 0
Params: - xoff – the offset in the x direction, in pixels
/**
* Sets the offset in the x direction, in pixels.
* <pre>
* Min: Integer.MIN_VALUE
* Max: Integer.MAX_VALUE
* Default: 0
* Identity: 0
* </pre>
*
* @param xoff the offset in the x direction, in pixels
*/
public void setOffsetX(int xoff) {
int old = offset.getX();
offset.setX(xoff);
}
Returns the offset in the x direction, in pixels.
Returns: the offset in the x direction, in pixels.
/**
* Returns the offset in the x direction, in pixels.
*
* @return the offset in the x direction, in pixels.
*/
public int getOffsetY() {
return offset.getY();
}
Sets the offset in the y direction, in pixels.
Min: Integer.MIN_VALUE
Max: Integer.MAX_VALUE
Default: 0
Identity: 0
Params: - yoff – the offset in the y direction, in pixels
/**
* Sets the offset in the y direction, in pixels.
* <pre>
* Min: Integer.MIN_VALUE
* Max: Integer.MAX_VALUE
* Default: 0
* Identity: 0
* </pre>
*
* @param yoff the offset in the y direction, in pixels
*/
public void setOffsetY(int yoff) {
int old = offset.getY();
offset.setY(yoff);
}
@Override
public AccelType getAccelType(FilterContext fctx) {
return shadow.getAccelType(fctx);
}
}