Switch Picture processing in HSLFSlideShow to be lazy-loading, to speed things up if you're only interested in text stuff

git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1073883 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Nick Burch 2011-02-23 19:01:24 +00:00
parent 854a7f49e9
commit 7feda0a1df
1 changed files with 31 additions and 13 deletions

View File

@ -174,9 +174,6 @@ public final class HSLFSlideShow extends POIDocument {
// Look for any other streams // Look for any other streams
readOtherStreams(); readOtherStreams();
// Look for Picture Streams:
readPictures();
} }
/** /**
* Constructs a new, empty, Powerpoint document. * Constructs a new, empty, Powerpoint document.
@ -309,7 +306,8 @@ public final class HSLFSlideShow extends POIDocument {
} }
/** /**
* Find and read in pictures contained in this presentation * Find and read in pictures contained in this presentation.
* This is lazily called as and when we want to touch pictures.
*/ */
private void readPictures() throws IOException { private void readPictures() throws IOException {
_pictures = new ArrayList<PictureData>(); _pictures = new ArrayList<PictureData>();
@ -472,6 +470,9 @@ public final class HSLFSlideShow extends POIDocument {
// Write any pictures, into another stream // Write any pictures, into another stream
if(_pictures == null) {
readPictures();
}
if (_pictures.size() > 0) { if (_pictures.size() > 0) {
ByteArrayOutputStream pict = new ByteArrayOutputStream(); ByteArrayOutputStream pict = new ByteArrayOutputStream();
for (PictureData p : _pictures) { for (PictureData p : _pictures) {
@ -526,15 +527,24 @@ public final class HSLFSlideShow extends POIDocument {
* @return offset of this picture in the Pictures stream * @return offset of this picture in the Pictures stream
*/ */
public int addPicture(PictureData img) { public int addPicture(PictureData img) {
int offset = 0; // Process any existing pictures if we haven't yet
if(_pictures == null) {
if(_pictures.size() > 0){ try {
PictureData prev = _pictures.get(_pictures.size() - 1); readPictures();
offset = prev.getOffset() + prev.getRawData().length + 8; } catch(IOException e) {
} throw new CorruptPowerPointFileException(e.getMessage());
img.setOffset(offset); }
_pictures.add(img); }
return offset;
// Add the new picture in
int offset = 0;
if(_pictures.size() > 0) {
PictureData prev = _pictures.get(_pictures.size() - 1);
offset = prev.getOffset() + prev.getRawData().length + 8;
}
img.setOffset(offset);
_pictures.add(img);
return offset;
} }
/* ******************* fetching methods follow ********************* */ /* ******************* fetching methods follow ********************* */
@ -563,6 +573,14 @@ public final class HSLFSlideShow extends POIDocument {
* presentation doesn't contain pictures. * presentation doesn't contain pictures.
*/ */
public PictureData[] getPictures() { public PictureData[] getPictures() {
if(_pictures == null) {
try {
readPictures();
} catch(IOException e) {
throw new CorruptPowerPointFileException(e.getMessage());
}
}
return _pictures.toArray(new PictureData[_pictures.size()]); return _pictures.toArray(new PictureData[_pictures.size()]);
} }