159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta/*
259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * Copyright (c) 2009-2010 jMonkeyEngine
359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * All rights reserved.
459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta *
559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * Redistribution and use in source and binary forms, with or without
659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * modification, are permitted provided that the following conditions are
759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * met:
859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta *
959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * * Redistributions of source code must retain the above copyright
1059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta *   notice, this list of conditions and the following disclaimer.
1159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta *
1259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * * Redistributions in binary form must reproduce the above copyright
1359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta *   notice, this list of conditions and the following disclaimer in the
1459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta *   documentation and/or other materials provided with the distribution.
1559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta *
1659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * * Neither the name of 'jMonkeyEngine' nor the names of its contributors
1759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta *   may be used to endorse or promote products derived from this software
1859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta *   without specific prior written permission.
1959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta *
2059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
2159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
2259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
2359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
2459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
2559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
2659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
2759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
2859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
2959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
3059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */
3259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
3359b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartapackage com.jme3.texture;
3459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
3559b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.export.*;
3659b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.renderer.Renderer;
3759b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.util.NativeObject;
3859b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport java.io.IOException;
3959b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport java.nio.ByteBuffer;
4059b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport java.util.ArrayList;
4159b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport java.util.Arrays;
4259b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport java.util.List;
4359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
4459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta/**
4559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * <code>Image</code> defines a data format for a graphical image. The image
4659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * is defined by a format, a height and width, and the image data. The width and
4759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * height must be greater than 0. The data is contained in a byte buffer, and
4859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * should be packed before creation of the image object.
4959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta *
5059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @author Mark Powell
5159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @author Joshua Slack
5259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @version $Id: Image.java 4131 2009-03-19 20:15:28Z blaine.dev $
5359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */
5459b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartapublic class Image extends NativeObject implements Savable /*, Cloneable*/ {
5559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
5659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public enum Format {
5759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        /**
5859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta         * 8-bit alpha
5959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta         */
6059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        Alpha8(8),
6159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
6259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        /**
6359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta         * 16-bit alpha
6459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta         */
6559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        Alpha16(16),
6659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
6759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        /**
6859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta         * 8-bit grayscale/luminance.
6959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta         */
7059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        Luminance8(8),
7159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
7259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        /**
7359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta         * 16-bit grayscale/luminance.
7459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta         */
7559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        Luminance16(16),
7659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
7759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        /**
7859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta         * half-precision floating-point grayscale/luminance.
7959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta         */
8059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        Luminance16F(16,true),
8159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
8259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        /**
8359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta         * single-precision floating-point grayscale/luminance.
8459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta         */
8559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        Luminance32F(32,true),
8659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
8759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        /**
8859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta         * 8-bit luminance/grayscale and 8-bit alpha.
8959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta         */
9059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        Luminance8Alpha8(16),
9159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
9259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        /**
9359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta         * 16-bit luminance/grayscale and 16-bit alpha.
9459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta         */
9559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        Luminance16Alpha16(32),
9659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
9759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        /**
9859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta         * half-precision floating-point grayscale/luminance and alpha.
9959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta         */
10059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        Luminance16FAlpha16F(32,true),
10159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
10259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        Intensity8(8),
10359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        Intensity16(16),
10459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
10559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        /**
10659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta         * 8-bit blue, green, and red.
10759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta         */
10859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        BGR8(24), // BGR and ABGR formats are often used on windows systems
10959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
11059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        /**
11159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta         * 8-bit red, green, and blue.
11259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta         */
11359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        RGB8(24),
11459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
11559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        /**
11659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta         * 10-bit red, green, and blue.
11759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta         */
11859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        RGB10(30),
11959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
12059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        /**
12159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta         * 16-bit red, green, and blue.
12259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta         */
12359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        RGB16(48),
12459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
12559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        /**
12659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta         * 5-bit red, 6-bit green, and 5-bit blue.
12759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta         */
12859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        RGB565(16),
12959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
13059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        /**
13159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta         * 4-bit alpha, red, green, and blue. Used on Android only.
13259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta         */
13359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        ARGB4444(16),
13459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
13559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        /**
13659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta         * 5-bit red, green, and blue with 1-bit alpha.
13759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta         */
13859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        RGB5A1(16),
13959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
14059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        /**
14159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta         * 8-bit red, green, blue, and alpha.
14259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta         */
14359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        RGBA8(32),
14459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
14559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        /**
14659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta         * 8-bit alpha, blue, green, and red.
14759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta         */
14859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        ABGR8(32),
14959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
15059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        /**
15159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta         * 16-bit red, green, blue and alpha
15259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta         */
15359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        RGBA16(64),
15459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
15559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        /**
15659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta         * S3TC compression DXT1.
15759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta         * Called BC1 in DirectX10.
15859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta         */
15959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        DXT1(4,false,true, false),
16059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
16159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        /**
16259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta         * S3TC compression DXT1 with 1-bit alpha.
16359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta         */
16459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        DXT1A(4,false,true, false),
16559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
16659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        /**
16759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta         * S3TC compression DXT3 with 4-bit alpha.
16859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta         * Called BC2 in DirectX10.
16959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta         */
17059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        DXT3(8,false,true, false),
17159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
17259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        /**
17359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta         * S3TC compression DXT5 with interpolated 8-bit alpha.
17459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta         * Called BC3 in DirectX10.
17559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta         */
17659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        DXT5(8,false,true, false),
17759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
17859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        /**
17959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta         * Luminance-Alpha Texture Compression.
18059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta         * Called BC5 in DirectX10.
18159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta         */
18259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        LATC(8, false, true, false),
18359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
18459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        /**
18559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta         * Arbitrary depth format. The precision is chosen by the video
18659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta         * hardware.
18759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta         */
18859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        Depth(0,true,false,false),
18959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
19059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        /**
19159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta         * 16-bit depth.
19259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta         */
19359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        Depth16(16,true,false,false),
19459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
19559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        /**
19659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta         * 24-bit depth.
19759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta         */
19859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        Depth24(24,true,false,false),
19959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
20059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        /**
20159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta         * 32-bit depth.
20259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta         */
20359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        Depth32(32,true,false,false),
20459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
20559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        /**
20659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta         * single-precision floating point depth.
20759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta         */
20859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        Depth32F(32,true,false,true),
20959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
21059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        /**
21159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta         * Texture data is stored as {@link Format#RGB16F} in system memory,
21259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta         * but will be converted to {@link Format#RGB111110F} when sent
21359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta         * to the video hardware.
21459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta         */
21559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        RGB16F_to_RGB111110F(48,true),
21659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
21759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        /**
21859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta         * unsigned floating-point red, green and blue that uses 32 bits.
21959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta         */
22059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        RGB111110F(32,true),
22159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
22259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        /**
22359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta         * Texture data is stored as {@link Format#RGB16F} in system memory,
22459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta         * but will be converted to {@link Format#RGB9E5} when sent
22559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta         * to the video hardware.
22659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta         */
22759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        RGB16F_to_RGB9E5(48,true),
22859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
22959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        /**
23059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta         * 9-bit red, green and blue with 5-bit exponent.
23159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta         */
23259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        RGB9E5(32,true),
23359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
23459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        /**
23559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta         * half-precision floating point red, green, and blue.
23659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta         */
23759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        RGB16F(48,true),
23859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
23959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        /**
24059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta         * half-precision floating point red, green, blue, and alpha.
24159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta         */
24259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        RGBA16F(64,true),
24359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
24459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        /**
24559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta         * single-precision floating point red, green, and blue.
24659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta         */
24759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        RGB32F(96,true),
24859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
24959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        /**
25059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta         * single-precision floating point red, green, blue and alpha.
25159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta         */
25259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        RGBA32F(128,true),
25359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
25459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        /**
25559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta         * Luminance/grayscale texture compression.
25659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta         * Called BC4 in DirectX10.
25759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta         */
25859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        LTC(4, false, true, false);
25959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
26059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        private int bpp;
26159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        private boolean isDepth;
26259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        private boolean isCompressed;
26359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        private boolean isFloatingPoint;
26459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
26559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        private Format(int bpp){
26659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            this.bpp = bpp;
26759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        }
26859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
26959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        private Format(int bpp, boolean isFP){
27059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            this(bpp);
27159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            this.isFloatingPoint = isFP;
27259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        }
27359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
27459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        private Format(int bpp, boolean isDepth, boolean isCompressed, boolean isFP){
27559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            this(bpp, isFP);
27659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            this.isDepth = isDepth;
27759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            this.isCompressed = isCompressed;
27859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        }
27959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
28059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        /**
28159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta         * @return bits per pixel.
28259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta         */
28359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        public int getBitsPerPixel(){
28459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            return bpp;
28559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        }
28659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
28759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        /**
28859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta         * @return True if this format is a depth format, false otherwise.
28959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta         */
29059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        public boolean isDepthFormat(){
29159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            return isDepth;
29259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        }
29359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
29459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        /**
29559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta         * @return True if this is a compressed image format, false if
29659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta         * uncompressed.
29759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta         */
29859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        public boolean isCompressed() {
29959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            return isCompressed;
30059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        }
30159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
30259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        /**
30359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta         * @return True if this image format is in floating point,
30459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta         * false if it is an integer format.
30559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta         */
30659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        public boolean isFloatingPont(){
30759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            return isFloatingPoint;
30859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        }
30959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
31059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
31159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
31259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    // image attributes
31359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    protected Format format;
31459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    protected int width, height, depth;
31559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    protected int[] mipMapSizes;
31659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    protected ArrayList<ByteBuffer> data;
31759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    protected transient Object efficientData;
31859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    protected int multiSamples = 1;
31959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta//    protected int mipOffset = 0;
32059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
32159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    @Override
32259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public void resetObject() {
32359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        this.id = -1;
32459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        setUpdateNeeded();
32559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
32659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
32759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    @Override
32859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public void deleteObject(Object rendererObject) {
32959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        ((Renderer)rendererObject).deleteImage(this);
33059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
33159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
33259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    @Override
33359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public NativeObject createDestructableClone() {
33459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        return new Image(id);
33559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
33659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
33759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    /**
33859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * @return A shallow clone of this image. The data is not cloned.
33959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     */
34059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    @Override
34159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public Image clone(){
34259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        Image clone = (Image) super.clone();
34359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        clone.mipMapSizes = mipMapSizes != null ? mipMapSizes.clone() : null;
34459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        clone.data = data != null ? new ArrayList<ByteBuffer>(data) : null;
34559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        clone.setUpdateNeeded();
34659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        return clone;
34759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
34859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
34959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    /**
35059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * Constructor instantiates a new <code>Image</code> object. All values
35159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * are undefined.
35259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     */
35359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public Image() {
35459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        super(Image.class);
35559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        data = new ArrayList<ByteBuffer>(1);
35659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
35759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
35859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    protected Image(int id){
35959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        super(Image.class, id);
36059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
36159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
36259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    /**
36359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * Constructor instantiates a new <code>Image</code> object. The
36459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * attributes of the image are defined during construction.
36559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     *
36659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * @param format
36759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     *            the data format of the image.
36859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * @param width
36959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     *            the width of the image.
37059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * @param height
37159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     *            the height of the image.
37259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * @param data
37359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     *            the image data.
37459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * @param mipMapSizes
37559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     *            the array of mipmap sizes, or null for no mipmaps.
37659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     */
37759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public Image(Format format, int width, int height, int depth, ArrayList<ByteBuffer> data,
37859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            int[] mipMapSizes) {
37959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
38059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        this();
38159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
38259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (mipMapSizes != null && mipMapSizes.length <= 1) {
38359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            mipMapSizes = null;
38459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        }
38559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
38659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        setFormat(format);
38759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        this.width = width;
38859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        this.height = height;
38959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        this.data = data;
39059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        this.depth = depth;
39159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        this.mipMapSizes = mipMapSizes;
39259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
39359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
39459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    /**
39559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * Constructor instantiates a new <code>Image</code> object. The
39659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * attributes of the image are defined during construction.
39759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     *
39859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * @param format
39959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     *            the data format of the image.
40059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * @param width
40159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     *            the width of the image.
40259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * @param height
40359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     *            the height of the image.
40459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * @param data
40559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     *            the image data.
40659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * @param mipMapSizes
40759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     *            the array of mipmap sizes, or null for no mipmaps.
40859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     */
40959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public Image(Format format, int width, int height, ByteBuffer data,
41059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            int[] mipMapSizes) {
41159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
41259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        this();
41359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
41459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (mipMapSizes != null && mipMapSizes.length <= 1) {
41559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            mipMapSizes = null;
41659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        }
41759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
41859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        setFormat(format);
41959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        this.width = width;
42059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        this.height = height;
42159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (data != null){
42259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            this.data = new ArrayList<ByteBuffer>(1);
42359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            this.data.add(data);
42459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        }
42559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        this.mipMapSizes = mipMapSizes;
42659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
42759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
42859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    /**
42959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * Constructor instantiates a new <code>Image</code> object. The
43059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * attributes of the image are defined during construction.
43159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     *
43259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * @param format
43359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     *            the data format of the image.
43459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * @param width
43559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     *            the width of the image.
43659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * @param height
43759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     *            the height of the image.
43859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * @param data
43959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     *            the image data.
44059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     */
44159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public Image(Format format, int width, int height, int depth, ArrayList<ByteBuffer> data) {
44259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        this(format, width, height, depth, data, null);
44359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
44459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
44559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    /**
44659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * Constructor instantiates a new <code>Image</code> object. The
44759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * attributes of the image are defined during construction.
44859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     *
44959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * @param format
45059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     *            the data format of the image.
45159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * @param width
45259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     *            the width of the image.
45359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * @param height
45459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     *            the height of the image.
45559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * @param data
45659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     *            the image data.
45759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     */
45859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public Image(Format format, int width, int height, ByteBuffer data) {
45959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        this(format, width, height, data, null);
46059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
46159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
46259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    /**
46359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * @return The number of samples (for multisampled textures).
46459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * @see Image#setMultiSamples(int)
46559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     */
46659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public int getMultiSamples() {
46759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        return multiSamples;
46859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
46959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
47059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    /**
47159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * @param multiSamples Set the number of samples to use for this image,
47259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * setting this to a value higher than 1 turns this image/texture
47359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * into a multisample texture (on OpenGL3.1 and higher).
47459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     */
47559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public void setMultiSamples(int multiSamples) {
47659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (multiSamples <= 0)
47759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            throw new IllegalArgumentException("multiSamples must be > 0");
47859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
47959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (getData(0) != null)
48059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            throw new IllegalArgumentException("Cannot upload data as multisample texture");
48159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
48259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (hasMipmaps())
48359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            throw new IllegalArgumentException("Multisample textures do not support mipmaps");
48459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
48559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        this.multiSamples = multiSamples;
48659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
48759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
48859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    /**
48959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * <code>setData</code> sets the data that makes up the image. This data
49059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * is packed into an array of <code>ByteBuffer</code> objects.
49159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     *
49259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * @param data
49359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     *            the data that contains the image information.
49459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     */
49559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public void setData(ArrayList<ByteBuffer> data) {
49659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        this.data = data;
49759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        setUpdateNeeded();
49859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
49959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
50059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    /**
50159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * <code>setData</code> sets the data that makes up the image. This data
50259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * is packed into a single <code>ByteBuffer</code>.
50359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     *
50459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * @param data
50559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     *            the data that contains the image information.
50659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     */
50759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public void setData(ByteBuffer data) {
50859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        this.data = new ArrayList<ByteBuffer>(1);
50959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        this.data.add(data);
51059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        setUpdateNeeded();
51159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
51259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
51359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public void addData(ByteBuffer data) {
51459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (this.data == null)
51559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            this.data = new ArrayList<ByteBuffer>(1);
51659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        this.data.add(data);
51759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        setUpdateNeeded();
51859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
51959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
52059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public void setData(int index, ByteBuffer data) {
52159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (index >= 0) {
52259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            while (this.data.size() <= index) {
52359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                this.data.add(null);
52459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            }
52559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            this.data.set(index, data);
52659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            setUpdateNeeded();
52759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        } else {
52859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            throw new IllegalArgumentException("index must be greater than or equal to 0.");
52959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        }
53059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
53159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
53259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    /**
53359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * Set the efficient data representation of this image.
53459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * <p>
53559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * Some system implementations are more efficient at operating
53659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * on data other than ByteBuffers, in that case, this method can be used.
53759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     *
53859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * @param efficientData
53959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     */
54059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public void setEfficentData(Object efficientData){
54159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        this.efficientData = efficientData;
54259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        setUpdateNeeded();
54359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
54459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
54559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    /**
54659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * @return The efficient data representation of this image.
54759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * @see Image#setEfficentData(java.lang.Object)
54859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     */
54959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public Object getEfficentData(){
55059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        return efficientData;
55159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
55259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
55359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    /**
55459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * Sets the mipmap sizes stored in this image's data buffer. Mipmaps are
55559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * stored sequentially, and the first mipmap is the main image data. To
55659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * specify no mipmaps, pass null and this will automatically be expanded
55759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * into a single mipmap of the full
55859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     *
55959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * @param mipMapSizes
56059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     *            the mipmap sizes array, or null for a single image map.
56159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     */
56259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public void setMipMapSizes(int[] mipMapSizes) {
56359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (mipMapSizes != null && mipMapSizes.length <= 1)
56459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            mipMapSizes = null;
56559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
56659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        this.mipMapSizes = mipMapSizes;
56759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        setUpdateNeeded();
56859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
56959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
57059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    /**
57159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * <code>setHeight</code> sets the height value of the image. It is
57259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * typically a good idea to try to keep this as a multiple of 2.
57359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     *
57459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * @param height
57559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     *            the height of the image.
57659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     */
57759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public void setHeight(int height) {
57859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        this.height = height;
57959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        setUpdateNeeded();
58059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
58159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
58259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    /**
58359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * <code>setDepth</code> sets the depth value of the image. It is
58459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * typically a good idea to try to keep this as a multiple of 2. This is
58559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * used for 3d images.
58659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     *
58759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * @param depth
58859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     *            the depth of the image.
58959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     */
59059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public void setDepth(int depth) {
59159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        this.depth = depth;
59259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        setUpdateNeeded();
59359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
59459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
59559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    /**
59659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * <code>setWidth</code> sets the width value of the image. It is
59759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * typically a good idea to try to keep this as a multiple of 2.
59859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     *
59959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * @param width
60059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     *            the width of the image.
60159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     */
60259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public void setWidth(int width) {
60359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        this.width = width;
60459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        setUpdateNeeded();
60559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
60659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
60759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    /**
60859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * <code>setFormat</code> sets the image format for this image.
60959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     *
61059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * @param format
61159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     *            the image format.
61259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * @throws NullPointerException
61359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     *             if format is null
61459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * @see Format
61559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     */
61659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public void setFormat(Format format) {
61759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (format == null) {
61859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            throw new NullPointerException("format may not be null.");
61959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        }
62059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
62159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        this.format = format;
62259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        setUpdateNeeded();
62359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
62459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
62559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    /**
62659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * <code>getFormat</code> returns the image format for this image.
62759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     *
62859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * @return the image format.
62959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * @see Format
63059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     */
63159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public Format getFormat() {
63259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        return format;
63359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
63459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
63559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    /**
63659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * <code>getWidth</code> returns the width of this image.
63759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     *
63859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * @return the width of this image.
63959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     */
64059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public int getWidth() {
64159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        return width;
64259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
64359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
64459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    /**
64559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * <code>getHeight</code> returns the height of this image.
64659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     *
64759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * @return the height of this image.
64859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     */
64959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public int getHeight() {
65059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        return height;
65159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
65259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
65359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    /**
65459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * <code>getDepth</code> returns the depth of this image (for 3d images).
65559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     *
65659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * @return the depth of this image.
65759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     */
65859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public int getDepth() {
65959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        return depth;
66059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
66159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
66259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    /**
66359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * <code>getData</code> returns the data for this image. If the data is
66459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * undefined, null will be returned.
66559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     *
66659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * @return the data for this image.
66759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     */
66859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public List<ByteBuffer> getData() {
66959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        return data;
67059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
67159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
67259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    /**
67359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * <code>getData</code> returns the data for this image. If the data is
67459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * undefined, null will be returned.
67559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     *
67659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * @return the data for this image.
67759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     */
67859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public ByteBuffer getData(int index) {
67959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (data.size() > index)
68059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            return data.get(index);
68159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        else
68259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            return null;
68359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
68459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
68559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    /**
68659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * Returns whether the image data contains mipmaps.
68759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     *
68859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * @return true if the image data contains mipmaps, false if not.
68959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     */
69059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public boolean hasMipmaps() {
69159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        return mipMapSizes != null;
69259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
69359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
69459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    /**
69559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * Returns the mipmap sizes for this image.
69659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     *
69759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * @return the mipmap sizes for this image.
69859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     */
69959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public int[] getMipMapSizes() {
70059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        return mipMapSizes;
70159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
70259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
70359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    @Override
70459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public String toString(){
70559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        StringBuilder sb = new StringBuilder();
70659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        sb.append(getClass().getSimpleName());
70759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        sb.append("[size=").append(width).append("x").append(height);
70859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
70959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (depth > 1)
71059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            sb.append("x").append(depth);
71159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
71259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        sb.append(", format=").append(format.name());
71359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
71459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (hasMipmaps())
71559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            sb.append(", mips");
71659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
71759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (getId() >= 0)
71859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            sb.append(", id=").append(id);
71959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
72059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        sb.append("]");
72159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
72259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        return sb.toString();
72359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
72459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
72559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    @Override
72659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public boolean equals(Object other) {
72759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (other == this) {
72859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            return true;
72959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        }
73059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (!(other instanceof Image)) {
73159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            return false;
73259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        }
73359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        Image that = (Image) other;
73459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (this.getFormat() != that.getFormat())
73559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            return false;
73659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (this.getWidth() != that.getWidth())
73759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            return false;
73859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (this.getHeight() != that.getHeight())
73959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            return false;
74059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (this.getData() != null && !this.getData().equals(that.getData()))
74159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            return false;
74259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (this.getData() == null && that.getData() != null)
74359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            return false;
74459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (this.getMipMapSizes() != null
74559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                && !Arrays.equals(this.getMipMapSizes(), that.getMipMapSizes()))
74659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            return false;
74759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (this.getMipMapSizes() == null && that.getMipMapSizes() != null)
74859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            return false;
74959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (this.getMultiSamples() != that.getMultiSamples())
75059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            return false;
75159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
75259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        return true;
75359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
75459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
75559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    @Override
75659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public int hashCode() {
75759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        int hash = 7;
75859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        hash = 97 * hash + (this.format != null ? this.format.hashCode() : 0);
75959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        hash = 97 * hash + this.width;
76059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        hash = 97 * hash + this.height;
76159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        hash = 97 * hash + this.depth;
76259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        hash = 97 * hash + Arrays.hashCode(this.mipMapSizes);
76359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        hash = 97 * hash + (this.data != null ? this.data.hashCode() : 0);
76459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        hash = 97 * hash + this.multiSamples;
76559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        return hash;
76659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
76759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
76859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public void write(JmeExporter e) throws IOException {
76959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        OutputCapsule capsule = e.getCapsule(this);
77059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        capsule.write(format, "format", Format.RGBA8);
77159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        capsule.write(width, "width", 0);
77259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        capsule.write(height, "height", 0);
77359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        capsule.write(depth, "depth", 0);
77459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        capsule.write(mipMapSizes, "mipMapSizes", null);
77559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        capsule.write(multiSamples, "multiSamples", 1);
77659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        capsule.writeByteBufferArrayList(data, "data", null);
77759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
77859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
77959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public void read(JmeImporter e) throws IOException {
78059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        InputCapsule capsule = e.getCapsule(this);
78159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        format = capsule.readEnum("format", Format.class, Format.RGBA8);
78259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        width = capsule.readInt("width", 0);
78359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        height = capsule.readInt("height", 0);
78459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        depth = capsule.readInt("depth", 0);
78559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        mipMapSizes = capsule.readIntArray("mipMapSizes", null);
78659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        multiSamples = capsule.readInt("multiSamples", 1);
78759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        data = (ArrayList<ByteBuffer>) capsule.readByteBufferArrayList("data", null);
78859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
78959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
79059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta}
791