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