Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
dragonwell8_jdk
提交
8ef5b82f
D
dragonwell8_jdk
项目概览
openanolis
/
dragonwell8_jdk
通知
4
Star
2
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
D
dragonwell8_jdk
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
8ef5b82f
编写于
11月 01, 2008
作者:
B
bae
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
6541476: PNG imageio plugin incorrectly handles iTXt chunk
Reviewed-by: igor, prr
上级
c062ae81
变更
4
隐藏空白更改
内联
并排
Showing
4 changed file
with
313 addition
and
73 deletion
+313
-73
src/share/classes/com/sun/imageio/plugins/png/PNGImageReader.java
...e/classes/com/sun/imageio/plugins/png/PNGImageReader.java
+26
-16
src/share/classes/com/sun/imageio/plugins/png/PNGImageWriter.java
...e/classes/com/sun/imageio/plugins/png/PNGImageWriter.java
+23
-24
src/share/classes/com/sun/imageio/plugins/png/PNGMetadata.java
...hare/classes/com/sun/imageio/plugins/png/PNGMetadata.java
+28
-33
test/javax/imageio/plugins/png/ITXtTest.java
test/javax/imageio/plugins/png/ITXtTest.java
+236
-0
未找到文件。
src/share/classes/com/sun/imageio/plugins/png/PNGImageReader.java
浏览文件 @
8ef5b82f
...
@@ -44,7 +44,6 @@ import java.util.ArrayList;
...
@@ -44,7 +44,6 @@ import java.util.ArrayList;
import
java.util.Arrays
;
import
java.util.Arrays
;
import
java.util.Enumeration
;
import
java.util.Enumeration
;
import
java.util.Iterator
;
import
java.util.Iterator
;
import
java.util.List
;
import
java.util.zip.Inflater
;
import
java.util.zip.Inflater
;
import
java.util.zip.InflaterInputStream
;
import
java.util.zip.InflaterInputStream
;
import
javax.imageio.IIOException
;
import
javax.imageio.IIOException
;
...
@@ -57,6 +56,7 @@ import javax.imageio.stream.ImageInputStream;
...
@@ -57,6 +56,7 @@ import javax.imageio.stream.ImageInputStream;
import
com.sun.imageio.plugins.common.InputStreamAdapter
;
import
com.sun.imageio.plugins.common.InputStreamAdapter
;
import
com.sun.imageio.plugins.common.ReaderUtil
;
import
com.sun.imageio.plugins.common.ReaderUtil
;
import
com.sun.imageio.plugins.common.SubImageInputStream
;
import
com.sun.imageio.plugins.common.SubImageInputStream
;
import
java.io.ByteArrayOutputStream
;
import
sun.awt.image.ByteInterleavedRaster
;
import
sun.awt.image.ByteInterleavedRaster
;
class
PNGImageDataEnumeration
implements
Enumeration
{
class
PNGImageDataEnumeration
implements
Enumeration
{
...
@@ -207,6 +207,15 @@ public class PNGImageReader extends ImageReader {
...
@@ -207,6 +207,15 @@ public class PNGImageReader extends ImageReader {
resetStreamSettings
();
resetStreamSettings
();
}
}
private
String
readNullTerminatedString
(
String
charset
)
throws
IOException
{
ByteArrayOutputStream
baos
=
new
ByteArrayOutputStream
();
int
b
;
while
((
b
=
stream
.
read
())
!=
0
)
{
baos
.
write
(
b
);
}
return
new
String
(
baos
.
toByteArray
(),
charset
);
}
private
String
readNullTerminatedString
()
throws
IOException
{
private
String
readNullTerminatedString
()
throws
IOException
{
StringBuilder
b
=
new
StringBuilder
();
StringBuilder
b
=
new
StringBuilder
();
int
c
;
int
c
;
...
@@ -445,26 +454,27 @@ public class PNGImageReader extends ImageReader {
...
@@ -445,26 +454,27 @@ public class PNGImageReader extends ImageReader {
metadata
.
iTXt_keyword
.
add
(
keyword
);
metadata
.
iTXt_keyword
.
add
(
keyword
);
int
compressionFlag
=
stream
.
readUnsignedByte
();
int
compressionFlag
=
stream
.
readUnsignedByte
();
metadata
.
iTXt_compressionFlag
.
add
(
new
Integer
(
compressionFlag
));
metadata
.
iTXt_compressionFlag
.
add
(
Boolean
.
valueOf
(
compressionFlag
==
1
));
int
compressionMethod
=
stream
.
readUnsignedByte
();
int
compressionMethod
=
stream
.
readUnsignedByte
();
metadata
.
iTXt_compressionMethod
.
add
(
new
Integer
(
compressionMethod
));
metadata
.
iTXt_compressionMethod
.
add
(
Integer
.
valueOf
(
compressionMethod
));
String
languageTag
=
readNullTerminatedString
();
String
languageTag
=
readNullTerminatedString
(
"UTF8"
);
metadata
.
iTXt_languageTag
.
add
(
languageTag
);
metadata
.
iTXt_languageTag
.
add
(
languageTag
);
String
translatedKeyword
=
stream
.
readUTF
();
String
translatedKeyword
=
readNullTerminatedString
(
"UTF8"
);
metadata
.
iTXt_translatedKeyword
.
add
(
translatedKeyword
);
metadata
.
iTXt_translatedKeyword
.
add
(
translatedKeyword
);
stream
.
skipBytes
(
1
);
// Null separator
String
text
;
String
text
;
long
pos
=
stream
.
getStreamPosition
();
byte
[]
b
=
new
byte
[(
int
)(
chunkStart
+
chunkLength
-
pos
)];
stream
.
readFully
(
b
);
if
(
compressionFlag
==
1
)
{
// Decompress the text
if
(
compressionFlag
==
1
)
{
// Decompress the text
long
pos
=
stream
.
getStreamPosition
();
text
=
new
String
(
inflate
(
b
),
"UTF8"
);
byte
[]
b
=
new
byte
[(
int
)(
chunkStart
+
chunkLength
-
pos
)];
stream
.
readFully
(
b
);
text
=
inflate
(
b
);
}
else
{
}
else
{
text
=
stream
.
readUTF
(
);
text
=
new
String
(
b
,
"UTF8"
);
}
}
metadata
.
iTXt_text
.
add
(
text
);
metadata
.
iTXt_text
.
add
(
text
);
}
}
...
@@ -613,20 +623,20 @@ public class PNGImageReader extends ImageReader {
...
@@ -613,20 +623,20 @@ public class PNGImageReader extends ImageReader {
metadata
.
tRNS_present
=
true
;
metadata
.
tRNS_present
=
true
;
}
}
private
static
String
inflate
(
byte
[]
b
)
throws
IOException
{
private
static
byte
[]
inflate
(
byte
[]
b
)
throws
IOException
{
InputStream
bais
=
new
ByteArrayInputStream
(
b
);
InputStream
bais
=
new
ByteArrayInputStream
(
b
);
InputStream
iis
=
new
InflaterInputStream
(
bais
);
InputStream
iis
=
new
InflaterInputStream
(
bais
);
ByteArrayOutputStream
baos
=
new
ByteArrayOutputStream
();
StringBuilder
sb
=
new
StringBuilder
(
80
);
int
c
;
int
c
;
try
{
try
{
while
((
c
=
iis
.
read
())
!=
-
1
)
{
while
((
c
=
iis
.
read
())
!=
-
1
)
{
sb
.
append
((
char
)
c
);
baos
.
write
(
c
);
}
}
}
finally
{
}
finally
{
iis
.
close
();
iis
.
close
();
}
}
return
sb
.
toString
();
return
baos
.
toByteArray
();
}
}
private
void
parse_zTXt_chunk
(
int
chunkLength
)
throws
IOException
{
private
void
parse_zTXt_chunk
(
int
chunkLength
)
throws
IOException
{
...
@@ -638,7 +648,7 @@ public class PNGImageReader extends ImageReader {
...
@@ -638,7 +648,7 @@ public class PNGImageReader extends ImageReader {
byte
[]
b
=
new
byte
[
chunkLength
-
keyword
.
length
()
-
2
];
byte
[]
b
=
new
byte
[
chunkLength
-
keyword
.
length
()
-
2
];
stream
.
readFully
(
b
);
stream
.
readFully
(
b
);
metadata
.
zTXt_text
.
add
(
inflate
(
b
));
metadata
.
zTXt_text
.
add
(
new
String
(
inflate
(
b
)
));
}
}
private
void
readMetadata
()
throws
IIOException
{
private
void
readMetadata
()
throws
IIOException
{
...
...
src/share/classes/com/sun/imageio/plugins/png/PNGImageWriter.java
浏览文件 @
8ef5b82f
...
@@ -671,13 +671,13 @@ public class PNGImageWriter extends ImageWriter {
...
@@ -671,13 +671,13 @@ public class PNGImageWriter extends ImageWriter {
}
}
}
}
private
byte
[]
deflate
(
String
s
)
throws
IOException
{
private
byte
[]
deflate
(
byte
[]
b
)
throws
IOException
{
ByteArrayOutputStream
baos
=
new
ByteArrayOutputStream
();
ByteArrayOutputStream
baos
=
new
ByteArrayOutputStream
();
DeflaterOutputStream
dos
=
new
DeflaterOutputStream
(
baos
);
DeflaterOutputStream
dos
=
new
DeflaterOutputStream
(
baos
);
int
len
=
s
.
length
()
;
int
len
=
b
.
length
;
for
(
int
i
=
0
;
i
<
len
;
i
++)
{
for
(
int
i
=
0
;
i
<
len
;
i
++)
{
dos
.
write
((
int
)
s
.
charAt
(
i
));
dos
.
write
((
int
)
(
0xff
&
b
[
i
]
));
}
}
dos
.
close
();
dos
.
close
();
...
@@ -685,38 +685,37 @@ public class PNGImageWriter extends ImageWriter {
...
@@ -685,38 +685,37 @@ public class PNGImageWriter extends ImageWriter {
}
}
private
void
write_iTXt
()
throws
IOException
{
private
void
write_iTXt
()
throws
IOException
{
Iterator
keywordIter
=
metadata
.
iTXt_keyword
.
iterator
();
Iterator
<
String
>
keywordIter
=
metadata
.
iTXt_keyword
.
iterator
();
Iterator
flagIter
=
metadata
.
iTXt_compressionFlag
.
iterator
();
Iterator
<
Boolean
>
flagIter
=
metadata
.
iTXt_compressionFlag
.
iterator
();
Iterator
methodIter
=
metadata
.
iTXt_compressionMethod
.
iterator
();
Iterator
<
Integer
>
methodIter
=
metadata
.
iTXt_compressionMethod
.
iterator
();
Iterator
languageIter
=
metadata
.
iTXt_languageTag
.
iterator
();
Iterator
<
String
>
languageIter
=
metadata
.
iTXt_languageTag
.
iterator
();
Iterator
translatedKeywordIter
=
Iterator
<
String
>
translatedKeywordIter
=
metadata
.
iTXt_translatedKeyword
.
iterator
();
metadata
.
iTXt_translatedKeyword
.
iterator
();
Iterator
textIter
=
metadata
.
iTXt_text
.
iterator
();
Iterator
<
String
>
textIter
=
metadata
.
iTXt_text
.
iterator
();
while
(
keywordIter
.
hasNext
())
{
while
(
keywordIter
.
hasNext
())
{
ChunkStream
cs
=
new
ChunkStream
(
PNGImageReader
.
iTXt_TYPE
,
stream
);
ChunkStream
cs
=
new
ChunkStream
(
PNGImageReader
.
iTXt_TYPE
,
stream
);
String
keyword
=
(
String
)
keywordIter
.
next
();
cs
.
writeBytes
(
keyword
);
cs
.
writeBytes
(
keyword
Iter
.
next
()
);
cs
.
writeByte
(
0
);
cs
.
writeByte
(
0
);
int
flag
=
((
Integer
)
flagIter
.
next
()).
intValue
();
Boolean
compressed
=
flagIter
.
next
();
cs
.
writeByte
(
flag
);
cs
.
writeByte
(
compressed
?
1
:
0
);
int
method
=
((
Integer
)
methodIter
.
next
()).
intValue
();
cs
.
writeByte
(
method
);
String
languageTag
=
(
String
)
languageIter
.
next
();
cs
.
writeByte
(
methodIter
.
next
().
intValue
());
cs
.
writeBytes
(
languageTag
);
cs
.
writeBytes
(
languageIter
.
next
());
cs
.
writeByte
(
0
);
cs
.
writeByte
(
0
);
String
translatedKeyword
=
(
String
)
translatedKeywordIter
.
next
();
cs
.
write
Bytes
(
translatedKeyword
);
cs
.
write
(
translatedKeywordIter
.
next
().
getBytes
(
"UTF8"
)
);
cs
.
writeByte
(
0
);
cs
.
writeByte
(
0
);
String
text
=
(
String
)
textIter
.
next
();
String
text
=
textIter
.
next
();
if
(
flag
==
1
)
{
if
(
compressed
)
{
cs
.
write
(
deflate
(
text
));
cs
.
write
(
deflate
(
text
.
getBytes
(
"UTF8"
)
));
}
else
{
}
else
{
cs
.
write
UTF
(
text
);
cs
.
write
(
text
.
getBytes
(
"UTF8"
)
);
}
}
cs
.
finish
();
cs
.
finish
();
}
}
...
@@ -737,7 +736,7 @@ public class PNGImageWriter extends ImageWriter {
...
@@ -737,7 +736,7 @@ public class PNGImageWriter extends ImageWriter {
cs
.
writeByte
(
compressionMethod
);
cs
.
writeByte
(
compressionMethod
);
String
text
=
(
String
)
textIter
.
next
();
String
text
=
(
String
)
textIter
.
next
();
cs
.
write
(
deflate
(
text
));
cs
.
write
(
deflate
(
text
.
getBytes
()
));
cs
.
finish
();
cs
.
finish
();
}
}
}
}
...
...
src/share/classes/com/sun/imageio/plugins/png/PNGMetadata.java
浏览文件 @
8ef5b82f
...
@@ -174,12 +174,12 @@ public class PNGMetadata extends IIOMetadata implements Cloneable {
...
@@ -174,12 +174,12 @@ public class PNGMetadata extends IIOMetadata implements Cloneable {
public
byte
[]
iCCP_compressedProfile
;
public
byte
[]
iCCP_compressedProfile
;
// iTXt chunk
// iTXt chunk
public
ArrayList
iTXt_keyword
=
new
ArrayList
();
// Strings
public
ArrayList
<
String
>
iTXt_keyword
=
new
ArrayList
<
String
>();
public
ArrayList
iTXt_compressionFlag
=
new
ArrayList
();
// Integers
public
ArrayList
<
Boolean
>
iTXt_compressionFlag
=
new
ArrayList
<
Boolean
>();
public
ArrayList
iTXt_compressionMethod
=
new
ArrayList
();
// Integers
public
ArrayList
<
Integer
>
iTXt_compressionMethod
=
new
ArrayList
<
Integer
>();
public
ArrayList
iTXt_languageTag
=
new
ArrayList
();
// Strings
public
ArrayList
<
String
>
iTXt_languageTag
=
new
ArrayList
<
String
>();
public
ArrayList
iTXt_translatedKeyword
=
new
ArrayList
();
// Strings
public
ArrayList
<
String
>
iTXt_translatedKeyword
=
new
ArrayList
<
String
>();
public
ArrayList
iTXt_text
=
new
ArrayList
();
// Strings
public
ArrayList
<
String
>
iTXt_text
=
new
ArrayList
<
String
>();
// pHYs chunk
// pHYs chunk
public
boolean
pHYs_present
;
public
boolean
pHYs_present
;
...
@@ -597,19 +597,17 @@ public class PNGMetadata extends IIOMetadata implements Cloneable {
...
@@ -597,19 +597,17 @@ public class PNGMetadata extends IIOMetadata implements Cloneable {
if
(
iTXt_keyword
.
size
()
>
0
)
{
if
(
iTXt_keyword
.
size
()
>
0
)
{
IIOMetadataNode
iTXt_parent
=
new
IIOMetadataNode
(
"iTXt"
);
IIOMetadataNode
iTXt_parent
=
new
IIOMetadataNode
(
"iTXt"
);
for
(
int
i
=
0
;
i
<
iTXt_keyword
.
size
();
i
++)
{
for
(
int
i
=
0
;
i
<
iTXt_keyword
.
size
();
i
++)
{
Integer
val
;
IIOMetadataNode
iTXt_node
=
new
IIOMetadataNode
(
"iTXtEntry"
);
IIOMetadataNode
iTXt_node
=
new
IIOMetadataNode
(
"iTXtEntry"
);
iTXt_node
.
setAttribute
(
"keyword"
,
(
String
)
iTXt_keyword
.
get
(
i
));
iTXt_node
.
setAttribute
(
"keyword"
,
iTXt_keyword
.
get
(
i
));
val
=
(
Integer
)
iTXt_compressionFlag
.
get
(
i
);
iTXt_node
.
setAttribute
(
"compressionFlag"
,
iTXt_node
.
setAttribute
(
"compressionFlag"
,
val
.
toString
()
);
iTXt_compressionFlag
.
get
(
i
)
?
"1"
:
"0"
);
val
=
(
Integer
)
iTXt_compressionMethod
.
get
(
i
);
iTXt_node
.
setAttribute
(
"compressionMethod"
,
iTXt_node
.
setAttribute
(
"compressionMethod"
,
val
.
toString
());
iTXt_compressionMethod
.
get
(
i
)
.
toString
());
iTXt_node
.
setAttribute
(
"languageTag"
,
iTXt_node
.
setAttribute
(
"languageTag"
,
(
String
)
iTXt_languageTag
.
get
(
i
));
iTXt_languageTag
.
get
(
i
));
iTXt_node
.
setAttribute
(
"translatedKeyword"
,
iTXt_node
.
setAttribute
(
"translatedKeyword"
,
(
String
)
iTXt_translatedKeyword
.
get
(
i
));
iTXt_translatedKeyword
.
get
(
i
));
iTXt_node
.
setAttribute
(
"text"
,
(
String
)
iTXt_text
.
get
(
i
));
iTXt_node
.
setAttribute
(
"text"
,
iTXt_text
.
get
(
i
));
iTXt_parent
.
appendChild
(
iTXt_node
);
iTXt_parent
.
appendChild
(
iTXt_node
);
}
}
...
@@ -1037,11 +1035,11 @@ public class PNGMetadata extends IIOMetadata implements Cloneable {
...
@@ -1037,11 +1035,11 @@ public class PNGMetadata extends IIOMetadata implements Cloneable {
for
(
int
i
=
0
;
i
<
iTXt_keyword
.
size
();
i
++)
{
for
(
int
i
=
0
;
i
<
iTXt_keyword
.
size
();
i
++)
{
node
=
new
IIOMetadataNode
(
"TextEntry"
);
node
=
new
IIOMetadataNode
(
"TextEntry"
);
node
.
setAttribute
(
"keyword"
,
(
String
)
iTXt_keyword
.
get
(
i
));
node
.
setAttribute
(
"keyword"
,
iTXt_keyword
.
get
(
i
));
node
.
setAttribute
(
"value"
,
(
String
)
iTXt_text
.
get
(
i
));
node
.
setAttribute
(
"value"
,
iTXt_text
.
get
(
i
));
node
.
setAttribute
(
"language"
,
node
.
setAttribute
(
"language"
,
(
String
)
iTXt_languageTag
.
get
(
i
));
iTXt_languageTag
.
get
(
i
));
if
(
((
Integer
)
iTXt_compressionFlag
.
get
(
i
)).
intValue
()
==
1
)
{
if
(
iTXt_compressionFlag
.
get
(
i
)
)
{
node
.
setAttribute
(
"compression"
,
"deflate"
);
node
.
setAttribute
(
"compression"
,
"deflate"
);
}
else
{
}
else
{
node
.
setAttribute
(
"compression"
,
"none"
);
node
.
setAttribute
(
"compression"
,
"none"
);
...
@@ -1427,11 +1425,11 @@ public class PNGMetadata extends IIOMetadata implements Cloneable {
...
@@ -1427,11 +1425,11 @@ public class PNGMetadata extends IIOMetadata implements Cloneable {
boolean
compressionFlag
=
boolean
compressionFlag
=
getBooleanAttribute
(
iTXt_node
,
"compressionFlag"
);
getBooleanAttribute
(
iTXt_node
,
"compressionFlag"
);
iTXt_compressionFlag
.
add
(
new
Boolean
(
compressionFlag
));
iTXt_compressionFlag
.
add
(
Boolean
.
valueOf
(
compressionFlag
));
String
compressionMethod
=
String
compressionMethod
=
getAttribute
(
iTXt_node
,
"compressionMethod"
);
getAttribute
(
iTXt_node
,
"compressionMethod"
);
iTXt_compressionMethod
.
add
(
compressionMethod
);
iTXt_compressionMethod
.
add
(
Integer
.
valueOf
(
compressionMethod
)
);
String
languageTag
=
String
languageTag
=
getAttribute
(
iTXt_node
,
"languageTag"
);
getAttribute
(
iTXt_node
,
"languageTag"
);
...
@@ -1950,13 +1948,10 @@ public class PNGMetadata extends IIOMetadata implements Cloneable {
...
@@ -1950,13 +1948,10 @@ public class PNGMetadata extends IIOMetadata implements Cloneable {
tEXt_text
.
add
(
value
);
tEXt_text
.
add
(
value
);
}
}
}
else
{
}
else
{
int
flag
=
compression
.
equals
(
"zip"
)
?
1
:
0
;
// Use an iTXt node
// Use an iTXt node
iTXt_keyword
.
add
(
keyword
);
iTXt_keyword
.
add
(
keyword
);
iTXt_compressionFlag
.
add
(
new
Integer
(
flag
));
iTXt_compressionFlag
.
add
(
Boolean
.
valueOf
(
compression
.
equals
(
"zip"
)
));
iTXt_compressionMethod
.
add
(
new
Integer
(
0
));
iTXt_compressionMethod
.
add
(
Integer
.
valueOf
(
0
));
iTXt_languageTag
.
add
(
language
);
iTXt_languageTag
.
add
(
language
);
iTXt_translatedKeyword
.
add
(
keyword
);
// fake it
iTXt_translatedKeyword
.
add
(
keyword
);
// fake it
iTXt_text
.
add
(
value
);
iTXt_text
.
add
(
value
);
...
@@ -1993,12 +1988,12 @@ public class PNGMetadata extends IIOMetadata implements Cloneable {
...
@@ -1993,12 +1988,12 @@ public class PNGMetadata extends IIOMetadata implements Cloneable {
gAMA_present
=
false
;
gAMA_present
=
false
;
hIST_present
=
false
;
hIST_present
=
false
;
iCCP_present
=
false
;
iCCP_present
=
false
;
iTXt_keyword
=
new
ArrayList
();
iTXt_keyword
=
new
ArrayList
<
String
>
();
iTXt_compressionFlag
=
new
ArrayList
();
iTXt_compressionFlag
=
new
ArrayList
<
Boolean
>
();
iTXt_compressionMethod
=
new
ArrayList
();
iTXt_compressionMethod
=
new
ArrayList
<
Integer
>
();
iTXt_languageTag
=
new
ArrayList
();
iTXt_languageTag
=
new
ArrayList
<
String
>
();
iTXt_translatedKeyword
=
new
ArrayList
();
iTXt_translatedKeyword
=
new
ArrayList
<
String
>
();
iTXt_text
=
new
ArrayList
();
iTXt_text
=
new
ArrayList
<
String
>
();
pHYs_present
=
false
;
pHYs_present
=
false
;
sBIT_present
=
false
;
sBIT_present
=
false
;
sPLT_present
=
false
;
sPLT_present
=
false
;
...
...
test/javax/imageio/plugins/png/ITXtTest.java
0 → 100644
浏览文件 @
8ef5b82f
/*
* Copyright 2008 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
* CA 95054 USA or visit www.sun.com if you need additional information or
* have any questions.
*/
/**
* @test
* @bug 6541476
* @summary Test verifies that ImageIO PNG plugin correcly handles the
* iTxt chunk (International textual data).
*
* @run main ITXtTest
*/
import
java.awt.Color
;
import
java.awt.Graphics2D
;
import
java.awt.image.BufferedImage
;
import
java.io.File
;
import
javax.imageio.ImageIO
;
import
javax.imageio.ImageReader
;
import
javax.imageio.IIOImage
;
import
javax.imageio.ImageTypeSpecifier
;
import
javax.imageio.ImageWriter
;
import
javax.imageio.metadata.IIOMetadata
;
import
javax.imageio.metadata.IIOMetadataNode
;
import
javax.imageio.stream.ImageOutputStream
;
import
javax.imageio.stream.ImageInputStream
;
import
org.w3c.dom.Node
;
public
class
ITXtTest
{
static
public
void
main
(
String
args
[])
{
ITXtTest
t_en
=
new
ITXtTest
();
t_en
.
description
=
"xml - en"
;
t_en
.
keyword
=
"XML:com.adobe.xmp"
;
t_en
.
isCompressed
=
false
;
t_en
.
compression
=
0
;
t_en
.
language
=
"en"
;
t_en
.
trasKeyword
=
"XML:com.adobe.xmp"
;
t_en
.
text
=
"<xml>Something</xml>"
;
doTest
(
t_en
);
// check compression case
t_en
.
isCompressed
=
true
;
t_en
.
description
=
"xml - en - compressed"
;
doTest
(
t_en
);
ITXtTest
t_ru
=
new
ITXtTest
();
t_ru
.
description
=
"xml - ru"
;
t_ru
.
keyword
=
"XML:com.adobe.xmp"
;
t_ru
.
isCompressed
=
false
;
t_ru
.
compression
=
0
;
t_ru
.
language
=
"ru"
;
t_ru
.
trasKeyword
=
"\u0410\u0410\u0410\u0410\u0410 XML"
;
t_ru
.
text
=
"<xml>\u042A\u042F\u042F\u042F\u042F\u042F\u042F</xml>"
;
doTest
(
t_ru
);
t_ru
.
isCompressed
=
true
;
t_ru
.
description
=
"xml - ru - compressed"
;
doTest
(
t_ru
);
}
String
description
;
String
keyword
;
boolean
isCompressed
;
int
compression
;
String
language
;
String
trasKeyword
;
String
text
;
public
IIOMetadataNode
getNode
()
{
IIOMetadataNode
iTXt
=
new
IIOMetadataNode
(
"iTXt"
);
IIOMetadataNode
iTXtEntry
=
new
IIOMetadataNode
(
"iTXtEntry"
);
iTXtEntry
.
setAttribute
(
"keyword"
,
keyword
);
iTXtEntry
.
setAttribute
(
"compressionFlag"
,
isCompressed
?
"true"
:
"false"
);
iTXtEntry
.
setAttribute
(
"compressionMethod"
,
Integer
.
toString
(
compression
));
iTXtEntry
.
setAttribute
(
"languageTag"
,
language
);
iTXtEntry
.
setAttribute
(
"translatedKeyword"
,
trasKeyword
);
iTXtEntry
.
setAttribute
(
"text"
,
text
);
iTXt
.
appendChild
(
iTXtEntry
);
return
iTXt
;
}
public
static
ITXtTest
getFromNode
(
IIOMetadataNode
n
)
{
ITXtTest
t
=
new
ITXtTest
();
if
(!
"iTXt"
.
equals
(
n
.
getNodeName
()))
{
throw
new
RuntimeException
(
"Invalid node"
);
}
IIOMetadataNode
e
=
(
IIOMetadataNode
)
n
.
getFirstChild
();
if
(!
"iTXtEntry"
.
equals
(
e
.
getNodeName
()))
{
throw
new
RuntimeException
(
"Invalid entry node"
);
}
t
.
keyword
=
e
.
getAttribute
(
"keyword"
);
t
.
isCompressed
=
(
Integer
.
valueOf
(
e
.
getAttribute
(
"compressionFlag"
)).
intValue
()
==
1
);
t
.
compression
=
Integer
.
valueOf
(
e
.
getAttribute
(
"compressionMethod"
)).
intValue
();
t
.
language
=
e
.
getAttribute
(
"languageTag"
);
t
.
trasKeyword
=
e
.
getAttribute
(
"translatedKeyword"
);
t
.
text
=
e
.
getAttribute
(
"text"
);
return
t
;
}
@Override
public
boolean
equals
(
Object
o
)
{
if
(!
(
o
instanceof
ITXtTest
))
{
return
false
;
}
ITXtTest
t
=
(
ITXtTest
)
o
;
if
(!
keyword
.
equals
(
t
.
keyword
))
{
return
false
;
}
if
(
isCompressed
!=
t
.
isCompressed
)
{
return
false
;
}
if
(
compression
!=
t
.
compression
)
{
return
false
;
}
if
(!
language
.
equals
(
t
.
language
))
{
return
false
;
}
if
(!
trasKeyword
.
equals
(
t
.
trasKeyword
))
{
return
false
;
}
if
(!
text
.
equals
(
t
.
text
))
{
return
false
;
}
return
true
;
}
private
static
void
doTest
(
ITXtTest
src
)
{
System
.
out
.
println
(
"Test: "
+
src
.
description
);
File
file
=
new
File
(
"test.png"
);
writeTo
(
file
,
src
);
ITXtTest
dst
=
readFrom
(
file
);
if
(
dst
==
null
||
!
dst
.
equals
(
src
))
{
throw
new
RuntimeException
(
"Test failed."
);
}
System
.
out
.
println
(
"Test passed."
);
}
private
static
void
writeTo
(
File
f
,
ITXtTest
t
)
{
BufferedImage
src
=
createBufferedImage
();
try
{
ImageOutputStream
imageOutputStream
=
ImageIO
.
createImageOutputStream
(
f
);
ImageTypeSpecifier
imageTypeSpecifier
=
new
ImageTypeSpecifier
(
src
);
ImageWriter
imageWriter
=
ImageIO
.
getImageWritersByFormatName
(
"PNG"
).
next
();
imageWriter
.
setOutput
(
imageOutputStream
);
IIOMetadata
m
=
imageWriter
.
getDefaultImageMetadata
(
imageTypeSpecifier
,
null
);
String
format
=
m
.
getNativeMetadataFormatName
();
Node
root
=
m
.
getAsTree
(
format
);
IIOMetadataNode
iTXt
=
t
.
getNode
();
root
.
appendChild
(
iTXt
);
m
.
setFromTree
(
format
,
root
);
imageWriter
.
write
(
new
IIOImage
(
src
,
null
,
m
));
imageOutputStream
.
close
();
System
.
out
.
println
(
"Writing done."
);
}
catch
(
Throwable
e
)
{
throw
new
RuntimeException
(
"Writing test failed."
,
e
);
}
}
private
static
ITXtTest
readFrom
(
File
f
)
{
try
{
ImageInputStream
iis
=
ImageIO
.
createImageInputStream
(
f
);
ImageReader
r
=
ImageIO
.
getImageReaders
(
iis
).
next
();
r
.
setInput
(
iis
);
IIOImage
dst
=
r
.
readAll
(
0
,
null
);
// look for iTXt node
IIOMetadata
m
=
dst
.
getMetadata
();
Node
root
=
m
.
getAsTree
(
m
.
getNativeMetadataFormatName
());
Node
n
=
root
.
getFirstChild
();
while
(
n
!=
null
&&
!
"iTXt"
.
equals
(
n
.
getNodeName
()))
{
n
=
n
.
getNextSibling
();
}
if
(
n
==
null
)
{
throw
new
RuntimeException
(
"No iTXt node!"
);
}
ITXtTest
t
=
ITXtTest
.
getFromNode
((
IIOMetadataNode
)
n
);
return
t
;
}
catch
(
Throwable
e
)
{
throw
new
RuntimeException
(
"Reading test failed."
,
e
);
}
}
private
static
BufferedImage
createBufferedImage
()
{
BufferedImage
image
=
new
BufferedImage
(
128
,
128
,
BufferedImage
.
TYPE_4BYTE_ABGR_PRE
);
Graphics2D
graph
=
image
.
createGraphics
();
graph
.
setPaintMode
();
graph
.
setColor
(
Color
.
orange
);
graph
.
fillRect
(
32
,
32
,
64
,
64
);
graph
.
dispose
();
return
image
;
}
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录