modules/graphics/src/main/java/com/sun/scenario/effect/impl/state/GaussianBlurState.java
Print this page
*** 23,43 ****
* questions.
*/
package com.sun.scenario.effect.impl.state;
! import java.nio.FloatBuffer;
! import com.sun.scenario.effect.impl.BufferUtil;
/**
* The state and implementation class for calculating 1 dimensional
! * linear convolution kernels for performing gaussian blurs.
*/
public class GaussianBlurState extends HVSeparableKernel {
private float hradius;
private float vradius;
- private FloatBuffer weights;
void checkRadius(float radius) {
if (radius < 0f || radius > 63f) {
throw new IllegalArgumentException("Radius must be in the range [1,63]");
}
--- 23,42 ----
* questions.
*/
package com.sun.scenario.effect.impl.state;
! import com.sun.javafx.geom.transform.BaseTransform;
! import com.sun.scenario.effect.Color4f;
/**
* The state and implementation class for calculating 1 dimensional
! * linear convolution kernels for performing Gaussian blurs.
*/
public class GaussianBlurState extends HVSeparableKernel {
private float hradius;
private float vradius;
void checkRadius(float radius) {
if (radius < 0f || radius > 63f) {
throw new IllegalArgumentException("Radius must be in the range [1,63]");
}
*** 78,159 ****
@Override
public boolean isNop() {
return hradius == 0 && vradius == 0;
}
- @Override
- public boolean isNop(int pass) {
- return getRadius(pass) == 0;
- }
-
public int getPad(int pass) {
return (int) Math.ceil(getRadius(pass));
}
- public int getScaledPad(int pass) {
- return getPad(pass);
- }
-
- public float getScaledRadius(int pass) {
- return getRadius(pass);
- }
-
@Override
public int getKernelSize(int pass) {
return getPad(pass) * 2 + 1;
}
public float getSpread() {
return 0f;
}
@Override
! public FloatBuffer getWeights(int pass) {
! float r0 = getScaledRadius(0);
! float r1 = getScaledRadius(1);
! // We need to apply the spread on only one pass
! // Prefer pass1 if r1 is not tiny (or at least bigger than r0)
! // Otherwise use pass 0 so that it doesn't disappear
! int spreadpass = (r1 > 1f || r1 >= r0) ? 1 : 0;
!
! float r = (pass == 0) ? r0 : r1;
! float s = (pass == spreadpass) ? getSpread() : 0f;
! weights = getGaussianWeights(weights, getScaledPad(pass), r, s);
! return weights;
! }
!
! static FloatBuffer getGaussianWeights(FloatBuffer weights,
! int pad,
! float radius,
! float spread)
! {
! int r = pad;
! int klen = (r * 2) + 1;
! if (weights == null) {
! weights = BufferUtil.newFloatBuffer(128);
! }
! weights.clear();
! float sigma = radius / 3;
! float sigma22 = 2 * sigma * sigma;
! if (sigma22 < Float.MIN_VALUE) {
! // Avoid divide by 0 below (it can generate NaN values).
! sigma22 = Float.MIN_VALUE;
! }
! float total = 0.0F;
! for (int row = -r; row <= r; row++) {
! float kval = (float) Math.exp(-(row * row) / sigma22);
! weights.put(kval);
! total += kval;
! }
! total += (weights.get(0) - total) * spread;
! for (int i = 0; i < klen; i++) {
! weights.put(i, weights.get(i) / total);
! }
! int limit = getPeerSize(klen);
! while (weights.position() < limit) {
! weights.put(0.0F);
! }
! weights.limit(limit);
! weights.rewind();
! return weights;
}
}
--- 77,105 ----
@Override
public boolean isNop() {
return hradius == 0 && vradius == 0;
}
public int getPad(int pass) {
return (int) Math.ceil(getRadius(pass));
}
@Override
public int getKernelSize(int pass) {
return getPad(pass) * 2 + 1;
}
public float getSpread() {
return 0f;
}
+ public Color4f getShadowColor() {
+ return null;
+ }
+
@Override
! public LinearConvolveRenderState getRenderState(BaseTransform filtertx) {
! return new GaussianRenderState(hradius, vradius, getSpread(),
! this instanceof GaussianShadowState, getShadowColor(),
! filtertx);
}
}