1 /* Copyright (C) 2005-2011 Fabio Riccardi */
2 
3 package com.lightcrafts.model.ImageEditor;
4 
5 import com.lightcrafts.model.OperationType;
6 import com.lightcrafts.model.SliderConfig;
7 import com.lightcrafts.jai.utils.Transform;
8 import com.lightcrafts.jai.utils.Functions;
9 import com.lightcrafts.jai.JAIContext;
10 
11 import com.lightcrafts.mediax.jai.KernelJAI;
12 import com.lightcrafts.mediax.jai.JAI;
13 import com.lightcrafts.mediax.jai.BorderExtender;
14 import com.lightcrafts.mediax.jai.PlanarImage;
15 import java.awt.image.renderable.ParameterBlock;
16 import java.awt.*;
17 import java.text.DecimalFormat;
18 
19 /**
20  * Created by IntelliJ IDEA.
21  * User: fabio
22  * Date: Mar 16, 2005
23  * Time: 11:30:37 PM
24  * To change this template use File | Settings | File Templates.
25  */
26 public class HiPassFilterOperation extends BlendedOperation {
HiPassFilterOperation(Rendering rendering)27     public HiPassFilterOperation(Rendering rendering) {
28         super(rendering, type);
29         addSliderKey("Gain");
30         addSliderKey("Radius");
31 
32         DecimalFormat format = new DecimalFormat("0.000");
33 
34         setSliderConfig("Gain", new SliderConfig(0.01, 1, gain, .001, true, format));
35         setSliderConfig("Radius", new SliderConfig(0.2, 5, radius, .001, true, format));
36     }
37 
38     @Override
neutralDefault()39     public boolean neutralDefault() {
40         return false;
41     }
42 
43     static final OperationType type = new OperationTypeImpl("Hi Pass Filter");
44 
45     private double gain = 0.02;
46     private double radius = 0.8;
47 
48     private KernelJAI kernel = null;
49 
50     @Override
setSliderValue(String key, double value)51     public void setSliderValue(String key, double value) {
52         value = roundValue(key, value);
53 
54         if (key.equals("Gain") && gain != value) {
55             gain = value;
56             kernel = null;
57         } else if (key.equals("Radius") && radius != value) {
58             radius = value;
59             kernel = null;
60         } else
61             return;
62 
63         super.setSliderValue(key, value);
64     }
65 
66     private class HiPassFilter extends BlendedTransform {
HiPassFilter(PlanarImage source)67         HiPassFilter(PlanarImage source) {
68             super(source);
69         }
70 
71         @Override
setFront()72         public PlanarImage setFront() {
73             kernel = Functions.LoGSharpenKernel(radius * scale, gain);
74             ParameterBlock pb = new ParameterBlock();
75             pb.addSource(back);
76             pb.add(kernel);
77             RenderingHints hints = new RenderingHints(JAI.KEY_BORDER_EXTENDER,
78                     BorderExtender.createInstance(BorderExtender.BORDER_COPY));
79             hints.add(JAIContext.noCacheHint);
80             return JAI.create("convolve", pb, hints);
81         }
82     }
83 
84     @Override
updateOp(Transform op)85     protected void updateOp(Transform op) {
86         op.update();
87     }
88 
89     @Override
createBlendedOp(PlanarImage source)90     protected BlendedTransform createBlendedOp(PlanarImage source) {
91         return new HiPassFilter(source);
92     }
93 
94     @Override
getType()95     public OperationType getType() {
96         return type;
97     }
98 }
99