diff options
author | Yegor Kozlov <yegor@apache.org> | 2010-05-30 06:56:32 +0000 |
---|---|---|
committer | Yegor Kozlov <yegor@apache.org> | 2010-05-30 06:56:32 +0000 |
commit | 8f9937a56900b6d22015e916611d9e6f7b612990 (patch) | |
tree | b55ce7139e27dd7a5c4d656ed65941b4baf4056a | |
parent | 8768fde8d889f2a2a6043e903d4f6b3b77ebd2a3 (diff) | |
download | poi-8f9937a56900b6d22015e916611d9e6f7b612990.tar.gz poi-8f9937a56900b6d22015e916611d9e6f7b612990.zip |
fixed construction of the DIB picture header, see Bugzilla 43161
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@949483 13f79535-47bb-0310-9956-ffa450edef68
-rw-r--r-- | src/documentation/content/xdocs/status.xml | 3 | ||||
-rw-r--r-- | src/scratchpad/src/org/apache/poi/hslf/blip/DIB.java | 25 | ||||
-rw-r--r-- | src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestPictures.java | 2 | ||||
-rwxr-xr-x | test-data/slideshow/clock.dib | bin | 0 -> 101430 bytes |
4 files changed, 20 insertions, 10 deletions
diff --git a/src/documentation/content/xdocs/status.xml b/src/documentation/content/xdocs/status.xml index 1cf13a4b36..2b68341b35 100644 --- a/src/documentation/content/xdocs/status.xml +++ b/src/documentation/content/xdocs/status.xml @@ -34,6 +34,8 @@ <changes> <release version="3.7-SNAPSHOT" date="2010-??-??"> + <action dev="POI-DEVELOPERS" type="fix">43161 - fixed construction of the DIB picture header</action> + <action dev="POI-DEVELOPERS" type="add">49311 - initial support for reading AES-encrypted/write-protected OOXML files</action> <action dev="POI-DEVELOPERS" type="fix">48718 - Make the creation of multiple, un-modified fonts in a row in XSSF match the old HSSF behaviour</action> <action dev="POI-DEVELOPERS" type="fix">44916 - Allow access to the HSSFPatriarch from HSSFSheet once created</action> <action dev="POI-DEVELOPERS" type="add">48779 - Allow you to get straight from a CellStyle to a Color, irrespective of if the Color is indexed or inline-defined</action> @@ -93,7 +95,6 @@ <action dev="POI-DEVELOPERS" type="fix">48339 - fixed ExternalNameRecord to properly distinguish DDE data from OLE data items </action> <action dev="POI-DEVELOPERS" type="fix">47920 - allow editing workbooks embedded into PowerPoint files</action> <action dev="POI-DEVELOPERS" type="add">48343 - added implementation of SUBTOTAL function</action> - <action dev="POI-DEVELOPERS" type="add">49311 - initial support for reading AES-encrypted/write-protected OOXML files</action> </release> <release version="3.6" date="2009-12-14"> <action dev="POI-DEVELOPERS" type="fix">48332 - fixed XSSFSheet autoSizeColumn() to tolerate empty RichTextString</action> diff --git a/src/scratchpad/src/org/apache/poi/hslf/blip/DIB.java b/src/scratchpad/src/org/apache/poi/hslf/blip/DIB.java index 7e97446e43..21ea072ff7 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/blip/DIB.java +++ b/src/scratchpad/src/org/apache/poi/hslf/blip/DIB.java @@ -49,23 +49,32 @@ public final class DIB extends Bitmap { public int getSignature(){ return 0x7A80; } - + public byte[] getData(){ - byte[] data = super.getData(); + return addBMPHeader ( super.getData() ); + } + public static byte[] addBMPHeader(byte[] data){ // 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); + // read the size of the image and calculate the overall file size + // and the offset where the bitmap starts + int imageSize = LittleEndian.getInt(data, 0x22 - HEADER_SIZE); + int fileSize = data.length + HEADER_SIZE; + int offset = fileSize - imageSize; + + // specifies the size, in bytes, of the bitmap file - must add the length of the header + LittleEndian.putInt(header, 2, fileSize); + // Reserved; set to zero + LittleEndian.putInt(header, 6, 0); + // the offset, i.e. starting address, of the byte where the bitmap data can be found + LittleEndian.putInt(header, 10, offset); + //DIB data is the header + dib bytes byte[] dib = new byte[header.length + data.length]; System.arraycopy(header, 0, dib, 0, header.length); 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 df7265be8e..9d0f92be88 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestPictures.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestPictures.java @@ -252,7 +252,7 @@ public final class TestPictures extends TestCase{ SlideShow ppt = new SlideShow(); Slide slide = ppt.createSlide(); - byte[] src_bytes = slTests.readFile("sci_cec.dib"); + byte[] src_bytes = slTests.readFile("clock.dib"); int idx = ppt.addPicture(src_bytes, Picture.DIB); Picture pict = new Picture(idx); assertEquals(idx, pict.getPictureIndex()); diff --git a/test-data/slideshow/clock.dib b/test-data/slideshow/clock.dib Binary files differnew file mode 100755 index 0000000000..e9c6e72233 --- /dev/null +++ b/test-data/slideshow/clock.dib |