1 /*
2  *  lcmsjnilib.c.c
3  *
4  *
5  *  Created by Fabio Riccardi on 7/21/06.
6  *  Copyright 2006 Light Crafts, Inc.. All rights reserved.
7  *
8  */
9 #include <ctype.h>
10 #include <stdint.h>
11 
12 #ifndef AUTO_DEP
13 #include "javah/com_lightcrafts_utils_LCMSNative.h"
14 #endif
15 
16 #include "LC_JNIUtils.h"
17 #include "lcms2.h"
18 
19 #define DCRaw_METHOD(method) \
20 name4(Java_,com_lightcrafts_utils_LCMSNative,_,method)
21 
Java_com_lightcrafts_utils_LCMSNative_cmsOpenProfileFromMem(JNIEnv * env,jclass clazz,jbyteArray jdata,jint size)22 JNIEXPORT jlong JNICALL Java_com_lightcrafts_utils_LCMSNative_cmsOpenProfileFromMem
23   (JNIEnv *env, jclass clazz, jbyteArray jdata, jint size)
24 {
25     char *data = (char *) (*env)->GetPrimitiveArrayCritical(env, jdata, 0);
26 
27     cmsHPROFILE result = cmsOpenProfileFromMem(data, size);
28 
29     (*env)->ReleasePrimitiveArrayCritical(env, jdata, data, 0);
30 
31     return (jlong)(intptr_t) result;
32 }
33 
Java_com_lightcrafts_utils_LCMSNative_cmsCreateRGBProfile(JNIEnv * env,jclass clazz,jdoubleArray jWhitePoint,jdoubleArray jPrimaries,jdouble gamma)34 JNIEXPORT jlong JNICALL Java_com_lightcrafts_utils_LCMSNative_cmsCreateRGBProfile
35   (JNIEnv *env, jclass clazz, jdoubleArray jWhitePoint, jdoubleArray jPrimaries, jdouble gamma)
36 {
37       double *WhitePoint = (double *) (*env)->GetPrimitiveArrayCritical(env, jWhitePoint, 0);
38       double *Primaries = (double *) (*env)->GetPrimitiveArrayCritical(env, jPrimaries, 0);
39       int i;
40       cmsHPROFILE result;
41 
42       cmsCIExyY w = { WhitePoint[0], WhitePoint[1], WhitePoint[2] };
43 
44       cmsCIExyYTRIPLE p = {
45         {Primaries[0], Primaries[1], Primaries[2]},
46         {Primaries[3], Primaries[4], Primaries[5]},
47         {Primaries[6], Primaries[7], Primaries[8]}
48       };
49 
50       cmsToneCurve* gammaTable[3];
51       const int context = 1337;
52 
53       gammaTable[0] = gammaTable[1] = gammaTable[2] = cmsBuildGamma(gamma == 1 ? (cmsContext) &context : 0, gamma);
54 
55       result = cmsCreateRGBProfile(&w, &p, gammaTable);
56 
57       // _cmsSaveProfile( result, "/Stuff/matrixRGB.icc" );
58 
59       // cmsFreeToneCurve(gammaTable[0]);
60 
61       (*env)->ReleasePrimitiveArrayCritical(env, jWhitePoint, WhitePoint, 0);
62       (*env)->ReleasePrimitiveArrayCritical(env, jPrimaries, Primaries, 0);
63 
64       return (jlong)(intptr_t) result;
65 }
66 
Java_com_lightcrafts_utils_LCMSNative_cmsCreateLab2Profile(JNIEnv * env,jclass clazz)67 JNIEXPORT jlong JNICALL Java_com_lightcrafts_utils_LCMSNative_cmsCreateLab2Profile
68   (JNIEnv *env, jclass clazz)
69 {
70     return (jlong)(intptr_t) cmsCreateLab2Profile(NULL);
71 }
72 
Java_com_lightcrafts_utils_LCMSNative_cmsCloseProfile(JNIEnv * env,jclass clazz,jlong jhProfile)73 JNIEXPORT jboolean JNICALL Java_com_lightcrafts_utils_LCMSNative_cmsCloseProfile
74   (JNIEnv *env, jclass clazz, jlong jhProfile)
75 {
76     cmsHPROFILE hProfile = (cmsHPROFILE)(intptr_t) jhProfile;
77     return cmsCloseProfile(hProfile);
78 }
79 
Java_com_lightcrafts_utils_LCMSNative_cmsCreateTransform(JNIEnv * env,jclass clazz,jlong inputProfile,jint inputFormat,jlong outputProfile,jint outputFormat,jint intent,jint flags)80 JNIEXPORT jlong JNICALL Java_com_lightcrafts_utils_LCMSNative_cmsCreateTransform
81   (JNIEnv *env, jclass clazz, jlong inputProfile, jint inputFormat,
82    jlong outputProfile, jint outputFormat, jint intent, jint flags)
83 {
84     return (jlong)(intptr_t) cmsCreateTransform((cmsHPROFILE)(intptr_t) inputProfile, inputFormat,
85                                       (cmsHPROFILE)(intptr_t) outputProfile, outputFormat,
86                                       intent, flags);
87 }
88 
Java_com_lightcrafts_utils_LCMSNative_cmsCreateProofingTransform(JNIEnv * env,jclass clazz,jlong inputProfile,jint inputFormat,jlong outputProfile,jint outputFormat,jlong proofingProfile,jint intent,jint proofingIntent,jint flags)89 JNIEXPORT jlong JNICALL Java_com_lightcrafts_utils_LCMSNative_cmsCreateProofingTransform
90   (JNIEnv *env, jclass clazz, jlong inputProfile, jint inputFormat,
91    jlong outputProfile, jint outputFormat, jlong proofingProfile,
92    jint intent, jint proofingIntent, jint flags)
93 {
94     return (jlong)(intptr_t) cmsCreateProofingTransform((cmsHPROFILE)(intptr_t) inputProfile, inputFormat,
95 					      (cmsHPROFILE)(intptr_t) outputProfile, outputFormat,
96 					      (cmsHPROFILE)(intptr_t) proofingProfile,
97 					      intent, proofingIntent, flags);
98 }
99 
100 
Java_com_lightcrafts_utils_LCMSNative_cmsDeleteTransform(JNIEnv * env,jclass clazz,jlong hTransform)101 JNIEXPORT void JNICALL Java_com_lightcrafts_utils_LCMSNative_cmsDeleteTransform
102   (JNIEnv *env, jclass clazz, jlong hTransform)
103 {
104     cmsDeleteTransform((cmsHTRANSFORM)(intptr_t) hTransform);
105 }
106 
cmsDoTransformGeneric(JNIEnv * env,jclass clazz,jlong hTransform,jbyteArray jinputBuffer,jbyteArray joutputBuffer,jint size)107 void cmsDoTransformGeneric
108   (JNIEnv *env, jclass clazz, jlong hTransform, jbyteArray jinputBuffer, jbyteArray joutputBuffer, jint size)
109 {
110     char *inputBuffer = (char *) (*env)->GetPrimitiveArrayCritical(env, jinputBuffer, 0);
111     char *outputBuffer = (char *) (*env)->GetPrimitiveArrayCritical(env, joutputBuffer, 0);
112 
113     if (hTransform)
114         cmsDoTransform((cmsHTRANSFORM)(intptr_t) hTransform, inputBuffer, outputBuffer, size);
115 
116     (*env)->ReleasePrimitiveArrayCritical(env, jinputBuffer, inputBuffer, 0);
117     (*env)->ReleasePrimitiveArrayCritical(env, joutputBuffer, outputBuffer, 0);
118 }
119 
Java_com_lightcrafts_utils_LCMSNative_cmsDoTransform__J_3B_3BI(JNIEnv * env,jclass clazz,jlong hTransform,jbyteArray jinputBuffer,jbyteArray joutputBuffer,jint size)120 JNIEXPORT void JNICALL Java_com_lightcrafts_utils_LCMSNative_cmsDoTransform__J_3B_3BI
121   (JNIEnv *env, jclass clazz, jlong hTransform, jbyteArray jinputBuffer, jbyteArray joutputBuffer, jint size)
122 {
123     cmsDoTransformGeneric(env, clazz, hTransform, jinputBuffer, joutputBuffer, size);
124 }
125 
Java_com_lightcrafts_utils_LCMSNative_cmsDoTransform__J_3S_3SI(JNIEnv * env,jclass clazz,jlong hTransform,jbyteArray jinputBuffer,jbyteArray joutputBuffer,jint size)126 JNIEXPORT void JNICALL Java_com_lightcrafts_utils_LCMSNative_cmsDoTransform__J_3S_3SI
127   (JNIEnv *env, jclass clazz, jlong hTransform, jbyteArray jinputBuffer, jbyteArray joutputBuffer, jint size)
128 {
129     cmsDoTransformGeneric(env, clazz, hTransform, jinputBuffer, joutputBuffer, size);
130 }
131 
Java_com_lightcrafts_utils_LCMSNative_cmsDoTransform__J_3D_3DI(JNIEnv * env,jclass clazz,jlong hTransform,jbyteArray jinputBuffer,jbyteArray joutputBuffer,jint size)132 JNIEXPORT void JNICALL Java_com_lightcrafts_utils_LCMSNative_cmsDoTransform__J_3D_3DI
133   (JNIEnv *env, jclass clazz, jlong hTransform, jbyteArray jinputBuffer, jbyteArray joutputBuffer, jint size)
134 {
135     cmsDoTransformGeneric(env, clazz, hTransform, jinputBuffer, joutputBuffer, size);
136 }
137 
138