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]

Reply via email to