235 lines · 7.8 KB · Java
RawDownload
/* * Copyright (c) 2007, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation.  Oracle designates this * particular file as subject to the "Classpath" exception as provided * by Oracle in the LICENSE file that accompanied this code. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * 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;    }     public LCMSImageLayout(short[] data, int np, int pixelType, int pixelSize) {        this(np, pixelType, pixelSize);        dataType = DT_SHORT;        dataArray = data;    }     public LCMSImageLayout(int[] data, int np, int pixelType, int pixelSize) {        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();                offset = byteRaster.getDataOffset(0);                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;    }}