]> source.dussan.org Git - poi.git/commitdiff
fix picture matching procedure
authorSergey Vladimirov <sergey@apache.org>
Thu, 28 Jul 2011 08:49:38 +0000 (08:49 +0000)
committerSergey Vladimirov <sergey@apache.org>
Thu, 28 Jul 2011 08:49:38 +0000 (08:49 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1151766 13f79535-47bb-0310-9956-ffa450edef68

src/scratchpad/src/org/apache/poi/hwpf/usermodel/Picture.java
src/scratchpad/testcases/org/apache/poi/hwpf/usermodel/TestPictures.java

index 926946d9214294b5488ac385fe8a6812b408a2b5..b42ad00637dde6c1a6e041d90ec2185fa17706ba 100644 (file)
@@ -168,26 +168,26 @@ public final class Picture extends PictureDescriptor
      return dataBlockStartOfsset;
   }
 
-  /**
-   * @return picture's content as byte array
-   */
-  public byte[] getContent()
-  {
-    if (content == null || content.length<=0)
+    /**
+     * @return picture's content as byte array
+     */
+    public byte[] getContent()
     {
-      fillImageContent();
+        fillImageContent();
+        return content;
     }
-    return content;
-  }
 
-  public byte[] getRawContent()
-  {
-    if (rawContent == null || rawContent.length <= 0)
+    /**
+     * Returns picture's content as it stored in Word file, i.e. possibly in
+     * compressed form.
+     * 
+     * @return picture's content as it stored in Word file
+     */
+    public byte[] getRawContent()
     {
-      fillRawImageContent();
+        fillRawImageContent();
+        return rawContent;
     }
-    return rawContent;
-  }
 
   /**
    *
@@ -304,12 +304,10 @@ public final class Picture extends PictureDescriptor
 
     public PictureType suggestPictureType()
     {
-        fillImageContent();
-
+        final byte[] imageContent = getContent();
         for ( PictureType pictureType : PictureType.values() )
             for ( byte[] signature : pictureType.getSignatures() )
-                if ( matchSignature( _dataStream, signature,
-                        pictureBytesStartOffset ) )
+                if ( matchSignature( imageContent, signature, 0 ) )
                     return pictureType;
 
         // TODO: DIB, PICT
@@ -355,12 +353,18 @@ public final class Picture extends PictureDescriptor
 
   private void fillRawImageContent()
   {
+        if ( rawContent != null && rawContent.length > 0 )
+            return;
+
     this.rawContent = new byte[size];
     System.arraycopy(_dataStream, pictureBytesStartOffset, rawContent, 0, size);
   }
 
   private void fillImageContent()
   {
+        if ( content != null && content.length > 0 )
+            return;
+
     byte[] rawContent = getRawContent();
 
     // HACK: Detect compressed images.  In reality there should be some way to determine
index 81bf2be56a79f977d682521a8f7b8ee337b0aa78..938b77a01853b743207be1a4622d0d1dbc205945 100644 (file)
@@ -261,7 +261,24 @@ public final class TestPictures extends TestCase {
        assertEquals("10a8", picture.suggestFullFileName());
        assertEquals("image/unknown", picture.getMimeType());
     }
-    
+
+    public void testEquation()
+    {
+        HWPFDocument doc = HWPFTestDataSamples.openSampleFile( "equation.doc" );
+        PicturesTable pictures = doc.getPicturesTable();
+
+        final List<Picture> allPictures = pictures.getAllPictures();
+        assertEquals( 1, allPictures.size() );
+
+        Picture picture = allPictures.get( 0 );
+        assertNotNull( picture );
+        assertEquals( PictureType.EMF, picture.suggestPictureType() );
+        assertEquals( PictureType.EMF.getExtension(),
+                picture.suggestFileExtension() );
+        assertEquals( PictureType.EMF.getMime(), picture.getMimeType() );
+        assertEquals( "0.emf", picture.suggestFullFileName() );
+    }
+
     /**
      * In word you can have floating or fixed pictures.
      * Fixed have a \u0001 in place with an offset to the