/*
 * Copyright 1997-2006 Sun Microsystems, Inc.  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.  Sun designates this
 * particular file as subject to the "Classpath" exception as provided
 * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
 * CA 95054 USA or visit www.sun.com if you need additional information or
 * have any questions.
 */

#ifndef AWT_PARSE_IMAGE_H
#define AWT_PARSE_IMAGE_H

#include <jni.h>
#include <jni_util.h>

/***************************************************************************
 *                               Definitions                               *
 ***************************************************************************/

#ifndef TRUE
#define TRUE (1)
#endif

#ifndef FALSE
#define FALSE (0)
#endif

typedef enum {
    IMG_SUCCESS=0,
    IMG_FAILURE=-1
} ImgStatus_t;

#define UNKNOWN_DATA_TYPE  0
#define BYTE_DATA_TYPE     1
#define SHORT_DATA_TYPE    2
#define INT_DATA_TYPE      3

#define UNKNOWN_RASTER_TYPE   0
#define COMPONENT_RASTER_TYPE 1
#define BANDED_RASTER_TYPE    2
#define PACKED_RASTER_TYPE    3

#define UNKNOWN_CM_TYPE   0
#define COMPONENT_CM_TYPE 1
#define DIRECT_CM_TYPE    2
#define INDEX_CM_TYPE     3
#define PACKED_CM_TYPE    4

/* Packing types */
#define UNKNOWN_PACKING         0
#define BYTE_COMPONENTS         0x1
#define SHORT_COMPONENTS        0x2
#define PACKED_INT              0x3
#define PACKED_SHORT            0x4
#define PACKED_BYTE             0x5

/* Interleaving */
#define INTERLEAVED     0x10
#define BANDED          0x20
#define SINGLE_BAND     0x30
#define PACKED_BAND     0x40

#define BYTE_INTERLEAVED   (BYTE_COMPONENTS  | INTERLEAVED)
#define SHORT_INTERLEAVED  (SHORT_COMPONENTS | INTERLEAVED)
#define BYTE_SINGLE_BAND   (BYTE_COMPONENTS  | SINGLE_BAND)
#define BYTE_PACKED_BAND   (BYTE_COMPONENTS  | PACKED_BAND)
#define SHORT_SINGLE_BAND  (SHORT_COMPONENTS | SINGLE_BAND)
#define BYTE_BANDED        (BYTE_COMPONENTS  | BANDED)
#define SHORT_BANDED       (SHORT_COMPONENTS | BANDED)
#define PACKED_BYTE_INTER  (PACKED_BYTE      | INTERLEAVED)
#define PACKED_SHORT_INTER (PACKED_SHORT     | INTERLEAVED)
#define PACKED_INT_INTER   (PACKED_INT       | INTERLEAVED)

#define MAX_NUMBANDS 32

/* Struct that holds information about a SinglePixelPackedModel object */
typedef struct {
    jint maskArray[MAX_NUMBANDS];
    jint offsets[MAX_NUMBANDS];
    jint nBits[MAX_NUMBANDS];
    jint  maxBitSize;
} SPPSampleModelS_t;

/* Struct that holds information for the Raster object */
typedef struct {
    jobject jraster;       /* The raster object */
    jobject jdata;         /* Data storage object */
    jobject jsampleModel;   /* The sample model */
    SPPSampleModelS_t sppsm; /* SinglePixelPackedSampleModel mask/offsets */

    jint *chanOffsets;      /* Array of channel offsets (or bit offsets) */

    int width;             /* Width of the raster */
    int height;            /* Height of the raster */
    int minX;              /* origin of this raster x */
    int minY;              /* origin of this raster x */

    int baseOriginX;       /* origin of base raster */
    int baseOriginY;       /* origin of base raster x */
    int baseRasterWidth;   /* size of baseRaster */
    int baseRasterHeight;  /* size of baseRaster */
    int numDataElements;   /* Number of data bands in raster */
    int numBands;          /* Number of bands in the raster  */
    int scanlineStride;    /* Scanline Stride */
    int pixelStride;       /* Pixel stride (or pixel bit stride) */
    int dataIsShared;      /* If TRUE, data is shared */
    int rasterType;        /* Type of raster */
    int dataType;          /* Data type of the raster data */
    int dataSize;          /* Number of bytes per data element */
    int type;               /* Raster type */
} RasterS_t;


/* Struct that holds information about the ColorModel object */
typedef struct {
    jobject jrgb;          /* For ICM, rgb lut object */
    jobject jcmodel;
    jobject jcspace;
    jint *nBits;            /* Number of bits per component */

    int cmType;            /* Type of color model */
    int isDefaultCM;       /* If TRUE, it is the default color model */
    int isDefaultCompatCM; /* If TRUE, it is compatible with the default CM */
                           /* Might be 4 byte and band order different */
    int is_sRGB;           /* If TRUE, the color space is sRGB */
    int numComponents;     /* Total number of components */
    int supportsAlpha;     /* If it supports alpha */
    int isAlphaPre;        /* If TRUE, alpha is premultiplied */
    int csType;            /* Type of ColorSpace */
    int transparency;
    int maxNbits;
    int transIdx;          /* For ICM, transparent pixel */
    int mapSize;           /* For ICM, size of the lut */
} ColorModelS_t;

typedef struct {
    int *colorOrder;

    int channelOffset;
    int dataOffset;        /* # bytes into the data array */
    int sStride;
    int pStride;
    int packing;
    int numChans;
    int alphaIndex;        /* -1 if no alpha */
    int needToExpand;      /* If true, the pixels are packed */
    int expandToNbits;     /* If needToExpand, how many bits to allocate */
} HintS_t;

/* Struct that holds information for the BufferedImage object */
typedef struct {
    jobject jimage;        /* The BufferedImage object */
    RasterS_t raster;      /* The raster structure */
    ColorModelS_t cmodel;  /* The color model structure */
    HintS_t hints;         /* Hint structure */
    int     imageType;     /* Type of image */
} BufImageS_t;

/***************************************************************************
 *                      Function Prototypes                                *
 ***************************************************************************/
int awt_parseImage(JNIEnv *env, jobject jimage, BufImageS_t **imagePP,
                   int handleCustom);

int awt_parseRaster(JNIEnv *env, jobject jraster, RasterS_t *rasterP);

int awt_parseColorModel (JNIEnv *env, jobject jcmodel, int imageType,
                         ColorModelS_t *cmP);

void awt_freeParsedRaster(RasterS_t *rasterP, int freeRasterP);

void awt_freeParsedImage(BufImageS_t *imageP, int freeImageP);

int awt_getPixelByte(JNIEnv *env, int band, RasterS_t *rasterP,
                     unsigned char *bufferP);
int awt_setPixelByte(JNIEnv *env, int band, RasterS_t *rasterP,
                     unsigned char *bufferP);
int awt_getPixelShort(JNIEnv *env, int band, RasterS_t *rasterP,
                     unsigned short *bufferP);
int awt_setPixelShort(JNIEnv *env, int band, RasterS_t *rasterP,
                      unsigned short *bufferP);

#endif /* AWT_PARSE_IMAGE_H */
