deweese 01/10/11 13:14:00 Modified: sources/org/apache/batik/ext/awt/image/rendered DisplacementMapRed.java Log: 1) Fixed an uncommon array index out of bounds error. 2) Improved a few bits here and there. Revision Changes Path 1.3 +57 -56 xml-batik/sources/org/apache/batik/ext/awt/image/rendered/DisplacementMapRed.java Index: DisplacementMapRed.java =================================================================== RCS file: /home/cvs/xml-batik/sources/org/apache/batik/ext/awt/image/rendered/DisplacementMapRed.java,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- DisplacementMapRed.java 2001/09/05 19:25:01 1.2 +++ DisplacementMapRed.java 2001/10/11 20:13:59 1.3 @@ -35,7 +35,7 @@ * GraphicsNode on demand for tiles. * * @author <a href="mailto:[EMAIL PROTECTED]">Vincent Hardy</a> - * @version $Id: DisplacementMapRed.java,v 1.2 2001/09/05 19:25:01 deweese Exp $ + * @version $Id: DisplacementMapRed.java,v 1.3 2001/10/11 20:13:59 deweese Exp $ */ public class DisplacementMapRed extends AbstractRed { // Use these to control timing and Nearest Neighbot vs. Bilinear Interp. @@ -210,7 +210,7 @@ return ret; SinglePixelPackedSampleModel sppsm; - sppsm = (SinglePixelPackedSampleModel)image.getSampleModel(); + sppsm = (SinglePixelPackedSampleModel)getSampleModel(); int base = sppsm.getOffset(0, 0); int tw = sppsm.getWidth(); @@ -243,7 +243,7 @@ return ret; SinglePixelPackedSampleModel sppsm; - sppsm = (SinglePixelPackedSampleModel)image.getSampleModel(); + sppsm = (SinglePixelPackedSampleModel)getSampleModel(); int stride = sppsm.getScanlineStride(); int th = sppsm.getHeight(); @@ -319,14 +319,11 @@ int dp = dstOff, ip = offOff; // Fixed point representation of scale factor. - final int fpScaleX = (int)((scaleX/255.0)*(1<<15)); - final int fpScaleY = (int)((scaleY/255.0)*(1<<15)); + final int fpScaleX = (int)((scaleX/255.0)*(1<<15)+0.5); + final int fpAdjX = (int)(-127.5*fpScaleX-0.5); + final int fpScaleY = (int)((scaleY/255.0)*(1<<15)+0.5); + final int fpAdjY = (int)(-127.5*fpScaleY-0.5); - final int maxDx = maxOffX; - final int dangerZoneX = w-maxDx; - final int maxDy = maxOffY; - final int dangerZoneY = h-maxDy; - long start = System.currentTimeMillis(); int sdp, pel00, pel01, pel10, pel11, xFrac, yFrac, newPel; @@ -341,8 +338,8 @@ for (x=xStart; x<xEnd; x++, dp++, ip++) { dPel = offPixels[ip]; - xDisplace = fpScaleX*(((dPel>>xShift)&0xff) - 127); - yDisplace = fpScaleY*(((dPel>>yShift)&0xff) - 127); + xDisplace = (fpScaleX*((dPel>>xShift)&0xff))+fpAdjX; + yDisplace = (fpScaleY*((dPel>>yShift)&0xff))+fpAdjY; x0 = x+(xDisplace>>15); y0 = y+(yDisplace>>15); @@ -408,40 +405,40 @@ // Combine the alpha channels. sp0 = (pel00>>>16) & 0xFF00; sp1 = (pel10>>>16) & 0xFF00; - pel0 = (sp0 + (((sp1-sp0)*xFrac)>>15)) & 0xFFFF; + pel0 = (sp0 + (((sp1-sp0)*xFrac+0x4000)>>15)) & 0xFFFF; sp0 = (pel01>>>16) & 0xFF00; sp1 = (pel11>>>16) & 0xFF00; - pel1 = (sp0 + (((sp1-sp0)*xFrac)>>15)) & 0xFFFF; + pel1 = (sp0 + (((sp1-sp0)*xFrac+0x4000)>>15)) & 0xFFFF; newPel = (((pel0<<15) + (pel1-pel0)*yFrac + 0x00400000) &0x7F800000)<< 1; // Combine the red channels. sp0 = (pel00>> 8) & 0xFF00; sp1 = (pel10>> 8) & 0xFF00; - pel0 = (sp0 + (((sp1-sp0)*xFrac)>>15)) & 0xFFFF; + pel0 = (sp0 + (((sp1-sp0)*xFrac+0x4000)>>15)) & 0xFFFF; sp0 = (pel01>> 8) & 0xFF00; sp1 = (pel11>> 8) & 0xFF00; - pel1 = (sp0 + (((sp1-sp0)*xFrac)>>15)) & 0xFFFF; + pel1 = (sp0 + (((sp1-sp0)*xFrac+0x4000)>>15)) & 0xFFFF; newPel |= (((pel0<<15) + (pel1-pel0)*yFrac + 0x00400000) &0x7F800000)>>> 7; // Combine the green channels. sp0 = (pel00 ) & 0xFF00; sp1 = (pel10 ) & 0xFF00; - pel0 = (sp0 + (((sp1-sp0)*xFrac)>>15)) & 0xFFFF; + pel0 = (sp0 + (((sp1-sp0)*xFrac+0x4000)>>15)) & 0xFFFF; sp0 = (pel01 ) & 0xFF00; sp1 = (pel11 ) & 0xFF00; - pel1 = (sp0 + (((sp1-sp0)*xFrac)>>15)) & 0xFFFF; + pel1 = (sp0 + (((sp1-sp0)*xFrac+0x4000)>>15)) & 0xFFFF; newPel |= (((pel0<<15) + (pel1-pel0)*yFrac + 0x00400000) &0x7F800000)>>>15; // Combine the blue channels. sp0 = (pel00<< 8) & 0xFF00; sp1 = (pel10<< 8) & 0xFF00; - pel0 = (sp0 + (((sp1-sp0)*xFrac)>>15)) & 0xFFFF; + pel0 = (sp0 + (((sp1-sp0)*xFrac+0x4000)>>15)) & 0xFFFF; sp0 = (pel01<< 8) & 0xFF00; sp1 = (pel11<< 8) & 0xFF00; - pel1 = (sp0 + (((sp1-sp0)*xFrac)>>15)) & 0xFFFF; + pel1 = (sp0 + (((sp1-sp0)*xFrac+0x4000)>>15)) & 0xFFFF; newPel |= (((pel0<<15) + (pel1-pel0)*yFrac + 0x00400000) &0x7F800000)>>>23; @@ -507,13 +504,11 @@ int dp = dstOff, ip = offOff; // Fixed point representation of scale factor. - final int fpScaleX = (int)((scaleX/255.0)*(1<<15)); - final int fpScaleY = (int)((scaleY/255.0)*(1<<15)); - - final int maxDx = maxOffX; - final int dangerZoneX = w-maxDx; - final int maxDy = maxOffY; - final int dangerZoneY = h-maxDy; + // Fixed point representation of scale factor. + final int fpScaleX = (int)((scaleX/255.0)*(1<<15)+0.5); + final int fpAdjX = (int)(-127.5*fpScaleX-0.5); + final int fpScaleY = (int)((scaleY/255.0)*(1<<15)+0.5); + final int fpAdjY = (int)(-127.5*fpScaleY-0.5); long start = System.currentTimeMillis(); @@ -530,8 +525,8 @@ for (x=xStart; x<xEnd; x++, dp++, ip++) { dPel = offPixels[ip]; - xDisplace = fpScaleX*(((dPel>>xShift)&0xff) - 127); - yDisplace = fpScaleY*(((dPel>>yShift)&0xff) - 127); + xDisplace = (fpScaleX*((dPel>>xShift)&0xff))+fpAdjX; + yDisplace = (fpScaleY*((dPel>>yShift)&0xff))+fpAdjY; x0 = x+(xDisplace>>15); y0 = y+(yDisplace>>15); @@ -597,45 +592,45 @@ // Combine the alpha channels. sp0 = (pel00>>>16) & 0xFF00; sp1 = (pel10>>>16) & 0xFF00; - pel0 = (sp0 + (((sp1-sp0)*xFrac)>>15)) & 0xFFFF; + pel0 = (sp0 + (((sp1-sp0)*xFrac+0x4000)>>15)) & 0xFFFF; a00 = ((sp0>>8)*norm + 0x80)>>8; a10 = ((sp1>>8)*norm + 0x80)>>8; sp0 = (pel01>>>16) & 0xFF00; sp1 = (pel11>>>16) & 0xFF00; - pel1 = (sp0 + (((sp1-sp0)*xFrac)>>15)) & 0xFFFF; + pel1 = (sp0 + (((sp1-sp0)*xFrac+0x4000)>>15)) & 0xFFFF; a01 = ((sp0>>8)*norm + 0x80)>>8; a11 = ((sp1>>8)*norm + 0x80)>>8; newPel = (((pel0<<15) + (pel1-pel0)*yFrac + 0x00400000) &0x7F800000)<< 1; // Combine the red channels. - sp0 = ((((pel00>> 16) & 0xFF)*a00)>>8) & 0xFF00; - sp1 = ((((pel10>> 16) & 0xFF)*a10)>>8) & 0xFF00; - pel0 = (sp0 + (((sp1-sp0)*xFrac)>>15)) & 0xFFFF; - sp0 = ((((pel01>> 16) & 0xFF)*a01)>>8) & 0xFF00; - sp1 = ((((pel11>> 16) & 0xFF)*a11)>>8) & 0xFF00; - pel1 = (sp0 + (((sp1-sp0)*xFrac)>>15)) & 0xFFFF; + sp0 = ((((pel00>> 16) & 0xFF)*a00) + 0x80)>>8; + sp1 = ((((pel10>> 16) & 0xFF)*a10) + 0x80)>>8; + pel0 = (sp0 + (((sp1-sp0)*xFrac+0x4000)>>15)) & 0xFFFF; + sp0 = ((((pel01>> 16) & 0xFF)*a01) + 0x80)>>8; + sp1 = ((((pel11>> 16) & 0xFF)*a11) + 0x80)>>8; + pel1 = (sp0 + (((sp1-sp0)*xFrac+0x4000)>>15)) & 0xFFFF; newPel |= (((pel0<<15) + (pel1-pel0)*yFrac + 0x00400000) &0x7F800000)>>> 7; // Combine the green channels. - sp0 = ((((pel00>> 8) & 0xFF)*a00)>>8) & 0xFF00; - sp1 = ((((pel10>> 8) & 0xFF)*a10)>>8) & 0xFF00; - pel0 = (sp0 + (((sp1-sp0)*xFrac)>>15)) & 0xFFFF; - sp0 = ((((pel01>> 8) & 0xFF)*a01)>>8) & 0xFF00; - sp1 = ((((pel11>> 8) & 0xFF)*a11)>>8) & 0xFF00; - pel1 = (sp0 + (((sp1-sp0)*xFrac)>>15)) & 0xFFFF; + sp0 = ((((pel00>> 8) & 0xFF)*a00) + 0x80)>>8; + sp1 = ((((pel10>> 8) & 0xFF)*a10) + 0x80)>>8; + pel0 = (sp0 + (((sp1-sp0)*xFrac+0x4000)>>15)) & 0xFFFF; + sp0 = ((((pel01>> 8) & 0xFF)*a01) + 0x80)>>8; + sp1 = ((((pel11>> 8) & 0xFF)*a11) + 0x80)>>8; + pel1 = (sp0 + (((sp1-sp0)*xFrac+0x4000)>>15)) & 0xFFFF; newPel |= (((pel0<<15) + (pel1-pel0)*yFrac + 0x00400000) &0x7F800000)>>>15; // Combine the blue channels. - sp0 = (((pel00 & 0xFF)*a00)>>8) & 0xFF00; - sp1 = (((pel10 & 0xFF)*a10)>>8) & 0xFF00; - pel0 = (sp0 + (((sp1-sp0)*xFrac)>>15)) & 0xFFFF; - sp0 = (((pel01 & 0xFF)*a01)>>8) & 0xFF00; - sp1 = (((pel11 & 0xFF)*a11)>>8) & 0xFF00; - pel1 = (sp0 + (((sp1-sp0)*xFrac)>>15)) & 0xFFFF; + sp0 = (((pel00 & 0xFF)*a00) + 0x80)>>8; + sp1 = (((pel10 & 0xFF)*a10) + 0x80)>>8; + pel0 = (sp0 + (((sp1-sp0)*xFrac+0x4000)>>15)) & 0xFFFF; + sp0 = (((pel01 & 0xFF)*a01) + 0x80)>>8; + sp1 = (((pel11 & 0xFF)*a11) + 0x80)>>8; + pel1 = (sp0 + (((sp1-sp0)*xFrac+0x4000)>>15)) & 0xFFFF; newPel |= (((pel0<<15) + (pel1-pel0)*yFrac + 0x00400000) &0x7F800000)>>>23; @@ -704,9 +699,14 @@ // to be shifted 24, RED 16, GREEN 8 and BLUE 0 final int xShift = xChannel.toInt()*8; final int yShift = yChannel.toInt()*8; + + final int fpScaleX = (int)((scaleX/255.0)*(1<<15)+0.5); + final int fpScaleY = (int)((scaleY/255.0)*(1<<15)+0.5); - final int fpScaleX = (int)(scaleX*(1<<16)/255 + 0.5f); - final int fpScaleY = (int)(scaleY*(1<<16)/255 + 0.5f); + // Calculate the shift to make '.5' no movement. + // This also includes rounding factor (0x4000) for Fixed Point stuff. + final int fpAdjX = (int)(-127.5*fpScaleX-0.5) + 0x4000; + final int fpAdjY = (int)(-127.5*fpScaleY-0.5) + 0x4000; // The pointer of img and dst indicating where the pixel values are int dp = dstOff, ip = offOff; @@ -715,16 +715,17 @@ int y=yStart, xt=xTile[0]-1, yt=yTile[0]-1; int [] imgPix = null; + int x0, y0, xDisplace, yDisplace, dPel; while (y<yEnd) { int x=xStart; while (x<xEnd) { - int pel = offPixels[ip]; + dPel = offPixels[ip]; - final int xDisplace = fpScaleX*(((pel>>xShift)&0xff) - 127); - final int yDisplace = fpScaleY*(((pel>>yShift)&0xff) - 127); + xDisplace = (fpScaleX*((dPel>>xShift)&0xff))+fpAdjX; + yDisplace = (fpScaleY*((dPel>>yShift)&0xff))+fpAdjY; - final int x0 = x+(xDisplace>>16); - final int y0 = y+(yDisplace>>16); + x0 = x+(xDisplace>>15); + y0 = y+(yDisplace>>15); if ((xt != xTile[x0]) || (yt != yTile[y0])) {
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]