1 /*
   2  * Copyright (c) 1997, 2006, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.  Oracle designates this
   8  * particular file as subject to the "Classpath" exception as provided
   9  * by Oracle in the LICENSE file that accompanied this code.
  10  *
  11  * This code is distributed in the hope that it will be useful, but WITHOUT
  12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  14  * version 2 for more details (a copy is included in the LICENSE file that
  15  * accompanied this code).
  16  *
  17  * You should have received a copy of the GNU General Public License version
  18  * 2 along with this work; if not, write to the Free Software Foundation,
  19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  20  *
  21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  22  * or visit www.oracle.com if you need additional information or have any
  23  * questions.
  24  */
  25 
  26 #ifndef AWT_PARSE_IMAGE_H
  27 #define AWT_PARSE_IMAGE_H
  28 
  29 #include <jni.h>
  30 #include <jni_util.h>
  31 
  32 /***************************************************************************
  33  *                               Definitions                               *
  34  ***************************************************************************/
  35 
  36 #ifndef TRUE
  37 #define TRUE (1)
  38 #endif
  39 
  40 #ifndef FALSE
  41 #define FALSE (0)
  42 #endif
  43 
  44 typedef enum {
  45     IMG_SUCCESS=0,
  46     IMG_FAILURE=-1
  47 } ImgStatus_t;
  48 
  49 #define UNKNOWN_DATA_TYPE  0
  50 #define BYTE_DATA_TYPE     1
  51 #define SHORT_DATA_TYPE    2
  52 #define INT_DATA_TYPE      3
  53 
  54 #define UNKNOWN_RASTER_TYPE   0
  55 #define COMPONENT_RASTER_TYPE 1
  56 #define BANDED_RASTER_TYPE    2
  57 #define PACKED_RASTER_TYPE    3
  58 
  59 #define UNKNOWN_CM_TYPE   0
  60 #define COMPONENT_CM_TYPE 1
  61 #define DIRECT_CM_TYPE    2
  62 #define INDEX_CM_TYPE     3
  63 #define PACKED_CM_TYPE    4
  64 
  65 /* Packing types */
  66 #define UNKNOWN_PACKING         0
  67 #define BYTE_COMPONENTS         0x1
  68 #define SHORT_COMPONENTS        0x2
  69 #define PACKED_INT              0x3
  70 #define PACKED_SHORT            0x4
  71 #define PACKED_BYTE             0x5
  72 
  73 /* Interleaving */
  74 #define INTERLEAVED     0x10
  75 #define BANDED          0x20
  76 #define SINGLE_BAND     0x30
  77 #define PACKED_BAND     0x40
  78 
  79 #define BYTE_INTERLEAVED   (BYTE_COMPONENTS  | INTERLEAVED)
  80 #define SHORT_INTERLEAVED  (SHORT_COMPONENTS | INTERLEAVED)
  81 #define BYTE_SINGLE_BAND   (BYTE_COMPONENTS  | SINGLE_BAND)
  82 #define BYTE_PACKED_BAND   (BYTE_COMPONENTS  | PACKED_BAND)
  83 #define SHORT_SINGLE_BAND  (SHORT_COMPONENTS | SINGLE_BAND)
  84 #define BYTE_BANDED        (BYTE_COMPONENTS  | BANDED)
  85 #define SHORT_BANDED       (SHORT_COMPONENTS | BANDED)
  86 #define PACKED_BYTE_INTER  (PACKED_BYTE      | INTERLEAVED)
  87 #define PACKED_SHORT_INTER (PACKED_SHORT     | INTERLEAVED)
  88 #define PACKED_INT_INTER   (PACKED_INT       | INTERLEAVED)
  89 
  90 #define MAX_NUMBANDS 32
  91 
  92 /* Struct that holds information about a SinglePixelPackedModel object */
  93 typedef struct {
  94     jint maskArray[MAX_NUMBANDS];
  95     jint offsets[MAX_NUMBANDS];
  96     jint nBits[MAX_NUMBANDS];
  97     jint  maxBitSize;
  98     jint isUsed; // flag to indicate whether the raster sample model is SPPSM
  99 } SPPSampleModelS_t;
 100 
 101 /* Struct that holds information for the Raster object */
 102 typedef struct {
 103     jobject jraster;       /* The raster object */
 104     jobject jdata;         /* Data storage object */
 105     jobject jsampleModel;   /* The sample model */
 106     SPPSampleModelS_t sppsm; /* SinglePixelPackedSampleModel mask/offsets */
 107 
 108     jint *chanOffsets;      /* Array of channel offsets (or bit offsets) */
 109 
 110     int width;             /* Width of the raster */
 111     int height;            /* Height of the raster */
 112     int minX;              /* origin of this raster x */
 113     int minY;              /* origin of this raster x */
 114 
 115     int baseOriginX;       /* origin of base raster */
 116     int baseOriginY;       /* origin of base raster x */
 117     int baseRasterWidth;   /* size of baseRaster */
 118     int baseRasterHeight;  /* size of baseRaster */
 119     int numDataElements;   /* Number of data bands in raster */
 120     int numBands;          /* Number of bands in the raster  */
 121     int scanlineStride;    /* Scanline Stride */
 122     int pixelStride;       /* Pixel stride (or pixel bit stride) */
 123     int dataIsShared;      /* If TRUE, data is shared */
 124     int rasterType;        /* Type of raster */
 125     int dataType;          /* Data type of the raster data */
 126     int dataSize;          /* Number of bytes per data element */
 127     int type;               /* Raster type */
 128 } RasterS_t;
 129 
 130 
 131 /* Struct that holds information about the ColorModel object */
 132 typedef struct {
 133     jobject jrgb;          /* For ICM, rgb lut object */
 134     jobject jcmodel;
 135     jobject jcspace;
 136     jint *nBits;            /* Number of bits per component */
 137 
 138     int cmType;            /* Type of color model */
 139     int isDefaultCM;       /* If TRUE, it is the default color model */
 140     int isDefaultCompatCM; /* If TRUE, it is compatible with the default CM */
 141                            /* Might be 4 byte and band order different */
 142     int is_sRGB;           /* If TRUE, the color space is sRGB */
 143     int numComponents;     /* Total number of components */
 144     int supportsAlpha;     /* If it supports alpha */
 145     int isAlphaPre;        /* If TRUE, alpha is premultiplied */
 146     int csType;            /* Type of ColorSpace */
 147     int transparency;
 148     int maxNbits;
 149     int transIdx;          /* For ICM, transparent pixel */
 150     int mapSize;           /* For ICM, size of the lut */
 151 } ColorModelS_t;
 152 
 153 typedef struct {
 154     int *colorOrder;
 155 
 156     int channelOffset;
 157     int dataOffset;        /* # bytes into the data array */
 158     int sStride;
 159     int pStride;
 160     int packing;
 161     int numChans;
 162     int alphaIndex;        /* -1 if no alpha */
 163     int needToExpand;      /* If true, the pixels are packed */
 164     int expandToNbits;     /* If needToExpand, how many bits to allocate */
 165 } HintS_t;
 166 
 167 /* Struct that holds information for the BufferedImage object */
 168 typedef struct {
 169     jobject jimage;        /* The BufferedImage object */
 170     RasterS_t raster;      /* The raster structure */
 171     ColorModelS_t cmodel;  /* The color model structure */
 172     HintS_t hints;         /* Hint structure */
 173     int     imageType;     /* Type of image */
 174 } BufImageS_t;
 175 
 176 /***************************************************************************
 177  *                      Function Prototypes                                *
 178  ***************************************************************************/
 179 int awt_parseImage(JNIEnv *env, jobject jimage, BufImageS_t **imagePP,
 180                    int handleCustom);
 181 
 182 int awt_parseRaster(JNIEnv *env, jobject jraster, RasterS_t *rasterP);
 183 
 184 int awt_parseColorModel (JNIEnv *env, jobject jcmodel, int imageType,
 185                          ColorModelS_t *cmP);
 186 
 187 void awt_freeParsedRaster(RasterS_t *rasterP, int freeRasterP);
 188 
 189 void awt_freeParsedImage(BufImageS_t *imageP, int freeImageP);
 190 
 191 int awt_getPixelByte(JNIEnv *env, int band, RasterS_t *rasterP,
 192                      unsigned char *bufferP);
 193 int awt_setPixelByte(JNIEnv *env, int band, RasterS_t *rasterP,
 194                      unsigned char *bufferP);
 195 int awt_getPixelShort(JNIEnv *env, int band, RasterS_t *rasterP,
 196                      unsigned short *bufferP);
 197 int awt_setPixelShort(JNIEnv *env, int band, RasterS_t *rasterP,
 198                       unsigned short *bufferP);
 199 
 200 #endif /* AWT_PARSE_IMAGE_H */