]> source.dussan.org Git - poi.git/commitdiff
Bugzilla 46288: fixed refcount of Fill pictures in HSLF
authorYegor Kozlov <yegor@apache.org>
Fri, 9 Dec 2011 12:50:20 +0000 (12:50 +0000)
committerYegor Kozlov <yegor@apache.org>
Fri, 9 Dec 2011 12:50:20 +0000 (12:50 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1212381 13f79535-47bb-0310-9956-ffa450edef68

src/documentation/content/xdocs/status.xml
src/scratchpad/src/org/apache/poi/hslf/model/Fill.java
src/scratchpad/src/org/apache/poi/hslf/model/Shape.java
src/scratchpad/testcases/org/apache/poi/hslf/model/TestBackground.java

index e05178fe90c5eede8441d74e0b52d851b7f9c790..2370acc90ce28073650de17bf73d6a8766c490b5 100644 (file)
@@ -34,6 +34,7 @@
 
     <changes>
         <release version="3.8-beta5" date="2011-??-??">
+           <action dev="poi-developers" type="fix">46288 - fixed refcount of Fill pictures in HSLF </action>
            <action dev="poi-developers" type="add">51961 - support compression of temp files in SXSSF </action>
            <action dev="poi-developers" type="add">52268 - support cloning sheets with drawings in XSSF </action>
            <action dev="poi-developers" type="add">52285 - Support XWPF smart tags text in Paragraphs</action>
index ec3ab7f225b52aead2cd05cb7fd5d77851dcff69..0b8ddaad8805c8ad5ed9bbd6a7ff73cb0f5fef72 100644 (file)
@@ -23,6 +23,7 @@ import org.apache.poi.hslf.usermodel.PictureData;
 import org.apache.poi.hslf.usermodel.SlideShow;
 import org.apache.poi.util.POILogger;
 import org.apache.poi.util.POILogFactory;
+import java.util.List;
 
 import java.awt.*;
 
@@ -116,6 +117,36 @@ public final class Fill {
         return prop == null ? FILL_SOLID : prop.getPropertyValue();
     }
 
+    /**
+     */
+    protected void afterInsert(Sheet sh){
+        EscherOptRecord opt = (EscherOptRecord)Shape.getEscherChild(shape.getSpContainer(), EscherOptRecord.RECORD_ID);
+        EscherSimpleProperty p = (EscherSimpleProperty)Shape.getEscherProperty(opt, EscherProperties.FILL__PATTERNTEXTURE);
+        if(p != null) {
+            int idx = p.getPropertyValue();
+            EscherBSERecord bse = getEscherBSERecord(idx);
+            bse.setRef(bse.getRef() + 1);
+        }
+    }
+
+    protected EscherBSERecord getEscherBSERecord(int idx){
+        Sheet sheet = shape.getSheet();
+        if(sheet == null) {
+            logger.log(POILogger.DEBUG, "Fill has not yet been assigned to a sheet");
+            return null;
+        }
+        SlideShow ppt = sheet.getSlideShow();
+        Document doc = ppt.getDocumentRecord();
+        EscherContainerRecord dggContainer = doc.getPPDrawingGroup().getDggContainer();
+        EscherContainerRecord bstore = (EscherContainerRecord)Shape.getEscherChild(dggContainer, EscherContainerRecord.BSTORE_CONTAINER);
+        if(bstore == null) {
+            logger.log(POILogger.DEBUG, "EscherContainerRecord.BSTORE_CONTAINER was not found ");
+            return null;
+        }
+        List lst = bstore.getChildRecords();
+        return (EscherBSERecord)lst.get(idx-1);
+    }
+
     /**
      * Sets fill type.
      * Must be one of the <code>FILL_*</code> constants defined in this class.
@@ -233,6 +264,12 @@ public final class Fill {
     public void setPictureData(int idx){
         EscherOptRecord opt = (EscherOptRecord)Shape.getEscherChild(shape.getSpContainer(), EscherOptRecord.RECORD_ID);
         Shape.setEscherProperty(opt, (short)(EscherProperties.FILL__PATTERNTEXTURE + 0x4000), idx);
+        if( idx != 0 ) {
+            if( shape.getSheet() != null ) {
+                EscherBSERecord bse = getEscherBSERecord(idx);
+                bse.setRef(bse.getRef() + 1);
+            }
+        }
     }
 
 }
index 3fca27c449f2dcf7c1c6629b49e9241f5fb8e781..f2e934127d35d8a99c399e48594d4ca81b513ac9 100644 (file)
@@ -342,7 +342,9 @@ public abstract class Shape {
      * @param sh - owning shape
      */
     protected void afterInsert(Sheet sh){
-
+        if(_fill != null) {
+            _fill.afterInsert(sh);
+        }
     }
 
     /**
index 69e7a6b37fe80741af012959b6e3e925b4fea00c..55082abe9905f42b11896801c28e68a14ec12d65 100644 (file)
@@ -21,11 +21,15 @@ import junit.framework.TestCase;
 
 import java.io.*;
 import java.awt.*;
+import java.util.List;
 
+import org.apache.poi.ddf.*;
+import org.apache.poi.hslf.record.Document;
 import org.apache.poi.hslf.usermodel.SlideShow;
 import org.apache.poi.hslf.HSLFSlideShow;
 import org.apache.poi.POIDataSamples;
 
+
 /**
  * Test <code>Fill</code> object.
  *
@@ -163,6 +167,7 @@ public final class TestBackground extends TestCase {
 
         fill = slides[0].getBackground().getFill();
         assertEquals(Fill.FILL_PICTURE, fill.getFillType());
+        assertEquals(3, getFillPictureRefCount(slides[0].getBackground(), fill));
         shape = slides[0].getShapes()[0];
         assertEquals(Fill.FILL_SOLID, shape.getFill().getFillType());
 
@@ -173,8 +178,10 @@ public final class TestBackground extends TestCase {
 
         fill = slides[2].getBackground().getFill();
         assertEquals(Fill.FILL_TEXTURE, fill.getFillType());
+        assertEquals(3, getFillPictureRefCount(slides[2].getBackground(), fill));
         shape = slides[2].getShapes()[0];
         assertEquals(Fill.FILL_PICTURE, shape.getFill().getFillType());
+        assertEquals(1, getFillPictureRefCount(shape, fill));
 
         fill = slides[3].getBackground().getFill();
         assertEquals(Fill.FILL_SHADE_CENTER, fill.getFillType());
@@ -183,4 +190,21 @@ public final class TestBackground extends TestCase {
 
     }
 
+    private int getFillPictureRefCount(Shape shape, Fill fill) {
+        EscherOptRecord opt = (EscherOptRecord)Shape.getEscherChild(shape.getSpContainer(), EscherOptRecord.RECORD_ID);
+        EscherSimpleProperty p = (EscherSimpleProperty)Shape.getEscherProperty(opt, EscherProperties.FILL__PATTERNTEXTURE);
+        if(p != null) {
+            int idx = p.getPropertyValue();
+
+            Sheet sheet = shape.getSheet();
+            SlideShow ppt = sheet.getSlideShow();
+            Document doc = ppt.getDocumentRecord();
+            EscherContainerRecord dggContainer = doc.getPPDrawingGroup().getDggContainer();
+            EscherContainerRecord bstore = (EscherContainerRecord)Shape.getEscherChild(dggContainer, EscherContainerRecord.BSTORE_CONTAINER);
+            List lst = bstore.getChildRecords();
+            return ((EscherBSERecord)lst.get(idx-1)).getRef();
+        }
+        return 0;
+    }
+
 }