Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
dragonwell8_jdk
提交
fdf0805b
D
dragonwell8_jdk
项目概览
openanolis
/
dragonwell8_jdk
通知
4
Star
2
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
D
dragonwell8_jdk
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
fdf0805b
编写于
10月 24, 2012
作者:
B
bae
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
7053526: Upgrade JDK 8 to use Little CMS 2.4
Reviewed-by: prr, jgodinez
上级
5cce0799
变更
30
展开全部
隐藏空白更改
内联
并排
Showing
30 changed file
with
4595 addition
and
1062 deletion
+4595
-1062
make/sun/cmm/lcms/FILES_c_unix.gmk
make/sun/cmm/lcms/FILES_c_unix.gmk
+1
-0
make/sun/cmm/lcms/FILES_c_windows.gmk
make/sun/cmm/lcms/FILES_c_windows.gmk
+1
-0
src/share/native/sun/java2d/cmm/lcms/cmscam02.c
src/share/native/sun/java2d/cmm/lcms/cmscam02.c
+24
-24
src/share/native/sun/java2d/cmm/lcms/cmscgats.c
src/share/native/sun/java2d/cmm/lcms/cmscgats.c
+155
-56
src/share/native/sun/java2d/cmm/lcms/cmscnvrt.c
src/share/native/sun/java2d/cmm/lcms/cmscnvrt.c
+46
-24
src/share/native/sun/java2d/cmm/lcms/cmserr.c
src/share/native/sun/java2d/cmm/lcms/cmserr.c
+20
-8
src/share/native/sun/java2d/cmm/lcms/cmsgamma.c
src/share/native/sun/java2d/cmm/lcms/cmsgamma.c
+62
-16
src/share/native/sun/java2d/cmm/lcms/cmsgmt.c
src/share/native/sun/java2d/cmm/lcms/cmsgmt.c
+7
-8
src/share/native/sun/java2d/cmm/lcms/cmshalf.c
src/share/native/sun/java2d/cmm/lcms/cmshalf.c
+564
-0
src/share/native/sun/java2d/cmm/lcms/cmsintrp.c
src/share/native/sun/java2d/cmm/lcms/cmsintrp.c
+262
-91
src/share/native/sun/java2d/cmm/lcms/cmsio0.c
src/share/native/sun/java2d/cmm/lcms/cmsio0.c
+90
-22
src/share/native/sun/java2d/cmm/lcms/cmsio1.c
src/share/native/sun/java2d/cmm/lcms/cmsio1.c
+271
-16
src/share/native/sun/java2d/cmm/lcms/cmslut.c
src/share/native/sun/java2d/cmm/lcms/cmslut.c
+193
-29
src/share/native/sun/java2d/cmm/lcms/cmsmd5.c
src/share/native/sun/java2d/cmm/lcms/cmsmd5.c
+1
-1
src/share/native/sun/java2d/cmm/lcms/cmsmtrx.c
src/share/native/sun/java2d/cmm/lcms/cmsmtrx.c
+2
-1
src/share/native/sun/java2d/cmm/lcms/cmsnamed.c
src/share/native/sun/java2d/cmm/lcms/cmsnamed.c
+173
-17
src/share/native/sun/java2d/cmm/lcms/cmsopt.c
src/share/native/sun/java2d/cmm/lcms/cmsopt.c
+88
-24
src/share/native/sun/java2d/cmm/lcms/cmspack.c
src/share/native/sun/java2d/cmm/lcms/cmspack.c
+972
-320
src/share/native/sun/java2d/cmm/lcms/cmspcs.c
src/share/native/sun/java2d/cmm/lcms/cmspcs.c
+1
-0
src/share/native/sun/java2d/cmm/lcms/cmsplugin.c
src/share/native/sun/java2d/cmm/lcms/cmsplugin.c
+11
-6
src/share/native/sun/java2d/cmm/lcms/cmsps2.c
src/share/native/sun/java2d/cmm/lcms/cmsps2.c
+52
-36
src/share/native/sun/java2d/cmm/lcms/cmssamp.c
src/share/native/sun/java2d/cmm/lcms/cmssamp.c
+304
-1
src/share/native/sun/java2d/cmm/lcms/cmssm.c
src/share/native/sun/java2d/cmm/lcms/cmssm.c
+8
-6
src/share/native/sun/java2d/cmm/lcms/cmstypes.c
src/share/native/sun/java2d/cmm/lcms/cmstypes.c
+695
-99
src/share/native/sun/java2d/cmm/lcms/cmsvirt.c
src/share/native/sun/java2d/cmm/lcms/cmsvirt.c
+52
-40
src/share/native/sun/java2d/cmm/lcms/cmswtpnt.c
src/share/native/sun/java2d/cmm/lcms/cmswtpnt.c
+7
-5
src/share/native/sun/java2d/cmm/lcms/cmsxform.c
src/share/native/sun/java2d/cmm/lcms/cmsxform.c
+284
-87
src/share/native/sun/java2d/cmm/lcms/lcms2.h
src/share/native/sun/java2d/cmm/lcms/lcms2.h
+125
-28
src/share/native/sun/java2d/cmm/lcms/lcms2_internal.h
src/share/native/sun/java2d/cmm/lcms/lcms2_internal.h
+43
-87
src/share/native/sun/java2d/cmm/lcms/lcms2_plugin.h
src/share/native/sun/java2d/cmm/lcms/lcms2_plugin.h
+81
-10
未找到文件。
make/sun/cmm/lcms/FILES_c_unix.gmk
浏览文件 @
fdf0805b
...
...
@@ -30,6 +30,7 @@ FILES_c = \
cmserr.c \
cmsgamma.c \
cmsgmt.c \
cmshalf.c \
cmsintrp.c \
cmsio0.c \
cmsio1.c \
...
...
make/sun/cmm/lcms/FILES_c_windows.gmk
浏览文件 @
fdf0805b
...
...
@@ -30,6 +30,7 @@ FILES_c = \
cmserr.c \
cmsgamma.c \
cmsgmt.c \
cmshalf.c \
cmsintrp.c \
cmsio0.c \
cmsio1.c \
...
...
src/share/native/sun/java2d/cmm/lcms/cmscam02.c
浏览文件 @
fdf0805b
...
...
@@ -30,7 +30,7 @@
//---------------------------------------------------------------------------------
//
// Little Color Management System
// Copyright (c) 1998-201
0
Marti Maria Saguer
// Copyright (c) 1998-201
2
Marti Maria Saguer
//
// Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the "Software"),
...
...
@@ -409,29 +409,29 @@ cmsHANDLE CMSEXPORT cmsCIECAM02Init(cmsContext ContextID, const cmsViewingCondi
switch
(
lpMod
->
surround
)
{
case
CUTSHEET_SURROUND
:
lpMod
->
F
=
0
.
8
;
lpMod
->
c
=
0
.
41
;
lpMod
->
Nc
=
0
.
8
;
break
;
case
DARK_SURROUND
:
lpMod
->
F
=
0
.
8
;
lpMod
->
c
=
0
.
525
;
lpMod
->
Nc
=
0
.
8
;
break
;
case
DIM_SURROUND
:
lpMod
->
F
=
0
.
9
;
lpMod
->
c
=
0
.
59
;
lpMod
->
Nc
=
0
.
95
;
break
;
default:
// Average surround
lpMod
->
F
=
1
.
0
;
lpMod
->
c
=
0
.
69
;
lpMod
->
Nc
=
1
.
0
;
case
CUTSHEET_SURROUND
:
lpMod
->
F
=
0
.
8
;
lpMod
->
c
=
0
.
41
;
lpMod
->
Nc
=
0
.
8
;
break
;
case
DARK_SURROUND
:
lpMod
->
F
=
0
.
8
;
lpMod
->
c
=
0
.
525
;
lpMod
->
Nc
=
0
.
8
;
break
;
case
DIM_SURROUND
:
lpMod
->
F
=
0
.
9
;
lpMod
->
c
=
0
.
59
;
lpMod
->
Nc
=
0
.
95
;
break
;
default:
// Average surround
lpMod
->
F
=
1
.
0
;
lpMod
->
c
=
0
.
69
;
lpMod
->
Nc
=
1
.
0
;
}
lpMod
->
n
=
compute_n
(
lpMod
);
...
...
src/share/native/sun/java2d/cmm/lcms/cmscgats.c
浏览文件 @
fdf0805b
...
...
@@ -30,7 +30,7 @@
//---------------------------------------------------------------------------------
//
// Little Color Management System
// Copyright (c) 1998-201
0
Marti Maria Saguer
// Copyright (c) 1998-201
2
Marti Maria Saguer
//
// Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the "Software"),
...
...
@@ -73,6 +73,7 @@
# define DIR_CHAR '/'
#endif
// Symbols
typedef
enum
{
...
...
@@ -143,6 +144,8 @@ typedef struct _SubAllocator {
// Table. Each individual table can hold properties and rows & cols
typedef
struct
_Table
{
char
SheetType
[
MAXSTR
];
// The first row of the IT8 (the type)
int
nSamples
,
nPatches
;
// Cols, Rows
int
SampleID
;
// Pos of ID
...
...
@@ -162,7 +165,6 @@ typedef struct _FileContext {
// This struct hold all information about an open IT8 handler.
typedef
struct
{
char
SheetType
[
MAXSTR
];
// The first row of the IT8 (the type)
cmsUInt32Number
TablesCount
;
// How many tables in this stream
cmsUInt32Number
nTable
;
// The actual table
...
...
@@ -433,6 +435,8 @@ cmsBool isabsolutepath(const char *path)
return
FALSE
;
}
// Makes a file path based on a given reference path
// NOTE: this function doesn't check if the path exists or even if it's legal
static
...
...
@@ -574,7 +578,7 @@ void ReadReal(cmsIT8* it8, int inum)
if
(
it8
->
ch
==
'.'
)
{
// Decimal point
cmsFloat64Number
frac
=
0
.
0
;
// fraction
int
prec
=
0
;
// precision
int
prec
=
0
;
// precision
NextCh
(
it8
);
// Eats dec. point
...
...
@@ -621,6 +625,81 @@ void ReadReal(cmsIT8* it8, int inum)
}
}
// Parses a float number
// This can not call directly atof because it uses locale dependant
// parsing, while CCMX files always use . as decimal separator
static
cmsFloat64Number
ParseFloatNumber
(
const
char
*
Buffer
)
{
cmsFloat64Number
dnum
=
0
.
0
;
int
sign
=
1
;
if
(
*
Buffer
==
'-'
||
*
Buffer
==
'+'
)
{
sign
=
(
*
Buffer
==
'-'
)
?
-
1
:
1
;
Buffer
++
;
}
while
(
*
Buffer
&&
isdigit
((
int
)
*
Buffer
))
{
dnum
=
dnum
*
10
.
0
+
(
*
Buffer
-
'0'
);
if
(
*
Buffer
)
Buffer
++
;
}
if
(
*
Buffer
==
'.'
)
{
cmsFloat64Number
frac
=
0
.
0
;
// fraction
int
prec
=
0
;
// precission
if
(
*
Buffer
)
Buffer
++
;
while
(
*
Buffer
&&
isdigit
((
int
)
*
Buffer
))
{
frac
=
frac
*
10
.
0
+
(
*
Buffer
-
'0'
);
prec
++
;
if
(
*
Buffer
)
Buffer
++
;
}
dnum
=
dnum
+
(
frac
/
xpow10
(
prec
));
}
// Exponent, example 34.00E+20
if
(
*
Buffer
&&
toupper
(
*
Buffer
)
==
'E'
)
{
int
e
;
int
sgn
;
if
(
*
Buffer
)
Buffer
++
;
sgn
=
1
;
if
(
*
Buffer
==
'-'
)
{
sgn
=
-
1
;
if
(
*
Buffer
)
Buffer
++
;
}
else
if
(
*
Buffer
==
'+'
)
{
sgn
=
+
1
;
if
(
*
Buffer
)
Buffer
++
;
}
e
=
0
;
while
(
*
Buffer
&&
isdigit
((
int
)
*
Buffer
))
{
if
((
cmsFloat64Number
)
e
*
10L
<
INT_MAX
)
e
=
e
*
10
+
(
*
Buffer
-
'0'
);
if
(
*
Buffer
)
Buffer
++
;
}
e
=
sgn
*
e
;
dnum
=
dnum
*
xpow10
(
e
);
}
return
sign
*
dnum
;
}
// Reads next symbol
...
...
@@ -1011,7 +1090,7 @@ void* AllocChunk(cmsIT8* it8, cmsUInt32Number size)
cmsUInt32Number
Free
=
it8
->
Allocator
.
BlockSize
-
it8
->
Allocator
.
Used
;
cmsUInt8Number
*
ptr
;
size
=
_cmsALIGN
LONG
(
size
);
size
=
_cmsALIGN
MEM
(
size
);
if
(
size
>
Free
)
{
...
...
@@ -1212,7 +1291,7 @@ cmsInt32Number CMSEXPORT cmsIT8SetTable(cmsHANDLE IT8, cmsUInt32Number nTable)
cmsHANDLE
CMSEXPORT
cmsIT8Alloc
(
cmsContext
ContextID
)
{
cmsIT8
*
it8
;
int
i
;
cmsUInt32Number
i
;
it8
=
(
cmsIT8
*
)
_cmsMallocZero
(
ContextID
,
sizeof
(
cmsIT8
));
if
(
it8
==
NULL
)
return
NULL
;
...
...
@@ -1243,7 +1322,7 @@ cmsHANDLE CMSEXPORT cmsIT8Alloc(cmsContext ContextID)
it8
->
lineno
=
1
;
strcpy
(
it8
->
DoubleFormatter
,
DEFAULT_DBL_FORMAT
);
strcpy
(
it8
->
SheetType
,
"CGATS.17"
);
cmsIT8SetSheetType
((
cmsHANDLE
)
it8
,
"CGATS.17"
);
// Initialize predefined properties & data
...
...
@@ -1260,18 +1339,15 @@ cmsHANDLE CMSEXPORT cmsIT8Alloc(cmsContext ContextID)
const
char
*
CMSEXPORT
cmsIT8GetSheetType
(
cmsHANDLE
hIT8
)
{
cmsIT8
*
it8
=
(
cmsIT8
*
)
hIT8
;
return
it8
->
SheetType
;
return
GetTable
((
cmsIT8
*
)
hIT8
)
->
SheetType
;
}
cmsBool
CMSEXPORT
cmsIT8SetSheetType
(
cmsHANDLE
hIT8
,
const
char
*
Type
)
{
cmsIT8
*
it8
=
(
cmsIT8
*
)
hIT8
;
TABLE
*
t
=
GetTable
((
cmsIT8
*
)
hIT8
)
;
strncpy
(
it8
->
SheetType
,
Type
,
MAXSTR
-
1
);
it8
->
SheetType
[
MAXSTR
-
1
]
=
0
;
strncpy
(
t
->
SheetType
,
Type
,
MAXSTR
-
1
);
t
->
SheetType
[
MAXSTR
-
1
]
=
0
;
return
TRUE
;
}
...
...
@@ -1285,8 +1361,6 @@ cmsBool CMSEXPORT cmsIT8SetComment(cmsHANDLE hIT8, const char* Val)
return
AddToList
(
it8
,
&
GetTable
(
it8
)
->
HeaderList
,
"# "
,
NULL
,
Val
,
WRITE_UNCOOKED
)
!=
NULL
;
}
// Sets a property
cmsBool
CMSEXPORT
cmsIT8SetPropertyStr
(
cmsHANDLE
hIT8
,
const
char
*
Key
,
const
char
*
Val
)
{
...
...
@@ -1298,7 +1372,6 @@ cmsBool CMSEXPORT cmsIT8SetPropertyStr(cmsHANDLE hIT8, const char* Key, const ch
return
AddToList
(
it8
,
&
GetTable
(
it8
)
->
HeaderList
,
Key
,
NULL
,
Val
,
WRITE_STRINGIFY
)
!=
NULL
;
}
cmsBool
CMSEXPORT
cmsIT8SetPropertyDbl
(
cmsHANDLE
hIT8
,
const
char
*
cProp
,
cmsFloat64Number
Val
)
{
cmsIT8
*
it8
=
(
cmsIT8
*
)
hIT8
;
...
...
@@ -1351,8 +1424,7 @@ cmsFloat64Number CMSEXPORT cmsIT8GetPropertyDbl(cmsHANDLE hIT8, const char* cPro
{
const
char
*
v
=
cmsIT8GetProperty
(
hIT8
,
cProp
);
if
(
v
)
return
atof
(
v
);
else
return
0
.
0
;
return
ParseFloatNumber
(
v
);
}
const
char
*
CMSEXPORT
cmsIT8GetPropertyMulti
(
cmsHANDLE
hIT8
,
const
char
*
Key
,
const
char
*
SubKey
)
...
...
@@ -1553,6 +1625,9 @@ void WriteHeader(cmsIT8* it8, SAVESTREAM* fp)
KEYVALUE
*
p
;
TABLE
*
t
=
GetTable
(
it8
);
// Writes the type
WriteStr
(
fp
,
t
->
SheetType
);
WriteStr
(
fp
,
"
\n
"
);
for
(
p
=
t
->
HeaderList
;
(
p
!=
NULL
);
p
=
p
->
Next
)
{
...
...
@@ -1701,8 +1776,6 @@ cmsBool CMSEXPORT cmsIT8SaveToFile(cmsHANDLE hIT8, const char* cFileName)
sd
.
stream
=
fopen
(
cFileName
,
"wt"
);
if
(
!
sd
.
stream
)
return
FALSE
;
WriteStr
(
&
sd
,
it8
->
SheetType
);
WriteStr
(
&
sd
,
"
\n
"
);
for
(
i
=
0
;
i
<
it8
->
TablesCount
;
i
++
)
{
cmsIT8SetTable
(
hIT8
,
i
);
...
...
@@ -1737,20 +1810,18 @@ cmsBool CMSEXPORT cmsIT8SaveToMem(cmsHANDLE hIT8, void *MemPtr, cmsUInt32Number*
else
sd
.
Max
=
0
;
// Just counting the needed bytes
WriteStr
(
&
sd
,
it8
->
SheetType
);
WriteStr
(
&
sd
,
"
\n
"
);
for
(
i
=
0
;
i
<
it8
->
TablesCount
;
i
++
)
{
cmsIT8SetTable
(
hIT8
,
i
);
WriteHeader
(
it8
,
&
sd
);
WriteDataFormat
(
&
sd
,
it8
);
WriteData
(
&
sd
,
it8
);
cmsIT8SetTable
(
hIT8
,
i
);
WriteHeader
(
it8
,
&
sd
);
WriteDataFormat
(
&
sd
,
it8
);
WriteData
(
&
sd
,
it8
);
}
sd
.
Used
++
;
// The \0 at the very end
if
(
sd
.
Base
)
sd
.
Ptr
=
0
;
*
sd
.
Ptr
=
0
;
*
BytesNeeded
=
sd
.
Used
;
...
...
@@ -1963,12 +2034,8 @@ cmsBool HeaderSection(cmsIT8* it8)
static
cmsBool
ParseIT8
(
cmsIT8
*
it8
,
cmsBool
nosheet
)
void
ReadType
(
cmsIT8
*
it8
,
char
*
SheetTypePtr
)
{
char
*
SheetTypePtr
=
it8
->
SheetType
;
if
(
nosheet
==
0
)
{
// First line is a very special case.
while
(
isseparator
(
it8
->
ch
))
...
...
@@ -1979,9 +2046,20 @@ cmsBool ParseIT8(cmsIT8* it8, cmsBool nosheet)
*
SheetTypePtr
++=
(
char
)
it8
->
ch
;
NextCh
(
it8
);
}
}
*
SheetTypePtr
=
0
;
}
static
cmsBool
ParseIT8
(
cmsIT8
*
it8
,
cmsBool
nosheet
)
{
char
*
SheetTypePtr
=
it8
->
Tab
[
0
].
SheetType
;
if
(
nosheet
==
0
)
{
ReadType
(
it8
,
SheetTypePtr
);
}
InSymbol
(
it8
);
SkipEOLN
(
it8
);
...
...
@@ -2003,6 +2081,39 @@ cmsBool ParseIT8(cmsIT8* it8, cmsBool nosheet)
AllocTable
(
it8
);
it8
->
nTable
=
it8
->
TablesCount
-
1
;
// Read sheet type if present. We only support identifier and string.
// <ident> <eoln> is a type string
// anything else, is not a type string
if
(
nosheet
==
0
)
{
if
(
it8
->
sy
==
SIDENT
)
{
// May be a type sheet or may be a prop value statement. We cannot use insymbol in
// this special case...
while
(
isseparator
(
it8
->
ch
))
NextCh
(
it8
);
// If a newline is found, then this is a type string
if
(
it8
->
ch
==
'\n'
)
{
cmsIT8SetSheetType
(
it8
,
it8
->
id
);
InSymbol
(
it8
);
}
else
{
// It is not. Just continue
cmsIT8SetSheetType
(
it8
,
""
);
}
}
else
// Validate quoted strings
if
(
it8
->
sy
==
SSTRING
)
{
cmsIT8SetSheetType
(
it8
,
it8
->
str
);
InSymbol
(
it8
);
}
}
}
break
;
...
...
@@ -2123,14 +2234,14 @@ void CookPointers(cmsIT8* it8)
// Try to infere if the file is a CGATS/IT8 file at all. Read first line
// that should be something like some printable characters plus a \n
// returns 0 if this is not like a CGATS, or an integer otherwise. This integer is the number of words in first line?
static
int
IsMyBlock
(
cmsUInt8Number
*
Buffer
,
int
n
)
{
int
col
s
=
1
,
space
=
0
,
quot
=
0
;
int
word
s
=
1
,
space
=
0
,
quot
=
0
;
int
i
;
if
(
n
<
10
)
return
FALSE
;
// Too small
if
(
n
<
10
)
return
0
;
// Too small
if
(
n
>
132
)
n
=
132
;
...
...
@@ -2141,7 +2252,7 @@ int IsMyBlock(cmsUInt8Number* Buffer, int n)
{
case
'\n'
:
case
'\r'
:
return
quot
==
1
||
cols
>
2
?
0
:
col
s
;
return
((
quot
==
1
)
||
(
words
>
2
))
?
0
:
word
s
;
case
'\t'
:
case
' '
:
if
(
!
quot
&&
!
space
)
...
...
@@ -2153,14 +2264,13 @@ int IsMyBlock(cmsUInt8Number* Buffer, int n)
default:
if
(
Buffer
[
i
]
<
32
)
return
0
;
if
(
Buffer
[
i
]
>
127
)
return
0
;
col
s
+=
space
;
word
s
+=
space
;
space
=
0
;
break
;
}
}
return
FALSE
;
return
0
;
}
...
...
@@ -2271,7 +2381,7 @@ cmsHANDLE CMSEXPORT cmsIT8LoadFromFile(cmsContext ContextID, const char* cFileN
it8
->
nTable
=
0
;
if
(
fclose
(
it8
->
FileStack
[
0
]
->
Stream
)
!=
0
)
{
cmsIT8Free
(
hIT8
);
cmsIT8Free
(
hIT8
);
return
NULL
;
}
...
...
@@ -2454,13 +2564,7 @@ cmsFloat64Number CMSEXPORT cmsIT8GetDataRowColDbl(cmsHANDLE hIT8, int row, int c
Buffer
=
cmsIT8GetDataRowCol
(
hIT8
,
row
,
col
);
if
(
Buffer
)
{
return
atof
(
Buffer
);
}
else
return
0
;
return
ParseFloatNumber
(
Buffer
);
}
...
...
@@ -2515,14 +2619,7 @@ cmsFloat64Number CMSEXPORT cmsIT8GetDataDbl(cmsHANDLE it8, const char* cPatch,
Buffer
=
cmsIT8GetData
(
it8
,
cPatch
,
cSample
);
if
(
Buffer
)
{
return
atof
(
Buffer
);
}
else
{
return
0
;
}
return
ParseFloatNumber
(
Buffer
);
}
...
...
@@ -2680,5 +2777,7 @@ void CMSEXPORT cmsIT8DefineDblFormat(cmsHANDLE hIT8, const char* Formatter)
strcpy
(
it8
->
DoubleFormatter
,
DEFAULT_DBL_FORMAT
);
else
strcpy
(
it8
->
DoubleFormatter
,
Formatter
);
it8
->
DoubleFormatter
[
sizeof
(
it8
->
DoubleFormatter
)
-
1
]
=
0
;
}
src/share/native/sun/java2d/cmm/lcms/cmscnvrt.c
浏览文件 @
fdf0805b
...
...
@@ -30,7 +30,7 @@
//---------------------------------------------------------------------------------
//
// Little Color Management System
// Copyright (c) 1998-201
0
Marti Maria Saguer
// Copyright (c) 1998-201
2
Marti Maria Saguer
//
// Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the "Software"),
...
...
@@ -193,17 +193,21 @@ void ComputeBlackPointCompensation(const cmsCIEXYZ* BlackPointIn,
static
cmsFloat64Number
CHAD2Temp
(
const
cmsMAT3
*
Chad
)
{
// Convert D50 across CHAD to get the absolute white point
cmsVEC3
d
,
s
;
cmsCIEXYZ
Dest
;
cmsCIExyY
DestChromaticity
;
cmsFloat64Number
TempK
;
// Convert D50 across inverse CHAD to get the absolute white point
cmsVEC3
d
,
s
;
cmsCIEXYZ
Dest
;
cmsCIExyY
DestChromaticity
;
cmsFloat64Number
TempK
;
cmsMAT3
m1
,
m2
;
m1
=
*
Chad
;
if
(
!
_cmsMAT3inverse
(
&
m1
,
&
m2
))
return
FALSE
;
s
.
n
[
VX
]
=
cmsD50_XYZ
()
->
X
;
s
.
n
[
VY
]
=
cmsD50_XYZ
()
->
Y
;
s
.
n
[
VZ
]
=
cmsD50_XYZ
()
->
Z
;
_cmsMAT3eval
(
&
d
,
Chad
,
&
s
);
_cmsMAT3eval
(
&
d
,
&
m2
,
&
s
);
Dest
.
X
=
d
.
n
[
VX
];
Dest
.
Y
=
d
.
n
[
VY
];
...
...
@@ -219,15 +223,14 @@ cmsFloat64Number CHAD2Temp(const cmsMAT3* Chad)
// Compute a CHAD based on a given temperature
static
void
Temp2CHAD
(
cmsMAT3
*
Chad
,
cmsFloat64Number
Temp
)
void
Temp2CHAD
(
cmsMAT3
*
Chad
,
cmsFloat64Number
Temp
)
{
cmsCIEXYZ
White
;
cmsCIExyY
ChromaticityOfWhite
;
cmsWhitePointFromTemp
(
&
ChromaticityOfWhite
,
Temp
);
cmsxyY2XYZ
(
&
White
,
&
ChromaticityOfWhite
);
_cmsAdaptationMatrix
(
Chad
,
NULL
,
cmsD50_XYZ
(),
&
White
);
_cmsAdaptationMatrix
(
Chad
,
NULL
,
&
White
,
cmsD50_XYZ
());
}
// Join scalings to obtain relative input to absolute and then to relative output.
...
...
@@ -240,7 +243,7 @@ cmsBool ComputeAbsoluteIntent(cmsFloat64Number AdaptationState,
const
cmsMAT3
*
ChromaticAdaptationMatrixOut
,
cmsMAT3
*
m
)
{
cmsMAT3
Scale
,
m1
,
m2
,
m3
;
cmsMAT3
Scale
,
m1
,
m2
,
m3
,
m4
;
// Adaptation state
if
(
AdaptationState
==
1
.
0
)
{
...
...
@@ -259,23 +262,32 @@ cmsBool ComputeAbsoluteIntent(cmsFloat64Number AdaptationState,
_cmsVEC3init
(
&
Scale
.
v
[
1
],
0
,
WhitePointIn
->
Y
/
WhitePointOut
->
Y
,
0
);
_cmsVEC3init
(
&
Scale
.
v
[
2
],
0
,
0
,
WhitePointIn
->
Z
/
WhitePointOut
->
Z
);
m1
=
*
ChromaticAdaptationMatrixIn
;
if
(
!
_cmsMAT3inverse
(
&
m1
,
&
m2
))
return
FALSE
;
_cmsMAT3per
(
&
m3
,
&
m2
,
&
Scale
);
// m3 holds CHAD from input white to D50 times abs. col. scaling
if
(
AdaptationState
==
0
.
0
)
{
m1
=
*
ChromaticAdaptationMatrixOut
;
_cmsMAT3per
(
&
m2
,
&
m1
,
&
Scale
);
// m2 holds CHAD from output white to D50 times abs. col. scaling
// Observer is not adapted, undo the chromatic adaptation
_cmsMAT3per
(
m
,
&
m3
,
ChromaticAdaptationMatrixOut
);
m3
=
*
ChromaticAdaptationMatrixIn
;
if
(
!
_cmsMAT3inverse
(
&
m3
,
&
m4
))
return
FALSE
;
_cmsMAT3per
(
m
,
&
m2
,
&
m4
);
}
else
{
cmsMAT3
MixedCHAD
;
cmsFloat64Number
TempSrc
,
TempDest
,
Temp
;
TempSrc
=
CHAD2Temp
(
ChromaticAdaptationMatrixIn
);
// K for source white
TempDest
=
CHAD2Temp
(
ChromaticAdaptationMatrixOut
);
// K for dest white
m1
=
*
ChromaticAdaptationMatrixIn
;
if
(
!
_cmsMAT3inverse
(
&
m1
,
&
m2
))
return
FALSE
;
_cmsMAT3per
(
&
m3
,
&
m2
,
&
Scale
);
// m3 holds CHAD from input white to D50 times abs. col. scaling
TempSrc
=
CHAD2Temp
(
ChromaticAdaptationMatrixIn
);
TempDest
=
CHAD2Temp
(
ChromaticAdaptationMatrixOut
);
if
(
TempSrc
<
0
.
0
||
TempDest
<
0
.
0
)
return
FALSE
;
// Something went wrong
...
...
@@ -285,9 +297,9 @@ cmsBool ComputeAbsoluteIntent(cmsFloat64Number AdaptationState,
return
TRUE
;
}
Temp
=
AdaptationState
*
TempSrc
+
(
1
.
0
-
AdaptationState
)
*
TempDest
;
Temp
=
(
1
.
0
-
AdaptationState
)
*
TempDest
+
AdaptationState
*
TempSrc
;
// Get a CHAD from
D50 to whatever output temperature
. This replaces output CHAD
// Get a CHAD from
whatever output temperature to D50
. This replaces output CHAD
Temp2CHAD
(
&
MixedCHAD
,
Temp
);
_cmsMAT3per
(
m
,
&
m3
,
&
MixedCHAD
);
...
...
@@ -362,7 +374,7 @@ cmsBool ComputeConversion(int i, cmsHPROFILE hProfiles[],
cmsCIEXYZ
BlackPointIn
,
BlackPointOut
;
cmsDetectBlackPoint
(
&
BlackPointIn
,
hProfiles
[
i
-
1
],
Intent
,
0
);
cmsDetectBlackPoint
(
&
BlackPointOut
,
hProfiles
[
i
],
Intent
,
0
);
cmsDetect
Destination
BlackPoint
(
&
BlackPointOut
,
hProfiles
[
i
],
Intent
,
0
);
// If black points are equal, then do nothing
if
(
BlackPointIn
.
X
!=
BlackPointOut
.
X
||
...
...
@@ -463,6 +475,10 @@ cmsBool ColorSpaceIsCompatible(cmsColorSpaceSignature a, cmsColorSpaceSignature
// If they are same, they are compatible.
if
(
a
==
b
)
return
TRUE
;
// Check for MCH4 substitution of CMYK
if
((
a
==
cmsSig4colorData
)
&&
(
b
==
cmsSigCmykData
))
return
TRUE
;
if
((
a
==
cmsSigCmykData
)
&&
(
b
==
cmsSig4colorData
))
return
TRUE
;
// Check for XYZ/Lab. Those spaces are interchangeable as they can be computed one from other.
if
((
a
==
cmsSigXYZData
)
&&
(
b
==
cmsSigLabData
))
return
TRUE
;
if
((
a
==
cmsSigLabData
)
&&
(
b
==
cmsSigXYZData
))
return
TRUE
;
...
...
@@ -511,7 +527,7 @@ cmsPipeline* DefaultICCintents(cmsContext ContextID,
lIsInput
=
TRUE
;
}
else
{
// Else use profile in the input direction if current space is not PCS
// Else use profile in the input direction if current space is not PCS
lIsInput
=
(
CurrentColorSpace
!=
cmsSigXYZData
)
&&
(
CurrentColorSpace
!=
cmsSigLabData
);
}
...
...
@@ -537,7 +553,7 @@ cmsPipeline* DefaultICCintents(cmsContext ContextID,
// If devicelink is found, then no custom intent is allowed and we can
// read the LUT to be applied. Settings don't apply here.
if
(
lIsDeviceLink
)
{
if
(
lIsDeviceLink
||
((
ClassSig
==
cmsSigNamedColorClass
)
&&
(
nProfiles
==
1
))
)
{
// Get the involved LUT from the profile
Lut
=
_cmsReadDevicelinkLUT
(
hProfile
,
Intent
);
...
...
@@ -876,7 +892,8 @@ cmsPipeline* BlackPreservingKPlaneIntents(cmsContext ContextID,
// Check for non-cmyk profiles
if
(
cmsGetColorSpace
(
hProfiles
[
0
])
!=
cmsSigCmykData
||
cmsGetColorSpace
(
hProfiles
[
nProfiles
-
1
])
!=
cmsSigCmykData
)
!
(
cmsGetColorSpace
(
hProfiles
[
nProfiles
-
1
])
==
cmsSigCmykData
||
cmsGetDeviceClass
(
hProfiles
[
nProfiles
-
1
])
==
cmsSigOutputClass
))
return
DefaultICCintents
(
ContextID
,
nProfiles
,
ICCIntents
,
hProfiles
,
BPC
,
AdaptationStates
,
dwFlags
);
// Allocate an empty LUT for holding the result
...
...
@@ -893,6 +910,8 @@ cmsPipeline* BlackPreservingKPlaneIntents(cmsContext ContextID,
// Get total area coverage (in 0..1 domain)
bp
.
MaxTAC
=
cmsDetectTAC
(
hProfiles
[
nProfiles
-
1
])
/
100
.
0
;
if
(
bp
.
MaxTAC
<=
0
)
goto
Cleanup
;
// Create a LUT holding normal ICC transform
bp
.
cmyk2cmyk
=
DefaultICCintents
(
ContextID
,
...
...
@@ -902,6 +921,7 @@ cmsPipeline* BlackPreservingKPlaneIntents(cmsContext ContextID,
BPC
,
AdaptationStates
,
dwFlags
);
if
(
bp
.
cmyk2cmyk
==
NULL
)
goto
Cleanup
;
// Now the tone curve
bp
.
KTone
=
_cmsBuildKToneCurve
(
ContextID
,
4096
,
nProfiles
,
...
...
@@ -910,7 +930,7 @@ cmsPipeline* BlackPreservingKPlaneIntents(cmsContext ContextID,
BPC
,
AdaptationStates
,
dwFlags
);
if
(
bp
.
KTone
==
NULL
)
goto
Cleanup
;
// To measure the output, Last profile to Lab
hLab
=
cmsCreateLab4ProfileTHR
(
ContextID
,
NULL
);
...
...
@@ -918,6 +938,7 @@ cmsPipeline* BlackPreservingKPlaneIntents(cmsContext ContextID,
CHANNELS_SH
(
4
)
|
BYTES_SH
(
2
),
hLab
,
TYPE_Lab_DBL
,
INTENT_RELATIVE_COLORIMETRIC
,
cmsFLAGS_NOCACHE
|
cmsFLAGS_NOOPTIMIZE
);
if
(
bp
.
hProofOutput
==
NULL
)
goto
Cleanup
;
// Same as anterior, but lab in the 0..1 range
bp
.
cmyk2Lab
=
cmsCreateTransformTHR
(
ContextID
,
hProfiles
[
nProfiles
-
1
],
...
...
@@ -925,6 +946,7 @@ cmsPipeline* BlackPreservingKPlaneIntents(cmsContext ContextID,
FLOAT_SH
(
1
)
|
CHANNELS_SH
(
3
)
|
BYTES_SH
(
4
),
INTENT_RELATIVE_COLORIMETRIC
,
cmsFLAGS_NOCACHE
|
cmsFLAGS_NOOPTIMIZE
);
if
(
bp
.
cmyk2Lab
==
NULL
)
goto
Cleanup
;
cmsCloseProfile
(
hLab
);
// Error estimation (for debug only)
...
...
src/share/native/sun/java2d/cmm/lcms/cmserr.c
浏览文件 @
fdf0805b
...
...
@@ -30,7 +30,7 @@
//---------------------------------------------------------------------------------
//
// Little Color Management System
// Copyright (c) 1998-201
0
Marti Maria Saguer
// Copyright (c) 1998-201
2
Marti Maria Saguer
//
// Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the "Software"),
...
...
@@ -72,17 +72,21 @@ int CMSEXPORT cmsstrcasecmp(const char* s1, const char* s2)
// long int because C99 specifies ftell in such way (7.19.9.2)
long
int
CMSEXPORT
cmsfilelength
(
FILE
*
f
)
{
long
int
n
;
long
int
p
,
n
;
p
=
ftell
(
f
);
// register current file position
if
(
fseek
(
f
,
0
,
SEEK_END
)
!=
0
)
{
return
-
1
;
}
n
=
ftell
(
f
);
fseek
(
f
,
0
,
SEEK_SET
);
fseek
(
f
,
p
,
SEEK_SET
);
// file position restored
return
n
;
}
// Memory handling ------------------------------------------------------------------
//
// This is the interface to low-level memory management routines. By default a simple
...
...
@@ -160,6 +164,12 @@ void* _cmsCallocDefaultFn(cmsContext ContextID, cmsUInt32Number num, cmsUInt32Nu
{
cmsUInt32Number
Total
=
num
*
size
;
// Preserve calloc behaviour
if
(
Total
==
0
)
return
NULL
;
// Safe check for overflow.
if
(
num
>=
UINT_MAX
/
size
)
return
NULL
;
// Check for overflow
if
(
Total
<
num
||
Total
<
size
)
{
return
NULL
;
...
...
@@ -269,12 +279,16 @@ void* CMSEXPORT _cmsDupMem(cmsContext ContextID, const void* Org, cmsUInt32Numbe
// Sub allocation takes care of many pointers of small size. The memory allocated in
// this way have be freed at once. Next function allocates a single chunk for linked list
// I prefer this method over realloc due to the big inpact on xput realloc may have if
// memory is being swapped to disk. This approach is safer (although that
s not true on any platform
)
// memory is being swapped to disk. This approach is safer (although that
may not be true on all platforms
)
static
_cmsSubAllocator_chunk
*
_cmsCreateSubAllocChunk
(
cmsContext
ContextID
,
cmsUInt32Number
Initial
)
{
_cmsSubAllocator_chunk
*
chunk
;
// 20K by default
if
(
Initial
==
0
)
Initial
=
20
*
1024
;
// Create the container
chunk
=
(
_cmsSubAllocator_chunk
*
)
_cmsMallocZero
(
ContextID
,
sizeof
(
_cmsSubAllocator_chunk
));
if
(
chunk
==
NULL
)
return
NULL
;
...
...
@@ -288,9 +302,7 @@ _cmsSubAllocator_chunk* _cmsCreateSubAllocChunk(cmsContext ContextID, cmsUInt32N
return
NULL
;
}
// 20K by default
if
(
Initial
==
0
)
Initial
=
20
*
1024
;
chunk
->
BlockSize
=
Initial
;
chunk
->
Used
=
0
;
...
...
@@ -344,7 +356,7 @@ void* _cmsSubAlloc(_cmsSubAllocator* sub, cmsUInt32Number size)
cmsUInt32Number
Free
=
sub
->
h
->
BlockSize
-
sub
->
h
->
Used
;
cmsUInt8Number
*
ptr
;
size
=
_cmsALIGN
LONG
(
size
);
size
=
_cmsALIGN
MEM
(
size
);
// Check for memory. If there is no room, allocate a new chunk of double memory size.
if
(
size
>
Free
)
{
...
...
src/share/native/sun/java2d/cmm/lcms/cmsgamma.c
浏览文件 @
fdf0805b
...
...
@@ -30,7 +30,7 @@
//---------------------------------------------------------------------------------
//
// Little Color Management System
// Copyright (c) 1998-201
0
Marti Maria Saguer
// Copyright (c) 1998-201
2
Marti Maria Saguer
//
// Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the "Software"),
...
...
@@ -277,18 +277,28 @@ cmsFloat64Number DefaultEvalParametricFn(cmsInt32Number Type, const cmsFloat64Nu
switch
(
Type
)
{
// X = Y ^ Gamma
// X = Y ^ Gamma
case
1
:
if
(
R
<
0
)
Val
=
0
;
if
(
R
<
0
)
{
if
(
fabs
(
Params
[
0
]
-
1
.
0
)
<
MATRIX_DET_TOLERANCE
)
Val
=
R
;
else
Val
=
0
;
}
else
Val
=
pow
(
R
,
Params
[
0
]);
break
;
// Type 1 Reversed: X = Y ^1/gamma
case
-
1
:
if
(
R
<
0
)
Val
=
0
;
if
(
R
<
0
)
{
if
(
fabs
(
Params
[
0
]
-
1
.
0
)
<
MATRIX_DET_TOLERANCE
)
Val
=
R
;
else
Val
=
0
;
}
else
Val
=
pow
(
R
,
1
/
Params
[
0
]);
break
;
...
...
@@ -552,6 +562,19 @@ cmsFloat64Number EvalSegmentedFn(const cmsToneCurve *g, cmsFloat64Number R)
return
MINUS_INF
;
}
// Access to estimated low-res table
cmsUInt32Number
CMSEXPORT
cmsGetToneCurveEstimatedTableEntries
(
const
cmsToneCurve
*
t
)
{
_cmsAssert
(
t
!=
NULL
);
return
t
->
nEntries
;
}
const
cmsUInt16Number
*
CMSEXPORT
cmsGetToneCurveEstimatedTable
(
const
cmsToneCurve
*
t
)
{
_cmsAssert
(
t
!=
NULL
);
return
t
->
Table16
;
}
// Create an empty gamma curve, by using tables. This specifies only the limited-precision part, and leaves the
// floating point description empty.
...
...
@@ -828,7 +851,7 @@ int GetInterval(cmsFloat64Number In, const cmsUInt16Number LutTable[], const str
cmsToneCurve
*
CMSEXPORT
cmsReverseToneCurveEx
(
cmsInt32Number
nResultSamples
,
const
cmsToneCurve
*
InCurve
)
{
cmsToneCurve
*
out
;
cmsFloat64Number
a
=
1
,
b
=
0
,
y
,
x1
,
y1
,
x2
,
y2
;
cmsFloat64Number
a
=
0
,
b
=
0
,
y
,
x1
,
y1
,
x2
,
y2
;
int
i
,
j
;
int
Ascending
;
...
...
@@ -859,6 +882,7 @@ cmsToneCurve* CMSEXPORT cmsReverseToneCurveEx(cmsInt32Number nResultSamples, con
j
=
GetInterval
(
y
,
InCurve
->
Table16
,
InCurve
->
InterpParams
);
if
(
j
>=
0
)
{
// Get limits of interval
x1
=
InCurve
->
Table16
[
j
];
x2
=
InCurve
->
Table16
[
j
+
1
];
...
...
@@ -883,6 +907,7 @@ cmsToneCurve* CMSEXPORT cmsReverseToneCurveEx(cmsInt32Number nResultSamples, con
out
->
Table16
[
i
]
=
_cmsQuickSaturateWord
(
a
*
y
+
b
);
}
return
out
;
}
...
...
@@ -891,7 +916,7 @@ cmsToneCurve* CMSEXPORT cmsReverseToneCurve(const cmsToneCurve* InGamma)
{
_cmsAssert
(
InGamma
!=
NULL
);
return
cmsReverseToneCurveEx
(
InGamma
->
nEntries
,
InGamma
);
return
cmsReverseToneCurveEx
(
4096
,
InGamma
);
}
// From: Eilers, P.H.C. (1994) Smoothing and interpolation with finite
...
...
@@ -1035,20 +1060,42 @@ cmsBool CMSEXPORT cmsIsToneCurveMonotonic(const cmsToneCurve* t)
{
int
n
;
int
i
,
last
;
cmsBool
lDescending
;
_cmsAssert
(
t
!=
NULL
);
n
=
t
->
nEntries
;
last
=
t
->
Table16
[
n
-
1
];
// Degenerated curves are monotonic? Ok, let's pass them
n
=
t
->
nEntries
;
if
(
n
<
2
)
return
TRUE
;
for
(
i
=
n
-
2
;
i
>=
0
;
--
i
)
{
// Curve direction
lDescending
=
cmsIsToneCurveDescending
(
t
);
if
(
t
->
Table16
[
i
]
>
last
)
if
(
lDescending
)
{
return
FALSE
;
else
last
=
t
->
Table16
[
i
];
last
=
t
->
Table16
[
0
]
;
for
(
i
=
1
;
i
<
n
;
i
++
)
{
if
(
t
->
Table16
[
i
]
-
last
>
2
)
// We allow some ripple
return
FALSE
;
else
last
=
t
->
Table16
[
i
];
}
}
else
{
last
=
t
->
Table16
[
n
-
1
];
for
(
i
=
n
-
2
;
i
>=
0
;
--
i
)
{
if
(
t
->
Table16
[
i
]
-
last
>
2
)
return
FALSE
;
else
last
=
t
->
Table16
[
i
];
}
}
return
TRUE
;
...
...
@@ -1163,4 +1210,3 @@ cmsFloat64Number CMSEXPORT cmsEstimateGamma(const cmsToneCurve* t, cmsFloat64Num
return
(
sum
/
n
);
// The mean
}
src/share/native/sun/java2d/cmm/lcms/cmsgmt.c
浏览文件 @
fdf0805b
...
...
@@ -30,7 +30,7 @@
//---------------------------------------------------------------------------------
//
// Little Color Management System
// Copyright (c) 1998-201
0
Marti Maria Saguer
// Copyright (c) 1998-201
2
Marti Maria Saguer
//
// Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the "Software"),
...
...
@@ -212,7 +212,6 @@ cmsToneCurve* _cmsBuildKToneCurve(cmsContext ContextID,
// Make sure it is monotonic
if
(
!
cmsIsToneCurveMonotonic
(
KTone
))
{
cmsFreeToneCurve
(
KTone
);
return
NULL
;
}
...
...
@@ -246,7 +245,7 @@ int GamutSampler(register const cmsUInt16Number In[], register cmsUInt16Number O
GAMUTCHAIN
*
t
=
(
GAMUTCHAIN
*
)
Cargo
;
cmsCIELab
LabIn1
,
LabOut1
;
cmsCIELab
LabIn2
,
LabOut2
;
cms
Float32
Number
Proof
[
cmsMAXCHANNELS
],
Proof2
[
cmsMAXCHANNELS
];
cms
UInt16
Number
Proof
[
cmsMAXCHANNELS
],
Proof2
[
cmsMAXCHANNELS
];
cmsFloat64Number
dE1
,
dE2
,
ErrorRatio
;
// Assume in-gamut by default.
...
...
@@ -396,8 +395,8 @@ cmsPipeline* _cmsCreateGamutCheckPipeline(cmsContext ContextID,
cmsFLAGS_NOCACHE
);
// Does create the forward step. Lab double to
cmsFloat32Number
dwFormat
=
(
FLOAT_SH
(
1
)
|
CHANNELS_SH
(
nChannels
)
|
BYTES_SH
(
4
));
// Does create the forward step. Lab double to
device
dwFormat
=
(
CHANNELS_SH
(
nChannels
)
|
BYTES_SH
(
2
));
Chain
.
hForward
=
cmsCreateTransformTHR
(
ContextID
,
hLab
,
TYPE_Lab_DBL
,
hGamut
,
dwFormat
,
...
...
@@ -421,10 +420,10 @@ cmsPipeline* _cmsCreateGamutCheckPipeline(cmsContext ContextID,
if
(
Gamut
!=
NULL
)
{
CLUT
=
cmsStageAllocCLut16bit
(
ContextID
,
nGridpoints
,
nChannels
,
1
,
NULL
);
cmsPipelineInsertStage
(
Gamut
,
cmsAT_BEGIN
,
CLUT
);
CLUT
=
cmsStageAllocCLut16bit
(
ContextID
,
nGridpoints
,
nChannels
,
1
,
NULL
);
cmsPipelineInsertStage
(
Gamut
,
cmsAT_BEGIN
,
CLUT
);
cmsStageSampleCLut16bit
(
CLUT
,
GamutSampler
,
(
void
*
)
&
Chain
,
0
);
cmsStageSampleCLut16bit
(
CLUT
,
GamutSampler
,
(
void
*
)
&
Chain
,
0
);
}
}
else
...
...
src/share/native/sun/java2d/cmm/lcms/cmshalf.c
0 → 100644
浏览文件 @
fdf0805b
此差异已折叠。
点击以展开。
src/share/native/sun/java2d/cmm/lcms/cmsintrp.c
浏览文件 @
fdf0805b
...
...
@@ -30,7 +30,7 @@
//---------------------------------------------------------------------------------
//
// Little Color Management System
// Copyright (c) 1998-201
0
Marti Maria Saguer
// Copyright (c) 1998-201
2
Marti Maria Saguer
//
// Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the "Software"),
...
...
@@ -55,7 +55,7 @@
#include "lcms2_internal.h"
// This module incorporates several interpolation routines, for 1
, 3, 4, 5, 6, 7 and
8 channels on input and
// This module incorporates several interpolation routines, for 1
to
8 channels on input and
// up to 65535 channels on output. The user may change those by using the interpolation plug-in
// Interpolation routines by default
...
...
@@ -83,7 +83,7 @@ cmsBool _cmsRegisterInterpPlugin(cmsPluginBase* Data)
// Set the interpolation method
static
cmsBool
_cmsSetInterpolationRoutine
(
cmsInterpParams
*
p
)
{
// Invoke factory, possibly in the Plug-in
...
...
@@ -318,6 +318,116 @@ void Eval1InputFloat(const cmsFloat32Number Value[],
}
}
// Bilinear interpolation (16 bits) - cmsFloat32Number version
static
void
BilinearInterpFloat
(
const
cmsFloat32Number
Input
[],
cmsFloat32Number
Output
[],
const
cmsInterpParams
*
p
)
{
# define LERP(a,l,h) (cmsFloat32Number) ((l)+(((h)-(l))*(a)))
# define DENS(i,j) (LutTable[(i)+(j)+OutChan])
const
cmsFloat32Number
*
LutTable
=
(
cmsFloat32Number
*
)
p
->
Table
;
cmsFloat32Number
px
,
py
;
int
x0
,
y0
,
X0
,
Y0
,
X1
,
Y1
;
int
TotalOut
,
OutChan
;
cmsFloat32Number
fx
,
fy
,
d00
,
d01
,
d10
,
d11
,
dx0
,
dx1
,
dxy
;
TotalOut
=
p
->
nOutputs
;
px
=
Input
[
0
]
*
p
->
Domain
[
0
];
py
=
Input
[
1
]
*
p
->
Domain
[
1
];
x0
=
(
int
)
_cmsQuickFloor
(
px
);
fx
=
px
-
(
cmsFloat32Number
)
x0
;
y0
=
(
int
)
_cmsQuickFloor
(
py
);
fy
=
py
-
(
cmsFloat32Number
)
y0
;
X0
=
p
->
opta
[
1
]
*
x0
;
X1
=
X0
+
(
Input
[
0
]
>=
1
.
0
?
0
:
p
->
opta
[
1
]);
Y0
=
p
->
opta
[
0
]
*
y0
;
Y1
=
Y0
+
(
Input
[
1
]
>=
1
.
0
?
0
:
p
->
opta
[
0
]);
for
(
OutChan
=
0
;
OutChan
<
TotalOut
;
OutChan
++
)
{
d00
=
DENS
(
X0
,
Y0
);
d01
=
DENS
(
X0
,
Y1
);
d10
=
DENS
(
X1
,
Y0
);
d11
=
DENS
(
X1
,
Y1
);
dx0
=
LERP
(
fx
,
d00
,
d10
);
dx1
=
LERP
(
fx
,
d01
,
d11
);
dxy
=
LERP
(
fy
,
dx0
,
dx1
);
Output
[
OutChan
]
=
dxy
;
}
# undef LERP
# undef DENS
}
// Bilinear interpolation (16 bits) - optimized version
static
void
BilinearInterp16
(
register
const
cmsUInt16Number
Input
[],
register
cmsUInt16Number
Output
[],
register
const
cmsInterpParams
*
p
)
{
#define DENS(i,j) (LutTable[(i)+(j)+OutChan])
#define LERP(a,l,h) (cmsUInt16Number) (l + ROUND_FIXED_TO_INT(((h-l)*a)))
const
cmsUInt16Number
*
LutTable
=
(
cmsUInt16Number
*
)
p
->
Table
;
int
OutChan
,
TotalOut
;
cmsS15Fixed16Number
fx
,
fy
;
register
int
rx
,
ry
;
int
x0
,
y0
;
register
int
X0
,
X1
,
Y0
,
Y1
;
int
d00
,
d01
,
d10
,
d11
,
dx0
,
dx1
,
dxy
;
TotalOut
=
p
->
nOutputs
;
fx
=
_cmsToFixedDomain
((
int
)
Input
[
0
]
*
p
->
Domain
[
0
]);
x0
=
FIXED_TO_INT
(
fx
);
rx
=
FIXED_REST_TO_INT
(
fx
);
// Rest in 0..1.0 domain
fy
=
_cmsToFixedDomain
((
int
)
Input
[
1
]
*
p
->
Domain
[
1
]);
y0
=
FIXED_TO_INT
(
fy
);
ry
=
FIXED_REST_TO_INT
(
fy
);
X0
=
p
->
opta
[
1
]
*
x0
;
X1
=
X0
+
(
Input
[
0
]
==
0xFFFFU
?
0
:
p
->
opta
[
1
]);
Y0
=
p
->
opta
[
0
]
*
y0
;
Y1
=
Y0
+
(
Input
[
1
]
==
0xFFFFU
?
0
:
p
->
opta
[
0
]);
for
(
OutChan
=
0
;
OutChan
<
TotalOut
;
OutChan
++
)
{
d00
=
DENS
(
X0
,
Y0
);
d01
=
DENS
(
X0
,
Y1
);
d10
=
DENS
(
X1
,
Y0
);
d11
=
DENS
(
X1
,
Y1
);
dx0
=
LERP
(
rx
,
d00
,
d10
);
dx1
=
LERP
(
rx
,
d01
,
d11
);
dxy
=
LERP
(
ry
,
dx0
,
dx1
);
Output
[
OutChan
]
=
(
cmsUInt16Number
)
dxy
;
}
# undef LERP
# undef DENS
}
// Trilinear interpolation (16 bits) - cmsFloat32Number version
...
...
@@ -343,9 +453,21 @@ void TrilinearInterpFloat(const cmsFloat32Number Input[],
TotalOut
=
p
->
nOutputs
;
px
=
Input
[
0
]
*
p
->
Domain
[
0
];
py
=
Input
[
1
]
*
p
->
Domain
[
1
];
pz
=
Input
[
2
]
*
p
->
Domain
[
2
];
// We need some clipping here
px
=
Input
[
0
];
py
=
Input
[
1
];
pz
=
Input
[
2
];
if
(
px
<
0
)
px
=
0
;
if
(
px
>
1
)
px
=
1
;
if
(
py
<
0
)
py
=
0
;
if
(
py
>
1
)
py
=
1
;
if
(
pz
<
0
)
pz
=
0
;
if
(
pz
>
1
)
pz
=
1
;
px
*=
p
->
Domain
[
0
];
py
*=
p
->
Domain
[
1
];
pz
*=
p
->
Domain
[
2
];
x0
=
(
int
)
_cmsQuickFloor
(
px
);
fx
=
px
-
(
cmsFloat32Number
)
x0
;
y0
=
(
int
)
_cmsQuickFloor
(
py
);
fy
=
py
-
(
cmsFloat32Number
)
y0
;
...
...
@@ -486,9 +608,21 @@ void TetrahedralInterpFloat(const cmsFloat32Number Input[],
TotalOut
=
p
->
nOutputs
;
px
=
Input
[
0
]
*
p
->
Domain
[
0
];
py
=
Input
[
1
]
*
p
->
Domain
[
1
];
pz
=
Input
[
2
]
*
p
->
Domain
[
2
];
// We need some clipping here
px
=
Input
[
0
];
py
=
Input
[
1
];
pz
=
Input
[
2
];
if
(
px
<
0
)
px
=
0
;
if
(
px
>
1
)
px
=
1
;
if
(
py
<
0
)
py
=
0
;
if
(
py
>
1
)
py
=
1
;
if
(
pz
<
0
)
pz
=
0
;
if
(
pz
>
1
)
pz
=
1
;
px
*=
p
->
Domain
[
0
];
py
*=
p
->
Domain
[
1
];
pz
*=
p
->
Domain
[
2
];
x0
=
(
int
)
_cmsQuickFloor
(
px
);
rx
=
(
px
-
(
cmsFloat32Number
)
x0
);
y0
=
(
int
)
_cmsQuickFloor
(
py
);
ry
=
(
py
-
(
cmsFloat32Number
)
y0
);
...
...
@@ -570,7 +704,6 @@ void TetrahedralInterpFloat(const cmsFloat32Number Input[],
#define DENS(i,j,k) (LutTable[(i)+(j)+(k)+OutChan])
static
void
TetrahedralInterp16
(
register
const
cmsUInt16Number
Input
[],
...
...
@@ -578,99 +711,131 @@ void TetrahedralInterp16(register const cmsUInt16Number Input[],
register
const
cmsInterpParams
*
p
)
{
const
cmsUInt16Number
*
LutTable
=
(
cmsUInt16Number
*
)
p
->
Table
;
cmsS15Fixed16Number
fx
,
fy
,
fz
;
cmsS15Fixed16Number
rx
,
ry
,
rz
;
int
x0
,
y0
,
z0
;
cmsS15Fixed16Number
c0
,
c1
,
c2
,
c3
,
Rest
;
cmsUInt32Number
OutChan
;
cmsS15Fixed16Number
X0
,
X1
,
Y0
,
Y1
,
Z0
,
Z1
;
cmsUInt32Number
TotalOut
=
p
->
nOutputs
;
cmsS15Fixed16Number
fx
,
fy
,
fz
;
cmsS15Fixed16Number
rx
,
ry
,
rz
;
int
x0
,
y0
,
z0
;
cmsS15Fixed16Number
c0
,
c1
,
c2
,
c3
,
Rest
;
cmsS15Fixed16Number
X0
,
X1
,
Y0
,
Y1
,
Z0
,
Z1
;
cmsUInt32Number
TotalOut
=
p
->
nOutputs
;
fx
=
_cmsToFixedDomain
((
int
)
Input
[
0
]
*
p
->
Domain
[
0
]);
fy
=
_cmsToFixedDomain
((
int
)
Input
[
1
]
*
p
->
Domain
[
1
]);
fz
=
_cmsToFixedDomain
((
int
)
Input
[
2
]
*
p
->
Domain
[
2
]);
fx
=
_cmsToFixedDomain
((
int
)
Input
[
0
]
*
p
->
Domain
[
0
]);
fy
=
_cmsToFixedDomain
((
int
)
Input
[
1
]
*
p
->
Domain
[
1
]);
fz
=
_cmsToFixedDomain
((
int
)
Input
[
2
]
*
p
->
Domain
[
2
]);
x0
=
FIXED_TO_INT
(
fx
);
y0
=
FIXED_TO_INT
(
fy
);
z0
=
FIXED_TO_INT
(
fz
);
x0
=
FIXED_TO_INT
(
fx
);
y0
=
FIXED_TO_INT
(
fy
);
z0
=
FIXED_TO_INT
(
fz
);
rx
=
FIXED_REST_TO_INT
(
fx
);
ry
=
FIXED_REST_TO_INT
(
fy
);
rz
=
FIXED_REST_TO_INT
(
fz
);
rx
=
FIXED_REST_TO_INT
(
fx
);
ry
=
FIXED_REST_TO_INT
(
fy
);
rz
=
FIXED_REST_TO_INT
(
fz
);
X0
=
p
->
opta
[
2
]
*
x0
;
X1
=
X0
+
(
Input
[
0
]
==
0xFFFFU
?
0
:
p
->
opta
[
2
]);
X1
=
(
Input
[
0
]
==
0xFFFFU
?
0
:
p
->
opta
[
2
]);
Y0
=
p
->
opta
[
1
]
*
y0
;
Y1
=
Y0
+
(
Input
[
1
]
==
0xFFFFU
?
0
:
p
->
opta
[
1
]);
Y1
=
(
Input
[
1
]
==
0xFFFFU
?
0
:
p
->
opta
[
1
]);
Z0
=
p
->
opta
[
0
]
*
z0
;
Z1
=
Z0
+
(
Input
[
2
]
==
0xFFFFU
?
0
:
p
->
opta
[
0
]);
// These are the 6 Tetrahedral
for
(
OutChan
=
0
;
OutChan
<
TotalOut
;
OutChan
++
)
{
c0
=
DENS
(
X0
,
Y0
,
Z0
);
if
(
rx
>=
ry
&&
ry
>=
rz
)
{
c1
=
DENS
(
X1
,
Y0
,
Z0
)
-
c0
;
c2
=
DENS
(
X1
,
Y1
,
Z0
)
-
DENS
(
X1
,
Y0
,
Z0
);
c3
=
DENS
(
X1
,
Y1
,
Z1
)
-
DENS
(
X1
,
Y1
,
Z0
);
Z1
=
(
Input
[
2
]
==
0xFFFFU
?
0
:
p
->
opta
[
0
]);
LutTable
=
&
LutTable
[
X0
+
Y0
+
Z0
];
// Output should be computed as x = ROUND_FIXED_TO_INT(_cmsToFixedDomain(Rest))
// which expands as: x = (Rest + ((Rest+0x7fff)/0xFFFF) + 0x8000)>>16
// This can be replaced by: t = Rest+0x8001, x = (t + (t>>16))>>16
// at the cost of being off by one at 7fff and 17ffe.
if
(
rx
>=
ry
)
{
if
(
ry
>=
rz
)
{
Y1
+=
X1
;
Z1
+=
Y1
;
for
(;
TotalOut
;
TotalOut
--
)
{
c1
=
LutTable
[
X1
];
c2
=
LutTable
[
Y1
];
c3
=
LutTable
[
Z1
];
c0
=
*
LutTable
++
;
c3
-=
c2
;
c2
-=
c1
;
c1
-=
c0
;
Rest
=
c1
*
rx
+
c2
*
ry
+
c3
*
rz
+
0x8001
;
*
Output
++
=
(
cmsUInt16Number
)
c0
+
((
Rest
+
(
Rest
>>
16
))
>>
16
);
}
}
else
if
(
rz
>=
rx
)
{
X1
+=
Z1
;
Y1
+=
X1
;
for
(;
TotalOut
;
TotalOut
--
)
{
c1
=
LutTable
[
X1
];
c2
=
LutTable
[
Y1
];
c3
=
LutTable
[
Z1
];
c0
=
*
LutTable
++
;
c2
-=
c1
;
c1
-=
c3
;
c3
-=
c0
;
Rest
=
c1
*
rx
+
c2
*
ry
+
c3
*
rz
+
0x8001
;
*
Output
++
=
(
cmsUInt16Number
)
c0
+
((
Rest
+
(
Rest
>>
16
))
>>
16
);
}
}
else
{
Z1
+=
X1
;
Y1
+=
Z1
;
for
(;
TotalOut
;
TotalOut
--
)
{
c1
=
LutTable
[
X1
];
c2
=
LutTable
[
Y1
];
c3
=
LutTable
[
Z1
];
c0
=
*
LutTable
++
;
c2
-=
c3
;
c3
-=
c1
;
c1
-=
c0
;
Rest
=
c1
*
rx
+
c2
*
ry
+
c3
*
rz
+
0x8001
;
*
Output
++
=
(
cmsUInt16Number
)
c0
+
((
Rest
+
(
Rest
>>
16
))
>>
16
);
}
}
else
if
(
rx
>=
rz
&&
rz
>=
ry
)
{
c1
=
DENS
(
X1
,
Y0
,
Z0
)
-
c0
;
c2
=
DENS
(
X1
,
Y1
,
Z1
)
-
DENS
(
X1
,
Y0
,
Z1
);
c3
=
DENS
(
X1
,
Y0
,
Z1
)
-
DENS
(
X1
,
Y0
,
Z0
);
}
else
{
if
(
rx
>=
rz
)
{
X1
+=
Y1
;
Z1
+=
X1
;
for
(;
TotalOut
;
TotalOut
--
)
{
c1
=
LutTable
[
X1
];
c2
=
LutTable
[
Y1
];
c3
=
LutTable
[
Z1
];
c0
=
*
LutTable
++
;
c3
-=
c1
;
c1
-=
c2
;
c2
-=
c0
;
Rest
=
c1
*
rx
+
c2
*
ry
+
c3
*
rz
+
0x8001
;
*
Output
++
=
(
cmsUInt16Number
)
c0
+
((
Rest
+
(
Rest
>>
16
))
>>
16
);
}
else
if
(
rz
>=
rx
&&
rx
>=
ry
)
{
c1
=
DENS
(
X1
,
Y0
,
Z1
)
-
DENS
(
X0
,
Y0
,
Z1
);
c2
=
DENS
(
X1
,
Y1
,
Z1
)
-
DENS
(
X1
,
Y0
,
Z1
);
c3
=
DENS
(
X0
,
Y0
,
Z1
)
-
c0
;
}
else
if
(
ry
>=
rx
&&
rx
>=
rz
)
{
c1
=
DENS
(
X1
,
Y1
,
Z0
)
-
DENS
(
X0
,
Y1
,
Z0
);
c2
=
DENS
(
X0
,
Y1
,
Z0
)
-
c0
;
c3
=
DENS
(
X1
,
Y1
,
Z1
)
-
DENS
(
X1
,
Y1
,
Z0
);
}
else
if
(
ry
>=
rz
&&
rz
>=
rx
)
{
c1
=
DENS
(
X1
,
Y1
,
Z1
)
-
DENS
(
X0
,
Y1
,
Z1
);
c2
=
DENS
(
X0
,
Y1
,
Z0
)
-
c0
;
c3
=
DENS
(
X0
,
Y1
,
Z1
)
-
DENS
(
X0
,
Y1
,
Z0
);
}
else
if
(
rz
>=
ry
&&
ry
>=
rx
)
{
c1
=
DENS
(
X1
,
Y1
,
Z1
)
-
DENS
(
X0
,
Y1
,
Z1
);
c2
=
DENS
(
X0
,
Y1
,
Z1
)
-
DENS
(
X0
,
Y0
,
Z1
);
c3
=
DENS
(
X0
,
Y0
,
Z1
)
-
c0
;
}
else
{
c1
=
c2
=
c3
=
0
;
}
Rest
=
c1
*
rx
+
c2
*
ry
+
c3
*
rz
;
Output
[
OutChan
]
=
(
cmsUInt16Number
)
c0
+
ROUND_FIXED_TO_INT
(
_cmsToFixedDomain
(
Rest
));
}
else
if
(
ry
>=
rz
)
{
Z1
+=
Y1
;
X1
+=
Z1
;
for
(;
TotalOut
;
TotalOut
--
)
{
c1
=
LutTable
[
X1
];
c2
=
LutTable
[
Y1
];
c3
=
LutTable
[
Z1
];
c0
=
*
LutTable
++
;
c1
-=
c3
;
c3
-=
c2
;
c2
-=
c0
;
Rest
=
c1
*
rx
+
c2
*
ry
+
c3
*
rz
+
0x8001
;
*
Output
++
=
(
cmsUInt16Number
)
c0
+
((
Rest
+
(
Rest
>>
16
))
>>
16
);
}
}
else
{
Y1
+=
Z1
;
X1
+=
Y1
;
for
(;
TotalOut
;
TotalOut
--
)
{
c1
=
LutTable
[
X1
];
c2
=
LutTable
[
Y1
];
c3
=
LutTable
[
Z1
];
c0
=
*
LutTable
++
;
c1
-=
c2
;
c2
-=
c3
;
c3
-=
c0
;
Rest
=
c1
*
rx
+
c2
*
ry
+
c3
*
rz
+
0x8001
;
*
Output
++
=
(
cmsUInt16Number
)
c0
+
((
Rest
+
(
Rest
>>
16
))
>>
16
);
}
}
}
}
#undef DENS
#define DENS(i,j,k) (LutTable[(i)+(j)+(k)+OutChan])
...
...
@@ -1102,7 +1267,7 @@ void Eval7Inputs(register const cmsUInt16Number Input[],
K1
=
p16
->
opta
[
6
]
*
(
k0
+
(
Input
[
0
]
!=
0xFFFFU
?
1
:
0
));
p1
=
*
p16
;
memmove
(
&
p1
.
Domain
[
0
],
&
p16
->
Domain
[
1
],
5
*
sizeof
(
cmsUInt32Number
));
memmove
(
&
p1
.
Domain
[
0
],
&
p16
->
Domain
[
1
],
6
*
sizeof
(
cmsUInt32Number
));
T
=
LutTable
+
K0
;
p1
.
Table
=
T
;
...
...
@@ -1285,6 +1450,12 @@ cmsInterpFunction DefaultInterpolatorsFactory(cmsUInt32Number nInputChannels, cm
}
break
;
case
2
:
// Duotone
if
(
IsFloat
)
Interpolation
.
LerpFloat
=
BilinearInterpFloat
;
else
Interpolation
.
Lerp16
=
BilinearInterp16
;
break
;
case
3
:
// RGB et al
...
...
src/share/native/sun/java2d/cmm/lcms/cmsio0.c
浏览文件 @
fdf0805b
...
...
@@ -30,7 +30,7 @@
//---------------------------------------------------------------------------------
//
// Little Color Management System
// Copyright (c) 1998-201
0
Marti Maria Saguer
// Copyright (c) 1998-201
2
Marti Maria Saguer
//
// Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the "Software"),
...
...
@@ -142,6 +142,7 @@ cmsIOHANDLER* CMSEXPORT cmsOpenIOhandlerFromNULL(cmsContext ContextID)
iohandler
->
ContextID
=
ContextID
;
iohandler
->
stream
=
(
void
*
)
fm
;
iohandler
->
UsedSpace
=
0
;
iohandler
->
ReportedSize
=
0
;
iohandler
->
PhysicalFile
[
0
]
=
0
;
iohandler
->
Read
=
NULLRead
;
...
...
@@ -232,13 +233,11 @@ cmsBool MemoryWrite(struct _cms_io_handler* iohandler, cmsUInt32Number size, co
memmove
(
ResData
->
Block
+
ResData
->
Pointer
,
Ptr
,
size
);
ResData
->
Pointer
+=
size
;
iohandler
->
UsedSpace
+=
size
;
if
(
ResData
->
Pointer
>
iohandler
->
UsedSpace
)
iohandler
->
UsedSpace
=
ResData
->
Pointer
;
iohandler
->
UsedSpace
+=
size
;
return
TRUE
;
}
...
...
@@ -297,6 +296,7 @@ cmsIOHANDLER* CMSEXPORT cmsOpenIOhandlerFromMem(cmsContext ContextID, void *Buff
fm
->
FreeBlockOnClose
=
TRUE
;
fm
->
Size
=
size
;
fm
->
Pointer
=
0
;
iohandler
->
ReportedSize
=
size
;
break
;
case
'w'
:
...
...
@@ -307,10 +307,11 @@ cmsIOHANDLER* CMSEXPORT cmsOpenIOhandlerFromMem(cmsContext ContextID, void *Buff
fm
->
FreeBlockOnClose
=
FALSE
;
fm
->
Size
=
size
;
fm
->
Pointer
=
0
;
iohandler
->
ReportedSize
=
0
;
break
;
default:
cmsSignalError
(
ContextID
,
cmsERROR_UNKNOWN_EXTENSION
,
"Unknow access mode '%c'"
,
*
AccessMode
);
cmsSignalError
(
ContextID
,
cmsERROR_UNKNOWN_EXTENSION
,
"Unknow
n
access mode '%c'"
,
*
AccessMode
);
return
NULL
;
}
...
...
@@ -407,6 +408,7 @@ cmsIOHANDLER* CMSEXPORT cmsOpenIOhandlerFromFile(cmsContext ContextID, const cha
cmsSignalError
(
ContextID
,
cmsERROR_FILE
,
"File '%s' not found"
,
FileName
);
return
NULL
;
}
iohandler
->
ReportedSize
=
cmsfilelength
(
fm
);
break
;
case
'w'
:
...
...
@@ -416,11 +418,12 @@ cmsIOHANDLER* CMSEXPORT cmsOpenIOhandlerFromFile(cmsContext ContextID, const cha
cmsSignalError
(
ContextID
,
cmsERROR_FILE
,
"Couldn't create '%s'"
,
FileName
);
return
NULL
;
}
iohandler
->
ReportedSize
=
0
;
break
;
default:
_cmsFree
(
ContextID
,
iohandler
);
cmsSignalError
(
ContextID
,
cmsERROR_FILE
,
"Unknow access mode '%c'"
,
*
AccessMode
);
cmsSignalError
(
ContextID
,
cmsERROR_FILE
,
"Unknow
n
access mode '%c'"
,
*
AccessMode
);
return
NULL
;
}
...
...
@@ -455,6 +458,7 @@ cmsIOHANDLER* CMSEXPORT cmsOpenIOhandlerFromStream(cmsContext ContextID, FILE* S
iohandler
->
ContextID
=
ContextID
;
iohandler
->
stream
=
(
void
*
)
Stream
;
iohandler
->
UsedSpace
=
0
;
iohandler
->
ReportedSize
=
cmsfilelength
(
Stream
);
iohandler
->
PhysicalFile
[
0
]
=
0
;
iohandler
->
Read
=
FileRead
;
...
...
@@ -643,12 +647,17 @@ cmsBool _cmsReadHeader(_cmsICCPROFILE* Icc)
Icc
->
flags
=
_cmsAdjustEndianess32
(
Header
.
flags
);
Icc
->
manufacturer
=
_cmsAdjustEndianess32
(
Header
.
manufacturer
);
Icc
->
model
=
_cmsAdjustEndianess32
(
Header
.
model
);
_cmsAdjustEndianess64
(
&
Icc
->
attributes
,
Header
.
attributes
);
_cmsAdjustEndianess64
(
&
Icc
->
attributes
,
&
Header
.
attributes
);
Icc
->
Version
=
_cmsAdjustEndianess32
(
Header
.
version
);
// Get size as reported in header
HeaderSize
=
_cmsAdjustEndianess32
(
Header
.
size
);
// Make sure HeaderSize is lower than profile size
if
(
HeaderSize
>=
Icc
->
IOhandler
->
ReportedSize
)
HeaderSize
=
Icc
->
IOhandler
->
ReportedSize
;
// Get creation date/time
_cmsDecodeDateTimeNumber
(
&
Header
.
date
,
&
Icc
->
Created
);
...
...
@@ -664,6 +673,7 @@ cmsBool _cmsReadHeader(_cmsICCPROFILE* Icc)
return
FALSE
;
}
// Read tag directory
Icc
->
TagCount
=
0
;
for
(
i
=
0
;
i
<
TagCount
;
i
++
)
{
...
...
@@ -673,7 +683,8 @@ cmsBool _cmsReadHeader(_cmsICCPROFILE* Icc)
if
(
!
_cmsReadUInt32Number
(
io
,
&
Tag
.
size
))
return
FALSE
;
// Perform some sanity check. Offset + size should fall inside file.
if
(
Tag
.
offset
+
Tag
.
size
>
HeaderSize
)
if
(
Tag
.
offset
+
Tag
.
size
>
HeaderSize
||
Tag
.
offset
+
Tag
.
size
<
Tag
.
offset
)
continue
;
Icc
->
TagNames
[
Icc
->
TagCount
]
=
Tag
.
sig
;
...
...
@@ -728,7 +739,7 @@ cmsBool _cmsWriteHeader(_cmsICCPROFILE* Icc, cmsUInt32Number UsedSpace)
Header
.
manufacturer
=
_cmsAdjustEndianess32
(
Icc
->
manufacturer
);
Header
.
model
=
_cmsAdjustEndianess32
(
Icc
->
model
);
_cmsAdjustEndianess64
(
&
Header
.
attributes
,
Icc
->
attributes
);
_cmsAdjustEndianess64
(
&
Header
.
attributes
,
&
Icc
->
attributes
);
// Rendering intent in the header (for embedded profiles)
Header
.
renderingIntent
=
_cmsAdjustEndianess32
(
Icc
->
RenderingIntent
);
...
...
@@ -822,7 +833,7 @@ cmsUInt32Number CMSEXPORT cmsGetHeaderModel(cmsHPROFILE hProfile)
void
CMSEXPORT
cmsSetHeaderModel
(
cmsHPROFILE
hProfile
,
cmsUInt32Number
model
)
{
_cmsICCPROFILE
*
Icc
=
(
_cmsICCPROFILE
*
)
hProfile
;
Icc
->
m
anufacturer
=
(
cmsUInt32Number
)
model
;
Icc
->
m
odel
=
(
cmsUInt32Number
)
model
;
}
...
...
@@ -1138,10 +1149,12 @@ cmsBool SaveTags(_cmsICCPROFILE* Icc, _cmsICCPROFILE* FileOrig)
continue
;
}
TypeBase
=
TypeHandler
->
Signature
;
TypeBase
=
TypeHandler
->
Signature
;
if
(
!
_cmsWriteTypeBase
(
io
,
TypeBase
))
return
FALSE
;
TypeHandler
->
ContextID
=
Icc
->
ContextID
;
TypeHandler
->
ICCVersion
=
Icc
->
Version
;
if
(
!
TypeHandler
->
WritePtr
(
TypeHandler
,
io
,
Data
,
TagDescriptor
->
ElemCount
))
{
char
String
[
5
];
...
...
@@ -1317,8 +1330,12 @@ cmsBool CMSEXPORT cmsCloseProfile(cmsHPROFILE hProfile)
cmsTagTypeHandler
*
TypeHandler
=
Icc
->
TagTypeHandlers
[
i
];
if
(
TypeHandler
!=
NULL
)
if
(
TypeHandler
!=
NULL
)
{
TypeHandler
->
ContextID
=
Icc
->
ContextID
;
// As an additional parameters
TypeHandler
->
ICCVersion
=
Icc
->
Version
;
TypeHandler
->
FreePtr
(
TypeHandler
,
Icc
->
TagPtrs
[
i
]);
}
else
_cmsFree
(
Icc
->
ContextID
,
Icc
->
TagPtrs
[
i
]);
}
...
...
@@ -1371,7 +1388,6 @@ void* CMSEXPORT cmsReadTag(cmsHPROFILE hProfile, cmsTagSignature sig)
if
(
n
<
0
)
return
NULL
;
// Not found, return NULL
// If the element is already in memory, return the pointer
if
(
Icc
->
TagPtrs
[
n
])
{
...
...
@@ -1406,6 +1422,9 @@ void* CMSEXPORT cmsReadTag(cmsHPROFILE hProfile, cmsTagSignature sig)
// Read the tag
Icc
->
TagTypeHandlers
[
n
]
=
TypeHandler
;
TypeHandler
->
ContextID
=
Icc
->
ContextID
;
TypeHandler
->
ICCVersion
=
Icc
->
Version
;
Icc
->
TagPtrs
[
n
]
=
TypeHandler
->
ReadPtr
(
TypeHandler
,
io
,
&
ElemCount
,
TagSize
);
// The tag type is supported, but something wrong happend and we cannot read the tag.
...
...
@@ -1463,11 +1482,15 @@ cmsBool CMSEXPORT cmsWriteTag(cmsHPROFILE hProfile, cmsTagSignature sig, const v
cmsTagTypeSignature
Type
;
int
i
;
cmsFloat64Number
Version
;
char
TypeString
[
5
],
SigString
[
5
];
if
(
data
==
NULL
)
{
cmsSignalError
(
cmsGetProfileContextID
(
hProfile
),
cmsERROR_NULL
,
"couldn't wite NULL to tag"
);
i
=
_cmsSearchTag
(
Icc
,
sig
,
FALSE
);
if
(
i
>=
0
)
Icc
->
TagNames
[
i
]
=
(
cmsTagSignature
)
0
;
// Unsupported by now, reserved for future ampliations (delete)
return
FALSE
;
}
...
...
@@ -1482,7 +1505,13 @@ cmsBool CMSEXPORT cmsWriteTag(cmsHPROFILE hProfile, cmsTagSignature sig, const v
}
else
{
TypeHandler
=
Icc
->
TagTypeHandlers
[
i
];
TypeHandler
->
FreePtr
(
TypeHandler
,
Icc
->
TagPtrs
[
i
]);
if
(
TypeHandler
!=
NULL
)
{
TypeHandler
->
ContextID
=
Icc
->
ContextID
;
// As an additional parameter
TypeHandler
->
ICCVersion
=
Icc
->
Version
;
TypeHandler
->
FreePtr
(
TypeHandler
,
Icc
->
TagPtrs
[
i
]);
}
}
}
}
...
...
@@ -1514,6 +1543,7 @@ cmsBool CMSEXPORT cmsWriteTag(cmsHPROFILE hProfile, cmsTagSignature sig, const v
// Now we need to know which type to use. It depends on the version.
Version
=
cmsGetProfileVersion
(
hProfile
);
if
(
TagDescriptor
->
DecideType
!=
NULL
)
{
// Let the tag descriptor to decide the type base on depending on
...
...
@@ -1525,33 +1555,47 @@ cmsBool CMSEXPORT cmsWriteTag(cmsHPROFILE hProfile, cmsTagSignature sig, const v
}
else
{
Type
=
TagDescriptor
->
SupportedTypes
[
0
];
}
// Does the tag support this type?
if
(
!
IsTypeSupported
(
TagDescriptor
,
Type
))
{
cmsSignalError
(
Icc
->
ContextID
,
cmsERROR_UNKNOWN_EXTENSION
,
"Unsupported type '%x' for tag '%x'"
,
Type
,
sig
);
_cmsTagSignature2String
(
TypeString
,
(
cmsTagSignature
)
Type
);
_cmsTagSignature2String
(
SigString
,
sig
);
cmsSignalError
(
Icc
->
ContextID
,
cmsERROR_UNKNOWN_EXTENSION
,
"Unsupported type '%s' for tag '%s'"
,
TypeString
,
SigString
);
return
FALSE
;
}
// Does we have a handler for this type?
TypeHandler
=
_cmsGetTagTypeHandler
(
Type
);
if
(
TypeHandler
==
NULL
)
{
cmsSignalError
(
Icc
->
ContextID
,
cmsERROR_UNKNOWN_EXTENSION
,
"Unsupported type '%x' for tag '%x'"
,
Type
,
sig
);
_cmsTagSignature2String
(
TypeString
,
(
cmsTagSignature
)
Type
);
_cmsTagSignature2String
(
SigString
,
sig
);
cmsSignalError
(
Icc
->
ContextID
,
cmsERROR_UNKNOWN_EXTENSION
,
"Unsupported type '%s' for tag '%s'"
,
TypeString
,
SigString
);
return
FALSE
;
// Should never happen
}
// Fill fields on icc structure
Icc
->
TagTypeHandlers
[
i
]
=
TypeHandler
;
Icc
->
TagNames
[
i
]
=
sig
;
Icc
->
TagSizes
[
i
]
=
0
;
Icc
->
TagOffsets
[
i
]
=
0
;
Icc
->
TagPtrs
[
i
]
=
TypeHandler
->
DupPtr
(
TypeHandler
,
data
,
TagDescriptor
->
ElemCount
);
TypeHandler
->
ContextID
=
Icc
->
ContextID
;
TypeHandler
->
ICCVersion
=
Icc
->
Version
;
Icc
->
TagPtrs
[
i
]
=
TypeHandler
->
DupPtr
(
TypeHandler
,
data
,
TagDescriptor
->
ElemCount
);
if
(
Icc
->
TagPtrs
[
i
]
==
NULL
)
{
TypeHandler
->
DupPtr
(
TypeHandler
,
data
,
TagDescriptor
->
ElemCount
);
cmsSignalError
(
Icc
->
ContextID
,
cmsERROR_CORRUPTION_DETECTED
,
"Malformed struct in type '%x' for tag '%x'"
,
Type
,
sig
);
_cmsTagSignature2String
(
TypeString
,
(
cmsTagSignature
)
Type
);
_cmsTagSignature2String
(
SigString
,
sig
);
cmsSignalError
(
Icc
->
ContextID
,
cmsERROR_CORRUPTION_DETECTED
,
"Malformed struct in type '%s' for tag '%s'"
,
TypeString
,
SigString
);
return
FALSE
;
}
...
...
@@ -1627,21 +1671,31 @@ cmsInt32Number CMSEXPORT cmsReadRawTag(cmsHPROFILE hProfile, cmsTagSignature sig
if
(
data
==
NULL
)
{
MemIO
=
cmsOpenIOhandlerFromNULL
(
cmsGetProfileContextID
(
hProfile
));
}
else
{
MemIO
=
cmsOpenIOhandlerFromMem
(
cmsGetProfileContextID
(
hProfile
),
data
,
BufferSize
,
"w"
);
MemIO
=
cmsOpenIOhandlerFromMem
(
cmsGetProfileContextID
(
hProfile
),
data
,
BufferSize
,
"w"
);
}
if
(
MemIO
==
NULL
)
return
0
;
// Obtain type handling for the tag
TypeHandler
=
Icc
->
TagTypeHandlers
[
i
];
TagDescriptor
=
_cmsGetTagDescriptor
(
sig
);
if
(
TagDescriptor
==
NULL
)
{
cmsCloseIOhandler
(
MemIO
);
return
0
;
}
// Serialize
TypeHandler
->
ContextID
=
Icc
->
ContextID
;
TypeHandler
->
ICCVersion
=
Icc
->
Version
;
if
(
!
_cmsWriteTypeBase
(
MemIO
,
TypeHandler
->
Signature
))
{
cmsCloseIOhandler
(
MemIO
);
return
0
;
}
if
(
!
TypeHandler
->
WritePtr
(
TypeHandler
,
MemIO
,
Object
,
TagDescriptor
->
ElemCount
))
return
0
;
if
(
!
TypeHandler
->
WritePtr
(
TypeHandler
,
MemIO
,
Object
,
TagDescriptor
->
ElemCount
))
{
cmsCloseIOhandler
(
MemIO
);
return
0
;
}
// Get Size and close
rc
=
MemIO
->
Tell
(
MemIO
);
...
...
@@ -1692,3 +1746,17 @@ cmsBool CMSEXPORT cmsLinkTag(cmsHPROFILE hProfile, cmsTagSignature sig, cmsTagSi
return
TRUE
;
}
// Returns the tag linked to sig, in the case two tags are sharing same resource
cmsTagSignature
CMSEXPORT
cmsTagLinkedTo
(
cmsHPROFILE
hProfile
,
cmsTagSignature
sig
)
{
_cmsICCPROFILE
*
Icc
=
(
_cmsICCPROFILE
*
)
hProfile
;
int
i
;
// Search for given tag in ICC profile directory
i
=
_cmsSearchTag
(
Icc
,
sig
,
FALSE
);
if
(
i
<
0
)
return
(
cmsTagSignature
)
0
;
// Not found, return 0
return
Icc
->
TagLinked
[
i
];
}
src/share/native/sun/java2d/cmm/lcms/cmsio1.c
浏览文件 @
fdf0805b
...
...
@@ -30,7 +30,7 @@
//---------------------------------------------------------------------------------
//
// Little Color Management System
// Copyright (c) 1998-201
0
Marti Maria Saguer
// Copyright (c) 1998-201
2
Marti Maria Saguer
//
// Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the "Software"),
...
...
@@ -150,7 +150,7 @@ cmsBool _cmsReadCHAD(cmsMAT3* Dest, cmsHPROFILE hProfile)
return
TRUE
;
}
return
_cmsAdaptationMatrix
(
Dest
,
NULL
,
cmsD50_XYZ
(),
White
);
return
_cmsAdaptationMatrix
(
Dest
,
NULL
,
White
,
cmsD50_XYZ
()
);
}
}
...
...
@@ -261,10 +261,80 @@ cmsPipeline* BuildRGBInputMatrixShaper(cmsHPROFILE hProfile)
cmsPipelineInsertStage
(
Lut
,
cmsAT_END
,
cmsStageAllocToneCurves
(
ContextID
,
3
,
Shapes
));
cmsPipelineInsertStage
(
Lut
,
cmsAT_END
,
cmsStageAllocMatrix
(
ContextID
,
3
,
3
,
(
cmsFloat64Number
*
)
&
Mat
,
NULL
));
// Note that it is certainly possible a single profile would have a LUT based
// tag for output working in lab and a matrix-shaper for the fallback cases.
// This is not allowed by the spec, but this code is tolerant to those cases
if
(
cmsGetPCS
(
hProfile
)
==
cmsSigLabData
)
{
cmsPipelineInsertStage
(
Lut
,
cmsAT_END
,
_cmsStageAllocXYZ2Lab
(
ContextID
));
}
}
return
Lut
;
}
// Read the DToAX tag, adjusting the encoding of Lab or XYZ if neded
/*static
cmsPipeline* _cmsReadFloatInputTag(cmsHPROFILE hProfile, cmsTagSignature tagFloat)
{
cmsContext ContextID = cmsGetProfileContextID(hProfile);
cmsPipeline* Lut = cmsPipelineDup((cmsPipeline*) cmsReadTag(hProfile, tagFloat));
cmsColorSpaceSignature spc = cmsGetColorSpace(hProfile);
if (Lut == NULL) return NULL;
// If PCS is Lab or XYZ, the floating point tag is accepting data in the space encoding,
// and since the formatter has already accomodated to 0..1.0, we should undo this change
if ( spc == cmsSigLabData)
{
cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageNormalizeFromLabFloat(ContextID));
}
else
if (spc == cmsSigXYZData)
{
cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageNormalizeFromXyzFloat(ContextID));
}
return Lut;
}
*/
static
cmsPipeline
*
_cmsReadFloatInputTag
(
cmsHPROFILE
hProfile
,
cmsTagSignature
tagFloat
)
{
cmsContext
ContextID
=
cmsGetProfileContextID
(
hProfile
);
cmsPipeline
*
Lut
=
cmsPipelineDup
((
cmsPipeline
*
)
cmsReadTag
(
hProfile
,
tagFloat
));
cmsColorSpaceSignature
spc
=
cmsGetColorSpace
(
hProfile
);
cmsColorSpaceSignature
PCS
=
cmsGetPCS
(
hProfile
);
if
(
Lut
==
NULL
)
return
NULL
;
// input and output of transform are in lcms 0..1 encoding. If XYZ or Lab spaces are used,
// these need to be normalized into the appropriate ranges (Lab = 100,0,0, XYZ=1.0,1.0,1.0)
if
(
spc
==
cmsSigLabData
)
{
cmsPipelineInsertStage
(
Lut
,
cmsAT_BEGIN
,
_cmsStageNormalizeToLabFloat
(
ContextID
));
}
else
if
(
spc
==
cmsSigXYZData
)
{
cmsPipelineInsertStage
(
Lut
,
cmsAT_BEGIN
,
_cmsStageNormalizeToXyzFloat
(
ContextID
));
}
if
(
PCS
==
cmsSigLabData
)
{
cmsPipelineInsertStage
(
Lut
,
cmsAT_END
,
_cmsStageNormalizeFromLabFloat
(
ContextID
));
}
else
if
(
PCS
==
cmsSigXYZData
)
{
cmsPipelineInsertStage
(
Lut
,
cmsAT_END
,
_cmsStageNormalizeFromXyzFloat
(
ContextID
));
}
return
Lut
;
}
// Read and create a BRAND NEW MPE LUT from a given profile. All stuff dependent of version, etc
// is adjusted here in order to create a LUT that takes care of all those details
...
...
@@ -275,10 +345,30 @@ cmsPipeline* _cmsReadInputLUT(cmsHPROFILE hProfile, int Intent)
cmsTagSignature
tagFloat
=
Device2PCSFloat
[
Intent
];
cmsContext
ContextID
=
cmsGetProfileContextID
(
hProfile
);
// On named color, take the appropiate tag
if
(
cmsGetDeviceClass
(
hProfile
)
==
cmsSigNamedColorClass
)
{
cmsPipeline
*
Lut
;
cmsNAMEDCOLORLIST
*
nc
=
(
cmsNAMEDCOLORLIST
*
)
cmsReadTag
(
hProfile
,
cmsSigNamedColor2Tag
);
if
(
nc
==
NULL
)
return
NULL
;
Lut
=
cmsPipelineAlloc
(
ContextID
,
0
,
0
);
if
(
Lut
==
NULL
)
{
cmsFreeNamedColorList
(
nc
);
return
NULL
;
}
cmsPipelineInsertStage
(
Lut
,
cmsAT_BEGIN
,
_cmsStageAllocNamedColor
(
nc
,
TRUE
));
cmsPipelineInsertStage
(
Lut
,
cmsAT_END
,
_cmsStageAllocLabV2ToV4
(
ContextID
));
return
Lut
;
}
if
(
cmsIsTag
(
hProfile
,
tagFloat
))
{
// Float tag takes precedence
// Floating point LUT are always V4, so no adjustment is required
return
cmsPipelineDup
((
cmsPipeline
*
)
cmsReadTag
(
hProfile
,
tagFloat
));
// Floating point LUT are always V4, but the encoding range is no
// longer 0..1.0, so we need to add an stage depending on the color space
return
_cmsReadFloatInputTag
(
hProfile
,
tagFloat
);
}
// Revert to perceptual if no tag is found
...
...
@@ -304,6 +394,10 @@ cmsPipeline* _cmsReadInputLUT(cmsHPROFILE hProfile, int Intent)
if
(
OriginalType
!=
cmsSigLut16Type
||
cmsGetPCS
(
hProfile
)
!=
cmsSigLabData
)
return
Lut
;
// If the input is Lab, add also a conversion at the begin
if
(
cmsGetColorSpace
(
hProfile
)
==
cmsSigLabData
)
cmsPipelineInsertStage
(
Lut
,
cmsAT_BEGIN
,
_cmsStageAllocLabV4ToV2
(
ContextID
));
// Add a matrix for conversion V2 to V4 Lab PCS
cmsPipelineInsertStage
(
Lut
,
cmsAT_END
,
_cmsStageAllocLabV2ToV4
(
ContextID
));
return
Lut
;
...
...
@@ -407,6 +501,14 @@ cmsPipeline* BuildRGBOutputMatrixShaper(cmsHPROFILE hProfile)
Lut
=
cmsPipelineAlloc
(
ContextID
,
3
,
3
);
if
(
Lut
!=
NULL
)
{
// Note that it is certainly possible a single profile would have a LUT based
// tag for output working in lab and a matrix-shaper for the fallback cases.
// This is not allowed by the spec, but this code is tolerant to those cases
if
(
cmsGetPCS
(
hProfile
)
==
cmsSigLabData
)
{
cmsPipelineInsertStage
(
Lut
,
cmsAT_END
,
_cmsStageAllocLab2XYZ
(
ContextID
));
}
cmsPipelineInsertStage
(
Lut
,
cmsAT_END
,
cmsStageAllocMatrix
(
ContextID
,
3
,
3
,
(
cmsFloat64Number
*
)
&
Inv
,
NULL
));
cmsPipelineInsertStage
(
Lut
,
cmsAT_END
,
cmsStageAllocToneCurves
(
ContextID
,
3
,
InvShapes
));
}
...
...
@@ -415,6 +517,88 @@ cmsPipeline* BuildRGBOutputMatrixShaper(cmsHPROFILE hProfile)
return
Lut
;
}
// Change CLUT interpolation to trilinear
static
void
ChangeInterpolationToTrilinear
(
cmsPipeline
*
Lut
)
{
cmsStage
*
Stage
;
for
(
Stage
=
cmsPipelineGetPtrToFirstStage
(
Lut
);
Stage
!=
NULL
;
Stage
=
cmsStageNext
(
Stage
))
{
if
(
cmsStageType
(
Stage
)
==
cmsSigCLutElemType
)
{
_cmsStageCLutData
*
CLUT
=
(
_cmsStageCLutData
*
)
Stage
->
Data
;
CLUT
->
Params
->
dwFlags
|=
CMS_LERP_FLAGS_TRILINEAR
;
_cmsSetInterpolationRoutine
(
CLUT
->
Params
);
}
}
}
// Read the DToAX tag, adjusting the encoding of Lab or XYZ if neded
/*static
cmsPipeline* _cmsReadFloatOutputTag(cmsHPROFILE hProfile, cmsTagSignature tagFloat)
{
cmsContext ContextID = cmsGetProfileContextID(hProfile);
cmsPipeline* Lut = cmsPipelineDup((cmsPipeline*) cmsReadTag(hProfile, tagFloat));
cmsColorSpaceSignature PCS = cmsGetPCS(hProfile);
if (Lut == NULL) return NULL;
// If PCS is Lab or XYZ, the floating point tag is accepting data in the space encoding,
// and since the formatter has already accomodated to 0..1.0, we should undo this change
if ( PCS == cmsSigLabData)
{
cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageNormalizeToLabFloat(ContextID));
}
else
if (PCS == cmsSigXYZData)
{
cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageNormalizeToXyzFloat(ContextID));
}
return Lut;
}*/
static
cmsPipeline
*
_cmsReadFloatOutputTag
(
cmsHPROFILE
hProfile
,
cmsTagSignature
tagFloat
)
{
cmsContext
ContextID
=
cmsGetProfileContextID
(
hProfile
);
cmsPipeline
*
Lut
=
cmsPipelineDup
((
cmsPipeline
*
)
cmsReadTag
(
hProfile
,
tagFloat
));
cmsColorSpaceSignature
PCS
=
cmsGetPCS
(
hProfile
);
cmsColorSpaceSignature
dataSpace
=
cmsGetColorSpace
(
hProfile
);
if
(
Lut
==
NULL
)
return
NULL
;
// If PCS is Lab or XYZ, the floating point tag is accepting data in the space encoding,
// and since the formatter has already accomodated to 0..1.0, we should undo this change
if
(
PCS
==
cmsSigLabData
)
{
cmsPipelineInsertStage
(
Lut
,
cmsAT_BEGIN
,
_cmsStageNormalizeToLabFloat
(
ContextID
));
}
else
if
(
PCS
==
cmsSigXYZData
)
{
cmsPipelineInsertStage
(
Lut
,
cmsAT_BEGIN
,
_cmsStageNormalizeToXyzFloat
(
ContextID
));
}
// the output can be Lab or XYZ, in which case normalisation is needed on the end of the pipeline
if
(
dataSpace
==
cmsSigLabData
)
{
cmsPipelineInsertStage
(
Lut
,
cmsAT_END
,
_cmsStageNormalizeFromLabFloat
(
ContextID
));
}
else
if
(
dataSpace
==
cmsSigXYZData
)
{
cmsPipelineInsertStage
(
Lut
,
cmsAT_END
,
_cmsStageNormalizeFromXyzFloat
(
ContextID
));
}
return
Lut
;
}
// Create an output MPE LUT from agiven profile. Version mismatches are handled here
cmsPipeline
*
_cmsReadOutputLUT
(
cmsHPROFILE
hProfile
,
int
Intent
)
{
...
...
@@ -425,8 +609,8 @@ cmsPipeline* _cmsReadOutputLUT(cmsHPROFILE hProfile, int Intent)
if
(
cmsIsTag
(
hProfile
,
tagFloat
))
{
// Float tag takes precedence
// Floating point LUT are always V4
, so no adjustment is required
return
cmsPipelineDup
((
cmsPipeline
*
)
cmsReadTag
(
hProfile
,
tagFloat
)
);
// Floating point LUT are always V4
return
_cmsReadFloatOutputTag
(
hProfile
,
tagFloat
);
}
// Revert to perceptual if no tag is found
...
...
@@ -447,6 +631,12 @@ cmsPipeline* _cmsReadOutputLUT(cmsHPROFILE hProfile, int Intent)
// The profile owns the Lut, so we need to copy it
Lut
=
cmsPipelineDup
(
Lut
);
if
(
Lut
==
NULL
)
return
NULL
;
// Now it is time for a controversial stuff. I found that for 3D LUTS using
// Lab used as indexer space, trilinear interpolation should be used
if
(
cmsGetPCS
(
hProfile
)
==
cmsSigLabData
)
ChangeInterpolationToTrilinear
(
Lut
);
// We need to adjust data only for Lab and Lut16 type
if
(
OriginalType
!=
cmsSigLut16Type
||
cmsGetPCS
(
hProfile
)
!=
cmsSigLabData
)
...
...
@@ -454,6 +644,11 @@ cmsPipeline* _cmsReadOutputLUT(cmsHPROFILE hProfile, int Intent)
// Add a matrix for conversion V4 to V2 Lab PCS
cmsPipelineInsertStage
(
Lut
,
cmsAT_BEGIN
,
_cmsStageAllocLabV4ToV2
(
ContextID
));
// If the output is Lab, add also a conversion at the end
if
(
cmsGetColorSpace
(
hProfile
)
==
cmsSigLabData
)
cmsPipelineInsertStage
(
Lut
,
cmsAT_END
,
_cmsStageAllocLabV2ToV4
(
ContextID
));
return
Lut
;
}
...
...
@@ -467,12 +662,46 @@ cmsPipeline* _cmsReadOutputLUT(cmsHPROFILE hProfile, int Intent)
return
BuildGrayOutputPipeline
(
hProfile
);
}
// Not gray, create a normal matrix-shaper
// Not gray, create a normal matrix-shaper
, which only operates in XYZ space
return
BuildRGBOutputMatrixShaper
(
hProfile
);
}
// ---------------------------------------------------------------------------------------------------------------
// Read the AToD0 tag, adjusting the encoding of Lab or XYZ if neded
static
cmsPipeline
*
_cmsReadFloatDevicelinkTag
(
cmsHPROFILE
hProfile
,
cmsTagSignature
tagFloat
)
{
cmsContext
ContextID
=
cmsGetProfileContextID
(
hProfile
);
cmsPipeline
*
Lut
=
cmsPipelineDup
((
cmsPipeline
*
)
cmsReadTag
(
hProfile
,
tagFloat
));
cmsColorSpaceSignature
PCS
=
cmsGetPCS
(
hProfile
);
cmsColorSpaceSignature
spc
=
cmsGetColorSpace
(
hProfile
);
if
(
Lut
==
NULL
)
return
NULL
;
if
(
spc
==
cmsSigLabData
)
{
cmsPipelineInsertStage
(
Lut
,
cmsAT_BEGIN
,
_cmsStageNormalizeToLabFloat
(
ContextID
));
}
else
if
(
spc
==
cmsSigXYZData
)
{
cmsPipelineInsertStage
(
Lut
,
cmsAT_BEGIN
,
_cmsStageNormalizeToXyzFloat
(
ContextID
));
}
if
(
PCS
==
cmsSigLabData
)
{
cmsPipelineInsertStage
(
Lut
,
cmsAT_END
,
_cmsStageNormalizeFromLabFloat
(
ContextID
));
}
else
if
(
PCS
==
cmsSigXYZData
)
{
cmsPipelineInsertStage
(
Lut
,
cmsAT_END
,
_cmsStageNormalizeFromXyzFloat
(
ContextID
));
}
return
Lut
;
}
// This one includes abstract profiles as well. Matrix-shaper cannot be obtained on that device class. The
// tag name here may default to AToB0
cmsPipeline
*
_cmsReadDevicelinkLUT
(
cmsHPROFILE
hProfile
,
int
Intent
)
...
...
@@ -483,10 +712,30 @@ cmsPipeline* _cmsReadDevicelinkLUT(cmsHPROFILE hProfile, int Intent)
cmsTagSignature
tagFloat
=
Device2PCSFloat
[
Intent
];
cmsContext
ContextID
=
cmsGetProfileContextID
(
hProfile
);
// On named color, take the appropiate tag
if
(
cmsGetDeviceClass
(
hProfile
)
==
cmsSigNamedColorClass
)
{
cmsNAMEDCOLORLIST
*
nc
=
(
cmsNAMEDCOLORLIST
*
)
cmsReadTag
(
hProfile
,
cmsSigNamedColor2Tag
);
if
(
nc
==
NULL
)
return
NULL
;
Lut
=
cmsPipelineAlloc
(
ContextID
,
0
,
0
);
if
(
Lut
==
NULL
)
{
cmsFreeNamedColorList
(
nc
);
return
NULL
;
}
cmsPipelineInsertStage
(
Lut
,
cmsAT_BEGIN
,
_cmsStageAllocNamedColor
(
nc
,
FALSE
));
if
(
cmsGetColorSpace
(
hProfile
)
==
cmsSigLabData
)
cmsPipelineInsertStage
(
Lut
,
cmsAT_END
,
_cmsStageAllocLabV2ToV4
(
ContextID
));
return
Lut
;
}
if
(
cmsIsTag
(
hProfile
,
tagFloat
))
{
// Float tag takes precedence
// Floating point LUT are always V
4, no adjustment is required
return
cmsPipelineDup
((
cmsPipeline
*
)
cmsReadTag
(
hProfile
,
tagFloat
)
);
// Floating point LUT are always V
return
_cmsReadFloatDevicelinkTag
(
hProfile
,
tagFloat
);
}
tagFloat
=
Device2PCSFloat
[
0
];
...
...
@@ -509,6 +758,12 @@ cmsPipeline* _cmsReadDevicelinkLUT(cmsHPROFILE hProfile, int Intent)
// The profile owns the Lut, so we need to copy it
Lut
=
cmsPipelineDup
(
Lut
);
if
(
Lut
==
NULL
)
return
NULL
;
// Now it is time for a controversial stuff. I found that for 3D LUTS using
// Lab used as indexer space, trilinear interpolation should be used
if
(
cmsGetColorSpace
(
hProfile
)
==
cmsSigLabData
)
ChangeInterpolationToTrilinear
(
Lut
);
// After reading it, we have info about the original type
OriginalType
=
_cmsGetTagTrueType
(
hProfile
,
tag16
);
...
...
@@ -558,7 +813,7 @@ cmsBool CMSEXPORT cmsIsMatrixShaper(cmsHPROFILE hProfile)
}
// Returns TRUE if the intent is implemented as CLUT
cmsBool
CMSEXPORT
cmsIsCLUT
(
cmsHPROFILE
hProfile
,
cmsUInt32Number
Intent
,
int
UsedDirection
)
cmsBool
CMSEXPORT
cmsIsCLUT
(
cmsHPROFILE
hProfile
,
cmsUInt32Number
Intent
,
cmsUInt32Number
UsedDirection
)
{
const
cmsTagSignature
*
TagTable
;
...
...
@@ -589,7 +844,7 @@ cmsBool CMSEXPORT cmsIsCLUT(cmsHPROFILE hProfile, cmsUInt32Number Intent, int U
// Return info about supported intents
cmsBool
CMSEXPORT
cmsIsIntentSupported
(
cmsHPROFILE
hProfile
,
cmsUInt32Number
Intent
,
int
UsedDirection
)
cmsUInt32Number
Intent
,
cmsUInt32Number
UsedDirection
)
{
if
(
cmsIsCLUT
(
hProfile
,
Intent
,
UsedDirection
))
return
TRUE
;
...
...
@@ -607,7 +862,6 @@ cmsBool CMSEXPORT cmsIsIntentSupported(cmsHPROFILE hProfile,
// Read both, profile sequence description and profile sequence id if present. Then combine both to
// create qa unique structure holding both. Shame on ICC to store things in such complicated way.
cmsSEQ
*
_cmsReadProfileSequence
(
cmsHPROFILE
hProfile
)
{
cmsSEQ
*
ProfileSeq
;
...
...
@@ -632,12 +886,13 @@ cmsSEQ* _cmsReadProfileSequence(cmsHPROFILE hProfile)
NewSeq
=
cmsDupProfileSequenceDescription
(
ProfileSeq
);
// Ok, proceed to the mixing
for
(
i
=
0
;
i
<
ProfileSeq
->
n
;
i
++
)
{
if
(
NewSeq
!=
NULL
)
{
for
(
i
=
0
;
i
<
ProfileSeq
->
n
;
i
++
)
{
memmove
(
&
NewSeq
->
seq
[
i
].
ProfileID
,
&
ProfileId
->
seq
[
i
].
ProfileID
,
sizeof
(
cmsProfileID
));
NewSeq
->
seq
[
i
].
Description
=
cmsMLUdup
(
ProfileId
->
seq
[
i
].
Description
);
memmove
(
&
NewSeq
->
seq
[
i
].
ProfileID
,
&
ProfileId
->
seq
[
i
].
ProfileID
,
sizeof
(
cmsProfileID
));
NewSeq
->
seq
[
i
].
Description
=
cmsMLUdup
(
ProfileId
->
seq
[
i
].
Description
);
}
}
return
NewSeq
;
}
...
...
src/share/native/sun/java2d/cmm/lcms/cmslut.c
浏览文件 @
fdf0805b
...
...
@@ -30,7 +30,7 @@
//---------------------------------------------------------------------------------
//
// Little Color Management System
// Copyright (c) 1998-201
0
Marti Maria Saguer
// Copyright (c) 1998-201
2
Marti Maria Saguer
//
// Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the "Software"),
...
...
@@ -154,7 +154,7 @@ cmsBool CMSEXPORT cmsPipelineCheckAndRetreiveStages(const cmsPipeline* Lut, cms
for
(
i
=
0
;
i
<
n
;
i
++
)
{
// Get asked type
Type
=
va_arg
(
args
,
cmsStageSignature
);
Type
=
(
cmsStageSignature
)
va_arg
(
args
,
cmsStageSignature
);
if
(
mpe
->
Type
!=
Type
)
{
va_end
(
args
);
// Mismatch. We are done.
...
...
@@ -197,9 +197,14 @@ void EvaluateCurves(const cmsFloat32Number In[],
cmsFloat32Number
Out
[],
const
cmsStage
*
mpe
)
{
_cmsStageToneCurvesData
*
Data
=
(
_cmsStageToneCurvesData
*
)
mpe
->
Data
;
_cmsStageToneCurvesData
*
Data
;
cmsUInt32Number
i
;
_cmsAssert
(
mpe
!=
NULL
);
Data
=
(
_cmsStageToneCurvesData
*
)
mpe
->
Data
;
if
(
Data
==
NULL
)
return
;
if
(
Data
->
TheCurves
==
NULL
)
return
;
for
(
i
=
0
;
i
<
Data
->
nCurves
;
i
++
)
{
...
...
@@ -210,9 +215,14 @@ void EvaluateCurves(const cmsFloat32Number In[],
static
void
CurveSetElemTypeFree
(
cmsStage
*
mpe
)
{
_cmsStageToneCurvesData
*
Data
=
(
_cmsStageToneCurvesData
*
)
mpe
->
Data
;
_cmsStageToneCurvesData
*
Data
;
cmsUInt32Number
i
;
_cmsAssert
(
mpe
!=
NULL
);
Data
=
(
_cmsStageToneCurvesData
*
)
mpe
->
Data
;
if
(
Data
==
NULL
)
return
;
if
(
Data
->
TheCurves
!=
NULL
)
{
for
(
i
=
0
;
i
<
Data
->
nCurves
;
i
++
)
{
if
(
Data
->
TheCurves
[
i
]
!=
NULL
)
...
...
@@ -275,12 +285,14 @@ cmsStage* CMSEXPORT cmsStageAllocToneCurves(cmsContext ContextID, cmsUInt32Numbe
EvaluateCurves
,
CurveSetDup
,
CurveSetElemTypeFree
,
NULL
);
if
(
NewMPE
==
NULL
)
return
NULL
;
NewElem
=
(
_cmsStageToneCurvesData
*
)
_cmsMalloc
(
ContextID
,
sizeof
(
_cmsStageToneCurvesData
));
NewElem
=
(
_cmsStageToneCurvesData
*
)
_cmsMalloc
Zero
(
ContextID
,
sizeof
(
_cmsStageToneCurvesData
));
if
(
NewElem
==
NULL
)
{
cmsStageFree
(
NewMPE
);
return
NULL
;
}
NewMPE
->
Data
=
(
void
*
)
NewElem
;
NewElem
->
nCurves
=
nChannels
;
NewElem
->
TheCurves
=
(
cmsToneCurve
**
)
_cmsCalloc
(
ContextID
,
nChannels
,
sizeof
(
cmsToneCurve
*
));
if
(
NewElem
->
TheCurves
==
NULL
)
{
...
...
@@ -301,11 +313,10 @@ cmsStage* CMSEXPORT cmsStageAllocToneCurves(cmsContext ContextID, cmsUInt32Numbe
cmsStageFree
(
NewMPE
);
return
NULL
;
}
}
NewMPE
->
Data
=
(
void
*
)
NewElem
;
}
return
NewMPE
;
return
NewMPE
;
}
...
...
@@ -402,6 +413,9 @@ cmsStage* CMSEXPORT cmsStageAllocMatrix(cmsContext ContextID, cmsUInt32Number R
n
=
Rows
*
Cols
;
// Check for overflow
if
(
n
==
0
)
return
NULL
;
if
(
n
>=
UINT_MAX
/
Cols
)
return
NULL
;
if
(
n
>=
UINT_MAX
/
Rows
)
return
NULL
;
if
(
n
<
Rows
||
n
<
Cols
)
return
NULL
;
NewMPE
=
_cmsStageAllocPlaceholder
(
ContextID
,
cmsSigMatrixElemType
,
Cols
,
Rows
,
...
...
@@ -479,10 +493,20 @@ void EvaluateCLUTfloatIn16(const cmsFloat32Number In[], cmsFloat32Number Out[],
static
cmsUInt32Number
CubeSize
(
const
cmsUInt32Number
Dims
[],
cmsUInt32Number
b
)
{
cmsUInt32Number
rv
;
cmsUInt32Number
rv
,
dim
;
_cmsAssert
(
Dims
!=
NULL
);
for
(
rv
=
1
;
b
>
0
;
b
--
)
{
for
(
rv
=
1
;
b
>
0
;
b
--
)
rv
*=
Dims
[
b
-
1
];
dim
=
Dims
[
b
-
1
];
if
(
dim
==
0
)
return
0
;
// Error
rv
*=
dim
;
// Check for overflow
if
(
rv
>
UINT_MAX
/
dim
)
return
0
;
}
return
rv
;
}
...
...
@@ -549,17 +573,35 @@ cmsStage* CMSEXPORT cmsStageAllocCLut16bitGranular(cmsContext ContextID,
_cmsStageCLutData
*
NewElem
;
cmsStage
*
NewMPE
;
_cmsAssert
(
clutPoints
!=
NULL
);
if
(
inputChan
>
MAX_INPUT_DIMENSIONS
)
{
cmsSignalError
(
ContextID
,
cmsERROR_RANGE
,
"Too many input channels (%d channels, max=%d)"
,
inputChan
,
MAX_INPUT_DIMENSIONS
);
return
NULL
;
}
NewMPE
=
_cmsStageAllocPlaceholder
(
ContextID
,
cmsSigCLutElemType
,
inputChan
,
outputChan
,
EvaluateCLUTfloatIn16
,
CLUTElemDup
,
CLutElemTypeFree
,
NULL
);
if
(
NewMPE
==
NULL
)
return
NULL
;
NewElem
=
(
_cmsStageCLutData
*
)
_cmsMalloc
(
ContextID
,
sizeof
(
_cmsStageCLutData
));
if
(
NewElem
==
NULL
)
return
NULL
;
NewElem
=
(
_cmsStageCLutData
*
)
_cmsMallocZero
(
ContextID
,
sizeof
(
_cmsStageCLutData
));
if
(
NewElem
==
NULL
)
{
cmsStageFree
(
NewMPE
);
return
NULL
;
}
NewMPE
->
Data
=
(
void
*
)
NewElem
;
NewElem
->
nEntries
=
n
=
outputChan
*
CubeSize
(
clutPoints
,
inputChan
);
NewElem
->
HasFloatValues
=
FALSE
;
if
(
n
==
0
)
{
cmsStageFree
(
NewMPE
);
return
NULL
;
}
NewElem
->
Tab
.
T
=
(
cmsUInt16Number
*
)
_cmsCalloc
(
ContextID
,
n
,
sizeof
(
cmsUInt16Number
));
if
(
NewElem
->
Tab
.
T
==
NULL
)
{
cmsStageFree
(
NewMPE
);
...
...
@@ -578,8 +620,6 @@ cmsStage* CMSEXPORT cmsStageAllocCLut16bitGranular(cmsContext ContextID,
return
NULL
;
}
NewMPE
->
Data
=
(
void
*
)
NewElem
;
return
NewMPE
;
}
...
...
@@ -623,18 +663,37 @@ cmsStage* CMSEXPORT cmsStageAllocCLutFloatGranular(cmsContext ContextID, const c
{
cmsUInt32Number
i
,
n
;
_cmsStageCLutData
*
NewElem
;
cmsStage
*
NewMPE
=
_cmsStageAllocPlaceholder
(
ContextID
,
cmsSigCLutElemType
,
inputChan
,
outputChan
,
EvaluateCLUTfloat
,
CLUTElemDup
,
CLutElemTypeFree
,
NULL
);
cmsStage
*
NewMPE
;
_cmsAssert
(
clutPoints
!=
NULL
);
if
(
inputChan
>
MAX_INPUT_DIMENSIONS
)
{
cmsSignalError
(
ContextID
,
cmsERROR_RANGE
,
"Too many input channels (%d channels, max=%d)"
,
inputChan
,
MAX_INPUT_DIMENSIONS
);
return
NULL
;
}
NewMPE
=
_cmsStageAllocPlaceholder
(
ContextID
,
cmsSigCLutElemType
,
inputChan
,
outputChan
,
EvaluateCLUTfloat
,
CLUTElemDup
,
CLutElemTypeFree
,
NULL
);
if
(
NewMPE
==
NULL
)
return
NULL
;
NewElem
=
(
_cmsStageCLutData
*
)
_cmsMalloc
(
ContextID
,
sizeof
(
_cmsStageCLutData
));
if
(
NewElem
==
NULL
)
return
NULL
;
NewElem
=
(
_cmsStageCLutData
*
)
_cmsMallocZero
(
ContextID
,
sizeof
(
_cmsStageCLutData
));
if
(
NewElem
==
NULL
)
{
cmsStageFree
(
NewMPE
);
return
NULL
;
}
NewMPE
->
Data
=
(
void
*
)
NewElem
;
NewElem
->
nEntries
=
n
=
outputChan
*
CubeSize
(
clutPoints
,
inputChan
);
// There is a potential integer overflow on conputing n and nEntries.
NewElem
->
nEntries
=
n
=
outputChan
*
CubeSize
(
clutPoints
,
inputChan
);
NewElem
->
HasFloatValues
=
TRUE
;
if
(
n
==
0
)
{
cmsStageFree
(
NewMPE
);
return
NULL
;
}
NewElem
->
Tab
.
TFloat
=
(
cmsFloat32Number
*
)
_cmsCalloc
(
ContextID
,
n
,
sizeof
(
cmsFloat32Number
));
if
(
NewElem
->
Tab
.
TFloat
==
NULL
)
{
cmsStageFree
(
NewMPE
);
...
...
@@ -647,7 +706,6 @@ cmsStage* CMSEXPORT cmsStageAllocCLutFloatGranular(cmsContext ContextID, const c
}
}
NewMPE
->
Data
=
(
void
*
)
NewElem
;
NewElem
->
Params
=
_cmsComputeInterpParamsEx
(
ContextID
,
clutPoints
,
inputChan
,
outputChan
,
NewElem
->
Tab
.
TFloat
,
CMS_LERP_FLAGS_FLOAT
);
if
(
NewElem
->
Params
==
NULL
)
{
...
...
@@ -715,8 +773,13 @@ cmsBool CMSEXPORT cmsStageSampleCLut16bit(cmsStage* mpe, cmsSAMPLER16 Sampler, v
int
nInputs
,
nOutputs
;
cmsUInt32Number
*
nSamples
;
cmsUInt16Number
In
[
cmsMAXCHANNELS
],
Out
[
MAX_STAGE_CHANNELS
];
_cmsStageCLutData
*
clut
=
(
_cmsStageCLutData
*
)
mpe
->
Data
;
_cmsStageCLutData
*
clut
;
if
(
mpe
==
NULL
)
return
FALSE
;
clut
=
(
_cmsStageCLutData
*
)
mpe
->
Data
;
if
(
clut
==
NULL
)
return
FALSE
;
nSamples
=
clut
->
Params
->
nSamples
;
nInputs
=
clut
->
Params
->
nInputs
;
...
...
@@ -726,6 +789,7 @@ cmsBool CMSEXPORT cmsStageSampleCLut16bit(cmsStage* mpe, cmsSAMPLER16 Sampler, v
if
(
nOutputs
>=
MAX_STAGE_CHANNELS
)
return
FALSE
;
nTotalPoints
=
CubeSize
(
nSamples
,
nInputs
);
if
(
nTotalPoints
==
0
)
return
FALSE
;
index
=
0
;
for
(
i
=
0
;
i
<
nTotalPoints
;
i
++
)
{
...
...
@@ -779,6 +843,7 @@ cmsBool CMSEXPORT cmsStageSampleCLutFloat(cmsStage* mpe, cmsSAMPLERFLOAT Sampler
if
(
nOutputs
>=
MAX_STAGE_CHANNELS
)
return
FALSE
;
nTotalPoints
=
CubeSize
(
nSamples
,
nInputs
);
if
(
nTotalPoints
==
0
)
return
FALSE
;
index
=
0
;
for
(
i
=
0
;
i
<
nTotalPoints
;
i
++
)
{
...
...
@@ -828,6 +893,7 @@ cmsBool CMSEXPORT cmsSliceSpace16(cmsUInt32Number nInputs, const cmsUInt32Number
if
(
nInputs
>=
cmsMAXCHANNELS
)
return
FALSE
;
nTotalPoints
=
CubeSize
(
clutPoints
,
nInputs
);
if
(
nTotalPoints
==
0
)
return
FALSE
;
for
(
i
=
0
;
i
<
nTotalPoints
;
i
++
)
{
...
...
@@ -857,6 +923,7 @@ cmsInt32Number CMSEXPORT cmsSliceSpaceFloat(cmsUInt32Number nInputs, const cmsUI
if
(
nInputs
>=
cmsMAXCHANNELS
)
return
FALSE
;
nTotalPoints
=
CubeSize
(
clutPoints
,
nInputs
);
if
(
nTotalPoints
==
0
)
return
FALSE
;
for
(
i
=
0
;
i
<
nTotalPoints
;
i
++
)
{
...
...
@@ -992,6 +1059,89 @@ cmsStage* _cmsStageAllocLabV4ToV2(cmsContext ContextID)
}
// To Lab to float. Note that the MPE gives numbers in normal Lab range
// and we need 0..1.0 range for the formatters
// L* : 0...100 => 0...1.0 (L* / 100)
// ab* : -128..+127 to 0..1 ((ab* + 128) / 255)
cmsStage
*
_cmsStageNormalizeFromLabFloat
(
cmsContext
ContextID
)
{
static
const
cmsFloat64Number
a1
[]
=
{
1
.
0
/
100
.
0
,
0
,
0
,
0
,
1
.
0
/
255
.
0
,
0
,
0
,
0
,
1
.
0
/
255
.
0
};
static
const
cmsFloat64Number
o1
[]
=
{
0
,
128
.
0
/
255
.
0
,
128
.
0
/
255
.
0
};
cmsStage
*
mpe
=
cmsStageAllocMatrix
(
ContextID
,
3
,
3
,
a1
,
o1
);
if
(
mpe
==
NULL
)
return
mpe
;
mpe
->
Implements
=
cmsSigLab2FloatPCS
;
return
mpe
;
}
// Fom XYZ to floating point PCS
cmsStage
*
_cmsStageNormalizeFromXyzFloat
(
cmsContext
ContextID
)
{
#define n (32768.0/65535.0)
static
const
cmsFloat64Number
a1
[]
=
{
n
,
0
,
0
,
0
,
n
,
0
,
0
,
0
,
n
};
#undef n
cmsStage
*
mpe
=
cmsStageAllocMatrix
(
ContextID
,
3
,
3
,
a1
,
NULL
);
if
(
mpe
==
NULL
)
return
mpe
;
mpe
->
Implements
=
cmsSigXYZ2FloatPCS
;
return
mpe
;
}
cmsStage
*
_cmsStageNormalizeToLabFloat
(
cmsContext
ContextID
)
{
static
const
cmsFloat64Number
a1
[]
=
{
100
.
0
,
0
,
0
,
0
,
255
.
0
,
0
,
0
,
0
,
255
.
0
};
static
const
cmsFloat64Number
o1
[]
=
{
0
,
-
128
.
0
,
-
128
.
0
};
cmsStage
*
mpe
=
cmsStageAllocMatrix
(
ContextID
,
3
,
3
,
a1
,
o1
);
if
(
mpe
==
NULL
)
return
mpe
;
mpe
->
Implements
=
cmsSigFloatPCS2Lab
;
return
mpe
;
}
cmsStage
*
_cmsStageNormalizeToXyzFloat
(
cmsContext
ContextID
)
{
#define n (65535.0/32768.0)
static
const
cmsFloat64Number
a1
[]
=
{
n
,
0
,
0
,
0
,
n
,
0
,
0
,
0
,
n
};
#undef n
cmsStage
*
mpe
=
cmsStageAllocMatrix
(
ContextID
,
3
,
3
,
a1
,
NULL
);
if
(
mpe
==
NULL
)
return
mpe
;
mpe
->
Implements
=
cmsSigFloatPCS2XYZ
;
return
mpe
;
}
// ********************************************************************************
// Type cmsSigXYZ2LabElemType
// ********************************************************************************
...
...
@@ -1201,22 +1351,28 @@ cmsPipeline* CMSEXPORT cmsPipelineAlloc(cmsContext ContextID, cmsUInt32Number In
NewLUT
->
DupDataFn
=
NULL
;
NewLUT
->
FreeDataFn
=
NULL
;
NewLUT
->
Data
=
NewLUT
;
NewLUT
->
ContextID
=
ContextID
;
NewLUT
->
ContextID
=
ContextID
;
BlessLUT
(
NewLUT
);
return
NewLUT
;
}
cmsContext
CMSEXPORT
cmsGetPipelineContextID
(
const
cmsPipeline
*
lut
)
{
_cmsAssert
(
lut
!=
NULL
);
return
lut
->
ContextID
;
}
cmsUInt32Number
CMSEXPORT
cmsPipelineInputChannels
(
const
cmsPipeline
*
lut
)
{
_cmsAssert
(
lut
!=
NULL
);
return
lut
->
InputChannels
;
}
cmsUInt32Number
CMSEXPORT
cmsPipelineOutputChannels
(
const
cmsPipeline
*
lut
)
{
_cmsAssert
(
lut
!=
NULL
);
return
lut
->
OutputChannels
;
}
...
...
@@ -1244,6 +1400,7 @@ void CMSEXPORT cmsPipelineFree(cmsPipeline* lut)
// Default to evaluate the LUT on 16 bit-basis.
void
CMSEXPORT
cmsPipelineEval16
(
const
cmsUInt16Number
In
[],
cmsUInt16Number
Out
[],
const
cmsPipeline
*
lut
)
{
_cmsAssert
(
lut
!=
NULL
);
lut
->
Eval16Fn
(
In
,
Out
,
lut
->
Data
);
}
...
...
@@ -1251,6 +1408,7 @@ void CMSEXPORT cmsPipelineEval16(const cmsUInt16Number In[], cmsUInt16Number Out
// Does evaluate the LUT on cmsFloat32Number-basis.
void
CMSEXPORT
cmsPipelineEvalFloat
(
const
cmsFloat32Number
In
[],
cmsFloat32Number
Out
[],
const
cmsPipeline
*
lut
)
{
_cmsAssert
(
lut
!=
NULL
);
lut
->
EvalFloatFn
(
In
,
Out
,
lut
);
}
...
...
@@ -1288,8 +1446,10 @@ cmsPipeline* CMSEXPORT cmsPipelineDup(const cmsPipeline* lut)
Anterior
=
NewMPE
;
}
NewLUT
->
DupDataFn
=
lut
->
DupDataFn
;
NewLUT
->
FreeDataFn
=
lut
->
FreeDataFn
;
NewLUT
->
Eval16Fn
=
lut
->
Eval16Fn
;
NewLUT
->
EvalFloatFn
=
lut
->
EvalFloatFn
;
NewLUT
->
DupDataFn
=
lut
->
DupDataFn
;
NewLUT
->
FreeDataFn
=
lut
->
FreeDataFn
;
if
(
NewLUT
->
DupDataFn
!=
NULL
)
NewLUT
->
Data
=
NewLUT
->
DupDataFn
(
lut
->
ContextID
,
lut
->
Data
);
...
...
@@ -1306,6 +1466,9 @@ void CMSEXPORT cmsPipelineInsertStage(cmsPipeline* lut, cmsStageLoc loc, cmsStag
{
cmsStage
*
Anterior
=
NULL
,
*
pt
;
_cmsAssert
(
lut
!=
NULL
);
_cmsAssert
(
mpe
!=
NULL
);
switch
(
loc
)
{
case
cmsAT_BEGIN
:
...
...
@@ -1456,13 +1619,13 @@ cmsUInt32Number CMSEXPORT cmsPipelineStageCount(const cmsPipeline* lut)
return
n
;
}
// This function may be used to set the optional evalu
e
ator and a block of private data. If private data is being used, an optional
// This function may be used to set the optional evaluator and a block of private data. If private data is being used, an optional
// duplicator and free functions should also be specified in order to duplicate the LUT construct. Use NULL to inhibit such functionality.
void
CMSEXPORT
_cmsPipelineSetOptimizationParameters
(
cmsPipeline
*
Lut
,
_cmsOPTeval16Fn
Eval16
,
void
*
PrivateData
,
_cms
OPTfree
DataFn
FreePrivateDataFn
,
_cms
OPTdupDataFn
DupPrivateDataFn
)
_cms
FreeUser
DataFn
FreePrivateDataFn
,
_cms
DupUserDataFn
DupPrivateDataFn
)
{
Lut
->
Eval16Fn
=
Eval16
;
...
...
@@ -1640,3 +1803,4 @@ cmsBool CMSEXPORT cmsPipelineEvalReverseFloat(cmsFloat32Number Target[],
return
TRUE
;
}
src/share/native/sun/java2d/cmm/lcms/cmsmd5.c
浏览文件 @
fdf0805b
...
...
@@ -30,7 +30,7 @@
//---------------------------------------------------------------------------------
//
// Little Color Management System
// Copyright (c) 1998-201
0
Marti Maria Saguer
// Copyright (c) 1998-201
2
Marti Maria Saguer
//
// Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the "Software"),
...
...
src/share/native/sun/java2d/cmm/lcms/cmsmtrx.c
浏览文件 @
fdf0805b
...
...
@@ -30,7 +30,7 @@
//---------------------------------------------------------------------------------
//
// Little Color Management System
// Copyright (c) 1998-201
0
Marti Maria Saguer
// Copyright (c) 1998-201
2
Marti Maria Saguer
//
// Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the "Software"),
...
...
@@ -202,3 +202,4 @@ void CMSEXPORT _cmsMAT3eval(cmsVEC3* r, const cmsMAT3* a, const cmsVEC3* v)
r
->
n
[
VZ
]
=
a
->
v
[
2
].
n
[
VX
]
*
v
->
n
[
VX
]
+
a
->
v
[
2
].
n
[
VY
]
*
v
->
n
[
VY
]
+
a
->
v
[
2
].
n
[
VZ
]
*
v
->
n
[
VZ
];
}
src/share/native/sun/java2d/cmm/lcms/cmsnamed.c
浏览文件 @
fdf0805b
...
...
@@ -30,7 +30,7 @@
//---------------------------------------------------------------------------------
//
// Little Color Management System
// Copyright (c) 1998-201
0
Marti Maria Saguer
// Copyright (c) 1998-201
2
Marti Maria Saguer
//
// Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the "Software"),
...
...
@@ -117,7 +117,7 @@ cmsBool GrowMLUpool(cmsMLU* mlu)
}
// Grows a ntry table for a MLU. Each time this function is called, table size is multiplied times two.
// Grows a
e
ntry table for a MLU. Each time this function is called, table size is multiplied times two.
static
cmsBool
GrowMLUtable
(
cmsMLU
*
mlu
)
{
...
...
@@ -130,7 +130,7 @@ cmsBool GrowMLUtable(cmsMLU* mlu)
AllocatedEntries
=
mlu
->
AllocatedEntries
*
2
;
// Check for overflow
if
(
AllocatedEntries
<
mlu
->
AllocatedEntries
)
return
FALSE
;
if
(
AllocatedEntries
/
2
!=
mlu
->
AllocatedEntries
)
return
FALSE
;
// Reallocate the memory
NewPtr
=
(
_cmsMLUentry
*
)
_cmsRealloc
(
mlu
->
ContextID
,
mlu
->
Entries
,
AllocatedEntries
*
sizeof
(
_cmsMLUentry
));
...
...
@@ -359,9 +359,9 @@ const wchar_t* _cmsMLUgetWide(const cmsMLU* mlu,
if
(
Best
==
-
1
)
Best
=
0
;
v
=
mlu
->
Entries
+
Best
;
v
=
mlu
->
Entries
+
Best
;
if
(
UsedLanguageCode
!=
NULL
)
*
UsedLanguageCode
=
v
->
Language
;
if
(
UsedLanguageCode
!=
NULL
)
*
UsedLanguageCode
=
v
->
Language
;
if
(
UsedCountryCode
!=
NULL
)
*
UsedCountryCode
=
v
->
Country
;
if
(
len
!=
NULL
)
*
len
=
v
->
Len
;
...
...
@@ -372,8 +372,8 @@ const wchar_t* _cmsMLUgetWide(const cmsMLU* mlu,
// Obtain an ASCII representation of the wide string. Setting buffer to NULL returns the len
cmsUInt32Number
CMSEXPORT
cmsMLUgetASCII
(
const
cmsMLU
*
mlu
,
const
char
LanguageCode
[
3
],
const
char
CountryCode
[
3
],
char
*
Buffer
,
cmsUInt32Number
BufferSize
)
const
char
LanguageCode
[
3
],
const
char
CountryCode
[
3
],
char
*
Buffer
,
cmsUInt32Number
BufferSize
)
{
const
wchar_t
*
Wide
;
cmsUInt32Number
StrLen
=
0
;
...
...
@@ -417,8 +417,8 @@ cmsUInt32Number CMSEXPORT cmsMLUgetASCII(const cmsMLU* mlu,
// Obtain a wide representation of the MLU, on depending on current locale settings
cmsUInt32Number
CMSEXPORT
cmsMLUgetWide
(
const
cmsMLU
*
mlu
,
const
char
LanguageCode
[
3
],
const
char
CountryCode
[
3
],
wchar_t
*
Buffer
,
cmsUInt32Number
BufferSize
)
const
char
LanguageCode
[
3
],
const
char
CountryCode
[
3
],
wchar_t
*
Buffer
,
cmsUInt32Number
BufferSize
)
{
const
wchar_t
*
Wide
;
cmsUInt32Number
StrLen
=
0
;
...
...
@@ -491,6 +491,9 @@ cmsBool GrowNamedColorList(cmsNAMEDCOLORLIST* v)
else
size
=
v
->
Allocated
*
2
;
// Keep a maximum color lists can grow, 100K entries seems reasonable
if
(
size
>
1024
*
100
)
return
FALSE
;
NewPtr
=
(
_cmsNAMEDCOLOR
*
)
_cmsRealloc
(
v
->
ContextID
,
v
->
List
,
size
*
sizeof
(
_cmsNAMEDCOLOR
));
if
(
NewPtr
==
NULL
)
return
FALSE
;
...
...
@@ -516,6 +519,8 @@ cmsNAMEDCOLORLIST* CMSEXPORT cmsAllocNamedColorList(cmsContext ContextID, cmsUIn
strncpy
(
v
->
Prefix
,
Prefix
,
sizeof
(
v
->
Prefix
));
strncpy
(
v
->
Suffix
,
Suffix
,
sizeof
(
v
->
Suffix
));
v
->
Prefix
[
32
]
=
v
->
Suffix
[
32
]
=
0
;
v
->
ColorantCount
=
ColorantCount
;
return
v
;
...
...
@@ -569,9 +574,14 @@ cmsBool CMSEXPORT cmsAppendNamedColor(cmsNAMEDCOLORLIST* NamedColorList,
for
(
i
=
0
;
i
<
3
;
i
++
)
NamedColorList
->
List
[
NamedColorList
->
nColors
].
PCS
[
i
]
=
PCS
==
NULL
?
0
:
PCS
[
i
];
if
(
Name
!=
NULL
)
if
(
Name
!=
NULL
)
{
strncpy
(
NamedColorList
->
List
[
NamedColorList
->
nColors
].
Name
,
Name
,
sizeof
(
NamedColorList
->
List
[
NamedColorList
->
nColors
].
Name
));
NamedColorList
->
List
[
NamedColorList
->
nColors
].
Name
[
cmsMAX_PATH
-
1
]
=
0
;
}
else
NamedColorList
->
List
[
NamedColorList
->
nColors
].
Name
[
0
]
=
0
;
...
...
@@ -644,6 +654,24 @@ void* DupNamedColorList(cmsStage* mpe)
return
cmsDupNamedColorList
(
List
);
}
static
void
EvalNamedColorPCS
(
const
cmsFloat32Number
In
[],
cmsFloat32Number
Out
[],
const
cmsStage
*
mpe
)
{
cmsNAMEDCOLORLIST
*
NamedColorList
=
(
cmsNAMEDCOLORLIST
*
)
mpe
->
Data
;
cmsUInt16Number
index
=
(
cmsUInt16Number
)
_cmsQuickSaturateWord
(
In
[
0
]
*
65535
.
0
);
if
(
index
>=
NamedColorList
->
nColors
)
{
cmsSignalError
(
NamedColorList
->
ContextID
,
cmsERROR_RANGE
,
"Color %d out of range; ignored"
,
index
);
}
else
{
// Named color always uses Lab
Out
[
0
]
=
(
cmsFloat32Number
)
(
NamedColorList
->
List
[
index
].
PCS
[
0
]
/
65535
.
0
);
Out
[
1
]
=
(
cmsFloat32Number
)
(
NamedColorList
->
List
[
index
].
PCS
[
1
]
/
65535
.
0
);
Out
[
2
]
=
(
cmsFloat32Number
)
(
NamedColorList
->
List
[
index
].
PCS
[
2
]
/
65535
.
0
);
}
}
static
void
EvalNamedColor
(
const
cmsFloat32Number
In
[],
cmsFloat32Number
Out
[],
const
cmsStage
*
mpe
)
{
...
...
@@ -662,15 +690,15 @@ void EvalNamedColor(const cmsFloat32Number In[], cmsFloat32Number Out[], const c
// Named color lookup element
cmsStage
*
_cmsStageAllocNamedColor
(
cmsNAMEDCOLORLIST
*
NamedColorList
)
cmsStage
*
_cmsStageAllocNamedColor
(
cmsNAMEDCOLORLIST
*
NamedColorList
,
cmsBool
UsePCS
)
{
return
_cmsStageAllocPlaceholder
(
NamedColorList
->
ContextID
,
cmsSigNamedColorElemType
,
1
,
3
,
EvalNamedColor
,
DupNamedColorList
,
FreeNamedColorList
,
cmsDupNamedColorList
(
NamedColorList
));
cmsSigNamedColorElemType
,
1
,
UsePCS
?
3
:
NamedColorList
->
ColorantCount
,
UsePCS
?
EvalNamedColorPCS
:
EvalNamedColor
,
DupNamedColorList
,
FreeNamedColorList
,
cmsDupNamedColorList
(
NamedColorList
));
}
...
...
@@ -771,3 +799,131 @@ Error:
return
NULL
;
}
// Dictionaries --------------------------------------------------------------------------------------------------------
// Dictionaries are just very simple linked lists
typedef
struct
_cmsDICT_struct
{
cmsDICTentry
*
head
;
cmsContext
ContextID
;
}
_cmsDICT
;
// Allocate an empty dictionary
cmsHANDLE
CMSEXPORT
cmsDictAlloc
(
cmsContext
ContextID
)
{
_cmsDICT
*
dict
=
(
_cmsDICT
*
)
_cmsMallocZero
(
ContextID
,
sizeof
(
_cmsDICT
));
if
(
dict
==
NULL
)
return
NULL
;
dict
->
ContextID
=
ContextID
;
return
(
cmsHANDLE
)
dict
;
}
// Dispose resources
void
CMSEXPORT
cmsDictFree
(
cmsHANDLE
hDict
)
{
_cmsDICT
*
dict
=
(
_cmsDICT
*
)
hDict
;
cmsDICTentry
*
entry
,
*
next
;
_cmsAssert
(
dict
!=
NULL
);
// Walk the list freeing all nodes
entry
=
dict
->
head
;
while
(
entry
!=
NULL
)
{
if
(
entry
->
DisplayName
!=
NULL
)
cmsMLUfree
(
entry
->
DisplayName
);
if
(
entry
->
DisplayValue
!=
NULL
)
cmsMLUfree
(
entry
->
DisplayValue
);
if
(
entry
->
Name
!=
NULL
)
_cmsFree
(
dict
->
ContextID
,
entry
->
Name
);
if
(
entry
->
Value
!=
NULL
)
_cmsFree
(
dict
->
ContextID
,
entry
->
Value
);
// Don't fall in the habitual trap...
next
=
entry
->
Next
;
_cmsFree
(
dict
->
ContextID
,
entry
);
entry
=
next
;
}
_cmsFree
(
dict
->
ContextID
,
dict
);
}
// Duplicate a wide char string
static
wchar_t
*
DupWcs
(
cmsContext
ContextID
,
const
wchar_t
*
ptr
)
{
if
(
ptr
==
NULL
)
return
NULL
;
return
(
wchar_t
*
)
_cmsDupMem
(
ContextID
,
ptr
,
(
mywcslen
(
ptr
)
+
1
)
*
sizeof
(
wchar_t
));
}
// Add a new entry to the linked list
cmsBool
CMSEXPORT
cmsDictAddEntry
(
cmsHANDLE
hDict
,
const
wchar_t
*
Name
,
const
wchar_t
*
Value
,
const
cmsMLU
*
DisplayName
,
const
cmsMLU
*
DisplayValue
)
{
_cmsDICT
*
dict
=
(
_cmsDICT
*
)
hDict
;
cmsDICTentry
*
entry
;
_cmsAssert
(
dict
!=
NULL
);
_cmsAssert
(
Name
!=
NULL
);
entry
=
(
cmsDICTentry
*
)
_cmsMallocZero
(
dict
->
ContextID
,
sizeof
(
cmsDICTentry
));
if
(
entry
==
NULL
)
return
FALSE
;
entry
->
DisplayName
=
cmsMLUdup
(
DisplayName
);
entry
->
DisplayValue
=
cmsMLUdup
(
DisplayValue
);
entry
->
Name
=
DupWcs
(
dict
->
ContextID
,
Name
);
entry
->
Value
=
DupWcs
(
dict
->
ContextID
,
Value
);
entry
->
Next
=
dict
->
head
;
dict
->
head
=
entry
;
return
TRUE
;
}
// Duplicates an existing dictionary
cmsHANDLE
CMSEXPORT
cmsDictDup
(
cmsHANDLE
hDict
)
{
_cmsDICT
*
old_dict
=
(
_cmsDICT
*
)
hDict
;
cmsHANDLE
hNew
;
_cmsDICT
*
new_dict
;
cmsDICTentry
*
entry
;
_cmsAssert
(
old_dict
!=
NULL
);
hNew
=
cmsDictAlloc
(
old_dict
->
ContextID
);
if
(
hNew
==
NULL
)
return
NULL
;
new_dict
=
(
_cmsDICT
*
)
hNew
;
// Walk the list freeing all nodes
entry
=
old_dict
->
head
;
while
(
entry
!=
NULL
)
{
if
(
!
cmsDictAddEntry
(
hNew
,
entry
->
Name
,
entry
->
Value
,
entry
->
DisplayName
,
entry
->
DisplayValue
))
{
cmsDictFree
(
hNew
);
return
NULL
;
}
entry
=
entry
->
Next
;
}
return
hNew
;
}
// Get a pointer to the linked list
const
cmsDICTentry
*
CMSEXPORT
cmsDictGetEntryList
(
cmsHANDLE
hDict
)
{
_cmsDICT
*
dict
=
(
_cmsDICT
*
)
hDict
;
if
(
dict
==
NULL
)
return
NULL
;
return
dict
->
head
;
}
// Helper For external languages
const
cmsDICTentry
*
CMSEXPORT
cmsDictNextEntry
(
const
cmsDICTentry
*
e
)
{
if
(
e
==
NULL
)
return
NULL
;
return
e
->
Next
;
}
src/share/native/sun/java2d/cmm/lcms/cmsopt.c
浏览文件 @
fdf0805b
...
...
@@ -30,7 +30,7 @@
//---------------------------------------------------------------------------------
//
// Little Color Management System
// Copyright (c) 1998-201
0
Marti Maria Saguer
// Copyright (c) 1998-201
1
Marti Maria Saguer
//
// Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the "Software"),
...
...
@@ -223,6 +223,12 @@ cmsBool PreOptimize(cmsPipeline* Lut)
// Remove V2 to V4 followed by V4 to V2
Opt
|=
_Remove2Op
(
Lut
,
cmsSigLabV2toV4
,
cmsSigLabV4toV2
);
// Remove float pcs Lab conversions
Opt
|=
_Remove2Op
(
Lut
,
cmsSigLab2FloatPCS
,
cmsSigFloatPCS2Lab
);
// Remove float pcs Lab conversions
Opt
|=
_Remove2Op
(
Lut
,
cmsSigXYZ2FloatPCS
,
cmsSigFloatPCS2XYZ
);
if
(
Opt
)
AnyOpt
=
TRUE
;
}
while
(
Opt
);
...
...
@@ -298,7 +304,7 @@ Prelin16Data* PrelinOpt16alloc(cmsContext ContextID,
int
nOutputs
,
cmsToneCurve
**
Out
)
{
int
i
;
Prelin16Data
*
p16
=
(
Prelin16Data
*
)
_cmsMallocZero
(
ContextID
,
sizeof
(
Prelin16Data
));
Prelin16Data
*
p16
=
_cmsMallocZero
(
ContextID
,
sizeof
(
Prelin16Data
));
if
(
p16
==
NULL
)
return
NULL
;
p16
->
nInputs
=
nInputs
;
...
...
@@ -411,17 +417,17 @@ cmsBool PatchLUT(cmsStage* CLUT, cmsUInt16Number At[], cmsUInt16Number Value[],
return
FALSE
;
}
px
=
((
cmsFloat64Number
)
At
[
0
]
*
(
p16
->
Domain
[
0
]))
/
65535
.
0
;
py
=
((
cmsFloat64Number
)
At
[
1
]
*
(
p16
->
Domain
[
1
]))
/
65535
.
0
;
pz
=
((
cmsFloat64Number
)
At
[
2
]
*
(
p16
->
Domain
[
2
]))
/
65535
.
0
;
pw
=
((
cmsFloat64Number
)
At
[
3
]
*
(
p16
->
Domain
[
3
]))
/
65535
.
0
;
if
(
nChannelsIn
==
4
)
{
x0
=
(
int
)
floor
(
px
)
;
y0
=
(
int
)
floor
(
py
)
;
z0
=
(
int
)
floor
(
pz
)
;
w0
=
(
int
)
floor
(
pw
)
;
px
=
((
cmsFloat64Number
)
At
[
0
]
*
(
p16
->
Domain
[
0
]))
/
65535
.
0
;
py
=
((
cmsFloat64Number
)
At
[
1
]
*
(
p16
->
Domain
[
1
]))
/
65535
.
0
;
pz
=
((
cmsFloat64Number
)
At
[
2
]
*
(
p16
->
Domain
[
2
]))
/
65535
.
0
;
pw
=
((
cmsFloat64Number
)
At
[
3
]
*
(
p16
->
Domain
[
3
]))
/
65535
.
0
;
if
(
nChannelsIn
==
4
)
{
x0
=
(
int
)
floor
(
px
);
y0
=
(
int
)
floor
(
py
);
z0
=
(
int
)
floor
(
pz
);
w0
=
(
int
)
floor
(
pw
);
if
(((
px
-
x0
)
!=
0
)
||
((
py
-
y0
)
!=
0
)
||
...
...
@@ -429,24 +435,36 @@ cmsBool PatchLUT(cmsStage* CLUT, cmsUInt16Number At[], cmsUInt16Number Value[],
((
pw
-
w0
)
!=
0
))
return
FALSE
;
// Not on exact node
index
=
p16
->
opta
[
3
]
*
x0
+
p16
->
opta
[
2
]
*
y0
+
p16
->
opta
[
1
]
*
z0
+
p16
->
opta
[
0
]
*
w0
;
p16
->
opta
[
2
]
*
y0
+
p16
->
opta
[
1
]
*
z0
+
p16
->
opta
[
0
]
*
w0
;
}
else
if
(
nChannelsIn
==
3
)
{
px
=
((
cmsFloat64Number
)
At
[
0
]
*
(
p16
->
Domain
[
0
]))
/
65535
.
0
;
py
=
((
cmsFloat64Number
)
At
[
1
]
*
(
p16
->
Domain
[
1
]))
/
65535
.
0
;
pz
=
((
cmsFloat64Number
)
At
[
2
]
*
(
p16
->
Domain
[
2
]))
/
65535
.
0
;
x0
=
(
int
)
floor
(
px
);
y0
=
(
int
)
floor
(
py
);
z0
=
(
int
)
floor
(
pz
);
if
(((
px
-
x0
)
!=
0
)
||
((
py
-
y0
)
!=
0
)
||
((
pz
-
z0
)
!=
0
))
return
FALSE
;
// Not on exact node
index
=
p16
->
opta
[
2
]
*
x0
+
p16
->
opta
[
1
]
*
y0
+
p16
->
opta
[
0
]
*
z0
;
p16
->
opta
[
1
]
*
y0
+
p16
->
opta
[
0
]
*
z0
;
}
else
if
(
nChannelsIn
==
1
)
{
px
=
((
cmsFloat64Number
)
At
[
0
]
*
(
p16
->
Domain
[
0
]))
/
65535
.
0
;
x0
=
(
int
)
floor
(
px
);
if
(((
px
-
x0
)
!=
0
))
return
FALSE
;
// Not on exact node
index
=
p16
->
opta
[
0
]
*
x0
;
...
...
@@ -462,13 +480,15 @@ cmsBool PatchLUT(cmsStage* CLUT, cmsUInt16Number At[], cmsUInt16Number Value[],
return
TRUE
;
}
// Auxiliar, to see if two values are equal
.
// Auxiliar, to see if two values are equal
or very different
static
cmsBool
WhitesAreEqual
(
int
n
,
cmsUInt16Number
White1
[],
cmsUInt16Number
White2
[]
)
{
int
i
;
for
(
i
=
0
;
i
<
n
;
i
++
)
{
if
(
abs
(
White1
[
i
]
-
White2
[
i
])
>
0xf000
)
return
TRUE
;
// Values are so extremly different that the fixup should be avoided
if
(
White1
[
i
]
!=
White2
[
i
])
return
FALSE
;
}
return
TRUE
;
...
...
@@ -491,6 +511,8 @@ cmsBool FixWhiteMisalignment(cmsPipeline* Lut, cmsColorSpaceSignature EntryColor
&
WhitePointOut
,
NULL
,
&
nOuts
))
return
FALSE
;
// It needs to be fixed?
if
(
Lut
->
InputChannels
!=
nIns
)
return
FALSE
;
if
(
Lut
->
OutputChannels
!=
nOuts
)
return
FALSE
;
cmsPipelineEval16
(
WhitePointIn
,
ObtainedOut
,
Lut
);
...
...
@@ -555,6 +577,7 @@ cmsBool OptimizeByResampling(cmsPipeline** Lut, cmsUInt32Number Intent, cmsUInt3
{
cmsPipeline
*
Src
;
cmsPipeline
*
Dest
;
cmsStage
*
mpe
;
cmsStage
*
CLUT
;
cmsStage
*
KeepPreLin
=
NULL
,
*
KeepPostLin
=
NULL
;
int
nGridPoints
;
...
...
@@ -580,6 +603,13 @@ cmsBool OptimizeByResampling(cmsPipeline** Lut, cmsUInt32Number Intent, cmsUInt3
Src
=
*
Lut
;
// Named color pipelines cannot be optimized either
for
(
mpe
=
cmsPipelineGetPtrToFirstStage
(
Src
);
mpe
!=
NULL
;
mpe
=
cmsStageNext
(
mpe
))
{
if
(
cmsStageType
(
mpe
)
==
cmsSigNamedColorElemType
)
return
FALSE
;
}
// Allocate an empty LUT
Dest
=
cmsPipelineAlloc
(
Src
->
ContextID
,
Src
->
InputChannels
,
Src
->
OutputChannels
);
if
(
!
Dest
)
return
FALSE
;
...
...
@@ -817,8 +847,8 @@ void PrelinEval8(register const cmsUInt16Number Input[],
cmsUInt8Number
r
,
g
,
b
;
cmsS15Fixed16Number
rx
,
ry
,
rz
;
cmsS15Fixed16Number
c0
,
c1
,
c2
,
c3
,
Rest
;
int
OutChan
;
register
cmsS15Fixed16Number
X0
,
X1
,
Y0
,
Y1
,
Z0
,
Z1
;
int
OutChan
;
register
cmsS15Fixed16Number
X0
,
X1
,
Y0
,
Y1
,
Z0
,
Z1
;
Prelin8Data
*
p8
=
(
Prelin8Data
*
)
D
;
register
const
cmsInterpParams
*
p
=
p8
->
p
;
int
TotalOut
=
p
->
nOutputs
;
...
...
@@ -892,15 +922,35 @@ void PrelinEval8(register const cmsUInt16Number Input[],
}
Rest
=
c1
*
rx
+
c2
*
ry
+
c3
*
rz
;
Output
[
OutChan
]
=
(
cmsUInt16Number
)
c0
+
ROUND_FIXED_TO_INT
(
_cmsToFixedDomain
(
Rest
));
Rest
=
c1
*
rx
+
c2
*
ry
+
c3
*
rz
+
0x8001
;
Output
[
OutChan
]
=
(
cmsUInt16Number
)
c0
+
((
Rest
+
(
Rest
>>
16
))
>>
16
);
}
}
#undef DENS
// Curves that contain wide empty areas are not optimizeable
static
cmsBool
IsDegenerated
(
const
cmsToneCurve
*
g
)
{
int
i
,
Zeros
=
0
,
Poles
=
0
;
int
nEntries
=
g
->
nEntries
;
for
(
i
=
0
;
i
<
nEntries
;
i
++
)
{
if
(
g
->
Table16
[
i
]
==
0x0000
)
Zeros
++
;
if
(
g
->
Table16
[
i
]
==
0xffff
)
Poles
++
;
}
if
(
Zeros
==
1
&&
Poles
==
1
)
return
FALSE
;
// For linear tables
if
(
Zeros
>
(
nEntries
/
4
))
return
TRUE
;
// Degenerated, mostly zeros
if
(
Poles
>
(
nEntries
/
4
))
return
TRUE
;
// Degenerated, mostly poles
return
FALSE
;
}
// --------------------------------------------------------------------------------------------------------------
// We need xput over here
...
...
@@ -917,6 +967,7 @@ cmsBool OptimizeByComputingLinearization(cmsPipeline** Lut, cmsUInt32Number Inte
cmsStage
*
OptimizedCLUTmpe
;
cmsColorSpaceSignature
ColorSpace
,
OutputColorSpace
;
cmsStage
*
OptimizedPrelinMpe
;
cmsStage
*
mpe
;
cmsToneCurve
**
OptimizedPrelinCurves
;
_cmsStageCLutData
*
OptimizedPrelinCLUT
;
...
...
@@ -935,6 +986,14 @@ cmsBool OptimizeByComputingLinearization(cmsPipeline** Lut, cmsUInt32Number Inte
}
OriginalLut
=
*
Lut
;
// Named color pipelines cannot be optimized either
for
(
mpe
=
cmsPipelineGetPtrToFirstStage
(
OriginalLut
);
mpe
!=
NULL
;
mpe
=
cmsStageNext
(
mpe
))
{
if
(
cmsStageType
(
mpe
)
==
cmsSigNamedColorElemType
)
return
FALSE
;
}
ColorSpace
=
_cmsICCcolorSpace
(
T_COLORSPACE
(
*
InputFormat
));
OutputColorSpace
=
_cmsICCcolorSpace
(
T_COLORSPACE
(
*
OutputFormat
));
nGridPoints
=
_cmsReasonableGridpointsByColorspace
(
ColorSpace
,
*
dwFlags
);
...
...
@@ -981,6 +1040,9 @@ cmsBool OptimizeByComputingLinearization(cmsPipeline** Lut, cmsUInt32Number Inte
// Exclude if non-monotonic
if
(
!
cmsIsToneCurveMonotonic
(
Trans
[
t
]))
lIsSuitable
=
FALSE
;
if
(
IsDegenerated
(
Trans
[
t
]))
lIsSuitable
=
FALSE
;
}
// If it is not suitable, just quit
...
...
@@ -1413,12 +1475,12 @@ void FillSecondShaper(cmsUInt16Number* Table, cmsToneCurve* Curve, cmsBool Is8Bi
// first we compute the resulting byte and then we store the byte times
// 257. This quantization allows to round very quick by doing a >> 8, but
// since the low byte is always equal to msb, we can do a & 0xff and this works!
cmsUInt16Number
w
=
_cmsQuickSaturateWord
(
Val
*
65535
.
0
+
0
.
5
);
cmsUInt16Number
w
=
_cmsQuickSaturateWord
(
Val
*
65535
.
0
);
cmsUInt8Number
b
=
FROM_16_TO_8
(
w
);
Table
[
i
]
=
FROM_8_TO_16
(
b
);
}
else
Table
[
i
]
=
_cmsQuickSaturateWord
(
Val
*
65535
.
0
+
0
.
5
);
else
Table
[
i
]
=
_cmsQuickSaturateWord
(
Val
*
65535
.
0
);
}
}
...
...
@@ -1655,3 +1717,5 @@ cmsBool _cmsOptimizePipeline(cmsPipeline** PtrLut,
return
AnySuccess
;
}
src/share/native/sun/java2d/cmm/lcms/cmspack.c
浏览文件 @
fdf0805b
此差异已折叠。
点击以展开。
src/share/native/sun/java2d/cmm/lcms/cmspcs.c
浏览文件 @
fdf0805b
...
...
@@ -898,6 +898,7 @@ cmsUInt32Number CMSEXPORT cmsChannelsOf(cmsColorSpaceSignature ColorSpace)
{
switch
(
ColorSpace
)
{
case
cmsSig1colorData
:
case
cmsSigGrayData
:
return
1
;
case
cmsSig2colorData
:
return
2
;
...
...
src/share/native/sun/java2d/cmm/lcms/cmsplugin.c
浏览文件 @
fdf0805b
...
...
@@ -105,12 +105,12 @@ cmsUInt32Number CMSEXPORT _cmsAdjustEndianess32(cmsUInt32Number DWord)
// 1 2 3 4 5 6 7 8
// 8 7 6 5 4 3 2 1
void
CMSEXPORT
_cmsAdjustEndianess64
(
cmsUInt64Number
*
Result
,
cmsUInt64Number
QWord
)
void
CMSEXPORT
_cmsAdjustEndianess64
(
cmsUInt64Number
*
Result
,
cmsUInt64Number
*
QWord
)
{
#ifndef CMS_USE_BIG_ENDIAN
cmsUInt8Number
*
pIn
=
(
cmsUInt8Number
*
)
&
QWord
;
cmsUInt8Number
*
pIn
=
(
cmsUInt8Number
*
)
QWord
;
cmsUInt8Number
*
pOut
=
(
cmsUInt8Number
*
)
Result
;
_cmsAssert
(
Result
!=
NULL
);
...
...
@@ -128,7 +128,7 @@ void CMSEXPORT _cmsAdjustEndianess64(cmsUInt64Number* Result, cmsUInt64Number Q
_cmsAssert
(
Result
!=
NULL
);
*
Result
=
QWord
;
*
Result
=
*
QWord
;
#endif
}
...
...
@@ -218,7 +218,7 @@ cmsBool CMSEXPORT _cmsReadUInt64Number(cmsIOHANDLER* io, cmsUInt64Number* n)
if
(
io
->
Read
(
io
,
&
tmp
,
sizeof
(
cmsUInt64Number
),
1
)
!=
1
)
return
FALSE
;
if
(
n
!=
NULL
)
_cmsAdjustEndianess64
(
n
,
tmp
);
if
(
n
!=
NULL
)
_cmsAdjustEndianess64
(
n
,
&
tmp
);
return
TRUE
;
}
...
...
@@ -340,7 +340,7 @@ cmsBool CMSEXPORT _cmsWriteFloat32Number(cmsIOHANDLER* io, cmsFloat32Number n)
return
TRUE
;
}
cmsBool
CMSEXPORT
_cmsWriteUInt64Number
(
cmsIOHANDLER
*
io
,
cmsUInt64Number
n
)
cmsBool
CMSEXPORT
_cmsWriteUInt64Number
(
cmsIOHANDLER
*
io
,
cmsUInt64Number
*
n
)
{
cmsUInt64Number
tmp
;
...
...
@@ -568,7 +568,7 @@ cmsBool CMSEXPORT cmsPlugin(void* Plug_in)
if
(
Plugin
->
ExpectedVersion
>
LCMS_VERSION
)
{
cmsSignalError
(
0
,
cmsERROR_UNKNOWN_EXTENSION
,
"plugin needs Little CMS %d, current version is %d"
,
Plugin
->
ExpectedVersion
,
LCMS_VERSION
);
Plugin
->
ExpectedVersion
,
LCMS_VERSION
);
return
FALSE
;
}
...
...
@@ -610,6 +610,10 @@ cmsBool CMSEXPORT cmsPlugin(void* Plug_in)
if
(
!
_cmsRegisterOptimizationPlugin
(
Plugin
))
return
FALSE
;
break
;
case
cmsPluginTransformSig
:
if
(
!
_cmsRegisterTransformPlugin
(
Plugin
))
return
FALSE
;
break
;
default:
cmsSignalError
(
0
,
cmsERROR_UNKNOWN_EXTENSION
,
"Unrecognized plugin type '%X'"
,
Plugin
->
Type
);
return
FALSE
;
...
...
@@ -633,6 +637,7 @@ void CMSEXPORT cmsUnregisterPlugins(void)
_cmsRegisterParametricCurvesPlugin
(
NULL
);
_cmsRegisterMultiProcessElementPlugin
(
NULL
);
_cmsRegisterOptimizationPlugin
(
NULL
);
_cmsRegisterTransformPlugin
(
NULL
);
if
(
PluginPool
!=
NULL
)
_cmsSubAllocDestroy
(
PluginPool
);
...
...
src/share/native/sun/java2d/cmm/lcms/cmsps2.c
浏览文件 @
fdf0805b
...
...
@@ -30,7 +30,7 @@
//---------------------------------------------------------------------------------
//
// Little Color Management System
// Copyright (c) 1998-20
08
Marti Maria Saguer
// Copyright (c) 1998-20
11
Marti Maria Saguer
//
// Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the "Software"),
...
...
@@ -329,9 +329,9 @@ cmsUInt8Number Word2Byte(cmsUInt16Number w)
static
cmsUInt8Number L2Byte(cmsUInt16Number w)
{
int ww = w + 0x0080;
int ww = w + 0x0080;
if (ww > 0xFFFF) return 0xFF;
if (ww > 0xFFFF) return 0xFF;
return (cmsUInt8Number) ((cmsUInt16Number) (ww >> 8) & 0xFF);
}
...
...
@@ -498,6 +498,7 @@ void Emit1Gamma(cmsIOHANDLER* m, cmsToneCurve* Table)
cmsUInt32Number
i
;
cmsFloat64Number
gamma
;
if
(
Table
==
NULL
)
return
;
// Error
if
(
Table
->
nEntries
<=
0
)
return
;
// Empty table
...
...
@@ -577,6 +578,8 @@ void EmitNGamma(cmsIOHANDLER* m, int n, cmsToneCurve* g[])
for
(
i
=
0
;
i
<
n
;
i
++
)
{
if
(
g
[
i
]
==
NULL
)
return
;
// Error
if
(
i
>
0
&&
GammaTableEquals
(
g
[
i
-
1
]
->
Table16
,
g
[
i
]
->
Table16
,
g
[
i
]
->
nEntries
))
{
_cmsIOPrintf
(
m
,
"dup "
);
...
...
@@ -674,6 +677,7 @@ int OutputValueSampler(register const cmsUInt16Number In[], register cmsUInt16Nu
cmsUInt16Number
wWordOut
=
Out
[
i
];
cmsUInt8Number
wByteOut
;
// Value as byte
// We always deal with Lab4
wByteOut
=
Word2Byte
(
wWordOut
);
...
...
@@ -771,9 +775,9 @@ int EmitCIEBasedABC(cmsIOHANDLER* m, cmsFloat64Number* Matrix, cmsToneCurve** Cu
for
(
i
=
0
;
i
<
3
;
i
++
)
{
_cmsIOPrintf
(
m
,
"%.6f %.6f %.6f "
,
Matrix
[
0
+
3
*
i
],
Matrix
[
1
+
3
*
i
],
Matrix
[
2
+
3
*
i
]);
_cmsIOPrintf
(
m
,
"%.6f %.6f %.6f "
,
Matrix
[
i
+
3
*
0
],
Matrix
[
i
+
3
*
1
],
Matrix
[
i
+
3
*
2
]);
}
...
...
@@ -857,21 +861,23 @@ int EmitCIEBasedDEF(cmsIOHANDLER* m, cmsPipeline* Pipeline, int Intent, cmsCIEXY
// Generates a curve from a gray profile
static
cmsToneCurve
*
ExtractGray2Y
(
cmsContext
ContextID
,
cmsHPROFILE
hProfile
,
int
Intent
)
cmsToneCurve
*
ExtractGray2Y
(
cmsContext
ContextID
,
cmsHPROFILE
hProfile
,
int
Intent
)
{
cmsToneCurve
*
Out
=
cmsBuildTabulatedToneCurve16
(
ContextID
,
256
,
NULL
);
cmsHPROFILE
hXYZ
=
cmsCreateXYZProfile
();
cmsHTRANSFORM
xform
=
cmsCreateTransformTHR
(
ContextID
,
hProfile
,
TYPE_GRAY_8
,
hXYZ
,
TYPE_XYZ_DBL
,
Intent
,
cmsFLAGS_NOOPTIMIZE
);
int
i
;
for
(
i
=
0
;
i
<
256
;
i
++
)
{
if
(
Out
!=
NULL
)
{
for
(
i
=
0
;
i
<
256
;
i
++
)
{
cmsUInt8Number
Gray
=
(
cmsUInt8Number
)
i
;
cmsCIEXYZ
XYZ
;
cmsUInt8Number
Gray
=
(
cmsUInt8Number
)
i
;
cmsCIEXYZ
XYZ
;
cmsDoTransform
(
xform
,
&
Gray
,
&
XYZ
,
1
);
cmsDoTransform
(
xform
,
&
Gray
,
&
XYZ
,
1
);
Out
->
Table16
[
i
]
=
_cmsQuickSaturateWord
(
XYZ
.
Y
*
65535
.
0
);
Out
->
Table16
[
i
]
=
_cmsQuickSaturateWord
(
XYZ
.
Y
*
65535
.
0
);
}
}
cmsDeleteTransform
(
xform
);
...
...
@@ -924,7 +930,7 @@ int WriteInputLUT(cmsIOHANDLER* m, cmsHPROFILE hProfile, int Intent, cmsUInt32Nu
switch
(
nChannels
)
{
case
1
:
{
cmsToneCurve
*
Gray2Y
=
ExtractGray2Y
(
m
->
ContextID
,
hProfile
,
Intent
);
cmsToneCurve
*
Gray2Y
=
ExtractGray2Y
(
m
->
ContextID
,
hProfile
,
Intent
);
EmitCIEBasedA
(
m
,
Gray2Y
,
&
BlackPointAdaptedToD50
);
cmsFreeToneCurve
(
Gray2Y
);
}
...
...
@@ -932,7 +938,7 @@ int WriteInputLUT(cmsIOHANDLER* m, cmsHPROFILE hProfile, int Intent, cmsUInt32Nu
case
3
:
case
4
:
{
cmsUInt32Number
OutFrm
=
TYPE_Lab_16
;
cmsUInt32Number
OutFrm
=
TYPE_Lab_16
;
cmsPipeline
*
DeviceLink
;
_cmsTRANSFORM
*
v
=
(
_cmsTRANSFORM
*
)
xform
;
...
...
@@ -984,14 +990,23 @@ int WriteInputMatrixShaper(cmsIOHANDLER* m, cmsHPROFILE hProfile, cmsStage* Matr
if
(
ColorSpace
==
cmsSigGrayData
)
{
cmsToneCurve
**
ShaperCurve
=
_cmsStageGetPtrToCurveSet
(
Shaper
);
rc
=
EmitCIEBasedA
(
m
,
ShaperCurve
[
0
],
&
BlackPointAdaptedToD50
);
rc
=
EmitCIEBasedA
(
m
,
ShaperCurve
[
0
],
&
BlackPointAdaptedToD50
);
}
else
if
(
ColorSpace
==
cmsSigRgbData
)
{
rc
=
EmitCIEBasedABC
(
m
,
GetPtrToMatrix
(
Matrix
),
_cmsStageGetPtrToCurveSet
(
Shaper
),
cmsMAT3
Mat
;
int
i
,
j
;
memmove
(
&
Mat
,
GetPtrToMatrix
(
Matrix
),
sizeof
(
Mat
));
for
(
i
=
0
;
i
<
3
;
i
++
)
for
(
j
=
0
;
j
<
3
;
j
++
)
Mat
.
v
[
i
].
n
[
j
]
*=
MAX_ENCODEABLE_XYZ
;
rc
=
EmitCIEBasedABC
(
m
,
(
cmsFloat64Number
*
)
&
Mat
,
_cmsStageGetPtrToCurveSet
(
Shaper
),
&
BlackPointAdaptedToD50
);
}
else
{
...
...
@@ -1000,7 +1015,7 @@ int WriteInputMatrixShaper(cmsIOHANDLER* m, cmsHPROFILE hProfile, cmsStage* Matr
return
0
;
}
return
rc
;
return
rc
;
}
...
...
@@ -1084,8 +1099,8 @@ cmsUInt32Number GenerateCSA(cmsContext ContextID,
if
(
ColorSpace
!=
cmsSigXYZData
&&
ColorSpace
!=
cmsSigLabData
)
{
cmsSignalError
(
ContextID
,
cmsERROR_COLORSPACE_CHECK
,
"Invalid output color space"
);
goto
Error
;
cmsSignalError
(
ContextID
,
cmsERROR_COLORSPACE_CHECK
,
"Invalid output color space"
);
goto
Error
;
}
...
...
@@ -1101,8 +1116,8 @@ cmsUInt32Number GenerateCSA(cmsContext ContextID,
}
else
{
// We need a LUT for the rest
if
(
!
WriteInputLUT
(
mem
,
hProfile
,
Intent
,
dwFlags
))
goto
Error
;
// We need a LUT for the rest
if
(
!
WriteInputLUT
(
mem
,
hProfile
,
Intent
,
dwFlags
))
goto
Error
;
}
}
...
...
@@ -1211,7 +1226,7 @@ void EmitPQRStage(cmsIOHANDLER* m, cmsHPROFILE hProfile, int DoBPC, int lIsAbsol
"{0.9642 mul %g div exch pop exch pop exch pop exch pop} bind
\n
"
"{1.0000 mul %g div exch pop exch pop exch pop exch pop} bind
\n
"
"{0.8249 mul %g div exch pop exch pop exch pop exch pop} bind
\n
]
\n
"
,
White
.
X
,
White
.
Y
,
White
.
Z
);
White
.
X
,
White
.
Y
,
White
.
Z
);
return
;
}
...
...
@@ -1534,24 +1549,25 @@ cmsUInt32Number GenerateCRD(cmsContext ContextID,
cmsUInt32Number
CMSEXPORT
cmsGetPostScriptColorResource
(
cmsContext
ContextID
,
cmsPSResourceType
Type
,
cmsHPROFILE
hProfile
,
cmsUInt32Number
Intent
,
cmsUInt32Number
dwFlags
,
cmsIOHANDLER
*
io
)
cmsPSResourceType
Type
,
cmsHPROFILE
hProfile
,
cmsUInt32Number
Intent
,
cmsUInt32Number
dwFlags
,
cmsIOHANDLER
*
io
)
{
cmsUInt32Number
rc
;
switch
(
Type
)
{
case
cmsPS_RESOURCE_CSA
:
rc
=
GenerateCSA
(
ContextID
,
hProfile
,
Intent
,
dwFlags
,
io
);
break
;
default:
case
cmsPS_RESOURCE_CRD
:
rc
=
GenerateCRD
(
ContextID
,
hProfile
,
Intent
,
dwFlags
,
io
);
break
;
case
cmsPS_RESOURCE_CSA
:
rc
=
GenerateCSA
(
ContextID
,
hProfile
,
Intent
,
dwFlags
,
io
);
break
;
default:
case
cmsPS_RESOURCE_CRD
:
rc
=
GenerateCRD
(
ContextID
,
hProfile
,
Intent
,
dwFlags
,
io
);
break
;
}
return
rc
;
...
...
@@ -1560,7 +1576,7 @@ cmsUInt32Number CMSEXPORT cmsGetPostScriptColorResource(cmsContext ContextID,
cmsUInt32Number
CMSEXPORT
cmsGetPostScriptCRD
(
cmsContext
ContextID
,
cmsHPROFILE
hProfile
,
cmsHPROFILE
hProfile
,
cmsUInt32Number
Intent
,
cmsUInt32Number
dwFlags
,
void
*
Buffer
,
cmsUInt32Number
dwBufferLen
)
{
...
...
src/share/native/sun/java2d/cmm/lcms/cmssamp.c
浏览文件 @
fdf0805b
...
...
@@ -216,7 +216,6 @@ cmsBool BlackPointUsingPerceptualBlack(cmsCIEXYZ* BlackPoint, cmsHPROFILE hProfi
// just that. There is a special flag for using black point tag, but turned
// off by default because it is bogus on most profiles. The detection algorithm
// involves to turn BP to neutral and to use only L component.
cmsBool
CMSEXPORT
cmsDetectBlackPoint
(
cmsCIEXYZ
*
BlackPoint
,
cmsHPROFILE
hProfile
,
cmsUInt32Number
Intent
,
cmsUInt32Number
dwFlags
)
{
...
...
@@ -292,3 +291,307 @@ cmsBool CMSEXPORT cmsDetectBlackPoint(cmsCIEXYZ* BlackPoint, cmsHPROFILE hProfil
return
BlackPointAsDarkerColorant
(
hProfile
,
Intent
,
BlackPoint
,
dwFlags
);
}
// ---------------------------------------------------------------------------------------------------------
// Least Squares Fit of a Quadratic Curve to Data
// http://www.personal.psu.edu/jhm/f90/lectures/lsq2.html
static
cmsFloat64Number
RootOfLeastSquaresFitQuadraticCurve
(
int
n
,
cmsFloat64Number
x
[],
cmsFloat64Number
y
[])
{
double
sum_x
=
0
,
sum_x2
=
0
,
sum_x3
=
0
,
sum_x4
=
0
;
double
sum_y
=
0
,
sum_yx
=
0
,
sum_yx2
=
0
;
double
disc
;
int
i
;
cmsMAT3
m
;
cmsVEC3
v
,
res
;
if
(
n
<
4
)
return
0
;
for
(
i
=
0
;
i
<
n
;
i
++
)
{
double
xn
=
x
[
i
];
double
yn
=
y
[
i
];
sum_x
+=
xn
;
sum_x2
+=
xn
*
xn
;
sum_x3
+=
xn
*
xn
*
xn
;
sum_x4
+=
xn
*
xn
*
xn
*
xn
;
sum_y
+=
yn
;
sum_yx
+=
yn
*
xn
;
sum_yx2
+=
yn
*
xn
*
xn
;
}
_cmsVEC3init
(
&
m
.
v
[
0
],
n
,
sum_x
,
sum_x2
);
_cmsVEC3init
(
&
m
.
v
[
1
],
sum_x
,
sum_x2
,
sum_x3
);
_cmsVEC3init
(
&
m
.
v
[
2
],
sum_x2
,
sum_x3
,
sum_x4
);
_cmsVEC3init
(
&
v
,
sum_y
,
sum_yx
,
sum_yx2
);
if
(
!
_cmsMAT3solve
(
&
res
,
&
m
,
&
v
))
return
0
;
// y = t x2 + u x + c
// x = ( - u + Sqrt( u^2 - 4 t c ) ) / ( 2 t )
disc
=
res
.
n
[
1
]
*
res
.
n
[
1
]
-
4
.
0
*
res
.
n
[
0
]
*
res
.
n
[
2
];
if
(
disc
<
0
)
return
-
1
;
return
(
-
1
.
0
*
res
.
n
[
1
]
+
sqrt
(
disc
))
/
(
2
.
0
*
res
.
n
[
0
]);
}
static
cmsBool
IsMonotonic
(
int
n
,
const
cmsFloat64Number
Table
[])
{
int
i
;
cmsFloat64Number
last
;
last
=
Table
[
n
-
1
];
for
(
i
=
n
-
2
;
i
>=
0
;
--
i
)
{
if
(
Table
[
i
]
>
last
)
return
FALSE
;
else
last
=
Table
[
i
];
}
return
TRUE
;
}
// Calculates the black point of a destination profile.
// This algorithm comes from the Adobe paper disclosing its black point compensation method.
cmsBool
CMSEXPORT
cmsDetectDestinationBlackPoint
(
cmsCIEXYZ
*
BlackPoint
,
cmsHPROFILE
hProfile
,
cmsUInt32Number
Intent
,
cmsUInt32Number
dwFlags
)
{
cmsColorSpaceSignature
ColorSpace
;
cmsHTRANSFORM
hRoundTrip
=
NULL
;
cmsCIELab
InitialLab
,
destLab
,
Lab
;
cmsFloat64Number
MinL
,
MaxL
;
cmsBool
NearlyStraightMidRange
=
FALSE
;
cmsFloat64Number
L
;
cmsFloat64Number
x
[
101
],
y
[
101
];
cmsFloat64Number
lo
,
hi
,
NonMonoMin
;
int
n
,
l
,
i
,
NonMonoIndx
;
// Make sure intent is adequate
if
(
Intent
!=
INTENT_PERCEPTUAL
&&
Intent
!=
INTENT_RELATIVE_COLORIMETRIC
&&
Intent
!=
INTENT_SATURATION
)
{
BlackPoint
->
X
=
BlackPoint
->
Y
=
BlackPoint
->
Z
=
0
.
0
;
return
FALSE
;
}
// v4 + perceptual & saturation intents does have its own black point, and it is
// well specified enough to use it. Black point tag is deprecated in V4.
if
((
cmsGetEncodedICCversion
(
hProfile
)
>=
0x4000000
)
&&
(
Intent
==
INTENT_PERCEPTUAL
||
Intent
==
INTENT_SATURATION
))
{
// Matrix shaper share MRC & perceptual intents
if
(
cmsIsMatrixShaper
(
hProfile
))
return
BlackPointAsDarkerColorant
(
hProfile
,
INTENT_RELATIVE_COLORIMETRIC
,
BlackPoint
,
0
);
// Get Perceptual black out of v4 profiles. That is fixed for perceptual & saturation intents
BlackPoint
->
X
=
cmsPERCEPTUAL_BLACK_X
;
BlackPoint
->
Y
=
cmsPERCEPTUAL_BLACK_Y
;
BlackPoint
->
Z
=
cmsPERCEPTUAL_BLACK_Z
;
return
TRUE
;
}
// Check if the profile is lut based and gray, rgb or cmyk (7.2 in Adobe's document)
ColorSpace
=
cmsGetColorSpace
(
hProfile
);
if
(
!
cmsIsCLUT
(
hProfile
,
Intent
,
LCMS_USED_AS_OUTPUT
)
||
(
ColorSpace
!=
cmsSigGrayData
&&
ColorSpace
!=
cmsSigRgbData
&&
ColorSpace
!=
cmsSigCmykData
))
{
// In this case, handle as input case
return
cmsDetectBlackPoint
(
BlackPoint
,
hProfile
,
Intent
,
dwFlags
);
}
// It is one of the valid cases!, presto chargo hocus pocus, go for the Adobe magic
// Step 1
// ======
// Set a first guess, that should work on good profiles.
if
(
Intent
==
INTENT_RELATIVE_COLORIMETRIC
)
{
cmsCIEXYZ
IniXYZ
;
// calculate initial Lab as source black point
if
(
!
cmsDetectBlackPoint
(
&
IniXYZ
,
hProfile
,
Intent
,
dwFlags
))
{
return
FALSE
;
}
// convert the XYZ to lab
cmsXYZ2Lab
(
NULL
,
&
InitialLab
,
&
IniXYZ
);
}
else
{
// set the initial Lab to zero, that should be the black point for perceptual and saturation
InitialLab
.
L
=
0
;
InitialLab
.
a
=
0
;
InitialLab
.
b
=
0
;
}
// Step 2
// ======
// Create a roundtrip. Define a Transform BT for all x in L*a*b*
hRoundTrip
=
CreateRoundtripXForm
(
hProfile
,
Intent
);
if
(
hRoundTrip
==
NULL
)
return
FALSE
;
// Calculate Min L*
Lab
=
InitialLab
;
Lab
.
L
=
0
;
cmsDoTransform
(
hRoundTrip
,
&
Lab
,
&
destLab
,
1
);
MinL
=
destLab
.
L
;
// Calculate Max L*
Lab
=
InitialLab
;
Lab
.
L
=
100
;
cmsDoTransform
(
hRoundTrip
,
&
Lab
,
&
destLab
,
1
);
MaxL
=
destLab
.
L
;
// Step 3
// ======
// check if quadratic estimation needs to be done.
if
(
Intent
==
INTENT_RELATIVE_COLORIMETRIC
)
{
// Conceptually, this code tests how close the source l and converted L are to one another in the mid-range
// of the values. If the converted ramp of L values is close enough to a straight line y=x, then InitialLab
// is good enough to be the DestinationBlackPoint,
NearlyStraightMidRange
=
TRUE
;
for
(
l
=
0
;
l
<=
100
;
l
++
)
{
Lab
.
L
=
l
;
Lab
.
a
=
InitialLab
.
a
;
Lab
.
b
=
InitialLab
.
b
;
cmsDoTransform
(
hRoundTrip
,
&
Lab
,
&
destLab
,
1
);
L
=
destLab
.
L
;
// Check the mid range in 20% after MinL
if
(
L
>
(
MinL
+
0
.
2
*
(
MaxL
-
MinL
)))
{
// Is close enough?
if
(
fabs
(
L
-
l
)
>
4
.
0
)
{
// Too far away, profile is buggy!
NearlyStraightMidRange
=
FALSE
;
break
;
}
}
}
}
else
{
// Check is always performed for perceptual and saturation intents
NearlyStraightMidRange
=
FALSE
;
}
// If no furter checking is needed, we are done
if
(
NearlyStraightMidRange
)
{
cmsLab2XYZ
(
NULL
,
BlackPoint
,
&
InitialLab
);
cmsDeleteTransform
(
hRoundTrip
);
return
TRUE
;
}
// The round-trip curve normally looks like a nearly constant section at the black point,
// with a corner and a nearly straight line to the white point.
// STEP 4
// =======
// find the black point using the least squares error quadratic curve fitting
if
(
Intent
==
INTENT_RELATIVE_COLORIMETRIC
)
{
lo
=
0
.
1
;
hi
=
0
.
5
;
}
else
{
// Perceptual and saturation
lo
=
0
.
03
;
hi
=
0
.
25
;
}
// Capture points for the fitting.
n
=
0
;
for
(
l
=
0
;
l
<=
100
;
l
++
)
{
cmsFloat64Number
ff
;
Lab
.
L
=
(
cmsFloat64Number
)
l
;
Lab
.
a
=
InitialLab
.
a
;
Lab
.
b
=
InitialLab
.
b
;
cmsDoTransform
(
hRoundTrip
,
&
Lab
,
&
destLab
,
1
);
ff
=
(
destLab
.
L
-
MinL
)
/
(
MaxL
-
MinL
);
if
(
ff
>=
lo
&&
ff
<
hi
)
{
x
[
n
]
=
Lab
.
L
;
y
[
n
]
=
ff
;
n
++
;
}
}
// This part is not on the Adobe paper, but I found is necessary for getting any result.
if
(
IsMonotonic
(
n
,
y
))
{
// Monotonic means lower point is stil valid
cmsLab2XYZ
(
NULL
,
BlackPoint
,
&
InitialLab
);
cmsDeleteTransform
(
hRoundTrip
);
return
TRUE
;
}
// No suitable points, regret and use safer algorithm
if
(
n
==
0
)
{
cmsDeleteTransform
(
hRoundTrip
);
return
cmsDetectBlackPoint
(
BlackPoint
,
hProfile
,
Intent
,
dwFlags
);
}
NonMonoMin
=
100
;
NonMonoIndx
=
0
;
for
(
i
=
0
;
i
<
n
;
i
++
)
{
if
(
y
[
i
]
<
NonMonoMin
)
{
NonMonoIndx
=
i
;
NonMonoMin
=
y
[
i
];
}
}
Lab
.
L
=
x
[
NonMonoIndx
];
// fit and get the vertex of quadratic curve
Lab
.
L
=
RootOfLeastSquaresFitQuadraticCurve
(
n
,
x
,
y
);
if
(
Lab
.
L
<
0
.
0
||
Lab
.
L
>
50
.
0
)
{
// clip to zero L* if the vertex is negative
Lab
.
L
=
0
;
}
Lab
.
a
=
InitialLab
.
a
;
Lab
.
b
=
InitialLab
.
b
;
cmsLab2XYZ
(
NULL
,
BlackPoint
,
&
Lab
);
cmsDeleteTransform
(
hRoundTrip
);
return
TRUE
;
}
src/share/native/sun/java2d/cmm/lcms/cmssm.c
浏览文件 @
fdf0805b
...
...
@@ -30,7 +30,7 @@
//---------------------------------------------------------------------------------
//
// Little Color Management System
// Copyright (c) 1998-201
0
Marti Maria Saguer
// Copyright (c) 1998-201
1
Marti Maria Saguer
//
// Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the "Software"),
...
...
@@ -468,7 +468,8 @@ static
int
FindNearSectors
(
cmsGDB
*
gbd
,
int
alpha
,
int
theta
,
cmsGDBPoint
*
Close
[])
{
int
nSectors
=
0
;
int
i
,
a
,
t
;
int
a
,
t
;
cmsUInt32Number
i
;
cmsGDBPoint
*
pt
;
for
(
i
=
0
;
i
<
NSTEPS
;
i
++
)
{
...
...
@@ -505,7 +506,7 @@ cmsBool InterpolateMissingSector(cmsGDB* gbd, int alpha, int theta)
cmsVEC3
Centre
;
cmsLine
ray
;
int
nCloseSectors
;
cmsGDBPoint
*
Close
[
NSTEPS
];
cmsGDBPoint
*
Close
[
NSTEPS
+
1
];
cmsSpherical
closel
,
templ
;
cmsLine
edge
;
int
k
,
m
;
...
...
@@ -582,13 +583,13 @@ cmsBool CMSEXPORT cmsGDBCompute(cmsHANDLE hGBD, cmsUInt32Number dwFlags)
_cmsAssert
(
hGBD
!=
NULL
);
// Interpolate black
for
(
alpha
=
0
;
alpha
<
=
SECTORS
;
alpha
++
)
{
for
(
alpha
=
0
;
alpha
<
SECTORS
;
alpha
++
)
{
if
(
!
InterpolateMissingSector
(
gbd
,
alpha
,
0
))
return
FALSE
;
}
// Interpolate white
for
(
alpha
=
0
;
alpha
<
=
SECTORS
;
alpha
++
)
{
for
(
alpha
=
0
;
alpha
<
SECTORS
;
alpha
++
)
{
if
(
!
InterpolateMissingSector
(
gbd
,
alpha
,
SECTORS
-
1
))
return
FALSE
;
}
...
...
@@ -596,7 +597,7 @@ cmsBool CMSEXPORT cmsGDBCompute(cmsHANDLE hGBD, cmsUInt32Number dwFlags)
// Interpolate Mid
for
(
theta
=
1
;
theta
<
SECTORS
;
theta
++
)
{
for
(
alpha
=
0
;
alpha
<
=
SECTORS
;
alpha
++
)
{
for
(
alpha
=
0
;
alpha
<
SECTORS
;
alpha
++
)
{
if
(
!
InterpolateMissingSector
(
gbd
,
alpha
,
theta
))
return
FALSE
;
}
...
...
@@ -760,3 +761,4 @@ cmsBool cmsGBDdumpVRML(cmsHANDLE hGBD, const char* fname)
return TRUE;
}
#endif
src/share/native/sun/java2d/cmm/lcms/cmstypes.c
浏览文件 @
fdf0805b
此差异已折叠。
点击以展开。
src/share/native/sun/java2d/cmm/lcms/cmsvirt.c
浏览文件 @
fdf0805b
...
...
@@ -30,7 +30,7 @@
//---------------------------------------------------------------------------------
//
// Little Color Management System
// Copyright (c) 1998-201
0
Marti Maria Saguer
// Copyright (c) 1998-201
1
Marti Maria Saguer
//
// Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the "Software"),
...
...
@@ -143,7 +143,7 @@ cmsHPROFILE CMSEXPORT cmsCreateRGBProfileTHR(cmsContext ContextID,
if
(
!
hICC
)
// can't allocate
return
NULL
;
cmsSetProfileVersion
(
hICC
,
4
.
2
);
cmsSetProfileVersion
(
hICC
,
4
.
3
);
cmsSetDeviceClass
(
hICC
,
cmsSigDisplayClass
);
cmsSetColorSpace
(
hICC
,
cmsSigRgbData
);
...
...
@@ -247,7 +247,7 @@ cmsHPROFILE CMSEXPORT cmsCreateGrayProfileTHR(cmsContext ContextID,
if
(
!
hICC
)
// can't allocate
return
NULL
;
cmsSetProfileVersion
(
hICC
,
4
.
2
);
cmsSetProfileVersion
(
hICC
,
4
.
3
);
cmsSetDeviceClass
(
hICC
,
cmsSigDisplayClass
);
cmsSetColorSpace
(
hICC
,
cmsSigGrayData
);
...
...
@@ -310,7 +310,7 @@ cmsHPROFILE CMSEXPORT cmsCreateLinearizationDeviceLinkTHR(cmsContext ContextID,
if
(
!
hICC
)
return
NULL
;
cmsSetProfileVersion
(
hICC
,
4
.
2
);
cmsSetProfileVersion
(
hICC
,
4
.
3
);
cmsSetDeviceClass
(
hICC
,
cmsSigLinkClass
);
cmsSetColorSpace
(
hICC
,
ColorSpace
);
...
...
@@ -430,7 +430,7 @@ cmsHPROFILE CMSEXPORT cmsCreateInkLimitingDeviceLinkTHR(cmsContext ContextID,
if
(
!
hICC
)
// can't allocate
return
NULL
;
cmsSetProfileVersion
(
hICC
,
4
.
2
);
cmsSetProfileVersion
(
hICC
,
4
.
3
);
cmsSetDeviceClass
(
hICC
,
cmsSigLinkClass
);
cmsSetColorSpace
(
hICC
,
ColorSpace
);
...
...
@@ -538,7 +538,7 @@ cmsHPROFILE CMSEXPORT cmsCreateLab4ProfileTHR(cmsContext ContextID, const cmsCIE
hProfile
=
cmsCreateRGBProfileTHR
(
ContextID
,
WhitePoint
==
NULL
?
cmsD50_xyY
()
:
WhitePoint
,
NULL
,
NULL
);
if
(
hProfile
==
NULL
)
return
NULL
;
cmsSetProfileVersion
(
hProfile
,
4
.
2
);
cmsSetProfileVersion
(
hProfile
,
4
.
3
);
cmsSetDeviceClass
(
hProfile
,
cmsSigAbstractClass
);
cmsSetColorSpace
(
hProfile
,
cmsSigLabData
);
...
...
@@ -583,7 +583,7 @@ cmsHPROFILE CMSEXPORT cmsCreateXYZProfileTHR(cmsContext ContextID)
hProfile
=
cmsCreateRGBProfileTHR
(
ContextID
,
cmsD50_xyY
(),
NULL
,
NULL
);
if
(
hProfile
==
NULL
)
return
NULL
;
cmsSetProfileVersion
(
hProfile
,
4
.
2
);
cmsSetProfileVersion
(
hProfile
,
4
.
3
);
cmsSetDeviceClass
(
hProfile
,
cmsSigAbstractClass
);
cmsSetColorSpace
(
hProfile
,
cmsSigXYZData
);
...
...
@@ -838,7 +838,7 @@ cmsHPROFILE CMSEXPORT cmsCreateNULLProfileTHR(cmsContext ContextID)
if
(
!
hProfile
)
// can't allocate
return
NULL
;
cmsSetProfileVersion
(
hProfile
,
4
.
2
);
cmsSetProfileVersion
(
hProfile
,
4
.
3
);
if
(
!
SetTextTags
(
hProfile
,
L"NULL profile built-in"
))
goto
Error
;
...
...
@@ -963,6 +963,11 @@ cmsHPROFILE CreateNamedColorDevicelink(cmsHTRANSFORM xform)
// Colorant count now depends on the output space
nc2
->
ColorantCount
=
cmsPipelineOutputChannels
(
v
->
Lut
);
// Make sure we have proper formatters
cmsChangeBuffersFormat
(
xform
,
TYPE_NAMED_COLOR_INDEX
,
FLOAT_SH
(
0
)
|
COLORSPACE_SH
(
_cmsLCMScolorSpace
(
v
->
ExitColorSpace
))
|
BYTES_SH
(
2
)
|
CHANNELS_SH
(
cmsChannelsOf
(
v
->
ExitColorSpace
)));
// Apply the transfor to colorants.
for
(
i
=
0
;
i
<
nColors
;
i
++
)
{
cmsDoTransform
(
xform
,
&
i
,
nc2
->
List
[
i
].
DeviceColorant
,
1
);
...
...
@@ -983,6 +988,7 @@ Error:
typedef
struct
{
cmsBool
IsV4
;
// Is a V4 tag?
cmsTagSignature
RequiredTag
;
// Set to 0 for both types
cmsTagTypeSignature
LutType
;
// The LUT type
int
nTypes
;
// Number of types (up to 5)
cmsStageSignature
MpeTypes
[
5
];
// 5 is the maximum number
...
...
@@ -991,16 +997,16 @@ typedef struct {
static
const
cmsAllowedLUT
AllowedLUTTypes
[]
=
{
{
FALSE
,
cmsSigLut16Type
,
4
,
{
cmsSigMatrixElemType
,
cmsSigCurveSetElemType
,
cmsSigCLutElemType
,
cmsSigCurveSetElemType
}},
{
FALSE
,
cmsSigLut16Type
,
3
,
{
cmsSigCurveSetElemType
,
cmsSigCLutElemType
,
cmsSigCurveSetElemType
}},
{
TRUE
,
cmsSigLutAtoBType
,
1
,
{
cmsSigCurveSetElemType
}
},
{
TRUE
,
cmsSigLutAtoBType
,
3
,
{
cmsSigCurveSetElemType
,
cmsSigMatrixElemType
,
cmsSigCurveSetElemType
}
},
{
TRUE
,
cmsSigLutAtoBType
,
3
,
{
cmsSigCurveSetElemType
,
cmsSigCLutElemType
,
cmsSigCurveSetElemType
}
},
{
TRUE
,
cmsSigLutAtoBType
,
5
,
{
cmsSigCurveSetElemType
,
cmsSigCLutElemType
,
cmsSigCurveSetElemType
,
cmsSigMatrixElemType
,
cmsSigCurveSetElemType
}},
{
TRUE
,
cmsSigLutBtoAType
,
1
,
{
cmsSigCurveSetElemType
}},
{
TRUE
,
cmsSigLutBtoAType
,
3
,
{
cmsSigCurveSetElemType
,
cmsSigMatrixElemType
,
cmsSigCurveSetElemType
}},
{
TRUE
,
cmsSigLutBtoAType
,
3
,
{
cmsSigCurveSetElemType
,
cmsSigCLutElemType
,
cmsSigCurveSetElemType
}},
{
TRUE
,
cmsSigLutBtoAType
,
5
,
{
cmsSigCurveSetElemType
,
cmsSigMatrixElemType
,
cmsSigCurveSetElemType
,
cmsSigCLutElemType
,
cmsSigCurveSetElemType
}}
{
FALSE
,
0
,
cmsSigLut16Type
,
4
,
{
cmsSigMatrixElemType
,
cmsSigCurveSetElemType
,
cmsSigCLutElemType
,
cmsSigCurveSetElemType
}},
{
FALSE
,
0
,
cmsSigLut16Type
,
3
,
{
cmsSigCurveSetElemType
,
cmsSigCLutElemType
,
cmsSigCurveSetElemType
}},
{
TRUE
,
0
,
cmsSigLutAtoBType
,
1
,
{
cmsSigCurveSetElemType
}
},
{
TRUE
,
cmsSig
AToB0Tag
,
cmsSig
LutAtoBType
,
3
,
{
cmsSigCurveSetElemType
,
cmsSigMatrixElemType
,
cmsSigCurveSetElemType
}
},
{
TRUE
,
cmsSig
AToB0Tag
,
cmsSig
LutAtoBType
,
3
,
{
cmsSigCurveSetElemType
,
cmsSigCLutElemType
,
cmsSigCurveSetElemType
}
},
{
TRUE
,
cmsSig
AToB0Tag
,
cmsSig
LutAtoBType
,
5
,
{
cmsSigCurveSetElemType
,
cmsSigCLutElemType
,
cmsSigCurveSetElemType
,
cmsSigMatrixElemType
,
cmsSigCurveSetElemType
}},
{
TRUE
,
cmsSig
BToA0Tag
,
cmsSig
LutBtoAType
,
1
,
{
cmsSigCurveSetElemType
}},
{
TRUE
,
cmsSig
BToA0Tag
,
cmsSig
LutBtoAType
,
3
,
{
cmsSigCurveSetElemType
,
cmsSigMatrixElemType
,
cmsSigCurveSetElemType
}},
{
TRUE
,
cmsSig
BToA0Tag
,
cmsSig
LutBtoAType
,
3
,
{
cmsSigCurveSetElemType
,
cmsSigCLutElemType
,
cmsSigCurveSetElemType
}},
{
TRUE
,
cmsSig
BToA0Tag
,
cmsSig
LutBtoAType
,
5
,
{
cmsSigCurveSetElemType
,
cmsSigMatrixElemType
,
cmsSigCurveSetElemType
,
cmsSigCLutElemType
,
cmsSigCurveSetElemType
}}
};
#define SIZE_OF_ALLOWED_LUT (sizeof(AllowedLUTTypes)/sizeof(cmsAllowedLUT))
...
...
@@ -1023,15 +1029,17 @@ cmsBool CheckOne(const cmsAllowedLUT* Tab, const cmsPipeline* Lut)
static
const
cmsAllowedLUT
*
FindCombination
(
const
cmsPipeline
*
Lut
,
cmsBool
IsV4
)
const
cmsAllowedLUT
*
FindCombination
(
const
cmsPipeline
*
Lut
,
cmsBool
IsV4
,
cmsTagSignature
DestinationTag
)
{
int
n
;
cmsUInt32Number
n
;
for
(
n
=
0
;
n
<
SIZE_OF_ALLOWED_LUT
;
n
++
)
{
const
cmsAllowedLUT
*
Tab
=
AllowedLUTTypes
+
n
;
if
(
IsV4
^
Tab
->
IsV4
)
continue
;
if
((
Tab
->
RequiredTag
!=
0
)
&&
(
Tab
->
RequiredTag
!=
DestinationTag
))
continue
;
if
(
CheckOne
(
Tab
,
Lut
))
return
Tab
;
}
...
...
@@ -1050,6 +1058,7 @@ cmsHPROFILE CMSEXPORT cmsTransform2DeviceLink(cmsHTRANSFORM hTransform, cmsFloat
cmsStage
*
mpe
;
cmsContext
ContextID
=
cmsGetTransformContextID
(
hTransform
);
const
cmsAllowedLUT
*
AllowedLUT
;
cmsTagSignature
DestinationTag
;
_cmsAssert
(
hTransform
!=
NULL
);
...
...
@@ -1080,6 +1089,14 @@ cmsHPROFILE CMSEXPORT cmsTransform2DeviceLink(cmsHTRANSFORM hTransform, cmsFloat
cmsPipelineInsertStage
(
LUT
,
cmsAT_END
,
_cmsStageAllocLabV4ToV2
(
ContextID
));
}
hProfile
=
cmsCreateProfilePlaceholder
(
ContextID
);
if
(
!
hProfile
)
goto
Error
;
// can't allocate
cmsSetProfileVersion
(
hProfile
,
Version
);
FixColorSpaces
(
hProfile
,
xform
->
EntryColorSpace
,
xform
->
ExitColorSpace
,
dwFlags
);
// Optimize the LUT and precalculate a devicelink
ChansIn
=
cmsChannelsOf
(
xform
->
EntryColorSpace
);
...
...
@@ -1092,17 +1109,22 @@ cmsHPROFILE CMSEXPORT cmsTransform2DeviceLink(cmsHTRANSFORM hTransform, cmsFloat
FrmOut
=
COLORSPACE_SH
(
ColorSpaceBitsOut
)
|
CHANNELS_SH
(
ChansOut
)
|
BYTES_SH
(
2
);
if
(
cmsGetDeviceClass
(
hProfile
)
==
cmsSigOutputClass
)
DestinationTag
=
cmsSigBToA0Tag
;
else
DestinationTag
=
cmsSigAToB0Tag
;
// Check if the profile/version can store the result
if
(
dwFlags
&
cmsFLAGS_FORCE_CLUT
)
AllowedLUT
=
NULL
;
else
AllowedLUT
=
FindCombination
(
LUT
,
Version
>=
4
.
0
);
AllowedLUT
=
FindCombination
(
LUT
,
Version
>=
4
.
0
,
DestinationTag
);
if
(
AllowedLUT
==
NULL
)
{
// Try to optimize
_cmsOptimizePipeline
(
&
LUT
,
xform
->
RenderingIntent
,
&
FrmIn
,
&
FrmOut
,
&
dwFlags
);
AllowedLUT
=
FindCombination
(
LUT
,
Version
>=
4
.
0
);
AllowedLUT
=
FindCombination
(
LUT
,
Version
>=
4
.
0
,
DestinationTag
);
}
...
...
@@ -1113,13 +1135,13 @@ cmsHPROFILE CMSEXPORT cmsTransform2DeviceLink(cmsHTRANSFORM hTransform, cmsFloat
_cmsOptimizePipeline
(
&
LUT
,
xform
->
RenderingIntent
,
&
FrmIn
,
&
FrmOut
,
&
dwFlags
);
// Put identity curves if needed
if
(
cmsPipelineStageCount
(
LUT
)
==
1
)
{
if
(
cmsPipelineGetPtrToFirstStage
(
LUT
)
->
Type
!=
cmsSigCurveSetElemType
)
cmsPipelineInsertStage
(
LUT
,
cmsAT_BEGIN
,
_cmsStageAllocIdentityCurves
(
ContextID
,
ChansIn
));
cmsPipelineInsertStage
(
LUT
,
cmsAT_BEGIN
,
_cmsStageAllocIdentityCurves
(
ContextID
,
ChansIn
));
cmsPipelineInsertStage
(
LUT
,
cmsAT_END
,
_cmsStageAllocIdentityCurves
(
ContextID
,
ChansOut
));
}
if
(
cmsPipelineGetPtrToLastStage
(
LUT
)
->
Type
!=
cmsSigCurveSetElemType
)
cmsPipelineInsertStage
(
LUT
,
cmsAT_END
,
_cmsStageAllocIdentityCurves
(
ContextID
,
ChansOut
));
AllowedLUT
=
FindCombination
(
LUT
,
Version
>=
4
.
0
);
AllowedLUT
=
FindCombination
(
LUT
,
Version
>=
4
.
0
,
DestinationTag
);
}
// Somethings is wrong...
...
...
@@ -1127,25 +1149,15 @@ cmsHPROFILE CMSEXPORT cmsTransform2DeviceLink(cmsHTRANSFORM hTransform, cmsFloat
goto
Error
;
}
hProfile
=
cmsCreateProfilePlaceholder
(
ContextID
);
if
(
!
hProfile
)
goto
Error
;
// can't allocate
cmsSetProfileVersion
(
hProfile
,
Version
);
FixColorSpaces
(
hProfile
,
xform
->
EntryColorSpace
,
xform
->
ExitColorSpace
,
dwFlags
);
if
(
dwFlags
&
cmsFLAGS_8BITS_DEVICELINK
)
cmsPipelineSetSaveAs8bitsFlag
(
LUT
,
TRUE
);
// Tag profile with information
if
(
!
SetTextTags
(
hProfile
,
L"devicelink"
))
return
NULL
;
if
(
cmsGetDeviceClass
(
hProfile
)
==
cmsSigOutputClass
)
{
if
(
!
SetTextTags
(
hProfile
,
L"devicelink"
))
goto
Error
;
if
(
!
cmsWriteTag
(
hProfile
,
cmsSigBToA0Tag
,
LUT
))
goto
Error
;
}
else
if
(
!
cmsWriteTag
(
hProfile
,
cmsSigAToB0Tag
,
LUT
))
goto
Error
;
// Store result
if
(
!
cmsWriteTag
(
hProfile
,
DestinationTag
,
LUT
))
goto
Error
;
if
(
xform
->
InputColorant
!=
NULL
)
{
...
...
src/share/native/sun/java2d/cmm/lcms/cmswtpnt.c
浏览文件 @
fdf0805b
...
...
@@ -172,7 +172,7 @@ static ISOTEMPERATURE isotempdata[] = {
// Robertson's method
cmsBool
CMSEXPORT
cmsTempFromWhitePoint
(
cmsFloat64Number
*
TempK
,
const
cmsCIExyY
*
WhitePoint
)
{
int
j
;
cmsUInt32Number
j
;
cmsFloat64Number
us
,
vs
;
cmsFloat64Number
uj
,
vj
,
tj
,
di
,
dj
,
mi
,
mj
;
cmsFloat64Number
xs
,
ys
;
...
...
@@ -263,10 +263,10 @@ cmsBool ComputeChromaticAdaptation(cmsMAT3* Conversion,
cmsBool
_cmsAdaptationMatrix
(
cmsMAT3
*
r
,
const
cmsMAT3
*
ConeMatrix
,
const
cmsCIEXYZ
*
FromIll
,
const
cmsCIEXYZ
*
ToIll
)
{
cmsMAT3
LamRigg
=
{{
// Bradford matrix
{{
0
.
8951
,
0
.
2664
,
-
0
.
1614
}},
{{
-
0
.
7502
,
1
.
7135
,
0
.
0367
}},
{{
0
.
03
89
,
-
0
.
06
85
,
1
.
02
96
}}
}};
{{
0
.
8951
,
0
.
2664
,
-
0
.
1614
}},
{{
-
0
.
7502
,
1
.
7135
,
0
.
0367
}},
{{
0
.
03
89
,
-
0
.
06
85
,
1
.
02
96
}}
}};
if
(
ConeMatrix
==
NULL
)
ConeMatrix
=
&
LamRigg
;
...
...
@@ -376,3 +376,5 @@ cmsBool CMSEXPORT cmsAdaptToIlluminant(cmsCIEXYZ* Result,
return
TRUE
;
}
src/share/native/sun/java2d/cmm/lcms/cmsxform.c
浏览文件 @
fdf0805b
此差异已折叠。
点击以展开。
src/share/native/sun/java2d/cmm/lcms/lcms2.h
浏览文件 @
fdf0805b
此差异已折叠。
点击以展开。
src/share/native/sun/java2d/cmm/lcms/lcms2_internal.h
浏览文件 @
fdf0805b
此差异已折叠。
点击以展开。
src/share/native/sun/java2d/cmm/lcms/lcms2_plugin.h
浏览文件 @
fdf0805b
...
...
@@ -30,7 +30,7 @@
//---------------------------------------------------------------------------------
//
// Little Color Management System
// Copyright (c) 1998-201
0
Marti Maria Saguer
// Copyright (c) 1998-201
1
Marti Maria Saguer
//
// Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the "Software"),
...
...
@@ -144,6 +144,7 @@ struct _cms_io_handler {
cmsContext
ContextID
;
cmsUInt32Number
UsedSpace
;
cmsUInt32Number
ReportedSize
;
char
PhysicalFile
[
cmsMAX_PATH
];
cmsUInt32Number
(
*
Read
)(
struct
_cms_io_handler
*
iohandler
,
void
*
Buffer
,
...
...
@@ -159,7 +160,7 @@ struct _cms_io_handler {
// Endianess adjust functions
CMSAPI
cmsUInt16Number
CMSEXPORT
_cmsAdjustEndianess16
(
cmsUInt16Number
Word
);
CMSAPI
cmsUInt32Number
CMSEXPORT
_cmsAdjustEndianess32
(
cmsUInt32Number
Value
);
CMSAPI
void
CMSEXPORT
_cmsAdjustEndianess64
(
cmsUInt64Number
*
Result
,
cmsUInt64Number
QWord
);
CMSAPI
void
CMSEXPORT
_cmsAdjustEndianess64
(
cmsUInt64Number
*
Result
,
cmsUInt64Number
*
QWord
);
// Helper IO functions
CMSAPI
cmsBool
CMSEXPORT
_cmsReadUInt8Number
(
cmsIOHANDLER
*
io
,
cmsUInt8Number
*
n
);
...
...
@@ -175,7 +176,7 @@ CMSAPI cmsBool CMSEXPORT _cmsWriteUInt8Number(cmsIOHANDLER* io, cmsUI
CMSAPI
cmsBool
CMSEXPORT
_cmsWriteUInt16Number
(
cmsIOHANDLER
*
io
,
cmsUInt16Number
n
);
CMSAPI
cmsBool
CMSEXPORT
_cmsWriteUInt32Number
(
cmsIOHANDLER
*
io
,
cmsUInt32Number
n
);
CMSAPI
cmsBool
CMSEXPORT
_cmsWriteFloat32Number
(
cmsIOHANDLER
*
io
,
cmsFloat32Number
n
);
CMSAPI
cmsBool
CMSEXPORT
_cmsWriteUInt64Number
(
cmsIOHANDLER
*
io
,
cmsUInt64Number
n
);
CMSAPI
cmsBool
CMSEXPORT
_cmsWriteUInt64Number
(
cmsIOHANDLER
*
io
,
cmsUInt64Number
*
n
);
CMSAPI
cmsBool
CMSEXPORT
_cmsWrite15Fixed16Number
(
cmsIOHANDLER
*
io
,
cmsFloat64Number
n
);
CMSAPI
cmsBool
CMSEXPORT
_cmsWriteXYZNumber
(
cmsIOHANDLER
*
io
,
const
cmsCIEXYZ
*
XYZ
);
CMSAPI
cmsBool
CMSEXPORT
_cmsWriteUInt16Array
(
cmsIOHANDLER
*
io
,
cmsUInt32Number
n
,
const
cmsUInt16Number
*
Array
);
...
...
@@ -209,6 +210,11 @@ CMSAPI cmsS15Fixed16Number CMSEXPORT _cmsDoubleTo15Fixed16(cmsFloat64Number v);
CMSAPI
void
CMSEXPORT
_cmsEncodeDateTimeNumber
(
cmsDateTimeNumber
*
Dest
,
const
struct
tm
*
Source
);
CMSAPI
void
CMSEXPORT
_cmsDecodeDateTimeNumber
(
const
cmsDateTimeNumber
*
Source
,
struct
tm
*
Dest
);
//----------------------------------------------------------------------------------------------------------
// Shared callbacks for user data
typedef
void
(
*
_cmsFreeUserDataFn
)(
cmsContext
ContextID
,
void
*
Data
);
typedef
void
*
(
*
_cmsDupUserDataFn
)(
cmsContext
ContextID
,
const
void
*
Data
);
//----------------------------------------------------------------------------------------------------------
...
...
@@ -224,6 +230,7 @@ CMSAPI void CMSEXPORT _cmsDecodeDateTimeNumber(const cmsDateTimeN
#define cmsPluginRenderingIntentSig 0x696E7448 // 'intH'
#define cmsPluginMultiProcessElementSig 0x6D706548 // 'mpeH'
#define cmsPluginOptimizationSig 0x6F707448 // 'optH'
#define cmsPluginTransformSig 0x7A666D48 // 'xfmH'
typedef
struct
_cmsPluginBaseStruct
{
...
...
@@ -414,8 +421,9 @@ typedef struct _cms_typehandler_struct {
void
(
*
FreePtr
)(
struct
_cms_typehandler_struct
*
self
,
void
*
Ptr
);
// The calling thread
cmsContext
ContextID
;
// Additional parameters used by the calling thread
cmsContext
ContextID
;
cmsUInt32Number
ICCVersion
;
}
cmsTagTypeHandler
;
...
...
@@ -513,6 +521,39 @@ typedef struct {
}
cmsPluginMultiProcessElement
;
// Data kept in "Element" member of cmsStage
// Curves
typedef
struct
{
cmsUInt32Number
nCurves
;
cmsToneCurve
**
TheCurves
;
}
_cmsStageToneCurvesData
;
// Matrix
typedef
struct
{
cmsFloat64Number
*
Double
;
// floating point for the matrix
cmsFloat64Number
*
Offset
;
// The offset
}
_cmsStageMatrixData
;
// CLUT
typedef
struct
{
union
{
// Can have only one of both representations at same time
cmsUInt16Number
*
T
;
// Points to the table 16 bits table
cmsFloat32Number
*
TFloat
;
// Points to the cmsFloat32Number table
}
Tab
;
cmsInterpParams
*
Params
;
cmsUInt32Number
nEntries
;
cmsBool
HasFloatValues
;
}
_cmsStageCLutData
;
//----------------------------------------------------------------------------------------------------------
// Optimization. Using this plug-in, additional optimization strategies may be implemented.
// The function should return TRUE if any optimization is done on the LUT, this terminates
...
...
@@ -523,9 +564,6 @@ typedef void (* _cmsOPTeval16Fn)(register const cmsUInt16Number In[],
register
cmsUInt16Number
Out
[],
register
const
void
*
Data
);
typedef
void
(
*
_cmsOPTfreeDataFn
)(
cmsContext
ContextID
,
void
*
Data
);
typedef
void
*
(
*
_cmsOPTdupDataFn
)(
cmsContext
ContextID
,
const
void
*
Data
);
typedef
cmsBool
(
*
_cmsOPToptimizeFn
)(
cmsPipeline
**
Lut
,
cmsUInt32Number
Intent
,
...
...
@@ -539,8 +577,8 @@ typedef cmsBool (* _cmsOPToptimizeFn)(cmsPipeline** Lut,
CMSAPI
void
CMSEXPORT
_cmsPipelineSetOptimizationParameters
(
cmsPipeline
*
Lut
,
_cmsOPTeval16Fn
Eval16
,
void
*
PrivateData
,
_cms
OPTfree
DataFn
FreePrivateDataFn
,
_cms
OPTdup
DataFn
DupPrivateDataFn
);
_cms
FreeUser
DataFn
FreePrivateDataFn
,
_cms
DupUser
DataFn
DupPrivateDataFn
);
typedef
struct
{
cmsPluginBase
base
;
...
...
@@ -551,6 +589,39 @@ typedef struct {
}
cmsPluginOptimization
;
//----------------------------------------------------------------------------------------------------------
// Full xform
typedef
void
(
*
_cmsTransformFn
)(
struct
_cmstransform_struct
*
CMMcargo
,
const
void
*
InputBuffer
,
void
*
OutputBuffer
,
cmsUInt32Number
Size
,
cmsUInt32Number
Stride
);
typedef
cmsBool
(
*
_cmsTransformFactory
)(
_cmsTransformFn
*
xform
,
void
**
UserData
,
_cmsFreeUserDataFn
*
FreePrivateDataFn
,
cmsPipeline
**
Lut
,
cmsUInt32Number
*
InputFormat
,
cmsUInt32Number
*
OutputFormat
,
cmsUInt32Number
*
dwFlags
);
// Retrieve user data as specified by the factory
CMSAPI
void
CMSEXPORT
_cmsSetTransformUserData
(
struct
_cmstransform_struct
*
CMMcargo
,
void
*
ptr
,
_cmsFreeUserDataFn
FreePrivateDataFn
);
CMSAPI
void
*
CMSEXPORT
_cmsGetTransformUserData
(
struct
_cmstransform_struct
*
CMMcargo
);
// Retrieve formatters
CMSAPI
void
CMSEXPORT
_cmsGetTransformFormatters16
(
struct
_cmstransform_struct
*
CMMcargo
,
cmsFormatter16
*
FromInput
,
cmsFormatter16
*
ToOutput
);
CMSAPI
void
CMSEXPORT
_cmsGetTransformFormattersFloat
(
struct
_cmstransform_struct
*
CMMcargo
,
cmsFormatterFloat
*
FromInput
,
cmsFormatterFloat
*
ToOutput
);
typedef
struct
{
cmsPluginBase
base
;
// Transform entry point
_cmsTransformFactory
Factory
;
}
cmsPluginTransform
;
#ifndef CMS_USE_CPP_API
# ifdef __cplusplus
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录