001    package railo.runtime.functions.image;
002    
003    import java.awt.image.Kernel;
004    
005    import railo.runtime.PageContext;
006    import railo.runtime.exp.FunctionException;
007    import railo.runtime.exp.PageException;
008    import railo.runtime.op.Caster;
009    import railo.runtime.op.Decision;
010    
011    public class ImageFilterKernel {
012            public static Object call(PageContext pc, double width, double height, Object oData) throws PageException {
013                    
014                    float[] data=null;
015                    if(oData instanceof float[])
016                            data=(float[]) oData;
017                    else if(Decision.isNativeArray(oData)) {
018                            data=toFloatArray(pc,oData);
019                    }
020                    else if(Decision.isArray(oData)) {
021                            data=toFloatArray(pc,Caster.toNativeArray(oData));
022                    }
023                    else 
024                            throw new FunctionException(pc, "", 3, "data", "cannot cast data to a float array");
025                    
026                    return new Kernel(Caster.toIntValue(width),Caster.toIntValue(height),data);
027            }
028    
029            private static float[] toFloatArray(PageContext pc,Object oData) throws PageException {
030                    float[] data=null;
031                    // Object[]
032                    if(oData instanceof Object[]) {
033                            Object[] arr = ((Object[])oData);
034                            data=new float[arr.length];
035                            for(int i=0;i<arr.length;i++){
036                                    data[i]=Caster.toFloatValue(arr[i]);
037                            }
038                    }
039                    // boolean[]
040                    else if(oData instanceof boolean[]) {
041                            boolean[] arr = ((boolean[])oData);
042                            data=new float[arr.length];
043                            for(int i=0;i<arr.length;i++){
044                                    data[i]=Caster.toFloatValue(arr[i]);
045                            }
046                    }
047                    // byte[]
048                    else if(oData instanceof byte[]) {
049                            byte[] arr = ((byte[])oData);
050                            data=new float[arr.length];
051                            for(int i=0;i<arr.length;i++){
052                                    data[i]=Caster.toFloatValue(arr[i]);
053                            }
054                    }
055                    // short[]
056                    else if(oData instanceof short[]) {
057                            short[] arr = ((short[])oData);
058                            data=new float[arr.length];
059                            for(int i=0;i<arr.length;i++){
060                                    data[i]=Caster.toFloatValue(arr[i]);
061                            }
062                    }
063                    // long[]
064                    else if(oData instanceof long[]) {
065                            long[] arr = ((long[])oData);
066                            data=new float[arr.length];
067                            for(int i=0;i<arr.length;i++){
068                                    data[i]=Caster.toFloatValue(arr[i]);
069                            }
070                    }
071                    // int[]
072                    else if(oData instanceof int[]) {
073                            int[] arr = ((int[])oData);
074                            data=new float[arr.length];
075                            for(int i=0;i<arr.length;i++){
076                                    data[i]=Caster.toFloatValue(arr[i]);
077                            }
078                    }
079                    // double[]
080                    else if(oData instanceof double[]) {
081                            double[] arr = ((double[])oData);
082                            data=new float[arr.length];
083                            for(int i=0;i<arr.length;i++){
084                                    data[i]=Caster.toFloatValue(arr[i]);
085                            }
086                    }
087                    else 
088                            throw new FunctionException(pc, "", 3, "data", "cannot cast data to a float array");
089                    
090                    return data;
091            }
092    }