jdk/src/share/native/sun/awt/image/awt_parseImage.c
author bae
Tue, 14 May 2013 12:51:59 +0400
changeset 20799 4820649a142d
parent 18258 ab42088d6e10
child 23010 6dadb192ad81
permissions -rw-r--r--
8014093: Improve parsing of images Reviewed-by: prr, jgodinez
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
     1
/*
9035
1255eb81cc2f 7033660: Update copyright year to 2011 on any files changed in 2011
ohair
parents: 7746
diff changeset
     2
 * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
90ce3da70b43 Initial load
duke
parents:
diff changeset
     4
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
90ce3da70b43 Initial load
duke
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
5506
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 2
diff changeset
     7
 * published by the Free Software Foundation.  Oracle designates this
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
     8
 * particular file as subject to the "Classpath" exception as provided
5506
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 2
diff changeset
     9
 * by Oracle in the LICENSE file that accompanied this code.
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    10
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
    11
 * This code is distributed in the hope that it will be useful, but WITHOUT
90ce3da70b43 Initial load
duke
parents:
diff changeset
    12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
90ce3da70b43 Initial load
duke
parents:
diff changeset
    13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
90ce3da70b43 Initial load
duke
parents:
diff changeset
    14
 * version 2 for more details (a copy is included in the LICENSE file that
90ce3da70b43 Initial load
duke
parents:
diff changeset
    15
 * accompanied this code).
90ce3da70b43 Initial load
duke
parents:
diff changeset
    16
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
    17
 * You should have received a copy of the GNU General Public License version
90ce3da70b43 Initial load
duke
parents:
diff changeset
    18
 * 2 along with this work; if not, write to the Free Software Foundation,
90ce3da70b43 Initial load
duke
parents:
diff changeset
    19
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
90ce3da70b43 Initial load
duke
parents:
diff changeset
    20
 *
5506
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 2
diff changeset
    21
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 2
diff changeset
    22
 * or visit www.oracle.com if you need additional information or have any
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 2
diff changeset
    23
 * questions.
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    24
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
    25
90ce3da70b43 Initial load
duke
parents:
diff changeset
    26
#include <stdio.h>
90ce3da70b43 Initial load
duke
parents:
diff changeset
    27
#include <stdlib.h>
90ce3da70b43 Initial load
duke
parents:
diff changeset
    28
#include "awt_parseImage.h"
90ce3da70b43 Initial load
duke
parents:
diff changeset
    29
#include "imageInitIDs.h"
90ce3da70b43 Initial load
duke
parents:
diff changeset
    30
#include "java_awt_Transparency.h"
90ce3da70b43 Initial load
duke
parents:
diff changeset
    31
#include "java_awt_image_BufferedImage.h"
90ce3da70b43 Initial load
duke
parents:
diff changeset
    32
#include "sun_awt_image_IntegerComponentRaster.h"
90ce3da70b43 Initial load
duke
parents:
diff changeset
    33
#include "sun_awt_image_ImagingLib.h"
90ce3da70b43 Initial load
duke
parents:
diff changeset
    34
#include "java_awt_color_ColorSpace.h"
90ce3da70b43 Initial load
duke
parents:
diff changeset
    35
#include "awt_Mlib.h"
90ce3da70b43 Initial load
duke
parents:
diff changeset
    36
#include "safe_alloc.h"
16868
b5e2827ecc50 8007014: Improve image handling
bae
parents: 16115
diff changeset
    37
#include "safe_math.h"
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    38
90ce3da70b43 Initial load
duke
parents:
diff changeset
    39
static int setHints(JNIEnv *env, BufImageS_t *imageP);
90ce3da70b43 Initial load
duke
parents:
diff changeset
    40
90ce3da70b43 Initial load
duke
parents:
diff changeset
    41
90ce3da70b43 Initial load
duke
parents:
diff changeset
    42
90ce3da70b43 Initial load
duke
parents:
diff changeset
    43
/* Parse the buffered image.  All of the raster information is returned in the
90ce3da70b43 Initial load
duke
parents:
diff changeset
    44
 * imagePP structure.
90ce3da70b43 Initial load
duke
parents:
diff changeset
    45
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
    46
 * The handleCustom parameter specifies whether or not the caller
90ce3da70b43 Initial load
duke
parents:
diff changeset
    47
 * can use custom channels.  If it is false and a custom channel
90ce3da70b43 Initial load
duke
parents:
diff changeset
    48
 * is encountered, the returned value will be 0 and all structures
90ce3da70b43 Initial load
duke
parents:
diff changeset
    49
 * will be deallocated.
90ce3da70b43 Initial load
duke
parents:
diff changeset
    50
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
    51
 * Return value:
90ce3da70b43 Initial load
duke
parents:
diff changeset
    52
 *    -1:     Exception
90ce3da70b43 Initial load
duke
parents:
diff changeset
    53
 *     0:     Can't do it.
90ce3da70b43 Initial load
duke
parents:
diff changeset
    54
 *     1:     Success
90ce3da70b43 Initial load
duke
parents:
diff changeset
    55
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
    56
int awt_parseImage(JNIEnv *env, jobject jimage, BufImageS_t **imagePP,
90ce3da70b43 Initial load
duke
parents:
diff changeset
    57
                   int handleCustom) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
    58
    BufImageS_t *imageP;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    59
    int status;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    60
    jobject jraster;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    61
    jobject jcmodel;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    62
90ce3da70b43 Initial load
duke
parents:
diff changeset
    63
    /* Make sure the image exists */
90ce3da70b43 Initial load
duke
parents:
diff changeset
    64
    if (JNU_IsNull(env, jimage)) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
    65
        JNU_ThrowNullPointerException(env, "null BufferedImage object");
90ce3da70b43 Initial load
duke
parents:
diff changeset
    66
        return -1;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    67
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
    68
90ce3da70b43 Initial load
duke
parents:
diff changeset
    69
    if ((imageP = (BufImageS_t *) calloc(1, sizeof(BufImageS_t))) == NULL) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
    70
        JNU_ThrowOutOfMemoryError(env, "Out of memory");
90ce3da70b43 Initial load
duke
parents:
diff changeset
    71
        return -1;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    72
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
    73
    imageP->jimage = jimage;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    74
90ce3da70b43 Initial load
duke
parents:
diff changeset
    75
    /* Retrieve the raster */
90ce3da70b43 Initial load
duke
parents:
diff changeset
    76
    if ((jraster = (*env)->GetObjectField(env, jimage,
90ce3da70b43 Initial load
duke
parents:
diff changeset
    77
                                          g_BImgRasterID)) == NULL) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
    78
        free((void *) imageP);
90ce3da70b43 Initial load
duke
parents:
diff changeset
    79
        JNU_ThrowNullPointerException(env, "null Raster object");
90ce3da70b43 Initial load
duke
parents:
diff changeset
    80
        return 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    81
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
    82
90ce3da70b43 Initial load
duke
parents:
diff changeset
    83
    /* Retrieve the image type */
90ce3da70b43 Initial load
duke
parents:
diff changeset
    84
    imageP->imageType = (*env)->GetIntField(env, jimage, g_BImgTypeID);
90ce3da70b43 Initial load
duke
parents:
diff changeset
    85
90ce3da70b43 Initial load
duke
parents:
diff changeset
    86
    /* Parse the raster */
90ce3da70b43 Initial load
duke
parents:
diff changeset
    87
    if ((status = awt_parseRaster(env, jraster, &imageP->raster)) <= 0) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
    88
        free((void *)imageP);
90ce3da70b43 Initial load
duke
parents:
diff changeset
    89
        return status;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    90
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
    91
90ce3da70b43 Initial load
duke
parents:
diff changeset
    92
    /* Retrieve the color model */
90ce3da70b43 Initial load
duke
parents:
diff changeset
    93
    if ((jcmodel = (*env)->GetObjectField(env, jimage, g_BImgCMID)) == NULL) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
    94
        free((void *) imageP);
90ce3da70b43 Initial load
duke
parents:
diff changeset
    95
        JNU_ThrowNullPointerException(env, "null Raster object");
90ce3da70b43 Initial load
duke
parents:
diff changeset
    96
        return 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    97
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
    98
90ce3da70b43 Initial load
duke
parents:
diff changeset
    99
    /* Parse the color model */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   100
    if ((status = awt_parseColorModel(env, jcmodel, imageP->imageType,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   101
                                      &imageP->cmodel)) <= 0) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   102
        awt_freeParsedRaster(&imageP->raster, FALSE);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   103
        free((void *)imageP);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   104
        return 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   105
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   106
90ce3da70b43 Initial load
duke
parents:
diff changeset
   107
    /* Set hints  */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   108
    if ((status = setHints(env, imageP)) <= 0) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   109
        awt_freeParsedImage(imageP, TRUE);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   110
        return 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   111
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   112
90ce3da70b43 Initial load
duke
parents:
diff changeset
   113
    *imagePP = imageP;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   114
90ce3da70b43 Initial load
duke
parents:
diff changeset
   115
    return status;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   116
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   117
16093
b305a8dc867f 8001972: Improve image processing
bae
parents: 9035
diff changeset
   118
/* Verifies whether the channel offsets are sane and correspond to the type of
b305a8dc867f 8001972: Improve image processing
bae
parents: 9035
diff changeset
   119
 * the raster.
b305a8dc867f 8001972: Improve image processing
bae
parents: 9035
diff changeset
   120
 *
b305a8dc867f 8001972: Improve image processing
bae
parents: 9035
diff changeset
   121
 * Return value:
b305a8dc867f 8001972: Improve image processing
bae
parents: 9035
diff changeset
   122
 *     0: Failure: channel offsets are invalid
b305a8dc867f 8001972: Improve image processing
bae
parents: 9035
diff changeset
   123
 *     1: Success
b305a8dc867f 8001972: Improve image processing
bae
parents: 9035
diff changeset
   124
 */
b305a8dc867f 8001972: Improve image processing
bae
parents: 9035
diff changeset
   125
static int checkChannelOffsets(RasterS_t *rasterP, int dataArrayLength) {
b305a8dc867f 8001972: Improve image processing
bae
parents: 9035
diff changeset
   126
    int i, lastPixelOffset, lastScanOffset;
b305a8dc867f 8001972: Improve image processing
bae
parents: 9035
diff changeset
   127
    switch (rasterP->rasterType) {
b305a8dc867f 8001972: Improve image processing
bae
parents: 9035
diff changeset
   128
    case COMPONENT_RASTER_TYPE:
b305a8dc867f 8001972: Improve image processing
bae
parents: 9035
diff changeset
   129
        if (!SAFE_TO_MULT(rasterP->height, rasterP->scanlineStride)) {
b305a8dc867f 8001972: Improve image processing
bae
parents: 9035
diff changeset
   130
            return 0;
b305a8dc867f 8001972: Improve image processing
bae
parents: 9035
diff changeset
   131
        }
b305a8dc867f 8001972: Improve image processing
bae
parents: 9035
diff changeset
   132
        if (!SAFE_TO_MULT(rasterP->width, rasterP->pixelStride)) {
b305a8dc867f 8001972: Improve image processing
bae
parents: 9035
diff changeset
   133
            return 0;
b305a8dc867f 8001972: Improve image processing
bae
parents: 9035
diff changeset
   134
        }
b305a8dc867f 8001972: Improve image processing
bae
parents: 9035
diff changeset
   135
b305a8dc867f 8001972: Improve image processing
bae
parents: 9035
diff changeset
   136
        lastScanOffset = (rasterP->height - 1) * rasterP->scanlineStride;
b305a8dc867f 8001972: Improve image processing
bae
parents: 9035
diff changeset
   137
        lastPixelOffset = (rasterP->width - 1) * rasterP->pixelStride;
b305a8dc867f 8001972: Improve image processing
bae
parents: 9035
diff changeset
   138
b305a8dc867f 8001972: Improve image processing
bae
parents: 9035
diff changeset
   139
b305a8dc867f 8001972: Improve image processing
bae
parents: 9035
diff changeset
   140
        if (!SAFE_TO_ADD(lastPixelOffset, lastScanOffset)) {
b305a8dc867f 8001972: Improve image processing
bae
parents: 9035
diff changeset
   141
            return 0;
b305a8dc867f 8001972: Improve image processing
bae
parents: 9035
diff changeset
   142
        }
b305a8dc867f 8001972: Improve image processing
bae
parents: 9035
diff changeset
   143
b305a8dc867f 8001972: Improve image processing
bae
parents: 9035
diff changeset
   144
        lastPixelOffset += lastScanOffset;
b305a8dc867f 8001972: Improve image processing
bae
parents: 9035
diff changeset
   145
b305a8dc867f 8001972: Improve image processing
bae
parents: 9035
diff changeset
   146
        for (i = 0; i < rasterP->numDataElements; i++) {
b305a8dc867f 8001972: Improve image processing
bae
parents: 9035
diff changeset
   147
            int off = rasterP->chanOffsets[i];
b305a8dc867f 8001972: Improve image processing
bae
parents: 9035
diff changeset
   148
            int size = lastPixelOffset + off;
b305a8dc867f 8001972: Improve image processing
bae
parents: 9035
diff changeset
   149
b305a8dc867f 8001972: Improve image processing
bae
parents: 9035
diff changeset
   150
            if (off < 0 || !SAFE_TO_ADD(lastPixelOffset, off)) {
b305a8dc867f 8001972: Improve image processing
bae
parents: 9035
diff changeset
   151
                return 0;
b305a8dc867f 8001972: Improve image processing
bae
parents: 9035
diff changeset
   152
            }
b305a8dc867f 8001972: Improve image processing
bae
parents: 9035
diff changeset
   153
b305a8dc867f 8001972: Improve image processing
bae
parents: 9035
diff changeset
   154
            if (size < lastPixelOffset || size >= dataArrayLength) {
b305a8dc867f 8001972: Improve image processing
bae
parents: 9035
diff changeset
   155
                // an overflow, or insufficient buffer capacity
b305a8dc867f 8001972: Improve image processing
bae
parents: 9035
diff changeset
   156
                return 0;
b305a8dc867f 8001972: Improve image processing
bae
parents: 9035
diff changeset
   157
            }
b305a8dc867f 8001972: Improve image processing
bae
parents: 9035
diff changeset
   158
        }
b305a8dc867f 8001972: Improve image processing
bae
parents: 9035
diff changeset
   159
        return 1;
b305a8dc867f 8001972: Improve image processing
bae
parents: 9035
diff changeset
   160
    case BANDED_RASTER_TYPE:
b305a8dc867f 8001972: Improve image processing
bae
parents: 9035
diff changeset
   161
        // NB:caller does not support the banded rasters yet,
b305a8dc867f 8001972: Improve image processing
bae
parents: 9035
diff changeset
   162
        // so this branch of the code must be re-defined in
b305a8dc867f 8001972: Improve image processing
bae
parents: 9035
diff changeset
   163
        // order to provide valid criteria for the data offsets
b305a8dc867f 8001972: Improve image processing
bae
parents: 9035
diff changeset
   164
        // verification, when/if banded rasters will be supported.
b305a8dc867f 8001972: Improve image processing
bae
parents: 9035
diff changeset
   165
        // At the moment, we prohibit banded rasters as well.
b305a8dc867f 8001972: Improve image processing
bae
parents: 9035
diff changeset
   166
        return 0;
b305a8dc867f 8001972: Improve image processing
bae
parents: 9035
diff changeset
   167
    default:
b305a8dc867f 8001972: Improve image processing
bae
parents: 9035
diff changeset
   168
        // PACKED_RASTER_TYPE: does not support channel offsets
b305a8dc867f 8001972: Improve image processing
bae
parents: 9035
diff changeset
   169
        // UNKNOWN_RASTER_TYPE: should not be used, likely indicates an error
b305a8dc867f 8001972: Improve image processing
bae
parents: 9035
diff changeset
   170
        return 0;
b305a8dc867f 8001972: Improve image processing
bae
parents: 9035
diff changeset
   171
    }
b305a8dc867f 8001972: Improve image processing
bae
parents: 9035
diff changeset
   172
}
b305a8dc867f 8001972: Improve image processing
bae
parents: 9035
diff changeset
   173
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   174
/* Parse the raster.  All of the raster information is returned in the
90ce3da70b43 Initial load
duke
parents:
diff changeset
   175
 * rasterP structure.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   176
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   177
 * Return value:
90ce3da70b43 Initial load
duke
parents:
diff changeset
   178
 *    -1:     Exception
90ce3da70b43 Initial load
duke
parents:
diff changeset
   179
 *     0:     Can't do it (Custom channel)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   180
 *     1:     Success
90ce3da70b43 Initial load
duke
parents:
diff changeset
   181
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   182
int awt_parseRaster(JNIEnv *env, jobject jraster, RasterS_t *rasterP) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   183
    jobject joffs = NULL;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   184
    /* int status;*/
90ce3da70b43 Initial load
duke
parents:
diff changeset
   185
90ce3da70b43 Initial load
duke
parents:
diff changeset
   186
    if (JNU_IsNull(env, jraster)) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   187
        JNU_ThrowNullPointerException(env, "null Raster object");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   188
        return -1;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   189
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   190
90ce3da70b43 Initial load
duke
parents:
diff changeset
   191
    rasterP->jraster = jraster;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   192
    rasterP->width   = (*env)->GetIntField(env, jraster, g_RasterWidthID);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   193
    rasterP->height  = (*env)->GetIntField(env, jraster, g_RasterHeightID);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   194
    rasterP->numDataElements = (*env)->GetIntField(env, jraster,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   195
                                                   g_RasterNumDataElementsID);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   196
    rasterP->numBands = (*env)->GetIntField(env, jraster,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   197
                                            g_RasterNumBandsID);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   198
90ce3da70b43 Initial load
duke
parents:
diff changeset
   199
    rasterP->baseOriginX = (*env)->GetIntField(env, jraster,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   200
                                               g_RasterBaseOriginXID);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   201
    rasterP->baseOriginY = (*env)->GetIntField(env, jraster,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   202
                                               g_RasterBaseOriginYID);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   203
    rasterP->minX = (*env)->GetIntField(env, jraster, g_RasterMinXID);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   204
    rasterP->minY = (*env)->GetIntField(env, jraster, g_RasterMinYID);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   205
90ce3da70b43 Initial load
duke
parents:
diff changeset
   206
    rasterP->jsampleModel = (*env)->GetObjectField(env, jraster,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   207
                                                   g_RasterSampleModelID);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   208
90ce3da70b43 Initial load
duke
parents:
diff changeset
   209
    if (JNU_IsNull(env, rasterP->jsampleModel)) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   210
        JNU_ThrowNullPointerException(env, "null Raster object");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   211
        return -1;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   212
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   213
16093
b305a8dc867f 8001972: Improve image processing
bae
parents: 9035
diff changeset
   214
    // make sure that the raster type is initialized
b305a8dc867f 8001972: Improve image processing
bae
parents: 9035
diff changeset
   215
    rasterP->rasterType = UNKNOWN_RASTER_TYPE;
b305a8dc867f 8001972: Improve image processing
bae
parents: 9035
diff changeset
   216
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   217
    if (rasterP->numBands <= 0 ||
90ce3da70b43 Initial load
duke
parents:
diff changeset
   218
        rasterP->numBands > MAX_NUMBANDS)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   219
    {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   220
        /*
90ce3da70b43 Initial load
duke
parents:
diff changeset
   221
         * we can't handle such kind of rasters due to limitations
90ce3da70b43 Initial load
duke
parents:
diff changeset
   222
         * of SPPSampleModelS_t structure and expand/set methods.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   223
         */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   224
        return 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   225
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   226
16096
a4397a7163e3 8002325: Improve management of images
bae
parents: 16093
diff changeset
   227
    rasterP->sppsm.isUsed = 0;
a4397a7163e3 8002325: Improve management of images
bae
parents: 16093
diff changeset
   228
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   229
    if ((*env)->IsInstanceOf(env, rasterP->jsampleModel,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   230
       (*env)->FindClass(env,"java/awt/image/SinglePixelPackedSampleModel"))) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   231
        jobject jmask, joffs, jnbits;
16096
a4397a7163e3 8002325: Improve management of images
bae
parents: 16093
diff changeset
   232
a4397a7163e3 8002325: Improve management of images
bae
parents: 16093
diff changeset
   233
        rasterP->sppsm.isUsed = 1;
a4397a7163e3 8002325: Improve management of images
bae
parents: 16093
diff changeset
   234
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   235
        rasterP->sppsm.maxBitSize = (*env)->GetIntField(env,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   236
                                                        rasterP->jsampleModel,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   237
                                                        g_SPPSMmaxBitID);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   238
        jmask = (*env)->GetObjectField(env, rasterP->jsampleModel,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   239
                                       g_SPPSMmaskArrID);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   240
        joffs = (*env)->GetObjectField(env, rasterP->jsampleModel,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   241
                                       g_SPPSMmaskOffID);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   242
        jnbits = (*env)->GetObjectField(env, rasterP->jsampleModel,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   243
                                        g_SPPSMnBitsID);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   244
        if (jmask == NULL || joffs == NULL || jnbits == NULL ||
7746
3cdbc9c4de5b 6782574: AffineTransformOp.filter(BufferedImage, BufferedImage) fails with InternalError
bae
parents: 5506
diff changeset
   245
            rasterP->sppsm.maxBitSize < 0)
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   246
        {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   247
            JNU_ThrowInternalError(env, "Can't grab SPPSM fields");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   248
            return -1;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   249
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   250
        (*env)->GetIntArrayRegion(env, jmask, 0,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   251
                                  rasterP->numBands, rasterP->sppsm.maskArray);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   252
        (*env)->GetIntArrayRegion(env, joffs, 0,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   253
                                  rasterP->numBands, rasterP->sppsm.offsets);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   254
        (*env)->GetIntArrayRegion(env, jnbits, 0,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   255
                                  rasterP->numBands, rasterP->sppsm.nBits);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   256
90ce3da70b43 Initial load
duke
parents:
diff changeset
   257
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   258
    rasterP->baseRasterWidth = (*env)->GetIntField(env, rasterP->jsampleModel,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   259
                                                   g_SMWidthID);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   260
    rasterP->baseRasterHeight = (*env)->GetIntField(env,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   261
                                                    rasterP->jsampleModel,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   262
                                                    g_SMHeightID);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   263
90ce3da70b43 Initial load
duke
parents:
diff changeset
   264
    if ((*env)->IsInstanceOf(env, jraster,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   265
         (*env)->FindClass(env, "sun/awt/image/IntegerComponentRaster"))){
90ce3da70b43 Initial load
duke
parents:
diff changeset
   266
        rasterP->jdata = (*env)->GetObjectField(env, jraster, g_ICRdataID);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   267
        rasterP->dataType = INT_DATA_TYPE;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   268
        rasterP->dataSize = 4;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   269
        rasterP->dataIsShared = TRUE;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   270
        rasterP->rasterType = COMPONENT_RASTER_TYPE;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   271
        rasterP->type = (*env)->GetIntField(env, jraster, g_ICRtypeID);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   272
        rasterP->scanlineStride = (*env)->GetIntField(env, jraster, g_ICRscanstrID);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   273
        rasterP->pixelStride = (*env)->GetIntField(env, jraster, g_ICRpixstrID);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   274
        joffs = (*env)->GetObjectField(env, jraster, g_ICRdataOffsetsID);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   275
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   276
    else if ((*env)->IsInstanceOf(env, jraster,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   277
            (*env)->FindClass(env, "sun/awt/image/ByteComponentRaster"))){
90ce3da70b43 Initial load
duke
parents:
diff changeset
   278
        rasterP->jdata = (*env)->GetObjectField(env, jraster, g_BCRdataID);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   279
        rasterP->dataType = BYTE_DATA_TYPE;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   280
        rasterP->dataSize = 1;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   281
        rasterP->dataIsShared = TRUE;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   282
        rasterP->rasterType = COMPONENT_RASTER_TYPE;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   283
        rasterP->type = (*env)->GetIntField(env, jraster, g_BCRtypeID);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   284
        rasterP->scanlineStride = (*env)->GetIntField(env, jraster, g_BCRscanstrID);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   285
        rasterP->pixelStride = (*env)->GetIntField(env, jraster, g_BCRpixstrID);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   286
        joffs = (*env)->GetObjectField(env, jraster, g_BCRdataOffsetsID);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   287
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   288
    else if ((*env)->IsInstanceOf(env, jraster,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   289
            (*env)->FindClass(env, "sun/awt/image/ShortComponentRaster"))){
90ce3da70b43 Initial load
duke
parents:
diff changeset
   290
        rasterP->jdata = (*env)->GetObjectField(env, jraster, g_SCRdataID);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   291
        rasterP->dataType = SHORT_DATA_TYPE;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   292
        rasterP->dataSize = 2;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   293
        rasterP->dataIsShared = TRUE;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   294
        rasterP->rasterType = COMPONENT_RASTER_TYPE;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   295
        rasterP->type = (*env)->GetIntField(env, jraster, g_SCRtypeID);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   296
        rasterP->scanlineStride = (*env)->GetIntField(env, jraster, g_SCRscanstrID);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   297
        rasterP->pixelStride = (*env)->GetIntField(env, jraster, g_SCRpixstrID);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   298
        joffs = (*env)->GetObjectField(env, jraster, g_SCRdataOffsetsID);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   299
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   300
    else if ((*env)->IsInstanceOf(env, jraster,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   301
            (*env)->FindClass(env, "sun/awt/image/BytePackedRaster"))){
90ce3da70b43 Initial load
duke
parents:
diff changeset
   302
        rasterP->rasterType = PACKED_RASTER_TYPE;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   303
        rasterP->dataType = BYTE_DATA_TYPE;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   304
        rasterP->dataSize = 1;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   305
        rasterP->scanlineStride = (*env)->GetIntField(env, jraster, g_BPRscanstrID);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   306
        rasterP->pixelStride = (*env)->GetIntField(env, jraster, g_BPRpixstrID);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   307
        rasterP->jdata = (*env)->GetObjectField(env, jraster, g_BPRdataID);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   308
        rasterP->type = (*env)->GetIntField(env, jraster, g_BPRtypeID);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   309
        rasterP->chanOffsets = NULL;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   310
        if (SAFE_TO_ALLOC_2(rasterP->numDataElements, sizeof(jint))) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   311
            rasterP->chanOffsets =
90ce3da70b43 Initial load
duke
parents:
diff changeset
   312
                (jint *)malloc(rasterP->numDataElements * sizeof(jint));
90ce3da70b43 Initial load
duke
parents:
diff changeset
   313
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   314
        if (rasterP->chanOffsets == NULL) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   315
            /* Out of memory */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   316
            JNU_ThrowOutOfMemoryError(env, "Out of memory");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   317
            return -1;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   318
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   319
        rasterP->chanOffsets[0] = (*env)->GetIntField(env, jraster, g_BPRdataBitOffsetID);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   320
        rasterP->dataType = BYTE_DATA_TYPE;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   321
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   322
    else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   323
        rasterP->type = sun_awt_image_IntegerComponentRaster_TYPE_CUSTOM;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   324
        rasterP->dataType = UNKNOWN_DATA_TYPE;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   325
        rasterP->rasterType = UNKNOWN_RASTER_TYPE;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   326
        rasterP->chanOffsets = NULL;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   327
        /* Custom raster */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   328
        return 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   329
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   330
16093
b305a8dc867f 8001972: Improve image processing
bae
parents: 9035
diff changeset
   331
    // do basic validation of the raster structure
b305a8dc867f 8001972: Improve image processing
bae
parents: 9035
diff changeset
   332
    if (rasterP->width <= 0 || rasterP->height <= 0 ||
b305a8dc867f 8001972: Improve image processing
bae
parents: 9035
diff changeset
   333
        rasterP->pixelStride <= 0 || rasterP->scanlineStride <= 0)
b305a8dc867f 8001972: Improve image processing
bae
parents: 9035
diff changeset
   334
    {
b305a8dc867f 8001972: Improve image processing
bae
parents: 9035
diff changeset
   335
        // invalid raster
b305a8dc867f 8001972: Improve image processing
bae
parents: 9035
diff changeset
   336
        return -1;
b305a8dc867f 8001972: Improve image processing
bae
parents: 9035
diff changeset
   337
    }
b305a8dc867f 8001972: Improve image processing
bae
parents: 9035
diff changeset
   338
b305a8dc867f 8001972: Improve image processing
bae
parents: 9035
diff changeset
   339
    // channel (data) offsets
b305a8dc867f 8001972: Improve image processing
bae
parents: 9035
diff changeset
   340
    switch (rasterP->rasterType) {
b305a8dc867f 8001972: Improve image processing
bae
parents: 9035
diff changeset
   341
    case COMPONENT_RASTER_TYPE:
b305a8dc867f 8001972: Improve image processing
bae
parents: 9035
diff changeset
   342
    case BANDED_RASTER_TYPE: // note that this routine does not support banded rasters at the moment
b305a8dc867f 8001972: Improve image processing
bae
parents: 9035
diff changeset
   343
        // get channel (data) offsets
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   344
        rasterP->chanOffsets = NULL;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   345
        if (SAFE_TO_ALLOC_2(rasterP->numDataElements, sizeof(jint))) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   346
            rasterP->chanOffsets =
90ce3da70b43 Initial load
duke
parents:
diff changeset
   347
                (jint *)malloc(rasterP->numDataElements * sizeof(jint));
90ce3da70b43 Initial load
duke
parents:
diff changeset
   348
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   349
        if (rasterP->chanOffsets == NULL) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   350
            /* Out of memory */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   351
            JNU_ThrowOutOfMemoryError(env, "Out of memory");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   352
            return -1;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   353
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   354
        (*env)->GetIntArrayRegion(env, joffs, 0, rasterP->numDataElements,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   355
                                  rasterP->chanOffsets);
16093
b305a8dc867f 8001972: Improve image processing
bae
parents: 9035
diff changeset
   356
        if (rasterP->jdata == NULL) {
b305a8dc867f 8001972: Improve image processing
bae
parents: 9035
diff changeset
   357
            // unable to verify the raster
b305a8dc867f 8001972: Improve image processing
bae
parents: 9035
diff changeset
   358
            return -1;
b305a8dc867f 8001972: Improve image processing
bae
parents: 9035
diff changeset
   359
        }
b305a8dc867f 8001972: Improve image processing
bae
parents: 9035
diff changeset
   360
        // verify whether channel offsets look sane
b305a8dc867f 8001972: Improve image processing
bae
parents: 9035
diff changeset
   361
        if (!checkChannelOffsets(rasterP, (*env)->GetArrayLength(env, rasterP->jdata))) {
b305a8dc867f 8001972: Improve image processing
bae
parents: 9035
diff changeset
   362
            return -1;
b305a8dc867f 8001972: Improve image processing
bae
parents: 9035
diff changeset
   363
        }
b305a8dc867f 8001972: Improve image processing
bae
parents: 9035
diff changeset
   364
        break;
b305a8dc867f 8001972: Improve image processing
bae
parents: 9035
diff changeset
   365
    default:
b305a8dc867f 8001972: Improve image processing
bae
parents: 9035
diff changeset
   366
        ; // PACKED_RASTER_TYPE does not use the channel offsets.
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   367
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   368
16093
b305a8dc867f 8001972: Improve image processing
bae
parents: 9035
diff changeset
   369
    /* additional check for sppsm fields validity: make sure that
b305a8dc867f 8001972: Improve image processing
bae
parents: 9035
diff changeset
   370
     * size of raster samples doesn't exceed the data type capacity.
7746
3cdbc9c4de5b 6782574: AffineTransformOp.filter(BufferedImage, BufferedImage) fails with InternalError
bae
parents: 5506
diff changeset
   371
     */
3cdbc9c4de5b 6782574: AffineTransformOp.filter(BufferedImage, BufferedImage) fails with InternalError
bae
parents: 5506
diff changeset
   372
    if (rasterP->dataType > UNKNOWN_DATA_TYPE && /* data type has been recognized */
3cdbc9c4de5b 6782574: AffineTransformOp.filter(BufferedImage, BufferedImage) fails with InternalError
bae
parents: 5506
diff changeset
   373
        rasterP->sppsm.maxBitSize > 0 && /* raster has SPP sample model */
3cdbc9c4de5b 6782574: AffineTransformOp.filter(BufferedImage, BufferedImage) fails with InternalError
bae
parents: 5506
diff changeset
   374
        rasterP->sppsm.maxBitSize > (rasterP->dataSize * 8))
3cdbc9c4de5b 6782574: AffineTransformOp.filter(BufferedImage, BufferedImage) fails with InternalError
bae
parents: 5506
diff changeset
   375
    {
3cdbc9c4de5b 6782574: AffineTransformOp.filter(BufferedImage, BufferedImage) fails with InternalError
bae
parents: 5506
diff changeset
   376
        JNU_ThrowInternalError(env, "Raster samples are too big");
3cdbc9c4de5b 6782574: AffineTransformOp.filter(BufferedImage, BufferedImage) fails with InternalError
bae
parents: 5506
diff changeset
   377
        return -1;
3cdbc9c4de5b 6782574: AffineTransformOp.filter(BufferedImage, BufferedImage) fails with InternalError
bae
parents: 5506
diff changeset
   378
    }
3cdbc9c4de5b 6782574: AffineTransformOp.filter(BufferedImage, BufferedImage) fails with InternalError
bae
parents: 5506
diff changeset
   379
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   380
#if 0
90ce3da70b43 Initial load
duke
parents:
diff changeset
   381
    fprintf(stderr,"---------------------\n");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   382
    fprintf(stderr,"Width  : %d\n",rasterP->width);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   383
    fprintf(stderr,"Height : %d\n",rasterP->height);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   384
    fprintf(stderr,"X      : %d\n",rasterP->x);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   385
    fprintf(stderr,"Y      : %d\n",rasterP->y);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   386
    fprintf(stderr,"numC   : %d\n",rasterP->numDataElements);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   387
    fprintf(stderr,"SS     : %d\n",rasterP->scanlineStride);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   388
    fprintf(stderr,"PS     : %d\n",rasterP->pixelStride);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   389
    fprintf(stderr,"CO     : %d\n",rasterP->chanOffsets);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   390
    fprintf(stderr,"shared?: %d\n",rasterP->dataIsShared);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   391
    fprintf(stderr,"RasterT: %d\n",rasterP->rasterType);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   392
    fprintf(stderr,"DataT  : %d\n",rasterP->dataType);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   393
    fprintf(stderr,"---------------------\n");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   394
#endif
90ce3da70b43 Initial load
duke
parents:
diff changeset
   395
90ce3da70b43 Initial load
duke
parents:
diff changeset
   396
    return 1;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   397
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   398
18258
ab42088d6e10 8012597: Better image channel verification
bae
parents: 16868
diff changeset
   399
static int getColorModelType(JNIEnv *env, jobject jcmodel) {
ab42088d6e10 8012597: Better image channel verification
bae
parents: 16868
diff changeset
   400
    int type = UNKNOWN_CM_TYPE;
ab42088d6e10 8012597: Better image channel verification
bae
parents: 16868
diff changeset
   401
ab42088d6e10 8012597: Better image channel verification
bae
parents: 16868
diff changeset
   402
    if ((*env)->IsInstanceOf(env, jcmodel,
ab42088d6e10 8012597: Better image channel verification
bae
parents: 16868
diff changeset
   403
                 (*env)->FindClass(env, "java/awt/image/IndexColorModel")))
ab42088d6e10 8012597: Better image channel verification
bae
parents: 16868
diff changeset
   404
    {
ab42088d6e10 8012597: Better image channel verification
bae
parents: 16868
diff changeset
   405
        type = INDEX_CM_TYPE;
ab42088d6e10 8012597: Better image channel verification
bae
parents: 16868
diff changeset
   406
    } else if ((*env)->IsInstanceOf(env, jcmodel,
ab42088d6e10 8012597: Better image channel verification
bae
parents: 16868
diff changeset
   407
                 (*env)->FindClass(env, "java/awt/image/PackedColorModel")))
ab42088d6e10 8012597: Better image channel verification
bae
parents: 16868
diff changeset
   408
    {
ab42088d6e10 8012597: Better image channel verification
bae
parents: 16868
diff changeset
   409
        if  ((*env)->IsInstanceOf(env, jcmodel,
ab42088d6e10 8012597: Better image channel verification
bae
parents: 16868
diff changeset
   410
                (*env)->FindClass(env, "java/awt/image/DirectColorModel"))) {
ab42088d6e10 8012597: Better image channel verification
bae
parents: 16868
diff changeset
   411
            type = DIRECT_CM_TYPE;
ab42088d6e10 8012597: Better image channel verification
bae
parents: 16868
diff changeset
   412
        }
ab42088d6e10 8012597: Better image channel verification
bae
parents: 16868
diff changeset
   413
        else {
ab42088d6e10 8012597: Better image channel verification
bae
parents: 16868
diff changeset
   414
            type = PACKED_CM_TYPE;
ab42088d6e10 8012597: Better image channel verification
bae
parents: 16868
diff changeset
   415
        }
ab42088d6e10 8012597: Better image channel verification
bae
parents: 16868
diff changeset
   416
    }
ab42088d6e10 8012597: Better image channel verification
bae
parents: 16868
diff changeset
   417
    else if ((*env)->IsInstanceOf(env, jcmodel,
ab42088d6e10 8012597: Better image channel verification
bae
parents: 16868
diff changeset
   418
                 (*env)->FindClass(env, "java/awt/image/ComponentColorModel")))
ab42088d6e10 8012597: Better image channel verification
bae
parents: 16868
diff changeset
   419
    {
ab42088d6e10 8012597: Better image channel verification
bae
parents: 16868
diff changeset
   420
        type = COMPONENT_CM_TYPE;
ab42088d6e10 8012597: Better image channel verification
bae
parents: 16868
diff changeset
   421
    }
ab42088d6e10 8012597: Better image channel verification
bae
parents: 16868
diff changeset
   422
ab42088d6e10 8012597: Better image channel verification
bae
parents: 16868
diff changeset
   423
    return type;
ab42088d6e10 8012597: Better image channel verification
bae
parents: 16868
diff changeset
   424
}
ab42088d6e10 8012597: Better image channel verification
bae
parents: 16868
diff changeset
   425
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   426
int awt_parseColorModel (JNIEnv *env, jobject jcmodel, int imageType,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   427
                         ColorModelS_t *cmP) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   428
    /*jmethodID jID;   */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   429
    jobject jnBits;
18258
ab42088d6e10 8012597: Better image channel verification
bae
parents: 16868
diff changeset
   430
    jsize   nBitsLength;
ab42088d6e10 8012597: Better image channel verification
bae
parents: 16868
diff changeset
   431
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   432
    int i;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   433
    static jobject s_jdefCM = NULL;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   434
90ce3da70b43 Initial load
duke
parents:
diff changeset
   435
    if (JNU_IsNull(env, jcmodel)) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   436
        JNU_ThrowNullPointerException(env, "null ColorModel object");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   437
        return -1;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   438
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   439
90ce3da70b43 Initial load
duke
parents:
diff changeset
   440
    cmP->jcmodel = jcmodel;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   441
90ce3da70b43 Initial load
duke
parents:
diff changeset
   442
    cmP->jcspace = (*env)->GetObjectField(env, jcmodel, g_CMcspaceID);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   443
90ce3da70b43 Initial load
duke
parents:
diff changeset
   444
    cmP->numComponents = (*env)->GetIntField(env, jcmodel,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   445
                                             g_CMnumComponentsID);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   446
    cmP->supportsAlpha = (*env)->GetBooleanField(env, jcmodel,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   447
                                                 g_CMsuppAlphaID);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   448
    cmP->isAlphaPre = (*env)->GetBooleanField(env,jcmodel,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   449
                                              g_CMisAlphaPreID);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   450
    cmP->transparency = (*env)->GetIntField(env, jcmodel,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   451
                                            g_CMtransparencyID);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   452
18258
ab42088d6e10 8012597: Better image channel verification
bae
parents: 16868
diff changeset
   453
    jnBits = (*env)->GetObjectField(env, jcmodel, g_CMnBitsID);
ab42088d6e10 8012597: Better image channel verification
bae
parents: 16868
diff changeset
   454
    if (jnBits == NULL) {
ab42088d6e10 8012597: Better image channel verification
bae
parents: 16868
diff changeset
   455
        JNU_ThrowNullPointerException(env, "null nBits structure in CModel");
ab42088d6e10 8012597: Better image channel verification
bae
parents: 16868
diff changeset
   456
        return -1;
ab42088d6e10 8012597: Better image channel verification
bae
parents: 16868
diff changeset
   457
    }
ab42088d6e10 8012597: Better image channel verification
bae
parents: 16868
diff changeset
   458
ab42088d6e10 8012597: Better image channel verification
bae
parents: 16868
diff changeset
   459
    nBitsLength = (*env)->GetArrayLength(env, jnBits);
ab42088d6e10 8012597: Better image channel verification
bae
parents: 16868
diff changeset
   460
    if (nBitsLength != cmP->numComponents) {
ab42088d6e10 8012597: Better image channel verification
bae
parents: 16868
diff changeset
   461
        // invalid number of components?
ab42088d6e10 8012597: Better image channel verification
bae
parents: 16868
diff changeset
   462
        return -1;
ab42088d6e10 8012597: Better image channel verification
bae
parents: 16868
diff changeset
   463
    }
ab42088d6e10 8012597: Better image channel verification
bae
parents: 16868
diff changeset
   464
ab42088d6e10 8012597: Better image channel verification
bae
parents: 16868
diff changeset
   465
    cmP->nBits = NULL;
ab42088d6e10 8012597: Better image channel verification
bae
parents: 16868
diff changeset
   466
    if (SAFE_TO_ALLOC_2(cmP->numComponents, sizeof(jint))) {
ab42088d6e10 8012597: Better image channel verification
bae
parents: 16868
diff changeset
   467
        cmP->nBits = (jint *)malloc(cmP->numComponents * sizeof(jint));
ab42088d6e10 8012597: Better image channel verification
bae
parents: 16868
diff changeset
   468
    }
ab42088d6e10 8012597: Better image channel verification
bae
parents: 16868
diff changeset
   469
ab42088d6e10 8012597: Better image channel verification
bae
parents: 16868
diff changeset
   470
    if (cmP->nBits == NULL){
ab42088d6e10 8012597: Better image channel verification
bae
parents: 16868
diff changeset
   471
        JNU_ThrowOutOfMemoryError(env, "Out of memory");
ab42088d6e10 8012597: Better image channel verification
bae
parents: 16868
diff changeset
   472
        return -1;
ab42088d6e10 8012597: Better image channel verification
bae
parents: 16868
diff changeset
   473
    }
ab42088d6e10 8012597: Better image channel verification
bae
parents: 16868
diff changeset
   474
    (*env)->GetIntArrayRegion(env, jnBits, 0, cmP->numComponents,
ab42088d6e10 8012597: Better image channel verification
bae
parents: 16868
diff changeset
   475
                              cmP->nBits);
ab42088d6e10 8012597: Better image channel verification
bae
parents: 16868
diff changeset
   476
    cmP->maxNbits = 0;
ab42088d6e10 8012597: Better image channel verification
bae
parents: 16868
diff changeset
   477
    for (i=0; i < cmP->numComponents; i++) {
ab42088d6e10 8012597: Better image channel verification
bae
parents: 16868
diff changeset
   478
        if (cmP->maxNbits < cmP->nBits[i]) {
ab42088d6e10 8012597: Better image channel verification
bae
parents: 16868
diff changeset
   479
            cmP->maxNbits = cmP->nBits[i];
ab42088d6e10 8012597: Better image channel verification
bae
parents: 16868
diff changeset
   480
        }
ab42088d6e10 8012597: Better image channel verification
bae
parents: 16868
diff changeset
   481
    }
ab42088d6e10 8012597: Better image channel verification
bae
parents: 16868
diff changeset
   482
ab42088d6e10 8012597: Better image channel verification
bae
parents: 16868
diff changeset
   483
    cmP->is_sRGB = (*env)->GetBooleanField(env, cmP->jcmodel, g_CMis_sRGBID);
ab42088d6e10 8012597: Better image channel verification
bae
parents: 16868
diff changeset
   484
ab42088d6e10 8012597: Better image channel verification
bae
parents: 16868
diff changeset
   485
    cmP->csType = (*env)->GetIntField(env, cmP->jcmodel, g_CMcsTypeID);
ab42088d6e10 8012597: Better image channel verification
bae
parents: 16868
diff changeset
   486
ab42088d6e10 8012597: Better image channel verification
bae
parents: 16868
diff changeset
   487
    cmP->cmType = getColorModelType(env, jcmodel);
ab42088d6e10 8012597: Better image channel verification
bae
parents: 16868
diff changeset
   488
ab42088d6e10 8012597: Better image channel verification
bae
parents: 16868
diff changeset
   489
    cmP->isDefaultCM = FALSE;
ab42088d6e10 8012597: Better image channel verification
bae
parents: 16868
diff changeset
   490
    cmP->isDefaultCompatCM = FALSE;
ab42088d6e10 8012597: Better image channel verification
bae
parents: 16868
diff changeset
   491
ab42088d6e10 8012597: Better image channel verification
bae
parents: 16868
diff changeset
   492
    /* look for standard cases */
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   493
    if (imageType == java_awt_image_BufferedImage_TYPE_INT_ARGB) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   494
        cmP->isDefaultCM = TRUE;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   495
        cmP->isDefaultCompatCM = TRUE;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   496
    } else if (imageType == java_awt_image_BufferedImage_TYPE_INT_ARGB_PRE ||
18258
ab42088d6e10 8012597: Better image channel verification
bae
parents: 16868
diff changeset
   497
               imageType == java_awt_image_BufferedImage_TYPE_INT_RGB ||
ab42088d6e10 8012597: Better image channel verification
bae
parents: 16868
diff changeset
   498
               imageType == java_awt_image_BufferedImage_TYPE_INT_BGR ||
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   499
               imageType == java_awt_image_BufferedImage_TYPE_4BYTE_ABGR ||
18258
ab42088d6e10 8012597: Better image channel verification
bae
parents: 16868
diff changeset
   500
               imageType == java_awt_image_BufferedImage_TYPE_4BYTE_ABGR_PRE)
ab42088d6e10 8012597: Better image channel verification
bae
parents: 16868
diff changeset
   501
    {
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   502
        cmP->isDefaultCompatCM = TRUE;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   503
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   504
    else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   505
        /* Figure out if this is the default CM */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   506
        if (s_jdefCM == NULL) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   507
            jobject defCM;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   508
            jclass jcm = (*env)->FindClass(env, "java/awt/image/ColorModel");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   509
            defCM = (*env)->CallStaticObjectMethod(env, jcm,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   510
                                                   g_CMgetRGBdefaultMID, NULL);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   511
            s_jdefCM = (*env)->NewGlobalRef(env, defCM);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   512
            if (defCM == NULL || s_jdefCM == NULL) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   513
                JNU_ThrowNullPointerException(env,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   514
                                              "Unable to find default CM");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   515
                return -1;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   516
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   517
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   518
        cmP->isDefaultCM = ((*env)->IsSameObject(env, s_jdefCM, jcmodel));
90ce3da70b43 Initial load
duke
parents:
diff changeset
   519
        cmP->isDefaultCompatCM = cmP->isDefaultCM;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   520
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   521
18258
ab42088d6e10 8012597: Better image channel verification
bae
parents: 16868
diff changeset
   522
    /* check whether image attributes correspond to default cm */
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   523
    if (cmP->isDefaultCompatCM) {
18258
ab42088d6e10 8012597: Better image channel verification
bae
parents: 16868
diff changeset
   524
        if (cmP->csType != java_awt_color_ColorSpace_TYPE_RGB ||
ab42088d6e10 8012597: Better image channel verification
bae
parents: 16868
diff changeset
   525
            !cmP->is_sRGB)
ab42088d6e10 8012597: Better image channel verification
bae
parents: 16868
diff changeset
   526
        {
ab42088d6e10 8012597: Better image channel verification
bae
parents: 16868
diff changeset
   527
            return -1;
ab42088d6e10 8012597: Better image channel verification
bae
parents: 16868
diff changeset
   528
        }
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   529
18258
ab42088d6e10 8012597: Better image channel verification
bae
parents: 16868
diff changeset
   530
        for (i = 0; i < cmP->numComponents; i++) {
ab42088d6e10 8012597: Better image channel verification
bae
parents: 16868
diff changeset
   531
            if (cmP->nBits[i] != 8) {
ab42088d6e10 8012597: Better image channel verification
bae
parents: 16868
diff changeset
   532
                return -1;
ab42088d6e10 8012597: Better image channel verification
bae
parents: 16868
diff changeset
   533
            }
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   534
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   535
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   536
18258
ab42088d6e10 8012597: Better image channel verification
bae
parents: 16868
diff changeset
   537
    /* Get index color model attributes */
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   538
    if (imageType == java_awt_image_BufferedImage_TYPE_BYTE_INDEXED ||
18258
ab42088d6e10 8012597: Better image channel verification
bae
parents: 16868
diff changeset
   539
        cmP->cmType == INDEX_CM_TYPE)
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   540
    {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   541
        cmP->transIdx = (*env)->GetIntField(env, jcmodel, g_ICMtransIdxID);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   542
        cmP->mapSize = (*env)->GetIntField(env, jcmodel, g_ICMmapSizeID);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   543
        cmP->jrgb    = (*env)->GetObjectField(env, jcmodel, g_ICMrgbID);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   544
        if (cmP->transIdx == -1) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   545
            /* Need to find the transparent index */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   546
            int *rgb = (int *) (*env)->GetPrimitiveArrayCritical(env,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   547
                                                                 cmP->jrgb,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   548
                                                                 NULL);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   549
            if (rgb == NULL) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   550
                return -1;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   551
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   552
            for (i=0; i < cmP->mapSize; i++) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   553
                if ((rgb[i]&0xff000000) == 0) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   554
                    cmP->transIdx = i;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   555
                    break;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   556
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   557
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   558
            (*env)->ReleasePrimitiveArrayCritical(env, cmP->jrgb, rgb,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   559
                                                  JNI_ABORT);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   560
            if (cmP->transIdx == -1) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   561
                /* Now what? No transparent pixel... */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   562
                cmP->transIdx = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   563
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   564
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   565
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   566
90ce3da70b43 Initial load
duke
parents:
diff changeset
   567
    return 1;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   568
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   569
90ce3da70b43 Initial load
duke
parents:
diff changeset
   570
void awt_freeParsedRaster(RasterS_t *rasterP, int freeRasterP) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   571
    if (rasterP->chanOffsets) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   572
        free((void *) rasterP->chanOffsets);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   573
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   574
90ce3da70b43 Initial load
duke
parents:
diff changeset
   575
    if (freeRasterP) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   576
        free((void *) rasterP);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   577
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   578
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   579
90ce3da70b43 Initial load
duke
parents:
diff changeset
   580
void awt_freeParsedImage(BufImageS_t *imageP, int freeImageP) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   581
    if (imageP->hints.colorOrder) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   582
        free ((void *) imageP->hints.colorOrder);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   583
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   584
90ce3da70b43 Initial load
duke
parents:
diff changeset
   585
    if (imageP->cmodel.nBits) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   586
        free ((void *) imageP->cmodel.nBits);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   587
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   588
90ce3da70b43 Initial load
duke
parents:
diff changeset
   589
    /* Free the raster */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   590
    awt_freeParsedRaster(&imageP->raster, FALSE);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   591
90ce3da70b43 Initial load
duke
parents:
diff changeset
   592
    if (freeImageP) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   593
        free((void *) imageP);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   594
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   595
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   596
15502
6aad6647696c 8004801: The image of BufferedImage.TYPE_INT_ARGB is blank.
bae
parents: 9035
diff changeset
   597
static void
6aad6647696c 8004801: The image of BufferedImage.TYPE_INT_ARGB is blank.
bae
parents: 9035
diff changeset
   598
awt_getBIColorOrder(int type, int *colorOrder) {
6aad6647696c 8004801: The image of BufferedImage.TYPE_INT_ARGB is blank.
bae
parents: 9035
diff changeset
   599
    switch(type) {
6aad6647696c 8004801: The image of BufferedImage.TYPE_INT_ARGB is blank.
bae
parents: 9035
diff changeset
   600
        case java_awt_image_BufferedImage_TYPE_INT_ARGB:
6aad6647696c 8004801: The image of BufferedImage.TYPE_INT_ARGB is blank.
bae
parents: 9035
diff changeset
   601
        case java_awt_image_BufferedImage_TYPE_INT_ARGB_PRE:
6aad6647696c 8004801: The image of BufferedImage.TYPE_INT_ARGB is blank.
bae
parents: 9035
diff changeset
   602
#ifdef _LITTLE_ENDIAN
6aad6647696c 8004801: The image of BufferedImage.TYPE_INT_ARGB is blank.
bae
parents: 9035
diff changeset
   603
            colorOrder[0] = 2;
6aad6647696c 8004801: The image of BufferedImage.TYPE_INT_ARGB is blank.
bae
parents: 9035
diff changeset
   604
            colorOrder[1] = 1;
6aad6647696c 8004801: The image of BufferedImage.TYPE_INT_ARGB is blank.
bae
parents: 9035
diff changeset
   605
            colorOrder[2] = 0;
6aad6647696c 8004801: The image of BufferedImage.TYPE_INT_ARGB is blank.
bae
parents: 9035
diff changeset
   606
            colorOrder[3] = 3;
6aad6647696c 8004801: The image of BufferedImage.TYPE_INT_ARGB is blank.
bae
parents: 9035
diff changeset
   607
#else
6aad6647696c 8004801: The image of BufferedImage.TYPE_INT_ARGB is blank.
bae
parents: 9035
diff changeset
   608
            colorOrder[0] = 1;
6aad6647696c 8004801: The image of BufferedImage.TYPE_INT_ARGB is blank.
bae
parents: 9035
diff changeset
   609
            colorOrder[1] = 2;
6aad6647696c 8004801: The image of BufferedImage.TYPE_INT_ARGB is blank.
bae
parents: 9035
diff changeset
   610
            colorOrder[2] = 3;
6aad6647696c 8004801: The image of BufferedImage.TYPE_INT_ARGB is blank.
bae
parents: 9035
diff changeset
   611
            colorOrder[3] = 0;
6aad6647696c 8004801: The image of BufferedImage.TYPE_INT_ARGB is blank.
bae
parents: 9035
diff changeset
   612
#endif
6aad6647696c 8004801: The image of BufferedImage.TYPE_INT_ARGB is blank.
bae
parents: 9035
diff changeset
   613
            break;
6aad6647696c 8004801: The image of BufferedImage.TYPE_INT_ARGB is blank.
bae
parents: 9035
diff changeset
   614
        case java_awt_image_BufferedImage_TYPE_INT_BGR:
6aad6647696c 8004801: The image of BufferedImage.TYPE_INT_ARGB is blank.
bae
parents: 9035
diff changeset
   615
#ifdef _LITTLE_ENDIAN
6aad6647696c 8004801: The image of BufferedImage.TYPE_INT_ARGB is blank.
bae
parents: 9035
diff changeset
   616
            colorOrder[0] = 0;
6aad6647696c 8004801: The image of BufferedImage.TYPE_INT_ARGB is blank.
bae
parents: 9035
diff changeset
   617
            colorOrder[1] = 1;
6aad6647696c 8004801: The image of BufferedImage.TYPE_INT_ARGB is blank.
bae
parents: 9035
diff changeset
   618
            colorOrder[2] = 2;
6aad6647696c 8004801: The image of BufferedImage.TYPE_INT_ARGB is blank.
bae
parents: 9035
diff changeset
   619
#else
6aad6647696c 8004801: The image of BufferedImage.TYPE_INT_ARGB is blank.
bae
parents: 9035
diff changeset
   620
            colorOrder[0] = 3;
6aad6647696c 8004801: The image of BufferedImage.TYPE_INT_ARGB is blank.
bae
parents: 9035
diff changeset
   621
            colorOrder[1] = 2;
6aad6647696c 8004801: The image of BufferedImage.TYPE_INT_ARGB is blank.
bae
parents: 9035
diff changeset
   622
            colorOrder[2] = 1;
6aad6647696c 8004801: The image of BufferedImage.TYPE_INT_ARGB is blank.
bae
parents: 9035
diff changeset
   623
#endif
6aad6647696c 8004801: The image of BufferedImage.TYPE_INT_ARGB is blank.
bae
parents: 9035
diff changeset
   624
            break;
6aad6647696c 8004801: The image of BufferedImage.TYPE_INT_ARGB is blank.
bae
parents: 9035
diff changeset
   625
        case java_awt_image_BufferedImage_TYPE_INT_RGB:
6aad6647696c 8004801: The image of BufferedImage.TYPE_INT_ARGB is blank.
bae
parents: 9035
diff changeset
   626
#ifdef _LITTLE_ENDIAN
6aad6647696c 8004801: The image of BufferedImage.TYPE_INT_ARGB is blank.
bae
parents: 9035
diff changeset
   627
            colorOrder[0] = 2;
6aad6647696c 8004801: The image of BufferedImage.TYPE_INT_ARGB is blank.
bae
parents: 9035
diff changeset
   628
            colorOrder[1] = 1;
6aad6647696c 8004801: The image of BufferedImage.TYPE_INT_ARGB is blank.
bae
parents: 9035
diff changeset
   629
            colorOrder[2] = 0;
6aad6647696c 8004801: The image of BufferedImage.TYPE_INT_ARGB is blank.
bae
parents: 9035
diff changeset
   630
#else
6aad6647696c 8004801: The image of BufferedImage.TYPE_INT_ARGB is blank.
bae
parents: 9035
diff changeset
   631
            colorOrder[0] = 1;
6aad6647696c 8004801: The image of BufferedImage.TYPE_INT_ARGB is blank.
bae
parents: 9035
diff changeset
   632
            colorOrder[1] = 2;
6aad6647696c 8004801: The image of BufferedImage.TYPE_INT_ARGB is blank.
bae
parents: 9035
diff changeset
   633
            colorOrder[2] = 3;
6aad6647696c 8004801: The image of BufferedImage.TYPE_INT_ARGB is blank.
bae
parents: 9035
diff changeset
   634
#endif
6aad6647696c 8004801: The image of BufferedImage.TYPE_INT_ARGB is blank.
bae
parents: 9035
diff changeset
   635
            break;
6aad6647696c 8004801: The image of BufferedImage.TYPE_INT_ARGB is blank.
bae
parents: 9035
diff changeset
   636
        case java_awt_image_BufferedImage_TYPE_4BYTE_ABGR:
6aad6647696c 8004801: The image of BufferedImage.TYPE_INT_ARGB is blank.
bae
parents: 9035
diff changeset
   637
        case java_awt_image_BufferedImage_TYPE_4BYTE_ABGR_PRE:
6aad6647696c 8004801: The image of BufferedImage.TYPE_INT_ARGB is blank.
bae
parents: 9035
diff changeset
   638
            colorOrder[0] = 3;
6aad6647696c 8004801: The image of BufferedImage.TYPE_INT_ARGB is blank.
bae
parents: 9035
diff changeset
   639
            colorOrder[1] = 2;
6aad6647696c 8004801: The image of BufferedImage.TYPE_INT_ARGB is blank.
bae
parents: 9035
diff changeset
   640
            colorOrder[2] = 1;
6aad6647696c 8004801: The image of BufferedImage.TYPE_INT_ARGB is blank.
bae
parents: 9035
diff changeset
   641
            colorOrder[3] = 0;
6aad6647696c 8004801: The image of BufferedImage.TYPE_INT_ARGB is blank.
bae
parents: 9035
diff changeset
   642
            break;
6aad6647696c 8004801: The image of BufferedImage.TYPE_INT_ARGB is blank.
bae
parents: 9035
diff changeset
   643
        case java_awt_image_BufferedImage_TYPE_3BYTE_BGR:
6aad6647696c 8004801: The image of BufferedImage.TYPE_INT_ARGB is blank.
bae
parents: 9035
diff changeset
   644
            colorOrder[0] = 2;
6aad6647696c 8004801: The image of BufferedImage.TYPE_INT_ARGB is blank.
bae
parents: 9035
diff changeset
   645
            colorOrder[1] = 1;
6aad6647696c 8004801: The image of BufferedImage.TYPE_INT_ARGB is blank.
bae
parents: 9035
diff changeset
   646
            colorOrder[2] = 0;
6aad6647696c 8004801: The image of BufferedImage.TYPE_INT_ARGB is blank.
bae
parents: 9035
diff changeset
   647
            break;
6aad6647696c 8004801: The image of BufferedImage.TYPE_INT_ARGB is blank.
bae
parents: 9035
diff changeset
   648
        case java_awt_image_BufferedImage_TYPE_USHORT_565_RGB:
6aad6647696c 8004801: The image of BufferedImage.TYPE_INT_ARGB is blank.
bae
parents: 9035
diff changeset
   649
        case java_awt_image_BufferedImage_TYPE_USHORT_555_RGB:
6aad6647696c 8004801: The image of BufferedImage.TYPE_INT_ARGB is blank.
bae
parents: 9035
diff changeset
   650
            colorOrder[0] = 0;
6aad6647696c 8004801: The image of BufferedImage.TYPE_INT_ARGB is blank.
bae
parents: 9035
diff changeset
   651
            colorOrder[1] = 1;
6aad6647696c 8004801: The image of BufferedImage.TYPE_INT_ARGB is blank.
bae
parents: 9035
diff changeset
   652
            colorOrder[2] = 2;
6aad6647696c 8004801: The image of BufferedImage.TYPE_INT_ARGB is blank.
bae
parents: 9035
diff changeset
   653
            break;
6aad6647696c 8004801: The image of BufferedImage.TYPE_INT_ARGB is blank.
bae
parents: 9035
diff changeset
   654
        case java_awt_image_BufferedImage_TYPE_BYTE_GRAY:
6aad6647696c 8004801: The image of BufferedImage.TYPE_INT_ARGB is blank.
bae
parents: 9035
diff changeset
   655
        case java_awt_image_BufferedImage_TYPE_USHORT_GRAY:
6aad6647696c 8004801: The image of BufferedImage.TYPE_INT_ARGB is blank.
bae
parents: 9035
diff changeset
   656
        case java_awt_image_BufferedImage_TYPE_BYTE_BINARY:
6aad6647696c 8004801: The image of BufferedImage.TYPE_INT_ARGB is blank.
bae
parents: 9035
diff changeset
   657
        case java_awt_image_BufferedImage_TYPE_BYTE_INDEXED:
6aad6647696c 8004801: The image of BufferedImage.TYPE_INT_ARGB is blank.
bae
parents: 9035
diff changeset
   658
            colorOrder[0] = 0;
6aad6647696c 8004801: The image of BufferedImage.TYPE_INT_ARGB is blank.
bae
parents: 9035
diff changeset
   659
            break;
6aad6647696c 8004801: The image of BufferedImage.TYPE_INT_ARGB is blank.
bae
parents: 9035
diff changeset
   660
    }
6aad6647696c 8004801: The image of BufferedImage.TYPE_INT_ARGB is blank.
bae
parents: 9035
diff changeset
   661
}
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   662
90ce3da70b43 Initial load
duke
parents:
diff changeset
   663
static int
90ce3da70b43 Initial load
duke
parents:
diff changeset
   664
setHints(JNIEnv *env, BufImageS_t *imageP) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   665
    HintS_t *hintP = &imageP->hints;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   666
    RasterS_t *rasterP = &imageP->raster;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   667
    ColorModelS_t *cmodelP = &imageP->cmodel;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   668
    int imageType = imageP->imageType;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   669
18258
ab42088d6e10 8012597: Better image channel verification
bae
parents: 16868
diff changeset
   670
    // check whether raster and color model are compatible
ab42088d6e10 8012597: Better image channel verification
bae
parents: 16868
diff changeset
   671
    if (cmodelP->numComponents != rasterP->numBands) {
ab42088d6e10 8012597: Better image channel verification
bae
parents: 16868
diff changeset
   672
        if (cmodelP->cmType != INDEX_CM_TYPE) {
ab42088d6e10 8012597: Better image channel verification
bae
parents: 16868
diff changeset
   673
            return -1;
ab42088d6e10 8012597: Better image channel verification
bae
parents: 16868
diff changeset
   674
        }
ab42088d6e10 8012597: Better image channel verification
bae
parents: 16868
diff changeset
   675
    }
ab42088d6e10 8012597: Better image channel verification
bae
parents: 16868
diff changeset
   676
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   677
    hintP->numChans = imageP->cmodel.numComponents;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   678
    hintP->colorOrder = NULL;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   679
    if (SAFE_TO_ALLOC_2(hintP->numChans, sizeof(int))) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   680
        hintP->colorOrder = (int *)malloc(hintP->numChans * sizeof(int));
90ce3da70b43 Initial load
duke
parents:
diff changeset
   681
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   682
    if (hintP->colorOrder == NULL) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   683
        JNU_ThrowOutOfMemoryError(env, "Out of memory");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   684
        return -1;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   685
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   686
    if (imageType != java_awt_image_BufferedImage_TYPE_CUSTOM) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   687
        awt_getBIColorOrder(imageType, hintP->colorOrder);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   688
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   689
    if (imageType == java_awt_image_BufferedImage_TYPE_INT_ARGB ||
90ce3da70b43 Initial load
duke
parents:
diff changeset
   690
        imageType == java_awt_image_BufferedImage_TYPE_INT_ARGB_PRE ||
90ce3da70b43 Initial load
duke
parents:
diff changeset
   691
        imageType == java_awt_image_BufferedImage_TYPE_INT_RGB)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   692
    {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   693
        hintP->channelOffset = rasterP->chanOffsets[0];
90ce3da70b43 Initial load
duke
parents:
diff changeset
   694
        /* These hints are #bytes  */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   695
        hintP->dataOffset    = hintP->channelOffset*rasterP->dataSize;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   696
        hintP->sStride = rasterP->scanlineStride*rasterP->dataSize;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   697
        hintP->pStride = rasterP->pixelStride*rasterP->dataSize;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   698
        hintP->packing = BYTE_INTERLEAVED;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   699
    } else if (imageType ==java_awt_image_BufferedImage_TYPE_4BYTE_ABGR ||
90ce3da70b43 Initial load
duke
parents:
diff changeset
   700
               imageType==java_awt_image_BufferedImage_TYPE_4BYTE_ABGR_PRE||
90ce3da70b43 Initial load
duke
parents:
diff changeset
   701
               imageType == java_awt_image_BufferedImage_TYPE_3BYTE_BGR ||
90ce3da70b43 Initial load
duke
parents:
diff changeset
   702
               imageType == java_awt_image_BufferedImage_TYPE_INT_BGR)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   703
    {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   704
        if (imageType == java_awt_image_BufferedImage_TYPE_INT_BGR) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   705
            hintP->channelOffset = rasterP->chanOffsets[0];
90ce3da70b43 Initial load
duke
parents:
diff changeset
   706
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   707
        else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   708
            hintP->channelOffset = rasterP->chanOffsets[hintP->numChans-1];
90ce3da70b43 Initial load
duke
parents:
diff changeset
   709
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   710
        hintP->dataOffset    = hintP->channelOffset*rasterP->dataSize;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   711
        hintP->sStride = rasterP->scanlineStride*rasterP->dataSize;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   712
        hintP->pStride = rasterP->pixelStride*rasterP->dataSize;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   713
        hintP->packing = BYTE_INTERLEAVED;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   714
    } else if (imageType==java_awt_image_BufferedImage_TYPE_USHORT_565_RGB ||
90ce3da70b43 Initial load
duke
parents:
diff changeset
   715
               imageType==java_awt_image_BufferedImage_TYPE_USHORT_555_RGB) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   716
        hintP->needToExpand  = TRUE;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   717
        hintP->expandToNbits = 8;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   718
        hintP->packing = PACKED_SHORT_INTER;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   719
    } else if (cmodelP->cmType == INDEX_CM_TYPE) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   720
        int i;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   721
        hintP->numChans = 1;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   722
        hintP->channelOffset = rasterP->chanOffsets[0];
90ce3da70b43 Initial load
duke
parents:
diff changeset
   723
        hintP->dataOffset    = hintP->channelOffset*rasterP->dataSize;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   724
        hintP->sStride = rasterP->scanlineStride*rasterP->dataSize;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   725
        hintP->pStride = rasterP->pixelStride*rasterP->dataSize;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   726
        switch(rasterP->dataType ) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   727
        case BYTE_DATA_TYPE:
90ce3da70b43 Initial load
duke
parents:
diff changeset
   728
            if (rasterP->rasterType == PACKED_RASTER_TYPE) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   729
                hintP->needToExpand = TRUE;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   730
                hintP->expandToNbits = 8;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   731
                hintP->packing = BYTE_PACKED_BAND;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   732
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   733
            else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   734
                hintP->packing = BYTE_SINGLE_BAND;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   735
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   736
            break;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   737
        case SHORT_DATA_TYPE:
90ce3da70b43 Initial load
duke
parents:
diff changeset
   738
            hintP->packing = SHORT_SINGLE_BAND;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   739
            break;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   740
        case INT_DATA_TYPE:
90ce3da70b43 Initial load
duke
parents:
diff changeset
   741
        default:
90ce3da70b43 Initial load
duke
parents:
diff changeset
   742
            hintP->packing = UNKNOWN_PACKING;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   743
            break;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   744
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   745
        for (i=0; i < hintP->numChans; i++) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   746
            hintP->colorOrder[i] = i;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   747
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   748
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   749
    else if (cmodelP->cmType == COMPONENT_CM_TYPE) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   750
        /* Figure out if it is interleaved */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   751
        int bits=1;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   752
        int i;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   753
        int low = rasterP->chanOffsets[0];
90ce3da70b43 Initial load
duke
parents:
diff changeset
   754
        int diff;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   755
        int banded = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   756
        for (i=1; i < hintP->numChans; i++) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   757
            if (rasterP->chanOffsets[i] < low) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   758
                low = rasterP->chanOffsets[i];
90ce3da70b43 Initial load
duke
parents:
diff changeset
   759
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   760
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   761
        for (i=1; i < hintP->numChans; i++) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   762
            diff = rasterP->chanOffsets[i]-low;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   763
            if (diff < hintP->numChans) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   764
                if (bits & (1<<diff)) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   765
                    /* Overlapping samples */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   766
                    /* Could just copy */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   767
                    return -1;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   768
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   769
                bits |= (1<<diff);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   770
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   771
            else if (diff >= rasterP->width) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   772
                banded = 1;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   773
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   774
            /* Ignore the case if bands are overlapping */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   775
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   776
        hintP->channelOffset = low;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   777
        hintP->dataOffset    = low*rasterP->dataSize;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   778
        hintP->sStride       = rasterP->scanlineStride*rasterP->dataSize;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   779
        hintP->pStride       = rasterP->pixelStride*rasterP->dataSize;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   780
        switch(rasterP->dataType) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   781
        case BYTE_DATA_TYPE:
90ce3da70b43 Initial load
duke
parents:
diff changeset
   782
            hintP->packing = BYTE_COMPONENTS;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   783
            break;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   784
        case SHORT_DATA_TYPE:
90ce3da70b43 Initial load
duke
parents:
diff changeset
   785
            hintP->packing = SHORT_COMPONENTS;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   786
            break;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   787
        default:
90ce3da70b43 Initial load
duke
parents:
diff changeset
   788
            /* Don't handle any other case */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   789
            return -1;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   790
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   791
        if (bits == ((1<<hintP->numChans)-1)) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   792
            hintP->packing |= INTERLEAVED;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   793
            for (i=0; i < hintP->numChans; i++) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   794
                hintP->colorOrder[rasterP->chanOffsets[i]-low] = i;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   795
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   796
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   797
        else if (banded == 1) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   798
            int bandSize = rasterP->width*rasterP->height;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   799
            hintP->packing |= BANDED;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   800
            for (i=0; i < hintP->numChans; i++) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   801
                /* REMIND: Not necessarily correct */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   802
                hintP->colorOrder[(rasterP->chanOffsets[i]-low)%bandSize] = i;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   803
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   804
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   805
        else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   806
            return -1;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   807
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   808
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   809
    else if (cmodelP->cmType == DIRECT_CM_TYPE || cmodelP->cmType == PACKED_CM_TYPE) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   810
        int i;
16096
a4397a7163e3 8002325: Improve management of images
bae
parents: 16093
diff changeset
   811
a4397a7163e3 8002325: Improve management of images
bae
parents: 16093
diff changeset
   812
        /* do some sanity check first: make sure that
a4397a7163e3 8002325: Improve management of images
bae
parents: 16093
diff changeset
   813
         * - sample model is SinglePixelPackedSampleModel
a4397a7163e3 8002325: Improve management of images
bae
parents: 16093
diff changeset
   814
         * - number of bands in the raster corresponds to the number
a4397a7163e3 8002325: Improve management of images
bae
parents: 16093
diff changeset
   815
         *   of color components in the color model
a4397a7163e3 8002325: Improve management of images
bae
parents: 16093
diff changeset
   816
         */
a4397a7163e3 8002325: Improve management of images
bae
parents: 16093
diff changeset
   817
        if (!rasterP->sppsm.isUsed ||
a4397a7163e3 8002325: Improve management of images
bae
parents: 16093
diff changeset
   818
            rasterP->numBands != cmodelP->numComponents)
a4397a7163e3 8002325: Improve management of images
bae
parents: 16093
diff changeset
   819
        {
a4397a7163e3 8002325: Improve management of images
bae
parents: 16093
diff changeset
   820
            /* given raster is not compatible with the color model,
a4397a7163e3 8002325: Improve management of images
bae
parents: 16093
diff changeset
   821
             * so the operation has to be aborted.
a4397a7163e3 8002325: Improve management of images
bae
parents: 16093
diff changeset
   822
             */
a4397a7163e3 8002325: Improve management of images
bae
parents: 16093
diff changeset
   823
            return -1;
a4397a7163e3 8002325: Improve management of images
bae
parents: 16093
diff changeset
   824
        }
a4397a7163e3 8002325: Improve management of images
bae
parents: 16093
diff changeset
   825
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   826
        if (cmodelP->maxNbits > 8) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   827
            hintP->needToExpand = TRUE;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   828
            hintP->expandToNbits = cmodelP->maxNbits;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   829
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   830
        else if (rasterP->sppsm.offsets != NULL) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   831
            for (i=0; i < rasterP->numBands; i++) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   832
                if (!(rasterP->sppsm.offsets[i] % 8)) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   833
                    hintP->needToExpand  = TRUE;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   834
                    hintP->expandToNbits = 8;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   835
                    break;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   836
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   837
                else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   838
                    hintP->colorOrder[i] = rasterP->sppsm.offsets[i]>>3;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   839
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   840
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   841
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   842
90ce3da70b43 Initial load
duke
parents:
diff changeset
   843
        hintP->channelOffset = rasterP->chanOffsets[0];
90ce3da70b43 Initial load
duke
parents:
diff changeset
   844
        hintP->dataOffset    = hintP->channelOffset*rasterP->dataSize;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   845
        hintP->sStride = rasterP->scanlineStride*rasterP->dataSize;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   846
        hintP->pStride = rasterP->pixelStride*rasterP->dataSize;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   847
        if (hintP->needToExpand) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   848
            switch(rasterP->dataType) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   849
            case BYTE_DATA_TYPE:
90ce3da70b43 Initial load
duke
parents:
diff changeset
   850
                hintP->packing = PACKED_BYTE_INTER;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   851
                break;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   852
            case SHORT_DATA_TYPE:
90ce3da70b43 Initial load
duke
parents:
diff changeset
   853
                hintP->packing = PACKED_SHORT_INTER;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   854
                break;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   855
            case INT_DATA_TYPE:
90ce3da70b43 Initial load
duke
parents:
diff changeset
   856
                hintP->packing = PACKED_INT_INTER;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   857
                break;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   858
            default:
90ce3da70b43 Initial load
duke
parents:
diff changeset
   859
                /* Don't know what it is */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   860
                return -1;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   861
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   862
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   863
        else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   864
            hintP->packing = BYTE_INTERLEAVED;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   865
90ce3da70b43 Initial load
duke
parents:
diff changeset
   866
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   867
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   868
    else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   869
        /* REMIND: Need to handle more cases */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   870
        return -1;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   871
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   872
90ce3da70b43 Initial load
duke
parents:
diff changeset
   873
    return 1;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   874
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   875
90ce3da70b43 Initial load
duke
parents:
diff changeset
   876
#define MAX_TO_GRAB (10240)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   877
20799
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
   878
typedef union {
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
   879
    void *pv;
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
   880
    unsigned char *pb;
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
   881
    unsigned short *ps;
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
   882
} PixelData_t;
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
   883
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
   884
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
   885
int awt_getPixels(JNIEnv *env, RasterS_t *rasterP, void *bufferP) {
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
   886
    const int w = rasterP->width;
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
   887
    const int h = rasterP->height;
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
   888
    const int numBands = rasterP->numBands;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   889
    int y;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   890
    int i;
20799
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
   891
    int maxLines;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   892
    jobject jsm;
20799
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
   893
    int off = 0;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   894
    jarray jdata = NULL;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   895
    jobject jdatabuffer;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   896
    int *dataP;
20799
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
   897
    int maxSamples;
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
   898
    PixelData_t p;
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
   899
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
   900
    if (bufferP == NULL) {
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
   901
        return -1;
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
   902
    }
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
   903
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
   904
    if (rasterP->dataType != BYTE_DATA_TYPE &&
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
   905
        rasterP->dataType != SHORT_DATA_TYPE)
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
   906
    {
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
   907
        return -1;
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
   908
    }
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
   909
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
   910
    p.pv = bufferP;
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
   911
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
   912
    if (!SAFE_TO_MULT(w, numBands)) {
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
   913
        return -1;
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
   914
    }
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
   915
    maxSamples = w * numBands;
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
   916
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
   917
    maxLines = maxSamples > MAX_TO_GRAB ? 1 : (MAX_TO_GRAB / maxSamples);
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
   918
    if (maxLines > h) {
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
   919
        maxLines = h;
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
   920
    }
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
   921
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
   922
    if (!SAFE_TO_MULT(maxSamples, maxLines)) {
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
   923
        return -1;
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
   924
    }
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
   925
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
   926
    maxSamples *= maxLines;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   927
90ce3da70b43 Initial load
duke
parents:
diff changeset
   928
    jsm = (*env)->GetObjectField(env, rasterP->jraster, g_RasterSampleModelID);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   929
    jdatabuffer = (*env)->GetObjectField(env, rasterP->jraster,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   930
                                         g_RasterDataBufferID);
20799
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
   931
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
   932
    jdata = (*env)->NewIntArray(env, maxSamples);
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   933
    if (JNU_IsNull(env, jdata)) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   934
        JNU_ThrowOutOfMemoryError(env, "Out of Memory");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   935
        return -1;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   936
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   937
20799
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
   938
    for (y = 0; y < h; y += maxLines) {
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
   939
        if (y + maxLines > h) {
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
   940
            maxLines = h - y;
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
   941
            maxSamples = w * numBands * maxLines;
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
   942
        }
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
   943
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
   944
        (*env)->CallObjectMethod(env, jsm, g_SMGetPixelsMID,
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
   945
                                 0, y, w,
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
   946
                                 maxLines, jdata, jdatabuffer);
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
   947
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
   948
        if ((*env)->ExceptionOccurred(env)) {
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   949
            (*env)->DeleteLocalRef(env, jdata);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   950
            return -1;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   951
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   952
20799
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
   953
        dataP = (int *) (*env)->GetPrimitiveArrayCritical(env, jdata,
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
   954
                                                          NULL);
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
   955
        if (dataP == NULL) {
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
   956
            (*env)->DeleteLocalRef(env, jdata);
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
   957
            return -1;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   958
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   959
20799
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
   960
        switch (rasterP->dataType) {
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
   961
        case BYTE_DATA_TYPE:
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
   962
            for (i = 0; i < maxSamples; i ++) {
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
   963
                p.pb[off++] = (unsigned char) dataP[i];
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
   964
            }
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
   965
            break;
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
   966
        case SHORT_DATA_TYPE:
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
   967
            for (i = 0; i < maxSamples; i ++) {
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
   968
                p.ps[off++] = (unsigned short) dataP[i];
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
   969
            }
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
   970
            break;
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
   971
        }
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
   972
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
   973
        (*env)->ReleasePrimitiveArrayCritical(env, jdata, dataP,
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
   974
                                              JNI_ABORT);
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   975
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   976
    (*env)->DeleteLocalRef(env, jdata);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   977
20799
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
   978
    return 1;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   979
}
20799
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
   980
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
   981
int awt_setPixels(JNIEnv *env, RasterS_t *rasterP, void *bufferP) {
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
   982
    const int w = rasterP->width;
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
   983
    const int h = rasterP->height;
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
   984
    const int numBands = rasterP->numBands;
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
   985
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   986
    int y;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   987
    int i;
20799
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
   988
    int maxLines;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   989
    jobject jsm;
20799
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
   990
    int off = 0;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   991
    jarray jdata = NULL;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   992
    jobject jdatabuffer;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   993
    int *dataP;
20799
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
   994
    int maxSamples;
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
   995
    PixelData_t p;
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
   996
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
   997
    if (bufferP == NULL) {
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
   998
        return -1;
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
   999
    }
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
  1000
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
  1001
    if (rasterP->dataType != BYTE_DATA_TYPE &&
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
  1002
        rasterP->dataType != SHORT_DATA_TYPE)
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
  1003
    {
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
  1004
        return -1;
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
  1005
    }
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
  1006
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
  1007
    p.pv = bufferP;
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
  1008
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
  1009
    if (!SAFE_TO_MULT(w, numBands)) {
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
  1010
        return -1;
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
  1011
    }
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
  1012
    maxSamples = w * numBands;
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
  1013
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
  1014
    maxLines = maxSamples > MAX_TO_GRAB ? 1 : (MAX_TO_GRAB / maxSamples);
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
  1015
    if (maxLines > h) {
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
  1016
        maxLines = h;
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
  1017
    }
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
  1018
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
  1019
    if (!SAFE_TO_MULT(maxSamples, maxLines)) {
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
  1020
        return -1;
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
  1021
    }
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
  1022
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
  1023
    maxSamples *= maxLines;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1024
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1025
    jsm = (*env)->GetObjectField(env, rasterP->jraster, g_RasterSampleModelID);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1026
    jdatabuffer = (*env)->GetObjectField(env, rasterP->jraster,
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1027
                                         g_RasterDataBufferID);
20799
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
  1028
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
  1029
    jdata = (*env)->NewIntArray(env, maxSamples);
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1030
    if (JNU_IsNull(env, jdata)) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1031
        JNU_ThrowOutOfMemoryError(env, "Out of Memory");
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1032
        return -1;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1033
    }
20799
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
  1034
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
  1035
    for (y = 0; y < h; y += maxLines) {
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
  1036
        if (y + maxLines > h) {
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
  1037
            maxLines = h - y;
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
  1038
            maxSamples = w * numBands * maxLines;
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
  1039
        }
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
  1040
        dataP = (int *) (*env)->GetPrimitiveArrayCritical(env, jdata,
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
  1041
                                                          NULL);
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
  1042
        if (dataP == NULL) {
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1043
            (*env)->DeleteLocalRef(env, jdata);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1044
            return -1;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1045
        }
20799
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
  1046
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
  1047
        switch (rasterP->dataType) {
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
  1048
        case BYTE_DATA_TYPE:
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
  1049
            for (i = 0; i < maxSamples; i ++) {
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
  1050
                dataP[i] = p.pb[off++];
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1051
            }
20799
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
  1052
            break;
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
  1053
        case SHORT_DATA_TYPE:
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
  1054
            for (i = 0; i < maxSamples; i ++) {
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
  1055
                dataP[i] = p.ps[off++];
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1056
            }
20799
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
  1057
            break;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1058
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1059
20799
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
  1060
        (*env)->ReleasePrimitiveArrayCritical(env, jdata, dataP,
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
  1061
                                              JNI_ABORT);
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
  1062
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
  1063
        (*env)->CallVoidMethod(env, jsm, g_SMSetPixelsMID,
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
  1064
                               0, y, w,
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
  1065
                               maxLines, jdata, jdatabuffer);
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
  1066
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
  1067
        if ((*env)->ExceptionOccurred(env)) {
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
  1068
            (*env)->DeleteLocalRef(env, jdata);
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
  1069
            return -1;
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
  1070
        }
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1071
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1072
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1073
    (*env)->DeleteLocalRef(env, jdata);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1074
20799
4820649a142d 8014093: Improve parsing of images
bae
parents: 18258
diff changeset
  1075
    return 1;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1076
}