jdk/src/share/native/sun/java2d/cmm/lcms/LCMS.c
author bae
Thu, 01 Jul 2010 12:04:14 +0400
changeset 6868 f9131565859e
parent 5506 202f599c92aa
child 6879 13924eecc282
permissions -rw-r--r--
6963489: ZDI-CAN-803: Sun JRE ICC Profile Device Information Tag Remote Code Execution Vulnerability Reviewed-by: prr
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
     1
/*
5506
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 2801
diff changeset
     2
 * Copyright (c) 2007, 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: 2801
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: 2801
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: 2801
diff changeset
    21
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 2801
diff changeset
    22
 * or visit www.oracle.com if you need additional information or have any
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 2801
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 "sun_java2d_cmm_lcms_LCMS.h"
90ce3da70b43 Initial load
duke
parents:
diff changeset
    28
#include "jni_util.h"
90ce3da70b43 Initial load
duke
parents:
diff changeset
    29
#include "Trace.h"
90ce3da70b43 Initial load
duke
parents:
diff changeset
    30
#include "Disposer.h"
90ce3da70b43 Initial load
duke
parents:
diff changeset
    31
#include "lcms.h"
90ce3da70b43 Initial load
duke
parents:
diff changeset
    32
2392
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
    33
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
    34
#define ALIGNLONG(x) (((x)+3) & ~(3))         // Aligns to DWORD boundary
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
    35
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
    36
#ifdef USE_BIG_ENDIAN
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
    37
#define AdjustEndianess32(a)
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
    38
#else
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
    39
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
    40
static
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
    41
void AdjustEndianess32(LPBYTE pByte)
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
    42
{
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
    43
    BYTE temp1;
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
    44
    BYTE temp2;
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
    45
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
    46
    temp1 = *pByte++;
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
    47
    temp2 = *pByte++;
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
    48
    *(pByte-1) = *pByte;
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
    49
    *pByte++ = temp2;
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
    50
    *(pByte-3) = *pByte;
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
    51
    *pByte = temp1;
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
    52
}
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
    53
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
    54
#endif
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
    55
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
    56
// Transports to properly encoded values - note that icc profiles does use
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
    57
// big endian notation.
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
    58
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
    59
static
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
    60
icInt32Number TransportValue32(icInt32Number Value)
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
    61
{
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
    62
    icInt32Number Temp = Value;
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
    63
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
    64
    AdjustEndianess32((LPBYTE) &Temp);
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
    65
    return Temp;
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
    66
}
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
    67
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    68
#define SigMake(a,b,c,d) \
90ce3da70b43 Initial load
duke
parents:
diff changeset
    69
                    ( ( ((int) ((unsigned char) (a))) << 24) | \
90ce3da70b43 Initial load
duke
parents:
diff changeset
    70
                      ( ((int) ((unsigned char) (b))) << 16) | \
90ce3da70b43 Initial load
duke
parents:
diff changeset
    71
                      ( ((int) ((unsigned char) (c))) <<  8) | \
90ce3da70b43 Initial load
duke
parents:
diff changeset
    72
                          (int) ((unsigned char) (d)))
90ce3da70b43 Initial load
duke
parents:
diff changeset
    73
90ce3da70b43 Initial load
duke
parents:
diff changeset
    74
#define TagIdConst(a, b, c, d) \
90ce3da70b43 Initial load
duke
parents:
diff changeset
    75
                ((int) SigMake ((a), (b), (c), (d)))
90ce3da70b43 Initial load
duke
parents:
diff changeset
    76
90ce3da70b43 Initial load
duke
parents:
diff changeset
    77
#define SigHead TagIdConst('h','e','a','d')
90ce3da70b43 Initial load
duke
parents:
diff changeset
    78
90ce3da70b43 Initial load
duke
parents:
diff changeset
    79
#define DT_BYTE     0
90ce3da70b43 Initial load
duke
parents:
diff changeset
    80
#define DT_SHORT    1
90ce3da70b43 Initial load
duke
parents:
diff changeset
    81
#define DT_INT      2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    82
#define DT_DOUBLE   3
90ce3da70b43 Initial load
duke
parents:
diff changeset
    83
90ce3da70b43 Initial load
duke
parents:
diff changeset
    84
/* Default temp profile list size */
90ce3da70b43 Initial load
duke
parents:
diff changeset
    85
#define DF_ICC_BUF_SIZE 32
90ce3da70b43 Initial load
duke
parents:
diff changeset
    86
90ce3da70b43 Initial load
duke
parents:
diff changeset
    87
#define ERR_MSG_SIZE 20
90ce3da70b43 Initial load
duke
parents:
diff changeset
    88
90ce3da70b43 Initial load
duke
parents:
diff changeset
    89
typedef union storeID_s {    /* store SProfile stuff in a Java Long */
90ce3da70b43 Initial load
duke
parents:
diff changeset
    90
    cmsHPROFILE pf;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    91
    cmsHTRANSFORM xf;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    92
    jobject jobj;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    93
    jlong j;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    94
} storeID_t, *storeID_p;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    95
90ce3da70b43 Initial load
duke
parents:
diff changeset
    96
static jfieldID Trans_profileIDs_fID;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    97
static jfieldID Trans_renderType_fID;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    98
static jfieldID Trans_ID_fID;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    99
static jfieldID IL_isIntPacked_fID;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   100
static jfieldID IL_dataType_fID;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   101
static jfieldID IL_pixelType_fID;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   102
static jfieldID IL_dataArray_fID;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   103
static jfieldID IL_offset_fID;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   104
static jfieldID IL_nextRowOffset_fID;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   105
static jfieldID IL_width_fID;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   106
static jfieldID IL_height_fID;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   107
static jfieldID PF_ID_fID;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   108
90ce3da70b43 Initial load
duke
parents:
diff changeset
   109
JavaVM *javaVM;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   110
90ce3da70b43 Initial load
duke
parents:
diff changeset
   111
int errorHandler(int errorCode, const char *errorText) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   112
    JNIEnv *env;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   113
    char errMsg[ERR_MSG_SIZE];
90ce3da70b43 Initial load
duke
parents:
diff changeset
   114
    /* We can safely use sprintf here because error message has limited size */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   115
    sprintf(errMsg, "LCMS error %d", errorCode);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   116
90ce3da70b43 Initial load
duke
parents:
diff changeset
   117
    (*javaVM)->AttachCurrentThread(javaVM, (void**)&env, NULL);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   118
    JNU_ThrowByName(env, "java/awt/color/CMMException", errMsg);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   119
    return 1;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   120
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   121
90ce3da70b43 Initial load
duke
parents:
diff changeset
   122
JNIEXPORT int JNICALL JNI_OnLoad(JavaVM *jvm, void *reserved) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   123
    javaVM = jvm;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   124
90ce3da70b43 Initial load
duke
parents:
diff changeset
   125
    cmsSetErrorHandler(errorHandler);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   126
    return JNI_VERSION_1_6;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   127
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   128
90ce3da70b43 Initial load
duke
parents:
diff changeset
   129
void LCMS_freeTransform(JNIEnv *env, jlong ID)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   130
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
   131
    storeID_t sTrans;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   132
    sTrans.j = ID;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   133
    /* Passed ID is always valid native ref so there is no check for zero */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   134
    cmsDeleteTransform(sTrans.xf);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   135
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   136
90ce3da70b43 Initial load
duke
parents:
diff changeset
   137
/*
90ce3da70b43 Initial load
duke
parents:
diff changeset
   138
 * Class:     sun_java2d_cmm_lcms_LCMS
90ce3da70b43 Initial load
duke
parents:
diff changeset
   139
 * Method:    createNativeTransform
90ce3da70b43 Initial load
duke
parents:
diff changeset
   140
 * Signature: ([JI)J
90ce3da70b43 Initial load
duke
parents:
diff changeset
   141
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   142
JNIEXPORT jlong JNICALL Java_sun_java2d_cmm_lcms_LCMS_createNativeTransform
90ce3da70b43 Initial load
duke
parents:
diff changeset
   143
  (JNIEnv *env, jclass cls, jlongArray profileIDs, jint renderType,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   144
   jobject disposerRef)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   145
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
   146
    LPLCMSICCPROFILE _iccArray[DF_ICC_BUF_SIZE];
90ce3da70b43 Initial load
duke
parents:
diff changeset
   147
    LPLCMSICCPROFILE *iccArray = &_iccArray[0];
90ce3da70b43 Initial load
duke
parents:
diff changeset
   148
    cmsHTRANSFORM transform;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   149
    storeID_t sTrans;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   150
    int i, j, size;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   151
    jlong* ids;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   152
90ce3da70b43 Initial load
duke
parents:
diff changeset
   153
    size = (*env)->GetArrayLength (env, profileIDs);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   154
    ids = (*env)->GetPrimitiveArrayCritical(env, profileIDs, 0);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   155
90ce3da70b43 Initial load
duke
parents:
diff changeset
   156
    if (DF_ICC_BUF_SIZE < size*2) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   157
        iccArray = (LPLCMSICCPROFILE*) malloc(
90ce3da70b43 Initial load
duke
parents:
diff changeset
   158
            size*2*sizeof(LPLCMSICCPROFILE));
90ce3da70b43 Initial load
duke
parents:
diff changeset
   159
        if (iccArray == NULL) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   160
            J2dRlsTraceLn(J2D_TRACE_ERROR, "getXForm: iccArray == NULL");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   161
            return NULL;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   162
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   163
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   164
90ce3da70b43 Initial load
duke
parents:
diff changeset
   165
    j = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   166
    for (i = 0; i < size; i++) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   167
        LPLCMSICCPROFILE icc;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   168
        sTrans.j = ids[i];
90ce3da70b43 Initial load
duke
parents:
diff changeset
   169
        icc = sTrans.pf;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   170
        iccArray[j++] = icc;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   171
90ce3da70b43 Initial load
duke
parents:
diff changeset
   172
        /* Middle non-abstract profiles should be doubled before passing to
90ce3da70b43 Initial load
duke
parents:
diff changeset
   173
         * the cmsCreateMultiprofileTransform function
90ce3da70b43 Initial load
duke
parents:
diff changeset
   174
         */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   175
        if (size > 2 && i != 0 && i != size - 1 &&
90ce3da70b43 Initial load
duke
parents:
diff changeset
   176
            icc->ColorSpace != icSigXYZData &&
90ce3da70b43 Initial load
duke
parents:
diff changeset
   177
            icc->ColorSpace != icSigLabData)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   178
        {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   179
            iccArray[j++] = icc;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   180
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   181
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   182
90ce3da70b43 Initial load
duke
parents:
diff changeset
   183
    sTrans.xf = cmsCreateMultiprofileTransform(iccArray, j,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   184
        0, 0, renderType, 0);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   185
90ce3da70b43 Initial load
duke
parents:
diff changeset
   186
    (*env)->ReleasePrimitiveArrayCritical(env, profileIDs, ids, 0);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   187
90ce3da70b43 Initial load
duke
parents:
diff changeset
   188
    if (sTrans.xf == NULL) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   189
        J2dRlsTraceLn(J2D_TRACE_ERROR, "LCMS_createNativeTransform: "
90ce3da70b43 Initial load
duke
parents:
diff changeset
   190
                                       "sTrans.xf == NULL");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   191
        JNU_ThrowByName(env, "java/awt/color/CMMException",
90ce3da70b43 Initial load
duke
parents:
diff changeset
   192
                        "Cannot get color transform");
6868
f9131565859e 6963489: ZDI-CAN-803: Sun JRE ICC Profile Device Information Tag Remote Code Execution Vulnerability
bae
parents: 5506
diff changeset
   193
    } else {
f9131565859e 6963489: ZDI-CAN-803: Sun JRE ICC Profile Device Information Tag Remote Code Execution Vulnerability
bae
parents: 5506
diff changeset
   194
        Disposer_AddRecord(env, disposerRef, LCMS_freeTransform, sTrans.j);
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   195
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   196
90ce3da70b43 Initial load
duke
parents:
diff changeset
   197
    if (iccArray != &_iccArray[0]) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   198
        free(iccArray);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   199
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   200
    return sTrans.j;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   201
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   202
90ce3da70b43 Initial load
duke
parents:
diff changeset
   203
90ce3da70b43 Initial load
duke
parents:
diff changeset
   204
/*
90ce3da70b43 Initial load
duke
parents:
diff changeset
   205
 * Class:     sun_java2d_cmm_lcms_LCMS
90ce3da70b43 Initial load
duke
parents:
diff changeset
   206
 * Method:    loadProfile
90ce3da70b43 Initial load
duke
parents:
diff changeset
   207
 * Signature: ([B)J
90ce3da70b43 Initial load
duke
parents:
diff changeset
   208
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   209
JNIEXPORT jlong JNICALL Java_sun_java2d_cmm_lcms_LCMS_loadProfile
90ce3da70b43 Initial load
duke
parents:
diff changeset
   210
  (JNIEnv *env, jobject obj, jbyteArray data)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   211
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
   212
    jbyte* dataArray;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   213
    jint dataSize;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   214
    storeID_t sProf;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   215
90ce3da70b43 Initial load
duke
parents:
diff changeset
   216
    dataArray = (*env)->GetByteArrayElements (env, data, 0);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   217
    dataSize = (*env)->GetArrayLength (env, data);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   218
90ce3da70b43 Initial load
duke
parents:
diff changeset
   219
    sProf.pf = cmsOpenProfileFromMem((LPVOID)dataArray, (DWORD) dataSize);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   220
2392
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   221
    (*env)->ReleaseByteArrayElements (env, data, dataArray, 0);
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   222
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   223
    if (sProf.pf == NULL) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   224
        JNU_ThrowIllegalArgumentException(env, "Invalid profile data");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   225
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   226
90ce3da70b43 Initial load
duke
parents:
diff changeset
   227
    return sProf.j;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   228
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   229
90ce3da70b43 Initial load
duke
parents:
diff changeset
   230
/*
90ce3da70b43 Initial load
duke
parents:
diff changeset
   231
 * Class:     sun_java2d_cmm_lcms_LCMS
90ce3da70b43 Initial load
duke
parents:
diff changeset
   232
 * Method:    freeProfile
90ce3da70b43 Initial load
duke
parents:
diff changeset
   233
 * Signature: (J)V
90ce3da70b43 Initial load
duke
parents:
diff changeset
   234
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   235
JNIEXPORT void JNICALL Java_sun_java2d_cmm_lcms_LCMS_freeProfile
90ce3da70b43 Initial load
duke
parents:
diff changeset
   236
  (JNIEnv *env, jobject obj, jlong id)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   237
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
   238
    storeID_t sProf;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   239
90ce3da70b43 Initial load
duke
parents:
diff changeset
   240
    sProf.j = id;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   241
    if (cmsCloseProfile(sProf.pf) == 0) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   242
        J2dRlsTraceLn1(J2D_TRACE_ERROR, "LCMS_freeProfile: cmsCloseProfile(%d)"
90ce3da70b43 Initial load
duke
parents:
diff changeset
   243
                       "== 0", id);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   244
        JNU_ThrowByName(env, "java/awt/color/CMMException",
90ce3da70b43 Initial load
duke
parents:
diff changeset
   245
                        "Cannot close profile");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   246
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   247
90ce3da70b43 Initial load
duke
parents:
diff changeset
   248
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   249
90ce3da70b43 Initial load
duke
parents:
diff changeset
   250
/*
90ce3da70b43 Initial load
duke
parents:
diff changeset
   251
 * Class:     sun_java2d_cmm_lcms_LCMS
90ce3da70b43 Initial load
duke
parents:
diff changeset
   252
 * Method:    getProfileSize
90ce3da70b43 Initial load
duke
parents:
diff changeset
   253
 * Signature: (J)I
90ce3da70b43 Initial load
duke
parents:
diff changeset
   254
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   255
JNIEXPORT jint JNICALL Java_sun_java2d_cmm_lcms_LCMS_getProfileSize
90ce3da70b43 Initial load
duke
parents:
diff changeset
   256
  (JNIEnv *env, jobject obj, jlong id)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   257
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
   258
    LPLCMSICCPROFILE Icc;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   259
    storeID_t sProf;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   260
    unsigned char pfSize[4];
90ce3da70b43 Initial load
duke
parents:
diff changeset
   261
90ce3da70b43 Initial load
duke
parents:
diff changeset
   262
    sProf.j = id;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   263
    Icc = (LPLCMSICCPROFILE) sProf.pf;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   264
    Icc -> Seek(Icc, 0);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   265
    Icc -> Read(pfSize, 4, 1, Icc);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   266
90ce3da70b43 Initial load
duke
parents:
diff changeset
   267
    /* TODO: It's a correct but non-optimal for BE machines code, so should
90ce3da70b43 Initial load
duke
parents:
diff changeset
   268
     * be special cased for them
90ce3da70b43 Initial load
duke
parents:
diff changeset
   269
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   270
    return (pfSize[0]<<24) | (pfSize[1]<<16) | (pfSize[2]<<8) |
90ce3da70b43 Initial load
duke
parents:
diff changeset
   271
        pfSize[3];
90ce3da70b43 Initial load
duke
parents:
diff changeset
   272
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   273
90ce3da70b43 Initial load
duke
parents:
diff changeset
   274
/*
90ce3da70b43 Initial load
duke
parents:
diff changeset
   275
 * Class:     sun_java2d_cmm_lcms_LCMS
90ce3da70b43 Initial load
duke
parents:
diff changeset
   276
 * Method:    getProfileData
90ce3da70b43 Initial load
duke
parents:
diff changeset
   277
 * Signature: (J[B)V
90ce3da70b43 Initial load
duke
parents:
diff changeset
   278
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   279
JNIEXPORT void JNICALL Java_sun_java2d_cmm_lcms_LCMS_getProfileData
90ce3da70b43 Initial load
duke
parents:
diff changeset
   280
  (JNIEnv *env, jobject obj, jlong id, jbyteArray data)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   281
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
   282
    LPLCMSICCPROFILE Icc;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   283
    storeID_t sProf;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   284
    unsigned char pfSize[4];
90ce3da70b43 Initial load
duke
parents:
diff changeset
   285
    jint size;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   286
    jbyte* dataArray;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   287
90ce3da70b43 Initial load
duke
parents:
diff changeset
   288
    sProf.j = id;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   289
    Icc = (LPLCMSICCPROFILE) sProf.pf;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   290
    Icc -> Seek(Icc, 0);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   291
    Icc -> Read(pfSize, 4, 1, Icc);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   292
90ce3da70b43 Initial load
duke
parents:
diff changeset
   293
    dataArray = (*env)->GetByteArrayElements (env, data, 0);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   294
    Icc->Seek(Icc, 0);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   295
90ce3da70b43 Initial load
duke
parents:
diff changeset
   296
    /* TODO: It's a correct but non-optimal for BE machines code, so should
90ce3da70b43 Initial load
duke
parents:
diff changeset
   297
     * be special cased for them
90ce3da70b43 Initial load
duke
parents:
diff changeset
   298
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   299
    Icc->Read(dataArray, 1,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   300
              (pfSize[0]<<24) | (pfSize[1]<<16) | (pfSize[2]<<8) | pfSize[3],
90ce3da70b43 Initial load
duke
parents:
diff changeset
   301
              Icc);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   302
    (*env)->ReleaseByteArrayElements (env, data, dataArray, 0);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   303
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   304
90ce3da70b43 Initial load
duke
parents:
diff changeset
   305
/*
90ce3da70b43 Initial load
duke
parents:
diff changeset
   306
 * Class:     sun_java2d_cmm_lcms_LCMS
90ce3da70b43 Initial load
duke
parents:
diff changeset
   307
 * Method:    getTagSize
90ce3da70b43 Initial load
duke
parents:
diff changeset
   308
 * Signature: (JI)I
90ce3da70b43 Initial load
duke
parents:
diff changeset
   309
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   310
JNIEXPORT jint JNICALL Java_sun_java2d_cmm_lcms_LCMS_getTagSize
90ce3da70b43 Initial load
duke
parents:
diff changeset
   311
  (JNIEnv *env, jobject obj, jlong id, jint tagSig)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   312
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
   313
    LPLCMSICCPROFILE Icc;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   314
    storeID_t sProf;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   315
    int i;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   316
    jint result;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   317
90ce3da70b43 Initial load
duke
parents:
diff changeset
   318
    sProf.j = id;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   319
    Icc = (LPLCMSICCPROFILE) sProf.pf;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   320
90ce3da70b43 Initial load
duke
parents:
diff changeset
   321
    if (tagSig == SigHead) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   322
        result = sizeof(icHeader);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   323
    } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   324
        i =  _cmsSearchTag(Icc, tagSig, FALSE);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   325
        if (i >= 0) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   326
            result = Icc->TagSizes[i];
90ce3da70b43 Initial load
duke
parents:
diff changeset
   327
        } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   328
            JNU_ThrowByName(env, "java/awt/color/CMMException",
90ce3da70b43 Initial load
duke
parents:
diff changeset
   329
                            "ICC profile tag not found");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   330
            result = -1;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   331
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   332
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   333
90ce3da70b43 Initial load
duke
parents:
diff changeset
   334
    return result;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   335
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   336
90ce3da70b43 Initial load
duke
parents:
diff changeset
   337
/*
90ce3da70b43 Initial load
duke
parents:
diff changeset
   338
 * Class:     sun_java2d_cmm_lcms_LCMS
90ce3da70b43 Initial load
duke
parents:
diff changeset
   339
 * Method:    getTagData
90ce3da70b43 Initial load
duke
parents:
diff changeset
   340
 * Signature: (JI[B)V
90ce3da70b43 Initial load
duke
parents:
diff changeset
   341
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   342
JNIEXPORT void JNICALL Java_sun_java2d_cmm_lcms_LCMS_getTagData
90ce3da70b43 Initial load
duke
parents:
diff changeset
   343
  (JNIEnv *env, jobject obj, jlong id, jint tagSig, jbyteArray data)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   344
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
   345
    LPLCMSICCPROFILE Icc;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   346
    storeID_t sProf;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   347
    jbyte* dataArray;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   348
    int i, tagSize;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   349
90ce3da70b43 Initial load
duke
parents:
diff changeset
   350
    sProf.j = id;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   351
    Icc = (LPLCMSICCPROFILE) sProf.pf;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   352
90ce3da70b43 Initial load
duke
parents:
diff changeset
   353
    if (tagSig == SigHead) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   354
        dataArray = (*env)->GetByteArrayElements (env, data, 0);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   355
        tagSize =(*env)->GetArrayLength(env, data);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   356
        Icc -> Seek(Icc, 0);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   357
        Icc -> Read(dataArray, sizeof(icHeader), 1, Icc);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   358
        (*env)->ReleaseByteArrayElements (env, data, dataArray, 0);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   359
        return;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   360
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   361
90ce3da70b43 Initial load
duke
parents:
diff changeset
   362
90ce3da70b43 Initial load
duke
parents:
diff changeset
   363
    i =  _cmsSearchTag(Icc, tagSig, FALSE);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   364
    if (i >=0) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   365
        tagSize = Icc->TagSizes[i];
90ce3da70b43 Initial load
duke
parents:
diff changeset
   366
        dataArray = (*env)->GetByteArrayElements (env, data, 0);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   367
        Icc->Seek(Icc, Icc->TagOffsets[i]);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   368
        Icc->Read(dataArray, 1, tagSize, Icc);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   369
        (*env)->ReleaseByteArrayElements (env, data, dataArray, 0);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   370
        return;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   371
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   372
90ce3da70b43 Initial load
duke
parents:
diff changeset
   373
    JNU_ThrowByName(env, "java/awt/color/CMMException",
90ce3da70b43 Initial load
duke
parents:
diff changeset
   374
                    "ICC profile tag not found");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   375
    return;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   376
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   377
2394
404cbe399601 6821031: Upgrade OpenJDK's LittleCMS version to 1.18
prr
parents: 2392
diff changeset
   378
// Modify data for a tag in a profile
404cbe399601 6821031: Upgrade OpenJDK's LittleCMS version to 1.18
prr
parents: 2392
diff changeset
   379
LCMSBOOL LCMSEXPORT _cmsModifyTagData(cmsHPROFILE hProfile,
404cbe399601 6821031: Upgrade OpenJDK's LittleCMS version to 1.18
prr
parents: 2392
diff changeset
   380
                                 icTagSignature sig, void *data, size_t size);
404cbe399601 6821031: Upgrade OpenJDK's LittleCMS version to 1.18
prr
parents: 2392
diff changeset
   381
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   382
/*
90ce3da70b43 Initial load
duke
parents:
diff changeset
   383
 * Class:     sun_java2d_cmm_lcms_LCMS
90ce3da70b43 Initial load
duke
parents:
diff changeset
   384
 * Method:    setTagData
90ce3da70b43 Initial load
duke
parents:
diff changeset
   385
 * Signature: (JI[B)V
90ce3da70b43 Initial load
duke
parents:
diff changeset
   386
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   387
JNIEXPORT void JNICALL Java_sun_java2d_cmm_lcms_LCMS_setTagData
90ce3da70b43 Initial load
duke
parents:
diff changeset
   388
  (JNIEnv *env, jobject obj, jlong id, jint tagSig, jbyteArray data)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   389
{
2392
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   390
    cmsHPROFILE profile;
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   391
    storeID_t sProf;
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   392
    jbyte* dataArray;
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   393
    int tagSize;
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   394
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   395
    if (tagSig == SigHead) {
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   396
        J2dRlsTraceLn(J2D_TRACE_ERROR, "LCMS_setTagData on icSigHead not "
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   397
                      "permitted");
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   398
        return;
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   399
    }
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   400
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   401
    sProf.j = id;
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   402
    profile = (cmsHPROFILE) sProf.pf;
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   403
    dataArray = (*env)->GetByteArrayElements(env, data, 0);
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   404
    tagSize =(*env)->GetArrayLength(env, data);
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   405
    _cmsModifyTagData(profile, (icTagSignature) tagSig, dataArray, tagSize);
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   406
    (*env)->ReleaseByteArrayElements(env, data, dataArray, 0);
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   407
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   408
90ce3da70b43 Initial load
duke
parents:
diff changeset
   409
void* getILData (JNIEnv *env, jobject img, jint* pDataType,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   410
                 jobject* pDataObject) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   411
    void* result = NULL;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   412
    *pDataType = (*env)->GetIntField (env, img, IL_dataType_fID);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   413
    *pDataObject = (*env)->GetObjectField(env, img, IL_dataArray_fID);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   414
    switch (*pDataType) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   415
        case DT_BYTE:
90ce3da70b43 Initial load
duke
parents:
diff changeset
   416
            result = (*env)->GetByteArrayElements (env, *pDataObject, 0);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   417
            break;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   418
        case DT_SHORT:
90ce3da70b43 Initial load
duke
parents:
diff changeset
   419
            result = (*env)->GetShortArrayElements (env, *pDataObject, 0);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   420
            break;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   421
        case DT_INT:
90ce3da70b43 Initial load
duke
parents:
diff changeset
   422
            result = (*env)->GetIntArrayElements (env, *pDataObject, 0);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   423
            break;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   424
        case DT_DOUBLE:
90ce3da70b43 Initial load
duke
parents:
diff changeset
   425
            result = (*env)->GetDoubleArrayElements (env, *pDataObject, 0);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   426
            break;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   427
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   428
90ce3da70b43 Initial load
duke
parents:
diff changeset
   429
    return result;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   430
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   431
90ce3da70b43 Initial load
duke
parents:
diff changeset
   432
void releaseILData (JNIEnv *env, void* pData, jint dataType,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   433
                    jobject dataObject) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   434
    switch (dataType) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   435
        case DT_BYTE:
90ce3da70b43 Initial load
duke
parents:
diff changeset
   436
            (*env)->ReleaseByteArrayElements(env,dataObject,(jbyte*)pData,0);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   437
            break;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   438
        case DT_SHORT:
90ce3da70b43 Initial load
duke
parents:
diff changeset
   439
            (*env)->ReleaseShortArrayElements(env,dataObject,(jshort*)pData, 0);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   440
            break;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   441
        case DT_INT:
90ce3da70b43 Initial load
duke
parents:
diff changeset
   442
            (*env)->ReleaseIntArrayElements(env,dataObject,(jint*)pData,0);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   443
            break;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   444
        case DT_DOUBLE:
90ce3da70b43 Initial load
duke
parents:
diff changeset
   445
            (*env)->ReleaseDoubleArrayElements(env,dataObject,(jdouble*)pData,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   446
                                               0);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   447
            break;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   448
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   449
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   450
90ce3da70b43 Initial load
duke
parents:
diff changeset
   451
/*
90ce3da70b43 Initial load
duke
parents:
diff changeset
   452
 * Class:     sun_java2d_cmm_lcms_LCMS
90ce3da70b43 Initial load
duke
parents:
diff changeset
   453
 * Method:    colorConvert
90ce3da70b43 Initial load
duke
parents:
diff changeset
   454
 * Signature: (Lsun/java2d/cmm/lcms/LCMSTransform;Lsun/java2d/cmm/lcms/LCMSImageLayout;Lsun/java2d/cmm/lcms/LCMSImageLayout;)V
90ce3da70b43 Initial load
duke
parents:
diff changeset
   455
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   456
JNIEXPORT void JNICALL Java_sun_java2d_cmm_lcms_LCMS_colorConvert
90ce3da70b43 Initial load
duke
parents:
diff changeset
   457
  (JNIEnv *env, jclass obj, jobject trans, jobject src, jobject dst)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   458
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
   459
    storeID_t sTrans;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   460
    int size, inFmt, outFmt, srcDType, dstDType, outSize, renderType;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   461
    int srcOffset, srcNextRowOffset, dstOffset, dstNextRowOffset;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   462
    int width, height, i;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   463
    void* inputBuffer;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   464
    void* outputBuffer;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   465
    char* inputRow;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   466
    char* outputRow;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   467
    jobject srcData, dstData;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   468
90ce3da70b43 Initial load
duke
parents:
diff changeset
   469
    inFmt = (*env)->GetIntField (env, src, IL_pixelType_fID);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   470
    outFmt = (*env)->GetIntField (env, dst, IL_pixelType_fID);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   471
    srcOffset = (*env)->GetIntField (env, src, IL_offset_fID);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   472
    srcNextRowOffset = (*env)->GetIntField (env, src, IL_nextRowOffset_fID);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   473
    dstOffset = (*env)->GetIntField (env, dst, IL_offset_fID);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   474
    dstNextRowOffset = (*env)->GetIntField (env, dst, IL_nextRowOffset_fID);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   475
    width = (*env)->GetIntField (env, src, IL_width_fID);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   476
    height = (*env)->GetIntField (env, src, IL_height_fID);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   477
#ifdef _LITTLE_ENDIAN
90ce3da70b43 Initial load
duke
parents:
diff changeset
   478
    /* Reversing data packed into int for LE archs */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   479
    if ((*env)->GetBooleanField (env, src, IL_isIntPacked_fID) == JNI_TRUE) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   480
        inFmt ^= DOSWAP_SH(1);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   481
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   482
    if ((*env)->GetBooleanField (env, dst, IL_isIntPacked_fID) == JNI_TRUE) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   483
        outFmt ^= DOSWAP_SH(1);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   484
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   485
#endif
90ce3da70b43 Initial load
duke
parents:
diff changeset
   486
    sTrans.j = (*env)->GetLongField (env, trans, Trans_ID_fID);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   487
    cmsChangeBuffersFormat(sTrans.xf, inFmt, outFmt);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   488
90ce3da70b43 Initial load
duke
parents:
diff changeset
   489
90ce3da70b43 Initial load
duke
parents:
diff changeset
   490
    if (sTrans.xf == NULL) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   491
        J2dRlsTraceLn(J2D_TRACE_ERROR, "LCMS_colorConvert: transform == NULL");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   492
        JNU_ThrowByName(env, "java/awt/color/CMMException",
90ce3da70b43 Initial load
duke
parents:
diff changeset
   493
                        "Cannot get color transform");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   494
        return;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   495
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   496
90ce3da70b43 Initial load
duke
parents:
diff changeset
   497
90ce3da70b43 Initial load
duke
parents:
diff changeset
   498
    inputBuffer = getILData (env, src, &srcDType, &srcData);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   499
90ce3da70b43 Initial load
duke
parents:
diff changeset
   500
    if (inputBuffer == NULL) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   501
        J2dRlsTraceLn(J2D_TRACE_ERROR, "");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   502
        JNU_ThrowByName(env, "java/awt/color/CMMException",
90ce3da70b43 Initial load
duke
parents:
diff changeset
   503
                        "Cannot get input data");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   504
        return;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   505
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   506
90ce3da70b43 Initial load
duke
parents:
diff changeset
   507
    outputBuffer = getILData (env, dst, &dstDType, &dstData);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   508
90ce3da70b43 Initial load
duke
parents:
diff changeset
   509
    if (outputBuffer == NULL) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   510
        releaseILData(env, inputBuffer, srcDType, srcData);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   511
        JNU_ThrowByName(env, "java/awt/color/CMMException",
90ce3da70b43 Initial load
duke
parents:
diff changeset
   512
                        "Cannot get output data");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   513
        return;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   514
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   515
90ce3da70b43 Initial load
duke
parents:
diff changeset
   516
    inputRow = (char*)inputBuffer + srcOffset;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   517
    outputRow = (char*)outputBuffer + dstOffset;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   518
90ce3da70b43 Initial load
duke
parents:
diff changeset
   519
    for (i = 0; i < height; i++) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   520
        cmsDoTransform(sTrans.xf, inputRow, outputRow, width);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   521
        inputRow += srcNextRowOffset;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   522
        outputRow += dstNextRowOffset;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   523
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   524
90ce3da70b43 Initial load
duke
parents:
diff changeset
   525
    releaseILData(env, inputBuffer, srcDType, srcData);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   526
    releaseILData(env, outputBuffer, dstDType, dstData);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   527
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   528
90ce3da70b43 Initial load
duke
parents:
diff changeset
   529
/*
90ce3da70b43 Initial load
duke
parents:
diff changeset
   530
 * Class:     sun_java2d_cmm_lcms_LCMS
90ce3da70b43 Initial load
duke
parents:
diff changeset
   531
 * Method:    getProfileID
90ce3da70b43 Initial load
duke
parents:
diff changeset
   532
 * Signature: (Ljava/awt/color/ICC_Profile;)J
90ce3da70b43 Initial load
duke
parents:
diff changeset
   533
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   534
JNIEXPORT jlong JNICALL Java_sun_java2d_cmm_lcms_LCMS_getProfileID
90ce3da70b43 Initial load
duke
parents:
diff changeset
   535
  (JNIEnv *env, jclass cls, jobject pf)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   536
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
   537
    return (*env)->GetLongField (env, pf, PF_ID_fID);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   538
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   539
90ce3da70b43 Initial load
duke
parents:
diff changeset
   540
/*
90ce3da70b43 Initial load
duke
parents:
diff changeset
   541
 * Class:     sun_java2d_cmm_lcms_LCMS
90ce3da70b43 Initial load
duke
parents:
diff changeset
   542
 * Method:    initLCMS
90ce3da70b43 Initial load
duke
parents:
diff changeset
   543
 * Signature: (Ljava/lang/Class;Ljava/lang/Class;Ljava/lang/Class;)V
90ce3da70b43 Initial load
duke
parents:
diff changeset
   544
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   545
JNIEXPORT void JNICALL Java_sun_java2d_cmm_lcms_LCMS_initLCMS
90ce3da70b43 Initial load
duke
parents:
diff changeset
   546
  (JNIEnv *env, jclass cls, jclass Trans, jclass IL, jclass Pf)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   547
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
   548
    /* TODO: move initialization of the IDs to the static blocks of
90ce3da70b43 Initial load
duke
parents:
diff changeset
   549
     * corresponding classes to avoid problems with invalidating ids by class
90ce3da70b43 Initial load
duke
parents:
diff changeset
   550
     * unloading
90ce3da70b43 Initial load
duke
parents:
diff changeset
   551
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   552
    Trans_profileIDs_fID = (*env)->GetFieldID (env, Trans, "profileIDs", "[J");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   553
    Trans_renderType_fID = (*env)->GetFieldID (env, Trans, "renderType", "I");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   554
    Trans_ID_fID = (*env)->GetFieldID (env, Trans, "ID", "J");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   555
90ce3da70b43 Initial load
duke
parents:
diff changeset
   556
    IL_isIntPacked_fID = (*env)->GetFieldID (env, IL, "isIntPacked", "Z");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   557
    IL_dataType_fID = (*env)->GetFieldID (env, IL, "dataType", "I");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   558
    IL_pixelType_fID = (*env)->GetFieldID (env, IL, "pixelType", "I");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   559
    IL_dataArray_fID = (*env)->GetFieldID(env, IL, "dataArray",
90ce3da70b43 Initial load
duke
parents:
diff changeset
   560
                                          "Ljava/lang/Object;");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   561
    IL_width_fID = (*env)->GetFieldID (env, IL, "width", "I");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   562
    IL_height_fID = (*env)->GetFieldID (env, IL, "height", "I");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   563
    IL_offset_fID = (*env)->GetFieldID (env, IL, "offset", "I");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   564
    IL_nextRowOffset_fID = (*env)->GetFieldID (env, IL, "nextRowOffset", "I");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   565
90ce3da70b43 Initial load
duke
parents:
diff changeset
   566
    PF_ID_fID = (*env)->GetFieldID (env, Pf, "ID", "J");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   567
}
2392
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   568
2394
404cbe399601 6821031: Upgrade OpenJDK's LittleCMS version to 1.18
prr
parents: 2392
diff changeset
   569
LCMSBOOL _cmsModifyTagData(cmsHPROFILE hProfile, icTagSignature sig,
2392
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   570
                       void *data, size_t size)
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   571
{
2394
404cbe399601 6821031: Upgrade OpenJDK's LittleCMS version to 1.18
prr
parents: 2392
diff changeset
   572
    LCMSBOOL isNew;
2392
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   573
    int i, idx, delta, count;
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   574
    LPBYTE padChars[3] = {0, 0, 0};
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   575
    LPBYTE beforeBuf, afterBuf, ptr;
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   576
    size_t beforeSize, afterSize;
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   577
    icUInt32Number profileSize, temp;
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   578
    LPLCMSICCPROFILE Icc = (LPLCMSICCPROFILE) (LPSTR) hProfile;
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   579
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   580
    isNew = FALSE;
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   581
    idx = _cmsSearchTag(Icc, sig, FALSE);
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   582
    if (idx < 0) {
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   583
        isNew = TRUE;
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   584
        idx = Icc->TagCount++;
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   585
        if (Icc->TagCount >= MAX_TABLE_TAG) {
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   586
            J2dRlsTraceLn1(J2D_TRACE_ERROR, "_cmsModifyTagData: Too many tags "
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   587
                           "(%d)\n", Icc->TagCount);
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   588
            Icc->TagCount = MAX_TABLE_TAG-1;
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   589
            return FALSE;
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   590
        }
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   591
    }
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   592
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   593
    /* Read in size from header */
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   594
    Icc->Seek(Icc, 0);
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   595
    Icc->Read(&profileSize, sizeof(icUInt32Number), 1, Icc);
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   596
    AdjustEndianess32((LPBYTE) &profileSize);
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   597
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   598
    /* Compute the change in profile size */
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   599
    if (isNew) {
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   600
        delta = sizeof(icTag) + ALIGNLONG(size);
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   601
    } else {
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   602
        delta = ALIGNLONG(size) - ALIGNLONG(Icc->TagSizes[idx]);
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   603
    }
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   604
    /* Add tag to internal structures */
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   605
    ptr = malloc(size);
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   606
    if (ptr == NULL) {
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   607
        if(isNew) {
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   608
            Icc->TagCount--;
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   609
        }
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   610
        J2dRlsTraceLn(J2D_TRACE_ERROR, "_cmsModifyTagData: ptr == NULL");
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   611
        return FALSE;
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   612
    }
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   613
2801
3d1b54bcdbbe 6839133: lcms 1.18 update breaks ICC_ProfileRGB Tests
aph
parents: 2394
diff changeset
   614
    /* We change the size of Icc here only if we know it'll actually
3d1b54bcdbbe 6839133: lcms 1.18 update breaks ICC_ProfileRGB Tests
aph
parents: 2394
diff changeset
   615
     * grow: if Icc is about to shrink we must wait until we've read
3d1b54bcdbbe 6839133: lcms 1.18 update breaks ICC_ProfileRGB Tests
aph
parents: 2394
diff changeset
   616
     * the previous data.  */
3d1b54bcdbbe 6839133: lcms 1.18 update breaks ICC_ProfileRGB Tests
aph
parents: 2394
diff changeset
   617
    if (delta > 0) {
3d1b54bcdbbe 6839133: lcms 1.18 update breaks ICC_ProfileRGB Tests
aph
parents: 2394
diff changeset
   618
        if (!Icc->Grow(Icc, delta)) {
3d1b54bcdbbe 6839133: lcms 1.18 update breaks ICC_ProfileRGB Tests
aph
parents: 2394
diff changeset
   619
            free(ptr);
3d1b54bcdbbe 6839133: lcms 1.18 update breaks ICC_ProfileRGB Tests
aph
parents: 2394
diff changeset
   620
            if(isNew) {
3d1b54bcdbbe 6839133: lcms 1.18 update breaks ICC_ProfileRGB Tests
aph
parents: 2394
diff changeset
   621
                Icc->TagCount--;
3d1b54bcdbbe 6839133: lcms 1.18 update breaks ICC_ProfileRGB Tests
aph
parents: 2394
diff changeset
   622
            }
3d1b54bcdbbe 6839133: lcms 1.18 update breaks ICC_ProfileRGB Tests
aph
parents: 2394
diff changeset
   623
            J2dRlsTraceLn(J2D_TRACE_ERROR,
3d1b54bcdbbe 6839133: lcms 1.18 update breaks ICC_ProfileRGB Tests
aph
parents: 2394
diff changeset
   624
                          "_cmsModifyTagData: Icc->Grow() == FALSE");
3d1b54bcdbbe 6839133: lcms 1.18 update breaks ICC_ProfileRGB Tests
aph
parents: 2394
diff changeset
   625
            return FALSE;
2392
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   626
        }
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   627
    }
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   628
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   629
    /* Compute size of tag data before/after the modified tag */
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   630
    beforeSize = ((isNew)?profileSize:Icc->TagOffsets[idx]) -
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   631
                 Icc->TagOffsets[0];
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   632
    if (Icc->TagCount == (idx + 1)) {
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   633
        afterSize = 0;
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   634
    } else {
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   635
        afterSize = profileSize - Icc->TagOffsets[idx+1];
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   636
    }
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   637
    /* Make copies of the data before/after the modified tag */
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   638
    if (beforeSize > 0) {
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   639
        beforeBuf = malloc(beforeSize);
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   640
        if (!beforeBuf) {
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   641
            if(isNew) {
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   642
                Icc->TagCount--;
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   643
            }
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   644
            free(ptr);
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   645
            J2dRlsTraceLn(J2D_TRACE_ERROR,
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   646
                          "_cmsModifyTagData: beforeBuf == NULL");
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   647
            return FALSE;
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   648
        }
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   649
        Icc->Seek(Icc, Icc->TagOffsets[0]);
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   650
        Icc->Read(beforeBuf, beforeSize, 1, Icc);
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   651
    }
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   652
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   653
    if (afterSize > 0) {
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   654
        afterBuf = malloc(afterSize);
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   655
        if (!afterBuf) {
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   656
            free(ptr);
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   657
            if(isNew) {
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   658
                Icc->TagCount--;
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   659
            }
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   660
            if (beforeSize > 0) {
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   661
                free(beforeBuf);
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   662
            }
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   663
            J2dRlsTraceLn(J2D_TRACE_ERROR,
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   664
                          "_cmsModifyTagData: afterBuf == NULL");
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   665
            return FALSE;
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   666
        }
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   667
        Icc->Seek(Icc, Icc->TagOffsets[idx+1]);
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   668
        Icc->Read(afterBuf, afterSize, 1, Icc);
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   669
    }
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   670
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   671
    CopyMemory(ptr, data, size);
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   672
    Icc->TagSizes[idx] = size;
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   673
    Icc->TagNames[idx] = sig;
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   674
    if (Icc->TagPtrs[idx]) {
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   675
        free(Icc->TagPtrs[idx]);
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   676
    }
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   677
    Icc->TagPtrs[idx] = ptr;
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   678
    if (isNew) {
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   679
        Icc->TagOffsets[idx] = profileSize;
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   680
    }
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   681
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   682
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   683
    /* Update the profile size in the header */
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   684
    profileSize += delta;
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   685
    Icc->Seek(Icc, 0);
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   686
    temp = TransportValue32(profileSize);
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   687
    Icc->Write(Icc, sizeof(icUInt32Number), &temp);
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   688
2801
3d1b54bcdbbe 6839133: lcms 1.18 update breaks ICC_ProfileRGB Tests
aph
parents: 2394
diff changeset
   689
    /* Shrink Icc, if needed.  */
3d1b54bcdbbe 6839133: lcms 1.18 update breaks ICC_ProfileRGB Tests
aph
parents: 2394
diff changeset
   690
    if (delta < 0) {
3d1b54bcdbbe 6839133: lcms 1.18 update breaks ICC_ProfileRGB Tests
aph
parents: 2394
diff changeset
   691
        if (!Icc->Grow(Icc, delta)) {
3d1b54bcdbbe 6839133: lcms 1.18 update breaks ICC_ProfileRGB Tests
aph
parents: 2394
diff changeset
   692
            free(ptr);
3d1b54bcdbbe 6839133: lcms 1.18 update breaks ICC_ProfileRGB Tests
aph
parents: 2394
diff changeset
   693
            if(isNew) {
3d1b54bcdbbe 6839133: lcms 1.18 update breaks ICC_ProfileRGB Tests
aph
parents: 2394
diff changeset
   694
                Icc->TagCount--;
3d1b54bcdbbe 6839133: lcms 1.18 update breaks ICC_ProfileRGB Tests
aph
parents: 2394
diff changeset
   695
            }
3d1b54bcdbbe 6839133: lcms 1.18 update breaks ICC_ProfileRGB Tests
aph
parents: 2394
diff changeset
   696
            J2dRlsTraceLn(J2D_TRACE_ERROR,
3d1b54bcdbbe 6839133: lcms 1.18 update breaks ICC_ProfileRGB Tests
aph
parents: 2394
diff changeset
   697
                          "_cmsModifyTagData: Icc->Grow() == FALSE");
3d1b54bcdbbe 6839133: lcms 1.18 update breaks ICC_ProfileRGB Tests
aph
parents: 2394
diff changeset
   698
            return FALSE;
3d1b54bcdbbe 6839133: lcms 1.18 update breaks ICC_ProfileRGB Tests
aph
parents: 2394
diff changeset
   699
        }
3d1b54bcdbbe 6839133: lcms 1.18 update breaks ICC_ProfileRGB Tests
aph
parents: 2394
diff changeset
   700
    }
2392
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   701
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   702
    /* Adjust tag offsets: if the tag is new, we must account
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   703
       for the new tag table entry; otherwise, only those tags after
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   704
       the modified tag are changed (by delta) */
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   705
    if (isNew) {
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   706
        for (i = 0; i < Icc->TagCount; ++i) {
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   707
            Icc->TagOffsets[i] += sizeof(icTag);
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   708
        }
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   709
    } else {
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   710
        for (i = idx+1; i < Icc->TagCount; ++i) {
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   711
            Icc->TagOffsets[i] += delta;
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   712
        }
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   713
    }
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   714
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   715
    /* Write out a new tag table */
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   716
    count = 0;
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   717
    for (i = 0; i < Icc->TagCount; ++i) {
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   718
        if (Icc->TagNames[i] != 0) {
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   719
            ++count;
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   720
        }
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   721
    }
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   722
    Icc->Seek(Icc, sizeof(icHeader));
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   723
    temp = TransportValue32(count);
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   724
    Icc->Write(Icc, sizeof(icUInt32Number), &temp);
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   725
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   726
    for (i = 0; i < Icc->TagCount; ++i) {
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   727
        if (Icc->TagNames[i] != 0) {
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   728
            icTag tag;
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   729
            tag.sig = TransportValue32(Icc->TagNames[i]);
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   730
            tag.offset = TransportValue32((icInt32Number) Icc->TagOffsets[i]);
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   731
            tag.size = TransportValue32((icInt32Number) Icc->TagSizes[i]);
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   732
            Icc->Write(Icc, sizeof(icTag), &tag);
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   733
        }
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   734
    }
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   735
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   736
    /* Write unchanged data before the modified tag */
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   737
    if (beforeSize > 0) {
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   738
        Icc->Write(Icc, beforeSize, beforeBuf);
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   739
        free(beforeBuf);
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   740
    }
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   741
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   742
    /* Write modified tag data */
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   743
    Icc->Write(Icc, size, data);
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   744
    if (size % 4) {
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   745
        Icc->Write(Icc, 4 - (size % 4), padChars);
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   746
    }
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   747
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   748
    /* Write unchanged data after the modified tag */
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   749
    if (afterSize > 0) {
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   750
        Icc->Write(Icc, afterSize, afterBuf);
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   751
        free(afterBuf);
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   752
    }
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   753
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   754
    return TRUE;
738be5224b3f 6733501: Apply IcedTea little cms patches
avu
parents: 2
diff changeset
   755
}