Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
dragonwell8_jdk
提交
4352a351
D
dragonwell8_jdk
项目概览
openanolis
/
dragonwell8_jdk
通知
3
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看板
体验新版 GitCode,发现更多精彩内容 >>
提交
4352a351
编写于
9月 04, 2014
作者:
P
prr
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
8056122: Upgrade JDK to use LittleCMS 2.6
Reviewed-by: bae, jgodinez
上级
9bfea301
变更
20
展开全部
隐藏空白更改
内联
并排
Showing
20 changed file
with
2277 addition
and
453 deletion
+2277
-453
src/share/native/sun/java2d/cmm/lcms/cmscam02.c
src/share/native/sun/java2d/cmm/lcms/cmscam02.c
+4
-3
src/share/native/sun/java2d/cmm/lcms/cmscgats.c
src/share/native/sun/java2d/cmm/lcms/cmscgats.c
+3
-3
src/share/native/sun/java2d/cmm/lcms/cmscnvrt.c
src/share/native/sun/java2d/cmm/lcms/cmscnvrt.c
+88
-18
src/share/native/sun/java2d/cmm/lcms/cmserr.c
src/share/native/sun/java2d/cmm/lcms/cmserr.c
+274
-48
src/share/native/sun/java2d/cmm/lcms/cmsgamma.c
src/share/native/sun/java2d/cmm/lcms/cmsgamma.c
+82
-13
src/share/native/sun/java2d/cmm/lcms/cmsgmt.c
src/share/native/sun/java2d/cmm/lcms/cmsgmt.c
+1
-1
src/share/native/sun/java2d/cmm/lcms/cmsintrp.c
src/share/native/sun/java2d/cmm/lcms/cmsintrp.c
+35
-8
src/share/native/sun/java2d/cmm/lcms/cmsio0.c
src/share/native/sun/java2d/cmm/lcms/cmsio0.c
+184
-89
src/share/native/sun/java2d/cmm/lcms/cmsio1.c
src/share/native/sun/java2d/cmm/lcms/cmsio1.c
+80
-70
src/share/native/sun/java2d/cmm/lcms/cmsopt.c
src/share/native/sun/java2d/cmm/lcms/cmsopt.c
+84
-13
src/share/native/sun/java2d/cmm/lcms/cmspack.c
src/share/native/sun/java2d/cmm/lcms/cmspack.c
+138
-9
src/share/native/sun/java2d/cmm/lcms/cmsplugin.c
src/share/native/sun/java2d/cmm/lcms/cmsplugin.c
+356
-25
src/share/native/sun/java2d/cmm/lcms/cmsps2.c
src/share/native/sun/java2d/cmm/lcms/cmsps2.c
+2
-2
src/share/native/sun/java2d/cmm/lcms/cmstypes.c
src/share/native/sun/java2d/cmm/lcms/cmstypes.c
+195
-68
src/share/native/sun/java2d/cmm/lcms/cmsvirt.c
src/share/native/sun/java2d/cmm/lcms/cmsvirt.c
+4
-4
src/share/native/sun/java2d/cmm/lcms/cmswtpnt.c
src/share/native/sun/java2d/cmm/lcms/cmswtpnt.c
+1
-1
src/share/native/sun/java2d/cmm/lcms/cmsxform.c
src/share/native/sun/java2d/cmm/lcms/cmsxform.c
+211
-47
src/share/native/sun/java2d/cmm/lcms/lcms2.h
src/share/native/sun/java2d/cmm/lcms/lcms2.h
+66
-14
src/share/native/sun/java2d/cmm/lcms/lcms2_internal.h
src/share/native/sun/java2d/cmm/lcms/lcms2_internal.h
+430
-11
src/share/native/sun/java2d/cmm/lcms/lcms2_plugin.h
src/share/native/sun/java2d/cmm/lcms/lcms2_plugin.h
+39
-6
未找到文件。
src/share/native/sun/java2d/cmm/lcms/cmscam02.c
浏览文件 @
4352a351
...
...
@@ -467,11 +467,12 @@ void CMSEXPORT cmsCIECAM02Forward(cmsHANDLE hModel, const cmsCIEXYZ* pIn, cmsJCh
CAM02COLOR
clr
;
cmsCIECAM02
*
lpMod
=
(
cmsCIECAM02
*
)
hModel
;
memset
(
&
clr
,
0
,
sizeof
(
clr
));
_cmsAssert
(
lpMod
!=
NULL
);
_cmsAssert
(
pIn
!=
NULL
);
_cmsAssert
(
pOut
!=
NULL
);
memset
(
&
clr
,
0
,
sizeof
(
clr
));
clr
.
XYZ
[
0
]
=
pIn
->
X
;
clr
.
XYZ
[
1
]
=
pIn
->
Y
;
clr
.
XYZ
[
2
]
=
pIn
->
Z
;
...
...
@@ -492,11 +493,12 @@ void CMSEXPORT cmsCIECAM02Reverse(cmsHANDLE hModel, const cmsJCh* pIn, cmsCIEXYZ
CAM02COLOR
clr
;
cmsCIECAM02
*
lpMod
=
(
cmsCIECAM02
*
)
hModel
;
memset
(
&
clr
,
0
,
sizeof
(
clr
));
_cmsAssert
(
lpMod
!=
NULL
);
_cmsAssert
(
pIn
!=
NULL
);
_cmsAssert
(
pOut
!=
NULL
);
memset
(
&
clr
,
0
,
sizeof
(
clr
));
clr
.
J
=
pIn
->
J
;
clr
.
C
=
pIn
->
C
;
clr
.
h
=
pIn
->
h
;
...
...
@@ -511,4 +513,3 @@ void CMSEXPORT cmsCIECAM02Reverse(cmsHANDLE hModel, const cmsJCh* pIn, cmsCIEXYZ
pOut
->
Y
=
clr
.
XYZ
[
1
];
pOut
->
Z
=
clr
.
XYZ
[
2
];
}
src/share/native/sun/java2d/cmm/lcms/cmscgats.c
浏览文件 @
4352a351
...
...
@@ -2179,9 +2179,9 @@ void CookPointers(cmsIT8* it8)
if
(
cmsstrcasecmp
(
Fld
,
"SAMPLE_ID"
)
==
0
)
{
t
->
SampleID
=
idField
;
t
->
SampleID
=
idField
;
for
(
i
=
0
;
i
<
t
->
nPatches
;
i
++
)
{
for
(
i
=
0
;
i
<
t
->
nPatches
;
i
++
)
{
char
*
Data
=
GetData
(
it8
,
i
,
idField
);
if
(
Data
)
{
...
...
@@ -2196,7 +2196,7 @@ void CookPointers(cmsIT8* it8)
SetData
(
it8
,
i
,
idField
,
Buffer
);
}
}
}
}
...
...
src/share/native/sun/java2d/cmm/lcms/cmscnvrt.c
浏览文件 @
4352a351
...
...
@@ -137,15 +137,68 @@ static cmsIntentsList DefaultIntents[] = {
// A pointer to the begining of the list
static
cmsIntentsList
*
Intents
=
DefaultIntents
;
_cmsIntentsPluginChunkType
_cmsIntentsPluginChunk
=
{
NULL
};
// Duplicates the zone of memory used by the plug-in in the new context
static
void
DupPluginIntentsList
(
struct
_cmsContext_struct
*
ctx
,
const
struct
_cmsContext_struct
*
src
)
{
_cmsIntentsPluginChunkType
newHead
=
{
NULL
};
cmsIntentsList
*
entry
;
cmsIntentsList
*
Anterior
=
NULL
;
_cmsIntentsPluginChunkType
*
head
=
(
_cmsIntentsPluginChunkType
*
)
src
->
chunks
[
IntentPlugin
];
// Walk the list copying all nodes
for
(
entry
=
head
->
Intents
;
entry
!=
NULL
;
entry
=
entry
->
Next
)
{
cmsIntentsList
*
newEntry
=
(
cmsIntentsList
*
)
_cmsSubAllocDup
(
ctx
->
MemPool
,
entry
,
sizeof
(
cmsIntentsList
));
if
(
newEntry
==
NULL
)
return
;
// We want to keep the linked list order, so this is a little bit tricky
newEntry
->
Next
=
NULL
;
if
(
Anterior
)
Anterior
->
Next
=
newEntry
;
Anterior
=
newEntry
;
if
(
newHead
.
Intents
==
NULL
)
newHead
.
Intents
=
newEntry
;
}
ctx
->
chunks
[
IntentPlugin
]
=
_cmsSubAllocDup
(
ctx
->
MemPool
,
&
newHead
,
sizeof
(
_cmsIntentsPluginChunkType
));
}
void
_cmsAllocIntentsPluginChunk
(
struct
_cmsContext_struct
*
ctx
,
const
struct
_cmsContext_struct
*
src
)
{
if
(
src
!=
NULL
)
{
// Copy all linked list
DupPluginIntentsList
(
ctx
,
src
);
}
else
{
static
_cmsIntentsPluginChunkType
IntentsPluginChunkType
=
{
NULL
};
ctx
->
chunks
[
IntentPlugin
]
=
_cmsSubAllocDup
(
ctx
->
MemPool
,
&
IntentsPluginChunkType
,
sizeof
(
_cmsIntentsPluginChunkType
));
}
}
// Search the list for a suitable intent. Returns NULL if not found
static
cmsIntentsList
*
SearchIntent
(
cmsUInt32Number
Intent
)
cmsIntentsList
*
SearchIntent
(
cms
Context
ContextID
,
cms
UInt32Number
Intent
)
{
_cmsIntentsPluginChunkType
*
ctx
=
(
_cmsIntentsPluginChunkType
*
)
_cmsContextGetClientChunk
(
ContextID
,
IntentPlugin
);
cmsIntentsList
*
pt
;
for
(
pt
=
Intents
;
pt
!=
NULL
;
pt
=
pt
->
Next
)
for
(
pt
=
ctx
->
Intents
;
pt
!=
NULL
;
pt
=
pt
->
Next
)
if
(
pt
->
Intent
==
Intent
)
return
pt
;
for
(
pt
=
DefaultIntents
;
pt
!=
NULL
;
pt
=
pt
->
Next
)
if
(
pt
->
Intent
==
Intent
)
return
pt
;
return
NULL
;
...
...
@@ -1031,7 +1084,7 @@ cmsPipeline* _cmsLinkProfiles(cmsContext ContextID,
// this case would present some issues if the custom intent tries to do things like
// preserve primaries. This solution is not perfect, but works well on most cases.
Intent
=
SearchIntent
(
TheIntents
[
0
]);
Intent
=
SearchIntent
(
ContextID
,
TheIntents
[
0
]);
if
(
Intent
==
NULL
)
{
cmsSignalError
(
ContextID
,
cmsERROR_UNKNOWN_EXTENSION
,
"Unsupported intent '%d'"
,
TheIntents
[
0
]);
return
NULL
;
...
...
@@ -1046,12 +1099,14 @@ cmsPipeline* _cmsLinkProfiles(cmsContext ContextID,
// Get information about available intents. nMax is the maximum space for the supplied "Codes"
// and "Descriptions" the function returns the total number of intents, which may be greater
// than nMax, although the matrices are not populated beyond this level.
cmsUInt32Number
CMSEXPORT
cmsGetSupportedIntents
(
cmsUInt32Number
nMax
,
cmsUInt32Number
*
Codes
,
char
**
Descriptions
)
cmsUInt32Number
CMSEXPORT
cmsGetSupportedIntents
THR
(
cmsContext
ContextID
,
cmsUInt32Number
nMax
,
cmsUInt32Number
*
Codes
,
char
**
Descriptions
)
{
_cmsIntentsPluginChunkType
*
ctx
=
(
_cmsIntentsPluginChunkType
*
)
_cmsContextGetClientChunk
(
ContextID
,
IntentPlugin
);
cmsIntentsList
*
pt
;
cmsUInt32Number
nIntents
;
for
(
nIntents
=
0
,
pt
=
Intents
;
pt
!=
NULL
;
pt
=
pt
->
Next
)
for
(
nIntents
=
0
,
pt
=
ctx
->
Intents
;
pt
!=
NULL
;
pt
=
pt
->
Next
)
{
if
(
nIntents
<
nMax
)
{
if
(
Codes
!=
NULL
)
...
...
@@ -1064,37 +1119,52 @@ cmsUInt32Number CMSEXPORT cmsGetSupportedIntents(cmsUInt32Number nMax, cmsUInt32
nIntents
++
;
}
for
(
nIntents
=
0
,
pt
=
DefaultIntents
;
pt
!=
NULL
;
pt
=
pt
->
Next
)
{
if
(
nIntents
<
nMax
)
{
if
(
Codes
!=
NULL
)
Codes
[
nIntents
]
=
pt
->
Intent
;
if
(
Descriptions
!=
NULL
)
Descriptions
[
nIntents
]
=
pt
->
Description
;
}
nIntents
++
;
}
return
nIntents
;
}
cmsUInt32Number
CMSEXPORT
cmsGetSupportedIntents
(
cmsUInt32Number
nMax
,
cmsUInt32Number
*
Codes
,
char
**
Descriptions
)
{
return
cmsGetSupportedIntentsTHR
(
NULL
,
nMax
,
Codes
,
Descriptions
);
}
// The plug-in registration. User can add new intents or override default routines
cmsBool
_cmsRegisterRenderingIntentPlugin
(
cmsContext
id
,
cmsPluginBase
*
Data
)
{
_cmsIntentsPluginChunkType
*
ctx
=
(
_cmsIntentsPluginChunkType
*
)
_cmsContextGetClientChunk
(
id
,
IntentPlugin
);
cmsPluginRenderingIntent
*
Plugin
=
(
cmsPluginRenderingIntent
*
)
Data
;
cmsIntentsList
*
fl
;
// Do we have to reset the intents?
// Do we have to reset the
custom
intents?
if
(
Data
==
NULL
)
{
Intents
=
DefaultIntents
;
return
TRUE
;
ctx
->
Intents
=
NULL
;
return
TRUE
;
}
fl
=
SearchIntent
(
Plugin
->
Intent
);
fl
=
(
cmsIntentsList
*
)
_cmsPluginMalloc
(
id
,
sizeof
(
cmsIntentsList
));
if
(
fl
==
NULL
)
return
FALSE
;
if
(
fl
==
NULL
)
{
fl
=
(
cmsIntentsList
*
)
_cmsPluginMalloc
(
id
,
sizeof
(
cmsIntentsList
));
if
(
fl
==
NULL
)
return
FALSE
;
}
fl
->
Intent
=
Plugin
->
Intent
;
strncpy
(
fl
->
Description
,
Plugin
->
Description
,
255
);
fl
->
Description
[
255
]
=
0
;
strncpy
(
fl
->
Description
,
Plugin
->
Description
,
sizeof
(
fl
->
Description
)
-
1
);
fl
->
Description
[
sizeof
(
fl
->
Description
)
-
1
]
=
0
;
fl
->
Link
=
Plugin
->
Link
;
fl
->
Next
=
Intents
;
Intents
=
fl
;
fl
->
Next
=
ctx
->
Intents
;
ctx
->
Intents
=
fl
;
return
TRUE
;
}
...
...
src/share/native/sun/java2d/cmm/lcms/cmserr.c
浏览文件 @
4352a351
...
...
@@ -60,13 +60,14 @@
// compare two strings ignoring case
int
CMSEXPORT
cmsstrcasecmp
(
const
char
*
s1
,
const
char
*
s2
)
{
register
const
unsigned
char
*
us1
=
(
const
unsigned
char
*
)
s1
,
*
us2
=
(
const
unsigned
char
*
)
s2
;
register
const
unsigned
char
*
us1
=
(
const
unsigned
char
*
)
s1
,
*
us2
=
(
const
unsigned
char
*
)
s2
;
while
(
toupper
(
*
us1
)
==
toupper
(
*
us2
++
))
if
(
*
us1
++
==
'\0'
)
return
(
0
);
return
(
toupper
(
*
us1
)
-
toupper
(
*--
us2
));
while
(
toupper
(
*
us1
)
==
toupper
(
*
us2
++
))
if
(
*
us1
++
==
'\0'
)
return
0
;
return
(
toupper
(
*
us1
)
-
toupper
(
*--
us2
));
}
// long int because C99 specifies ftell in such way (7.19.9.2)
...
...
@@ -91,9 +92,8 @@ long int CMSEXPORT cmsfilelength(FILE* f)
//
// This is the interface to low-level memory management routines. By default a simple
// wrapping to malloc/free/realloc is provided, although there is a limit on the max
// amount of memoy that can be reclaimed. This is mostly as a safety feature to
// prevent bogus or malintentionated code to allocate huge blocks that otherwise lcms
// would never need.
// amount of memoy that can be reclaimed. This is mostly as a safety feature to prevent
// bogus or evil code to allocate huge blocks that otherwise lcms would never need.
#define MAX_MEMORY_FOR_ALLOC ((cmsUInt32Number)(1024U*1024U*512U))
...
...
@@ -103,7 +103,7 @@ long int CMSEXPORT cmsfilelength(FILE* f)
// required to be implemented: malloc, realloc and free, although the user may want to
// replace the optional mallocZero, calloc and dup as well.
cmsBool
_cmsRegisterMemHandlerPlugin
(
cmsPluginBase
*
Plugin
);
cmsBool
_cmsRegisterMemHandlerPlugin
(
cms
Context
ContextID
,
cms
PluginBase
*
Plugin
);
// *********************************************************************************
...
...
@@ -143,7 +143,7 @@ void _cmsFreeDefaultFn(cmsContext ContextID, void *Ptr)
cmsUNUSED_PARAMETER
(
ContextID
);
}
// The default realloc function. Again it check for exploits. If Ptr is NULL,
// The default realloc function. Again it check
s
for exploits. If Ptr is NULL,
// realloc behaves the same way as malloc and allocates a new block of size bytes.
static
void
*
_cmsReallocDefaultFn
(
cmsContext
ContextID
,
void
*
Ptr
,
cmsUInt32Number
size
)
...
...
@@ -196,28 +196,73 @@ void* _cmsDupDefaultFn(cmsContext ContextID, const void* Org, cmsUInt32Number si
return
mem
;
}
// Pointers to malloc and _cmsFree functions in current environment
static
void
*
(
*
MallocPtr
)(
cmsContext
ContextID
,
cmsUInt32Number
size
)
=
_cmsMallocDefaultFn
;
static
void
*
(
*
MallocZeroPtr
)(
cmsContext
ContextID
,
cmsUInt32Number
size
)
=
_cmsMallocZeroDefaultFn
;
static
void
(
*
FreePtr
)(
cmsContext
ContextID
,
void
*
Ptr
)
=
_cmsFreeDefaultFn
;
static
void
*
(
*
ReallocPtr
)(
cmsContext
ContextID
,
void
*
Ptr
,
cmsUInt32Number
NewSize
)
=
_cmsReallocDefaultFn
;
static
void
*
(
*
CallocPtr
)(
cmsContext
ContextID
,
cmsUInt32Number
num
,
cmsUInt32Number
size
)
=
_cmsCallocDefaultFn
;
static
void
*
(
*
DupPtr
)(
cmsContext
ContextID
,
const
void
*
Org
,
cmsUInt32Number
size
)
=
_cmsDupDefaultFn
;
// Pointers to memory manager functions in Context0
_cmsMemPluginChunkType
_cmsMemPluginChunk
=
{
_cmsMallocDefaultFn
,
_cmsMallocZeroDefaultFn
,
_cmsFreeDefaultFn
,
_cmsReallocDefaultFn
,
_cmsCallocDefaultFn
,
_cmsDupDefaultFn
};
// Reset and duplicate memory manager
void
_cmsAllocMemPluginChunk
(
struct
_cmsContext_struct
*
ctx
,
const
struct
_cmsContext_struct
*
src
)
{
_cmsAssert
(
ctx
!=
NULL
);
if
(
src
!=
NULL
)
{
// Duplicate
ctx
->
chunks
[
MemPlugin
]
=
_cmsSubAllocDup
(
ctx
->
MemPool
,
src
->
chunks
[
MemPlugin
],
sizeof
(
_cmsMemPluginChunkType
));
}
else
{
// To reset it, we use the default allocators, which cannot be overriden
ctx
->
chunks
[
MemPlugin
]
=
&
ctx
->
DefaultMemoryManager
;
}
}
// Auxiliar to fill memory management functions from plugin (or context 0 defaults)
void
_cmsInstallAllocFunctions
(
cmsPluginMemHandler
*
Plugin
,
_cmsMemPluginChunkType
*
ptr
)
{
if
(
Plugin
==
NULL
)
{
memcpy
(
ptr
,
&
_cmsMemPluginChunk
,
sizeof
(
_cmsMemPluginChunk
));
}
else
{
ptr
->
MallocPtr
=
Plugin
->
MallocPtr
;
ptr
->
FreePtr
=
Plugin
->
FreePtr
;
ptr
->
ReallocPtr
=
Plugin
->
ReallocPtr
;
// Make sure we revert to defaults
ptr
->
MallocZeroPtr
=
_cmsMallocZeroDefaultFn
;
ptr
->
CallocPtr
=
_cmsCallocDefaultFn
;
ptr
->
DupPtr
=
_cmsDupDefaultFn
;
if
(
Plugin
->
MallocZeroPtr
!=
NULL
)
ptr
->
MallocZeroPtr
=
Plugin
->
MallocZeroPtr
;
if
(
Plugin
->
CallocPtr
!=
NULL
)
ptr
->
CallocPtr
=
Plugin
->
CallocPtr
;
if
(
Plugin
->
DupPtr
!=
NULL
)
ptr
->
DupPtr
=
Plugin
->
DupPtr
;
}
}
// Plug-in replacement entry
cmsBool
_cmsRegisterMemHandlerPlugin
(
cmsPluginBase
*
Data
)
cmsBool
_cmsRegisterMemHandlerPlugin
(
cms
Context
ContextID
,
cms
PluginBase
*
Data
)
{
cmsPluginMemHandler
*
Plugin
=
(
cmsPluginMemHandler
*
)
Data
;
_cmsMemPluginChunkType
*
ptr
;
// NULL forces to reset to defaults
// NULL forces to reset to defaults. In this special case, the defaults are stored in the context structure.
// Remaining plug-ins does NOT have any copy in the context structure, but this is somehow special as the
// context internal data should be malloce'd by using those functions.
if
(
Data
==
NULL
)
{
MallocPtr
=
_cmsMallocDefaultFn
;
MallocZeroPtr
=
_cmsMallocZeroDefaultFn
;
FreePtr
=
_cmsFreeDefaultFn
;
ReallocPtr
=
_cmsReallocDefaultFn
;
CallocPtr
=
_cmsCallocDefaultFn
;
DupPtr
=
_cmsDupDefaultFn
;
struct
_cmsContext_struct
*
ctx
=
(
struct
_cmsContext_struct
*
)
ContextID
;
// Return to the default allocators
if
(
ContextID
!=
NULL
)
{
ctx
->
chunks
[
MemPlugin
]
=
(
void
*
)
&
ctx
->
DefaultMemoryManager
;
}
return
TRUE
;
}
...
...
@@ -227,51 +272,56 @@ cmsBool _cmsRegisterMemHandlerPlugin(cmsPluginBase *Data)
Plugin
->
ReallocPtr
==
NULL
)
return
FALSE
;
// Set replacement functions
MallocPtr
=
Plugin
->
MallocPtr
;
FreePtr
=
Plugin
->
FreePtr
;
ReallocPtr
=
Plugin
->
ReallocPtr
;
if
(
Plugin
->
MallocZeroPtr
!=
NULL
)
MallocZeroPtr
=
Plugin
->
MallocZeroPtr
;
if
(
Plugin
->
CallocPtr
!=
NULL
)
CallocPtr
=
Plugin
->
CallocPtr
;
if
(
Plugin
->
DupPtr
!=
NULL
)
DupPtr
=
Plugin
->
DupPtr
;
ptr
=
(
_cmsMemPluginChunkType
*
)
_cmsContextGetClientChunk
(
ContextID
,
MemPlugin
);
if
(
ptr
==
NULL
)
return
FALSE
;
_cmsInstallAllocFunctions
(
Plugin
,
ptr
);
return
TRUE
;
}
// Generic allocate
void
*
CMSEXPORT
_cmsMalloc
(
cmsContext
ContextID
,
cmsUInt32Number
size
)
{
return
MallocPtr
(
ContextID
,
size
);
_cmsMemPluginChunkType
*
ptr
=
(
_cmsMemPluginChunkType
*
)
_cmsContextGetClientChunk
(
ContextID
,
MemPlugin
);
return
ptr
->
MallocPtr
(
ContextID
,
size
);
}
// Generic allocate & zero
void
*
CMSEXPORT
_cmsMallocZero
(
cmsContext
ContextID
,
cmsUInt32Number
size
)
{
return
MallocZeroPtr
(
ContextID
,
size
);
_cmsMemPluginChunkType
*
ptr
=
(
_cmsMemPluginChunkType
*
)
_cmsContextGetClientChunk
(
ContextID
,
MemPlugin
);
return
ptr
->
MallocZeroPtr
(
ContextID
,
size
);
}
// Generic calloc
void
*
CMSEXPORT
_cmsCalloc
(
cmsContext
ContextID
,
cmsUInt32Number
num
,
cmsUInt32Number
size
)
{
return
CallocPtr
(
ContextID
,
num
,
size
);
_cmsMemPluginChunkType
*
ptr
=
(
_cmsMemPluginChunkType
*
)
_cmsContextGetClientChunk
(
ContextID
,
MemPlugin
);
return
ptr
->
CallocPtr
(
ContextID
,
num
,
size
);
}
// Generic reallocate
void
*
CMSEXPORT
_cmsRealloc
(
cmsContext
ContextID
,
void
*
Ptr
,
cmsUInt32Number
size
)
{
return
ReallocPtr
(
ContextID
,
Ptr
,
size
);
_cmsMemPluginChunkType
*
ptr
=
(
_cmsMemPluginChunkType
*
)
_cmsContextGetClientChunk
(
ContextID
,
MemPlugin
);
return
ptr
->
ReallocPtr
(
ContextID
,
Ptr
,
size
);
}
// Generic free memory
void
CMSEXPORT
_cmsFree
(
cmsContext
ContextID
,
void
*
Ptr
)
{
if
(
Ptr
!=
NULL
)
FreePtr
(
ContextID
,
Ptr
);
if
(
Ptr
!=
NULL
)
{
_cmsMemPluginChunkType
*
ptr
=
(
_cmsMemPluginChunkType
*
)
_cmsContextGetClientChunk
(
ContextID
,
MemPlugin
);
ptr
->
FreePtr
(
ContextID
,
Ptr
);
}
}
// Generic block duplication
void
*
CMSEXPORT
_cmsDupMem
(
cmsContext
ContextID
,
const
void
*
Org
,
cmsUInt32Number
size
)
{
return
DupPtr
(
ContextID
,
Org
,
size
);
_cmsMemPluginChunkType
*
ptr
=
(
_cmsMemPluginChunkType
*
)
_cmsContextGetClientChunk
(
ContextID
,
MemPlugin
);
return
ptr
->
DupPtr
(
ContextID
,
Org
,
size
);
}
// ********************************************************************************************
...
...
@@ -380,6 +430,26 @@ void* _cmsSubAlloc(_cmsSubAllocator* sub, cmsUInt32Number size)
return
(
void
*
)
ptr
;
}
// Duplicate in pool
void
*
_cmsSubAllocDup
(
_cmsSubAllocator
*
s
,
const
void
*
ptr
,
cmsUInt32Number
size
)
{
void
*
NewPtr
;
// Dup of null pointer is also NULL
if
(
ptr
==
NULL
)
return
NULL
;
NewPtr
=
_cmsSubAlloc
(
s
,
size
);
if
(
ptr
!=
NULL
&&
NewPtr
!=
NULL
)
{
memcpy
(
NewPtr
,
ptr
,
size
);
}
return
NewPtr
;
}
// Error logging ******************************************************************
// There is no error handling at all. When a funtion fails, it returns proper value.
...
...
@@ -401,8 +471,26 @@ void* _cmsSubAlloc(_cmsSubAllocator* sub, cmsUInt32Number size)
// This is our default log error
static
void
DefaultLogErrorHandlerFunction
(
cmsContext
ContextID
,
cmsUInt32Number
ErrorCode
,
const
char
*
Text
);
// The current handler in actual environment
static
cmsLogErrorHandlerFunction
LogErrorHandler
=
DefaultLogErrorHandlerFunction
;
// Context0 storage, which is global
_cmsLogErrorChunkType
_cmsLogErrorChunk
=
{
DefaultLogErrorHandlerFunction
};
// Allocates and inits error logger container for a given context. If src is NULL, only initializes the value
// to the default. Otherwise, it duplicates the value. The interface is standard across all context clients
void
_cmsAllocLogErrorChunk
(
struct
_cmsContext_struct
*
ctx
,
const
struct
_cmsContext_struct
*
src
)
{
static
_cmsLogErrorChunkType
LogErrorChunk
=
{
DefaultLogErrorHandlerFunction
};
void
*
from
;
if
(
src
!=
NULL
)
{
from
=
src
->
chunks
[
Logger
];
}
else
{
from
=
&
LogErrorChunk
;
}
ctx
->
chunks
[
Logger
]
=
_cmsSubAllocDup
(
ctx
->
MemPool
,
from
,
sizeof
(
_cmsLogErrorChunkType
));
}
// The default error logger does nothing.
static
...
...
@@ -416,13 +504,24 @@ void DefaultLogErrorHandlerFunction(cmsContext ContextID, cmsUInt32Number ErrorC
cmsUNUSED_PARAMETER
(
Text
);
}
// Change log error
// Change log error, context based
void
CMSEXPORT
cmsSetLogErrorHandlerTHR
(
cmsContext
ContextID
,
cmsLogErrorHandlerFunction
Fn
)
{
_cmsLogErrorChunkType
*
lhg
=
(
_cmsLogErrorChunkType
*
)
_cmsContextGetClientChunk
(
ContextID
,
Logger
);
if
(
lhg
!=
NULL
)
{
if
(
Fn
==
NULL
)
lhg
->
LogErrorHandler
=
DefaultLogErrorHandlerFunction
;
else
lhg
->
LogErrorHandler
=
Fn
;
}
}
// Change log error, legacy
void
CMSEXPORT
cmsSetLogErrorHandler
(
cmsLogErrorHandlerFunction
Fn
)
{
if
(
Fn
==
NULL
)
LogErrorHandler
=
DefaultLogErrorHandlerFunction
;
else
LogErrorHandler
=
Fn
;
cmsSetLogErrorHandlerTHR
(
NULL
,
Fn
);
}
// Log an error
...
...
@@ -431,13 +530,18 @@ void CMSEXPORT cmsSignalError(cmsContext ContextID, cmsUInt32Number ErrorCode, c
{
va_list
args
;
char
Buffer
[
MAX_ERROR_MESSAGE_LEN
];
_cmsLogErrorChunkType
*
lhg
;
va_start
(
args
,
ErrorText
);
vsnprintf
(
Buffer
,
MAX_ERROR_MESSAGE_LEN
-
1
,
ErrorText
,
args
);
va_end
(
args
);
// Call handler
LogErrorHandler
(
ContextID
,
ErrorCode
,
Buffer
);
// Check for the context, if specified go there. If not, go for the global
lhg
=
(
_cmsLogErrorChunkType
*
)
_cmsContextGetClientChunk
(
ContextID
,
Logger
);
if
(
lhg
->
LogErrorHandler
)
{
lhg
->
LogErrorHandler
(
ContextID
,
ErrorCode
,
Buffer
);
}
}
// Utility function to print signatures
...
...
@@ -455,3 +559,125 @@ void _cmsTagSignature2String(char String[5], cmsTagSignature sig)
String
[
4
]
=
0
;
}
//--------------------------------------------------------------------------------------------------
static
void
*
defMtxCreate
(
cmsContext
id
)
{
_cmsMutex
*
ptr_mutex
=
(
_cmsMutex
*
)
_cmsMalloc
(
id
,
sizeof
(
_cmsMutex
));
_cmsInitMutexPrimitive
(
ptr_mutex
);
return
(
void
*
)
ptr_mutex
;
}
static
void
defMtxDestroy
(
cmsContext
id
,
void
*
mtx
)
{
_cmsDestroyMutexPrimitive
((
_cmsMutex
*
)
mtx
);
_cmsFree
(
id
,
mtx
);
}
static
cmsBool
defMtxLock
(
cmsContext
id
,
void
*
mtx
)
{
cmsUNUSED_PARAMETER
(
id
);
return
_cmsLockPrimitive
((
_cmsMutex
*
)
mtx
)
==
0
;
}
static
void
defMtxUnlock
(
cmsContext
id
,
void
*
mtx
)
{
cmsUNUSED_PARAMETER
(
id
);
_cmsUnlockPrimitive
((
_cmsMutex
*
)
mtx
);
}
// Pointers to memory manager functions in Context0
_cmsMutexPluginChunkType
_cmsMutexPluginChunk
=
{
defMtxCreate
,
defMtxDestroy
,
defMtxLock
,
defMtxUnlock
};
// Allocate and init mutex container.
void
_cmsAllocMutexPluginChunk
(
struct
_cmsContext_struct
*
ctx
,
const
struct
_cmsContext_struct
*
src
)
{
static
_cmsMutexPluginChunkType
MutexChunk
=
{
defMtxCreate
,
defMtxDestroy
,
defMtxLock
,
defMtxUnlock
};
void
*
from
;
if
(
src
!=
NULL
)
{
from
=
src
->
chunks
[
MutexPlugin
];
}
else
{
from
=
&
MutexChunk
;
}
ctx
->
chunks
[
MutexPlugin
]
=
_cmsSubAllocDup
(
ctx
->
MemPool
,
from
,
sizeof
(
_cmsMutexPluginChunkType
));
}
// Register new ways to transform
cmsBool
_cmsRegisterMutexPlugin
(
cmsContext
ContextID
,
cmsPluginBase
*
Data
)
{
cmsPluginMutex
*
Plugin
=
(
cmsPluginMutex
*
)
Data
;
_cmsMutexPluginChunkType
*
ctx
=
(
_cmsMutexPluginChunkType
*
)
_cmsContextGetClientChunk
(
ContextID
,
MutexPlugin
);
if
(
Data
==
NULL
)
{
// No lock routines
ctx
->
CreateMutexPtr
=
NULL
;
ctx
->
DestroyMutexPtr
=
NULL
;
ctx
->
LockMutexPtr
=
NULL
;
ctx
->
UnlockMutexPtr
=
NULL
;
return
TRUE
;
}
// Factory callback is required
if
(
Plugin
->
CreateMutexPtr
==
NULL
||
Plugin
->
DestroyMutexPtr
==
NULL
||
Plugin
->
LockMutexPtr
==
NULL
||
Plugin
->
UnlockMutexPtr
==
NULL
)
return
FALSE
;
ctx
->
CreateMutexPtr
=
Plugin
->
CreateMutexPtr
;
ctx
->
DestroyMutexPtr
=
Plugin
->
DestroyMutexPtr
;
ctx
->
LockMutexPtr
=
Plugin
->
LockMutexPtr
;
ctx
->
UnlockMutexPtr
=
Plugin
->
UnlockMutexPtr
;
// All is ok
return
TRUE
;
}
// Generic Mutex fns
void
*
CMSEXPORT
_cmsCreateMutex
(
cmsContext
ContextID
)
{
_cmsMutexPluginChunkType
*
ptr
=
(
_cmsMutexPluginChunkType
*
)
_cmsContextGetClientChunk
(
ContextID
,
MutexPlugin
);
if
(
ptr
->
CreateMutexPtr
==
NULL
)
return
NULL
;
return
ptr
->
CreateMutexPtr
(
ContextID
);
}
void
CMSEXPORT
_cmsDestroyMutex
(
cmsContext
ContextID
,
void
*
mtx
)
{
_cmsMutexPluginChunkType
*
ptr
=
(
_cmsMutexPluginChunkType
*
)
_cmsContextGetClientChunk
(
ContextID
,
MutexPlugin
);
if
(
ptr
->
DestroyMutexPtr
!=
NULL
)
{
ptr
->
DestroyMutexPtr
(
ContextID
,
mtx
);
}
}
cmsBool
CMSEXPORT
_cmsLockMutex
(
cmsContext
ContextID
,
void
*
mtx
)
{
_cmsMutexPluginChunkType
*
ptr
=
(
_cmsMutexPluginChunkType
*
)
_cmsContextGetClientChunk
(
ContextID
,
MutexPlugin
);
if
(
ptr
->
LockMutexPtr
==
NULL
)
return
TRUE
;
return
ptr
->
LockMutexPtr
(
ContextID
,
mtx
);
}
void
CMSEXPORT
_cmsUnlockMutex
(
cmsContext
ContextID
,
void
*
mtx
)
{
_cmsMutexPluginChunkType
*
ptr
=
(
_cmsMutexPluginChunkType
*
)
_cmsContextGetClientChunk
(
ContextID
,
MutexPlugin
);
if
(
ptr
->
UnlockMutexPtr
!=
NULL
)
{
ptr
->
UnlockMutexPtr
(
ContextID
,
mtx
);
}
}
src/share/native/sun/java2d/cmm/lcms/cmsgamma.c
浏览文件 @
4352a351
...
...
@@ -82,7 +82,6 @@ typedef struct _cmsParametricCurvesCollection_st {
}
_cmsParametricCurvesCollection
;
// This is the default (built-in) evaluator
static
cmsFloat64Number
DefaultEvalParametricFn
(
cmsInt32Number
Type
,
const
cmsFloat64Number
Params
[],
cmsFloat64Number
R
);
...
...
@@ -95,22 +94,77 @@ static _cmsParametricCurvesCollection DefaultCurves = {
NULL
// Next in chain
};
// Duplicates the zone of memory used by the plug-in in the new context
static
void
DupPluginCurvesList
(
struct
_cmsContext_struct
*
ctx
,
const
struct
_cmsContext_struct
*
src
)
{
_cmsCurvesPluginChunkType
newHead
=
{
NULL
};
_cmsParametricCurvesCollection
*
entry
;
_cmsParametricCurvesCollection
*
Anterior
=
NULL
;
_cmsCurvesPluginChunkType
*
head
=
(
_cmsCurvesPluginChunkType
*
)
src
->
chunks
[
CurvesPlugin
];
_cmsAssert
(
head
!=
NULL
);
// Walk the list copying all nodes
for
(
entry
=
head
->
ParametricCurves
;
entry
!=
NULL
;
entry
=
entry
->
Next
)
{
_cmsParametricCurvesCollection
*
newEntry
=
(
_cmsParametricCurvesCollection
*
)
_cmsSubAllocDup
(
ctx
->
MemPool
,
entry
,
sizeof
(
_cmsParametricCurvesCollection
));
if
(
newEntry
==
NULL
)
return
;
// We want to keep the linked list order, so this is a little bit tricky
newEntry
->
Next
=
NULL
;
if
(
Anterior
)
Anterior
->
Next
=
newEntry
;
Anterior
=
newEntry
;
if
(
newHead
.
ParametricCurves
==
NULL
)
newHead
.
ParametricCurves
=
newEntry
;
}
ctx
->
chunks
[
CurvesPlugin
]
=
_cmsSubAllocDup
(
ctx
->
MemPool
,
&
newHead
,
sizeof
(
_cmsCurvesPluginChunkType
));
}
// The allocator have to follow the chain
void
_cmsAllocCurvesPluginChunk
(
struct
_cmsContext_struct
*
ctx
,
const
struct
_cmsContext_struct
*
src
)
{
_cmsAssert
(
ctx
!=
NULL
);
if
(
src
!=
NULL
)
{
// Copy all linked list
DupPluginCurvesList
(
ctx
,
src
);
}
else
{
static
_cmsCurvesPluginChunkType
CurvesPluginChunk
=
{
NULL
};
ctx
->
chunks
[
CurvesPlugin
]
=
_cmsSubAllocDup
(
ctx
->
MemPool
,
&
CurvesPluginChunk
,
sizeof
(
_cmsCurvesPluginChunkType
));
}
}
// The linked list head
static
_cmsParametricCurvesCollection
*
ParametricCurves
=
&
DefaultCurves
;
_cmsCurvesPluginChunkType
_cmsCurvesPluginChunk
=
{
NULL
}
;
// As a way to install new parametric curves
cmsBool
_cmsRegisterParametricCurvesPlugin
(
cmsContext
id
,
cmsPluginBase
*
Data
)
cmsBool
_cmsRegisterParametricCurvesPlugin
(
cmsContext
ContextID
,
cmsPluginBase
*
Data
)
{
_cmsCurvesPluginChunkType
*
ctx
=
(
_cmsCurvesPluginChunkType
*
)
_cmsContextGetClientChunk
(
ContextID
,
CurvesPlugin
);
cmsPluginParametricCurves
*
Plugin
=
(
cmsPluginParametricCurves
*
)
Data
;
_cmsParametricCurvesCollection
*
fl
;
if
(
Data
==
NULL
)
{
ParametricCurves
=
&
DefaultCurves
;
ctx
->
ParametricCurves
=
NULL
;
return
TRUE
;
}
fl
=
(
_cmsParametricCurvesCollection
*
)
_cmsPluginMalloc
(
id
,
sizeof
(
_cmsParametricCurvesCollection
));
fl
=
(
_cmsParametricCurvesCollection
*
)
_cmsPluginMalloc
(
ContextID
,
sizeof
(
_cmsParametricCurvesCollection
));
if
(
fl
==
NULL
)
return
FALSE
;
// Copy the parameters
...
...
@@ -126,8 +180,8 @@ cmsBool _cmsRegisterParametricCurvesPlugin(cmsContext id, cmsPluginBase* Data)
memmove
(
fl
->
ParameterCount
,
Plugin
->
ParameterCount
,
fl
->
nFunctions
*
sizeof
(
cmsUInt32Number
));
// Keep linked list
fl
->
Next
=
ParametricCurves
;
ParametricCurves
=
fl
;
fl
->
Next
=
ctx
->
ParametricCurves
;
ctx
->
ParametricCurves
=
fl
;
// All is ok
return
TRUE
;
...
...
@@ -149,12 +203,24 @@ int IsInSet(int Type, _cmsParametricCurvesCollection* c)
// Search for the collection which contains a specific type
static
_cmsParametricCurvesCollection
*
GetParametricCurveByType
(
int
Type
,
int
*
index
)
_cmsParametricCurvesCollection
*
GetParametricCurveByType
(
cmsContext
ContextID
,
int
Type
,
int
*
index
)
{
_cmsParametricCurvesCollection
*
c
;
int
Position
;
_cmsCurvesPluginChunkType
*
ctx
=
(
_cmsCurvesPluginChunkType
*
)
_cmsContextGetClientChunk
(
ContextID
,
CurvesPlugin
);
for
(
c
=
ctx
->
ParametricCurves
;
c
!=
NULL
;
c
=
c
->
Next
)
{
Position
=
IsInSet
(
Type
,
c
);
for
(
c
=
ParametricCurves
;
c
!=
NULL
;
c
=
c
->
Next
)
{
if
(
Position
!=
-
1
)
{
if
(
index
!=
NULL
)
*
index
=
Position
;
return
c
;
}
}
// If none found, revert for defaults
for
(
c
=
&
DefaultCurves
;
c
!=
NULL
;
c
=
c
->
Next
)
{
Position
=
IsInSet
(
Type
,
c
);
...
...
@@ -251,7 +317,7 @@ cmsToneCurve* AllocateToneCurveStruct(cmsContext ContextID, cmsInt32Number nEntr
p
->
Segments
[
i
].
SampledPoints
=
NULL
;
c
=
GetParametricCurveByType
(
Segments
[
i
].
Type
,
NULL
);
c
=
GetParametricCurveByType
(
ContextID
,
Segments
[
i
].
Type
,
NULL
);
if
(
c
!=
NULL
)
p
->
Evals
[
i
]
=
c
->
Evaluator
;
}
...
...
@@ -677,12 +743,12 @@ cmsToneCurve* CMSEXPORT cmsBuildParametricToneCurve(cmsContext ContextID, cmsInt
cmsCurveSegment
Seg0
;
int
Pos
=
0
;
cmsUInt32Number
size
;
_cmsParametricCurvesCollection
*
c
=
GetParametricCurveByType
(
Type
,
&
Pos
);
_cmsParametricCurvesCollection
*
c
=
GetParametricCurveByType
(
ContextID
,
Type
,
&
Pos
);
_cmsAssert
(
Params
!=
NULL
);
if
(
c
==
NULL
)
{
cmsSignalError
(
ContextID
,
cmsERROR_UNKNOWN_EXTENSION
,
"Invalid parametric curve type %d"
,
Type
);
cmsSignalError
(
ContextID
,
cmsERROR_UNKNOWN_EXTENSION
,
"Invalid parametric curve type %d"
,
Type
);
return
NULL
;
}
...
...
@@ -872,7 +938,10 @@ cmsToneCurve* CMSEXPORT cmsReverseToneCurveEx(cmsInt32Number nResultSamples, con
_cmsAssert
(
InCurve
!=
NULL
);
// Try to reverse it analytically whatever possible
if
(
InCurve
->
nSegments
==
1
&&
InCurve
->
Segments
[
0
].
Type
>
0
&&
InCurve
->
Segments
[
0
].
Type
<=
5
)
{
if
(
InCurve
->
nSegments
==
1
&&
InCurve
->
Segments
[
0
].
Type
>
0
&&
/* InCurve -> Segments[0].Type <= 5 */
GetParametricCurveByType
(
InCurve
->
InterpParams
->
ContextID
,
InCurve
->
Segments
[
0
].
Type
,
NULL
)
!=
NULL
)
{
return
cmsBuildParametricToneCurve
(
InCurve
->
InterpParams
->
ContextID
,
-
(
InCurve
->
Segments
[
0
].
Type
),
...
...
src/share/native/sun/java2d/cmm/lcms/cmsgmt.c
浏览文件 @
4352a351
...
...
@@ -191,7 +191,7 @@ cmsToneCurve* _cmsBuildKToneCurve(cmsContext ContextID,
out
=
ComputeKToLstar
(
ContextID
,
nPoints
,
1
,
Intents
+
(
nProfiles
-
1
),
hProfiles
+
(
nProfiles
-
1
)
,
&
hProfiles
[
nProfiles
-
1
]
,
BPC
+
(
nProfiles
-
1
),
AdaptationStates
+
(
nProfiles
-
1
),
dwFlags
);
...
...
src/share/native/sun/java2d/cmm/lcms/cmsintrp.c
浏览文件 @
4352a351
...
...
@@ -62,31 +62,57 @@
static
cmsInterpFunction
DefaultInterpolatorsFactory
(
cmsUInt32Number
nInputChannels
,
cmsUInt32Number
nOutputChannels
,
cmsUInt32Number
dwFlags
);
// This is the default factory
static
cmsInterpFnFactory
Interpolators
=
DefaultInterpolatorsFactory
;
_cmsInterpPluginChunkType
_cmsInterpPluginChunk
=
{
NULL
};
// The interpolation plug-in memory chunk allocator/dup
void
_cmsAllocInterpPluginChunk
(
struct
_cmsContext_struct
*
ctx
,
const
struct
_cmsContext_struct
*
src
)
{
void
*
from
;
_cmsAssert
(
ctx
!=
NULL
);
if
(
src
!=
NULL
)
{
from
=
src
->
chunks
[
InterpPlugin
];
}
else
{
static
_cmsInterpPluginChunkType
InterpPluginChunk
=
{
NULL
};
from
=
&
InterpPluginChunk
;
}
_cmsAssert
(
from
!=
NULL
);
ctx
->
chunks
[
InterpPlugin
]
=
_cmsSubAllocDup
(
ctx
->
MemPool
,
from
,
sizeof
(
_cmsInterpPluginChunkType
));
}
// Main plug-in entry
cmsBool
_cmsRegisterInterpPlugin
(
cmsPluginBase
*
Data
)
cmsBool
_cmsRegisterInterpPlugin
(
cms
Context
ContextID
,
cms
PluginBase
*
Data
)
{
cmsPluginInterpolation
*
Plugin
=
(
cmsPluginInterpolation
*
)
Data
;
_cmsInterpPluginChunkType
*
ptr
=
(
_cmsInterpPluginChunkType
*
)
_cmsContextGetClientChunk
(
ContextID
,
InterpPlugin
);
if
(
Data
==
NULL
)
{
Interpolators
=
DefaultInterpolatorsFactory
;
ptr
->
Interpolators
=
NULL
;
return
TRUE
;
}
// Set replacement functions
Interpolators
=
Plugin
->
InterpolatorsFactory
;
ptr
->
Interpolators
=
Plugin
->
InterpolatorsFactory
;
return
TRUE
;
}
// Set the interpolation method
cmsBool
_cmsSetInterpolationRoutine
(
cmsInterpParams
*
p
)
cmsBool
_cmsSetInterpolationRoutine
(
cms
Context
ContextID
,
cms
InterpParams
*
p
)
{
// Invoke factory, possibly in the Plug-in
p
->
Interpolation
=
Interpolators
(
p
->
nInputs
,
p
->
nOutputs
,
p
->
dwFlags
);
_cmsInterpPluginChunkType
*
ptr
=
(
_cmsInterpPluginChunkType
*
)
_cmsContextGetClientChunk
(
ContextID
,
InterpPlugin
);
p
->
Interpolation
.
Lerp16
=
NULL
;
// Invoke factory, possibly in the Plug-in
if
(
ptr
->
Interpolators
!=
NULL
)
p
->
Interpolation
=
ptr
->
Interpolators
(
p
->
nInputs
,
p
->
nOutputs
,
p
->
dwFlags
);
// If unsupported by the plug-in, go for the LittleCMS default.
// If happens only if an extern plug-in is being used
...
...
@@ -97,6 +123,7 @@ cmsBool _cmsSetInterpolationRoutine(cmsInterpParams* p)
if
(
p
->
Interpolation
.
Lerp16
==
NULL
)
{
return
FALSE
;
}
return
TRUE
;
}
...
...
@@ -141,7 +168,7 @@ cmsInterpParams* _cmsComputeInterpParamsEx(cmsContext ContextID,
p
->
opta
[
i
]
=
p
->
opta
[
i
-
1
]
*
nSamples
[
InputChan
-
i
];
if
(
!
_cmsSetInterpolationRoutine
(
p
))
{
if
(
!
_cmsSetInterpolationRoutine
(
ContextID
,
p
))
{
cmsSignalError
(
ContextID
,
cmsERROR_UNKNOWN_EXTENSION
,
"Unsupported interpolation (%d->%d channels)"
,
InputChan
,
OutputChan
);
_cmsFree
(
ContextID
,
p
);
return
NULL
;
...
...
src/share/native/sun/java2d/cmm/lcms/cmsio0.c
浏览文件 @
4352a351
此差异已折叠。
点击以展开。
src/share/native/sun/java2d/cmm/lcms/cmsio1.c
浏览文件 @
4352a351
...
...
@@ -334,7 +334,8 @@ Error:
// 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
// is adjusted here in order to create a LUT that takes care of all those details.
// We add intent = -1 as a way to read matrix shaper always, no matter of other LUT
cmsPipeline
*
_cmsReadInputLUT
(
cmsHPROFILE
hProfile
,
int
Intent
)
{
cmsTagTypeSignature
OriginalType
;
...
...
@@ -364,49 +365,54 @@ cmsPipeline* _cmsReadInputLUT(cmsHPROFILE hProfile, int Intent)
return
Lut
;
}
if
(
cmsIsTag
(
hProfile
,
tagFloat
))
{
// Float tag takes precedence
// This is an attempt to reuse this funtion to retrieve the matrix-shaper as pipeline no
// matter other LUT are present and have precedence. Intent = -1 means just this.
if
(
Intent
!=
-
1
)
{
// 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
);
}
if
(
cmsIsTag
(
hProfile
,
tagFloat
))
{
// Float tag takes precedence
// Revert to perceptual if no tag is found
if
(
!
cmsIsTag
(
hProfile
,
tag16
))
{
tag16
=
Device2PCS16
[
0
]
;
}
// 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
)
;
}
if
(
cmsIsTag
(
hProfile
,
tag16
))
{
// Is there any LUT-Based table?
// Revert to perceptual if no tag is found
if
(
!
cmsIsTag
(
hProfile
,
tag16
))
{
tag16
=
Device2PCS16
[
0
];
}
// Check profile version and LUT type. Do the necessary adjustments if needed
if
(
cmsIsTag
(
hProfile
,
tag16
))
{
// Is there any LUT-Based table?
// First read the tag
cmsPipeline
*
Lut
=
(
cmsPipeline
*
)
cmsReadTag
(
hProfile
,
tag16
);
if
(
Lut
==
NULL
)
return
NULL
;
// Check profile version and LUT type. Do the necessary adjustments if needed
// After reading it, we have now info about the original type
OriginalType
=
_cmsGetTagTrueType
(
hProfile
,
tag16
);
// First read the tag
cmsPipeline
*
Lut
=
(
cmsPipeline
*
)
cmsReadTag
(
hProfile
,
tag16
);
if
(
Lut
==
NULL
)
return
NULL
;
// The profile owns the Lut, so we need to copy it
Lut
=
cmsPipelineDup
(
Lut
);
// After reading it, we have now info about the original type
OriginalType
=
_cmsGetTagTrueType
(
hProfile
,
tag16
);
// We need to adjust data only for Lab16 on output
if
(
OriginalType
!=
cmsSigLut16Type
||
cmsGetPCS
(
hProfile
)
!=
cmsSigLabData
)
return
Lut
;
// The profile owns the Lut, so we need to copy it
Lut
=
cmsPipelineDup
(
Lut
);
// If the input is Lab, add also a conversion at the begin
if
(
cmsGetColorSpace
(
hProfile
)
==
cmsSigLabData
&&
!
cmsPipelineInsertStage
(
Lut
,
cmsAT_BEGIN
,
_cmsStageAllocLabV4ToV2
(
ContextID
)))
goto
Error
;
// We need to adjust data only for Lab16 on output
if
(
OriginalType
!=
cmsSigLut16Type
||
cmsGetPCS
(
hProfile
)
!=
cmsSigLabData
)
return
Lut
;
// Add a matrix for conversion V2 to V4 Lab PCS
if
(
!
cmsPipelineInsertStage
(
Lut
,
cmsAT_END
,
_cmsStageAllocLabV2ToV4
(
ContextID
)))
goto
Error
;
// If the input is Lab, add also a conversion at the begin
if
(
cmsGetColorSpace
(
hProfile
)
==
cmsSigLabData
&&
!
cmsPipelineInsertStage
(
Lut
,
cmsAT_BEGIN
,
_cmsStageAllocLabV4ToV2
(
ContextID
)))
goto
Error
;
return
Lut
;
// Add a matrix for conversion V2 to V4 Lab PCS
if
(
!
cmsPipelineInsertStage
(
Lut
,
cmsAT_END
,
_cmsStageAllocLabV2ToV4
(
ContextID
)))
goto
Error
;
return
Lut
;
Error:
cmsPipelineFree
(
Lut
);
return
NULL
;
cmsPipelineFree
(
Lut
);
return
NULL
;
}
}
// Lut was not found, try to create a matrix-shaper
...
...
@@ -551,7 +557,7 @@ void ChangeInterpolationToTrilinear(cmsPipeline* Lut)
_cmsStageCLutData
*
CLUT
=
(
_cmsStageCLutData
*
)
Stage
->
Data
;
CLUT
->
Params
->
dwFlags
|=
CMS_LERP_FLAGS_TRILINEAR
;
_cmsSetInterpolationRoutine
(
CLUT
->
Params
);
_cmsSetInterpolationRoutine
(
Lut
->
ContextID
,
CLUT
->
Params
);
}
}
}
...
...
@@ -609,54 +615,58 @@ cmsPipeline* _cmsReadOutputLUT(cmsHPROFILE hProfile, int Intent)
cmsTagSignature
tagFloat
=
PCS2DeviceFloat
[
Intent
];
cmsContext
ContextID
=
cmsGetProfileContextID
(
hProfile
);
if
(
cmsIsTag
(
hProfile
,
tagFloat
))
{
// Float tag takes precedence
// Floating point LUT are always V4
return
_cmsReadFloatOutputTag
(
hProfile
,
tagFloat
);
}
if
(
Intent
!=
-
1
)
{
// Revert to perceptual if no tag is found
if
(
!
cmsIsTag
(
hProfile
,
tag16
))
{
tag16
=
PCS2Device16
[
0
];
}
if
(
cmsIsTag
(
hProfile
,
tagFloat
))
{
// Float tag takes precedence
if
(
cmsIsTag
(
hProfile
,
tag16
))
{
// Is there any LUT-Based table?
// Floating point LUT are always V4
return
_cmsReadFloatOutputTag
(
hProfile
,
tagFloat
);
}
// Check profile version and LUT type. Do the necessary adjustments if needed
// Revert to perceptual if no tag is found
if
(
!
cmsIsTag
(
hProfile
,
tag16
))
{
tag16
=
PCS2Device16
[
0
];
}
// First read the tag
cmsPipeline
*
Lut
=
(
cmsPipeline
*
)
cmsReadTag
(
hProfile
,
tag16
);
if
(
Lut
==
NULL
)
return
NULL
;
if
(
cmsIsTag
(
hProfile
,
tag16
))
{
// Is there any LUT-Based table?
// After reading it, we have info about the original type
OriginalType
=
_cmsGetTagTrueType
(
hProfile
,
tag16
);
// Check profile version and LUT type. Do the necessary adjustments if needed
// The profile owns the Lut, so we need to copy it
Lut
=
cmsPipelineDup
(
Lut
);
if
(
Lut
==
NULL
)
return
NULL
;
// First read the tag
cmsPipeline
*
Lut
=
(
cmsPipeline
*
)
cmsReadTag
(
hProfile
,
tag16
);
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
);
// After reading it, we have info about the original type
OriginalType
=
_cmsGetTagTrueType
(
hProfile
,
tag16
);
// We need to adjust data only for Lab and Lut16 type
if
(
OriginalType
!=
cmsSigLut16Type
||
cmsGetPCS
(
hProfile
)
!=
cmsSigLabData
)
return
Lut
;
// The profile owns the Lut, so we need to copy it
Lut
=
cmsPipelineDup
(
Lut
);
if
(
Lut
==
NULL
)
return
NULL
;
// Add a matrix for conversion V4 to V2 Lab PCS
if
(
!
cmsPipelineInsertStage
(
Lut
,
cmsAT_BEGIN
,
_cmsStageAllocLabV4ToV2
(
ContextID
)))
goto
Error
;
// 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
);
// If the output is Lab, add also a conversion at the end
if
(
cmsGetColorSpace
(
hProfile
)
==
cmsSigLabData
)
if
(
!
cmsPipelineInsertStage
(
Lut
,
cmsAT_END
,
_cmsStageAllocLabV2ToV4
(
ContextID
)))
// We need to adjust data only for Lab and Lut16 type
if
(
OriginalType
!=
cmsSigLut16Type
||
cmsGetPCS
(
hProfile
)
!=
cmsSigLabData
)
return
Lut
;
// Add a matrix for conversion V4 to V2 Lab PCS
if
(
!
cmsPipelineInsertStage
(
Lut
,
cmsAT_BEGIN
,
_cmsStageAllocLabV4ToV2
(
ContextID
)))
goto
Error
;
return
Lut
;
// If the output is Lab, add also a conversion at the end
if
(
cmsGetColorSpace
(
hProfile
)
==
cmsSigLabData
)
if
(
!
cmsPipelineInsertStage
(
Lut
,
cmsAT_END
,
_cmsStageAllocLabV2ToV4
(
ContextID
)))
goto
Error
;
return
Lut
;
Error:
cmsPipelineFree
(
Lut
);
return
NULL
;
cmsPipelineFree
(
Lut
);
return
NULL
;
}
}
// Lut not found, try to create a matrix-shaper
...
...
@@ -782,7 +792,7 @@ Error:
// 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
(
cmsGet
ColorSpace
(
hProfile
)
==
cmsSigLabData
)
if
(
cmsGet
PCS
(
hProfile
)
==
cmsSigLabData
)
ChangeInterpolationToTrilinear
(
Lut
);
// After reading it, we have info about the original type
...
...
@@ -793,12 +803,12 @@ Error:
// Here it is possible to get Lab on both sides
if
(
cmsGet
PCS
(
hProfile
)
==
cmsSigLabData
)
{
if
(
cmsGet
ColorSpace
(
hProfile
)
==
cmsSigLabData
)
{
if
(
!
cmsPipelineInsertStage
(
Lut
,
cmsAT_BEGIN
,
_cmsStageAllocLabV4ToV2
(
ContextID
)))
goto
Error2
;
}
if
(
cmsGet
ColorSpace
(
hProfile
)
==
cmsSigLabData
)
{
if
(
cmsGet
PCS
(
hProfile
)
==
cmsSigLabData
)
{
if
(
!
cmsPipelineInsertStage
(
Lut
,
cmsAT_END
,
_cmsStageAllocLabV2ToV4
(
ContextID
)))
goto
Error2
;
}
...
...
src/share/native/sun/java2d/cmm/lcms/cmsopt.c
浏览文件 @
4352a351
...
...
@@ -542,11 +542,13 @@ cmsBool FixWhiteMisalignment(cmsPipeline* Lut, cmsColorSpaceSignature EntryColor
cmsToneCurve
*
InversePostLin
=
cmsReverseToneCurve
(
Curves
[
i
]);
if
(
InversePostLin
==
NULL
)
{
WhiteOut
[
i
]
=
0
;
continue
;
WhiteOut
[
i
]
=
WhitePointOut
[
i
];
}
else
{
WhiteOut
[
i
]
=
cmsEvalToneCurve16
(
InversePostLin
,
WhitePointOut
[
i
]);
cmsFreeToneCurve
(
InversePostLin
);
}
WhiteOut
[
i
]
=
cmsEvalToneCurve16
(
InversePostLin
,
WhitePointOut
[
i
]);
cmsFreeToneCurve
(
InversePostLin
);
}
}
else
{
...
...
@@ -1666,44 +1668,102 @@ static _cmsOptimizationCollection DefaultOptimization[] = {
};
// The linked list head
static
_cmsOptimizationCollection
*
OptimizationCollection
=
DefaultOptimization
;
_cmsOptimizationPluginChunkType
_cmsOptimizationPluginChunk
=
{
NULL
};
// Duplicates the zone of memory used by the plug-in in the new context
static
void
DupPluginOptimizationList
(
struct
_cmsContext_struct
*
ctx
,
const
struct
_cmsContext_struct
*
src
)
{
_cmsOptimizationPluginChunkType
newHead
=
{
NULL
};
_cmsOptimizationCollection
*
entry
;
_cmsOptimizationCollection
*
Anterior
=
NULL
;
_cmsOptimizationPluginChunkType
*
head
=
(
_cmsOptimizationPluginChunkType
*
)
src
->
chunks
[
OptimizationPlugin
];
_cmsAssert
(
ctx
!=
NULL
);
_cmsAssert
(
head
!=
NULL
);
// Walk the list copying all nodes
for
(
entry
=
head
->
OptimizationCollection
;
entry
!=
NULL
;
entry
=
entry
->
Next
)
{
_cmsOptimizationCollection
*
newEntry
=
(
_cmsOptimizationCollection
*
)
_cmsSubAllocDup
(
ctx
->
MemPool
,
entry
,
sizeof
(
_cmsOptimizationCollection
));
if
(
newEntry
==
NULL
)
return
;
// We want to keep the linked list order, so this is a little bit tricky
newEntry
->
Next
=
NULL
;
if
(
Anterior
)
Anterior
->
Next
=
newEntry
;
Anterior
=
newEntry
;
if
(
newHead
.
OptimizationCollection
==
NULL
)
newHead
.
OptimizationCollection
=
newEntry
;
}
ctx
->
chunks
[
OptimizationPlugin
]
=
_cmsSubAllocDup
(
ctx
->
MemPool
,
&
newHead
,
sizeof
(
_cmsOptimizationPluginChunkType
));
}
void
_cmsAllocOptimizationPluginChunk
(
struct
_cmsContext_struct
*
ctx
,
const
struct
_cmsContext_struct
*
src
)
{
if
(
src
!=
NULL
)
{
// Copy all linked list
DupPluginOptimizationList
(
ctx
,
src
);
}
else
{
static
_cmsOptimizationPluginChunkType
OptimizationPluginChunkType
=
{
NULL
};
ctx
->
chunks
[
OptimizationPlugin
]
=
_cmsSubAllocDup
(
ctx
->
MemPool
,
&
OptimizationPluginChunkType
,
sizeof
(
_cmsOptimizationPluginChunkType
));
}
}
// Register new ways to optimize
cmsBool
_cmsRegisterOptimizationPlugin
(
cmsContext
id
,
cmsPluginBase
*
Data
)
cmsBool
_cmsRegisterOptimizationPlugin
(
cmsContext
ContextID
,
cmsPluginBase
*
Data
)
{
cmsPluginOptimization
*
Plugin
=
(
cmsPluginOptimization
*
)
Data
;
_cmsOptimizationPluginChunkType
*
ctx
=
(
_cmsOptimizationPluginChunkType
*
)
_cmsContextGetClientChunk
(
ContextID
,
OptimizationPlugin
);
_cmsOptimizationCollection
*
fl
;
if
(
Data
==
NULL
)
{
OptimizationCollection
=
DefaultOptimization
;
ctx
->
OptimizationCollection
=
NULL
;
return
TRUE
;
}
// Optimizer callback is required
if
(
Plugin
->
OptimizePtr
==
NULL
)
return
FALSE
;
fl
=
(
_cmsOptimizationCollection
*
)
_cmsPluginMalloc
(
id
,
sizeof
(
_cmsOptimizationCollection
));
fl
=
(
_cmsOptimizationCollection
*
)
_cmsPluginMalloc
(
ContextID
,
sizeof
(
_cmsOptimizationCollection
));
if
(
fl
==
NULL
)
return
FALSE
;
// Copy the parameters
fl
->
OptimizePtr
=
Plugin
->
OptimizePtr
;
// Keep linked list
fl
->
Next
=
OptimizationCollection
;
OptimizationCollection
=
fl
;
fl
->
Next
=
ctx
->
OptimizationCollection
;
// Set the head
ctx
->
OptimizationCollection
=
fl
;
// All is ok
return
TRUE
;
}
// The entry point for LUT optimization
cmsBool
_cmsOptimizePipeline
(
cmsPipeline
**
PtrLut
,
cmsBool
_cmsOptimizePipeline
(
cmsContext
ContextID
,
cmsPipeline
**
PtrLut
,
int
Intent
,
cmsUInt32Number
*
InputFormat
,
cmsUInt32Number
*
OutputFormat
,
cmsUInt32Number
*
dwFlags
)
{
_cmsOptimizationPluginChunkType
*
ctx
=
(
_cmsOptimizationPluginChunkType
*
)
_cmsContextGetClientChunk
(
ContextID
,
OptimizationPlugin
);
_cmsOptimizationCollection
*
Opts
;
cmsBool
AnySuccess
=
FALSE
;
...
...
@@ -1733,8 +1793,8 @@ cmsBool _cmsOptimizePipeline(cmsPipeline** PtrLut,
if
(
*
dwFlags
&
cmsFLAGS_NOOPTIMIZE
)
return
FALSE
;
// Try
built-in optimizations and plug-in
for
(
Opts
=
OptimizationCollection
;
// Try
plug-in optimizations
for
(
Opts
=
ctx
->
OptimizationCollection
;
Opts
!=
NULL
;
Opts
=
Opts
->
Next
)
{
...
...
@@ -1745,6 +1805,17 @@ cmsBool _cmsOptimizePipeline(cmsPipeline** PtrLut,
}
}
// Try built-in optimizations
for
(
Opts
=
DefaultOptimization
;
Opts
!=
NULL
;
Opts
=
Opts
->
Next
)
{
if
(
Opts
->
OptimizePtr
(
PtrLut
,
Intent
,
InputFormat
,
OutputFormat
,
dwFlags
))
{
return
TRUE
;
}
}
// Only simple optimizations succeeded
return
AnySuccess
;
}
...
...
src/share/native/sun/java2d/cmm/lcms/cmspack.c
浏览文件 @
4352a351
...
...
@@ -883,6 +883,42 @@ cmsUInt8Number* UnrollXYZDoubleTo16(register _cmsTRANSFORM* info,
}
}
// This is a conversion of XYZ float to 16 bits
static
cmsUInt8Number
*
UnrollXYZFloatTo16
(
register
_cmsTRANSFORM
*
info
,
register
cmsUInt16Number
wIn
[],
register
cmsUInt8Number
*
accum
,
register
cmsUInt32Number
Stride
)
{
if
(
T_PLANAR
(
info
->
InputFormat
))
{
cmsFloat32Number
*
Pt
=
(
cmsFloat32Number
*
)
accum
;
cmsCIEXYZ
XYZ
;
XYZ
.
X
=
Pt
[
0
];
XYZ
.
Y
=
Pt
[
Stride
];
XYZ
.
Z
=
Pt
[
Stride
*
2
];
cmsFloat2XYZEncoded
(
wIn
,
&
XYZ
);
return
accum
+
sizeof
(
cmsFloat32Number
);
}
else
{
cmsFloat32Number
*
Pt
=
(
cmsFloat32Number
*
)
accum
;
cmsCIEXYZ
XYZ
;
XYZ
.
X
=
Pt
[
0
];
XYZ
.
Y
=
Pt
[
1
];
XYZ
.
Z
=
Pt
[
2
];
cmsFloat2XYZEncoded
(
wIn
,
&
XYZ
);
accum
+=
3
*
sizeof
(
cmsFloat32Number
)
+
T_EXTRA
(
info
->
InputFormat
)
*
sizeof
(
cmsFloat32Number
);
return
accum
;
}
}
// Check if space is marked as ink
cmsINLINE
cmsBool
IsInkSpace
(
cmsUInt32Number
Type
)
{
...
...
@@ -2333,6 +2369,39 @@ cmsUInt8Number* PackXYZDoubleFrom16(register _cmsTRANSFORM* Info,
}
}
static
cmsUInt8Number
*
PackXYZFloatFrom16
(
register
_cmsTRANSFORM
*
Info
,
register
cmsUInt16Number
wOut
[],
register
cmsUInt8Number
*
output
,
register
cmsUInt32Number
Stride
)
{
if
(
T_PLANAR
(
Info
->
OutputFormat
))
{
cmsCIEXYZ
XYZ
;
cmsFloat32Number
*
Out
=
(
cmsFloat32Number
*
)
output
;
cmsXYZEncoded2Float
(
&
XYZ
,
wOut
);
Out
[
0
]
=
(
cmsFloat32Number
)
XYZ
.
X
;
Out
[
Stride
]
=
(
cmsFloat32Number
)
XYZ
.
Y
;
Out
[
Stride
*
2
]
=
(
cmsFloat32Number
)
XYZ
.
Z
;
return
output
+
sizeof
(
cmsFloat32Number
);
}
else
{
cmsCIEXYZ
XYZ
;
cmsFloat32Number
*
Out
=
(
cmsFloat32Number
*
)
output
;
cmsXYZEncoded2Float
(
&
XYZ
,
wOut
);
Out
[
0
]
=
(
cmsFloat32Number
)
XYZ
.
X
;
Out
[
1
]
=
(
cmsFloat32Number
)
XYZ
.
Y
;
Out
[
2
]
=
(
cmsFloat32Number
)
XYZ
.
Z
;
return
output
+
(
3
*
sizeof
(
cmsFloat32Number
)
+
T_EXTRA
(
Info
->
OutputFormat
)
*
sizeof
(
cmsFloat32Number
));
}
}
static
cmsUInt8Number
*
PackDoubleFrom16
(
register
_cmsTRANSFORM
*
info
,
register
cmsUInt16Number
wOut
[],
...
...
@@ -2893,6 +2962,7 @@ static cmsFormatters16 InputFormatters16[] = {
{
TYPE_Lab_DBL
,
ANYPLANAR
|
ANYEXTRA
,
UnrollLabDoubleTo16
},
{
TYPE_XYZ_DBL
,
ANYPLANAR
|
ANYEXTRA
,
UnrollXYZDoubleTo16
},
{
TYPE_Lab_FLT
,
ANYPLANAR
|
ANYEXTRA
,
UnrollLabFloatTo16
},
{
TYPE_XYZ_FLT
,
ANYPLANAR
|
ANYEXTRA
,
UnrollXYZFloatTo16
},
{
TYPE_GRAY_DBL
,
0
,
UnrollDouble1Chan
},
{
FLOAT_SH
(
1
)
|
BYTES_SH
(
0
),
ANYCHANNELS
|
ANYPLANAR
|
ANYSWAPFIRST
|
ANYFLAVOR
|
ANYSWAP
|
ANYEXTRA
|
ANYSPACE
,
UnrollDoubleTo16
},
...
...
@@ -3027,6 +3097,7 @@ static cmsFormatters16 OutputFormatters16[] = {
{
TYPE_XYZ_DBL
,
ANYPLANAR
|
ANYEXTRA
,
PackXYZDoubleFrom16
},
{
TYPE_Lab_FLT
,
ANYPLANAR
|
ANYEXTRA
,
PackLabFloatFrom16
},
{
TYPE_XYZ_FLT
,
ANYPLANAR
|
ANYEXTRA
,
PackXYZFloatFrom16
},
{
FLOAT_SH
(
1
)
|
BYTES_SH
(
0
),
ANYFLAVOR
|
ANYSWAPFIRST
|
ANYSWAP
|
ANYCHANNELS
|
ANYPLANAR
|
ANYEXTRA
|
ANYSPACE
,
PackDoubleFrom16
},
...
...
@@ -3182,40 +3253,98 @@ typedef struct _cms_formatters_factory_list {
}
cmsFormattersFactoryList
;
static
cmsFormattersFactoryList
*
FactoryList
=
NULL
;
_cmsFormattersPluginChunkType
_cmsFormattersPluginChunk
=
{
NULL
};
// Duplicates the zone of memory used by the plug-in in the new context
static
void
DupFormatterFactoryList
(
struct
_cmsContext_struct
*
ctx
,
const
struct
_cmsContext_struct
*
src
)
{
_cmsFormattersPluginChunkType
newHead
=
{
NULL
};
cmsFormattersFactoryList
*
entry
;
cmsFormattersFactoryList
*
Anterior
=
NULL
;
_cmsFormattersPluginChunkType
*
head
=
(
_cmsFormattersPluginChunkType
*
)
src
->
chunks
[
FormattersPlugin
];
_cmsAssert
(
head
!=
NULL
);
// Walk the list copying all nodes
for
(
entry
=
head
->
FactoryList
;
entry
!=
NULL
;
entry
=
entry
->
Next
)
{
cmsFormattersFactoryList
*
newEntry
=
(
cmsFormattersFactoryList
*
)
_cmsSubAllocDup
(
ctx
->
MemPool
,
entry
,
sizeof
(
cmsFormattersFactoryList
));
if
(
newEntry
==
NULL
)
return
;
// We want to keep the linked list order, so this is a little bit tricky
newEntry
->
Next
=
NULL
;
if
(
Anterior
)
Anterior
->
Next
=
newEntry
;
Anterior
=
newEntry
;
if
(
newHead
.
FactoryList
==
NULL
)
newHead
.
FactoryList
=
newEntry
;
}
ctx
->
chunks
[
FormattersPlugin
]
=
_cmsSubAllocDup
(
ctx
->
MemPool
,
&
newHead
,
sizeof
(
_cmsFormattersPluginChunkType
));
}
// The interpolation plug-in memory chunk allocator/dup
void
_cmsAllocFormattersPluginChunk
(
struct
_cmsContext_struct
*
ctx
,
const
struct
_cmsContext_struct
*
src
)
{
_cmsAssert
(
ctx
!=
NULL
);
if
(
src
!=
NULL
)
{
// Duplicate the LIST
DupFormatterFactoryList
(
ctx
,
src
);
}
else
{
static
_cmsFormattersPluginChunkType
FormattersPluginChunk
=
{
NULL
};
ctx
->
chunks
[
FormattersPlugin
]
=
_cmsSubAllocDup
(
ctx
->
MemPool
,
&
FormattersPluginChunk
,
sizeof
(
_cmsFormattersPluginChunkType
));
}
}
// Formatters management
cmsBool
_cmsRegisterFormattersPlugin
(
cmsContext
id
,
cmsPluginBase
*
Data
)
cmsBool
_cmsRegisterFormattersPlugin
(
cmsContext
ContextID
,
cmsPluginBase
*
Data
)
{
_cmsFormattersPluginChunkType
*
ctx
=
(
_cmsFormattersPluginChunkType
*
)
_cmsContextGetClientChunk
(
ContextID
,
FormattersPlugin
);
cmsPluginFormatters
*
Plugin
=
(
cmsPluginFormatters
*
)
Data
;
cmsFormattersFactoryList
*
fl
;
// Reset
// Reset
to built-in defaults
if
(
Data
==
NULL
)
{
FactoryList
=
NULL
;
ctx
->
FactoryList
=
NULL
;
return
TRUE
;
}
fl
=
(
cmsFormattersFactoryList
*
)
_cmsPluginMalloc
(
id
,
sizeof
(
cmsFormattersFactoryList
));
fl
=
(
cmsFormattersFactoryList
*
)
_cmsPluginMalloc
(
ContextID
,
sizeof
(
cmsFormattersFactoryList
));
if
(
fl
==
NULL
)
return
FALSE
;
fl
->
Factory
=
Plugin
->
FormattersFactory
;
fl
->
Next
=
FactoryList
;
FactoryList
=
fl
;
fl
->
Next
=
ctx
->
FactoryList
;
ctx
->
FactoryList
=
fl
;
return
TRUE
;
}
cmsFormatter
_cmsGetFormatter
(
cmsUInt32Number
Type
,
// Specific type, i.e. TYPE_RGB_8
cmsFormatter
_cmsGetFormatter
(
cmsContext
ContextID
,
cmsUInt32Number
Type
,
// Specific type, i.e. TYPE_RGB_8
cmsFormatterDirection
Dir
,
cmsUInt32Number
dwFlags
)
{
_cmsFormattersPluginChunkType
*
ctx
=
(
_cmsFormattersPluginChunkType
*
)
_cmsContextGetClientChunk
(
ContextID
,
FormattersPlugin
);
cmsFormattersFactoryList
*
f
;
for
(
f
=
FactoryList
;
f
!=
NULL
;
f
=
f
->
Next
)
{
for
(
f
=
ctx
->
FactoryList
;
f
!=
NULL
;
f
=
f
->
Next
)
{
cmsFormatter
fn
=
f
->
Factory
(
Type
,
Dir
,
dwFlags
);
if
(
fn
.
Fmt16
!=
NULL
)
return
fn
;
...
...
src/share/native/sun/java2d/cmm/lcms/cmsplugin.c
浏览文件 @
4352a351
...
...
@@ -544,22 +544,31 @@ cmsBool CMSEXPORT _cmsIOPrintf(cmsIOHANDLER* io, const char* frm, ...)
// Plugin memory management -------------------------------------------------------------------------------------------------
static
_cmsSubAllocator
*
PluginPool
=
NULL
;
// Specialized malloc for plug-ins, that is freed upon exit.
void
*
_cmsPluginMalloc
(
cmsContext
id
,
cmsUInt32Number
size
)
void
*
_cmsPluginMalloc
(
cmsContext
ContextID
,
cmsUInt32Number
size
)
{
if
(
PluginPool
==
NULL
)
PluginPool
=
_cmsCreateSubAlloc
(
id
,
4
*
1024
);
struct
_cmsContext_struct
*
ctx
=
_cmsGetContext
(
ContextID
);
if
(
ctx
->
MemPool
==
NULL
)
{
if
(
ContextID
==
NULL
)
{
ctx
->
MemPool
=
_cmsCreateSubAlloc
(
0
,
2
*
1024
);
}
else
{
cmsSignalError
(
ContextID
,
cmsERROR_CORRUPTION_DETECTED
,
"NULL memory pool on context"
);
return
NULL
;
}
}
return
_cmsSubAlloc
(
Plugin
Pool
,
size
);
return
_cmsSubAlloc
(
ctx
->
Mem
Pool
,
size
);
}
// Main plug-in dispatcher
cmsBool
CMSEXPORT
cmsPlugin
(
void
*
Plug_in
)
{
return
cmsPluginTHR
(
NULL
,
Plug_in
);
return
cmsPluginTHR
(
NULL
,
Plug_in
);
}
cmsBool
CMSEXPORT
cmsPluginTHR
(
cmsContext
id
,
void
*
Plug_in
)
...
...
@@ -571,12 +580,12 @@ cmsBool CMSEXPORT cmsPluginTHR(cmsContext id, void* Plug_in)
Plugin
=
Plugin
->
Next
)
{
if
(
Plugin
->
Magic
!=
cmsPluginMagicNumber
)
{
cmsSignalError
(
0
,
cmsERROR_UNKNOWN_EXTENSION
,
"Unrecognized plugin"
);
cmsSignalError
(
id
,
cmsERROR_UNKNOWN_EXTENSION
,
"Unrecognized plugin"
);
return
FALSE
;
}
if
(
Plugin
->
ExpectedVersion
>
LCMS_VERSION
)
{
cmsSignalError
(
0
,
cmsERROR_UNKNOWN_EXTENSION
,
"plugin needs Little CMS %d, current
version is %d"
,
cmsSignalError
(
id
,
cmsERROR_UNKNOWN_EXTENSION
,
"plugin needs Little CMS %d, current
version is %d"
,
Plugin
->
ExpectedVersion
,
LCMS_VERSION
);
return
FALSE
;
}
...
...
@@ -584,11 +593,11 @@ cmsBool CMSEXPORT cmsPluginTHR(cmsContext id, void* Plug_in)
switch
(
Plugin
->
Type
)
{
case
cmsPluginMemHandlerSig
:
if
(
!
_cmsRegisterMemHandlerPlugin
(
Plugin
))
return
FALSE
;
if
(
!
_cmsRegisterMemHandlerPlugin
(
id
,
Plugin
))
return
FALSE
;
break
;
case
cmsPluginInterpolationSig
:
if
(
!
_cmsRegisterInterpPlugin
(
Plugin
))
return
FALSE
;
if
(
!
_cmsRegisterInterpPlugin
(
id
,
Plugin
))
return
FALSE
;
break
;
case
cmsPluginTagTypeSig
:
...
...
@@ -623,8 +632,12 @@ cmsBool CMSEXPORT cmsPluginTHR(cmsContext id, void* Plug_in)
if
(
!
_cmsRegisterTransformPlugin
(
id
,
Plugin
))
return
FALSE
;
break
;
case
cmsPluginMutexSig
:
if
(
!
_cmsRegisterMutexPlugin
(
id
,
Plugin
))
return
FALSE
;
break
;
default:
cmsSignalError
(
0
,
cmsERROR_UNKNOWN_EXTENSION
,
"Unrecognized plugin type '%X'"
,
Plugin
->
Type
);
cmsSignalError
(
id
,
cmsERROR_UNKNOWN_EXTENSION
,
"Unrecognized plugin type '%X'"
,
Plugin
->
Type
);
return
FALSE
;
}
}
...
...
@@ -637,19 +650,337 @@ cmsBool CMSEXPORT cmsPluginTHR(cmsContext id, void* Plug_in)
// Revert all plug-ins to default
void
CMSEXPORT
cmsUnregisterPlugins
(
void
)
{
_cmsRegisterMemHandlerPlugin
(
NULL
);
_cmsRegisterInterpPlugin
(
NULL
);
_cmsRegisterTagTypePlugin
(
NULL
,
NULL
);
_cmsRegisterTagPlugin
(
NULL
,
NULL
);
_cmsRegisterFormattersPlugin
(
NULL
,
NULL
);
_cmsRegisterRenderingIntentPlugin
(
NULL
,
NULL
);
_cmsRegisterParametricCurvesPlugin
(
NULL
,
NULL
);
_cmsRegisterMultiProcessElementPlugin
(
NULL
,
NULL
);
_cmsRegisterOptimizationPlugin
(
NULL
,
NULL
);
_cmsRegisterTransformPlugin
(
NULL
,
NULL
);
cmsUnregisterPluginsTHR
(
NULL
);
}
// The Global storage for system context. This is the one and only global variable
// pointers structure. All global vars are referenced here.
static
struct
_cmsContext_struct
globalContext
=
{
NULL
,
// Not in the linked list
NULL
,
// No suballocator
{
NULL
,
// UserPtr,
&
_cmsLogErrorChunk
,
// Logger,
&
_cmsAlarmCodesChunk
,
// AlarmCodes,
&
_cmsAdaptationStateChunk
,
// AdaptationState,
&
_cmsMemPluginChunk
,
// MemPlugin,
&
_cmsInterpPluginChunk
,
// InterpPlugin,
&
_cmsCurvesPluginChunk
,
// CurvesPlugin,
&
_cmsFormattersPluginChunk
,
// FormattersPlugin,
&
_cmsTagTypePluginChunk
,
// TagTypePlugin,
&
_cmsTagPluginChunk
,
// TagPlugin,
&
_cmsIntentsPluginChunk
,
// IntentPlugin,
&
_cmsMPETypePluginChunk
,
// MPEPlugin,
&
_cmsOptimizationPluginChunk
,
// OptimizationPlugin,
&
_cmsTransformPluginChunk
,
// TransformPlugin,
&
_cmsMutexPluginChunk
// MutexPlugin
},
{
NULL
,
NULL
,
NULL
,
NULL
,
NULL
,
NULL
}
// The default memory allocator is not used for context 0
};
if
(
PluginPool
!=
NULL
)
_cmsSubAllocDestroy
(
PluginPool
);
PluginPool
=
NULL
;
// The context pool (linked list head)
static
_cmsMutex
_cmsContextPoolHeadMutex
=
CMS_MUTEX_INITIALIZER
;
static
struct
_cmsContext_struct
*
_cmsContextPoolHead
=
NULL
;
// Internal, get associated pointer, with guessing. Never returns NULL.
struct
_cmsContext_struct
*
_cmsGetContext
(
cmsContext
ContextID
)
{
struct
_cmsContext_struct
*
id
=
(
struct
_cmsContext_struct
*
)
ContextID
;
struct
_cmsContext_struct
*
ctx
;
// On 0, use global settings
if
(
id
==
NULL
)
return
&
globalContext
;
// Search
for
(
ctx
=
_cmsContextPoolHead
;
ctx
!=
NULL
;
ctx
=
ctx
->
Next
)
{
// Found it?
if
(
id
==
ctx
)
return
ctx
;
// New-style context,
}
return
&
globalContext
;
}
// Internal: get the memory area associanted with each context client
// Returns the block assigned to the specific zone.
void
*
_cmsContextGetClientChunk
(
cmsContext
ContextID
,
_cmsMemoryClient
mc
)
{
struct
_cmsContext_struct
*
ctx
;
void
*
ptr
;
if
(
mc
<
0
||
mc
>=
MemoryClientMax
)
{
cmsSignalError
(
ContextID
,
cmsERROR_RANGE
,
"Bad context client"
);
return
NULL
;
}
ctx
=
_cmsGetContext
(
ContextID
);
ptr
=
ctx
->
chunks
[
mc
];
if
(
ptr
!=
NULL
)
return
ptr
;
// A null ptr means no special settings for that context, and this
// reverts to Context0 globals
return
globalContext
.
chunks
[
mc
];
}
// This function returns the given context its default pristine state,
// as no plug-ins were declared. There is no way to unregister a single
// plug-in, as a single call to cmsPluginTHR() function may register
// many different plug-ins simultaneously, then there is no way to
// identify which plug-in to unregister.
void
CMSEXPORT
cmsUnregisterPluginsTHR
(
cmsContext
ContextID
)
{
_cmsRegisterMemHandlerPlugin
(
ContextID
,
NULL
);
_cmsRegisterInterpPlugin
(
ContextID
,
NULL
);
_cmsRegisterTagTypePlugin
(
ContextID
,
NULL
);
_cmsRegisterTagPlugin
(
ContextID
,
NULL
);
_cmsRegisterFormattersPlugin
(
ContextID
,
NULL
);
_cmsRegisterRenderingIntentPlugin
(
ContextID
,
NULL
);
_cmsRegisterParametricCurvesPlugin
(
ContextID
,
NULL
);
_cmsRegisterMultiProcessElementPlugin
(
ContextID
,
NULL
);
_cmsRegisterOptimizationPlugin
(
ContextID
,
NULL
);
_cmsRegisterTransformPlugin
(
ContextID
,
NULL
);
_cmsRegisterMutexPlugin
(
ContextID
,
NULL
);
}
// Returns the memory manager plug-in, if any, from the Plug-in bundle
static
cmsPluginMemHandler
*
_cmsFindMemoryPlugin
(
void
*
PluginBundle
)
{
cmsPluginBase
*
Plugin
;
for
(
Plugin
=
(
cmsPluginBase
*
)
PluginBundle
;
Plugin
!=
NULL
;
Plugin
=
Plugin
->
Next
)
{
if
(
Plugin
->
Magic
==
cmsPluginMagicNumber
&&
Plugin
->
ExpectedVersion
<=
LCMS_VERSION
&&
Plugin
->
Type
==
cmsPluginMemHandlerSig
)
{
// Found!
return
(
cmsPluginMemHandler
*
)
Plugin
;
}
}
// Nope, revert to defaults
return
NULL
;
}
// Creates a new context with optional associated plug-ins. Caller may also specify an optional pointer to user-defined
// data that will be forwarded to plug-ins and logger.
cmsContext
CMSEXPORT
cmsCreateContext
(
void
*
Plugin
,
void
*
UserData
)
{
struct
_cmsContext_struct
*
ctx
;
struct
_cmsContext_struct
fakeContext
;
_cmsInstallAllocFunctions
(
_cmsFindMemoryPlugin
(
Plugin
),
&
fakeContext
.
DefaultMemoryManager
);
fakeContext
.
chunks
[
UserPtr
]
=
UserData
;
fakeContext
.
chunks
[
MemPlugin
]
=
&
fakeContext
.
DefaultMemoryManager
;
// Create the context structure.
ctx
=
(
struct
_cmsContext_struct
*
)
_cmsMalloc
(
&
fakeContext
,
sizeof
(
struct
_cmsContext_struct
));
if
(
ctx
==
NULL
)
return
NULL
;
// Something very wrong happened!
// Init the structure and the memory manager
memset
(
ctx
,
0
,
sizeof
(
struct
_cmsContext_struct
));
// Keep memory manager
memcpy
(
&
ctx
->
DefaultMemoryManager
,
&
fakeContext
.
DefaultMemoryManager
,
sizeof
(
_cmsMemPluginChunk
));
// Maintain the linked list (with proper locking)
_cmsEnterCriticalSectionPrimitive
(
&
_cmsContextPoolHeadMutex
);
ctx
->
Next
=
_cmsContextPoolHead
;
_cmsContextPoolHead
=
ctx
;
_cmsLeaveCriticalSectionPrimitive
(
&
_cmsContextPoolHeadMutex
);
ctx
->
chunks
[
UserPtr
]
=
UserData
;
ctx
->
chunks
[
MemPlugin
]
=
&
ctx
->
DefaultMemoryManager
;
// Now we can allocate the pool by using default memory manager
ctx
->
MemPool
=
_cmsCreateSubAlloc
(
ctx
,
22
*
sizeof
(
void
*
));
// default size about 32 pointers
if
(
ctx
->
MemPool
==
NULL
)
{
cmsDeleteContext
(
ctx
);
return
NULL
;
}
_cmsAllocLogErrorChunk
(
ctx
,
NULL
);
_cmsAllocAlarmCodesChunk
(
ctx
,
NULL
);
_cmsAllocAdaptationStateChunk
(
ctx
,
NULL
);
_cmsAllocMemPluginChunk
(
ctx
,
NULL
);
_cmsAllocInterpPluginChunk
(
ctx
,
NULL
);
_cmsAllocCurvesPluginChunk
(
ctx
,
NULL
);
_cmsAllocFormattersPluginChunk
(
ctx
,
NULL
);
_cmsAllocTagTypePluginChunk
(
ctx
,
NULL
);
_cmsAllocMPETypePluginChunk
(
ctx
,
NULL
);
_cmsAllocTagPluginChunk
(
ctx
,
NULL
);
_cmsAllocIntentsPluginChunk
(
ctx
,
NULL
);
_cmsAllocOptimizationPluginChunk
(
ctx
,
NULL
);
_cmsAllocTransformPluginChunk
(
ctx
,
NULL
);
_cmsAllocMutexPluginChunk
(
ctx
,
NULL
);
// Setup the plug-ins
if
(
!
cmsPluginTHR
(
ctx
,
Plugin
))
{
cmsDeleteContext
(
ctx
);
return
NULL
;
}
return
(
cmsContext
)
ctx
;
}
// Duplicates a context with all associated plug-ins.
// Caller may specify an optional pointer to user-defined
// data that will be forwarded to plug-ins and logger.
cmsContext
CMSEXPORT
cmsDupContext
(
cmsContext
ContextID
,
void
*
NewUserData
)
{
int
i
;
struct
_cmsContext_struct
*
ctx
;
const
struct
_cmsContext_struct
*
src
=
_cmsGetContext
(
ContextID
);
void
*
userData
=
(
NewUserData
!=
NULL
)
?
NewUserData
:
src
->
chunks
[
UserPtr
];
ctx
=
(
struct
_cmsContext_struct
*
)
_cmsMalloc
(
ContextID
,
sizeof
(
struct
_cmsContext_struct
));
if
(
ctx
==
NULL
)
return
NULL
;
// Something very wrong happened
// Setup default memory allocators
memcpy
(
&
ctx
->
DefaultMemoryManager
,
&
src
->
DefaultMemoryManager
,
sizeof
(
ctx
->
DefaultMemoryManager
));
// Maintain the linked list
_cmsEnterCriticalSectionPrimitive
(
&
_cmsContextPoolHeadMutex
);
ctx
->
Next
=
_cmsContextPoolHead
;
_cmsContextPoolHead
=
ctx
;
_cmsLeaveCriticalSectionPrimitive
(
&
_cmsContextPoolHeadMutex
);
ctx
->
chunks
[
UserPtr
]
=
userData
;
ctx
->
chunks
[
MemPlugin
]
=
&
ctx
->
DefaultMemoryManager
;
ctx
->
MemPool
=
_cmsCreateSubAlloc
(
ctx
,
22
*
sizeof
(
void
*
));
if
(
ctx
->
MemPool
==
NULL
)
{
cmsDeleteContext
(
ctx
);
return
NULL
;
}
// Allocate all required chunks.
_cmsAllocLogErrorChunk
(
ctx
,
src
);
_cmsAllocAlarmCodesChunk
(
ctx
,
src
);
_cmsAllocAdaptationStateChunk
(
ctx
,
src
);
_cmsAllocMemPluginChunk
(
ctx
,
src
);
_cmsAllocInterpPluginChunk
(
ctx
,
src
);
_cmsAllocCurvesPluginChunk
(
ctx
,
src
);
_cmsAllocFormattersPluginChunk
(
ctx
,
src
);
_cmsAllocTagTypePluginChunk
(
ctx
,
src
);
_cmsAllocMPETypePluginChunk
(
ctx
,
src
);
_cmsAllocTagPluginChunk
(
ctx
,
src
);
_cmsAllocIntentsPluginChunk
(
ctx
,
src
);
_cmsAllocOptimizationPluginChunk
(
ctx
,
src
);
_cmsAllocTransformPluginChunk
(
ctx
,
src
);
_cmsAllocMutexPluginChunk
(
ctx
,
src
);
// Make sure no one failed
for
(
i
=
Logger
;
i
<
MemoryClientMax
;
i
++
)
{
if
(
src
->
chunks
[
i
]
==
NULL
)
{
cmsDeleteContext
((
cmsContext
)
ctx
);
return
NULL
;
}
}
return
(
cmsContext
)
ctx
;
}
static
struct
_cmsContext_struct
*
FindPrev
(
struct
_cmsContext_struct
*
id
)
{
struct
_cmsContext_struct
*
prev
;
// Search for previous
for
(
prev
=
_cmsContextPoolHead
;
prev
!=
NULL
;
prev
=
prev
->
Next
)
{
if
(
prev
->
Next
==
id
)
return
prev
;
}
return
NULL
;
// List is empty or only one element!
}
// Frees any resources associated with the given context,
// and destroys the context placeholder.
// The ContextID can no longer be used in any THR operation.
void
CMSEXPORT
cmsDeleteContext
(
cmsContext
ContextID
)
{
if
(
ContextID
!=
NULL
)
{
struct
_cmsContext_struct
*
ctx
=
(
struct
_cmsContext_struct
*
)
ContextID
;
struct
_cmsContext_struct
fakeContext
;
struct
_cmsContext_struct
*
prev
;
memcpy
(
&
fakeContext
.
DefaultMemoryManager
,
&
ctx
->
DefaultMemoryManager
,
sizeof
(
ctx
->
DefaultMemoryManager
));
fakeContext
.
chunks
[
UserPtr
]
=
ctx
->
chunks
[
UserPtr
];
fakeContext
.
chunks
[
MemPlugin
]
=
&
fakeContext
.
DefaultMemoryManager
;
// Get rid of plugins
cmsUnregisterPluginsTHR
(
ContextID
);
// Since all memory is allocated in the private pool, all what we need to do is destroy the pool
if
(
ctx
->
MemPool
!=
NULL
)
_cmsSubAllocDestroy
(
ctx
->
MemPool
);
ctx
->
MemPool
=
NULL
;
// Maintain list
_cmsEnterCriticalSectionPrimitive
(
&
_cmsContextPoolHeadMutex
);
if
(
_cmsContextPoolHead
==
ctx
)
{
_cmsContextPoolHead
=
ctx
->
Next
;
}
else
{
// Search for previous
for
(
prev
=
_cmsContextPoolHead
;
prev
!=
NULL
;
prev
=
prev
->
Next
)
{
if
(
prev
->
Next
==
ctx
)
{
prev
->
Next
=
ctx
->
Next
;
break
;
}
}
}
_cmsLeaveCriticalSectionPrimitive
(
&
_cmsContextPoolHeadMutex
);
// free the memory block itself
_cmsFree
(
&
fakeContext
,
ctx
);
}
}
// Returns the user data associated to the given ContextID, or NULL if no user data was attached on context creation
void
*
CMSEXPORT
cmsGetContextUserData
(
cmsContext
ContextID
)
{
return
_cmsContextGetClientChunk
(
ContextID
,
UserPtr
);
}
src/share/native/sun/java2d/cmm/lcms/cmsps2.c
浏览文件 @
4352a351
...
...
@@ -942,7 +942,7 @@ int WriteInputLUT(cmsIOHANDLER* m, cmsHPROFILE hProfile, int Intent, cmsUInt32Nu
if
(
DeviceLink
==
NULL
)
return
0
;
dwFlags
|=
cmsFLAGS_FORCE_CLUT
;
_cmsOptimizePipeline
(
&
DeviceLink
,
Intent
,
&
InputFormat
,
&
OutFrm
,
&
dwFlags
);
_cmsOptimizePipeline
(
m
->
ContextID
,
&
DeviceLink
,
Intent
,
&
InputFormat
,
&
OutFrm
,
&
dwFlags
);
rc
=
EmitCIEBasedDEF
(
m
,
DeviceLink
,
Intent
,
&
BlackPointAdaptedToD50
);
cmsPipelineFree
(
DeviceLink
);
...
...
@@ -1359,7 +1359,7 @@ int WriteOutputLUT(cmsIOHANDLER* m, cmsHPROFILE hProfile, int Intent, cmsUInt32N
// We need a CLUT
dwFlags
|=
cmsFLAGS_FORCE_CLUT
;
_cmsOptimizePipeline
(
&
DeviceLink
,
RelativeEncodingIntent
,
&
InFrm
,
&
OutputFormat
,
&
dwFlags
);
_cmsOptimizePipeline
(
m
->
ContextID
,
&
DeviceLink
,
RelativeEncodingIntent
,
&
InFrm
,
&
OutputFormat
,
&
dwFlags
);
_cmsIOPrintf
(
m
,
"<<
\n
"
);
_cmsIOPrintf
(
m
,
"/ColorRenderingType 1
\n
"
);
...
...
src/share/native/sun/java2d/cmm/lcms/cmstypes.c
浏览文件 @
4352a351
...
...
@@ -30,7 +30,7 @@
//---------------------------------------------------------------------------------
//
// Little Color Management System
// Copyright (c) 1998-201
1
Marti Maria Saguer
// Copyright (c) 1998-201
4
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"),
...
...
@@ -61,7 +61,7 @@
// are no profiles holding them. The programmer can also extend this list by defining his own types
// by using the appropiate plug-in. There are three types of plug ins regarding that. First type
// allows to define new tags using any existing type. Next plug-in type allows to define new types
// and the third one is very specific: allows to extend the number of elements in the multipro
file
// and the third one is very specific: allows to extend the number of elements in the multipro
cessing
// elements special type.
//--------------------------------------------------------------------------------------------------
...
...
@@ -89,54 +89,49 @@ typedef struct _cmsTagTypeLinkedList_st {
// Helper macro to define a MPE handler. Callbacks do have a fixed naming convention
#define TYPE_MPE_HANDLER(t, x) { (t), READ_FN(x), WRITE_FN(x), GenericMPEdup, GenericMPEfree, NULL, 0 }
// Register a new type handler. This routine is shared between normal types and MPE
// Register a new type handler. This routine is shared between normal types and MPE
. LinkedList points to the optional list head
static
cmsBool
RegisterTypesPlugin
(
cmsContext
id
,
cmsPluginBase
*
Data
,
_cms
TagTypeLinkedList
*
LinkedList
,
cmsUInt32Number
DefaultListCount
)
cmsBool
RegisterTypesPlugin
(
cmsContext
id
,
cmsPluginBase
*
Data
,
_cms
MemoryClient
pos
)
{
cmsPluginTagType
*
Plugin
=
(
cmsPluginTagType
*
)
Data
;
_cmsTagTypeLinkedList
*
pt
,
*
Anterior
=
NULL
;
_cmsTagTypePluginChunkType
*
ctx
=
(
_cmsTagTypePluginChunkType
*
)
_cmsContextGetClientChunk
(
id
,
pos
);
_cmsTagTypeLinkedList
*
pt
;
// Calling the function with NULL as plug-in would unregister the plug in.
if
(
Data
==
NULL
)
{
LinkedList
[
DefaultListCount
-
1
].
Next
=
NULL
;
// There is no need to set free the memory, as pool is destroyed as a whole.
ctx
->
TagTypes
=
NULL
;
return
TRUE
;
}
pt
=
Anterior
=
LinkedList
;
while
(
pt
!=
NULL
)
{
if
(
Plugin
->
Handler
.
Signature
==
pt
->
Handler
.
Signature
)
{
pt
->
Handler
=
Plugin
->
Handler
;
// Replace old behaviour.
// Note that since no memory is allocated, unregister does not
// reset this action.
return
TRUE
;
}
Anterior
=
pt
;
pt
=
pt
->
Next
;
}
// Registering happens in plug-in memory pool
// Registering happens in plug-in memory pool.
pt
=
(
_cmsTagTypeLinkedList
*
)
_cmsPluginMalloc
(
id
,
sizeof
(
_cmsTagTypeLinkedList
));
if
(
pt
==
NULL
)
return
FALSE
;
pt
->
Handler
=
Plugin
->
Handler
;
pt
->
Next
=
NULL
;
pt
->
Next
=
ctx
->
TagTypes
;
if
(
Anterior
)
Anterior
->
Next
=
pt
;
ctx
->
TagTypes
=
pt
;
return
TRUE
;
}
// Return handler for a given type or NULL if not found. Shared between normal types and MPE
// Return handler for a given type or NULL if not found. Shared between normal types and MPE. It first tries the additons
// made by plug-ins and then the built-in defaults.
static
cmsTagTypeHandler
*
GetHandler
(
cmsTagTypeSignature
sig
,
_cmsTagTypeLinkedList
*
LinkedList
)
cmsTagTypeHandler
*
GetHandler
(
cmsTagTypeSignature
sig
,
_cmsTagTypeLinkedList
*
PluginLinkedList
,
_cmsTagTypeLinkedList
*
Default
LinkedList
)
{
_cmsTagTypeLinkedList
*
pt
;
for
(
pt
=
LinkedList
;
for
(
pt
=
PluginLinkedList
;
pt
!=
NULL
;
pt
=
pt
->
Next
)
{
if
(
sig
==
pt
->
Handler
.
Signature
)
return
&
pt
->
Handler
;
}
for
(
pt
=
DefaultLinkedList
;
pt
!=
NULL
;
pt
=
pt
->
Next
)
{
...
...
@@ -163,6 +158,7 @@ cmsBool _cmsWriteWCharArray(cmsIOHANDLER* io, cmsUInt32Number n, const wchar_t*
return
TRUE
;
}
// Auxiliar to read an array of wchar_t
static
cmsBool
_cmsReadWCharArray
(
cmsIOHANDLER
*
io
,
cmsUInt32Number
n
,
wchar_t
*
Array
)
{
...
...
@@ -777,6 +773,8 @@ cmsBool Type_Text_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io,
// Create memory
Text
=
(
char
*
)
_cmsMalloc
(
self
->
ContextID
,
size
);
if
(
Text
==
NULL
)
return
FALSE
;
cmsMLUgetASCII
(
mlu
,
cmsNoLanguage
,
cmsNoCountry
,
Text
,
size
);
// Write it, including separator
...
...
@@ -1783,7 +1781,6 @@ void *Type_LUT8_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cms
if
(
!
_cmsReadUInt8Number
(
io
,
NULL
))
goto
Error
;
// Do some checking
if
(
InputChannels
>
cmsMAXCHANNELS
)
goto
Error
;
if
(
OutputChannels
>
cmsMAXCHANNELS
)
goto
Error
;
...
...
@@ -1824,9 +1821,16 @@ void *Type_LUT8_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cms
if
(
T
==
NULL
)
goto
Error
;
Temp
=
(
cmsUInt8Number
*
)
_cmsMalloc
(
self
->
ContextID
,
nTabSize
);
if
(
Temp
==
NULL
)
goto
Error
;
if
(
Temp
==
NULL
)
{
_cmsFree
(
self
->
ContextID
,
T
);
goto
Error
;
}
if
(
io
->
Read
(
io
,
Temp
,
nTabSize
,
1
)
!=
1
)
goto
Error
;
if
(
io
->
Read
(
io
,
Temp
,
nTabSize
,
1
)
!=
1
)
{
_cmsFree
(
self
->
ContextID
,
T
);
_cmsFree
(
self
->
ContextID
,
Temp
);
goto
Error
;
}
for
(
i
=
0
;
i
<
nTabSize
;
i
++
)
{
...
...
@@ -2371,27 +2375,30 @@ cmsStage* ReadCLUT(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUI
// Precision can be 1 or 2 bytes
if
(
Precision
==
1
)
{
cmsUInt8Number
v
;
cmsUInt8Number
v
;
for
(
i
=
0
;
i
<
Data
->
nEntries
;
i
++
)
{
if
(
io
->
Read
(
io
,
&
v
,
sizeof
(
cmsUInt8Number
),
1
)
!=
1
)
return
NULL
;
Data
->
Tab
.
T
[
i
]
=
FROM_8_TO_16
(
v
);
if
(
io
->
Read
(
io
,
&
v
,
sizeof
(
cmsUInt8Number
),
1
)
!=
1
)
return
NULL
;
Data
->
Tab
.
T
[
i
]
=
FROM_8_TO_16
(
v
);
}
}
else
if
(
Precision
==
2
)
{
if
(
!
_cmsReadUInt16Array
(
io
,
Data
->
nEntries
,
Data
->
Tab
.
T
))
return
NULL
;
}
else
{
cmsSignalError
(
self
->
ContextID
,
cmsERROR_UNKNOWN_EXTENSION
,
"Unknown precision of '%d'"
,
Precision
);
return
NULL
;
}
if
(
!
_cmsReadUInt16Array
(
io
,
Data
->
nEntries
,
Data
->
Tab
.
T
))
{
cmsStageFree
(
CLUT
);
return
NULL
;
}
}
else
{
cmsStageFree
(
CLUT
);
cmsSignalError
(
self
->
ContextID
,
cmsERROR_UNKNOWN_EXTENSION
,
"Unknown precision of '%d'"
,
Precision
);
return
NULL
;
}
return
CLUT
;
return
CLUT
;
}
static
...
...
@@ -4374,7 +4381,7 @@ static _cmsTagTypeLinkedList SupportedMPEtypes[] = {
{
TYPE_MPE_HANDLER
((
cmsTagTypeSignature
)
cmsSigCLutElemType
,
MPEclut
),
NULL
},
};
#define DEFAULT_MPE_TYPE_COUNT (sizeof(SupportedMPEtypes) / sizeof(_cmsTagTypeLinkedList))
_cmsTagTypePluginChunkType
_cmsMPETypePluginChunk
=
{
NULL
};
static
cmsBool
ReadMPEElem
(
struct
_cms_typehandler_struct
*
self
,
...
...
@@ -4387,6 +4394,8 @@ cmsBool ReadMPEElem(struct _cms_typehandler_struct* self,
cmsTagTypeHandler
*
TypeHandler
;
cmsUInt32Number
nItems
;
cmsPipeline
*
NewLUT
=
(
cmsPipeline
*
)
Cargo
;
_cmsTagTypePluginChunkType
*
MPETypePluginChunk
=
(
_cmsTagTypePluginChunkType
*
)
_cmsContextGetClientChunk
(
self
->
ContextID
,
MPEPlugin
);
// Take signature and channels for each element.
if
(
!
_cmsReadUInt32Number
(
io
,
(
cmsUInt32Number
*
)
&
ElementSig
))
return
FALSE
;
...
...
@@ -4395,7 +4404,7 @@ cmsBool ReadMPEElem(struct _cms_typehandler_struct* self,
if
(
!
_cmsReadUInt32Number
(
io
,
NULL
))
return
FALSE
;
// Read diverse MPE types
TypeHandler
=
GetHandler
((
cmsTagTypeSignature
)
ElementSig
,
SupportedMPEtypes
);
TypeHandler
=
GetHandler
((
cmsTagTypeSignature
)
ElementSig
,
MPETypePluginChunk
->
TagTypes
,
SupportedMPEtypes
);
if
(
TypeHandler
==
NULL
)
{
char
String
[
5
];
...
...
@@ -4472,6 +4481,7 @@ cmsBool Type_MPE_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, v
cmsPipeline
*
Lut
=
(
cmsPipeline
*
)
Ptr
;
cmsStage
*
Elem
=
Lut
->
Elements
;
cmsTagTypeHandler
*
TypeHandler
;
_cmsTagTypePluginChunkType
*
MPETypePluginChunk
=
(
_cmsTagTypePluginChunkType
*
)
_cmsContextGetClientChunk
(
self
->
ContextID
,
MPEPlugin
);
BaseOffset
=
io
->
Tell
(
io
)
-
sizeof
(
_cmsTagBase
);
...
...
@@ -4505,7 +4515,7 @@ cmsBool Type_MPE_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, v
ElementSig
=
Elem
->
Type
;
TypeHandler
=
GetHandler
((
cmsTagTypeSignature
)
ElementSig
,
SupportedMPEtypes
);
TypeHandler
=
GetHandler
((
cmsTagTypeSignature
)
ElementSig
,
MPETypePluginChunk
->
TagTypes
,
SupportedMPEtypes
);
if
(
TypeHandler
==
NULL
)
{
char
String
[
5
];
...
...
@@ -5125,7 +5135,7 @@ void *Type_Dictionary_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* i
}
else
{
rc
=
cmsDictAddEntry
(
hDict
,
NameWCS
,
ValueWCS
,
DisplayNameMLU
,
DisplayValueMLU
);
rc
=
cmsDictAddEntry
(
hDict
,
NameWCS
,
ValueWCS
,
DisplayNameMLU
,
DisplayValueMLU
);
}
if
(
NameWCS
!=
NULL
)
_cmsFree
(
self
->
ContextID
,
NameWCS
);
...
...
@@ -5282,24 +5292,95 @@ static _cmsTagTypeLinkedList SupportedTagTypes[] = {
{
TYPE_HANDLER
(
cmsSigVcgtType
,
vcgt
),
NULL
}
};
#define DEFAULT_TAG_TYPE_COUNT (sizeof(SupportedTagTypes) / sizeof(_cmsTagTypeLinkedList))
_cmsTagTypePluginChunkType
_cmsTagTypePluginChunk
=
{
NULL
};
// Duplicates the zone of memory used by the plug-in in the new context
static
void
DupTagTypeList
(
struct
_cmsContext_struct
*
ctx
,
const
struct
_cmsContext_struct
*
src
,
int
loc
)
{
_cmsTagTypePluginChunkType
newHead
=
{
NULL
};
_cmsTagTypeLinkedList
*
entry
;
_cmsTagTypeLinkedList
*
Anterior
=
NULL
;
_cmsTagTypePluginChunkType
*
head
=
(
_cmsTagTypePluginChunkType
*
)
src
->
chunks
[
loc
];
// Walk the list copying all nodes
for
(
entry
=
head
->
TagTypes
;
entry
!=
NULL
;
entry
=
entry
->
Next
)
{
_cmsTagTypeLinkedList
*
newEntry
=
(
_cmsTagTypeLinkedList
*
)
_cmsSubAllocDup
(
ctx
->
MemPool
,
entry
,
sizeof
(
_cmsTagTypeLinkedList
));
if
(
newEntry
==
NULL
)
return
;
// We want to keep the linked list order, so this is a little bit tricky
newEntry
->
Next
=
NULL
;
if
(
Anterior
)
Anterior
->
Next
=
newEntry
;
Anterior
=
newEntry
;
if
(
newHead
.
TagTypes
==
NULL
)
newHead
.
TagTypes
=
newEntry
;
}
ctx
->
chunks
[
loc
]
=
_cmsSubAllocDup
(
ctx
->
MemPool
,
&
newHead
,
sizeof
(
_cmsTagTypePluginChunkType
));
}
void
_cmsAllocTagTypePluginChunk
(
struct
_cmsContext_struct
*
ctx
,
const
struct
_cmsContext_struct
*
src
)
{
if
(
src
!=
NULL
)
{
// Duplicate the LIST
DupTagTypeList
(
ctx
,
src
,
TagTypePlugin
);
}
else
{
static
_cmsTagTypePluginChunkType
TagTypePluginChunk
=
{
NULL
};
ctx
->
chunks
[
TagTypePlugin
]
=
_cmsSubAllocDup
(
ctx
->
MemPool
,
&
TagTypePluginChunk
,
sizeof
(
_cmsTagTypePluginChunkType
));
}
}
void
_cmsAllocMPETypePluginChunk
(
struct
_cmsContext_struct
*
ctx
,
const
struct
_cmsContext_struct
*
src
)
{
if
(
src
!=
NULL
)
{
// Duplicate the LIST
DupTagTypeList
(
ctx
,
src
,
MPEPlugin
);
}
else
{
static
_cmsTagTypePluginChunkType
TagTypePluginChunk
=
{
NULL
};
ctx
->
chunks
[
MPEPlugin
]
=
_cmsSubAllocDup
(
ctx
->
MemPool
,
&
TagTypePluginChunk
,
sizeof
(
_cmsTagTypePluginChunkType
));
}
}
// Both kind of plug-ins share same structure
cmsBool
_cmsRegisterTagTypePlugin
(
cmsContext
id
,
cmsPluginBase
*
Data
)
{
return
RegisterTypesPlugin
(
id
,
Data
,
SupportedTagTypes
,
DEFAULT_TAG_TYPE_COUNT
);
return
RegisterTypesPlugin
(
id
,
Data
,
TagTypePlugin
);
}
cmsBool
_cmsRegisterMultiProcessElementPlugin
(
cmsContext
id
,
cmsPluginBase
*
Data
)
{
return
RegisterTypesPlugin
(
id
,
Data
,
SupportedMPEtypes
,
DEFAULT_MPE_TYPE_COUNT
);
return
RegisterTypesPlugin
(
id
,
Data
,
MPEPlugin
);
}
// Wrapper for tag types
cmsTagTypeHandler
*
_cmsGetTagTypeHandler
(
cmsTagTypeSignature
sig
)
cmsTagTypeHandler
*
_cmsGetTagTypeHandler
(
cms
Context
ContextID
,
cms
TagTypeSignature
sig
)
{
return
GetHandler
(
sig
,
SupportedTagTypes
);
_cmsTagTypePluginChunkType
*
ctx
=
(
_cmsTagTypePluginChunkType
*
)
_cmsContextGetClientChunk
(
ContextID
,
TagTypePlugin
);
return
GetHandler
(
sig
,
ctx
->
TagTypes
,
SupportedTagTypes
);
}
// ********************************************************************************
...
...
@@ -5414,30 +5495,68 @@ static _cmsTagLinkedList SupportedTags[] = {
cmsSigDeviceSettingsTag ==> Deprecated, useless
*/
#define DEFAULT_TAG_COUNT (sizeof(SupportedTags) / sizeof(_cmsTagLinkedList))
cmsBool
_cmsRegisterTagPlugin
(
cmsContext
id
,
cmsPluginBase
*
Data
)
_cmsTagPluginChunkType
_cmsTagPluginChunk
=
{
NULL
};
// Duplicates the zone of memory used by the plug-in in the new context
static
void
DupTagList
(
struct
_cmsContext_struct
*
ctx
,
const
struct
_cmsContext_struct
*
src
)
{
cmsPluginTag
*
Plugin
=
(
cmsPluginTag
*
)
Data
;
_cmsTagLinkedList
*
pt
,
*
Anterior
;
_cmsTagPluginChunkType
newHead
=
{
NULL
};
_cmsTagLinkedList
*
entry
;
_cmsTagLinkedList
*
Anterior
=
NULL
;
_cmsTagPluginChunkType
*
head
=
(
_cmsTagPluginChunkType
*
)
src
->
chunks
[
TagPlugin
];
// Walk the list copying all nodes
for
(
entry
=
head
->
Tag
;
entry
!=
NULL
;
entry
=
entry
->
Next
)
{
if
(
Data
==
NULL
)
{
_cmsTagLinkedList
*
newEntry
=
(
_cmsTagLinkedList
*
)
_cmsSubAllocDup
(
ctx
->
MemPool
,
entry
,
sizeof
(
_cmsTagLinkedList
));
SupportedTags
[
DEFAULT_TAG_COUNT
-
1
].
Next
=
NULL
;
return
TRUE
;
if
(
newEntry
==
NULL
)
return
;
// We want to keep the linked list order, so this is a little bit tricky
newEntry
->
Next
=
NULL
;
if
(
Anterior
)
Anterior
->
Next
=
newEntry
;
Anterior
=
newEntry
;
if
(
newHead
.
Tag
==
NULL
)
newHead
.
Tag
=
newEntry
;
}
ctx
->
chunks
[
TagPlugin
]
=
_cmsSubAllocDup
(
ctx
->
MemPool
,
&
newHead
,
sizeof
(
_cmsTagPluginChunkType
));
}
void
_cmsAllocTagPluginChunk
(
struct
_cmsContext_struct
*
ctx
,
const
struct
_cmsContext_struct
*
src
)
{
if
(
src
!=
NULL
)
{
DupTagList
(
ctx
,
src
);
}
else
{
static
_cmsTagPluginChunkType
TagPluginChunk
=
{
NULL
};
ctx
->
chunks
[
TagPlugin
]
=
_cmsSubAllocDup
(
ctx
->
MemPool
,
&
TagPluginChunk
,
sizeof
(
_cmsTagPluginChunkType
));
}
}
pt
=
Anterior
=
SupportedTags
;
while
(
pt
!=
NULL
)
{
cmsBool
_cmsRegisterTagPlugin
(
cmsContext
id
,
cmsPluginBase
*
Data
)
{
cmsPluginTag
*
Plugin
=
(
cmsPluginTag
*
)
Data
;
_cmsTagLinkedList
*
pt
;
_cmsTagPluginChunkType
*
TagPluginChunk
=
(
_cmsTagPluginChunkType
*
)
_cmsContextGetClientChunk
(
id
,
TagPlugin
);
if
(
Plugin
->
Signature
==
pt
->
Signature
)
{
pt
->
Descriptor
=
Plugin
->
Descriptor
;
// Replace old behaviour
return
TRUE
;
}
if
(
Data
==
NULL
)
{
Anterior
=
pt
;
pt
=
pt
->
Next
;
TagPluginChunk
->
Tag
=
NULL
;
return
TRUE
;
}
pt
=
(
_cmsTagLinkedList
*
)
_cmsPluginMalloc
(
id
,
sizeof
(
_cmsTagLinkedList
));
...
...
@@ -5445,17 +5564,25 @@ cmsBool _cmsRegisterTagPlugin(cmsContext id, cmsPluginBase* Data)
pt
->
Signature
=
Plugin
->
Signature
;
pt
->
Descriptor
=
Plugin
->
Descriptor
;
pt
->
Next
=
NULL
;
pt
->
Next
=
TagPluginChunk
->
Tag
;
if
(
Anterior
!=
NULL
)
Anterior
->
Next
=
pt
;
TagPluginChunk
->
Tag
=
pt
;
return
TRUE
;
}
// Return a descriptor for a given tag or NULL
cmsTagDescriptor
*
_cmsGetTagDescriptor
(
cmsTagSignature
sig
)
cmsTagDescriptor
*
_cmsGetTagDescriptor
(
cms
Context
ContextID
,
cms
TagSignature
sig
)
{
_cmsTagLinkedList
*
pt
;
_cmsTagPluginChunkType
*
TagPluginChunk
=
(
_cmsTagPluginChunkType
*
)
_cmsContextGetClientChunk
(
ContextID
,
TagPlugin
);
for
(
pt
=
TagPluginChunk
->
Tag
;
pt
!=
NULL
;
pt
=
pt
->
Next
)
{
if
(
sig
==
pt
->
Signature
)
return
&
pt
->
Descriptor
;
}
for
(
pt
=
SupportedTags
;
pt
!=
NULL
;
...
...
src/share/native/sun/java2d/cmm/lcms/cmsvirt.c
浏览文件 @
4352a351
...
...
@@ -30,7 +30,7 @@
//---------------------------------------------------------------------------------
//
// Little Color Management System
// Copyright (c) 1998-201
1
Marti Maria Saguer
// Copyright (c) 1998-201
4
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"),
...
...
@@ -1019,7 +1019,7 @@ typedef struct {
static
const
cmsAllowedLUT
AllowedLUTTypes
[]
=
{
{
FALSE
,
0
,
cmsSigLut16Type
,
4
,
{
cmsSigMatrixElemType
,
cmsSigCurveSetElemType
,
cmsSigCLutElemType
,
cmsSigCurveSetElemType
}},
{
FALSE
,
0
,
cmsSigLut16Type
,
4
,
{
cmsSigMatrixElemType
,
cmsSigCurveSetElemType
,
cmsSigCLutElemType
,
cmsSigCurveSetElemType
}},
{
FALSE
,
0
,
cmsSigLut16Type
,
3
,
{
cmsSigCurveSetElemType
,
cmsSigCLutElemType
,
cmsSigCurveSetElemType
}},
{
FALSE
,
0
,
cmsSigLut16Type
,
2
,
{
cmsSigCurveSetElemType
,
cmsSigCLutElemType
}},
{
TRUE
,
0
,
cmsSigLutAtoBType
,
1
,
{
cmsSigCurveSetElemType
}},
...
...
@@ -1150,7 +1150,7 @@ cmsHPROFILE CMSEXPORT cmsTransform2DeviceLink(cmsHTRANSFORM hTransform, cmsFloat
if
(
AllowedLUT
==
NULL
)
{
// Try to optimize
_cmsOptimizePipeline
(
&
LUT
,
xform
->
RenderingIntent
,
&
FrmIn
,
&
FrmOut
,
&
dwFlags
);
_cmsOptimizePipeline
(
ContextID
,
&
LUT
,
xform
->
RenderingIntent
,
&
FrmIn
,
&
FrmOut
,
&
dwFlags
);
AllowedLUT
=
FindCombination
(
LUT
,
Version
>=
4
.
0
,
DestinationTag
);
}
...
...
@@ -1159,7 +1159,7 @@ cmsHPROFILE CMSEXPORT cmsTransform2DeviceLink(cmsHTRANSFORM hTransform, cmsFloat
if
(
AllowedLUT
==
NULL
)
{
dwFlags
|=
cmsFLAGS_FORCE_CLUT
;
_cmsOptimizePipeline
(
&
LUT
,
xform
->
RenderingIntent
,
&
FrmIn
,
&
FrmOut
,
&
dwFlags
);
_cmsOptimizePipeline
(
ContextID
,
&
LUT
,
xform
->
RenderingIntent
,
&
FrmIn
,
&
FrmOut
,
&
dwFlags
);
// Put identity curves if needed
if
(
cmsPipelineGetPtrToFirstStage
(
LUT
)
->
Type
!=
cmsSigCurveSetElemType
)
...
...
src/share/native/sun/java2d/cmm/lcms/cmswtpnt.c
浏览文件 @
4352a351
...
...
@@ -30,7 +30,7 @@
//---------------------------------------------------------------------------------
//
// Little Color Management System
// Copyright (c) 1998-201
2
Marti Maria Saguer
// Copyright (c) 1998-201
4
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/cmsxform.c
浏览文件 @
4352a351
...
...
@@ -30,7 +30,7 @@
//---------------------------------------------------------------------------------
//
// Little Color Management System
// Copyright (c) 1998-201
1
Marti Maria Saguer
// Copyright (c) 1998-201
4
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"),
...
...
@@ -58,44 +58,120 @@
// Transformations stuff
// -----------------------------------------------------------------------
// Alarm codes for 16-bit transformations, because the fixed range of containers there are
// no values left to mark out of gamut. volatile is C99 per 6.2.5
static
volatile
cmsUInt16Number
Alarm
[
cmsMAXCHANNELS
]
=
{
0x7F00
,
0x7F00
,
0x7F00
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
};
static
volatile
cmsFloat64Number
GlobalAdaptationState
=
1
;
#define DEFAULT_OBSERVER_ADAPTATION_STATE 1.0
// The Context0 observer adaptation state.
_cmsAdaptationStateChunkType
_cmsAdaptationStateChunk
=
{
DEFAULT_OBSERVER_ADAPTATION_STATE
};
// Init and duplicate observer adaptation state
void
_cmsAllocAdaptationStateChunk
(
struct
_cmsContext_struct
*
ctx
,
const
struct
_cmsContext_struct
*
src
)
{
static
_cmsAdaptationStateChunkType
AdaptationStateChunk
=
{
DEFAULT_OBSERVER_ADAPTATION_STATE
};
void
*
from
;
if
(
src
!=
NULL
)
{
from
=
src
->
chunks
[
AdaptationStateContext
];
}
else
{
from
=
&
AdaptationStateChunk
;
}
ctx
->
chunks
[
AdaptationStateContext
]
=
_cmsSubAllocDup
(
ctx
->
MemPool
,
from
,
sizeof
(
_cmsAdaptationStateChunkType
));
}
// Sets adaptation state for absolute colorimetric intent in the given context. Adaptation state applies on all
// but cmsCreateExtendedTransformTHR(). Little CMS can handle incomplete adaptation states.
cmsFloat64Number
CMSEXPORT
cmsSetAdaptationStateTHR
(
cmsContext
ContextID
,
cmsFloat64Number
d
)
{
cmsFloat64Number
prev
;
_cmsAdaptationStateChunkType
*
ptr
=
(
_cmsAdaptationStateChunkType
*
)
_cmsContextGetClientChunk
(
ContextID
,
AdaptationStateContext
);
// Get previous value for return
prev
=
ptr
->
AdaptationState
;
// Set the value if d is positive or zero
if
(
d
>=
0
.
0
)
{
ptr
->
AdaptationState
=
d
;
}
// Always return previous value
return
prev
;
}
// The adaptation state may be defaulted by this function. If you don't like it, use the extended transform routine
cmsFloat64Number
CMSEXPORT
cmsSetAdaptationState
(
cmsFloat64Number
d
)
{
cmsFloat64Number
OldVal
=
GlobalAdaptationState
;
return
cmsSetAdaptationStateTHR
(
NULL
,
d
);
}
// -----------------------------------------------------------------------
// Alarm codes for 16-bit transformations, because the fixed range of containers there are
// no values left to mark out of gamut.
#define DEFAULT_ALARM_CODES_VALUE {0x7F00, 0x7F00, 0x7F00, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
_cmsAlarmCodesChunkType
_cmsAlarmCodesChunk
=
{
DEFAULT_ALARM_CODES_VALUE
};
// Sets the codes used to mark out-out-gamut on Proofing transforms for a given context. Values are meant to be
// encoded in 16 bits.
void
CMSEXPORT
cmsSetAlarmCodesTHR
(
cmsContext
ContextID
,
const
cmsUInt16Number
AlarmCodesP
[
cmsMAXCHANNELS
])
{
_cmsAlarmCodesChunkType
*
ContextAlarmCodes
=
(
_cmsAlarmCodesChunkType
*
)
_cmsContextGetClientChunk
(
ContextID
,
AlarmCodesContext
);
if
(
d
>=
0
)
GlobalAdaptationState
=
d
;
_cmsAssert
(
ContextAlarmCodes
!=
NULL
);
// Can't happen
return
OldVal
;
memcpy
(
ContextAlarmCodes
->
AlarmCodes
,
AlarmCodesP
,
sizeof
(
ContextAlarmCodes
->
AlarmCodes
))
;
}
// Alarm codes are always global
void
CMSEXPORT
cmsSetAlarmCodes
(
cmsUInt16Number
NewAlarm
[
cmsMAXCHANNELS
])
// Gets the current codes used to mark out-out-gamut on Proofing transforms for the given context.
// Values are meant to be encoded in 16 bits.
void
CMSEXPORT
cmsGetAlarmCodesTHR
(
cmsContext
ContextID
,
cmsUInt16Number
AlarmCodesP
[
cmsMAXCHANNELS
])
{
int
i
;
_cmsAlarmCodesChunkType
*
ContextAlarmCodes
=
(
_cmsAlarmCodesChunkType
*
)
_cmsContextGetClientChunk
(
ContextID
,
AlarmCodesContext
);
_cmsAssert
(
ContextAlarmCodes
!=
NULL
);
// Can't happen
memcpy
(
AlarmCodesP
,
ContextAlarmCodes
->
AlarmCodes
,
sizeof
(
ContextAlarmCodes
->
AlarmCodes
));
}
void
CMSEXPORT
cmsSetAlarmCodes
(
const
cmsUInt16Number
NewAlarm
[
cmsMAXCHANNELS
])
{
_cmsAssert
(
NewAlarm
!=
NULL
);
for
(
i
=
0
;
i
<
cmsMAXCHANNELS
;
i
++
)
Alarm
[
i
]
=
NewAlarm
[
i
];
cmsSetAlarmCodesTHR
(
NULL
,
NewAlarm
);
}
// You can get the codes cas well
void
CMSEXPORT
cmsGetAlarmCodes
(
cmsUInt16Number
OldAlarm
[
cmsMAXCHANNELS
])
{
int
i
;
_cmsAssert
(
OldAlarm
!=
NULL
);
cmsGetAlarmCodesTHR
(
NULL
,
OldAlarm
);
}
for
(
i
=
0
;
i
<
cmsMAXCHANNELS
;
i
++
)
OldAlarm
[
i
]
=
Alarm
[
i
];
// Init and duplicate alarm codes
void
_cmsAllocAlarmCodesChunk
(
struct
_cmsContext_struct
*
ctx
,
const
struct
_cmsContext_struct
*
src
)
{
static
_cmsAlarmCodesChunkType
AlarmCodesChunk
=
{
DEFAULT_ALARM_CODES_VALUE
};
void
*
from
;
if
(
src
!=
NULL
)
{
from
=
src
->
chunks
[
AlarmCodesContext
];
}
else
{
from
=
&
AlarmCodesChunk
;
}
ctx
->
chunks
[
AlarmCodesContext
]
=
_cmsSubAllocDup
(
ctx
->
MemPool
,
from
,
sizeof
(
_cmsAlarmCodesChunkType
));
}
// -----------------------------------------------------------------------
// Get rid of transform resources
void
CMSEXPORT
cmsDeleteTransform
(
cmsHTRANSFORM
hTransform
)
{
...
...
@@ -202,6 +278,30 @@ void FloatXFORM(_cmsTRANSFORM* p,
}
}
static
void
NullFloatXFORM
(
_cmsTRANSFORM
*
p
,
const
void
*
in
,
void
*
out
,
cmsUInt32Number
Size
,
cmsUInt32Number
Stride
)
{
cmsUInt8Number
*
accum
;
cmsUInt8Number
*
output
;
cmsFloat32Number
fIn
[
cmsMAXCHANNELS
];
cmsUInt32Number
i
,
n
;
accum
=
(
cmsUInt8Number
*
)
in
;
output
=
(
cmsUInt8Number
*
)
out
;
n
=
Size
;
for
(
i
=
0
;
i
<
n
;
i
++
)
{
accum
=
p
->
FromInputFloat
(
p
,
fIn
,
accum
,
Stride
);
output
=
p
->
ToOutputFloat
(
p
,
fIn
,
output
,
Stride
);
}
}
// 16 bit precision -----------------------------------------------------------------------------------------------------------
// Null transformation, only applies formatters. No cach
...
...
@@ -252,7 +352,7 @@ void PrecalculatedXFORM(_cmsTRANSFORM* p,
}
// Auxiliar: Handle precalculated gamut check
// Auxiliar: Handle precalculated gamut check
. The retrieval of context may be alittle bit slow, but this function is not critical.
static
void
TransformOnePixelWithGamutCheck
(
_cmsTRANSFORM
*
p
,
const
cmsUInt16Number
wIn
[],
...
...
@@ -264,9 +364,12 @@ void TransformOnePixelWithGamutCheck(_cmsTRANSFORM* p,
if
(
wOutOfGamut
>=
1
)
{
cmsUInt16Number
i
;
_cmsAlarmCodesChunkType
*
ContextAlarmCodes
=
(
_cmsAlarmCodesChunkType
*
)
_cmsContextGetClientChunk
(
p
->
ContextID
,
AlarmCodesContext
);
for
(
i
=
0
;
i
<
p
->
Lut
->
OutputChannels
;
i
++
)
{
for
(
i
=
0
;
i
<
p
->
Lut
->
OutputChannels
;
i
++
)
wOut
[
i
]
=
Alarm
[
i
];
wOut
[
i
]
=
ContextAlarmCodes
->
AlarmCodes
[
i
];
}
}
else
p
->
Lut
->
Eval16Fn
(
wIn
,
wOut
,
p
->
Lut
->
Data
);
...
...
@@ -393,34 +496,86 @@ typedef struct _cmsTransformCollection_st {
}
_cmsTransformCollection
;
// The linked list head
static
_cmsTransformCollection
*
TransformCollection
=
NULL
;
_cmsTransformPluginChunkType
_cmsTransformPluginChunk
=
{
NULL
};
// Duplicates the zone of memory used by the plug-in in the new context
static
void
DupPluginTransformList
(
struct
_cmsContext_struct
*
ctx
,
const
struct
_cmsContext_struct
*
src
)
{
_cmsTransformPluginChunkType
newHead
=
{
NULL
};
_cmsTransformCollection
*
entry
;
_cmsTransformCollection
*
Anterior
=
NULL
;
_cmsTransformPluginChunkType
*
head
=
(
_cmsTransformPluginChunkType
*
)
src
->
chunks
[
TransformPlugin
];
// Walk the list copying all nodes
for
(
entry
=
head
->
TransformCollection
;
entry
!=
NULL
;
entry
=
entry
->
Next
)
{
_cmsTransformCollection
*
newEntry
=
(
_cmsTransformCollection
*
)
_cmsSubAllocDup
(
ctx
->
MemPool
,
entry
,
sizeof
(
_cmsTransformCollection
));
if
(
newEntry
==
NULL
)
return
;
// We want to keep the linked list order, so this is a little bit tricky
newEntry
->
Next
=
NULL
;
if
(
Anterior
)
Anterior
->
Next
=
newEntry
;
Anterior
=
newEntry
;
if
(
newHead
.
TransformCollection
==
NULL
)
newHead
.
TransformCollection
=
newEntry
;
}
ctx
->
chunks
[
TransformPlugin
]
=
_cmsSubAllocDup
(
ctx
->
MemPool
,
&
newHead
,
sizeof
(
_cmsTransformPluginChunkType
));
}
void
_cmsAllocTransformPluginChunk
(
struct
_cmsContext_struct
*
ctx
,
const
struct
_cmsContext_struct
*
src
)
{
if
(
src
!=
NULL
)
{
// Copy all linked list
DupPluginTransformList
(
ctx
,
src
);
}
else
{
static
_cmsTransformPluginChunkType
TransformPluginChunkType
=
{
NULL
};
ctx
->
chunks
[
TransformPlugin
]
=
_cmsSubAllocDup
(
ctx
->
MemPool
,
&
TransformPluginChunkType
,
sizeof
(
_cmsTransformPluginChunkType
));
}
}
// Register new ways to transform
cmsBool
_cmsRegisterTransformPlugin
(
cmsContext
id
,
cmsPluginBase
*
Data
)
cmsBool
_cmsRegisterTransformPlugin
(
cmsContext
ContextID
,
cmsPluginBase
*
Data
)
{
cmsPluginTransform
*
Plugin
=
(
cmsPluginTransform
*
)
Data
;
_cmsTransformCollection
*
fl
;
_cmsTransformPluginChunkType
*
ctx
=
(
_cmsTransformPluginChunkType
*
)
_cmsContextGetClientChunk
(
ContextID
,
TransformPlugin
);
if
(
Data
==
NULL
)
{
if
(
Data
==
NULL
)
{
// Free the chain. Memory is safely freed at exit
TransformCollection
=
NULL
;
ctx
->
TransformCollection
=
NULL
;
return
TRUE
;
}
// Factory callback is required
if
(
Plugin
->
Factory
==
NULL
)
return
FALSE
;
if
(
Plugin
->
Factory
==
NULL
)
return
FALSE
;
fl
=
(
_cmsTransformCollection
*
)
_cmsPluginMalloc
(
id
,
sizeof
(
_cmsTransformCollection
));
fl
=
(
_cmsTransformCollection
*
)
_cmsPluginMalloc
(
ContextID
,
sizeof
(
_cmsTransformCollection
));
if
(
fl
==
NULL
)
return
FALSE
;
// Copy the parameters
// Copy the parameters
fl
->
Factory
=
Plugin
->
Factory
;
// Keep linked list
fl
->
Next
=
TransformCollection
;
TransformCollection
=
fl
;
fl
->
Next
=
ctx
->
TransformCollection
;
ctx
->
TransformCollection
=
fl
;
// All is ok
return
TRUE
;
...
...
@@ -463,6 +618,7 @@ static
_cmsTRANSFORM
*
AllocEmptyTransform
(
cmsContext
ContextID
,
cmsPipeline
*
lut
,
cmsUInt32Number
Intent
,
cmsUInt32Number
*
InputFormat
,
cmsUInt32Number
*
OutputFormat
,
cmsUInt32Number
*
dwFlags
)
{
_cmsTransformPluginChunkType
*
ctx
=
(
_cmsTransformPluginChunkType
*
)
_cmsContextGetClientChunk
(
ContextID
,
TransformPlugin
);
_cmsTransformCollection
*
Plugin
;
// Allocate needed memory
...
...
@@ -473,7 +629,7 @@ _cmsTRANSFORM* AllocEmptyTransform(cmsContext ContextID, cmsPipeline* lut,
p
->
Lut
=
lut
;
// Let's see if any plug-in want to do the transform by itself
for
(
Plugin
=
TransformCollection
;
for
(
Plugin
=
ctx
->
TransformCollection
;
Plugin
!=
NULL
;
Plugin
=
Plugin
->
Next
)
{
...
...
@@ -493,10 +649,10 @@ _cmsTRANSFORM* AllocEmptyTransform(cmsContext ContextID, cmsPipeline* lut,
// Fill the formatters just in case the optimized routine is interested.
// No error is thrown if the formatter doesn't exist. It is up to the optimization
// factory to decide what to do in those cases.
p
->
FromInput
=
_cmsGetFormatter
(
*
InputFormat
,
cmsFormatterInput
,
CMS_PACK_FLAGS_16BITS
).
Fmt16
;
p
->
ToOutput
=
_cmsGetFormatter
(
*
OutputFormat
,
cmsFormatterOutput
,
CMS_PACK_FLAGS_16BITS
).
Fmt16
;
p
->
FromInputFloat
=
_cmsGetFormatter
(
*
InputFormat
,
cmsFormatterInput
,
CMS_PACK_FLAGS_FLOAT
).
FmtFloat
;
p
->
ToOutputFloat
=
_cmsGetFormatter
(
*
OutputFormat
,
cmsFormatterOutput
,
CMS_PACK_FLAGS_FLOAT
).
FmtFloat
;
p
->
FromInput
=
_cmsGetFormatter
(
ContextID
,
*
InputFormat
,
cmsFormatterInput
,
CMS_PACK_FLAGS_16BITS
).
Fmt16
;
p
->
ToOutput
=
_cmsGetFormatter
(
ContextID
,
*
OutputFormat
,
cmsFormatterOutput
,
CMS_PACK_FLAGS_16BITS
).
Fmt16
;
p
->
FromInputFloat
=
_cmsGetFormatter
(
ContextID
,
*
InputFormat
,
cmsFormatterInput
,
CMS_PACK_FLAGS_FLOAT
).
FmtFloat
;
p
->
ToOutputFloat
=
_cmsGetFormatter
(
ContextID
,
*
OutputFormat
,
cmsFormatterOutput
,
CMS_PACK_FLAGS_FLOAT
).
FmtFloat
;
return
p
;
}
...
...
@@ -504,14 +660,14 @@ _cmsTRANSFORM* AllocEmptyTransform(cmsContext ContextID, cmsPipeline* lut,
// Not suitable for the transform plug-in, let's check the pipeline plug-in
if
(
p
->
Lut
!=
NULL
)
_cmsOptimizePipeline
(
&
p
->
Lut
,
Intent
,
InputFormat
,
OutputFormat
,
dwFlags
);
_cmsOptimizePipeline
(
ContextID
,
&
p
->
Lut
,
Intent
,
InputFormat
,
OutputFormat
,
dwFlags
);
// Check whatever this is a true floating point transform
if
(
_cmsFormatterIsFloat
(
*
InputFormat
)
&&
_cmsFormatterIsFloat
(
*
OutputFormat
))
{
// Get formatter function always return a valid union, but the contents of this union may be NULL.
p
->
FromInputFloat
=
_cmsGetFormatter
(
*
InputFormat
,
cmsFormatterInput
,
CMS_PACK_FLAGS_FLOAT
).
FmtFloat
;
p
->
ToOutputFloat
=
_cmsGetFormatter
(
*
OutputFormat
,
cmsFormatterOutput
,
CMS_PACK_FLAGS_FLOAT
).
FmtFloat
;
p
->
FromInputFloat
=
_cmsGetFormatter
(
ContextID
,
*
InputFormat
,
cmsFormatterInput
,
CMS_PACK_FLAGS_FLOAT
).
FmtFloat
;
p
->
ToOutputFloat
=
_cmsGetFormatter
(
ContextID
,
*
OutputFormat
,
cmsFormatterOutput
,
CMS_PACK_FLAGS_FLOAT
).
FmtFloat
;
*
dwFlags
|=
cmsFLAGS_CAN_CHANGE_FORMATTER
;
if
(
p
->
FromInputFloat
==
NULL
||
p
->
ToOutputFloat
==
NULL
)
{
...
...
@@ -521,8 +677,15 @@ _cmsTRANSFORM* AllocEmptyTransform(cmsContext ContextID, cmsPipeline* lut,
return
NULL
;
}
// Float transforms don't use cach, always are non-NULL
p
->
xform
=
FloatXFORM
;
if
(
*
dwFlags
&
cmsFLAGS_NULLTRANSFORM
)
{
p
->
xform
=
NullFloatXFORM
;
}
else
{
// Float transforms don't use cach, always are non-NULL
p
->
xform
=
FloatXFORM
;
}
}
else
{
...
...
@@ -534,8 +697,8 @@ _cmsTRANSFORM* AllocEmptyTransform(cmsContext ContextID, cmsPipeline* lut,
int
BytesPerPixelInput
;
p
->
FromInput
=
_cmsGetFormatter
(
*
InputFormat
,
cmsFormatterInput
,
CMS_PACK_FLAGS_16BITS
).
Fmt16
;
p
->
ToOutput
=
_cmsGetFormatter
(
*
OutputFormat
,
cmsFormatterOutput
,
CMS_PACK_FLAGS_16BITS
).
Fmt16
;
p
->
FromInput
=
_cmsGetFormatter
(
ContextID
,
*
InputFormat
,
cmsFormatterInput
,
CMS_PACK_FLAGS_16BITS
).
Fmt16
;
p
->
ToOutput
=
_cmsGetFormatter
(
ContextID
,
*
OutputFormat
,
cmsFormatterOutput
,
CMS_PACK_FLAGS_16BITS
).
Fmt16
;
if
(
p
->
FromInput
==
NULL
||
p
->
ToOutput
==
NULL
)
{
...
...
@@ -727,6 +890,7 @@ cmsHTRANSFORM CMSEXPORT cmsCreateExtendedTransform(cmsContext ContextID,
// Check channel count
if
((
cmsChannelsOf
(
EntryColorSpace
)
!=
cmsPipelineInputChannels
(
Lut
))
||
(
cmsChannelsOf
(
ExitColorSpace
)
!=
cmsPipelineOutputChannels
(
Lut
)))
{
cmsPipelineFree
(
Lut
);
cmsSignalError
(
ContextID
,
cmsERROR_NOT_SUITABLE
,
"Channel count doesn't match. Profile is corrupted"
);
return
NULL
;
}
...
...
@@ -829,7 +993,7 @@ cmsHTRANSFORM CMSEXPORT cmsCreateMultiprofileTransformTHR(cmsContext ContextID,
for
(
i
=
0
;
i
<
nProfiles
;
i
++
)
{
BPC
[
i
]
=
dwFlags
&
cmsFLAGS_BLACKPOINTCOMPENSATION
?
TRUE
:
FALSE
;
Intents
[
i
]
=
Intent
;
AdaptationStates
[
i
]
=
GlobalAdaptationState
;
AdaptationStates
[
i
]
=
cmsSetAdaptationStateTHR
(
ContextID
,
-
1
)
;
}
...
...
@@ -909,7 +1073,7 @@ cmsHTRANSFORM CMSEXPORT cmsCreateProofingTransformTHR(cmsContext ContextID,
Intents
[
0
]
=
nIntent
;
Intents
[
1
]
=
nIntent
;
Intents
[
2
]
=
INTENT_RELATIVE_COLORIMETRIC
;
Intents
[
3
]
=
ProofingIntent
;
BPC
[
0
]
=
DoBPC
;
BPC
[
1
]
=
DoBPC
;
BPC
[
2
]
=
0
;
BPC
[
3
]
=
0
;
Adaptation
[
0
]
=
Adaptation
[
1
]
=
Adaptation
[
2
]
=
Adaptation
[
3
]
=
GlobalAdaptationState
;
Adaptation
[
0
]
=
Adaptation
[
1
]
=
Adaptation
[
2
]
=
Adaptation
[
3
]
=
cmsSetAdaptationStateTHR
(
ContextID
,
-
1
)
;
if
(
!
(
dwFlags
&
(
cmsFLAGS_SOFTPROOFING
|
cmsFLAGS_GAMUTCHECK
)))
return
cmsCreateTransformTHR
(
ContextID
,
InputProfile
,
InputFormat
,
OutputProfile
,
OutputFormat
,
nIntent
,
dwFlags
);
...
...
@@ -984,8 +1148,8 @@ cmsBool CMSEXPORT cmsChangeBuffersFormat(cmsHTRANSFORM hTransform,
return
FALSE
;
}
FromInput
=
_cmsGetFormatter
(
InputFormat
,
cmsFormatterInput
,
CMS_PACK_FLAGS_16BITS
).
Fmt16
;
ToOutput
=
_cmsGetFormatter
(
OutputFormat
,
cmsFormatterOutput
,
CMS_PACK_FLAGS_16BITS
).
Fmt16
;
FromInput
=
_cmsGetFormatter
(
xform
->
ContextID
,
InputFormat
,
cmsFormatterInput
,
CMS_PACK_FLAGS_16BITS
).
Fmt16
;
ToOutput
=
_cmsGetFormatter
(
xform
->
ContextID
,
OutputFormat
,
cmsFormatterOutput
,
CMS_PACK_FLAGS_16BITS
).
Fmt16
;
if
(
FromInput
==
NULL
||
ToOutput
==
NULL
)
{
...
...
src/share/native/sun/java2d/cmm/lcms/lcms2.h
浏览文件 @
4352a351
...
...
@@ -30,7 +30,7 @@
//---------------------------------------------------------------------------------
//
// Little Color Management System
// Copyright (c) 1998-201
3
Marti Maria Saguer
// Copyright (c) 1998-201
4
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"),
...
...
@@ -52,7 +52,7 @@
//
//---------------------------------------------------------------------------------
//
// Version 2.
5
// Version 2.
6
//
#ifndef _lcms2_H
...
...
@@ -84,6 +84,9 @@
// Uncomment to get rid of the tables for "half" float support
// #define CMS_NO_HALF_SUPPORT 1
// Uncomment to get rid of pthreads/windows dependency
// #define CMS_NO_PTHREADS 1
// ********** End of configuration toggles ******************************
// Needed for streams
...
...
@@ -101,7 +104,7 @@ extern "C" {
#endif
// Version/release
#define LCMS_VERSION 20
5
0
#define LCMS_VERSION 20
6
0
// I will give the chance of redefining basic types for compilers that are not fully C99 compliant
#ifndef CMS_BASIC_TYPES_ALREADY_DEFINED
...
...
@@ -202,28 +205,42 @@ typedef int cmsBool;
// Try to detect big endian platforms. This list can be endless, so only some checks are performed over here.
// you can pass this toggle to the compiler by using -DCMS_USE_BIG_ENDIAN or something similar
#if defined(_
HOST_BIG_ENDIAN) || defined(__BIG_ENDIAN__) || defined(WORDS_BIGENDIAN
)
#if defined(_
_sgi__) || defined(__sgi) || defined(sparc
)
# define CMS_USE_BIG_ENDIAN 1
#endif
#if defined(__s
gi__) || defined(__sgi) || defined(__powerpc__) || defined(sparc
)
# define CMS_USE_BIG_ENDIAN
1
#if defined(__s
390__) || defined(__s390x__
)
# define CMS_USE_BIG_ENDIAN 1
#endif
#if defined(__ppc__) || defined(__s390__) || defined(__s390x__)
# ifdef TARGET_CPU_PPC
# if TARGET_CPU_PPC
# define CMS_USE_BIG_ENDIAN 1
# endif
# endif
#if defined(__powerpc__) || defined(__ppc__) || defined(TARGET_CPU_PPC)
# define CMS_USE_BIG_ENDIAN 1
# if defined (__GNUC__) && defined(__BYTE_ORDER) && defined(__LITTLE_ENDIAN)
# if __BYTE_ORDER == __LITTLE_ENDIAN
// // Don't use big endian for PowerPC little endian mode
# undef CMS_USE_BIG_ENDIAN
# endif
# endif
#endif
#ifdef TARGET_CPU_PPC
# if TARGET_CPU_PPC
# define CMS_USE_BIG_ENDIAN 1
# endif
// WORDS_BIGENDIAN takes precedence
#if defined(_HOST_BIG_ENDIAN) || defined(__BIG_ENDIAN__) || defined(WORDS_BIGENDIAN)
# define CMS_USE_BIG_ENDIAN 1
#endif
#ifdef macintosh
# ifdef __BIG_ENDIAN__
# define CMS_USE_BIG_ENDIAN 1
# endif
# ifdef __LITTLE_ENDIAN__
# undef CMS_USE_BIG_ENDIAN
# endif
#endif
// Calling convention -- this is hardly platform and compiler dependent
...
...
@@ -249,6 +266,14 @@ typedef int cmsBool;
# define CMSAPI
#endif
#ifdef HasTHREADS
# if HasTHREADS == 1
# undef CMS_NO_PTHREADS
# else
# define CMS_NO_PTHREADS 1
# endif
#endif
// Some common definitions
#define cmsMAX_PATH 256
...
...
@@ -642,7 +667,6 @@ typedef struct {
// Little CMS specific typedefs
typedef
void
*
cmsContext
;
// Context identifier for multithreaded environments
typedef
void
*
cmsHANDLE
;
// Generic handle
typedef
void
*
cmsHPROFILE
;
// Opaque typedefs to hide internals
typedef
void
*
cmsHTRANSFORM
;
...
...
@@ -1012,11 +1036,25 @@ typedef struct {
CMSAPI
int
CMSEXPORT
cmsstrcasecmp
(
const
char
*
s1
,
const
char
*
s2
);
CMSAPI
long
int
CMSEXPORT
cmsfilelength
(
FILE
*
f
);
// Plug-In registering ---------------------------------------------------------------------------------------------------
// Context handling --------------------------------------------------------------------------------------------------------
// Each context holds its owns globals and its own plug-ins. There is a global context with the id = 0 for lecacy compatibility
// though using the global context is not recomended. Proper context handling makes lcms more thread-safe.
typedef
struct
_cmsContext_struct
*
cmsContext
;
CMSAPI
cmsContext
CMSEXPORT
cmsCreateContext
(
void
*
Plugin
,
void
*
UserData
);
CMSAPI
void
CMSEXPORT
cmsDeleteContext
(
cmsContext
ContexID
);
CMSAPI
cmsContext
CMSEXPORT
cmsDupContext
(
cmsContext
ContextID
,
void
*
NewUserData
);
CMSAPI
void
*
CMSEXPORT
cmsGetContextUserData
(
cmsContext
ContextID
);
// Plug-In registering --------------------------------------------------------------------------------------------------
CMSAPI
cmsBool
CMSEXPORT
cmsPlugin
(
void
*
Plugin
);
CMSAPI
cmsBool
CMSEXPORT
cmsPluginTHR
(
cmsContext
ContextID
,
void
*
Plugin
);
CMSAPI
void
CMSEXPORT
cmsUnregisterPlugins
(
void
);
CMSAPI
void
CMSEXPORT
cmsUnregisterPluginsTHR
(
cmsContext
ContextID
);
// Error logging ----------------------------------------------------------------------------------------------------------
...
...
@@ -1053,6 +1091,7 @@ typedef void (* cmsLogErrorHandlerFunction)(cmsContext ContextID, cmsUInt32Numb
// Allows user to set any specific logger
CMSAPI
void
CMSEXPORT
cmsSetLogErrorHandler
(
cmsLogErrorHandlerFunction
Fn
);
CMSAPI
void
CMSEXPORT
cmsSetLogErrorHandlerTHR
(
cmsContext
ContextID
,
cmsLogErrorHandlerFunction
Fn
);
// Conversions --------------------------------------------------------------------------------------------------------------
...
...
@@ -1514,6 +1553,7 @@ CMSAPI cmsHPROFILE CMSEXPORT cmsOpenProfileFromStreamTHR(cmsContext Context
CMSAPI
cmsHPROFILE
CMSEXPORT
cmsOpenProfileFromMem
(
const
void
*
MemPtr
,
cmsUInt32Number
dwSize
);
CMSAPI
cmsHPROFILE
CMSEXPORT
cmsOpenProfileFromMemTHR
(
cmsContext
ContextID
,
const
void
*
MemPtr
,
cmsUInt32Number
dwSize
);
CMSAPI
cmsHPROFILE
CMSEXPORT
cmsOpenProfileFromIOhandlerTHR
(
cmsContext
ContextID
,
cmsIOHANDLER
*
io
);
CMSAPI
cmsHPROFILE
CMSEXPORT
cmsOpenProfileFromIOhandler2THR
(
cmsContext
ContextID
,
cmsIOHANDLER
*
io
,
cmsBool
write
);
CMSAPI
cmsBool
CMSEXPORT
cmsCloseProfile
(
cmsHPROFILE
hProfile
);
CMSAPI
cmsBool
CMSEXPORT
cmsSaveProfileToFile
(
cmsHPROFILE
hProfile
,
const
char
*
FileName
);
...
...
@@ -1604,6 +1644,7 @@ CMSAPI cmsHPROFILE CMSEXPORT cmsTransform2DeviceLink(cmsHTRANSFORM hTransfo
// Call with NULL as parameters to get the intent count
CMSAPI
cmsUInt32Number
CMSEXPORT
cmsGetSupportedIntents
(
cmsUInt32Number
nMax
,
cmsUInt32Number
*
Codes
,
char
**
Descriptions
);
CMSAPI
cmsUInt32Number
CMSEXPORT
cmsGetSupportedIntentsTHR
(
cmsContext
ContextID
,
cmsUInt32Number
nMax
,
cmsUInt32Number
*
Codes
,
char
**
Descriptions
);
// Flags
...
...
@@ -1715,11 +1756,22 @@ CMSAPI void CMSEXPORT cmsDoTransformStride(cmsHTRANSFORM Transform,
cmsUInt32Number
Stride
);
CMSAPI
void
CMSEXPORT
cmsSetAlarmCodes
(
cmsUInt16Number
NewAlarm
[
cmsMAXCHANNELS
]);
CMSAPI
void
CMSEXPORT
cmsSetAlarmCodes
(
c
onst
c
msUInt16Number
NewAlarm
[
cmsMAXCHANNELS
]);
CMSAPI
void
CMSEXPORT
cmsGetAlarmCodes
(
cmsUInt16Number
NewAlarm
[
cmsMAXCHANNELS
]);
CMSAPI
void
CMSEXPORT
cmsSetAlarmCodesTHR
(
cmsContext
ContextID
,
const
cmsUInt16Number
AlarmCodes
[
cmsMAXCHANNELS
]);
CMSAPI
void
CMSEXPORT
cmsGetAlarmCodesTHR
(
cmsContext
ContextID
,
cmsUInt16Number
AlarmCodes
[
cmsMAXCHANNELS
]);
// Adaptation state for absolute colorimetric intent
CMSAPI
cmsFloat64Number
CMSEXPORT
cmsSetAdaptationState
(
cmsFloat64Number
d
);
CMSAPI
cmsFloat64Number
CMSEXPORT
cmsSetAdaptationStateTHR
(
cmsContext
ContextID
,
cmsFloat64Number
d
);
// Grab the ContextID from an open transform. Returns NULL if a NULL transform is passed
CMSAPI
cmsContext
CMSEXPORT
cmsGetTransformContextID
(
cmsHTRANSFORM
hTransform
);
...
...
src/share/native/sun/java2d/cmm/lcms/lcms2_internal.h
浏览文件 @
4352a351
...
...
@@ -30,7 +30,7 @@
//
// Little Color Management System
// Copyright (c) 1998-201
1
Marti Maria Saguer
// Copyright (c) 1998-201
4
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,16 +193,171 @@ cmsINLINE cmsUInt16Number _cmsQuickSaturateWord(cmsFloat64Number d)
return
_cmsQuickFloorWord
(
d
);
}
// Plug-In registering ---------------------------------------------------------------
// Pthread support --------------------------------------------------------------------
#ifndef CMS_NO_PTHREADS
// This is the threading support. Unfortunately, it has to be platform-dependent because
// windows does not support pthreads.
#ifdef CMS_IS_WINDOWS_
#define WIN32_LEAN_AND_MEAN 1
#include <windows.h>
// From: http://locklessinc.com/articles/pthreads_on_windows/
// The pthreads API has an initialization macro that has no correspondence to anything in
// the windows API. By investigating the internal definition of the critical section type,
// one may work out how to initialize one without calling InitializeCriticalSection().
// The trick here is that InitializeCriticalSection() is not allowed to fail. It tries
// to allocate a critical section debug object, but if no memory is available, it sets
// the pointer to a specific value. (One would expect that value to be NULL, but it is
// actually (void *)-1 for some reason.) Thus we can use this special value for that
// pointer, and the critical section code will work.
// The other important part of the critical section type to initialize is the number
// of waiters. This controls whether or not the mutex is locked. Fortunately, this
// part of the critical section is unlikely to change. Apparently, many programs
// already test critical sections to see if they are locked using this value, so
// Microsoft felt that it was necessary to keep it set at -1 for an unlocked critical
// section, even when they changed the underlying algorithm to be more scalable.
// The final parts of the critical section object are unimportant, and can be set
// to zero for their defaults. This yields an initialization macro:
typedef
CRITICAL_SECTION
_cmsMutex
;
#define CMS_MUTEX_INITIALIZER {(void*) -1,-1,0,0,0,0}
cmsINLINE
int
_cmsLockPrimitive
(
_cmsMutex
*
m
)
{
EnterCriticalSection
(
m
);
return
0
;
}
cmsINLINE
int
_cmsUnlockPrimitive
(
_cmsMutex
*
m
)
{
LeaveCriticalSection
(
m
);
return
0
;
}
cmsINLINE
int
_cmsInitMutexPrimitive
(
_cmsMutex
*
m
)
{
InitializeCriticalSection
(
m
);
return
0
;
}
cmsINLINE
int
_cmsDestroyMutexPrimitive
(
_cmsMutex
*
m
)
{
DeleteCriticalSection
(
m
);
return
0
;
}
cmsINLINE
int
_cmsEnterCriticalSectionPrimitive
(
_cmsMutex
*
m
)
{
EnterCriticalSection
(
m
);
return
0
;
}
cmsINLINE
int
_cmsLeaveCriticalSectionPrimitive
(
_cmsMutex
*
m
)
{
LeaveCriticalSection
(
m
);
return
0
;
}
#else
// Rest of the wide world
#include <pthread.h>
#define CMS_MUTEX_INITIALIZER PTHREAD_MUTEX_INITIALIZER
typedef
pthread_mutex_t
_cmsMutex
;
cmsINLINE
int
_cmsLockPrimitive
(
_cmsMutex
*
m
)
{
return
pthread_mutex_lock
(
m
);
}
cmsINLINE
int
_cmsUnlockPrimitive
(
_cmsMutex
*
m
)
{
return
pthread_mutex_unlock
(
m
);
}
cmsINLINE
int
_cmsInitMutexPrimitive
(
_cmsMutex
*
m
)
{
return
pthread_mutex_init
(
m
,
NULL
);
}
cmsINLINE
int
_cmsDestroyMutexPrimitive
(
_cmsMutex
*
m
)
{
return
pthread_mutex_destroy
(
m
);
}
cmsINLINE
int
_cmsEnterCriticalSectionPrimitive
(
_cmsMutex
*
m
)
{
return
pthread_mutex_lock
(
m
);
}
cmsINLINE
int
_cmsLeaveCriticalSectionPrimitive
(
_cmsMutex
*
m
)
{
return
pthread_mutex_unlock
(
m
);
}
#endif
#else
#define CMS_MUTEX_INITIALIZER 0
typedef
int
_cmsMutex
;
cmsINLINE
int
_cmsLockPrimitive
(
_cmsMutex
*
m
)
{
return
0
;
cmsUNUSED_PARAMETER
(
m
);
}
cmsINLINE
int
_cmsUnlockPrimitive
(
_cmsMutex
*
m
)
{
return
0
;
cmsUNUSED_PARAMETER
(
m
);
}
cmsINLINE
int
_cmsInitMutexPrimitive
(
_cmsMutex
*
m
)
{
return
0
;
cmsUNUSED_PARAMETER
(
m
);
}
cmsINLINE
int
_cmsDestroyMutexPrimitive
(
_cmsMutex
*
m
)
{
return
0
;
cmsUNUSED_PARAMETER
(
m
);
}
cmsINLINE
int
_cmsEnterCriticalSectionPrimitive
(
_cmsMutex
*
m
)
{
return
0
;
cmsUNUSED_PARAMETER
(
m
);
}
cmsINLINE
int
_cmsLeaveCriticalSectionPrimitive
(
_cmsMutex
*
m
)
{
return
0
;
cmsUNUSED_PARAMETER
(
m
);
}
#endif
// Plug-In registration ---------------------------------------------------------------
// Specialized function for plug-in memory management. No pairing free() since whole pool is freed at once.
void
*
_cmsPluginMalloc
(
cmsContext
ContextID
,
cmsUInt32Number
size
);
// Memory management
cmsBool
_cmsRegisterMemHandlerPlugin
(
cmsPluginBase
*
Plugin
);
cmsBool
_cmsRegisterMemHandlerPlugin
(
cms
Context
ContextID
,
cms
PluginBase
*
Plugin
);
// Interpolation
cmsBool
_cmsRegisterInterpPlugin
(
cmsPluginBase
*
Plugin
);
cmsBool
_cmsRegisterInterpPlugin
(
cms
Context
ContextID
,
cms
PluginBase
*
Plugin
);
// Parametric curves
cmsBool
_cmsRegisterParametricCurvesPlugin
(
cmsContext
ContextID
,
cmsPluginBase
*
Plugin
);
...
...
@@ -228,9 +383,12 @@ cmsBool _cmsRegisterOptimizationPlugin(cmsContext ContextID, cmsPluginBase* Plu
// Transform
cmsBool
_cmsRegisterTransformPlugin
(
cmsContext
ContextID
,
cmsPluginBase
*
Plugin
);
// Mutex
cmsBool
_cmsRegisterMutexPlugin
(
cmsContext
ContextID
,
cmsPluginBase
*
Plugin
);
// ---------------------------------------------------------------------------------------------------------
// Suballocators.
Those are blocks of memory that is freed at the end on whole block.
// Suballocators.
typedef
struct
_cmsSubAllocator_chunk_st
{
cmsUInt8Number
*
Block
;
...
...
@@ -253,9 +411,264 @@ typedef struct {
_cmsSubAllocator
*
_cmsCreateSubAlloc
(
cmsContext
ContextID
,
cmsUInt32Number
Initial
);
void
_cmsSubAllocDestroy
(
_cmsSubAllocator
*
s
);
void
*
_cmsSubAlloc
(
_cmsSubAllocator
*
s
,
cmsUInt32Number
size
);
void
*
_cmsSubAllocDup
(
_cmsSubAllocator
*
s
,
const
void
*
ptr
,
cmsUInt32Number
size
);
// ----------------------------------------------------------------------------------
// The context clients.
typedef
enum
{
UserPtr
,
// User-defined pointer
Logger
,
AlarmCodesContext
,
AdaptationStateContext
,
MemPlugin
,
InterpPlugin
,
CurvesPlugin
,
FormattersPlugin
,
TagTypePlugin
,
TagPlugin
,
IntentPlugin
,
MPEPlugin
,
OptimizationPlugin
,
TransformPlugin
,
MutexPlugin
,
// Last in list
MemoryClientMax
}
_cmsMemoryClient
;
// Container for memory management plug-in.
typedef
struct
{
_cmsMallocFnPtrType
MallocPtr
;
_cmsMalloZerocFnPtrType
MallocZeroPtr
;
_cmsFreeFnPtrType
FreePtr
;
_cmsReallocFnPtrType
ReallocPtr
;
_cmsCallocFnPtrType
CallocPtr
;
_cmsDupFnPtrType
DupPtr
;
}
_cmsMemPluginChunkType
;
// Copy memory management function pointers from plug-in to chunk, taking care of missing routines
void
_cmsInstallAllocFunctions
(
cmsPluginMemHandler
*
Plugin
,
_cmsMemPluginChunkType
*
ptr
);
// Internal structure for context
struct
_cmsContext_struct
{
struct
_cmsContext_struct
*
Next
;
// Points to next context in the new style
_cmsSubAllocator
*
MemPool
;
// The memory pool that stores context data
void
*
chunks
[
MemoryClientMax
];
// array of pointers to client chunks. Memory itself is hold in the suballocator.
// If NULL, then it reverts to global Context0
_cmsMemPluginChunkType
DefaultMemoryManager
;
// The allocators used for creating the context itself. Cannot be overriden
};
// Returns a pointer to a valid context structure, including the global one if id is zero.
// Verifies the magic number.
struct
_cmsContext_struct
*
_cmsGetContext
(
cmsContext
ContextID
);
// Returns the block assigned to the specific zone.
void
*
_cmsContextGetClientChunk
(
cmsContext
id
,
_cmsMemoryClient
mc
);
// Chunks of context memory by plug-in client -------------------------------------------------------
// Those structures encapsulates all variables needed by the several context clients (mostly plug-ins)
// Container for error logger -- not a plug-in
typedef
struct
{
cmsLogErrorHandlerFunction
LogErrorHandler
;
// Set to NULL for Context0 fallback
}
_cmsLogErrorChunkType
;
// The global Context0 storage for error logger
extern
_cmsLogErrorChunkType
_cmsLogErrorChunk
;
// Allocate and init error logger container.
void
_cmsAllocLogErrorChunk
(
struct
_cmsContext_struct
*
ctx
,
const
struct
_cmsContext_struct
*
src
);
// Container for alarm codes -- not a plug-in
typedef
struct
{
cmsUInt16Number
AlarmCodes
[
cmsMAXCHANNELS
];
}
_cmsAlarmCodesChunkType
;
// The global Context0 storage for alarm codes
extern
_cmsAlarmCodesChunkType
_cmsAlarmCodesChunk
;
// Allocate and init alarm codes container.
void
_cmsAllocAlarmCodesChunk
(
struct
_cmsContext_struct
*
ctx
,
const
struct
_cmsContext_struct
*
src
);
// Container for adaptation state -- not a plug-in
typedef
struct
{
cmsFloat64Number
AdaptationState
;
}
_cmsAdaptationStateChunkType
;
// The global Context0 storage for adaptation state
extern
_cmsAdaptationStateChunkType
_cmsAdaptationStateChunk
;
// Allocate and init adaptation state container.
void
_cmsAllocAdaptationStateChunk
(
struct
_cmsContext_struct
*
ctx
,
const
struct
_cmsContext_struct
*
src
);
// The global Context0 storage for memory management
extern
_cmsMemPluginChunkType
_cmsMemPluginChunk
;
// Allocate and init memory management container.
void
_cmsAllocMemPluginChunk
(
struct
_cmsContext_struct
*
ctx
,
const
struct
_cmsContext_struct
*
src
);
// Container for interpolation plug-in
typedef
struct
{
cmsInterpFnFactory
Interpolators
;
}
_cmsInterpPluginChunkType
;
// The global Context0 storage for interpolation plug-in
extern
_cmsInterpPluginChunkType
_cmsInterpPluginChunk
;
// Allocate and init interpolation container.
void
_cmsAllocInterpPluginChunk
(
struct
_cmsContext_struct
*
ctx
,
const
struct
_cmsContext_struct
*
src
);
// Container for parametric curves plug-in
typedef
struct
{
struct
_cmsParametricCurvesCollection_st
*
ParametricCurves
;
}
_cmsCurvesPluginChunkType
;
// The global Context0 storage for tone curves plug-in
extern
_cmsCurvesPluginChunkType
_cmsCurvesPluginChunk
;
// Allocate and init parametric curves container.
void
_cmsAllocCurvesPluginChunk
(
struct
_cmsContext_struct
*
ctx
,
const
struct
_cmsContext_struct
*
src
);
// Container for formatters plug-in
typedef
struct
{
struct
_cms_formatters_factory_list
*
FactoryList
;
}
_cmsFormattersPluginChunkType
;
// The global Context0 storage for formatters plug-in
extern
_cmsFormattersPluginChunkType
_cmsFormattersPluginChunk
;
// Allocate and init formatters container.
void
_cmsAllocFormattersPluginChunk
(
struct
_cmsContext_struct
*
ctx
,
const
struct
_cmsContext_struct
*
src
);
// This chunk type is shared by TagType plug-in and MPE Plug-in
typedef
struct
{
struct
_cmsTagTypeLinkedList_st
*
TagTypes
;
}
_cmsTagTypePluginChunkType
;
// The global Context0 storage for tag types plug-in
extern
_cmsTagTypePluginChunkType
_cmsTagTypePluginChunk
;
// The global Context0 storage for mult process elements plug-in
extern
_cmsTagTypePluginChunkType
_cmsMPETypePluginChunk
;
// Allocate and init Tag types container.
void
_cmsAllocTagTypePluginChunk
(
struct
_cmsContext_struct
*
ctx
,
const
struct
_cmsContext_struct
*
src
);
// Allocate and init MPE container.
void
_cmsAllocMPETypePluginChunk
(
struct
_cmsContext_struct
*
ctx
,
const
struct
_cmsContext_struct
*
src
);
// Container for tag plug-in
typedef
struct
{
struct
_cmsTagLinkedList_st
*
Tag
;
}
_cmsTagPluginChunkType
;
// The global Context0 storage for tag plug-in
extern
_cmsTagPluginChunkType
_cmsTagPluginChunk
;
// Allocate and init Tag container.
void
_cmsAllocTagPluginChunk
(
struct
_cmsContext_struct
*
ctx
,
const
struct
_cmsContext_struct
*
src
);
// Container for intents plug-in
typedef
struct
{
struct
_cms_intents_list
*
Intents
;
}
_cmsIntentsPluginChunkType
;
// The global Context0 storage for intents plug-in
extern
_cmsIntentsPluginChunkType
_cmsIntentsPluginChunk
;
// Allocate and init intents container.
void
_cmsAllocIntentsPluginChunk
(
struct
_cmsContext_struct
*
ctx
,
const
struct
_cmsContext_struct
*
src
);
// Container for optimization plug-in
typedef
struct
{
struct
_cmsOptimizationCollection_st
*
OptimizationCollection
;
}
_cmsOptimizationPluginChunkType
;
// The global Context0 storage for optimizers plug-in
extern
_cmsOptimizationPluginChunkType
_cmsOptimizationPluginChunk
;
// Allocate and init optimizers container.
void
_cmsAllocOptimizationPluginChunk
(
struct
_cmsContext_struct
*
ctx
,
const
struct
_cmsContext_struct
*
src
);
// Container for transform plug-in
typedef
struct
{
struct
_cmsTransformCollection_st
*
TransformCollection
;
}
_cmsTransformPluginChunkType
;
// The global Context0 storage for full-transform replacement plug-in
extern
_cmsTransformPluginChunkType
_cmsTransformPluginChunk
;
// Allocate and init transform container.
void
_cmsAllocTransformPluginChunk
(
struct
_cmsContext_struct
*
ctx
,
const
struct
_cmsContext_struct
*
src
);
// Container for mutex plug-in
typedef
struct
{
_cmsCreateMutexFnPtrType
CreateMutexPtr
;
_cmsDestroyMutexFnPtrType
DestroyMutexPtr
;
_cmsLockMutexFnPtrType
LockMutexPtr
;
_cmsUnlockMutexFnPtrType
UnlockMutexPtr
;
}
_cmsMutexPluginChunkType
;
// The global Context0 storage for mutex plug-in
extern
_cmsMutexPluginChunkType
_cmsMutexPluginChunk
;
// Allocate and init mutex container.
void
_cmsAllocMutexPluginChunk
(
struct
_cmsContext_struct
*
ctx
,
const
struct
_cmsContext_struct
*
src
);
// ----------------------------------------------------------------------------------
// MLU internal representation
typedef
struct
{
...
...
@@ -347,10 +760,14 @@ typedef struct _cms_iccprofile_struct {
cmsBool
TagSaveAsRaw
[
MAX_TABLE_TAG
];
// True to write uncooked
void
*
TagPtrs
[
MAX_TABLE_TAG
];
cmsTagTypeHandler
*
TagTypeHandlers
[
MAX_TABLE_TAG
];
// Same structure may be serialized on different types
// depending on profile version, so we keep track of the // type handler for each tag in the list.
// depending on profile version, so we keep track of the
// type handler for each tag in the list.
// Special
cmsBool
IsWrite
;
// Keep a mutex for cmsReadTag -- Note that this only works if the user includes a mutex plugin
void
*
UsrMutex
;
}
_cmsICCPROFILE
;
// IO helpers for profiles
...
...
@@ -359,9 +776,9 @@ cmsBool _cmsWriteHeader(_cmsICCPROFILE* Icc, cmsUInt32Number UsedSp
int
_cmsSearchTag
(
_cmsICCPROFILE
*
Icc
,
cmsTagSignature
sig
,
cmsBool
lFollowLinks
);
// Tag types
cmsTagTypeHandler
*
_cmsGetTagTypeHandler
(
cmsTagTypeSignature
sig
);
cmsTagTypeHandler
*
_cmsGetTagTypeHandler
(
cms
Context
ContextID
,
cms
TagTypeSignature
sig
);
cmsTagTypeSignature
_cmsGetTagTrueType
(
cmsHPROFILE
hProfile
,
cmsTagSignature
sig
);
cmsTagDescriptor
*
_cmsGetTagDescriptor
(
cmsTagSignature
sig
);
cmsTagDescriptor
*
_cmsGetTagDescriptor
(
cms
Context
ContextID
,
cms
TagSignature
sig
);
// Error logging ---------------------------------------------------------------------------------------------------------
...
...
@@ -372,7 +789,7 @@ void _cmsTagSignature2String(char String[5], cmsTagSignature sig
cmsInterpParams
*
_cmsComputeInterpParams
(
cmsContext
ContextID
,
int
nSamples
,
int
InputChan
,
int
OutputChan
,
const
void
*
Table
,
cmsUInt32Number
dwFlags
);
cmsInterpParams
*
_cmsComputeInterpParamsEx
(
cmsContext
ContextID
,
const
cmsUInt32Number
nSamples
[],
int
InputChan
,
int
OutputChan
,
const
void
*
Table
,
cmsUInt32Number
dwFlags
);
void
_cmsFreeInterpParams
(
cmsInterpParams
*
p
);
cmsBool
_cmsSetInterpolationRoutine
(
cmsInterpParams
*
p
);
cmsBool
_cmsSetInterpolationRoutine
(
cms
Context
ContextID
,
cms
InterpParams
*
p
);
// Curves ----------------------------------------------------------------------------------------------------------------
...
...
@@ -503,7 +920,8 @@ cmsBool _cmsEndPointsBySpace(cmsColorSpaceSignature Space,
cmsUInt16Number
**
Black
,
cmsUInt32Number
*
nOutputs
);
cmsBool
_cmsOptimizePipeline
(
cmsPipeline
**
Lut
,
cmsBool
_cmsOptimizePipeline
(
cmsContext
ContextID
,
cmsPipeline
**
Lut
,
int
Intent
,
cmsUInt32Number
*
InputFormat
,
cmsUInt32Number
*
OutputFormat
,
...
...
@@ -528,7 +946,8 @@ cmsPipeline* _cmsCreateGamutCheckPipeline(cmsContext ContextID,
cmsBool
_cmsFormatterIsFloat
(
cmsUInt32Number
Type
);
cmsBool
_cmsFormatterIs8bit
(
cmsUInt32Number
Type
);
cmsFormatter
_cmsGetFormatter
(
cmsUInt32Number
Type
,
// Specific type, i.e. TYPE_RGB_8
cmsFormatter
_cmsGetFormatter
(
cmsContext
ContextID
,
cmsUInt32Number
Type
,
// Specific type, i.e. TYPE_RGB_8
cmsFormatterDirection
Dir
,
cmsUInt32Number
dwFlags
);
...
...
src/share/native/sun/java2d/cmm/lcms/lcms2_plugin.h
浏览文件 @
4352a351
...
...
@@ -231,6 +231,7 @@ typedef void* (* _cmsDupUserDataFn)(cmsContext ContextID, const void* Data);
#define cmsPluginMultiProcessElementSig 0x6D706548 // 'mpeH'
#define cmsPluginOptimizationSig 0x6F707448 // 'optH'
#define cmsPluginTransformSig 0x7A666D48 // 'xfmH'
#define cmsPluginMutexSig 0x6D747A48 // 'mtxH'
typedef
struct
_cmsPluginBaseStruct
{
...
...
@@ -247,19 +248,28 @@ typedef struct _cmsPluginBaseStruct {
//----------------------------------------------------------------------------------------------------------
// Memory handler. Each new plug-in type replaces current behaviour
typedef
void
*
(
*
_cmsMallocFnPtrType
)(
cmsContext
ContextID
,
cmsUInt32Number
size
);
typedef
void
(
*
_cmsFreeFnPtrType
)(
cmsContext
ContextID
,
void
*
Ptr
);
typedef
void
*
(
*
_cmsReallocFnPtrType
)(
cmsContext
ContextID
,
void
*
Ptr
,
cmsUInt32Number
NewSize
);
typedef
void
*
(
*
_cmsMalloZerocFnPtrType
)(
cmsContext
ContextID
,
cmsUInt32Number
size
);
typedef
void
*
(
*
_cmsCallocFnPtrType
)(
cmsContext
ContextID
,
cmsUInt32Number
num
,
cmsUInt32Number
size
);
typedef
void
*
(
*
_cmsDupFnPtrType
)(
cmsContext
ContextID
,
const
void
*
Org
,
cmsUInt32Number
size
);
typedef
struct
{
cmsPluginBase
base
;
// Required
void
*
(
*
MallocPtr
)(
cmsContext
ContextID
,
cmsUInt32Number
size
)
;
void
(
*
FreePtr
)(
cmsContext
ContextID
,
void
*
Ptr
)
;
void
*
(
*
ReallocPtr
)(
cmsContext
ContextID
,
void
*
Ptr
,
cmsUInt32Number
NewSize
)
;
_cmsMallocFnPtrType
MallocPtr
;
_cmsFreeFnPtrType
FreePtr
;
_cmsReallocFnPtrType
ReallocPtr
;
// Optional
void
*
(
*
MallocZeroPtr
)(
cmsContext
ContextID
,
cmsUInt32Number
size
)
;
void
*
(
*
CallocPtr
)(
cmsContext
ContextID
,
cmsUInt32Number
num
,
cmsUInt32Number
size
)
;
void
*
(
*
DupPtr
)(
cmsContext
ContextID
,
const
void
*
Org
,
cmsUInt32Number
size
)
;
_cmsMalloZerocFnPtrType
MallocZeroPtr
;
_cmsCallocFnPtrType
CallocPtr
;
_cmsDupFnPtrType
DupPtr
;
}
cmsPluginMemHandler
;
...
...
@@ -622,6 +632,29 @@ typedef struct {
}
cmsPluginTransform
;
//----------------------------------------------------------------------------------------------------------
// Mutex
typedef
void
*
(
*
_cmsCreateMutexFnPtrType
)(
cmsContext
ContextID
);
typedef
void
(
*
_cmsDestroyMutexFnPtrType
)(
cmsContext
ContextID
,
void
*
mtx
);
typedef
cmsBool
(
*
_cmsLockMutexFnPtrType
)(
cmsContext
ContextID
,
void
*
mtx
);
typedef
void
(
*
_cmsUnlockMutexFnPtrType
)(
cmsContext
ContextID
,
void
*
mtx
);
typedef
struct
{
cmsPluginBase
base
;
_cmsCreateMutexFnPtrType
CreateMutexPtr
;
_cmsDestroyMutexFnPtrType
DestroyMutexPtr
;
_cmsLockMutexFnPtrType
LockMutexPtr
;
_cmsUnlockMutexFnPtrType
UnlockMutexPtr
;
}
cmsPluginMutex
;
CMSAPI
void
*
CMSEXPORT
_cmsCreateMutex
(
cmsContext
ContextID
);
CMSAPI
void
CMSEXPORT
_cmsDestroyMutex
(
cmsContext
ContextID
,
void
*
mtx
);
CMSAPI
cmsBool
CMSEXPORT
_cmsLockMutex
(
cmsContext
ContextID
,
void
*
mtx
);
CMSAPI
void
CMSEXPORT
_cmsUnlockMutex
(
cmsContext
ContextID
,
void
*
mtx
);
#ifndef CMS_USE_CPP_API
# ifdef __cplusplus
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录