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]