< prev index next >

src/java.desktop/share/classes/java/awt/image/RescaleOp.java

Print this page

        

*** 25,34 **** --- 25,36 ---- package java.awt.image; import java.awt.color.ColorSpace; import java.awt.geom.Rectangle2D; + import java.awt.AlphaComposite; + import java.awt.Graphics2D; import java.awt.Rectangle; import java.awt.geom.Point2D; import java.awt.RenderingHints; import sun.awt.image.ImagingLib;
*** 191,203 **** private ByteLookupTable createByteLut(float scale[], float off[], int nBands, int nElems) { ! byte[][] lutData = new byte[scale.length][nElems]; ! for (int band=0; band<scale.length; band++) { float bandScale = scale[band]; float bandOff = off[band]; byte[] bandLutData = lutData[band]; for (int i=0; i<nElems; i++) { int val = (int)(i*bandScale + bandOff); --- 193,206 ---- private ByteLookupTable createByteLut(float scale[], float off[], int nBands, int nElems) { ! byte[][] lutData = new byte[nBands][nElems]; ! int band; ! for (band=0; band<scale.length; band++) { float bandScale = scale[band]; float bandOff = off[band]; byte[] bandLutData = lutData[band]; for (int i=0; i<nElems; i++) { int val = (int)(i*bandScale + bandOff);
*** 210,219 **** --- 213,233 ---- } bandLutData[i] = (byte)val; } } + int maxToCopy = (nBands == 4 && scale.length == 4) ? 4 : 3; + while (band < lutData.length && band < maxToCopy) { + System.arraycopy(lutData[band-1], 0, lutData[band], 0, nElems); + band++; + } + if (nBands == 4 && band < nBands) { + byte[] bandLutData = lutData[band]; + for (int i=0; i<nElems; i++) { + bandLutData[i] = (byte)i; + } + } return new ByteLookupTable(0, lutData); } /**
*** 226,238 **** private ShortLookupTable createShortLut(float scale[], float off[], int nBands, int nElems) { ! short[][] lutData = new short[scale.length][nElems]; ! for (int band=0; band<scale.length; band++) { float bandScale = scale[band]; float bandOff = off[band]; short[] bandLutData = lutData[band]; for (int i=0; i<nElems; i++) { int val = (int)(i*bandScale + bandOff); --- 240,253 ---- private ShortLookupTable createShortLut(float scale[], float off[], int nBands, int nElems) { ! short[][] lutData = new short[nBands][nElems]; ! int band = 0; ! for (band=0; band<scale.length; band++) { float bandScale = scale[band]; float bandOff = off[band]; short[] bandLutData = lutData[band]; for (int i=0; i<nElems; i++) { int val = (int)(i*bandScale + bandOff);
*** 244,253 **** --- 259,279 ---- } } bandLutData[i] = (short)val; } } + int maxToCopy = (nBands == 4 && scale.length == 4) ? 4 : 3; + while (band < lutData.length && band < maxToCopy) { + System.arraycopy(lutData[band-1], 0, lutData[band], 0, nElems); + band++; + } + if (nBands == 4 && band < nBands) { + short[] bandLutData = lutData[band]; + for (int i=0; i<nElems; i++) { + bandLutData[i] = (short)i; + } + } return new ShortLookupTable(0, lutData); }
*** 298,307 **** --- 324,346 ---- if (bandSize != srcNbits) { return false; } } + if (dstSM instanceof ComponentSampleModel) { + ComponentSampleModel dsm = (ComponentSampleModel)dstSM; + if (dsm.getPixelStride() != dst.getNumBands()) { + return false; + } + } + if (srcSM instanceof ComponentSampleModel) { + ComponentSampleModel csm = (ComponentSampleModel)srcSM; + if (csm.getPixelStride() != src.getNumBands()) { + return false; + } + } + return true; } /** * Rescales the source BufferedImage.
*** 342,351 **** --- 381,391 ---- " of color or color/alpha "+ " components"); } boolean needToConvert = false; + boolean needToDraw = false; // Include alpha if (scaleConst > numSrcColorComp && srcCM.hasAlpha()) { scaleConst = numSrcColorComp+1; }
*** 379,477 **** dst = createCompatibleDestImage(src, null); } } - boolean scaleAlpha = true; - - // - // The number of sets of scaling constants may be one, - // in which case the same constants are applied to all color - // (but NOT alpha) components. Otherwise, the number of sets - // of scaling constants may equal the number of Source color - // components, in which case NO rescaling of the alpha component - // (if present) is performed. - // - if (numSrcColorComp == scaleConst || scaleConst == 1) { - scaleAlpha = false; - } - // // Try to use a native BI rescale operation first // if (ImagingLib.filter(this, src, dst) == null) { // // Native BI rescale failed - convert to rasters // WritableRaster srcRaster = src.getRaster(); WritableRaster dstRaster = dst.getRaster(); - if (!scaleAlpha) { - if (srcCM.hasAlpha()) { - // Do not rescale Alpha component - int minx = srcRaster.getMinX(); - int miny = srcRaster.getMinY(); - int[] bands = new int[numSrcColorComp]; - for (int i=0; i < numSrcColorComp; i++) { - bands[i] = i; - } - srcRaster = - srcRaster.createWritableChild(minx, miny, - srcRaster.getWidth(), - srcRaster.getHeight(), - minx, miny, - bands); - } - if (dstCM.hasAlpha()) { - int minx = dstRaster.getMinX(); - int miny = dstRaster.getMinY(); - int[] bands = new int[numSrcColorComp]; - for (int i=0; i < numSrcColorComp; i++) { - bands[i] = i; - } - dstRaster = - dstRaster.createWritableChild(minx, miny, - dstRaster.getWidth(), - dstRaster.getHeight(), - minx, miny, - bands); - } - } - // // Call the raster filter method // ! filterRasterImpl(srcRaster, dstRaster, scaleConst); ! ! // ! // here copy the unscaled src alpha to destination alpha channel ! // ! if (!scaleAlpha) { ! Raster srcAlphaRaster = null; ! WritableRaster dstAlphaRaster = null; ! ! if (srcCM.hasAlpha()) { ! srcAlphaRaster = src.getAlphaRaster(); } - if (dstCM.hasAlpha()) { - dstAlphaRaster = dst.getAlphaRaster(); - if (srcAlphaRaster != null) { - dstAlphaRaster.setRect(srcAlphaRaster); - } else { - int alpha = 0xff << 24; - for (int cy=0; cy < dst.getHeight(); cy++) { - for (int cx=0; cx < dst.getWidth(); cx++) { - int color = dst.getRGB(cx, cy); ! dst.setRGB(cx, cy, color | alpha); ! } ! } ! } ! } } - } - if (needToConvert) { // ColorModels are not the same ColorConvertOp ccop = new ColorConvertOp(hints); dst = ccop.filter(dst, origDst); } --- 419,456 ---- dst = createCompatibleDestImage(src, null); } } // // Try to use a native BI rescale operation first // if (ImagingLib.filter(this, src, dst) == null) { + if (src.getRaster().getNumBands() != + dst.getRaster().getNumBands()) { + needToDraw = true; + dst = createCompatibleDestImage(src, null); + } + // // Native BI rescale failed - convert to rasters // WritableRaster srcRaster = src.getRaster(); WritableRaster dstRaster = dst.getRaster(); // // Call the raster filter method // ! filterRasterImpl(srcRaster, dstRaster, scaleConst, false); } ! if (needToDraw) { ! Graphics2D g = origDst.createGraphics(); ! g.setComposite(AlphaComposite.Src); ! g.drawImage(dst, 0, 0, width, height, null); ! g.dispose(); } if (needToConvert) { // ColorModels are not the same ColorConvertOp ccop = new ColorConvertOp(hints); dst = ccop.filter(dst, origDst); }
*** 495,508 **** * or if the number of scaling factors and offsets in this * {@code RescaleOp} do not meet the requirements * stated in the class comments. */ public final WritableRaster filter (Raster src, WritableRaster dst) { ! return filterRasterImpl(src, dst, length); } ! private WritableRaster filterRasterImpl(Raster src, WritableRaster dst, int scaleConst) { int numBands = src.getNumBands(); int width = src.getWidth(); int height = src.getHeight(); int[] srcPix = null; int step = 0; --- 474,488 ---- * or if the number of scaling factors and offsets in this * {@code RescaleOp} do not meet the requirements * stated in the class comments. */ public final WritableRaster filter (Raster src, WritableRaster dst) { ! return filterRasterImpl(src, dst, length, true); } ! private WritableRaster filterRasterImpl(Raster src, WritableRaster dst, ! int scaleConst, boolean sCheck) { int numBands = src.getNumBands(); int width = src.getWidth(); int height = src.getHeight(); int[] srcPix = null; int step = 0;
*** 525,535 **** + dst.getNumBands()); } // Make sure that the arrays match // Make sure that the low/high/constant arrays match ! if (scaleConst != 1 && scaleConst != src.getNumBands()) { throw new IllegalArgumentException("Number of scaling constants "+ "does not equal the number of"+ " of bands in the src raster"); } --- 505,515 ---- + dst.getNumBands()); } // Make sure that the arrays match // Make sure that the low/high/constant arrays match ! if (sCheck && scaleConst != 1 && scaleConst != src.getNumBands()) { throw new IllegalArgumentException("Number of scaling constants "+ "does not equal the number of"+ " of bands in the src raster"); }
*** 596,607 **** --- 576,593 ---- for (int x = 0; x < width; x++, sX++, dX++) { // Get data for all bands at this x,y position srcPix = src.getPixel(sX, sY, srcPix); tidx = 0; for (int z=0; z<numBands; z++, tidx += step) { + if ((scaleConst == 1 || scaleConst == 3) && + (z == 3) && (numBands == 4)) { + val = srcPix[z]; + } else { val = (int)(srcPix[z]*scaleFactors[tidx] + offsets[tidx]); + + } // Clamp if ((val & dstMask[z]) != 0) { if (val < 0) { val = 0; } else {
< prev index next >