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));
}
|