diff --git a/src/scratchpad/src/org/apache/poi/hslf/blip/DIB.java b/src/scratchpad/src/org/apache/poi/hslf/blip/DIB.java
new file mode 100644
index 0000000000..362bbcb434
--- /dev/null
+++ b/src/scratchpad/src/org/apache/poi/hslf/blip/DIB.java
@@ -0,0 +1,81 @@
+/* ====================================================================
+ Copyright 2002-2004 Apache Software Foundation
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+==================================================================== */
+package org.apache.poi.hslf.blip;
+
+import org.apache.poi.hslf.model.Picture;
+import org.apache.poi.util.LittleEndian;
+
+import java.io.IOException;
+
+/**
+ * Represents a DIB picture data in a PPT file
+ *
+ * @author Yegor Kozlov
+ */
+public class DIB extends Bitmap {
+ /**
+ * Size of the BITMAPFILEHEADER structure preceding the actual DIB bytes
+ */
+ public static final int HEADER_SIZE = 14;
+
+ /**
+ * @return type of this picture
+ * @see org.apache.poi.hslf.model.Picture#DIB
+ */
+ public int getType(){
+ return Picture.DIB;
+ }
+
+ /**
+ * DIB signature is 0x7A80
+ *
+ * @return DIB signature (0x7A80)
+ */
+ public int getSignature(){
+ return 0x7A80;
+ }
+
+ public byte[] getData(){
+ byte[] data = super.getData();
+
+ // bitmap file-header, corresponds to a
+ // Windows BITMAPFILEHEADER structure
+ // (For more information, consult the Windows API Programmer's reference )
+ byte[] header = new byte[HEADER_SIZE];
+ //Specifies the file type. It must be set to the signature word BM (0x4D42) to indicate bitmap.
+ LittleEndian.putInt(header, 0, 0x4D42);
+ //Specifies the size, in bytes, of the bitmap file.
+ LittleEndian.putInt(header, 2, data.length); //DIB length including the header
+ //Reserved; set to zero
+ LittleEndian.putInt(header, 6, 0);
+ //the offset, in bytes, from the header to the bitmap bits (looks like it is always 2)
+ LittleEndian.putInt(header, 10, 2);
+
+ //DIB data is the header + dib bytes
+ byte[] dib = new byte[header.length + data.length];
+ System.arraycopy(header, 0, dib, 0, header.length);
+ System.arraycopy(data, 0, dib, header.length, data.length);
+
+ return dib;
+ }
+
+ public void setData(byte[] data) throws IOException {
+ //cut off the bitmap file-header
+ byte[] dib = new byte[data.length-HEADER_SIZE];
+ System.arraycopy(data, HEADER_SIZE, dib, 0, dib.length);
+ super.setData(dib);
+ }
+}
diff --git a/src/scratchpad/src/org/apache/poi/hslf/extractor/ImageExtractor.java b/src/scratchpad/src/org/apache/poi/hslf/extractor/ImageExtractor.java
index 85fd16fae9..e778f313ed 100644
--- a/src/scratchpad/src/org/apache/poi/hslf/extractor/ImageExtractor.java
+++ b/src/scratchpad/src/org/apache/poi/hslf/extractor/ImageExtractor.java
@@ -64,6 +64,9 @@ public class ImageExtractor {
case Picture.PICT:
ext = ".pict";
break;
+ case Picture.DIB:
+ ext = ".dib";
+ break;
default:
continue;
}
diff --git a/src/scratchpad/src/org/apache/poi/hslf/usermodel/PictureData.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/PictureData.java
index 4b82e780de..2c9f714244 100644
--- a/src/scratchpad/src/org/apache/poi/hslf/usermodel/PictureData.java
+++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/PictureData.java
@@ -174,6 +174,9 @@ public abstract class PictureData {
case Picture.PNG:
pict = new PNG();
break;
+ case Picture.DIB:
+ pict = new DIB();
+ break;
default:
throw new IllegalArgumentException("Unsupported picture type: " + type);
}
diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/data/sci_cec.dib b/src/scratchpad/testcases/org/apache/poi/hslf/data/sci_cec.dib
new file mode 100644
index 0000000000..61bfb62546
Binary files /dev/null and b/src/scratchpad/testcases/org/apache/poi/hslf/data/sci_cec.dib differ
diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestPictures.java b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestPictures.java
index 861be0c2c6..6767a299b0 100644
--- a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestPictures.java
+++ b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestPictures.java
@@ -249,6 +249,46 @@ public class TestPictures extends TestCase{
assertTrue(Arrays.equals(src_bytes, ppt_bytes));
}
+ /**
+ * Test read/write DIB
+ */
+ public void testDIB() throws Exception {
+ SlideShow ppt = new SlideShow();
+
+ Slide slide = ppt.createSlide();
+ File img = new File(cwd, "sci_cec.dib");
+ int idx = ppt.addPicture(img, Picture.DIB);
+ Picture pict = new Picture(idx);
+ assertEquals(idx, pict.getPictureIndex());
+ slide.addShape(pict);
+
+ //serialize and read again
+ ByteArrayOutputStream out = new ByteArrayOutputStream();
+ ppt.write(out);
+ out.close();
+
+ ppt = new SlideShow(new HSLFSlideShow(new ByteArrayInputStream(out.toByteArray())));
+
+ //make sure we can read this picture shape and it refers to the correct picture data
+ Shape[] sh = ppt.getSlides()[0].getShapes();
+ assertEquals(1, sh.length);
+ pict = (Picture)sh[0];
+ assertEquals(idx, pict.getPictureIndex());
+
+ //check picture data
+ PictureData[] pictures = ppt.getPictureData();
+ //the Picture shape refers to the PictureData object in the Presentation
+ assertEquals(pict.getPictureData(), pictures[0]);
+
+ assertEquals(1, pictures.length);
+ assertEquals(Picture.DIB, pictures[0].getType());
+ assertTrue(pictures[0] instanceof DIB);
+ //compare the content of the initial file with what is stored in the PictureData
+ byte[] src_bytes = read(img);
+ byte[] ppt_bytes = pictures[0].getData();
+ assertTrue(Arrays.equals(src_bytes, ppt_bytes));
+ }
+
/**
* Read file into a byte array
*/