src/share/classes/sun/java2d/cmm/lcms/LCMSImageLayout.java

Print this page

        

*** 20,124 **** * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ - package sun.java2d.cmm.lcms; - import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.awt.image.ComponentColorModel; - import java.awt.image.Raster; - import java.awt.image.WritableRaster; - import java.awt.image.SinglePixelPackedSampleModel; import java.awt.image.ComponentSampleModel; import java.awt.image.DataBuffer; - import java.awt.image.DataBufferByte; - import java.awt.image.DataBufferUShort; - import java.awt.image.DataBufferInt; import java.awt.image.ColorModel; import sun.awt.image.ByteComponentRaster; import sun.awt.image.ShortComponentRaster; import sun.awt.image.IntegerComponentRaster; - class LCMSImageLayout { public static int BYTES_SH(int x) { return x; } public static int EXTRA_SH(int x) { ! return x<<7; } public static int CHANNELS_SH(int x) { ! return x<<3; } ! ! public static final int SWAPFIRST = 1<<14; ! ! public static final int DOSWAP = 1<<10; ! public static final int PT_RGB_8 = CHANNELS_SH(3) | BYTES_SH(1); - public static final int PT_GRAY_8 = CHANNELS_SH(1) | BYTES_SH(1); - public static final int PT_GRAY_16 = CHANNELS_SH(1) | BYTES_SH(2); - public static final int PT_RGBA_8 = EXTRA_SH(1) | CHANNELS_SH(3) | BYTES_SH(1); - public static final int PT_ARGB_8 = EXTRA_SH(1) | CHANNELS_SH(3) | BYTES_SH(1) | SWAPFIRST; - public static final int PT_BGR_8 = DOSWAP | CHANNELS_SH(3) | BYTES_SH(1); - public static final int PT_ABGR_8 = DOSWAP | EXTRA_SH(1) | CHANNELS_SH(3) | BYTES_SH(1); ! ! public static final int PT_BGRA_8 = EXTRA_SH(1) | CHANNELS_SH(3) | ! BYTES_SH(1) | DOSWAP | SWAPFIRST; ! public static final int DT_BYTE = 0; public static final int DT_SHORT = 1; public static final int DT_INT = 2; public static final int DT_DOUBLE = 3; - - boolean isIntPacked = false; int pixelType; int dataType; int width; int height; int nextRowOffset; int offset; Object dataArray; private LCMSImageLayout(int np, int pixelType, int pixelSize) { this.pixelType = pixelType; width = np; height = 1; ! nextRowOffset = np*pixelSize; offset = 0; } private LCMSImageLayout(int width, int height, int pixelType, int pixelSize) { this.pixelType = pixelType; this.width = width; this.height = height; ! nextRowOffset = width*pixelSize; offset = 0; } - public LCMSImageLayout(byte[] data, int np, int pixelType, int pixelSize) { this(np, pixelType, pixelSize); dataType = DT_BYTE; dataArray = data; } --- 20,109 ---- * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ package sun.java2d.cmm.lcms; import java.awt.image.BufferedImage; import java.awt.image.ComponentColorModel; import java.awt.image.ComponentSampleModel; import java.awt.image.DataBuffer; import java.awt.image.ColorModel; + import java.awt.image.Raster; + import java.awt.image.SampleModel; import sun.awt.image.ByteComponentRaster; import sun.awt.image.ShortComponentRaster; import sun.awt.image.IntegerComponentRaster; class LCMSImageLayout { public static int BYTES_SH(int x) { return x; } public static int EXTRA_SH(int x) { ! return x << 7; } public static int CHANNELS_SH(int x) { ! return x << 3; } ! public static final int SWAPFIRST = 1 << 14; ! public static final int DOSWAP = 1 << 10; public static final int PT_RGB_8 = CHANNELS_SH(3) | BYTES_SH(1); public static final int PT_GRAY_8 = CHANNELS_SH(1) | BYTES_SH(1); public static final int PT_GRAY_16 = CHANNELS_SH(1) | BYTES_SH(2); public static final int PT_RGBA_8 = EXTRA_SH(1) | CHANNELS_SH(3) | BYTES_SH(1); public static final int PT_ARGB_8 = EXTRA_SH(1) | CHANNELS_SH(3) | BYTES_SH(1) | SWAPFIRST; public static final int PT_BGR_8 = DOSWAP | CHANNELS_SH(3) | BYTES_SH(1); public static final int PT_ABGR_8 = DOSWAP | EXTRA_SH(1) | CHANNELS_SH(3) | BYTES_SH(1); ! public static final int PT_BGRA_8 = EXTRA_SH(1) | CHANNELS_SH(3) ! | BYTES_SH(1) | DOSWAP | SWAPFIRST; public static final int DT_BYTE = 0; public static final int DT_SHORT = 1; public static final int DT_INT = 2; public static final int DT_DOUBLE = 3; boolean isIntPacked = false; int pixelType; int dataType; int width; int height; int nextRowOffset; int offset; + /* This flag indicates whether the image can be processed + * at once by doTransfrom() native call. Otherwise, the + * image is processed scan by scan. + */ + private boolean imageAtOnce = false; Object dataArray; + private LCMSImageLayout(int np, int pixelType, int pixelSize) { this.pixelType = pixelType; width = np; height = 1; ! nextRowOffset = np * pixelSize; offset = 0; } private LCMSImageLayout(int width, int height, int pixelType, int pixelSize) { this.pixelType = pixelType; this.width = width; this.height = height; ! nextRowOffset = width * pixelSize; offset = 0; } public LCMSImageLayout(byte[] data, int np, int pixelType, int pixelSize) { this(np, pixelType, pixelSize); dataType = DT_BYTE; dataArray = data; }
*** 133,236 **** this(np, pixelType, pixelSize); dataType = DT_INT; dataArray = data; } ! public LCMSImageLayout(double[] data, int np, int pixelType, int pixelSize) ! { this(np, pixelType, pixelSize); dataType = DT_DOUBLE; dataArray = data; } ! public LCMSImageLayout(BufferedImage image) { ! ShortComponentRaster shortRaster; ! IntegerComponentRaster intRaster; ! ByteComponentRaster byteRaster; switch (image.getType()) { case BufferedImage.TYPE_INT_RGB: ! pixelType = PT_ARGB_8; ! isIntPacked = true; break; case BufferedImage.TYPE_INT_ARGB: ! pixelType = PT_ARGB_8; ! isIntPacked = true; break; case BufferedImage.TYPE_INT_BGR: ! pixelType = PT_ABGR_8; ! isIntPacked = true; break; case BufferedImage.TYPE_3BYTE_BGR: ! pixelType = PT_BGR_8; break; case BufferedImage.TYPE_4BYTE_ABGR: ! pixelType = PT_ABGR_8; break; case BufferedImage.TYPE_BYTE_GRAY: ! pixelType = PT_GRAY_8; break; case BufferedImage.TYPE_USHORT_GRAY: ! pixelType = PT_GRAY_16; break; default: ! // TODO: Add support for some images having ! // SinglePixelPackedModel and ComponentSampleModel ! throw new IllegalArgumentException( ! "CMMImageLayout - bad image type passed to constructor"); } ! width = image.getWidth(); ! height = image.getHeight(); switch (image.getType()) { case BufferedImage.TYPE_INT_RGB: case BufferedImage.TYPE_INT_ARGB: case BufferedImage.TYPE_INT_BGR: ! intRaster = (IntegerComponentRaster)image.getRaster(); ! nextRowOffset = intRaster.getScanlineStride()*4; ! offset = intRaster.getDataOffset(0)*4; ! dataArray = intRaster.getDataStorage(); ! dataType = DT_INT; break; case BufferedImage.TYPE_3BYTE_BGR: case BufferedImage.TYPE_4BYTE_ABGR: ! byteRaster = (ByteComponentRaster)image.getRaster(); ! nextRowOffset = byteRaster.getScanlineStride(); int firstBand = image.getSampleModel().getNumBands() - 1; ! offset = byteRaster.getDataOffset(firstBand); ! dataArray = byteRaster.getDataStorage(); ! dataType = DT_BYTE; break; case BufferedImage.TYPE_BYTE_GRAY: ! byteRaster = (ByteComponentRaster)image.getRaster(); ! nextRowOffset = byteRaster.getScanlineStride(); ! offset = byteRaster.getDataOffset(0); ! dataArray = byteRaster.getDataStorage(); ! dataType = DT_BYTE; break; case BufferedImage.TYPE_USHORT_GRAY: ! shortRaster = (ShortComponentRaster)image.getRaster(); ! nextRowOffset = shortRaster.getScanlineStride()*2; ! offset = shortRaster.getDataOffset(0) * 2; ! dataArray = shortRaster.getDataStorage(); ! dataType = DT_SHORT; break; } } ! public static boolean isSupported(BufferedImage image) { ! switch (image.getType()) { ! case BufferedImage.TYPE_INT_RGB: ! case BufferedImage.TYPE_INT_ARGB: ! case BufferedImage.TYPE_INT_BGR: ! case BufferedImage.TYPE_3BYTE_BGR: ! case BufferedImage.TYPE_4BYTE_ABGR: ! case BufferedImage.TYPE_BYTE_GRAY: ! case BufferedImage.TYPE_USHORT_GRAY: ! return true; } ! return false; } } --- 118,337 ---- this(np, pixelType, pixelSize); dataType = DT_INT; dataArray = data; } ! public LCMSImageLayout(double[] data, int np, int pixelType, int pixelSize) { this(np, pixelType, pixelSize); dataType = DT_DOUBLE; dataArray = data; } ! private LCMSImageLayout() { ! } ! ! /* This method creates a layout object for given image. ! * Returns null if the image is not supported by current implementation. ! */ ! public static LCMSImageLayout createImageLayout(BufferedImage image) { ! LCMSImageLayout l = new LCMSImageLayout(); ! switch (image.getType()) { case BufferedImage.TYPE_INT_RGB: ! l.pixelType = PT_ARGB_8; ! l.isIntPacked = true; break; case BufferedImage.TYPE_INT_ARGB: ! l.pixelType = PT_ARGB_8; ! l.isIntPacked = true; break; case BufferedImage.TYPE_INT_BGR: ! l.pixelType = PT_ABGR_8; ! l.isIntPacked = true; break; case BufferedImage.TYPE_3BYTE_BGR: ! l.pixelType = PT_BGR_8; break; case BufferedImage.TYPE_4BYTE_ABGR: ! l.pixelType = PT_ABGR_8; break; case BufferedImage.TYPE_BYTE_GRAY: ! l.pixelType = PT_GRAY_8; break; case BufferedImage.TYPE_USHORT_GRAY: ! l.pixelType = PT_GRAY_16; break; default: ! /* ColorConvertOp creates component images as ! * default destination, so this kind of images ! * has to be supported. ! */ ! ColorModel cm = image.getColorModel(); ! if (cm instanceof ComponentColorModel) { ! ComponentColorModel ccm = (ComponentColorModel) cm; ! ! // verify whether the component size is fine ! int[] cs = ccm.getComponentSize(); ! for (int s : cs) { ! if (s != 8) { ! return null; ! } } ! return createImageLayout(image.getRaster()); ! ! } ! return null; ! } ! ! l.width = image.getWidth(); ! l.height = image.getHeight(); switch (image.getType()) { case BufferedImage.TYPE_INT_RGB: case BufferedImage.TYPE_INT_ARGB: case BufferedImage.TYPE_INT_BGR: ! do { ! IntegerComponentRaster intRaster = (IntegerComponentRaster) ! image.getRaster(); ! l.nextRowOffset = intRaster.getScanlineStride() * 4; ! l.offset = intRaster.getDataOffset(0) * 4; ! l.dataArray = intRaster.getDataStorage(); ! l.dataType = DT_INT; ! ! if (l.nextRowOffset == l.width * 4 * intRaster.getPixelStride()) { ! l.imageAtOnce = true; ! } ! } while (false); break; case BufferedImage.TYPE_3BYTE_BGR: case BufferedImage.TYPE_4BYTE_ABGR: ! do { ! ByteComponentRaster byteRaster = (ByteComponentRaster) ! image.getRaster(); ! l.nextRowOffset = byteRaster.getScanlineStride(); int firstBand = image.getSampleModel().getNumBands() - 1; ! l.offset = byteRaster.getDataOffset(firstBand); ! l.dataArray = byteRaster.getDataStorage(); ! l.dataType = DT_BYTE; ! if (l.nextRowOffset == l.width * byteRaster.getPixelStride()) { ! l.imageAtOnce = true; ! } ! } while (false); break; case BufferedImage.TYPE_BYTE_GRAY: ! do { ! ByteComponentRaster byteRaster = (ByteComponentRaster) ! image.getRaster(); ! l.nextRowOffset = byteRaster.getScanlineStride(); ! l.offset = byteRaster.getDataOffset(0); ! l.dataArray = byteRaster.getDataStorage(); ! l.dataType = DT_BYTE; ! ! if (l.nextRowOffset == l.width * byteRaster.getPixelStride()) { ! l.imageAtOnce = true; ! } ! } while (false); break; case BufferedImage.TYPE_USHORT_GRAY: ! do { ! ShortComponentRaster shortRaster = (ShortComponentRaster) ! image.getRaster(); ! l.nextRowOffset = shortRaster.getScanlineStride() * 2; ! l.offset = shortRaster.getDataOffset(0) * 2; ! l.dataArray = shortRaster.getDataStorage(); ! l.dataType = DT_SHORT; ! ! if (l.nextRowOffset == l.width * 2 * shortRaster.getPixelStride()) { ! l.imageAtOnce = true; ! } ! } while (false); break; + default: + return null; } + return l; } ! private static enum BandOrder { ! DIRECT, ! INVERTED, ! ARBITRARY, ! UNKNOWN; ! ! public static BandOrder getBandOrder(int[] bandOffsets) { ! BandOrder order = UNKNOWN; ! ! int numBands = bandOffsets.length; ! ! for (int i = 0; (order != ARBITRARY) && (i < bandOffsets.length); i++) { ! switch (order) { ! case UNKNOWN: ! if (bandOffsets[i] == i) { ! order = DIRECT; ! } else if (bandOffsets[i] == (numBands - 1 - i)) { ! order = INVERTED; ! } else { ! order = ARBITRARY; ! } ! break; ! case DIRECT: ! if (bandOffsets[i] != i) { ! order = ARBITRARY; ! } ! break; ! case INVERTED: ! if (bandOffsets[i] != (numBands - 1 - i)) { ! order = ARBITRARY; ! } ! break; ! } ! } ! return order; ! } ! } ! ! 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.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; } }