You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@poi.apache.org by ki...@apache.org on 2020/03/21 18:25:39 UTC

svn commit: r1875499 - in /poi: site/src/documentation/content/xdocs/ trunk/src/java/org/apache/poi/sl/draw/ trunk/src/ooxml/java/org/apache/poi/xslf/usermodel/

Author: kiwiwings
Date: Sat Mar 21 18:25:38 2020
New Revision: 1875499

URL: http://svn.apache.org/viewvc?rev=1875499&view=rev
Log:
#64241 - XSLF - Wrong scheme colors used when rendering

Modified:
    poi/site/src/documentation/content/xdocs/changes.xml
    poi/trunk/src/java/org/apache/poi/sl/draw/DrawSimpleShape.java
    poi/trunk/src/java/org/apache/poi/sl/draw/DrawTextParagraph.java
    poi/trunk/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFColor.java
    poi/trunk/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFShape.java

Modified: poi/site/src/documentation/content/xdocs/changes.xml
URL: http://svn.apache.org/viewvc/poi/site/src/documentation/content/xdocs/changes.xml?rev=1875499&r1=1875498&r2=1875499&view=diff
==============================================================================
--- poi/site/src/documentation/content/xdocs/changes.xml (original)
+++ poi/site/src/documentation/content/xdocs/changes.xml Sat Mar 21 18:25:38 2020
@@ -81,6 +81,7 @@
             <action type="fix" fixes-bug="64186" context="OPC">Decrease usage of ThreadLocals in XML Signature API</action>
             <action type="fix" fixes-bug="64213" context="SS_Common">Picture.resize(double scale) scales width wrong for small pictures and when dx1 is set</action>
             <action type="fix" fixes-bug="63712" context="OPC">upgrading xmlsec causes junit tests to fail</action>
+            <action type="fix" fixes-bug="64241" context="XSLF">XSLF - Wrong scheme colors used when rendering</action>
         </actions>
     </release>
 

Modified: poi/trunk/src/java/org/apache/poi/sl/draw/DrawSimpleShape.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/sl/draw/DrawSimpleShape.java?rev=1875499&r1=1875498&r2=1875499&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/sl/draw/DrawSimpleShape.java (original)
+++ poi/trunk/src/java/org/apache/poi/sl/draw/DrawSimpleShape.java Sat Mar 21 18:25:38 2020
@@ -139,13 +139,11 @@ public class DrawSimpleShape extends Dra
     }
 
     protected Paint getFillPaint(Graphics2D graphics) {
-        final PaintStyle ps = getShape().getFillStyle().getPaint();
         DrawPaint drawPaint = DrawFactory.getInstance(graphics).getPaint(getShape());
-        return drawPaint.getPaint(graphics, ps);
+        return drawPaint.getPaint(graphics, getShape().getFillStyle().getPaint());
     }
 
     protected Paint getLinePaint(Graphics2D graphics) {
-        final PaintStyle ps = getShape().getFillStyle().getPaint();
         DrawPaint drawPaint = DrawFactory.getInstance(graphics).getPaint(getShape());
         return drawPaint.getPaint(graphics, getShape().getStrokeStyle().getPaint());
     }

Modified: poi/trunk/src/java/org/apache/poi/sl/draw/DrawTextParagraph.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/sl/draw/DrawTextParagraph.java?rev=1875499&r1=1875498&r2=1875499&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/sl/draw/DrawTextParagraph.java (original)
+++ poi/trunk/src/java/org/apache/poi/sl/draw/DrawTextParagraph.java Sat Mar 21 18:25:38 2020
@@ -568,7 +568,7 @@ public class DrawTextParagraph implement
             text = new StringBuilder();
         }
 
-        PlaceableShape<?,?> ps = getParagraphShape();
+        final DrawPaint dp = new DrawPaint(getParagraphShape());
         DrawFontManager dfm = DrawFactory.getInstance(graphics).getFontManager(graphics);
         assert(dfm != null);
 
@@ -587,7 +587,7 @@ public class DrawTextParagraph implement
             int endIndex = text.length();
 
             PaintStyle fgPaintStyle = run.getFontColor();
-            Paint fgPaint = new DrawPaint(ps).getPaint(graphics, fgPaintStyle);
+            Paint fgPaint = dp.getPaint(graphics, fgPaintStyle);
             attList.add(new AttributedStringData(TextAttribute.FOREGROUND, fgPaint, beginIndex, endIndex));
 
             Double fontSz = run.getFontSize();

Modified: poi/trunk/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFColor.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFColor.java?rev=1875499&r1=1875498&r2=1875499&view=diff
==============================================================================
--- poi/trunk/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFColor.java (original)
+++ poi/trunk/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFColor.java Sat Mar 21 18:25:38 2020
@@ -19,9 +19,8 @@
 package org.apache.poi.xslf.usermodel;
 
 import java.awt.Color;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
+
+import javax.xml.namespace.QName;
 
 import org.apache.poi.sl.draw.DrawPaint;
 import org.apache.poi.sl.usermodel.AbstractColorStyle;
@@ -31,6 +30,7 @@ import org.apache.poi.util.Beta;
 import org.apache.poi.util.Internal;
 import org.apache.poi.util.POILogFactory;
 import org.apache.poi.util.POILogger;
+import org.apache.xmlbeans.XmlCursor;
 import org.apache.xmlbeans.XmlObject;
 import org.openxmlformats.schemas.drawingml.x2006.main.CTColor;
 import org.openxmlformats.schemas.drawingml.x2006.main.CTFontReference;
@@ -42,7 +42,6 @@ import org.openxmlformats.schemas.drawin
 import org.openxmlformats.schemas.drawingml.x2006.main.CTSchemeColor;
 import org.openxmlformats.schemas.drawingml.x2006.main.CTSolidColorFillProperties;
 import org.openxmlformats.schemas.drawingml.x2006.main.CTSystemColor;
-import org.w3c.dom.Node;
 
 /**
  * Encapsulates logic to read color definitions from DrawingML and convert them to java.awt.Color
@@ -50,7 +49,8 @@ import org.w3c.dom.Node;
 @Beta
 @Internal
 public class XSLFColor {
-    private final static POILogger LOGGER = POILogFactory.getLogger(XSLFColor.class);
+    private static final POILogger LOGGER = POILogFactory.getLogger(XSLFColor.class);
+    private static final QName VAL_ATTR = new QName("val");
 
     private XmlObject _xmlObject;
     private Color _color;
@@ -133,37 +133,48 @@ public class XSLFColor {
     }
 
     private Color toColor(XmlObject obj, XSLFTheme theme) {
+        if (obj == null) {
+            return _phClr == null ? null : toColor(_phClr, theme);
+        }
+
+        final XmlCursor cur = obj.newCursor();
         Color color = null;
-        List<XmlObject> xo = new ArrayList<>();
-        xo.add(obj);
-        xo.addAll(Arrays.asList(obj.selectPath("*")));
-        boolean isFirst = true;
-        for (XmlObject ch : xo) {
-            if (ch instanceof CTHslColor) {
-                color = toColor((CTHslColor)ch);
-            } else if (ch instanceof CTPresetColor) {
-                color = toColor((CTPresetColor)ch);
-            } else if (ch instanceof CTSchemeColor) {
-                color = toColor((CTSchemeColor)ch, theme);
-            } else if (ch instanceof CTScRgbColor) {
-                color = toColor((CTScRgbColor)ch);
-            } else if (ch instanceof CTSRgbColor) {
-                color = toColor((CTSRgbColor)ch);
-            } else if (ch instanceof CTSystemColor) {
-                color = toColor((CTSystemColor)ch);
-            } else if (!(ch instanceof CTFontReference)) {
-                if (!isFirst) {
+        try {
+            XmlObject ch;
+            for (int idx=0; color == null && (ch = nextObject(obj, cur, idx)) != null; idx++) {
+                if (ch instanceof CTHslColor) {
+                    color = toColor((CTHslColor)ch);
+                } else if (ch instanceof CTPresetColor) {
+                    color = toColor((CTPresetColor)ch);
+                } else if (ch instanceof CTSchemeColor) {
+                    color = toColor((CTSchemeColor)ch, theme);
+                } else if (ch instanceof CTScRgbColor) {
+                    color = toColor((CTScRgbColor)ch);
+                } else if (ch instanceof CTSRgbColor) {
+                    color = toColor((CTSRgbColor)ch);
+                } else if (ch instanceof CTSystemColor) {
+                    color = toColor((CTSystemColor)ch);
+                } else if (!(ch instanceof CTFontReference) && idx > 0) {
                     throw new IllegalArgumentException("Unexpected color choice: " + ch.getClass());
                 }
             }
-            if (color != null) {
-                break;
-            }
-            isFirst = false;
+        } finally {
+            cur.dispose();
         }
         return color;
     }
 
+    private static XmlObject nextObject(XmlObject obj, XmlCursor cur, int idx) {
+        switch (idx) {
+            case 0:
+                return obj;
+            case 1:
+                return cur.toFirstChild() ? cur.getObject() : null;
+            default:
+                return cur.toNextSibling() ? cur.getObject() : null;
+        }
+    }
+
     /**
      * Sets the solid color
      *
@@ -234,29 +245,26 @@ public class XSLFColor {
     }
 
     private static int getRawValue(CTSchemeColor phClr, XmlObject xmlObject, String elem) {
-        String query = "declare namespace a='http://schemas.openxmlformats.org/drawingml/2006/main' $this//a:" + elem;
-
-        XmlObject[] obj;
-
-        // first ask the context color and if not found, ask the actual color bean
-        if (phClr != null){
-            obj = phClr.selectPath(query);
-            if (obj.length == 1){
-                Node attr = obj[0].getDomNode().getAttributes().getNamedItem("val");
-                if(attr != null) {
-                    return Integer.parseInt(attr.getNodeValue());
-                }
+        for (XmlObject obj : new XmlObject[]{xmlObject,phClr}) {
+            if (obj == null) {
+                continue;
             }
-        }
-
-        obj = xmlObject.selectPath(query);
-        if (obj.length == 1){
-            Node attr = obj[0].getDomNode().getAttributes().getNamedItem("val");
-            if(attr != null) {
-                return Integer.parseInt(attr.getNodeValue());
+            XmlCursor cur = obj.newCursor();
+            try {
+                if (!(
+                        cur.toChild(XSLFRelation.NS_DRAWINGML, elem) ||
+                        (cur.toFirstChild() && cur.toChild(XSLFRelation.NS_DRAWINGML, elem))
+                    )) {
+                    continue;
+                }
+                String str = cur.getAttributeText(VAL_ATTR);
+                if (str != null && !"".equals(str)) {
+                    return Integer.parseInt(str);
+                }
+            } finally {
+                cur.dispose();
             }
         }
-
         return -1;
     }
 

Modified: poi/trunk/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFShape.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFShape.java?rev=1875499&r1=1875498&r2=1875499&view=diff
==============================================================================
--- poi/trunk/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFShape.java (original)
+++ poi/trunk/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFShape.java Sat Mar 21 18:25:38 2020
@@ -56,6 +56,7 @@ import org.openxmlformats.schemas.drawin
 import org.openxmlformats.schemas.drawingml.x2006.main.CTSolidColorFillProperties;
 import org.openxmlformats.schemas.drawingml.x2006.main.CTStyleMatrix;
 import org.openxmlformats.schemas.drawingml.x2006.main.CTStyleMatrixReference;
+import org.openxmlformats.schemas.drawingml.x2006.main.STSchemeColorVal;
 import org.openxmlformats.schemas.presentationml.x2006.main.CTBackgroundProperties;
 import org.openxmlformats.schemas.presentationml.x2006.main.CTPicture;
 import org.openxmlformats.schemas.presentationml.x2006.main.CTPlaceholder;
@@ -565,25 +566,23 @@ public abstract class XSLFShape implemen
             return selectPaint(fp.getGradFill(), phClr, theme);
         } else if (fp.isSetMatrixStyle()) {
             return selectPaint(fp.getMatrixStyle(), theme, fp.isLineStyle(), hasPlaceholder);
+        } else if (phClr != null) {
+            return selectPaint(phClr, theme);
         } else {
             return null;
         }
     }
 
+    protected PaintStyle selectPaint(CTSchemeColor phClr, final XSLFTheme theme) {
+        final XSLFColor c = new XSLFColor(null, theme, phClr, _sheet);
+        return DrawPaint.createSolidPaint(c.getColorStyle());
+    }
+
     @SuppressWarnings("WeakerAccess")
     protected PaintStyle selectPaint(CTSolidColorFillProperties solidFill, CTSchemeColor phClr, final XSLFTheme theme) {
-        if (solidFill.isSetSchemeClr()) {
-        	// if there's a reference to the placeholder color,
-        	// stop evaluating further and let the caller select
-        	// the next style inheritance level
-//            if (STSchemeColorVal.PH_CLR.equals(solidFill.getSchemeClr().getVal())) {
-//                return null;
-//            }
-            if (phClr == null) {
-                phClr = solidFill.getSchemeClr();
-            }
-        }
-        final XSLFColor c = new XSLFColor(solidFill, theme, phClr, _sheet);
+        CTSchemeColor nestedPhClr = solidFill.getSchemeClr();
+        boolean useNested = nestedPhClr != null && nestedPhClr.getVal() != null && !STSchemeColorVal.PH_CLR.equals(nestedPhClr.getVal());
+        final XSLFColor c = new XSLFColor(solidFill, theme, useNested ? nestedPhClr : phClr, _sheet);
         return DrawPaint.createSolidPaint(c.getColorStyle());
     }
 



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@poi.apache.org
For additional commands, e-mail: commits-help@poi.apache.org