⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 nioimagebuffer.java

📁 JAVA3D矩陈的相关类
💻 JAVA
字号:
/* * $RCSfile: NioImageBuffer.java,v $ * * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved. * * Use is subject to license terms. * * $Revision: 1.3 $ * $Date: 2007/02/09 17:18:11 $ * $State: Exp $ */package javax.media.j3d;import java.nio.Buffer;import java.nio.ByteBuffer;import java.nio.ByteOrder;import java.nio.IntBuffer;/** * The NioImageBuffer class is a container for an image whose DataBuffer * is specified via a java.nio.Buffer. An an NioImageBuffer can be wrapped by * an ImageComponent and used for texture mapping, or for rendering Raster * objects or background images. An NioImageBuffer must not be used as the * buffer of an off-screen Canvas3D, or for reading back a raster image. * * @see ImageComponent2D * @see ImageComponent3D *  * @since Java 3D 1.5 */public class NioImageBuffer {    /**     * Used to specify the type of the image.     */    public enum ImageType {        /**         * Represents an image with 8-bit RGB color components,         * corresponding to a Windows-style BGR color model, with the         * colors Blue, Green, and Red stored in 3 consecutive         * bytes for each pixel.         * The data buffer must be a ByteBuffer when using this imageType.         */        TYPE_3BYTE_BGR,        /**         * Represents an image with 8-bit RGB color components with         * Red, Green, and Blue, stored in 3 consecutive         * bytes for each pixel.         * The data buffer must be a ByteBuffer when using this imageType.         */        TYPE_3BYTE_RGB,        /**         * Represents an image with 8-bit RGBA color components with         * Alpha, Blue, Green, and Red stored in 4 consecutive         * bytes for each pixel.         * The data buffer must be a ByteBuffer when using this imageType.         */        TYPE_4BYTE_ABGR,        /**         * Represents an image with 8-bit RGBA color components with         * Red, Green, Blue, and Alpha stored in 4 consecutive         * bytes for each pixel.         * The data buffer must be a ByteBuffer when using this imageType.         */        TYPE_4BYTE_RGBA,        /**         * Represents a unsigned byte grayscale image, non-indexed.         * The data buffer must be a ByteBuffer when using this imageType.         */        TYPE_BYTE_GRAY,        /**         * Represents an image with 8-bit RGBA color components packed         * into integer pixels.         * The data buffer must be an IntBuffer when using this imageType.         */        TYPE_INT_ARGB,        /**         * Represents an image with 8-bit RGB color components,         * corresponding to a Windows- or Solaris- style BGR color model,         * with the colors Blue, Green, and Red packed into integer         * pixels.         * The data buffer must be an IntBuffer when using this imageType.         */        TYPE_INT_BGR,        /**         * Represents an image with 8-bit RGB color components packed into         * integer pixels.         * The data buffer must be an IntBuffer when using this imageType.         */        TYPE_INT_RGB,    }    /**     * Enum for type of buffer     */    enum BufferType {        BYTE_BUFFER,        INT_BUFFER,    }    // Width and height of image    int width;    int height;    // TYpe of image    ImageType imageType;    // Cached buffer    Buffer buffer;    // Type of NIO Buffer: byte or int    BufferType bufferType;    // Number of bytes allocated per pixel    int bytesPerPixel;    // Number of byte or int elements per pixel    int elementsPerPixel;    /**     * Constructs an NIO image buffer of the specified size and type.     * A direct NIO buffer of the correct type (ByteBuffer or IntBuffer)     * and size to match the input parameters     * is allocated.     *     * @param width width of the image     * @param height height of the image     * @param imageType type of the image.     *     * @exception IllegalArgumentException if width < 1 or height < 1     * @exception NullPointerException if imageType is null     */    public NioImageBuffer(int width, int height, ImageType imageType) {        processParams(width, height, imageType);        ByteBuffer tmpBuffer = ByteBuffer.allocateDirect(width * height * bytesPerPixel);        switch (bufferType) {            case BYTE_BUFFER:                buffer = tmpBuffer;                break;            case INT_BUFFER:                buffer = tmpBuffer.order(ByteOrder.nativeOrder()).asIntBuffer();                break;            default:                // We should never get here                throw new AssertionError("missing case statement");        }    }    /**     * Constructs an NIO image buffer of the specified size and type, using     * the specified dataBuffer.     * The the byte order of the specified dataBuffer must match the native     * byte order of the underlying platform.     * For best performance, the NIO buffer should be a direct buffer.     *     * @param width width of the image     * @param height height of the image     * @param imageType type of the image.     * @param dataBuffer an NIO buffer of the correct type (ByteBuffer or     * IntBuffer) to match the specified imageType.     * This constructor will create a new view of     * the buffer, and will call <code>rewind</code> on that view,     * such that elements 0 through <code>dataBuffer.limit()-1</code>     * will be available internally. The number of elements in     * the buffer must be exactly <code>width*height*numElementsPerPixel</code>,     * where <code>numElementsPerPixel</code> is     * 3 for TYPE_3BYTE_BGR and TYPE_3BYTE_RGB,     * 4 for TYPE_4BYTE_ABGR and TYPE_4BYTE_RGBA,     * and 1 for all other types.     *     * @exception IllegalArgumentException if width < 1 or height < 1     * @exception NullPointerException if imageType or dataBuffer is null     * @exception IllegalArgumentException if the type of the dataBuffer does     * not match the imageType     * @exception IllegalArgumentException if <code>dataBuffer.limit() !=     * width*height*numElementsPerPixel</code>     * @exception IllegalArgumentException if the byte order of the specified     * dataBuffer does not match the native byte order of the underlying     * platform.     */    public NioImageBuffer(int width, int height, ImageType imageType,            Buffer dataBuffer) {        processParams(width, height, imageType);        setDataBuffer(dataBuffer);    }    /**     * Gets the width of this data buffer.     *     * @return the width of this data buffer.     */    public int getWidth() {        return width;    }    /**     * Gets the height of this data buffer.     *     * @return the width of this data buffer.     */    public int getHeight() {        return height;    }    /**     * Gets the image type of this data buffer.     *     * @return the image type of this data buffer.     */    public ImageType getImageType() {        return imageType;    }    /**     * Sets the data buffer to the specified input data buffer.     * The the byte order of the specified dataBuffer must match the native     * byte order of the underlying platform.     * For best performance, the NIO buffer should be a direct buffer.     *      * @param dataBuffer an NIO buffer of the correct type (ByteBuffer or     * IntBuffer) to match the imageType of this     * NioImageBuffer. This method will create a new view of     * the buffer, and will call <code>rewind</code> on that view,     * such that elements 0 through <code>dataBuffer.limit()-1</code>     * will be available internally. The number of elements in     * the buffer must be exactly <code>width*height*numElementsPerPixel</code>,     * where <code>numElementsPerPixel</code> is     * 3 for TYPE_3BYTE_BGR and TYPE_3BYTE_RGB,     * 4 for TYPE_4BYTE_ABGR and TYPE_4BYTE_RGBA,     * and 1 for all other types.     *     * @exception NullPointerException if dataBuffer is null     * @exception IllegalArgumentException if the type of the dataBuffer does     * not match the imageType     * @exception IllegalArgumentException if <code>dataBuffer.limit() !=     * width*height*numElementsPerPixel</code>     * @exception IllegalArgumentException if the byte order of the specified     * dataBuffer does not match the native byte order of the underlying     * platform.     */    public void setDataBuffer(Buffer dataBuffer) {        if (dataBuffer == null) {            throw new NullPointerException();        }        if (dataBuffer.limit() != width*height*elementsPerPixel) {            throw new IllegalArgumentException(J3dI18N.getString("NioImageBuffer3"));        }        switch (bufferType) {            case BYTE_BUFFER:                if (!(dataBuffer instanceof ByteBuffer)) {                    throw new IllegalArgumentException(J3dI18N.getString("NioImageBuffer4"));                }                buffer = ((ByteBuffer)dataBuffer).duplicate().rewind();                break;            case INT_BUFFER:                if (!(dataBuffer instanceof IntBuffer)) {                    throw new IllegalArgumentException(J3dI18N.getString("NioImageBuffer4"));                }                if (((IntBuffer)dataBuffer).order() != ByteOrder.nativeOrder()) {                    throw new IllegalArgumentException(J3dI18N.getString("NioImageBuffer5"));                }                buffer = ((IntBuffer)dataBuffer).duplicate().rewind();                break;            default:                // We should never get here                throw new AssertionError("missing case statement");        }    }    /**     * Gets the data buffer to the specified input data buffer.     *     * @return a view of the current data buffer for this NIO image buffer.     * This view will be rewound such that elements 0     * through <code>dataBuffer.limit()-1</code> are available.     */    public Buffer getDataBuffer() {        Buffer tmpBuffer = null;        switch (bufferType) {            case BYTE_BUFFER:                tmpBuffer = ((ByteBuffer)buffer).duplicate();                break;            case INT_BUFFER:                tmpBuffer = ((IntBuffer)buffer).duplicate();                break;            default:                // We should never get here                throw new AssertionError("missing case statement");        }        return tmpBuffer.rewind();    }    // Sanity check the input parameters, calculate the buffer type and    // the number of bytes per pixel    private void processParams(int width, int height, ImageType imageType) {        if (width < 1) {            throw new IllegalArgumentException(J3dI18N.getString("NioImageBuffer0"));        }        if (height < 1) {            throw new IllegalArgumentException(J3dI18N.getString("NioImageBuffer1"));        }        switch (imageType) {            case TYPE_3BYTE_BGR:                bufferType = BufferType.BYTE_BUFFER;                bytesPerPixel = 3;                elementsPerPixel = 3;                break;            case TYPE_3BYTE_RGB:                bufferType = BufferType.BYTE_BUFFER;                bytesPerPixel = 3;                elementsPerPixel = 3;                break;            case TYPE_4BYTE_ABGR:                bufferType = BufferType.BYTE_BUFFER;                bytesPerPixel = 4;                elementsPerPixel = 4;                break;            case TYPE_4BYTE_RGBA:                bufferType = BufferType.BYTE_BUFFER;                bytesPerPixel = 4;                elementsPerPixel = 4;                break;            case TYPE_BYTE_GRAY:                bufferType = BufferType.BYTE_BUFFER;                bytesPerPixel = 1;                elementsPerPixel = 1;                break;            case TYPE_INT_ARGB:            case TYPE_INT_BGR:            case TYPE_INT_RGB:                bufferType = BufferType.INT_BUFFER;                bytesPerPixel = 4;                elementsPerPixel = 1;                break;            default:                // We should never get here                throw new AssertionError("missing case statement");        }        this.width = width;        this.height = height;        this.imageType = imageType;    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -