Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
dragonwell8_jdk
提交
a7819983
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看板
提交
a7819983
编写于
2月 05, 2015
作者:
S
serb
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
4952954: abort flag is not cleared for every write operation for JPEG ImageWriter
Reviewed-by: bae, prr
上级
1eb22ea1
变更
2
显示空白变更内容
内联
并排
Showing
2 changed file
with
237 addition
and
4 deletion
+237
-4
src/share/classes/com/sun/imageio/plugins/jpeg/JPEGImageWriter.java
...classes/com/sun/imageio/plugins/jpeg/JPEGImageWriter.java
+25
-4
test/javax/imageio/plugins/shared/WriteAfterAbort.java
test/javax/imageio/plugins/shared/WriteAfterAbort.java
+212
-0
未找到文件。
src/share/classes/com/sun/imageio/plugins/jpeg/JPEGImageWriter.java
浏览文件 @
a7819983
/*
* Copyright (c) 2000, 201
3
, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2000, 201
5
, Oracle and/or its affiliates. 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
...
...
@@ -43,8 +43,6 @@ import org.w3c.dom.Node;
import
java.awt.image.Raster
;
import
java.awt.image.WritableRaster
;
import
java.awt.image.SampleModel
;
import
java.awt.image.DataBuffer
;
import
java.awt.image.DataBufferByte
;
import
java.awt.image.ColorModel
;
import
java.awt.image.IndexColorModel
;
...
...
@@ -1048,7 +1046,13 @@ public class JPEGImageWriter extends ImageWriter {
// Call the writer, who will call back for every scanline
clearAbortRequest
();
cbLock
.
lock
();
try
{
processImageStarted
(
currentImage
);
}
finally
{
cbLock
.
unlock
();
}
boolean
aborted
=
false
;
...
...
@@ -1225,6 +1229,23 @@ public class JPEGImageWriter extends ImageWriter {
}
}
@Override
protected
synchronized
void
clearAbortRequest
()
{
setThreadLock
();
try
{
cbLock
.
check
();
if
(
abortRequested
())
{
super
.
clearAbortRequest
();
// reset C structures
resetWriter
(
structPointer
);
// reset the native destination
setDest
(
structPointer
);
}
}
finally
{
clearThreadLock
();
}
}
private
void
resetInternalState
()
{
// reset C structures
resetWriter
(
structPointer
);
...
...
test/javax/imageio/plugins/shared/WriteAfterAbort.java
0 → 100644
浏览文件 @
a7819983
/*
* Copyright (c) 2015, Oracle and/or its affiliates. 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
import
java.awt.Color
;
import
java.awt.Graphics2D
;
import
java.awt.image.BufferedImage
;
import
java.io.File
;
import
java.io.FileNotFoundException
;
import
java.io.FileOutputStream
;
import
java.io.IOException
;
import
java.util.Iterator
;
import
javax.imageio.ImageIO
;
import
javax.imageio.ImageWriter
;
import
javax.imageio.event.IIOWriteProgressListener
;
import
javax.imageio.spi.IIORegistry
;
import
javax.imageio.spi.ImageWriterSpi
;
import
javax.imageio.stream.ImageOutputStream
;
import
static
java
.
awt
.
image
.
BufferedImage
.
TYPE_BYTE_BINARY
;
/**
* @test
* @bug 4952954
* @summary abortFlag must be cleared for every ImageWriter.write operation
* @author Sergey Bylokhov
*/
public
final
class
WriteAfterAbort
implements
IIOWriteProgressListener
{
private
volatile
boolean
abortFlag
=
true
;
private
volatile
boolean
isAbortCalled
;
private
volatile
boolean
isCompleteCalled
;
private
volatile
boolean
isProgressCalled
;
private
volatile
boolean
isStartedCalled
;
private
static
final
int
WIDTH
=
100
;
private
static
final
int
HEIGHT
=
100
;
private
void
test
(
final
ImageWriter
writer
)
throws
IOException
{
// Image initialization
final
BufferedImage
imageWrite
=
new
BufferedImage
(
WIDTH
,
HEIGHT
,
TYPE_BYTE_BINARY
);
final
Graphics2D
g
=
imageWrite
.
createGraphics
();
g
.
setColor
(
Color
.
WHITE
);
g
.
fillRect
(
0
,
0
,
WIDTH
,
HEIGHT
);
g
.
dispose
();
// File initialization
final
File
file
=
File
.
createTempFile
(
"temp"
,
".img"
);
file
.
deleteOnExit
();
final
FileOutputStream
fos
=
new
SkipWriteOnAbortOutputStream
(
file
);
final
ImageOutputStream
ios
=
ImageIO
.
createImageOutputStream
(
fos
);
writer
.
setOutput
(
ios
);
writer
.
addIIOWriteProgressListener
(
this
);
// This write will be aborted, and file will not be touched
writer
.
write
(
imageWrite
);
if
(!
isStartedCalled
)
{
throw
new
RuntimeException
(
"Started should be called"
);
}
if
(!
isProgressCalled
)
{
throw
new
RuntimeException
(
"Progress should be called"
);
}
if
(!
isAbortCalled
)
{
throw
new
RuntimeException
(
"Abort should be called"
);
}
if
(
isCompleteCalled
)
{
throw
new
RuntimeException
(
"Complete should not be called"
);
}
// Flush aborted data
ios
.
flush
();
// This write should be completed successfully and the file should
// contain correct image data.
abortFlag
=
false
;
isAbortCalled
=
false
;
isCompleteCalled
=
false
;
isProgressCalled
=
false
;
isStartedCalled
=
false
;
writer
.
write
(
imageWrite
);
if
(!
isStartedCalled
)
{
throw
new
RuntimeException
(
"Started should be called"
);
}
if
(!
isProgressCalled
)
{
throw
new
RuntimeException
(
"Progress should be called"
);
}
if
(
isAbortCalled
)
{
throw
new
RuntimeException
(
"Abort should not be called"
);
}
if
(!
isCompleteCalled
)
{
throw
new
RuntimeException
(
"Complete should be called"
);
}
writer
.
dispose
();
ios
.
close
();
// Validates content of the file.
final
BufferedImage
imageRead
=
ImageIO
.
read
(
file
);
for
(
int
x
=
0
;
x
<
WIDTH
;
++
x
)
{
for
(
int
y
=
0
;
y
<
HEIGHT
;
++
y
)
{
if
(
imageRead
.
getRGB
(
x
,
y
)
!=
imageWrite
.
getRGB
(
x
,
y
))
{
throw
new
RuntimeException
(
"Test failed."
);
}
}
}
}
public
static
void
main
(
final
String
[]
args
)
throws
IOException
{
final
IIORegistry
registry
=
IIORegistry
.
getDefaultInstance
();
final
Iterator
<
ImageWriterSpi
>
iter
=
registry
.
getServiceProviders
(
ImageWriterSpi
.
class
,
provider
->
true
,
true
);
// Validates all supported ImageWriters
while
(
iter
.
hasNext
())
{
final
WriteAfterAbort
writeAfterAbort
=
new
WriteAfterAbort
();
final
ImageWriter
writer
=
iter
.
next
().
createWriterInstance
();
System
.
out
.
println
(
"ImageWriter = "
+
writer
);
writeAfterAbort
.
test
(
writer
);
}
System
.
out
.
println
(
"Test passed"
);
}
// Callbacks
@Override
public
void
imageComplete
(
ImageWriter
source
)
{
isCompleteCalled
=
true
;
}
@Override
public
void
imageProgress
(
ImageWriter
source
,
float
percentageDone
)
{
isProgressCalled
=
true
;
if
(
percentageDone
>
50
&&
abortFlag
)
{
source
.
abort
();
}
}
@Override
public
void
imageStarted
(
ImageWriter
source
,
int
imageIndex
)
{
isStartedCalled
=
true
;
}
@Override
public
void
writeAborted
(
final
ImageWriter
source
)
{
isAbortCalled
=
true
;
}
@Override
public
void
thumbnailComplete
(
ImageWriter
source
)
{
}
@Override
public
void
thumbnailProgress
(
ImageWriter
source
,
float
percentageDone
)
{
}
@Override
public
void
thumbnailStarted
(
ImageWriter
source
,
int
imageIndex
,
int
thumbnailIndex
)
{
}
/**
* We need to skip writes on abort, because content of the file after abort
* is undefined.
*/
private
class
SkipWriteOnAbortOutputStream
extends
FileOutputStream
{
SkipWriteOnAbortOutputStream
(
File
file
)
throws
FileNotFoundException
{
super
(
file
);
}
@Override
public
void
write
(
int
b
)
throws
IOException
{
if
(!
abortFlag
)
{
super
.
write
(
b
);
}
}
@Override
public
void
write
(
byte
[]
b
)
throws
IOException
{
if
(!
abortFlag
)
{
super
.
write
(
b
);
}
}
@Override
public
void
write
(
byte
[]
b
,
int
off
,
int
len
)
throws
IOException
{
if
(!
abortFlag
)
{
super
.
write
(
b
,
off
,
len
);
}
}
}
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录