]> source.dussan.org Git - poi.git/commitdiff
more progress with PPTX2PNG: support for gradient and texture fill, also refactored...
authorYegor Kozlov <yegor@apache.org>
Fri, 28 Oct 2011 14:25:53 +0000 (14:25 +0000)
committerYegor Kozlov <yegor@apache.org>
Fri, 28 Oct 2011 14:25:53 +0000 (14:25 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1190347 13f79535-47bb-0310-9956-ffa450edef68

39 files changed:
src/ooxml/java/org/apache/poi/xslf/usermodel/DrawingTextBody.java
src/ooxml/java/org/apache/poi/xslf/usermodel/Placeholder.java
src/ooxml/java/org/apache/poi/xslf/usermodel/RenderableShape.java [new file with mode: 0644]
src/ooxml/java/org/apache/poi/xslf/usermodel/XMLSlideShow.java
src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFAutoShape.java
src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFBackground.java
src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFColor.java
src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFCommentAuthors.java
src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFComments.java
src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFConnectorShape.java
src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFDrawing.java
src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFGraphicFrame.java
src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFGroupShape.java
src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFImageRendener.java
src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFNotes.java
src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFNotesMaster.java
src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFPictureShape.java
src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFShadow.java
src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFShape.java
src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSheet.java
src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSimpleShape.java
src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSlide.java
src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSlideLayout.java
src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSlideMaster.java
src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTable.java
src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTableCell.java
src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTableRow.java
src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTableStyles.java
src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextBox.java
src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextParagraph.java
src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextRun.java
src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextShape.java
src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTheme.java
src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestPPTX2PNG.java [new file with mode: 0644]
src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFColor.java [new file with mode: 0755]
src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFSimpleShape.java
src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTheme.java
src/ooxml/testcases/org/apache/poi/xwpf/usermodel/TestXWPFPictureData.java
test-data/slideshow/backgrounds.pptx [new file with mode: 0755]

index 05ae0f3d1232080169db0a47349b803067462f72..626dbff215310f9aeb7d0f6123ba34582fefe6ed 100644 (file)
 
 package org.apache.poi.xslf.usermodel;
 
-import java.util.List;
-
 import org.openxmlformats.schemas.drawingml.x2006.main.CTTextBody;
 import org.openxmlformats.schemas.drawingml.x2006.main.CTTextParagraph;
 
+import java.util.List;
+
 public class DrawingTextBody {
     private final CTTextBody textBody;
 
index 0e958015edad8d32570d37406e02095dcf8a4cd6..a96e88778df816a73c98d8399278243b88b66fc1 100644 (file)
@@ -32,5 +32,11 @@ public enum Placeholder {
     HEADER,\r
     OBJECT,\r
     CHART,\r
-    TABLE\r
+    TABLE,\r
+    CLIP_ART,\r
+    DGM,\r
+    MEDIA,\r
+    SLIDE_IMAGE,\r
+    PICTURE\r
+\r
 }\r
diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/RenderableShape.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/RenderableShape.java
new file mode 100644 (file)
index 0000000..393ba33
--- /dev/null
@@ -0,0 +1,11 @@
+package org.apache.poi.xslf.usermodel;\r
+\r
+/**\r
+ * Created by IntelliJ IDEA.\r
+ * User: yegor\r
+ * Date: Oct 27, 2011\r
+ * Time: 4:50:08 PM\r
+ * To change this template use File | Settings | File Templates.\r
+ */\r
+class RenderableShape {\r
+}\r
index b376d1f78362361f34f41e1d1df9fa604ec58cb7..8f25beeede0867c9e3bcc217f33830213abdf896 100644 (file)
 ==================================================================== */
 package org.apache.poi.xslf.usermodel;
 
-import java.awt.Dimension;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.regex.Pattern;
-
 import org.apache.poi.POIXMLDocument;
 import org.apache.poi.POIXMLDocumentPart;
 import org.apache.poi.POIXMLException;
@@ -51,6 +40,17 @@ import org.openxmlformats.schemas.presentationml.x2006.main.CTSlideIdListEntry;
 import org.openxmlformats.schemas.presentationml.x2006.main.CTSlideSize;
 import org.openxmlformats.schemas.presentationml.x2006.main.PresentationDocument;
 
+import java.awt.*;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.regex.Pattern;
+
 /**
  * High level representation of a ooxml slideshow.
  * This is the first object most users will construct whether
index 193e5f023fca35068528a14694e21ca6c3211e2e..2b8a1e08b802ddfbaba0d99d79d7b67bb8b32803 100644 (file)
 package org.apache.poi.xslf.usermodel;\r
 \r
 import org.apache.poi.util.Beta;\r
-import org.apache.poi.util.Units;\r
-import org.apache.poi.xslf.model.geom.Context;\r
-import org.apache.poi.xslf.model.geom.CustomGeometry;\r
-import org.apache.poi.xslf.model.geom.Path;\r
-import org.apache.poi.xslf.model.geom.PresetGeometries;\r
-import org.openxmlformats.schemas.drawingml.x2006.main.CTGeomGuide;\r
-import org.openxmlformats.schemas.drawingml.x2006.main.CTGeomGuideList;\r
 import org.openxmlformats.schemas.drawingml.x2006.main.CTNonVisualDrawingProps;\r
 import org.openxmlformats.schemas.drawingml.x2006.main.CTPresetGeometry2D;\r
-import org.openxmlformats.schemas.drawingml.x2006.main.CTSRgbColor;\r
 import org.openxmlformats.schemas.drawingml.x2006.main.CTShapeProperties;\r
-import org.openxmlformats.schemas.drawingml.x2006.main.CTSolidColorFillProperties;\r
 import org.openxmlformats.schemas.drawingml.x2006.main.CTTextBody;\r
-import org.openxmlformats.schemas.drawingml.x2006.main.CTTextBodyProperties;\r
-import org.openxmlformats.schemas.drawingml.x2006.main.CTTextParagraph;\r
 import org.openxmlformats.schemas.drawingml.x2006.main.STShapeType;\r
-import org.openxmlformats.schemas.drawingml.x2006.main.STTextAnchoringType;\r
-import org.openxmlformats.schemas.drawingml.x2006.main.STTextWrappingType;\r
-import org.openxmlformats.schemas.drawingml.x2006.main.STTextVerticalType;\r
 import org.openxmlformats.schemas.presentationml.x2006.main.CTShape;\r
 import org.openxmlformats.schemas.presentationml.x2006.main.CTShapeNonVisual;\r
-import org.openxmlformats.schemas.presentationml.x2006.main.CTPlaceholder;\r
-import org.openxmlformats.schemas.presentationml.x2006.main.STPlaceholderType;\r
 \r
-import java.awt.*;\r
-import java.awt.geom.AffineTransform;\r
-import java.awt.geom.GeneralPath;\r
-import java.awt.geom.Rectangle2D;\r
-import java.util.ArrayList;\r
-import java.util.List;\r
 import java.util.regex.Pattern;\r
-import java.util.regex.Matcher;\r
 \r
 /**\r
  * Represents a preset geometric shape. \r
index 646c5a40afc151804a46ac1455762dcf440a682a..cd82eabead39db83d31218f739dc5efcd1141fc6 100644 (file)
 \r
 package org.apache.poi.xslf.usermodel;\r
 \r
-import org.apache.poi.openxml4j.opc.PackagePart;\r
-import org.apache.poi.openxml4j.opc.PackageRelationship;\r
 import org.openxmlformats.schemas.presentationml.x2006.main.CTBackground;\r
 import org.openxmlformats.schemas.presentationml.x2006.main.CTBackgroundProperties;\r
+import org.openxmlformats.schemas.drawingml.x2006.main.CTStyleMatrixReference;\r
+import org.openxmlformats.schemas.drawingml.x2006.main.CTStyleMatrix;\r
+import org.openxmlformats.schemas.drawingml.x2006.main.CTBackgroundFillStyleList;\r
+import org.apache.xmlbeans.XmlObject;\r
+import org.apache.xmlbeans.XmlCursor;\r
 \r
-import javax.imageio.ImageIO;\r
+import javax.xml.namespace.QName;\r
 import java.awt.*;\r
-import java.awt.image.BufferedImage;\r
+import java.awt.geom.Rectangle2D;\r
 \r
 /**\r
  * Background shape\r
@@ -37,34 +40,40 @@ public class XSLFBackground extends XSLFSimpleShape {
         super(shape, sheet);\r
     }\r
 \r
-    public void draw(Graphics2D graphics) {\r
+    @Override\r
+    public Rectangle2D getAnchor(){\r
         Dimension pg = getSheet().getSlideShow().getPageSize();\r
-        Rectangle anchor = new Rectangle(0, 0, pg.width, pg.height);\r
-        CTBackgroundProperties pr = ((CTBackground) getXmlObject()).getBgPr();\r
-        if (pr == null) return;\r
+        return new Rectangle2D.Double(0, 0, pg.getWidth(), pg.getHeight());\r
+    }\r
 \r
-        XSLFTheme theme = getSheet().getTheme();\r
-        if (pr.isSetSolidFill()) {\r
-            Color color = theme.getSolidFillColor(pr.getSolidFill());\r
-            graphics.setPaint(color);\r
-            graphics.fill(anchor);\r
+    public void draw(Graphics2D graphics) {\r
+        Rectangle2D anchor = getAnchor();\r
+\r
+        XmlObject spPr = null;\r
+        CTBackground bg = (CTBackground)getXmlObject();\r
+        if(bg.isSetBgPr()){\r
+            spPr = bg.getBgPr();\r
+        } else if (bg.isSetBgRef()){\r
+            CTStyleMatrixReference bgRef= bg.getBgRef();\r
+            int idx = (int)bgRef.getIdx() - 1000;\r
+            XSLFTheme theme = getSheet().getTheme();\r
+            CTBackgroundFillStyleList bgStyles =\r
+                    theme.getXmlObject().getThemeElements().getFmtScheme().getBgFillStyleLst();\r
+\r
+            // TODO pass this to getPaint\r
+            XmlObject bgStyle = bgStyles.selectPath("*")[idx];\r
+        }\r
+\r
+        if(spPr == null){\r
+            return;\r
         }\r
-        if (pr.isSetBlipFill()) {\r
 \r
-            String blipId = pr.getBlipFill().getBlip().getEmbed();\r
-            PackagePart p = getSheet().getPackagePart();\r
-            PackageRelationship rel = p.getRelationship(blipId);\r
-            if (rel != null) {\r
-                try {\r
-                    BufferedImage img = ImageIO.read(p.getRelatedPart(rel).getInputStream());\r
-                    graphics.drawImage(img, (int) anchor.getX(), (int) anchor.getY(),\r
-                            (int) anchor.getWidth(), (int) anchor.getHeight(), null);\r
-                }\r
-                catch (Exception e) {\r
-                    return;\r
-                }\r
-            }\r
+        Paint fill = getPaint(graphics, spPr);\r
+        if(fill != null) {\r
+            graphics.setPaint(fill);\r
+            graphics.fill(anchor);\r
         }\r
     }\r
 \r
+    \r
 }\r
index 614262a9e5f0fca3c570bf3edf1516ffb0b750c2..8ca8dbde9f23b2fcad5f3fa8b514e70762599caa 100644 (file)
  */\r
 package org.apache.poi.xslf.usermodel;\r
 \r
-import java.awt.Color;\r
-\r
+import org.apache.poi.util.Beta;\r
 import org.apache.poi.util.Internal;\r
+import org.apache.xmlbeans.XmlObject;\r
 import org.openxmlformats.schemas.drawingml.x2006.main.CTColor;\r
-import org.openxmlformats.schemas.drawingml.x2006.main.CTOfficeStyleSheet;\r
+import org.openxmlformats.schemas.drawingml.x2006.main.CTHslColor;\r
+import org.openxmlformats.schemas.drawingml.x2006.main.CTPresetColor;\r
+import org.openxmlformats.schemas.drawingml.x2006.main.CTSRgbColor;\r
+import org.openxmlformats.schemas.drawingml.x2006.main.CTScRgbColor;\r
+import org.openxmlformats.schemas.drawingml.x2006.main.CTSchemeColor;\r
+import org.openxmlformats.schemas.drawingml.x2006.main.CTSystemColor;\r
+import org.w3c.dom.Node;\r
+\r
+import java.awt.*;\r
+import java.util.HashMap;\r
+import java.util.Map;\r
 \r
+/**\r
+ * Encapsulates logic to read color definitions from DrawingML and convert them to java.awt.Color\r
+ *\r
+ * @author Yegor Kozlov\r
+ */\r
+@Beta\r
 public class XSLFColor {\r
-       private final CTColor _ctColor;\r
-       \r
-       XSLFColor(CTColor ctColor){\r
-               _ctColor = ctColor;\r
-       }\r
-       \r
+    private XmlObject _xmlObject;\r
+    private Color _color;\r
+\r
+    XSLFColor(XmlObject obj, XSLFTheme theme) {\r
+        _xmlObject = obj;\r
+        _color = toColor(obj, theme);\r
+    }\r
+\r
     @Internal\r
-    public CTColor getXmlObject() {\r
-        return _ctColor;\r
-    }\r
-    \r
-    public Color getColor(){\r
-       return getColor(0xFF);\r
-    }\r
-       \r
-    public Color getColor(int alpha){\r
-       Color color = Color.black;\r
-       if(_ctColor.isSetSrgbClr()){\r
-               byte[] val = _ctColor.getSrgbClr().getVal();\r
-               color = new Color(0xFF & val[0], 0xFF & val[1], 0xFF & val[2], alpha);\r
-       } else if (_ctColor.isSetSysClr()){\r
-               byte[] val = _ctColor.getSysClr().getLastClr();\r
-               color = new Color(0xFF & val[0], 0xFF & val[1], 0xFF & val[2], alpha);\r
-       }\r
-       return color;\r
+    public XmlObject getXmlObject() {\r
+        return _xmlObject;\r
+    }\r
+\r
+    /**\r
+     *\r
+     * @return  the displayed color as a Java Color.\r
+     * If not color information was found in the supplied xml object then a null is returned.\r
+     */\r
+    public Color getColor() {\r
+        return _color == null ? null : applyColorTransform(_color);\r
+    }\r
+\r
+    private Color applyColorTransform(Color color){\r
+        Color result = color;\r
+\r
+        int alpha = getAlpha();\r
+        if(alpha != -1){\r
+            result = new Color(\r
+                    result.getRed(), result.getGreen(), result.getBlue(), \r
+                    Math.round(255 * alpha * 0.01f));\r
+        }\r
+\r
+        int lumOff = getLumOff();\r
+        int lumMod = getLumMod();\r
+        if(lumMod != -1 || lumOff != -1){\r
+            result = modulateLuminanace(result,\r
+                    lumMod == -1 ? 100 : lumMod,\r
+                    lumOff == -1 ? 0 : lumOff);\r
+        }\r
+\r
+        int shade = getShade();\r
+        if(shade != -1){\r
+               result = shade(result, shade);\r
+        }\r
+\r
+        int tint = getTint();\r
+        if(tint != -1){\r
+            result = tint(result, tint);\r
+        }\r
+\r
+        return result;\r
+    }\r
+\r
+    static Color toColor(XmlObject obj, XSLFTheme theme) {\r
+        Color color = null;\r
+        for (XmlObject ch : obj.selectPath("*")) {\r
+            if (ch instanceof CTHslColor) {\r
+                CTHslColor hsl = (CTHslColor)ch;\r
+                int h = hsl.getHue2();\r
+                int s = hsl.getSat2();\r
+                int l = hsl.getLum2();\r
+                // is it correct ? \r
+                color = Color.getHSBColor(h / 60000f, s / 100000f, l / 100000f);\r
+            } else if (ch instanceof CTPresetColor) {\r
+                CTPresetColor prst = (CTPresetColor)ch;\r
+                String colorName = prst.getVal().toString();\r
+                color = presetColors.get(colorName);\r
+            } else if (ch instanceof CTSchemeColor) {\r
+                CTSchemeColor schemeColor = (CTSchemeColor)ch;\r
+                String colorRef = schemeColor.getVal().toString();\r
+                // find referenced CTColor in the theme and convert it to java.awt.Color via a recursive call\r
+                CTColor ctColor = theme.getCTColor(colorRef);\r
+                if(ctColor != null) color = toColor(ctColor, null);\r
+                else {\r
+                    color = Color.black;\r
+                }\r
+            } else if (ch instanceof CTScRgbColor) {\r
+                // same as CTSRgbColor but with values expressed in percents\r
+                CTScRgbColor scrgb = (CTScRgbColor)ch;\r
+                int r = scrgb.getR();\r
+                int g = scrgb.getG();\r
+                int b = scrgb.getB();\r
+                color = new Color(255 * r / 100000, 255 * g / 100000, 255 * b / 100000);\r
+            } else if (ch instanceof CTSRgbColor) {\r
+                CTSRgbColor srgb = (CTSRgbColor)ch;\r
+                byte[] val = srgb.getVal();\r
+                color = new Color(0xFF & val[0], 0xFF & val[1], 0xFF & val[2]);\r
+            } else if (ch instanceof CTSystemColor) {\r
+                CTSystemColor sys = (CTSystemColor)ch;\r
+                if(sys.isSetLastClr()) {\r
+                    byte[] val = sys.getLastClr();\r
+                    color = new Color(0xFF & val[0], 0xFF & val[1], 0xFF & val[2]);\r
+                } else {\r
+                    // YK: color is a string like "menuText" or "windowText", we return black for such cases\r
+                    String colorName = sys.getVal().toString();\r
+                    color = Color.black;\r
+                }\r
+            } else {\r
+                throw new IllegalArgumentException("Unexpected color choice: " + ch.getClass());\r
+            }\r
+        }\r
+        return color;\r
+    }\r
+\r
+    private int getPercentageValue(String elem){\r
+        XmlObject[] obj = _xmlObject.selectPath(\r
+                "declare namespace a='http://schemas.openxmlformats.org/drawingml/2006/main' $this//a:" + elem);\r
+        if(obj.length == 1){\r
+            Node attr = obj[0].getDomNode().getAttributes().getNamedItem("val");\r
+            if(attr != null) {\r
+                return Integer.parseInt(attr.getNodeValue()) / 1000;\r
+            }\r
+        }\r
+        return -1;\r
+    }\r
+\r
+    private int getAngleValue(String elem){\r
+        XmlObject[] obj = _xmlObject.selectPath(\r
+                "declare namespace a='http://schemas.openxmlformats.org/drawingml/2006/main' $this//a:" + elem);\r
+        if(obj.length == 1){\r
+            Node attr = obj[0].getDomNode().getAttributes().getNamedItem("val");\r
+            if(attr != null) {\r
+                return Integer.parseInt(attr.getNodeValue()) / 60000;\r
+            }\r
+        }\r
+        return -1;\r
+    }\r
+\r
+    /**\r
+     * the opacity as expressed by a percentage value\r
+     *\r
+     * @return  opacity in percents in the range [0..100]\r
+     * or -1 if the value is not set\r
+     */\r
+    int getAlpha(){\r
+        return getPercentageValue("alpha");        \r
+    }\r
+\r
+    /**\r
+     * the opacity as expressed by a percentage relative to the input color\r
+     *\r
+     * @return  opacity in percents in the range [0..100]\r
+     * or -1 if the value is not set\r
+     */\r
+    int getAlphaMod(){\r
+        return getPercentageValue("alphaMod");\r
+    }\r
+\r
+    /**\r
+     * the opacity as expressed by a percentage offset increase or decrease relative to\r
+     * the input color. Increases will never increase the opacity beyond 100%, decreases will\r
+     * never decrease the opacity below 0%.\r
+     *\r
+     * @return  opacity shift in percents in the range [0..100]\r
+     * or -1 if the value is not set\r
+     */\r
+    int getAlphaOff(){\r
+        return getPercentageValue("alphaOff");\r
+    }\r
+\r
+\r
+    int getHue(){\r
+        return getAngleValue("hue");\r
+    }\r
+\r
+    int getHueMod(){\r
+        return getPercentageValue("hueMod");\r
+    }\r
+\r
+    int getHueOff(){\r
+        return getPercentageValue("hueOff");\r
+    }\r
+\r
+    /**\r
+     * specifies the input color with the specified luminance,\r
+     * but with its hue and saturation unchanged.\r
+     *\r
+     * @return  luminance in percents in the range [0..100]\r
+     * or -1 if the value is not set\r
+     */\r
+    int getLum(){\r
+        return getPercentageValue("lum");\r
+    }\r
+\r
+    /**\r
+     * the luminance as expressed by a percentage relative to the input color\r
+     *\r
+     * @return  luminance in percents in the range [0..100]\r
+     * or -1 if the value is not set\r
+     */\r
+    int getLumMod(){\r
+        return getPercentageValue("lumMod");\r
+    }\r
+\r
+    /**\r
+     * the luminance shift as expressed by a percentage relative to the input color\r
+     *\r
+     * @return  luminance shift in percents in the range [0..100]\r
+     * or -1 if the value is not set\r
+     */\r
+    int getLumOff(){\r
+        return getPercentageValue("lumOff");\r
+    }\r
+\r
+    /**\r
+     * specifies the input color with the specified saturation,\r
+     * but with its hue and luminance unchanged.\r
+     *\r
+     * @return  saturation in percents in the range [0..100]\r
+     * or -1 if the value is not set\r
+     */\r
+    int getSat(){\r
+        return getPercentageValue("sat");\r
+    }\r
+\r
+    /**\r
+     * the saturation as expressed by a percentage relative to the input color\r
+     *\r
+     * @return  saturation in percents in the range [0..100]\r
+     * or -1 if the value is not set\r
+     */\r
+    int getSatMod(){\r
+        return getPercentageValue("satMod");\r
+    }\r
+\r
+    /**\r
+     * the saturation shift as expressed by a percentage relative to the input color\r
+     *\r
+     * @return  saturation shift in percents in the range [0..100]\r
+     * or -1 if the value is not set\r
+     */\r
+    int getSatOff(){\r
+        return getPercentageValue("satOff");\r
+    }\r
+\r
+    /**\r
+     * specifies the input color with the specific red component, but with the blue and green color\r
+     * components unchanged\r
+     * \r
+     * @return the value of the red component specified as a\r
+     * percentage with 0% indicating minimal blue and 100% indicating maximum\r
+     * or -1 if the value is not set\r
+     */\r
+    int getRed(){\r
+        return getPercentageValue("red");\r
+    }\r
+\r
+    int getRedMod(){\r
+        return getPercentageValue("redMod");\r
+    }\r
+\r
+    int getRedOff(){\r
+        return getPercentageValue("redOff");\r
+    }\r
+\r
+    /**\r
+     * specifies the input color with the specific green component, but with the red and blue color\r
+     * components unchanged\r
+     *\r
+     * @return the value of the green component specified as a\r
+     * percentage with 0% indicating minimal blue and 100% indicating maximum\r
+     * or -1 if the value is not set\r
+     */\r
+    int getGreen(){\r
+        return getPercentageValue("green");\r
+    }\r
+\r
+    int getGreenMod(){\r
+        return getPercentageValue("greenMod");\r
+    }\r
+\r
+    int getGreenOff(){\r
+        return getPercentageValue("greenOff");\r
+    }\r
+\r
+    /**\r
+     * specifies the input color with the specific blue component, but with the red and green color\r
+     * components unchanged\r
+     *\r
+     * @return the value of the blue component specified as a\r
+     * percentage with 0% indicating minimal blue and 100% indicating maximum\r
+     * or -1 if the value is not set\r
+     */\r
+    int getBlue(){\r
+        return getPercentageValue("blue");\r
+    }\r
+\r
+    int getBlueMod(){\r
+        return getPercentageValue("blueMod");\r
+    }\r
+\r
+    int getBlueOff(){\r
+        return getPercentageValue("blueOff");\r
+    }\r
+\r
+    /**\r
+     * specifies a darker version of its input color.\r
+     * A 10% shade is 10% of the input color combined with 90% black.\r
+     * \r
+     * @return the value of the shade specified as a\r
+     * percentage with 0% indicating minimal blue and 100% indicating maximum\r
+     * or -1 if the value is not set\r
+     */\r
+    int getShade(){\r
+        return getPercentageValue("shade");\r
+    }\r
+\r
+    /**\r
+     * specifies a lighter version of its input color.\r
+     * A 10% tint is 10% of the input color combined with 90% white.\r
+     *\r
+     * @return the value of the tint specified as a\r
+     * percentage with 0% indicating minimal blue and 100% indicating maximum\r
+     * or -1 if the value is not set\r
+     */\r
+    int getTint(){\r
+        return getPercentageValue("tint");\r
+    }\r
+\r
+\r
+    /**\r
+     * Apply lumMod / lumOff adjustments\r
+     *\r
+     * @param c the color to modify\r
+     * @param lumMod luminance modulation in the range [0..100]\r
+     * @param lumOff luminance offset in the range [0..100]\r
+     * @return  modified color\r
+     */\r
+    private static Color modulateLuminanace(Color c, int lumMod, int lumOff) {\r
+        Color color;\r
+        if (lumOff > 0) {\r
+            color = new Color(\r
+                    (int) (Math.round((255 - c.getRed()) * (100.0 - lumMod) / 100.0 + c.getRed())),\r
+                    (int) (Math.round((255 - c.getGreen()) * lumOff / 100.0 + c.getGreen())),\r
+                    (int) (Math.round((255 - c.getBlue()) * lumOff / 100.0 + c.getBlue())),\r
+                    c.getAlpha()\r
+            );\r
+        } else {\r
+            color = new Color(\r
+                    (int) (Math.round(c.getRed() * lumMod / 100.0)),\r
+                    (int) (Math.round(c.getGreen() * lumMod / 100.0)),\r
+                    (int) (Math.round(c.getBlue() * lumMod / 100.0)),\r
+                    c.getAlpha()\r
+            );\r
+        }\r
+        return color;\r
+    }\r
+\r
+    private static Color shade(Color c, int shade) {\r
+        return new Color(\r
+                (int)(c.getRed() * shade * 0.01),\r
+                (int)(c.getGreen() * shade * 0.01),\r
+                (int)(c.getBlue() * shade * 0.01),\r
+                c.getAlpha());\r
+    }\r
+\r
+    private static Color tint(Color c, int tint) {\r
+        int r = c.getRed();\r
+        int g = c.getGreen();\r
+        int b = c.getBlue();\r
+\r
+        float ftint = tint / 100.0f;\r
+\r
+        int red = Math.round(ftint * r + (1 - ftint) * 255);\r
+        int green = Math.round(ftint * g + (1 - ftint) * 255);\r
+        int blue = Math.round(ftint * b + (1 - ftint) * 255);\r
+\r
+        return new Color(red, green, blue);\r
+    }\r
+\r
+    /**\r
+     * Preset colors defined in DrawingML\r
+     */\r
+    static Map<String, Color> presetColors;\r
+\r
+    static {\r
+        presetColors = new HashMap<String, Color>();    \r
+        presetColors.put("aliceBlue", new Color(240, 248, 255));\r
+        presetColors.put("antiqueWhite", new Color(250, 235, 215));\r
+        presetColors.put("aqua", new Color(0, 255, 255));\r
+        presetColors.put("aquamarine", new Color(127, 255, 212));\r
+        presetColors.put("azure", new Color(240, 255, 255));\r
+        presetColors.put("beige", new Color(245, 245, 220));\r
+        presetColors.put("bisque", new Color(255, 228, 196));\r
+        presetColors.put("black", new Color(0, 0, 0));\r
+        presetColors.put("blanchedAlmond", new Color(255, 235, 205));\r
+        presetColors.put("blue", new Color(0, 0, 255));\r
+        presetColors.put("blueViolet", new Color(138, 43, 226));\r
+        presetColors.put("brown", new Color(165, 42, 42));\r
+        presetColors.put("burlyWood", new Color(222, 184, 135));\r
+        presetColors.put("cadetBlue", new Color(95, 158, 160));\r
+        presetColors.put("chartreuse", new Color(127, 255, 0));\r
+        presetColors.put("chocolate", new Color(210, 105, 30));\r
+        presetColors.put("coral", new Color(255, 127, 80));\r
+        presetColors.put("cornflowerBlue", new Color(100, 149, 237));\r
+        presetColors.put("crimson", new Color(220, 20, 60));\r
+        presetColors.put("cyan", new Color(0, 255, 255));\r
+        presetColors.put("deepPink", new Color(255, 20, 147));\r
+        presetColors.put("deepSkyBlue", new Color(0, 191, 255));\r
+        presetColors.put("dimGray", new Color(105, 105, 105));\r
+        presetColors.put("dkBlue", new Color(0, 0, 139));\r
+        presetColors.put("dkCyan", new Color(0, 139, 139));\r
+        presetColors.put("dkGoldenrod", new Color(184, 134, 11));\r
+        presetColors.put("dkGray", new Color(169, 169, 169));\r
+        presetColors.put("dkGreen", new Color(0, 100, 0));\r
+        presetColors.put("dkKhaki", new Color(189, 183, 107));\r
+        presetColors.put("dkMagenta", new Color(139, 0, 139));\r
+        presetColors.put("dkOliveGreen", new Color(85, 107, 47));\r
+        presetColors.put("dkOrange", new Color(255, 140, 0));\r
+        presetColors.put("dkOrchid", new Color(153, 50, 204));\r
+        presetColors.put("dkRed", new Color(139, 0, 0));\r
+        presetColors.put("dkSalmon", new Color(233, 150, 122));\r
+        presetColors.put("dkSeaGreen", new Color(143, 188, 139));\r
+        presetColors.put("dkSlateBlue", new Color(72, 61, 139));\r
+        presetColors.put("dkSlateGray", new Color(47, 79, 79));\r
+        presetColors.put("dkTurquoise", new Color(0, 206, 209));\r
+        presetColors.put("dkViolet", new Color(148, 0, 211));\r
+        presetColors.put("dodgerBlue", new Color(30, 144, 255));\r
+        presetColors.put("firebrick", new Color(178, 34, 34));\r
+        presetColors.put("floralWhite", new Color(255, 250, 240));\r
+        presetColors.put("forestGreen", new Color(34, 139, 34));\r
+        presetColors.put("fuchsia", new Color(255, 0, 255));\r
+        presetColors.put("gainsboro", new Color(220, 220, 220));\r
+        presetColors.put("ghostWhite", new Color(248, 248, 255));\r
+        presetColors.put("gold", new Color(255, 215, 0));\r
+        presetColors.put("goldenrod", new Color(218, 165, 32));\r
+        presetColors.put("gray", new Color(128, 128, 128));\r
+        presetColors.put("green", new Color(0, 128, 0));\r
+        presetColors.put("greenYellow", new Color(173, 255, 47));\r
+        presetColors.put("honeydew", new Color(240, 255, 240));\r
+        presetColors.put("hotPink", new Color(255, 105, 180));\r
+        presetColors.put("indianRed", new Color(205, 92, 92));\r
+        presetColors.put("indigo", new Color(75, 0, 130));\r
+        presetColors.put("ivory", new Color(255, 255, 240));\r
+        presetColors.put("khaki", new Color(240, 230, 140));\r
+        presetColors.put("lavender", new Color(230, 230, 250));\r
+        presetColors.put("lavenderBlush", new Color(255, 240, 245));\r
+        presetColors.put("lawnGreen", new Color(124, 252, 0));\r
+        presetColors.put("lemonChiffon", new Color(255, 250, 205));\r
+        presetColors.put("lime", new Color(0, 255, 0));\r
+        presetColors.put("limeGreen", new Color(50, 205, 50));\r
+        presetColors.put("linen", new Color(250, 240, 230));\r
+        presetColors.put("ltBlue", new Color(173, 216, 230));\r
+        presetColors.put("ltCoral", new Color(240, 128, 128));\r
+        presetColors.put("ltCyan", new Color(224, 255, 255));\r
+        presetColors.put("ltGoldenrodYellow", new Color(250, 250, 120));\r
+        presetColors.put("ltGray", new Color(211, 211, 211));\r
+        presetColors.put("ltGreen", new Color(144, 238, 144));\r
+        presetColors.put("ltPink", new Color(255, 182, 193));\r
+        presetColors.put("ltSalmon", new Color(255, 160, 122));\r
+        presetColors.put("ltSeaGreen", new Color(32, 178, 170));\r
+        presetColors.put("ltSkyBlue", new Color(135, 206, 250));\r
+        presetColors.put("ltSlateGray", new Color(119, 136, 153));\r
+        presetColors.put("ltSteelBlue", new Color(176, 196, 222));\r
+        presetColors.put("ltYellow", new Color(255, 255, 224));\r
+        presetColors.put("magenta", new Color(255, 0, 255));\r
+        presetColors.put("maroon", new Color(128, 0, 0));\r
+        presetColors.put("medAquamarine", new Color(102, 205, 170));\r
+        presetColors.put("medBlue", new Color(0, 0, 205));\r
+        presetColors.put("medOrchid", new Color(186, 85, 211));\r
+        presetColors.put("medPurple", new Color(147, 112, 219));\r
+        presetColors.put("medSeaGreen", new Color(60, 179, 113));\r
+        presetColors.put("medSlateBlue", new Color(123, 104, 238));\r
+        presetColors.put("medSpringGreen", new Color(0, 250, 154));\r
+        presetColors.put("medTurquoise", new Color(72, 209, 204));\r
+        presetColors.put("medVioletRed", new Color(199, 21, 133));\r
+        presetColors.put("midnightBlue", new Color(25, 25, 112));\r
+        presetColors.put("mintCream", new Color(245, 255, 250));\r
+        presetColors.put("mistyRose", new Color(255, 228, 225));\r
+        presetColors.put("moccasin", new Color(255, 228, 181));\r
+        presetColors.put("navajoWhite", new Color(255, 222, 173));\r
+        presetColors.put("navy", new Color(0, 0, 128));\r
+        presetColors.put("oldLace", new Color(253, 245, 230));\r
+        presetColors.put("olive", new Color(128, 128, 0));\r
+        presetColors.put("oliveDrab", new Color(107, 142, 35));\r
+        presetColors.put("orange", new Color(255, 165, 0));\r
+        presetColors.put("orangeRed", new Color(255, 69, 0));\r
+        presetColors.put("orchid", new Color(218, 112, 214));\r
+        presetColors.put("paleGoldenrod", new Color(238, 232, 170));\r
+        presetColors.put("paleGreen", new Color(152, 251, 152));\r
+        presetColors.put("paleTurquoise", new Color(175, 238, 238));\r
+        presetColors.put("paleVioletRed", new Color(219, 112, 147));\r
+        presetColors.put("papayaWhip", new Color(255, 239, 213));\r
+        presetColors.put("peachPuff", new Color(255, 218, 185));\r
+        presetColors.put("peru", new Color(205, 133, 63));\r
+        presetColors.put("pink", new Color(255, 192, 203));\r
+        presetColors.put("plum", new Color(221, 160, 221));\r
+        presetColors.put("powderBlue", new Color(176, 224, 230));\r
+        presetColors.put("purple", new Color(128, 0, 128));\r
+        presetColors.put("red", new Color(255, 0, 0));\r
+        presetColors.put("rosyBrown", new Color(188, 143, 143));\r
+        presetColors.put("royalBlue", new Color(65, 105, 225));\r
+        presetColors.put("saddleBrown", new Color(139, 69, 19));\r
+        presetColors.put("salmon", new Color(250, 128, 114));\r
+        presetColors.put("sandyBrown", new Color(244, 164, 96));\r
+        presetColors.put("seaGreen", new Color(46, 139, 87));\r
+        presetColors.put("seaShell", new Color(255, 245, 238));\r
+        presetColors.put("sienna", new Color(160, 82, 45));\r
+        presetColors.put("silver", new Color(192, 192, 192));\r
+        presetColors.put("skyBlue", new Color(135, 206, 235));\r
+        presetColors.put("slateBlue", new Color(106, 90, 205));\r
+        presetColors.put("slateGray", new Color(112, 128, 144));\r
+        presetColors.put("snow", new Color(255, 250, 250));\r
+        presetColors.put("springGreen", new Color(0, 255, 127));\r
+        presetColors.put("steelBlue", new Color(70, 130, 180));\r
+        presetColors.put("tan", new Color(210, 180, 140));\r
+        presetColors.put("teal", new Color(0, 128, 128));\r
+        presetColors.put("thistle", new Color(216, 191, 216));\r
+        presetColors.put("tomato", new Color(255, 99, 71));\r
+        presetColors.put("turquoise", new Color(64, 224, 208));\r
+        presetColors.put("violet", new Color(238, 130, 238));\r
+        presetColors.put("wheat", new Color(245, 222, 179));\r
+        presetColors.put("white", new Color(255, 255, 255));\r
+        presetColors.put("whiteSmoke", new Color(245, 245, 245));\r
+        presetColors.put("yellow", new Color(255, 255, 0));\r
+        presetColors.put("yellowGreen", new Color(154, 205, 50));\r
     }\r
 }\r
index 231dc008d6428f847af581fbffe2c5988b2163d9..23ddb4d534ebad53518a41442b8162263f87a48c 100644 (file)
@@ -17,8 +17,6 @@
 
 package org.apache.poi.xslf.usermodel;
 
-import java.io.IOException;
-
 import org.apache.poi.POIXMLDocumentPart;
 import org.apache.poi.openxml4j.opc.PackagePart;
 import org.apache.poi.openxml4j.opc.PackageRelationship;
@@ -28,6 +26,8 @@ import org.openxmlformats.schemas.presentationml.x2006.main.CTCommentAuthor;
 import org.openxmlformats.schemas.presentationml.x2006.main.CTCommentAuthorList;
 import org.openxmlformats.schemas.presentationml.x2006.main.CmAuthorLstDocument;
 
+import java.io.IOException;
+
 @Beta
 public class XSLFCommentAuthors extends POIXMLDocumentPart {
     private final CTCommentAuthorList _authors;
index 35e88465817ce9721f128a959966576d9e196b8f..9eed7ec7e043ce2df1d90913b4698145160f6a69 100644 (file)
@@ -17,8 +17,6 @@
 
 package org.apache.poi.xslf.usermodel;
 
-import java.io.IOException;
-
 import org.apache.poi.POIXMLDocumentPart;
 import org.apache.poi.openxml4j.opc.PackagePart;
 import org.apache.poi.openxml4j.opc.PackageRelationship;
@@ -28,6 +26,8 @@ import org.openxmlformats.schemas.presentationml.x2006.main.CTComment;
 import org.openxmlformats.schemas.presentationml.x2006.main.CTCommentList;
 import org.openxmlformats.schemas.presentationml.x2006.main.CmLstDocument;
 
+import java.io.IOException;
+
 @Beta
 public class XSLFComments extends POIXMLDocumentPart {
     private final CTCommentList _comments;
index cc16d26ebc83e0ef7f26da8595040171dc08dd93..2e28774a4c2d4f78df70e1582666e4c28fa2e39f 100644 (file)
 package org.apache.poi.xslf.usermodel;\r
 \r
 import org.apache.poi.util.Beta;\r
+import org.openxmlformats.schemas.drawingml.x2006.main.CTLineEndProperties;\r
 import org.openxmlformats.schemas.drawingml.x2006.main.CTLineProperties;\r
 import org.openxmlformats.schemas.drawingml.x2006.main.CTNonVisualDrawingProps;\r
 import org.openxmlformats.schemas.drawingml.x2006.main.CTPresetGeometry2D;\r
 import org.openxmlformats.schemas.drawingml.x2006.main.CTShapeProperties;\r
-import org.openxmlformats.schemas.drawingml.x2006.main.STShapeType;\r
-import org.openxmlformats.schemas.drawingml.x2006.main.CTLineEndProperties;\r
+import org.openxmlformats.schemas.drawingml.x2006.main.STLineEndLength;\r
 import org.openxmlformats.schemas.drawingml.x2006.main.STLineEndType;\r
 import org.openxmlformats.schemas.drawingml.x2006.main.STLineEndWidth;\r
-import org.openxmlformats.schemas.drawingml.x2006.main.STLineEndLength;\r
+import org.openxmlformats.schemas.drawingml.x2006.main.STShapeType;\r
 import org.openxmlformats.schemas.presentationml.x2006.main.CTConnector;\r
 import org.openxmlformats.schemas.presentationml.x2006.main.CTConnectorNonVisual;\r
 \r
 import java.awt.*;\r
-import java.awt.geom.*;\r
+import java.awt.geom.AffineTransform;\r
+import java.awt.geom.Ellipse2D;\r
+import java.awt.geom.GeneralPath;\r
+import java.awt.geom.Rectangle2D;\r
 \r
 /**\r
  * Specifies a connection shape.\r
@@ -202,11 +205,11 @@ public class XSLFConnectorShape extends XSLFSimpleShape {
         XSLFShadow shadow = getShadow();\r
 \r
         //border\r
-        Color lineColor = getLineColor();\r
-        if (lineColor != null) {\r
+        Paint line = getLinePaint(graphics);\r
+        if (line != null) {\r
             if (shadow != null) shadow.draw(graphics);\r
 \r
-            graphics.setColor(lineColor);\r
+            graphics.setPaint(line);\r
             applyStroke(graphics);\r
             graphics.draw(outline);\r
 \r
index e731a632d678e76fe50ee0e8cdf3041e377251ad..6de6e4d775184dea3b04aecc970fdd0e9d62ad92 100644 (file)
 ==================================================================== */\r
 package org.apache.poi.xslf.usermodel;\r
 \r
-import org.apache.poi.sl.usermodel.ShapeContainer;\r
 import org.apache.poi.util.Beta;\r
 import org.apache.xmlbeans.XmlObject;\r
 import org.openxmlformats.schemas.drawingml.x2006.main.CTNonVisualDrawingProps;\r
 import org.openxmlformats.schemas.presentationml.x2006.main.CTConnector;\r
+import org.openxmlformats.schemas.presentationml.x2006.main.CTGraphicalObjectFrame;\r
 import org.openxmlformats.schemas.presentationml.x2006.main.CTGroupShape;\r
 import org.openxmlformats.schemas.presentationml.x2006.main.CTPicture;\r
 import org.openxmlformats.schemas.presentationml.x2006.main.CTShape;\r
-import org.openxmlformats.schemas.presentationml.x2006.main.CTGraphicalObjectFrame;\r
 \r
 import java.awt.*;\r
 \r
index 9077e256f1428c2f55fa8905e93e920640a68a32..8e6809bba28b1ba7711de161d6e303209dde18f1 100644 (file)
 \r
 package org.apache.poi.xslf.usermodel;\r
 \r
-import org.apache.poi.sl.usermodel.Shape;\r
-import org.apache.poi.sl.usermodel.ShapeContainer;\r
-import org.apache.poi.sl.usermodel.ShapeGroup;\r
 import org.apache.poi.util.Beta;\r
 import org.apache.poi.util.Units;\r
-import org.openxmlformats.schemas.presentationml.x2006.main.CTGraphicalObjectFrame;\r
-import org.openxmlformats.schemas.drawingml.x2006.main.CTGroupTransform2D;\r
 import org.openxmlformats.schemas.drawingml.x2006.main.CTPoint2D;\r
 import org.openxmlformats.schemas.drawingml.x2006.main.CTPositiveSize2D;\r
 import org.openxmlformats.schemas.drawingml.x2006.main.CTTransform2D;\r
-import org.openxmlformats.schemas.drawingml.x2006.main.CTShapeProperties;\r
+import org.openxmlformats.schemas.presentationml.x2006.main.CTGraphicalObjectFrame;\r
 \r
-import java.awt.Graphics2D;\r
-import java.awt.geom.AffineTransform;\r
+import java.awt.*;\r
 import java.awt.geom.Rectangle2D;\r
 \r
 /**\r
index 3d5b2f6a5e428978e48a815a2cb45aa16cae7de4..95826af0e42ef0f8f20f8db437ac175e9880ebe6 100644 (file)
@@ -22,9 +22,6 @@ package org.apache.poi.xslf.usermodel;
 import org.apache.poi.openxml4j.opc.PackagePart;\r
 import org.apache.poi.openxml4j.opc.PackageRelationship;\r
 import org.apache.poi.openxml4j.opc.TargetMode;\r
-import org.apache.poi.sl.usermodel.Shape;\r
-import org.apache.poi.sl.usermodel.ShapeContainer;\r
-import org.apache.poi.sl.usermodel.ShapeGroup;\r
 import org.apache.poi.util.Beta;\r
 import org.apache.poi.util.Units;\r
 import org.apache.xmlbeans.XmlObject;\r
@@ -33,13 +30,12 @@ import org.openxmlformats.schemas.drawingml.x2006.main.CTGroupTransform2D;
 import org.openxmlformats.schemas.drawingml.x2006.main.CTNonVisualDrawingProps;\r
 import org.openxmlformats.schemas.drawingml.x2006.main.CTPoint2D;\r
 import org.openxmlformats.schemas.drawingml.x2006.main.CTPositiveSize2D;\r
-import org.openxmlformats.schemas.drawingml.x2006.main.CTTransform2D;\r
 import org.openxmlformats.schemas.presentationml.x2006.main.CTConnector;\r
 import org.openxmlformats.schemas.presentationml.x2006.main.CTGroupShape;\r
 import org.openxmlformats.schemas.presentationml.x2006.main.CTGroupShapeNonVisual;\r
 import org.openxmlformats.schemas.presentationml.x2006.main.CTShape;\r
 \r
-import java.awt.Graphics2D;\r
+import java.awt.*;\r
 import java.awt.geom.AffineTransform;\r
 import java.awt.geom.Rectangle2D;\r
 import java.util.List;\r
index 46fa1bf17cc3e1643fa6a79a86bcf6d06d5270ab..8f763622f4f0e53ee09fb9245ff2021d71408ffe 100644 (file)
@@ -22,10 +22,12 @@ package org.apache.poi.xslf.usermodel;
 import org.apache.poi.util.Beta;\r
 \r
 import javax.imageio.ImageIO;\r
-import java.awt.Graphics2D;\r
+import java.awt.*;\r
 import java.awt.geom.Rectangle2D;\r
 import java.awt.image.BufferedImage;\r
 import java.io.ByteArrayInputStream;\r
+import java.io.IOException;\r
+import java.io.InputStream;\r
 \r
 /**\r
  * For now this class renders only images supported by the javax.imageio.ImageIO\r
@@ -74,14 +76,25 @@ public class XSLFImageRendener {
        public boolean drawImage(Graphics2D graphics, XSLFPictureData data,\r
                        Rectangle2D anchor) {\r
                try {\r
-                       BufferedImage img = ImageIO.read(new ByteArrayInputStream(data\r
-                                       .getData()));\r
-                       graphics.drawImage(img, (int) anchor.getX(), (int) anchor.getY(),\r
-                                       (int) anchor.getWidth(), (int) anchor.getHeight(), null);\r
+                       BufferedImage img = readImage(new ByteArrayInputStream(data.getData()));\r
+                       if (img != null){\r
+                graphics.drawImage(img, (int) anchor.getX(), (int) anchor.getY(),\r
+                        (int) anchor.getWidth(), (int) anchor.getHeight(), null);\r
+            }\r
                        return true;\r
                } catch (Exception e) {\r
                        return false;\r
                }\r
 \r
        }\r
+\r
+    /**\r
+     * create a buffered image from input stream\r
+     *\r
+     * @return a <code>BufferedImage</code> containing the decoded\r
+     * contents of the input, or <code>null</code>.\r
+     */\r
+    public BufferedImage readImage(InputStream is) throws IOException {\r
+        return ImageIO.read(is);\r
+    }\r
 }
\ No newline at end of file
index d4508f5eab107ac6086c038303716a8e327f4ff0..3025afcc4089e2fe3611f96ee242113452995e97 100644 (file)
@@ -16,8 +16,6 @@
 ==================================================================== */
 package org.apache.poi.xslf.usermodel;
 
-import java.io.IOException;
-
 import org.apache.poi.openxml4j.opc.PackagePart;
 import org.apache.poi.openxml4j.opc.PackageRelationship;
 import org.apache.poi.util.Beta;
@@ -26,6 +24,8 @@ import org.openxmlformats.schemas.presentationml.x2006.main.CTCommonSlideData;
 import org.openxmlformats.schemas.presentationml.x2006.main.CTNotesSlide;
 import org.openxmlformats.schemas.presentationml.x2006.main.NotesDocument;
 
+import java.io.IOException;
+
 @Beta
 public final class XSLFNotes extends XSLFSheet {
    private CTNotesSlide _notes;
index 32bf5ac2dc98148c0de4884f039ea60d4c609630..05813bdb9692ab633e592016472f0fd3319cc4cd 100644 (file)
 ==================================================================== */
 package org.apache.poi.xslf.usermodel;
 
-import org.apache.poi.POIXMLDocumentPart;
 import org.apache.poi.openxml4j.opc.PackagePart;
 import org.apache.poi.openxml4j.opc.PackageRelationship;
-import org.apache.poi.sl.usermodel.MasterSheet;
 import org.apache.poi.util.Beta;
 import org.apache.xmlbeans.XmlException;
 import org.openxmlformats.schemas.presentationml.x2006.main.CTNotesMaster;
-import org.openxmlformats.schemas.presentationml.x2006.main.CTSlideMaster;
 import org.openxmlformats.schemas.presentationml.x2006.main.NotesMasterDocument;
-import org.openxmlformats.schemas.presentationml.x2006.main.SldMasterDocument;
 
 import java.io.IOException;
-import java.util.HashMap;
 import java.util.Map;
 
 /**
index c5c92b5dc05427439e3be2ed623e21d24a94193c..0ceb5c5636cd61d0557f57c4926c2bf91eb06d1c 100644 (file)
 \r
 package org.apache.poi.xslf.usermodel;\r
 \r
-import org.apache.poi.POIXMLDocumentPart;\r
-import org.apache.poi.sl.usermodel.ShapeContainer;\r
+import org.apache.poi.POIXMLException;\r
+import org.apache.poi.openxml4j.opc.PackagePart;\r
+import org.apache.poi.openxml4j.opc.PackageRelationship;\r
 import org.apache.poi.util.Beta;\r
-import org.apache.poi.util.POILogger;\r
 import org.openxmlformats.schemas.drawingml.x2006.main.CTBlip;\r
 import org.openxmlformats.schemas.drawingml.x2006.main.CTBlipFillProperties;\r
 import org.openxmlformats.schemas.drawingml.x2006.main.CTNonVisualDrawingProps;\r
 import org.openxmlformats.schemas.drawingml.x2006.main.CTPresetGeometry2D;\r
-import org.openxmlformats.schemas.drawingml.x2006.main.CTSRgbColor;\r
 import org.openxmlformats.schemas.drawingml.x2006.main.CTShapeProperties;\r
-import org.openxmlformats.schemas.drawingml.x2006.main.CTSolidColorFillProperties;\r
 import org.openxmlformats.schemas.drawingml.x2006.main.STShapeType;\r
 import org.openxmlformats.schemas.presentationml.x2006.main.CTPicture;\r
 import org.openxmlformats.schemas.presentationml.x2006.main.CTPictureNonVisual;\r
 \r
 import javax.imageio.ImageIO;\r
-\r
-import java.awt.Color;\r
-import java.awt.Graphics2D;\r
-import java.awt.Image;\r
-import java.awt.Rectangle;\r
+import java.awt.*;\r
 import java.awt.geom.Rectangle2D;\r
 import java.awt.image.BufferedImage;\r
 import java.io.ByteArrayInputStream;\r
@@ -104,9 +98,15 @@ public class XSLFPictureShape extends XSLFSimpleShape {
             CTPicture ct = (CTPicture)getXmlObject();\r
             String blipId = ct.getBlipFill().getBlip().getEmbed();\r
 \r
-            for (POIXMLDocumentPart part : getSheet().getRelations()) {\r
-                if(part.getPackageRelationship().getId().equals(blipId)){\r
-                    _data = (XSLFPictureData)part;\r
+            PackagePart p = getSheet().getPackagePart();\r
+            PackageRelationship rel = p.getRelationship(blipId);\r
+            if (rel != null) {\r
+                try {\r
+                    PackagePart imgPart = p.getRelatedPart(rel);\r
+                    _data = new XSLFPictureData(imgPart, rel);\r
+                }\r
+                catch (Exception e) {\r
+                    throw new POIXMLException(e);\r
                 }\r
             }\r
         }\r
@@ -120,31 +120,31 @@ public class XSLFPictureShape extends XSLFSimpleShape {
         // shadow\r
         XSLFShadow shadow = getShadow();\r
 \r
-        //fill\r
-        Color fillColor = getFillColor();\r
-        if (fillColor != null) {\r
-            if(shadow != null) shadow.draw(graphics);\r
+        Paint fill = getFill(graphics);\r
+        Paint line = getLinePaint(graphics);\r
+        if(shadow != null) {\r
+               shadow.draw(graphics);\r
+        }\r
 \r
-               graphics.setColor(fillColor);\r
-            applyFill(graphics);\r
+        if(fill != null) {\r
+            graphics.setPaint(fill);\r
             graphics.fill(outline);\r
         }\r
-         \r
+\r
+\r
         XSLFPictureData data = getPictureData();\r
        if(data == null) return;\r
        \r
         XSLFImageRendener renderer = (XSLFImageRendener)graphics.getRenderingHint(XSLFRenderingHint.IMAGE_RENDERER);\r
         if(renderer == null) renderer = new XSLFImageRendener();\r
\r
+\r
         renderer.drawImage(graphics, data, getAnchor());\r
 \r
-        //border overlays the image\r
-        Color lineColor = getLineColor();\r
-        if (lineColor != null){\r
-            graphics.setColor(lineColor);\r
+        if (line != null){\r
+            graphics.setPaint(line);\r
             applyStroke(graphics);\r
             graphics.draw(outline);\r
         }\r
     }\r
 \r
-}
\ No newline at end of file
+}\r
index 837529a90b74ab5bfa759cb2d4df82d032a95d66..8838fa3e413b5c227034a2f7b6c504817c0f8a11 100644 (file)
 \r
 package org.apache.poi.xslf.usermodel;\r
 \r
-import org.apache.poi.openxml4j.opc.PackagePart;\r
-import org.apache.poi.openxml4j.opc.PackageRelationship;\r
 import org.apache.poi.util.Units;\r
-import org.openxmlformats.schemas.presentationml.x2006.main.CTBackground;\r
-import org.openxmlformats.schemas.presentationml.x2006.main.CTBackgroundProperties;\r
 import org.openxmlformats.schemas.drawingml.x2006.main.CTOuterShadowEffect;\r
-import org.openxmlformats.schemas.drawingml.x2006.main.CTPresetColor;\r
 \r
-import javax.imageio.ImageIO;\r
 import java.awt.*;\r
 import java.awt.geom.Rectangle2D;\r
-import java.awt.geom.AffineTransform;\r
-import java.awt.image.BufferedImage;\r
 \r
 /**\r
  * Represents a shadow of a shape. For now supports only outer shadows.\r
@@ -49,8 +41,8 @@ public class XSLFShadow extends XSLFSimpleShape {
     public void draw(Graphics2D graphics) {\r
         Shape outline = _parent.getOutline();\r
 \r
-        Color parentFillColor = _parent.getFillColor();\r
-        Color parentLineColor = _parent.getLineColor();\r
+        Paint parentFillColor = _parent.getFill(graphics);\r
+        Paint parentLineColor = _parent.getLinePaint(graphics);\r
 \r
         double angle = getAngle();\r
         double dist = getDistance();\r
@@ -120,16 +112,6 @@ public class XSLFShadow extends XSLFSimpleShape {
     public Color getFillColor() {\r
         XSLFTheme theme = getSheet().getTheme();\r
         CTOuterShadowEffect ct = (CTOuterShadowEffect)getXmlObject();\r
-        if(ct.isSetSchemeClr()) {\r
-            return theme.getSchemeColor(ct.getSchemeClr());\r
-        }\r
-        else if (ct.isSetPrstClr()) {\r
-            return theme.getPresetColor(ct.getPrstClr());\r
-        }\r
-        else if (ct.isSetSrgbClr()) {\r
-            return theme.getSrgbColor(ct.getSrgbClr());\r
-        }\r
-\r
-        return null;\r
+        return ct == null ? null : new XSLFColor(ct, theme).getColor();\r
     }\r
 }
\ No newline at end of file
index 2c676caf4087726bcfe38185d79ac13cc73c21d1..992973c518383bd995817ecf5c5af5687c44e972 100644 (file)
@@ -21,9 +21,8 @@ package org.apache.poi.xslf.usermodel;
 \r
 import org.apache.poi.util.Beta;\r
 import org.apache.xmlbeans.XmlObject;\r
-import org.openxmlformats.schemas.drawingml.x2006.main.CTTransform2D;\r
 \r
-import java.awt.Graphics2D;\r
+import java.awt.*;\r
 import java.awt.geom.Rectangle2D;\r
 \r
 /**\r
index f4a46fc9015556bb2c1253acc55e4d5db2ee2b59..87da995d494856d4453e2d9228f9a7a9457292b8 100644 (file)
@@ -21,22 +21,20 @@ import org.apache.poi.openxml4j.opc.PackagePart;
 import org.apache.poi.openxml4j.opc.PackageRelationship;
 import org.apache.poi.openxml4j.opc.TargetMode;
 import org.apache.poi.util.Beta;
-import org.apache.poi.util.Internal;
 import org.apache.xmlbeans.XmlObject;
 import org.apache.xmlbeans.XmlOptions;
+import org.openxmlformats.schemas.drawingml.x2006.main.CTTextListStyle;
 import org.openxmlformats.schemas.officeDocument.x2006.relationships.STRelationshipId;
 import org.openxmlformats.schemas.presentationml.x2006.main.CTCommonSlideData;
 import org.openxmlformats.schemas.presentationml.x2006.main.CTConnector;
 import org.openxmlformats.schemas.presentationml.x2006.main.CTGraphicalObjectFrame;
 import org.openxmlformats.schemas.presentationml.x2006.main.CTGroupShape;
 import org.openxmlformats.schemas.presentationml.x2006.main.CTPicture;
-import org.openxmlformats.schemas.presentationml.x2006.main.CTShape;
 import org.openxmlformats.schemas.presentationml.x2006.main.CTPlaceholder;
-import org.openxmlformats.schemas.drawingml.x2006.main.CTTransform2D;
-import org.openxmlformats.schemas.drawingml.x2006.main.CTTextListStyle;
+import org.openxmlformats.schemas.presentationml.x2006.main.CTShape;
 
 import javax.xml.namespace.QName;
-import java.awt.Graphics2D;
+import java.awt.*;
 import java.awt.geom.AffineTransform;
 import java.io.IOException;
 import java.io.OutputStream;
@@ -64,7 +62,14 @@ public abstract class XSLFSheet extends POIXMLDocumentPart {
     }
 
     public XMLSlideShow getSlideShow() {
-       return (XMLSlideShow)getParent();
+        POIXMLDocumentPart p = getParent();
+        while(p != null) {
+            if(p instanceof XMLSlideShow){
+                return (XMLSlideShow)p;
+            }
+            p = p.getParent();
+        }
+        return null;
     }
 
     protected List<XSLFShape> buildShapes(CTGroupShape spTree){
index 049a2d321e99d257cf6fabdfa88f5cb963615f04..10bad70d031448d69715a21c5400cd3a73cdacfe 100644 (file)
 \r
 package org.apache.poi.xslf.usermodel;\r
 \r
-import org.apache.poi.xslf.model.geom.*;\r
-import org.apache.poi.xslf.usermodel.LineCap;\r
-import org.apache.poi.xslf.usermodel.LineDash;\r
-import org.apache.poi.xslf.model.PropertyFetcher;\r
+import org.apache.poi.openxml4j.opc.PackagePart;\r
+import org.apache.poi.openxml4j.opc.PackageRelationship;\r
 import org.apache.poi.util.Beta;\r
 import org.apache.poi.util.Units;\r
+import org.apache.poi.xslf.model.PropertyFetcher;\r
+import org.apache.poi.xslf.model.geom.Context;\r
+import org.apache.poi.xslf.model.geom.CustomGeometry;\r
+import org.apache.poi.xslf.model.geom.Guide;\r
+import org.apache.poi.xslf.model.geom.IAdjustableShape;\r
+import org.apache.poi.xslf.model.geom.Path;\r
+import org.apache.poi.xslf.model.geom.PresetGeometries;\r
 import org.apache.xmlbeans.XmlObject;\r
 import org.openxmlformats.schemas.drawingml.x2006.main.*;\r
 import org.openxmlformats.schemas.presentationml.x2006.main.CTPlaceholder;\r
 import org.openxmlformats.schemas.presentationml.x2006.main.STPlaceholderType;\r
 \r
-import java.awt.*;\r
 import java.awt.geom.AffineTransform;\r
 import java.awt.geom.GeneralPath;\r
+import java.awt.geom.Point2D;\r
 import java.awt.geom.Rectangle2D;\r
-import java.util.ArrayList;\r
+import java.awt.image.BufferedImage;\r
+import java.awt.Paint;\r
+import java.awt.Graphics2D;\r
+import java.awt.Color;\r
+import java.awt.TexturePaint;\r
+import java.awt.AlphaComposite;\r
+import java.awt.GradientPaint;\r
+import java.awt.BasicStroke;\r
+import java.awt.Stroke;\r
+import java.util.Arrays;\r
+import java.util.Comparator;\r
+import java.lang.reflect.InvocationTargetException;\r
+import java.lang.reflect.Constructor;\r
 \r
 /**\r
  * @author Yegor Kozlov\r
@@ -265,40 +282,45 @@ public abstract class XSLFSimpleShape extends XSLFShape {
     }\r
 \r
     public Color getLineColor() {\r
+        Paint paint = getLinePaint(null);\r
+        if(paint instanceof Color){\r
+            return (Color)paint;\r
+        }\r
+        return null;\r
+    }\r
+\r
+    public Paint getLinePaint(final Graphics2D graphics) {\r
         final XSLFTheme theme = _sheet.getTheme();\r
-        final Color noline = new Color(0,0,0,0);\r
-        PropertyFetcher<Color> fetcher = new PropertyFetcher<Color>(){\r
+        final Color nofill = new Color(0,0,0,0);\r
+        PropertyFetcher<Paint> fetcher = new PropertyFetcher<Paint>(){\r
             public boolean fetch(XSLFSimpleShape shape){\r
-                CTShapeProperties spPr = shape.getSpPr();\r
-                CTLineProperties ln = spPr.getLn();\r
-                if (ln != null) {\r
-                    if (ln.isSetNoFill()) {\r
-                        setValue(noline);\r
+                CTLineProperties spPr = shape.getSpPr().getLn();\r
+                if (spPr != null) {\r
+                    if (spPr.isSetNoFill()) {\r
+                        setValue(nofill); // use it as 'nofill' value\r
                         return true;\r
                     }\r
-                    CTSolidColorFillProperties solidLine = ln.getSolidFill();\r
-                    if (solidLine != null) {\r
-                        setValue( theme.getSolidFillColor(ln.getSolidFill()) );\r
+                    Paint paint = getPaint(graphics, spPr);\r
+                    if (paint != null) {\r
+                        setValue( paint );\r
                         return true;\r
                     }\r
                 }\r
                 return false;\r
+\r
             }\r
         };\r
         fetchShapeProperty(fetcher);\r
 \r
-        Color color = fetcher.getValue();\r
+        Paint color = fetcher.getValue();\r
         if(color == null){\r
             // line color was not found, check if it is defined in the theme\r
             CTShapeStyle style = getSpStyle();\r
             if (style != null) {\r
-                CTSchemeColor schemeColor = style.getLnRef().getSchemeClr();\r
-                if (schemeColor != null) {\r
-                    color = theme.getSchemeColor(schemeColor);\r
-                }\r
+                color = new XSLFColor(style.getLnRef(), theme).getColor();\r
             }\r
         }\r
-        return color == noline ? null : color;\r
+        return color == nofill ? null : color;\r
     }\r
 \r
     public void setLineWidth(double width) {\r
@@ -466,17 +488,31 @@ public abstract class XSLFSimpleShape extends XSLFShape {
      * @return solid fill color of null if not set\r
      */\r
     public Color getFillColor() {\r
+        Paint paint = getFill(null);\r
+        if(paint instanceof Color){\r
+            return (Color)paint;\r
+        }\r
+        return null;\r
+    }\r
+\r
+    /**\r
+     * fetch shape fill as a java.awt.Paint\r
+     *\r
+     * @return either Color or GradientPaint or TexturePaint or null\r
+     */\r
+    Paint getFill(final Graphics2D graphics) {\r
         final XSLFTheme theme = _sheet.getTheme();\r
-        final Color nofill = new Color(0,0,0,0);\r
-        PropertyFetcher<Color> fetcher = new PropertyFetcher<Color>(){\r
+        final Color nofill = new Color(0xFF,0xFF,0xFF, 0);\r
+        PropertyFetcher<Paint> fetcher = new PropertyFetcher<Paint>(){\r
             public boolean fetch(XSLFSimpleShape shape){\r
                 CTShapeProperties spPr = shape.getSpPr();\r
                 if (spPr.isSetNoFill()) {\r
                     setValue(nofill); // use it as 'nofill' value\r
                     return true;\r
                 }\r
-                if (spPr.isSetSolidFill()) {\r
-                    setValue( theme.getSolidFillColor(spPr.getSolidFill()) );\r
+                Paint paint = getPaint(graphics, spPr);\r
+                if (paint != null) {\r
+                    setValue( paint );\r
                     return true;\r
                 }\r
                 return false;\r
@@ -484,18 +520,15 @@ public abstract class XSLFSimpleShape extends XSLFShape {
         };\r
         fetchShapeProperty(fetcher);\r
 \r
-        Color color = fetcher.getValue();\r
-        if(color == null){\r
+        Paint paint = fetcher.getValue();\r
+        if(paint == null){\r
             // fill color was not found, check if it is defined in the theme\r
             CTShapeStyle style = getSpStyle();\r
             if (style != null) {\r
-                CTSchemeColor schemeColor = style.getFillRef().getSchemeClr();\r
-                if (schemeColor != null) {\r
-                    color = theme.getSchemeColor(schemeColor);\r
-                }\r
+                paint = new XSLFColor(style.getFillRef(), theme).getColor();\r
             }\r
         }\r
-        return color == nofill ? null : color;\r
+        return paint == nofill ? null : paint;\r
     }\r
 \r
     public XSLFShadow getShadow(){\r
@@ -532,8 +565,130 @@ public abstract class XSLFSimpleShape extends XSLFShape {
 \r
     }\r
 \r
-    protected void applyFill(Graphics2D graphics) {\r
+    @SuppressWarnings("deprecation") //  getXYZArray() array accessors are deprecated\r
+    protected Paint getPaint(Graphics2D graphics, XmlObject spPr) {\r
+        XSLFTheme theme = getSheet().getTheme();\r
+        Rectangle2D anchor = getAnchor();\r
 \r
+        Paint paint = null;\r
+        for(XmlObject obj : spPr.selectPath("*")){\r
+            if(obj instanceof CTNoFillProperties){\r
+                paint = null;\r
+                break;\r
+            }\r
+            if(obj instanceof CTSolidColorFillProperties){\r
+                CTSolidColorFillProperties solidFill = (CTSolidColorFillProperties)obj;\r
+                XSLFColor c = new XSLFColor(solidFill, theme);\r
+                paint = c.getColor();\r
+            }\r
+            if(obj instanceof CTBlipFillProperties){\r
+                CTBlipFillProperties blipFill = (CTBlipFillProperties)obj;\r
+                CTBlip blip = blipFill.getBlip();\r
+                String blipId = blip.getEmbed();\r
+                PackagePart p = getSheet().getPackagePart();\r
+                PackageRelationship rel = p.getRelationship(blipId);\r
+                if (rel != null) {\r
+                    XSLFImageRendener renderer = null;\r
+                    if(graphics != null) renderer = (XSLFImageRendener)graphics.getRenderingHint(XSLFRenderingHint.IMAGE_RENDERER);\r
+                    if(renderer == null) renderer = new XSLFImageRendener();\r
+\r
+                    try {\r
+                        BufferedImage img = renderer.readImage(p.getRelatedPart(rel).getInputStream());\r
+                        if(blip.sizeOfAlphaModFixArray() > 0){\r
+                            float alpha = blip.getAlphaModFixArray(0).getAmt()/100000.f;\r
+                            AlphaComposite ac = AlphaComposite.getInstance(\r
+                                                   AlphaComposite.SRC_OVER, alpha);\r
+                            if(graphics != null) graphics.setComposite(ac);\r
+                        }\r
+\r
+                        paint = new TexturePaint(\r
+                                img, new Rectangle2D.Double(0, 0, img.getWidth(), img.getHeight()));\r
+                    }\r
+                    catch (Exception e) {\r
+                        return null;\r
+                    }\r
+                }\r
+            }\r
+            if(obj instanceof CTGradientFillProperties){\r
+                CTGradientFillProperties gradFill = (CTGradientFillProperties)obj;\r
+                double angle;\r
+                if(gradFill.isSetLin()) {\r
+                    angle = gradFill.getLin().getAng() / 60000;\r
+                } else {\r
+                    // XSLF only supports linear gradient fills. Other types are filled as liner with angle=90 degrees\r
+                    angle = 90;\r
+                }\r
+                CTGradientStop[] gs =  gradFill.getGsLst().getGsArray();\r
+\r
+                Arrays.sort(gs, new Comparator<CTGradientStop>(){\r
+                    public int compare(CTGradientStop o1, CTGradientStop o2){\r
+                        Integer pos1 = o1.getPos();\r
+                        Integer pos2 = o2.getPos();\r
+                        return pos1.compareTo(pos2);\r
+                    }\r
+                });\r
+\r
+                Color[] colors = new Color[gs.length];\r
+                float[] fractions = new float[gs.length];\r
+\r
+                AffineTransform at = AffineTransform.getRotateInstance(\r
+                        Math.toRadians(angle),\r
+                        anchor.getX() + anchor.getWidth()/2,\r
+                        anchor.getY() + anchor.getHeight()/2);\r
+\r
+                double diagonal = Math.sqrt(anchor.getHeight()*anchor.getHeight() + anchor.getWidth()*anchor.getWidth());\r
+                Point2D p1 = new Point2D.Double(anchor.getX() + anchor.getWidth()/2 - diagonal/2,\r
+                        anchor.getY() + anchor.getHeight()/2);\r
+                p1 = at.transform(p1, null);\r
+\r
+                Point2D p2 = new Point2D.Double(anchor.getX() + anchor.getWidth(), anchor.getY() + anchor.getHeight()/2);\r
+                p2 = at.transform(p2, null);\r
+\r
+                norm(p1, anchor);\r
+                norm(p2, anchor);\r
+\r
+                for(int i = 0; i < gs.length; i++){\r
+                    CTGradientStop stop = gs[i];\r
+                    colors[i] = new XSLFColor(stop, theme).getColor();\r
+                    fractions[i] = stop.getPos() / 100000.f;\r
+                }\r
+\r
+                paint = createGradientPaint(p1, p2, fractions, colors);\r
+            }\r
+        }\r
+        return paint;\r
+    }\r
+\r
+    /**\r
+     * Trick to return GradientPaint on JDK 1.5 and LinearGradientPaint on JDK 1.6+\r
+     */\r
+    private Paint createGradientPaint(Point2D p1, Point2D p2, float[] fractions, Color[] colors){\r
+        Paint paint;\r
+        try {\r
+            Class clz = Class.forName("java.awt.LinearGradientPaint");\r
+            Constructor c =\r
+                    clz.getConstructor(Point2D.class, Point2D.class, float[].class, Color[].class);\r
+            paint = (Paint)c.newInstance(p1, p2, fractions, colors);\r
+        } catch (ClassNotFoundException e){\r
+            paint = new GradientPaint(p1, colors[0], p2, colors[colors.length - 1]);\r
+        } catch (Exception e){\r
+            throw new RuntimeException(e);\r
+        }\r
+        return paint;\r
+    }\r
+\r
+    void norm(Point2D p, Rectangle2D anchor){\r
+        if(p.getX() < anchor.getX()){\r
+            p.setLocation(anchor.getX(), p.getY());\r
+        } else if(p.getX() > (anchor.getX() + anchor.getWidth())){\r
+            p.setLocation(anchor.getX() + anchor.getWidth(), p.getY());\r
+        }\r
+\r
+        if(p.getY() < anchor.getY()){\r
+            p.setLocation(p.getX(), anchor.getY());\r
+        } else if (p.getY() > (anchor.getY() + anchor.getHeight())){\r
+            p.setLocation(p.getX(), anchor.getY() + anchor.getHeight());\r
+        }\r
     }\r
 \r
     protected float[] getDashPattern(LineDash lineDash, float lineWidth) {\r
@@ -665,7 +820,13 @@ public abstract class XSLFSimpleShape extends XSLFShape {
     @Override\r
     protected java.awt.Shape getOutline(){\r
         PresetGeometries dict = PresetGeometries.getInstance();\r
-        String name = getSpPr().getPrstGeom().getPrst().toString();\r
+        CTShapeProperties spPr = getSpPr();\r
+        String name;\r
+        if(spPr.isSetPrstGeom()) {\r
+            name = spPr.getPrstGeom().getPrst().toString();\r
+        } else {\r
+            name = "rect";\r
+        }\r
         CustomGeometry geom = dict.get(name);\r
         Rectangle2D anchor = getAnchor();\r
         if(geom != null) {\r
index d9f7c88e6d25fcaebccb6a583fe9eeedae3f2236..f6f92d4f5975524ac2e7538d81485f243f4e006a 100644 (file)
 ==================================================================== */
 package org.apache.poi.xslf.usermodel;
 
-import java.awt.*;
-import java.io.IOException;
-
 import org.apache.poi.POIXMLDocumentPart;
 import org.apache.poi.openxml4j.opc.PackagePart;
 import org.apache.poi.openxml4j.opc.PackageRelationship;
 import org.apache.poi.util.Beta;
 import org.apache.xmlbeans.XmlException;
-import org.apache.xmlbeans.XmlObject;
 import org.openxmlformats.schemas.drawingml.x2006.main.CTGroupShapeProperties;
 import org.openxmlformats.schemas.drawingml.x2006.main.CTGroupTransform2D;
 import org.openxmlformats.schemas.drawingml.x2006.main.CTNonVisualDrawingProps;
 import org.openxmlformats.schemas.drawingml.x2006.main.CTPoint2D;
 import org.openxmlformats.schemas.drawingml.x2006.main.CTPositiveSize2D;
-import org.openxmlformats.schemas.drawingml.x2006.main.CTTransform2D;
-import org.openxmlformats.schemas.drawingml.x2006.main.CTTextListStyle;
 import org.openxmlformats.schemas.presentationml.x2006.main.CTCommonSlideData;
 import org.openxmlformats.schemas.presentationml.x2006.main.CTGroupShape;
 import org.openxmlformats.schemas.presentationml.x2006.main.CTGroupShapeNonVisual;
 import org.openxmlformats.schemas.presentationml.x2006.main.CTSlide;
 import org.openxmlformats.schemas.presentationml.x2006.main.SldDocument;
-import org.openxmlformats.schemas.presentationml.x2006.main.CTPlaceholder;
+
+import java.awt.*;
+import java.io.IOException;
 
 @Beta
 public final class XSLFSlide extends XSLFSheet {
index ab6661125e19b729ff6ce09355ddd8851bb82a77..699d153345798a66b3f99acad4726ab90d68a956 100644 (file)
@@ -22,18 +22,12 @@ import org.apache.poi.openxml4j.opc.PackageRelationship;
 import org.apache.poi.util.Beta;
 import org.apache.poi.util.Internal;
 import org.apache.xmlbeans.XmlException;
-import org.apache.xmlbeans.XmlObject;
+import org.openxmlformats.schemas.drawingml.x2006.main.CTTextListStyle;
+import org.openxmlformats.schemas.presentationml.x2006.main.CTPlaceholder;
 import org.openxmlformats.schemas.presentationml.x2006.main.CTSlideLayout;
 import org.openxmlformats.schemas.presentationml.x2006.main.SldLayoutDocument;
-import org.openxmlformats.schemas.presentationml.x2006.main.CTPlaceholder;
-import org.openxmlformats.schemas.drawingml.x2006.main.CTTransform2D;
-import org.openxmlformats.schemas.drawingml.x2006.main.CTTextListStyle;
 
 import java.io.IOException;
-import java.util.Map;
-import java.util.HashMap;
-import java.awt.*;
-import java.awt.geom.AffineTransform;
 
 @Beta
 public class XSLFSlideLayout extends XSLFSheet {
@@ -106,9 +100,6 @@ public class XSLFSlideLayout extends XSLFSheet {
         return _master;
     }
 
-    public XMLSlideShow getSlideShow() {
-        return (XMLSlideShow)getParent().getParent();
-    }
     
     public XSLFTheme getTheme(){
        return getSlideMaster().getTheme();
@@ -143,6 +134,6 @@ public class XSLFSlideLayout extends XSLFSheet {
         if(_layout.getCSld().isSetBg()) {
             return new XSLFBackground(_layout.getCSld().getBg(), this);
         }
-        return null;
+        return getSlideMaster().getBackground();
     }
 }
\ No newline at end of file
index 269b76cd1f4ce16b38fe822afd4704cbe3ab22a7..2ec83609a8e349cd843ab546cb45428cd955c5e3 100644 (file)
@@ -19,13 +19,12 @@ package org.apache.poi.xslf.usermodel;
 import org.apache.poi.POIXMLDocumentPart;
 import org.apache.poi.openxml4j.opc.PackagePart;
 import org.apache.poi.openxml4j.opc.PackageRelationship;
-import org.apache.poi.sl.usermodel.MasterSheet;
 import org.apache.poi.util.Beta;
 import org.apache.xmlbeans.XmlException;
+import org.openxmlformats.schemas.drawingml.x2006.main.CTTextListStyle;
 import org.openxmlformats.schemas.presentationml.x2006.main.CTSlideMaster;
-import org.openxmlformats.schemas.presentationml.x2006.main.SldMasterDocument;
 import org.openxmlformats.schemas.presentationml.x2006.main.CTSlideMasterTextStyles;
-import org.openxmlformats.schemas.drawingml.x2006.main.CTTextListStyle;
+import org.openxmlformats.schemas.presentationml.x2006.main.SldMasterDocument;
 
 import java.io.IOException;
 import java.util.HashMap;
@@ -123,4 +122,11 @@ import java.util.Map;
         return props;
     }
 
+    @Override
+    public XSLFBackground getBackground(){
+        if(_slide.getCSld().isSetBg()) {
+            return new XSLFBackground(_slide.getCSld().getBg(), this);
+        }
+        return null;
+    }
 }
\ No newline at end of file
index 173d6c856727a0dc3e010a9eba41b546649e5705..833e6deb93ffa146067f73a59d9913472f89e46d 100644 (file)
@@ -27,10 +27,6 @@ import org.openxmlformats.schemas.drawingml.x2006.main.CTGraphicalObjectData;
 import org.openxmlformats.schemas.drawingml.x2006.main.CTNonVisualDrawingProps;\r
 import org.openxmlformats.schemas.drawingml.x2006.main.CTTable;\r
 import org.openxmlformats.schemas.drawingml.x2006.main.CTTableRow;\r
-import org.openxmlformats.schemas.drawingml.x2006.main.CTGroupTransform2D;\r
-import org.openxmlformats.schemas.drawingml.x2006.main.CTPoint2D;\r
-import org.openxmlformats.schemas.drawingml.x2006.main.CTPositiveSize2D;\r
-import org.openxmlformats.schemas.drawingml.x2006.main.CTTransform2D;\r
 import org.openxmlformats.schemas.presentationml.x2006.main.CTGraphicalObjectFrame;\r
 import org.openxmlformats.schemas.presentationml.x2006.main.CTGraphicalObjectFrameNonVisual;\r
 \r
@@ -39,7 +35,6 @@ import java.util.ArrayList;
 import java.util.Collections;\r
 import java.util.Iterator;\r
 import java.util.List;\r
-import java.awt.geom.Rectangle2D;\r
 \r
 /**\r
  * Represents a table in a .pptx presentation\r
index cc04a10ae4568f5cf03b8f1d2f7e9cc79d1680dc..335e77d593585c4e95ea0f2c9a34b137991b6880 100644 (file)
 \r
 package org.apache.poi.xslf.usermodel;\r
 \r
-import org.openxmlformats.schemas.drawingml.x2006.main.CTTableCell;\r
-import org.openxmlformats.schemas.drawingml.x2006.main.CTTextBody;\r
-import org.openxmlformats.schemas.drawingml.x2006.main.CTTextBodyProperties;\r
-import org.openxmlformats.schemas.drawingml.x2006.main.CTTableCellProperties;\r
+import org.apache.poi.util.Units;\r
+import org.openxmlformats.schemas.drawingml.x2006.main.CTLineEndProperties;\r
 import org.openxmlformats.schemas.drawingml.x2006.main.CTLineProperties;\r
 import org.openxmlformats.schemas.drawingml.x2006.main.CTSRgbColor;\r
-import org.openxmlformats.schemas.drawingml.x2006.main.CTShapeProperties;\r
 import org.openxmlformats.schemas.drawingml.x2006.main.CTSolidColorFillProperties;\r
-import org.openxmlformats.schemas.drawingml.x2006.main.STPenAlignment;\r
+import org.openxmlformats.schemas.drawingml.x2006.main.CTTableCell;\r
+import org.openxmlformats.schemas.drawingml.x2006.main.CTTableCellProperties;\r
+import org.openxmlformats.schemas.drawingml.x2006.main.CTTextBody;\r
 import org.openxmlformats.schemas.drawingml.x2006.main.STCompoundLine;\r
 import org.openxmlformats.schemas.drawingml.x2006.main.STLineCap;\r
-import org.openxmlformats.schemas.drawingml.x2006.main.STPresetLineDashVal;\r
-import org.openxmlformats.schemas.drawingml.x2006.main.CTLineEndProperties;\r
 import org.openxmlformats.schemas.drawingml.x2006.main.STLineEndLength;\r
 import org.openxmlformats.schemas.drawingml.x2006.main.STLineEndType;\r
 import org.openxmlformats.schemas.drawingml.x2006.main.STLineEndWidth;\r
-import org.apache.poi.util.Internal;\r
-import org.apache.poi.util.Units;\r
+import org.openxmlformats.schemas.drawingml.x2006.main.STPenAlignment;\r
+import org.openxmlformats.schemas.drawingml.x2006.main.STPresetLineDashVal;\r
 \r
 import java.awt.*;\r
 \r
index 328c76ae762bcb53790e085f212d3af1aad653ee..c0067e9c75f39dbe4b0f38056ec6491820f4bd7a 100644 (file)
 package org.apache.poi.xslf.usermodel;\r
 \r
 import org.apache.poi.util.Units;\r
-import org.apache.xmlbeans.XmlObject;\r
-import org.openxmlformats.schemas.drawingml.x2006.main.CTTable;\r
 import org.openxmlformats.schemas.drawingml.x2006.main.CTTableCell;\r
 import org.openxmlformats.schemas.drawingml.x2006.main.CTTableRow;\r
-import org.openxmlformats.schemas.presentationml.x2006.main.CTGraphicalObjectFrame;\r
 \r
 import java.util.ArrayList;\r
 import java.util.Collections;\r
-import java.util.List;\r
 import java.util.Iterator;\r
+import java.util.List;\r
 \r
 /**\r
  * Represents a table in a .pptx presentation\r
index 154f25e06a8cc8f8727eaebc1a3961ef72fca400..4ab67e2de5ee8e0d6056d56fdb390c68cdbc3095 100644 (file)
@@ -26,9 +26,9 @@ import org.openxmlformats.schemas.drawingml.x2006.main.CTTableStyleList;
 
 import java.io.IOException;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.Iterator;
 import java.util.List;
-import java.util.Collections;
 
 @Beta
 public class XSLFTableStyles extends POIXMLDocumentPart implements Iterable<XSLFTableStyle>{
index 59428ef4a229b8c88c10101b62021dc8a34e32f4..177e8099eb82ac67aea028f5cb19d263d36262ba 100644 (file)
 \r
 package org.apache.poi.xslf.usermodel;\r
 \r
-import org.apache.poi.sl.usermodel.ShapeContainer;\r
 import org.apache.poi.util.Beta;\r
-import org.apache.poi.util.Units;\r
 import org.openxmlformats.schemas.drawingml.x2006.main.CTNonVisualDrawingProps;\r
 import org.openxmlformats.schemas.drawingml.x2006.main.CTPresetGeometry2D;\r
 import org.openxmlformats.schemas.drawingml.x2006.main.CTShapeProperties;\r
 import org.openxmlformats.schemas.drawingml.x2006.main.CTTextBody;\r
 import org.openxmlformats.schemas.drawingml.x2006.main.STShapeType;\r
-import org.openxmlformats.schemas.drawingml.x2006.main.CTTransform2D;\r
-import org.openxmlformats.schemas.drawingml.x2006.main.CTPoint2D;\r
-import org.openxmlformats.schemas.drawingml.x2006.main.CTPositiveSize2D;\r
 import org.openxmlformats.schemas.presentationml.x2006.main.CTApplicationNonVisualDrawingProps;\r
-import org.openxmlformats.schemas.presentationml.x2006.main.CTPlaceholder;\r
 import org.openxmlformats.schemas.presentationml.x2006.main.CTShape;\r
 import org.openxmlformats.schemas.presentationml.x2006.main.CTShapeNonVisual;\r
 import org.openxmlformats.schemas.presentationml.x2006.main.STPlaceholderType;\r
 \r
-import java.awt.geom.Rectangle2D;\r
-\r
 \r
 /**\r
  * @author Yegor Kozlov\r
index c4ac046070cfc515945e4bc57259d617c110b135..a67dc0d34aaee7f0de07575fbabc7ea94c3c7bbc 100644 (file)
@@ -19,28 +19,27 @@ package org.apache.poi.xslf.usermodel;
 import org.apache.poi.util.Beta;\r
 import org.apache.poi.util.Internal;\r
 import org.apache.poi.util.Units;\r
-import org.apache.poi.xslf.model.PropertyFetcher;\r
 import org.apache.poi.xslf.model.ParagraphPropertyFetcher;\r
 import org.apache.xmlbeans.XmlObject;\r
 import org.openxmlformats.schemas.drawingml.x2006.main.CTRegularTextRun;\r
+import org.openxmlformats.schemas.drawingml.x2006.main.CTTextField;\r
 import org.openxmlformats.schemas.drawingml.x2006.main.CTTextParagraph;\r
 import org.openxmlformats.schemas.drawingml.x2006.main.CTTextParagraphProperties;\r
 import org.openxmlformats.schemas.drawingml.x2006.main.CTTextSpacing;\r
 import org.openxmlformats.schemas.drawingml.x2006.main.STTextAlignType;\r
-import org.openxmlformats.schemas.drawingml.x2006.main.CTTextField;\r
 import org.openxmlformats.schemas.presentationml.x2006.main.CTPlaceholder;\r
 import org.openxmlformats.schemas.presentationml.x2006.main.STPlaceholderType;\r
 \r
-import java.util.ArrayList;\r
-import java.util.Iterator;\r
-import java.util.List;\r
 import java.awt.*;\r
-import java.awt.geom.Rectangle2D;\r
-import java.awt.font.TextLayout;\r
-import java.awt.font.TextAttribute;\r
 import java.awt.font.LineBreakMeasurer;\r
-import java.text.AttributedString;\r
+import java.awt.font.TextAttribute;\r
+import java.awt.font.TextLayout;\r
+import java.awt.geom.Rectangle2D;\r
 import java.text.AttributedCharacterIterator;\r
+import java.text.AttributedString;\r
+import java.util.ArrayList;\r
+import java.util.Iterator;\r
+import java.util.List;\r
 \r
 /**\r
  * Represents a paragraph of text within the containing text body.\r
@@ -187,7 +186,8 @@ public class XSLFTextParagraph implements Iterable<XSLFTextRun>{
         ParagraphPropertyFetcher<Color> fetcher = new ParagraphPropertyFetcher<Color>(getLevel()){\r
             public boolean fetch(CTTextParagraphProperties props){\r
                 if(props.isSetBuClr()){\r
-                    setValue(theme.getColor(props.getBuClr()));\r
+                    XSLFColor c = new XSLFColor(props.getBuClr(), theme);\r
+                    setValue(c.getColor());\r
                     return true;\r
                 }\r
                 return false;\r
@@ -580,7 +580,7 @@ public class XSLFTextParagraph implements Iterable<XSLFTextRun>{
 \r
             string.addAttribute(TextAttribute.FOREGROUND, run.getFontColor(), startIndex, endIndex);\r
             string.addAttribute(TextAttribute.FAMILY, run.getFontFamily(), startIndex, endIndex);\r
-            string.addAttribute(TextAttribute.SIZE, run.getFontSize(), startIndex, endIndex);\r
+            string.addAttribute(TextAttribute.SIZE, (float)run.getFontSize(), startIndex, endIndex);\r
             if(run.isBold()) {\r
                 string.addAttribute(TextAttribute.WEIGHT, TextAttribute.WEIGHT_BOLD, startIndex, endIndex);\r
             }\r
@@ -589,10 +589,17 @@ public class XSLFTextParagraph implements Iterable<XSLFTextRun>{
             }\r
             if(run.isUnderline()) {\r
                 string.addAttribute(TextAttribute.UNDERLINE, TextAttribute.UNDERLINE_ON, startIndex, endIndex);\r
+                string.addAttribute(TextAttribute.INPUT_METHOD_UNDERLINE, TextAttribute.UNDERLINE_LOW_TWO_PIXEL, startIndex, endIndex);\r
             }\r
             if(run.isStrikethrough()) {\r
                 string.addAttribute(TextAttribute.STRIKETHROUGH, TextAttribute.STRIKETHROUGH_ON, startIndex, endIndex);\r
             }\r
+            if(run.isSubscript()) {\r
+                string.addAttribute(TextAttribute.SUPERSCRIPT, TextAttribute.SUPERSCRIPT_SUB, startIndex, endIndex);\r
+            }\r
+            if(run.isSuperscript()) {\r
+                string.addAttribute(TextAttribute.SUPERSCRIPT, TextAttribute.SUPERSCRIPT_SUPER, startIndex, endIndex);\r
+            }\r
 \r
             startIndex = endIndex;\r
         }\r
@@ -646,8 +653,8 @@ public class XSLFTextParagraph implements Iterable<XSLFTextRun>{
                         bit.getAttribute(TextAttribute.FOREGROUND) : buColor);\r
                 str.addAttribute(TextAttribute.FAMILY, buFont);\r
 \r
-                double fontSize = (Double)bit.getAttribute(TextAttribute.SIZE);\r
-                double buSz = getBulletFontSize();\r
+                float fontSize = (Float)bit.getAttribute(TextAttribute.SIZE);\r
+                float buSz = (float)getBulletFontSize();\r
                 if(buSz > 0) fontSize *= buSz* 0.01;\r
                 else fontSize = -buSz;\r
 \r
index 558dbdd450a2a7adf9bd426eef397bd78e729ef7..e4ebf9db58bc608e826aae439c224021c98ed397 100644 (file)
@@ -18,17 +18,14 @@ package org.apache.poi.xslf.usermodel;
 \r
 import org.apache.poi.util.Beta;\r
 import org.apache.poi.xslf.model.CharacterPropertyFetcher;\r
-import org.apache.xmlbeans.XmlObject;\r
 import org.openxmlformats.schemas.drawingml.x2006.main.CTRegularTextRun;\r
 import org.openxmlformats.schemas.drawingml.x2006.main.CTSRgbColor;\r
 import org.openxmlformats.schemas.drawingml.x2006.main.CTSolidColorFillProperties;\r
 import org.openxmlformats.schemas.drawingml.x2006.main.CTTextCharacterProperties;\r
 import org.openxmlformats.schemas.drawingml.x2006.main.CTTextFont;\r
+import org.openxmlformats.schemas.drawingml.x2006.main.CTTextParagraphProperties;\r
 import org.openxmlformats.schemas.drawingml.x2006.main.STTextStrikeType;\r
 import org.openxmlformats.schemas.drawingml.x2006.main.STTextUnderlineType;\r
-import org.openxmlformats.schemas.drawingml.x2006.main.CTTextParagraphProperties;\r
-import org.openxmlformats.schemas.presentationml.x2006.main.CTPlaceholder;\r
-import org.openxmlformats.schemas.presentationml.x2006.main.STPlaceholderType;\r
 \r
 import java.awt.*;\r
 \r
@@ -78,7 +75,8 @@ public class XSLFTextRun {
             public boolean fetch(CTTextCharacterProperties props){\r
                 CTSolidColorFillProperties solidFill = props.getSolidFill();\r
                 if(solidFill != null){\r
-                    setValue(theme.getSolidFillColor(solidFill));\r
+                    Color c = new XSLFColor(solidFill, theme).getColor();\r
+                    setValue(c);\r
                     return true;\r
                 }\r
                 return false;\r
@@ -202,6 +200,40 @@ public class XSLFTextRun {
         return fetcher.getValue() == null ? false : fetcher.getValue();\r
     }\r
 \r
+    /**\r
+     * @return whether a run of text will be formatted as a superscript text. Default is false.\r
+     */\r
+    public boolean isSuperscript() {\r
+        CharacterPropertyFetcher<Boolean> fetcher = new CharacterPropertyFetcher<Boolean>(_p.getLevel()){\r
+            public boolean fetch(CTTextCharacterProperties props){\r
+                if(props.isSetBaseline()){\r
+                    setValue(props.getBaseline() > 0);\r
+                    return true;\r
+                }\r
+                return false;\r
+            }\r
+        };\r
+        fetchCharacterProperty(fetcher);\r
+        return fetcher.getValue() == null ? false : fetcher.getValue();\r
+    }\r
+\r
+    /**\r
+     * @return whether a run of text will be formatted as a superscript text. Default is false.\r
+     */\r
+    public boolean isSubscript() {\r
+        CharacterPropertyFetcher<Boolean> fetcher = new CharacterPropertyFetcher<Boolean>(_p.getLevel()){\r
+            public boolean fetch(CTTextCharacterProperties props){\r
+                if(props.isSetBaseline()){\r
+                    setValue(props.getBaseline() < 0);\r
+                    return true;\r
+                }\r
+                return false;\r
+            }\r
+        };\r
+        fetchCharacterProperty(fetcher);\r
+        return fetcher.getValue() == null ? false : fetcher.getValue();\r
+    }\r
+\r
     /**\r
      * Specifies whether this run of text will be formatted as bold text\r
      *\r
@@ -314,4 +346,4 @@ public class XSLFTextRun {
         return ok;\r
     }\r
 \r
-}
\ No newline at end of file
+}\r
index c925922d5b96e1fdc5f9ccfde696585800006682..279cac9198ac4f4f0916043a9bbf162ae4a5fbcb 100644 (file)
@@ -23,9 +23,6 @@ import org.apache.poi.util.Beta;
 import org.apache.poi.util.Units;
 import org.apache.poi.xslf.model.PropertyFetcher;
 import org.apache.poi.xslf.model.TextBodyPropertyFetcher;
-import org.apache.poi.xslf.model.geom.Context;
-import org.apache.poi.xslf.model.geom.CustomGeometry;
-import org.apache.poi.xslf.model.geom.Path;
 import org.apache.xmlbeans.XmlObject;
 import org.openxmlformats.schemas.drawingml.x2006.main.CTTextBody;
 import org.openxmlformats.schemas.drawingml.x2006.main.CTTextBodyProperties;
@@ -36,9 +33,8 @@ import org.openxmlformats.schemas.drawingml.x2006.main.STTextWrappingType;
 import org.openxmlformats.schemas.presentationml.x2006.main.CTPlaceholder;
 
 import java.awt.*;
-import java.awt.geom.GeneralPath;
-import java.awt.image.BufferedImage;
 import java.awt.geom.Rectangle2D;
+import java.awt.image.BufferedImage;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -392,19 +388,19 @@ public abstract class XSLFTextShape extends XSLFSimpleShape {
         // shadow
         XSLFShadow shadow = getShadow();
 
-        Color fillColor = getFillColor();
-        Color lineColor = getLineColor();
+        Paint fill = getFill(graphics);
+        Paint line = getLinePaint(graphics);
         if(shadow != null) {
-               //shadow.draw(graphics);
+               shadow.draw(graphics);
         }
-        if (fillColor != null) {
-               graphics.setColor(fillColor);
-            applyFill(graphics);
+
+        if(fill != null) {
+            graphics.setPaint(fill);
             graphics.fill(outline);
         }
 
-        if (lineColor != null){
-            graphics.setColor(lineColor);
+        if (line != null){
+            graphics.setPaint(line);
             applyStroke(graphics);
             graphics.draw(outline);
         }
index a648dbdf7a1b1ea59d35a7ad87533b3b7f8e59c8..77dd0a856417afe7033dc153f7028dd432b23185 100644 (file)
@@ -24,28 +24,22 @@ import org.apache.poi.util.Internal;
 import org.apache.xmlbeans.XmlException;
 import org.apache.xmlbeans.XmlObject;
 import org.apache.xmlbeans.XmlOptions;
-import org.openxmlformats.schemas.drawingml.x2006.main.CTSchemeColor;
 import org.openxmlformats.schemas.drawingml.x2006.main.CTBaseStyles;
 import org.openxmlformats.schemas.drawingml.x2006.main.CTColor;
 import org.openxmlformats.schemas.drawingml.x2006.main.CTColorScheme;
-import org.openxmlformats.schemas.drawingml.x2006.main.ThemeDocument;
 import org.openxmlformats.schemas.drawingml.x2006.main.CTOfficeStyleSheet;
-import org.openxmlformats.schemas.drawingml.x2006.main.CTSRgbColor;
-import org.openxmlformats.schemas.drawingml.x2006.main.CTSolidColorFillProperties;
-import org.openxmlformats.schemas.drawingml.x2006.main.CTPresetColor;
+import org.openxmlformats.schemas.drawingml.x2006.main.ThemeDocument;
 
 import javax.xml.namespace.QName;
-
-import java.awt.Color;
 import java.io.IOException;
 import java.io.OutputStream;
-import java.util.Map;
 import java.util.HashMap;
+import java.util.Map;
 
 @Beta
 public class XSLFTheme extends POIXMLDocumentPart {
     private CTOfficeStyleSheet _theme;
-    private Map<String, XSLFColor> _schemeColors;
+    private Map<String, CTColor> _schemeColors;
     
     XSLFTheme() {
         super();
@@ -64,12 +58,13 @@ public class XSLFTheme extends POIXMLDocumentPart {
        CTBaseStyles elems = _theme.getThemeElements();
        CTColorScheme scheme = elems.getClrScheme();
        // The color scheme is responsible for defining a list of twelve colors. 
-       _schemeColors = new HashMap<String, XSLFColor>(12);
+       _schemeColors = new HashMap<String, CTColor>(12);
        for(XmlObject o : scheme.selectPath("*")){
                CTColor c = (CTColor)o;
                String name = c.getDomNode().getLocalName();
-               _schemeColors.put(name, new XSLFColor(c));
+               _schemeColors.put(name, c);
        }
+
        _schemeColors.put("bg1", _schemeColors.get("lt1"));
        _schemeColors.put("bg2", _schemeColors.get("lt2"));
         _schemeColors.put("tx1", _schemeColors.get("dk1"));
@@ -89,141 +84,10 @@ public class XSLFTheme extends POIXMLDocumentPart {
      * 
      * @return a theme color or <code>null</code> if not found
      */
-    public XSLFColor getColor(String name){
+    CTColor getCTColor(String name){
        return _schemeColors.get(name);
     }
     
-    Color getSchemeColor(CTSchemeColor schemeColor){
-        String colorRef = schemeColor.getVal().toString();
-        int alpha = 0xFF;
-        if(schemeColor.sizeOfAlphaArray() > 0){
-            int aval = schemeColor.getAlphaArray(0).getVal();
-            alpha =  Math.round(255 * aval / 100000f);
-        }
-        Color themeColor = _schemeColors.get(colorRef).getColor(alpha);
-
-        int lumMod = 100, lumOff = 0;
-        if (schemeColor.sizeOfLumModArray() > 0) {
-            lumMod = schemeColor.getLumModArray(0).getVal() / 1000;
-        }
-        if (schemeColor.sizeOfLumOffArray() > 0) {
-            lumOff = schemeColor.getLumOffArray(0).getVal() / 1000;
-        }
-        if(schemeColor.sizeOfShadeArray() > 0) {
-            lumMod = schemeColor.getShadeArray(0).getVal() / 1000;
-        }
-        Color color = modulateLuminanace(themeColor, lumMod, lumOff);
-
-        if(schemeColor.sizeOfTintArray() > 0) {
-            float tint = schemeColor.getTintArray(0).getVal() / 100000f;
-            int red = Math.round(tint * themeColor.getRed() + (1 - tint) * 255);
-            int green = Math.round(tint * themeColor.getGreen() + (1 - tint) * 255);
-            int blue = Math.round(tint * themeColor.getBlue() + (1 - tint) * 255);
-            color = new Color(red, green, blue);
-        }
-
-        return color;
-    }
-
-    /**
-     * TODO get rid of code duplication. Re-write to use xpath instead of beans
-     */
-    Color getPresetColor(CTPresetColor presetColor){
-        String colorName = presetColor.getVal().toString();
-        Color color;
-        try {
-            color = (Color)Color.class.getField(colorName).get(null);
-        } catch (Exception e){
-            color = Color.black;
-        }
-        if(presetColor.sizeOfAlphaArray() > 0){
-            int aval = presetColor.getAlphaArray(0).getVal();
-            int alpha =  Math.round(255 * aval / 100000f);
-            color = new Color(color.getRed(), color.getGreen(), color.getBlue(), alpha); 
-        }
-
-        int lumMod = 100, lumOff = 0;
-        if (presetColor.sizeOfLumModArray() > 0) {
-            lumMod = presetColor.getLumModArray(0).getVal() / 1000;
-        }
-        if (presetColor.sizeOfLumOffArray() > 0) {
-            lumOff = presetColor.getLumOffArray(0).getVal() / 1000;
-        }
-        if(presetColor.sizeOfShadeArray() > 0) {
-            lumMod = presetColor.getShadeArray(0).getVal() / 1000;
-        }
-        color = modulateLuminanace(color, lumMod, lumOff);
-
-        if(presetColor.sizeOfTintArray() > 0) {
-            float tint = presetColor.getTintArray(0).getVal() / 100000f;
-            int red = Math.round(tint * color.getRed() + (1 - tint) * 255);
-            int green = Math.round(tint * color.getGreen() + (1 - tint) * 255);
-            int blue = Math.round(tint * color.getBlue() + (1 - tint) * 255);
-            color = new Color(red, green, blue);
-        }
-
-        return color;
-    }
-
-    public Color brighter(Color color, double tint) {
-        int r = color.getRed();
-        int g = color.getGreen();
-        int b = color.getBlue();
-
-        /* From 2D group:
-         * 1. black.brighter() should return grey
-         * 2. applying brighter to blue will always return blue, brighter
-         * 3. non pure color (non zero rgb) will eventually return white
-         */
-        int i = (int)(1.0/(1.0-tint));
-        if ( r == 0 && g == 0 && b == 0) {
-           return new Color(i, i, i);
-        }
-        if ( r > 0 && r < i ) r = i;
-        if ( g > 0 && g < i ) g = i;
-        if ( b > 0 && b < i ) b = i;
-
-        return new Color(Math.min((int)(r/tint), 255),
-                         Math.min((int)(g/tint), 255),
-                         Math.min((int)(b/tint), 255));
-    }
-
-    Color getSrgbColor(CTSRgbColor srgb){
-        byte[] val = srgb.getVal();
-        int alpha = 0xFF;
-        if(srgb.sizeOfAlphaArray() > 0){
-            int aval = srgb.getAlphaArray(0).getVal();
-            alpha =  Math.round(255 * aval / 100000f);
-        }
-        return new Color(0xFF & val[0], 0xFF & val[1], 0xFF & val[2], alpha);
-    }
-
-    Color getSolidFillColor(CTSolidColorFillProperties solidFill){
-        Color color;
-        if (solidFill.isSetSrgbClr()) {
-            color = getSrgbColor(solidFill.getSrgbClr());
-        } else if (solidFill.isSetSchemeClr()) {
-            color = getSchemeColor(solidFill.getSchemeClr());
-        } else {
-            // TODO support other types
-            color = Color.black;
-        }
-        return color;
-    }
-
-    Color getColor(CTColor solidFill){
-        Color color;
-        if (solidFill.isSetSrgbClr()) {
-            color = getSrgbColor(solidFill.getSrgbClr());
-        } else if (solidFill.isSetSchemeClr()) {
-            color = getSchemeColor(solidFill.getSchemeClr());
-        } else {
-            // TODO support other types
-            color = Color.black;
-        }
-        return color;
-    }
-
      /**
      * While developing only!
      */
@@ -247,26 +111,6 @@ public class XSLFTheme extends POIXMLDocumentPart {
         out.close();
     }
 
-    public static Color modulateLuminanace(Color c, int lumMod, int lumOff) {
-        Color color;
-        if (lumOff > 0) {
-            color = new Color(
-                    (int) (Math.round((255 - c.getRed()) * (100.0 - lumMod) / 100.0 + c.getRed())),
-                    (int) (Math.round((255 - c.getGreen()) * lumOff / 100.0 + c.getGreen())),
-                    (int) (Math.round((255 - c.getBlue()) * lumOff / 100.0 + c.getBlue())),
-                    c.getAlpha()
-            );
-        } else {
-            color = new Color(
-                    (int) (Math.round(c.getRed() * lumMod / 100.0)),
-                    (int) (Math.round(c.getGreen() * lumMod / 100.0)),
-                    (int) (Math.round(c.getBlue() * lumMod / 100.0)),
-                    c.getAlpha()
-            );
-        }
-        return color;
-    }
-
     public String getMajorFont(){
         return _theme.getThemeElements().getFontScheme().getMajorFont().getLatin().getTypeface();
     }
diff --git a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestPPTX2PNG.java b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestPPTX2PNG.java
new file mode 100644 (file)
index 0000000..1f8826f
--- /dev/null
@@ -0,0 +1,50 @@
+/*\r
+ *  ====================================================================\r
+ *    Licensed to the Apache Software Foundation (ASF) under one or more\r
+ *    contributor license agreements.  See the NOTICE file distributed with\r
+ *    this work for additional information regarding copyright ownership.\r
+ *    The ASF licenses this file to You under the Apache License, Version 2.0\r
+ *    (the "License"); you may not use this file except in compliance with\r
+ *    the License.  You may obtain a copy of the License at\r
+ *\r
+ *        http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ *    Unless required by applicable law or agreed to in writing, software\r
+ *    distributed under the License is distributed on an "AS IS" BASIS,\r
+ *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ *    See the License for the specific language governing permissions and\r
+ *    limitations under the License.\r
+ * ====================================================================\r
+ */\r
+\r
+package org.apache.poi.xslf.usermodel;\r
+\r
+import junit.framework.TestCase;\r
+import org.apache.poi.xslf.XSLFTestDataSamples;\r
+\r
+import java.awt.Dimension;\r
+import java.awt.Graphics2D;\r
+import java.awt.image.BufferedImage;\r
+\r
+/**\r
+ * Date: 10/26/11\r
+ *\r
+ * @author Yegor Kozlov\r
+ */\r
+public class TestPPTX2PNG extends TestCase {\r
+    public void testRender(){\r
+        String[] testFiles = {"layouts.pptx", "sample.pptx", "shapes.pptx",\r
+                "45541_Header.pptx", "backgrounds.pptx"};\r
+        for(String sampleFile : testFiles){\r
+            XMLSlideShow pptx = XSLFTestDataSamples.openSampleDocument(sampleFile);\r
+            Dimension pg = pptx.getPageSize();\r
+            for(XSLFSlide slide : pptx.getSlides()){\r
+                BufferedImage img = new BufferedImage(pg.width, pg.height, BufferedImage.TYPE_INT_RGB);\r
+                Graphics2D graphics = img.createGraphics();\r
+\r
+                slide.draw(graphics);\r
+\r
+            }\r
+        }\r
+    }\r
+}\r
diff --git a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFColor.java b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFColor.java
new file mode 100755 (executable)
index 0000000..ffb25b3
--- /dev/null
@@ -0,0 +1,154 @@
+/* ====================================================================\r
+   Licensed to the Apache Software Foundation (ASF) under one or more\r
+   contributor license agreements.  See the NOTICE file distributed with\r
+   this work for additional information regarding copyright ownership.\r
+   The ASF licenses this file to You under the Apache License, Version 2.0\r
+   (the "License"); you may not use this file except in compliance with\r
+   the License.  You may obtain a copy of the License at\r
+\r
+       http://www.apache.org/licenses/LICENSE-2.0\r
+\r
+   Unless required by applicable law or agreed to in writing, software\r
+   distributed under the License is distributed on an "AS IS" BASIS,\r
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+   See the License for the specific language governing permissions and\r
+   limitations under the License.\r
+==================================================================== */\r
+package org.apache.poi.xslf.usermodel;\r
+\r
+import junit.framework.TestCase;\r
+\r
+import org.openxmlformats.schemas.drawingml.x2006.main.CTColor;\r
+import org.openxmlformats.schemas.drawingml.x2006.main.CTSchemeColor;\r
+import org.openxmlformats.schemas.drawingml.x2006.main.STSchemeColorVal;\r
+import org.openxmlformats.schemas.drawingml.x2006.main.CTSRgbColor;\r
+import org.openxmlformats.schemas.drawingml.x2006.main.CTHslColor;\r
+import org.openxmlformats.schemas.drawingml.x2006.main.STPresetColorVal;\r
+\r
+import java.awt.*;\r
+\r
+/**\r
+ * @author Yegor Kozlov\r
+ */\r
+public class TestXSLFColor extends TestCase {\r
+\r
+    public void testGetters() {\r
+        CTColor xml = CTColor.Factory.newInstance();\r
+        CTSRgbColor c = xml.addNewSrgbClr();\r
+        c.setVal(new byte[]{(byte)0xFF, 0, 0});\r
+\r
+        XSLFColor color = new XSLFColor(xml, null);\r
+\r
+        assertEquals(-1, color.getAlpha());\r
+        c.addNewAlpha().setVal(50000);\r
+        assertEquals(50, color.getAlpha());\r
+\r
+        assertEquals(-1, color.getAlphaMod());\r
+        c.addNewAlphaMod().setVal(50000);\r
+        assertEquals(50, color.getAlphaMod());\r
+\r
+        assertEquals(-1, color.getAlphaOff());\r
+        c.addNewAlphaOff().setVal(50000);\r
+        assertEquals(50, color.getAlphaOff());\r
+\r
+        assertEquals(-1, color.getLumMod());\r
+        c.addNewLumMod().setVal(50000);\r
+        assertEquals(50, color.getLumMod());\r
+\r
+        assertEquals(-1, color.getLumOff());\r
+        c.addNewLumOff().setVal(50000);\r
+        assertEquals(50, color.getLumOff());\r
+\r
+        assertEquals(-1, color.getSat());\r
+        c.addNewSat().setVal(50000);\r
+        assertEquals(50, color.getSat());\r
+\r
+        assertEquals(-1, color.getSatMod());\r
+        c.addNewSatMod().setVal(50000);\r
+        assertEquals(50, color.getSatMod());\r
+\r
+        assertEquals(-1, color.getSatOff());\r
+        c.addNewSatOff().setVal(50000);\r
+        assertEquals(50, color.getSatOff());\r
+\r
+        assertEquals(-1, color.getRed());\r
+        c.addNewRed().setVal(50000);\r
+        assertEquals(50, color.getRed());\r
+\r
+        assertEquals(-1, color.getGreen());\r
+        c.addNewGreen().setVal(50000);\r
+        assertEquals(50, color.getGreen());\r
+\r
+        assertEquals(-1, color.getBlue());\r
+        c.addNewBlue().setVal(50000);\r
+        assertEquals(50, color.getRed());\r
+\r
+        assertEquals(-1, color.getShade());\r
+        c.addNewShade().setVal(50000);\r
+        assertEquals(50, color.getShade());\r
+\r
+        assertEquals(-1, color.getTint());\r
+        c.addNewTint().setVal(50000);\r
+        assertEquals(50, color.getTint());\r
+    }\r
+\r
+    public void testHSL() {\r
+        CTColor xml = CTColor.Factory.newInstance();\r
+        CTHslColor c = xml.addNewHslClr();\r
+        c.setHue2(14400000);\r
+        c.setSat2(100000);\r
+        c.setLum2(50000);\r
+\r
+        XSLFColor color = new XSLFColor(xml, null);\r
+        assertEquals(new Color(128, 00, 00), color.getColor());\r
+    }\r
+\r
+    public void testSRgb() {\r
+        CTColor xml = CTColor.Factory.newInstance();\r
+        xml.addNewSrgbClr().setVal(new byte[]{ (byte)0xFF, (byte)0xFF, 0});\r
+\r
+        XSLFColor color = new XSLFColor(xml, null);\r
+        assertEquals(new Color(0xFF, 0xFF, 0), color.getColor());\r
+    }\r
+\r
+    public void testSchemeColor() {\r
+        XMLSlideShow ppt = new XMLSlideShow();\r
+        XSLFTheme theme = ppt.createSlide().getTheme();\r
+\r
+        CTColor xml = CTColor.Factory.newInstance();\r
+        xml.addNewSchemeClr().setVal(STSchemeColorVal.ACCENT_2);\r
+\r
+        XSLFColor color = new XSLFColor(xml, theme);\r
+        // accent2 is theme1.xml is <a:srgbClr val="C0504D"/>\r
+        assertEquals(Color.decode("0xC0504D"), color.getColor());\r
+\r
+        xml = CTColor.Factory.newInstance();\r
+        xml.addNewSchemeClr().setVal(STSchemeColorVal.LT_1);\r
+        color = new XSLFColor(xml, theme);\r
+        // <a:sysClr val="window" lastClr="FFFFFF"/>\r
+        assertEquals(Color.decode("0xFFFFFF"), color.getColor());\r
+\r
+        xml = CTColor.Factory.newInstance();\r
+        xml.addNewSchemeClr().setVal(STSchemeColorVal.DK_1);\r
+        color = new XSLFColor(xml, theme);\r
+        // <a:sysClr val="windowText" lastClr="000000"/>\r
+        assertEquals(Color.decode("0x000000"), color.getColor());\r
+    }\r
+\r
+    public void testPresetColor() {\r
+        CTColor xml = CTColor.Factory.newInstance();\r
+        xml.addNewPrstClr().setVal(STPresetColorVal.AQUAMARINE);\r
+        XSLFColor color = new XSLFColor(xml, null);\r
+        assertEquals(new Color(127, 255, 212), color.getColor());\r
+\r
+\r
+        for(String colorName : XSLFColor.presetColors.keySet()){\r
+            xml = CTColor.Factory.newInstance();\r
+            STPresetColorVal.Enum val = STPresetColorVal.Enum.forString(colorName);\r
+            assertNotNull(colorName, val);\r
+            xml.addNewPrstClr().setVal(val);\r
+            color = new XSLFColor(xml, null);\r
+            assertEquals(XSLFColor.presetColors.get(colorName), color.getColor());\r
+        }\r
+    }\r
+}
\ No newline at end of file
index 53562d967adcfa1d2ac7413fd7c5032e4c32bd37..e4d4d553b010599f7089f1331020dc5b323cb29d 100644 (file)
@@ -143,13 +143,13 @@ public class TestXSLFSimpleShape extends TestCase {
             assertEquals(2.0, s.getLineWidth());\r
             assertEquals(LineCap.FLAT, s.getLineCap());\r
             // YK: calculated color is slightly different from PowerPoint\r
-            assertEquals(new Color(40, 65, 95), s.getLineColor());\r
+            assertEquals(new Color(39, 64, 94), s.getLineColor());\r
         }\r
 \r
         XSLFSimpleShape s0 = (XSLFSimpleShape) shapes[0];\r
         // fill is not set\r
         assertNull(s0.getSpPr().getSolidFill());\r
-        assertEquals(slide6.getTheme().getColor("accent1").getColor(), s0.getFillColor());\r
+        //assertEquals(slide6.getTheme().getColor("accent1").getColor(), s0.getFillColor());\r
         assertEquals(new Color(79, 129, 189), s0.getFillColor());\r
 \r
         // lighter 80%\r
index 746098be05891d7542a498ccc2842f33ac5b4528..81f35d32501dc85792b3140ba62aed77f77b31c5 100644 (file)
@@ -33,7 +33,7 @@ public class TestXSLFTheme extends TestCase {
         assertNotNull(theme);\r
         \r
         assertEquals("Office Theme", theme.getName());\r
-        XSLFColor accent1 = theme.getColor("accent1");\r
-        assertNotNull(accent1);\r
+        //XSLFColor accent1 = theme.getColor("accent1");\r
+        //assertNotNull(accent1);\r
     }\r
 }\r
index 89dfcb1453d0ace3ee3b33895393a17f2229aefa..0cf9db5acdf8a4c258b3f0088ce89c8e9ed85d97 100644 (file)
@@ -138,7 +138,7 @@ public class TestXWPFPictureData extends TestCase {
             for (XWPFRun run : paragraph.getRuns()) {
                 for (XWPFPicture picture : run.getEmbeddedPictures()) {
                     if (paragraph.getDocument() != null) {
-                        System.out.println(picture.getCTPicture());
+                        //System.out.println(picture.getCTPicture());
                         XWPFPictureData data = picture.getPictureData();
                         if(data != null) System.out.println(data.getFileName());
                     }
diff --git a/test-data/slideshow/backgrounds.pptx b/test-data/slideshow/backgrounds.pptx
new file mode 100755 (executable)
index 0000000..1ce0557
Binary files /dev/null and b/test-data/slideshow/backgrounds.pptx differ