JDK-6523402 : OSS CMM: Some quality problems with GRAY, PYCC and CIEXYZ color spaces with lcms library
  • Type: Bug
  • Component: client-libs
  • Sub-Component: 2d
  • Affected Version: 7
  • Priority: P4
  • Status: Open
  • Resolution: Unresolved
  • OS: generic
  • CPU: generic
  • Submitted: 2007-02-09
  • Updated: 2022-11-30
The Version table provides details related to the release that this issue/RFE will be addressed.

Unresolved : Release in which this issue/RFE will be addressed.
Resolved: Release in which this issue/RFE has been resolved.
Fixed : Release in which this issue/RFE has been fixed. The release containing this fix may be available for download as an Early Access Release or a General Availability Release.

To download the current JDK release, click here.
Other
tbdUnresolved
Description
Here is tolerance values that used for comparing results of the color transformations with ones obtained from original Kodak color management system:

Color Space   Tolerance 

sRGB               3     
LINEAR_RGB         7         
GRAY              11
PYCC              46
CIEXYZ            48
There are some quality problems with following color spaces:  GRAY(not so noticeable), PYCC  and  CIEXYZ. Because of that following regression test is using large tolerance values for checking the result of transformations:

test/sun/java2d/cmm/ColorConvertOp/ColConvCCMTest.java

Comments
Results with GrayTest on JDK 20: 12,12,12, 21,21,21, 28,28,28, 33,33,33, 38,38,38, 42,42,42, 46,46,46,
30-11-2022

Please re-open if - if fix is in progress or on the plan to fix soon - if this is a P3 (file as P3, not P4)
14-03-2014

EVALUATION This problem happens because inaccuracy inside the littleCMS library. The same inaccuracy happens with both jdk and openJDK color profiles. Here is minimized java and native testcases showing the problem with GRAY -> sRGB transform. --------------GrayTest.java------------------ import java.awt.color.ColorSpace; public class GrayTest { final static int [] cols = {1, 2, 3, 4, 5, 6, 7}; public static void main(String [] args) { ColorSpace cs = ColorSpace.getInstance(ColorSpace.CS_GRAY); float [] p = new float[1]; for (int i = 0; i < cols.length; i++) { p[0] = cols[i]/255.0f; float [] r = cs.toRGB(p); for (int j = 0; j < r.length; j++) { System.out.print((int)(r[j]*255) + ","); } System.out.println(); } } } -------------------gray.cpp--------------------- #include <stdio.h> #include "lcms.h" char pixels[] = {1, 2, 3, 4, 5, 6, 7}; int main(int argc, char* argv[]) { char* in = pixels; char out[3]; cmsHPROFILE profiles[2]; profiles[0] = cmsOpenProfileFromFile("KCMS\\GRAY.pf", "r"); profiles[1] = cmsOpenProfileFromFile("KCMS\\sRGB.pf", "r"); cmsHTRANSFORM trans = cmsCreateMultiprofileTransform( profiles,2,BYTES_SH(1) | CHANNELS_SH(1), BYTES_SH(1) | CHANNELS_SH(3), 0/* perceptual*/,0); for (int i = 0; i < sizeof(pixels)/sizeof(char); i++) { cmsDoTransform(trans, in++, out, 1); printf("%d,%d,%d\n", out[0], out[1], out[2]); } } output from JDK6,7 with GrayTest: 12,12,12, 21,21,21, 28,28,28, 33,33,33, 38,38,38, 42,42,42, 46,46,46, output from openJDK with GrayTest and native testcase: 6,6,6, 12,12,12, 18,18,18, 24,24,24, 31,31,31, 37,37,37, 43,43,43,
06-03-2007