001 //$HeadURL: svn+ssh://rbezema@svn.wald.intevation.org/deegree/base/branches/2.2_testing/src/org/deegree/model/gridprocessing/ImgResize.java $ 002 /* 003 * ImgResize.java 004 * 005 * Created on 23. Januar 2003, 12:22 006 */ 007 /*---------------- FILE HEADER ------------------------------------------ 008 009 This file is part of deegree. 010 Copyright (C) 2001-2008 by: 011 EXSE, Department of Geography, University of Bonn 012 http://www.giub.uni-bonn.de/deegree/ 013 lat/lon GmbH 014 http://www.lat-lon.de 015 016 This library is free software; you can redistribute it and/or 017 modify it under the terms of the GNU Lesser General Public 018 License as published by the Free Software Foundation; either 019 version 2.1 of the License, or (at your option) any later version. 020 021 This library is distributed in the hope that it will be useful, 022 but WITHOUT ANY WARRANTY; without even the implied warranty of 023 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 024 Lesser General Public License for more details. 025 026 You should have received a copy of the GNU Lesser General Public 027 License along with this library; if not, write to the Free Software 028 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 029 030 Contact: 031 032 Andreas Poth 033 lat/lon GmbH 034 Aennchenstr. 19 035 53115 Bonn 036 Germany 037 E-Mail: poth@lat-lon.de 038 039 Prof. Dr. Klaus Greve 040 Department of Geography 041 University of Bonn 042 Meckenheimer Allee 166 043 53115 Bonn 044 Germany 045 E-Mail: greve@giub.uni-bonn.de 046 047 048 ---------------------------------------------------------------------------*/ 049 package org.deegree.model.gridprocessing; 050 051 /** 052 * 053 * 054 * 055 * @author <a href="mailto:poth@lat-lon.de">Andreas Poth</a> 056 * @author last edited by: $Author: apoth $ 057 * 058 * @version. $Revision: 9343 $, $Date: 2007-12-27 14:30:32 +0100 (Do, 27 Dez 2007) $ 059 */ 060 public class ImgResize { 061 062 private float[][] inData = null; 063 064 private float[][] outData = null; 065 066 public ImgResize( float[][] data, int newWidth, int newHeight ) { 067 this.inData = data; 068 outData = new float[newWidth][newHeight]; 069 } 070 071 private int sign( int x ) { 072 int k = ( ( x ) > 0 ? 1 : -1 ); 073 return k; 074 } 075 076 /* 077 * Stretches a horizontal source line onto a horizontal destination line. Used by RectStretch. 078 * Entry: x1,x2 - x-coordinates of the destination line y1,y2 - x-coordinates of the source line 079 * yr - y-coordinate of source line yw - y-coordinate of destination line 080 */ 081 private void stretch( int x1, int x2, int y1, int y2, int yr, int yw ) { 082 int dx, dy, e, d, dx2; 083 int sx, sy; 084 float value = 0; 085 dx = Math.abs( x2 - x1 ); 086 dy = Math.abs( y2 - y1 ); 087 sx = sign( x2 - x1 ); 088 sy = sign( y2 - y1 ); 089 e = ( dy << 1 ) - dx; 090 dx2 = dx << 1; 091 dy = dy << 1; 092 for ( d = 0; d <= dx; d++ ) { 093 value = inData[yr][y1]; 094 outData[yw][x1] = value; 095 while ( e >= 0 ) { 096 y1 += sy; 097 e -= dx2; 098 } 099 x1 += sx; 100 e += dy; 101 } 102 } 103 104 /** 105 * RectStretch enlarges or diminishes a source rectangle of a bitmap to a destination rectangle. 106 * The source rectangle is selected by the two points (xs1,ys1) and (xs2,ys2), and the 107 * destination rectangle by (xd1,yd1) and (xd2,yd2). Since readability of source-code is wanted, 108 * some optimizations have been left out for the reader: It�s possible to read one line at a 109 * time, by first stretching in x-direction and then stretching that bitmap in y-direction. 110 * Entry: xs1,ys1 - first point of source rectangle xs2,ys2 - second point of source rectangle 111 * xd1,yd1 - first point of destination rectangle xd2,yd2 - second point of destination 112 * rectangle 113 */ 114 public float[][] rectStretch() { 115 116 int xs1 = 0; 117 int ys1 = 0; 118 int xs2 = inData[0].length - 1; 119 int ys2 = inData.length - 1; 120 int xd1 = 0; 121 int yd1 = 0; 122 int xd2 = outData[0].length - 1; 123 int yd2 = outData.length - 1; 124 125 int dx, dy, e, d, dx2; 126 int sx, sy; 127 dx = Math.abs( yd2 - yd1 ); 128 dy = Math.abs( ys2 - ys1 ); 129 sx = sign( yd2 - yd1 ); 130 sy = sign( ys2 - ys1 ); 131 e = ( dy << 1 ) - dx; 132 dx2 = dx << 1; 133 dy = dy << 1; 134 for ( d = 0; d <= dx; d++ ) { 135 stretch( xd1, xd2, xs1, xs2, ys1, yd1 ); 136 while ( e >= 0 ) { 137 ys1 += sy; 138 e -= dx2; 139 } 140 yd1 += sx; 141 e += dy; 142 } 143 return outData; 144 } 145 146 public float[][] simpleStretch() { 147 double dx = inData[0].length / (double) outData[0].length; 148 double dy = inData.length / (double) outData.length; 149 150 double py = 0.0; 151 for ( int y = 0; y < outData.length; y++ ) { 152 double px = 0.0; 153 for ( int x = 0; x < outData[0].length; x++ ) { 154 float v = inData[(int) py][(int) py]; 155 outData[y][x] = v; 156 px += dx; 157 } 158 py += dy; 159 } 160 return outData; 161 } 162 163 }