From: <ma...@us...> - 2003-07-03 17:57:55
|
Update of /cvsroot/jrman/drafts/src/org/jrman/maps In directory sc8-pr-cvs1:/tmp/cvs-serv17576/src/org/jrman/maps Modified Files: MipMap.java Log Message: Implemented correct filtering for mipmap creation. Index: MipMap.java =================================================================== RCS file: /cvsroot/jrman/drafts/src/org/jrman/maps/MipMap.java,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** MipMap.java 2 Jul 2003 07:03:31 -0000 1.2 --- MipMap.java 3 Jul 2003 17:57:52 -0000 1.3 *************** *** 36,40 **** --- 36,42 ---- import javax.imageio.ImageIO; + import org.jrman.options.Filter; import org.jrman.util.Calc; + import org.jrman.util.SamplesFilter; public class MipMap { *************** *** 124,150 **** } ! private static byte[] scaleDown(byte[] data, int size) { byte[] result = new byte[data.length / 4]; ! int halfSize = size / 2; ! for (int y = 0; y < halfSize; y++) ! for (int x = 0; x < halfSize; x++) { ! int halfOffset = (y * halfSize + x) * 4; ! int r = 0; ! int g = 0; ! int b = 0; ! int a = 0; ! for (int iy = 0; iy < 2; iy++) ! for (int ix = 0; ix < 2; ix++) { ! int offset = ((y * 2 + iy) * size + x * 2 + ix) * 4; ! r += (data[offset] & 0xff); ! g += (data[offset + 1] & 0xff); ! b += (data[offset + 2] & 0xff); ! a += (data[offset + 3] & 0xff); ! } ! result[halfOffset] = (byte) (r / 4); ! result[halfOffset + 1] = (byte) (g / 4); ! result[halfOffset + 2] = (byte) (b / 4); ! result[halfOffset + 3] = (byte) (a / 4); ! } return result; } --- 126,147 ---- } ! private static byte[] scaleDown( ! byte[] data, ! int size, ! Mode sMode, ! Mode tMode, ! SamplesFilter samplesFilter) { byte[] result = new byte[data.length / 4]; ! samplesFilter.doFilter( ! data, ! size, ! result, ! size / 2, ! size / 2, ! size / 2, ! 2, ! 2, ! sMode, ! tMode); return result; } *************** *** 154,158 **** String filename, Mode sMode, ! Mode tMode) throws IOException { int largerSide = Math.max(image.getWidth(), image.getHeight()); --- 151,156 ---- String filename, Mode sMode, ! Mode tMode, ! Filter filter) throws IOException { int largerSide = Math.max(image.getWidth(), image.getHeight()); *************** *** 180,186 **** data[offset + 3] = (byte) (argb >> 24); } while (size >= 1) { dos.write(data); ! data = scaleDown(data, size); size /= 2; } --- 178,192 ---- data[offset + 3] = (byte) (argb >> 24); } + SamplesFilter samplesFilter = filter.getSamplesFilter(); + int width = (int) Math.ceil(filter.getHorizontalWidth() * 2); + int height = (int) Math.ceil(filter.getVerticalWidth() * 2); + samplesFilter.init( + width, + height, + filter.getHorizontalWidth(), + filter.getVerticalWidth()); while (size >= 1) { dos.write(data); ! data = scaleDown(data, size, sMode, tMode, samplesFilter); size /= 2; } *************** *** 193,201 **** String filename, Mode sMode, ! Mode tMode) throws IOException { File file = new File(imageFilename); BufferedImage image = ImageIO.read(file); ! makeMipMap(image, filename, sMode, tMode); } --- 199,215 ---- String filename, Mode sMode, ! Mode tMode, ! String filterType, ! float sWidth, ! float tWidth) throws IOException { File file = new File(imageFilename); BufferedImage image = ImageIO.read(file); ! makeMipMap( ! image, ! filename, ! sMode, ! tMode, ! new Filter(Filter.Type.getNamed(filterType), sWidth, tWidth)); } |