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