001    //$HeadURL: svn+ssh://rbezema@svn.wald.intevation.org/deegree/base/tags/2.1/src/org/deegree/model/gridprocessing/ImgResize.java $
002    /*
003     * ImgResize.java
004     *
005     * Created on 23. Januar 2003, 12:22
006     */
007    
008    package org.deegree.model.gridprocessing;
009    
010    /**
011     *
012     * @author  <a href="mailto:poth@lat-lon.de">Andreas Poth</a>
013     * @version 22.1.2003
014     */
015    public class ImgResize {
016        
017        private float[][] inData = null;
018        private float[][] outData = null;
019        
020        public ImgResize(float[][] data, int newWidth, int newHeight) {
021            this.inData = data;
022            outData = new float[newWidth][newHeight];
023        }
024        
025        private int sign(int x) {
026            int k = ( (x) > 0 ? 1:-1);
027            return k;
028        }
029        
030       /*
031        * Stretches a horizontal source line onto a horizontal
032        * destination line. Used by RectStretch.
033        * Entry:
034        *    x1,x2 - x-coordinates of the destination line
035        *    y1,y2 - x-coordinates of the source line
036        *    yr    - y-coordinate of source line
037        *    yw    - y-coordinate of destination line
038        */
039        private void stretch(int x1,int x2,int y1,int y2,int yr,int yw) {
040            int dx,dy,e,d,dx2;
041            int sx,sy;
042            float value = 0;
043            dx = Math.abs(x2-x1);
044            dy = Math.abs(y2-y1);
045            sx = sign(x2-x1);
046            sy = sign(y2-y1);
047            e=( dy << 1 ) - dx;
048            dx2 = dx << 1;
049            dy = dy << 1;
050            for( d = 0; d <= dx; d++ ) {
051                value = inData[yr][y1];
052                outData[yw][x1] = value;
053                while(e >= 0 ) {
054                    y1 += sy;
055                    e -= dx2;
056                }
057                x1 += sx;
058                e += dy;
059            }
060        }
061        
062        /**
063         * RectStretch enlarges or diminishes a source rectangle of
064         * a bitmap to a destination rectangle. The source
065         * rectangle is selected by the two points (xs1,ys1) and
066         * (xs2,ys2), and the destination rectangle by (xd1,yd1) and
067         * (xd2,yd2). Since readability of source-code is wanted,
068         * some optimizations have been left out for the reader:
069         * It�s possible to read one line at a time, by first
070         * stretching in x-direction and then stretching that bitmap
071         * in y-direction.
072         * Entry:
073         * xs1,ys1 - first point of source rectangle
074         * xs2,ys2 - second point of source rectangle
075         * xd1,yd1 - first point of destination rectangle
076         * xd2,yd2 - second point of destination rectangle
077         */
078        public float[][] rectStretch() {
079            
080            int xs1 = 0;
081            int ys1 = 0;
082            int xs2 = inData[0].length-1;
083            int ys2 = inData.length-1;
084            int xd1 = 0;
085            int yd1 = 0;
086            int xd2 = outData[0].length-1;
087            int yd2 = outData.length-1;
088            
089            int dx,dy,e,d,dx2;
090            int sx,sy;
091            dx = Math.abs(yd2-yd1);
092            dy = Math.abs(ys2-ys1);
093            sx = sign(yd2-yd1);
094            sy = sign(ys2-ys1);
095            e =(dy << 1) - dx;
096            dx2 = dx << 1;
097            dy = dy << 1;
098            for(d = 0; d <= dx; d++) {
099                stretch(xd1,xd2,xs1,xs2,ys1,yd1);
100                while( e >= 0) {
101                    ys1 += sy;
102                    e -= dx2;
103                }
104                yd1 += sx;
105                e += dy;
106            }
107            return outData;
108        }
109        
110        public float[][] simpleStretch() {
111            double dx = inData[0].length / (double)outData[0].length;
112            double dy = inData.length / (double)outData.length;
113            
114            double py = 0.0;        
115            for (int y = 0; y < outData.length; y++) {
116                double px = 0.0;
117                for (int x = 0; x < outData[0].length; x++) {                
118                    float v = inData[ (int)py ][ (int)py];
119                    outData[ y ][ x ] = v;                
120                    px += dx;
121                }
122                py += dy;
123            }
124            return outData;
125        }
126        
127        
128        
129    }
130    /* ********************************************************************
131    Changes to this class. What the people have been up to:
132    $Log$
133    Revision 1.2  2006/07/12 14:46:19  poth
134    comment footer added
135    
136    ********************************************************************** */