From 59ced4d73e1abebd907c1acaf04884e7e4ae48d0 Mon Sep 17 00:00:00 2001 From: Nick Burch Date: Tue, 17 Oct 2006 18:12:43 +0000 Subject: [PATCH] Support for DIB picture types, from Bug 40740 git-svn-id: https://svn.apache.org/repos/asf/jakarta/poi/trunk@464984 13f79535-47bb-0310-9956-ffa450edef68 --- .../src/org/apache/poi/hslf/blip/DIB.java | 81 ++++++++++++++++++ .../poi/hslf/extractor/ImageExtractor.java | 3 + .../poi/hslf/usermodel/PictureData.java | 3 + .../org/apache/poi/hslf/data/sci_cec.dib | Bin 0 -> 94 bytes .../poi/hslf/usermodel/TestPictures.java | 40 +++++++++ 5 files changed, 127 insertions(+) create mode 100644 src/scratchpad/src/org/apache/poi/hslf/blip/DIB.java create mode 100644 src/scratchpad/testcases/org/apache/poi/hslf/data/sci_cec.dib 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 000000000..362bbcb43 --- /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 85fd16fae..e778f313e 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 4b82e780d..2c9f71424 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 0000000000000000000000000000000000000000..61bfb625466e497e652bdbc8f634b5ae035c1d49 GIT binary patch literal 94 zcmZ?r4Pbx(CLpBiq}$iN7ePymvh+z<>>1H%9R{|Ax`48MW+J`n!{;`c!O7l`)* K@pmAu2VwxDg$!N* literal 0 HcmV?d00001 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 861be0c2c..6767a299b 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 */