public static LCMSImageLayout createImageLayout(Raster r) { LCMSImageLayout l = new LCMSImageLayout(); if (r instanceof ByteComponentRaster && r.getSampleModel() instanceof ComponentSampleModel) { ByteComponentRaster br = (ByteComponentRaster)r; ComponentSampleModel csm = (ComponentSampleModel)r.getSampleModel(); l.pixelType = CHANNELS_SH(br.getNumBands()) | BYTES_SH(1); int[] bandOffsets = csm.getBandOffsets(); BandOrder order = BandOrder.getBandOrder(bandOffsets); int firstBand = 0; switch (order) { case INVERTED: l.pixelType |= DOSWAP; firstBand = csm.getNumBands() - 1; break; case DIRECT: // do nothing break; default: // unable to create the image layout; return null; } l.nextRowOffset = br.getScanlineStride(); l.nextPixelOffset = br.getPixelStride(); l.offset = br.getDataOffset(firstBand); l.dataArray = br.getDataStorage(); l.dataType = DT_BYTE; l.width = br.getWidth(); l.height = br.getHeight(); if (l.nextRowOffset == l.width * br.getPixelStride()) { l.imageAtOnce = true; } return l; } return null; }
private void convertToRGB() { int w = bimage.getWidth(); int h = bimage.getHeight(); int size = w*h; DataBufferInt dbi = new DataBufferInt(size); // Note that stealData() requires a markDirty() afterwards // since we modify the data in it. int newpixels[] = SunWritableRaster.stealData(dbi, 0); if (cmodel instanceof IndexColorModel && biRaster instanceof ByteComponentRaster && biRaster.getNumDataElements() == 1) { ByteComponentRaster bct = (ByteComponentRaster) biRaster; byte[] data = bct.getDataStorage(); int coff = bct.getDataOffset(0); for (int i=0; i < size; i++) { newpixels[i] = srcLUT[data[coff+i]&0xff]; } } else { Object srcpixels = null; int off=0; for (int y=0; y < h; y++) { for (int x=0; x < w; x++) { srcpixels=biRaster.getDataElements(x, y, srcpixels); newpixels[off++] = cmodel.getRGB(srcpixels); } } } // We modified the data array directly above so mark it as dirty now... SunWritableRaster.markDirty(dbi); isSameCM = false; cmodel = ColorModel.getRGBdefault(); int bandMasks[] = {0x00ff0000, 0x0000ff00, 0x000000ff, 0xff000000}; biRaster = Raster.createPackedRaster(dbi,w,h,w, bandMasks,null); bimage = createImage(cmodel, biRaster, cmodel.isAlphaPremultiplied(), null); srcLUT = null; isDefaultBI = true; }
private native boolean setDiffICM(int x, int y, int w, int h, int[] lut, int transPix, int numLut, IndexColorModel icm, byte[] pix, int off, int scansize, ByteComponentRaster bct, int chanOff);
private native int setDiffICM(int x, int y, int w, int h, int[] lut, int transPix, int numLut, IndexColorModel icm, byte[] pix, int off, int scansize, ByteComponentRaster bct, int chanOff);
public static LCMSImageLayout createImageLayout(Raster r) { LCMSImageLayout l = new LCMSImageLayout(); if (r instanceof ByteComponentRaster) { ByteComponentRaster br = (ByteComponentRaster)r; ComponentSampleModel csm = (ComponentSampleModel)r.getSampleModel(); l.pixelType = CHANNELS_SH(br.getNumBands()) | BYTES_SH(1); int[] bandOffsets = csm.getBandOffsets(); BandOrder order = BandOrder.getBandOrder(bandOffsets); int firstBand = 0; switch (order) { case INVERTED: l.pixelType |= DOSWAP; firstBand = csm.getNumBands() - 1; break; case DIRECT: // do nothing break; default: // unable to create the image layout; return null; } l.nextRowOffset = br.getScanlineStride(); l.nextPixelOffset = br.getPixelStride(); l.offset = br.getDataOffset(firstBand); l.dataArray = br.getDataStorage(); l.dataType = DT_BYTE; l.width = br.getWidth(); l.height = br.getHeight(); if (l.nextRowOffset == l.width * br.getPixelStride()) { l.imageAtOnce = true; } return l; } return null; }