Program: 154028
Project: 154028
Buggy source:
/** 
 * Scale the given rectangle by the specified scale and translation  factors. The sources are cobbled.
 * @param sources   an array of sources, guarantee to provide allnecessary source data for computing the rectangle.
 * @param dest      a tile that contains the rectangle to be computed.
 * @param destRect  the rectangle within this OpImage to be processed.
 */
protected void computeRect(Raster[] sources,WritableRaster dest,Rectangle destRect){
  int mlibInterpType=Constants.MLIB_BICUBIC;
  if (interp instanceof InterpolationBicubic2) {
    mlibInterpType=Constants.MLIB_BICUBIC2;
  }
  Raster source=sources[0];
  Rectangle srcRect=source.getBounds();
  int formatTag=MediaLibAccessor.findCompatibleTag(sources,dest);
  MediaLibAccessor srcAccessor=new MediaLibAccessor(source,srcRect,formatTag);
  MediaLibAccessor dstAccessor=new MediaLibAccessor(dest,destRect,formatTag);
  double mlibScaleX=(double)scaleXRationalNum / (double)scaleXRationalDenom;
  double mlibScaleY=(double)scaleYRationalNum / (double)scaleYRationalDenom;
  long tempDenomX=scaleXRationalDenom * transXRationalDenom;
  long tempDenomY=scaleYRationalDenom * transYRationalDenom;
  long tempNumerX=(srcRect.x * scaleXRationalNum * transXRationalDenom) + (transXRationalNum * scaleXRationalDenom) - (destRect.x * tempDenomX);
  long tempNumerY=(srcRect.y * scaleYRationalNum * transYRationalDenom) + (transYRationalNum * scaleYRationalDenom) - (destRect.y * tempDenomY);
  double tx=(double)tempNumerX / (double)tempDenomX;
  double ty=(double)tempNumerY / (double)tempDenomY;
  mediaLibImage srcML[], dstML[];
switch (dstAccessor.getDataType()) {
case DataBuffer.TYPE_BYTE:
case DataBuffer.TYPE_USHORT:
case DataBuffer.TYPE_SHORT:
case DataBuffer.TYPE_INT:
    srcML=srcAccessor.getMediaLibImages();
  dstML=dstAccessor.getMediaLibImages();
for (int i=0; i < dstML.length; i++) {
  Image.ZoomTranslate(dstML[i],srcML[i],mlibScaleX,mlibScaleY,tx,ty,mlibInterpType,Constants.MLIB_EDGE_DST_NO_WRITE);
}
break;
case DataBuffer.TYPE_FLOAT:
case DataBuffer.TYPE_DOUBLE:
srcML=srcAccessor.getMediaLibImages();
dstML=dstAccessor.getMediaLibImages();
for (int i=0; i < dstML.length; i++) {
Image.ZoomTranslate_Fp(dstML[i],srcML[i],mlibScaleX,mlibScaleY,tx,ty,mlibInterpType,Constants.MLIB_EDGE_DST_NO_WRITE);
}
break;
default :
String className=this.getClass().getName();
throw new RuntimeException(JaiI18N.getString("String_Node_Str"));
}
if (dstAccessor.isDataCopy()) {
dstAccessor.clampDataArrays();
dstAccessor.copyDataToRaster();
}
}

Fixed version (ground truth):
/** 
 * Scale the given rectangle by the specified scale and translation  factors. The sources are cobbled.
 * @param sources   an array of sources, guarantee to provide allnecessary source data for computing the rectangle.
 * @param dest      a tile that contains the rectangle to be computed.
 * @param destRect  the rectangle within this OpImage to be processed.
 */
protected void computeRect(Raster[] sources,WritableRaster dest,Rectangle destRect){
  int mlibInterpType=Constants.MLIB_BICUBIC;
  if (interp instanceof InterpolationBicubic2) {
    mlibInterpType=Constants.MLIB_BICUBIC2;
  }
  Raster source=sources[0];
  Rectangle srcRect=source.getBounds();
  int formatTag=MediaLibAccessor.findCompatibleTag(sources,dest);
  MediaLibAccessor srcAccessor=new MediaLibAccessor(source,srcRect,formatTag);
  MediaLibAccessor dstAccessor=new MediaLibAccessor(dest,destRect,formatTag);
  double mlibScaleX=(double)scaleXRationalNum / (double)scaleXRationalDenom;
  double mlibScaleY=(double)scaleYRationalNum / (double)scaleYRationalDenom;
  long tempDenomX=scaleXRationalDenom * transXRationalDenom;
  long tempDenomY=scaleYRationalDenom * transYRationalDenom;
  long tempNumerX=(srcRect.x * scaleXRationalNum * transXRationalDenom) + (transXRationalNum * scaleXRationalDenom) - (destRect.x * tempDenomX);
  long tempNumerY=(srcRect.y * scaleYRationalNum * transYRationalDenom) + (transYRationalNum * scaleYRationalDenom) - (destRect.y * tempDenomY);
  double tx=(double)tempNumerX / (double)tempDenomX;
  double ty=(double)tempNumerY / (double)tempDenomY;
  mediaLibImage srcML[], dstML[];
switch (dstAccessor.getDataType()) {
case DataBuffer.TYPE_BYTE:
case DataBuffer.TYPE_USHORT:
case DataBuffer.TYPE_SHORT:
case DataBuffer.TYPE_INT:
    srcML=srcAccessor.getMediaLibImages();
  dstML=dstAccessor.getMediaLibImages();
for (int i=0; i < dstML.length; i++) {
  Image.ZoomTranslate(dstML[i],srcML[i],mlibScaleX,mlibScaleY,tx,ty,mlibInterpType,Constants.MLIB_EDGE_DST_NO_WRITE);
  MlibUtils.clampImage(dstML[i],getColorModel());
}
break;
case DataBuffer.TYPE_FLOAT:
case DataBuffer.TYPE_DOUBLE:
srcML=srcAccessor.getMediaLibImages();
dstML=dstAccessor.getMediaLibImages();
for (int i=0; i < dstML.length; i++) {
Image.ZoomTranslate_Fp(dstML[i],srcML[i],mlibScaleX,mlibScaleY,tx,ty,mlibInterpType,Constants.MLIB_EDGE_DST_NO_WRITE);
}
break;
default :
String className=this.getClass().getName();
throw new RuntimeException(JaiI18N.getString("String_Node_Str"));
}
if (dstAccessor.isDataCopy()) {
dstAccessor.clampDataArrays();
dstAccessor.copyDataToRaster();
}
}