Browse Source

#65612 - XSLF CustomGeometry - replace XmlStreamReader access with XmlBeans delegate

git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1893859 13f79535-47bb-0310-9956-ffa450edef68
tags/REL_5_2_0
Andreas Beeker 2 years ago
parent
commit
9f7085a281
53 changed files with 1612 additions and 352 deletions
  1. 1
    0
      build.gradle
  2. 66
    0
      poi-ooxml/src/main/java/org/apache/poi/xslf/draw/geom/XSLFAdjustPoint.java
  3. 32
    0
      poi-ooxml/src/main/java/org/apache/poi/xslf/draw/geom/XSLFAdjustValue.java
  4. 75
    0
      poi-ooxml/src/main/java/org/apache/poi/xslf/draw/geom/XSLFArcTo.java
  5. 71
    0
      poi-ooxml/src/main/java/org/apache/poi/xslf/draw/geom/XSLFConnectionSite.java
  6. 79
    0
      poi-ooxml/src/main/java/org/apache/poi/xslf/draw/geom/XSLFCurveTo.java
  7. 89
    0
      poi-ooxml/src/main/java/org/apache/poi/xslf/draw/geom/XSLFCustomGeometry.java
  8. 55
    0
      poi-ooxml/src/main/java/org/apache/poi/xslf/draw/geom/XSLFGuide.java
  9. 52
    0
      poi-ooxml/src/main/java/org/apache/poi/xslf/draw/geom/XSLFLineTo.java
  10. 52
    0
      poi-ooxml/src/main/java/org/apache/poi/xslf/draw/geom/XSLFMoveTo.java
  11. 178
    0
      poi-ooxml/src/main/java/org/apache/poi/xslf/draw/geom/XSLFPath.java
  12. 36
    0
      poi-ooxml/src/main/java/org/apache/poi/xslf/draw/geom/XSLFPolarAdjustHandle.java
  13. 56
    0
      poi-ooxml/src/main/java/org/apache/poi/xslf/draw/geom/XSLFQuadTo.java
  14. 35
    0
      poi-ooxml/src/main/java/org/apache/poi/xslf/draw/geom/XSLFXYAdjustHandle.java
  15. 1
    0
      poi-ooxml/src/main/java/org/apache/poi/xslf/usermodel/XSLFBackground.java
  16. 2
    18
      poi-ooxml/src/main/java/org/apache/poi/xslf/usermodel/XSLFFreeformShape.java
  17. 6
    15
      poi-ooxml/src/main/java/org/apache/poi/xslf/usermodel/XSLFSimpleShape.java
  18. 9
    2
      poi-ooxml/src/main/java/org/apache/poi/xslf/usermodel/XSLFTable.java
  19. 7
    1
      poi-ooxml/src/main/java/org/apache/poi/xslf/util/PPTX2PNG.java
  20. BIN
      poi-ooxml/src/main/java9/module-info.class
  21. 1
    0
      poi-ooxml/src/main/java9/module-info.java
  22. 10
    1
      poi-ooxml/src/test/java/org/apache/poi/xslf/usermodel/TestPPTX2PNG.java
  23. BIN
      poi-ooxml/src/test/java9/module-info.class
  24. 1
    0
      poi-ooxml/src/test/java9/module-info.java
  25. 17
    11
      poi/src/main/java/org/apache/poi/sl/draw/DrawSimpleShape.java
  26. 7
    34
      poi/src/main/java/org/apache/poi/sl/draw/geom/AdjustPoint.java
  27. 44
    0
      poi/src/main/java/org/apache/poi/sl/draw/geom/AdjustPointIf.java
  28. 1
    7
      poi/src/main/java/org/apache/poi/sl/draw/geom/AdjustValue.java
  29. 32
    0
      poi/src/main/java/org/apache/poi/sl/draw/geom/AdjustValueIf.java
  30. 26
    31
      poi/src/main/java/org/apache/poi/sl/draw/geom/ArcToCommand.java
  31. 72
    0
      poi/src/main/java/org/apache/poi/sl/draw/geom/ArcToCommandIf.java
  32. 1
    1
      poi/src/main/java/org/apache/poi/sl/draw/geom/ClosePathCommand.java
  33. 23
    0
      poi/src/main/java/org/apache/poi/sl/draw/geom/ClosePathCommandIf.java
  34. 7
    34
      poi/src/main/java/org/apache/poi/sl/draw/geom/ConnectionSite.java
  35. 44
    0
      poi/src/main/java/org/apache/poi/sl/draw/geom/ConnectionSiteIf.java
  36. 6
    6
      poi/src/main/java/org/apache/poi/sl/draw/geom/Context.java
  37. 22
    15
      poi/src/main/java/org/apache/poi/sl/draw/geom/CurveToCommand.java
  38. 50
    0
      poi/src/main/java/org/apache/poi/sl/draw/geom/CurveToCommandIf.java
  39. 10
    10
      poi/src/main/java/org/apache/poi/sl/draw/geom/CustomGeometry.java
  40. 5
    83
      poi/src/main/java/org/apache/poi/sl/draw/geom/Guide.java
  41. 120
    0
      poi/src/main/java/org/apache/poi/sl/draw/geom/GuideIf.java
  42. 1
    1
      poi/src/main/java/org/apache/poi/sl/draw/geom/IAdjustableShape.java
  43. 4
    10
      poi/src/main/java/org/apache/poi/sl/draw/geom/LineToCommand.java
  44. 35
    0
      poi/src/main/java/org/apache/poi/sl/draw/geom/LineToCommandIf.java
  45. 4
    11
      poi/src/main/java/org/apache/poi/sl/draw/geom/MoveToCommand.java
  46. 35
    0
      poi/src/main/java/org/apache/poi/sl/draw/geom/MoveToCommandIf.java
  47. 4
    4
      poi/src/main/java/org/apache/poi/sl/draw/geom/Outline.java
  48. 14
    1
      poi/src/main/java/org/apache/poi/sl/draw/geom/Path.java
  49. 55
    0
      poi/src/main/java/org/apache/poi/sl/draw/geom/PathIf.java
  50. 1
    19
      poi/src/main/java/org/apache/poi/sl/draw/geom/PresetGeometries.java
  51. 15
    13
      poi/src/main/java/org/apache/poi/sl/draw/geom/QuadToCommand.java
  52. 42
    0
      poi/src/main/java/org/apache/poi/sl/draw/geom/QuadToCommandIf.java
  53. 1
    24
      poi/src/test/java/org/apache/poi/sl/draw/geom/TestPresetGeometries.java

+ 1
- 0
build.gradle View File

@@ -136,6 +136,7 @@ subprojects {
resolutionStrategy {
force "commons-io:commons-io:${commonsIoVersion}"
force 'org.slf4j:slf4j-api:1.7.32'
force 'com.fasterxml.woodstox:woodstox-core:6.2.6'
}
}
}

+ 66
- 0
poi-ooxml/src/main/java/org/apache/poi/xslf/draw/geom/XSLFAdjustPoint.java View File

@@ -0,0 +1,66 @@
/* ====================================================================
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
==================================================================== */

package org.apache.poi.xslf.draw.geom;

import org.apache.poi.sl.draw.geom.AdjustPointIf;
import org.apache.poi.util.Beta;
import org.openxmlformats.schemas.drawingml.x2006.main.CTAdjPoint2D;

/**
* Wrapper / delegate for XmlBeans custom geometry
*/
@Beta
public class XSLFAdjustPoint implements AdjustPointIf {

private final CTAdjPoint2D pnt;

public XSLFAdjustPoint(CTAdjPoint2D pnt) {
this.pnt = pnt;
}

@Override
public String getX() {
return pnt.xgetX().getStringValue();
}

@Override
public void setX(String value) {
pnt.setX(value);
}

@Override
public boolean isSetX() {
return pnt.xgetX() != null;
}

@Override
public String getY() {
return pnt.xgetY().getStringValue();
}

@Override
public void setY(String value) {
pnt.setY(value);
}

@Override
public boolean isSetY() {
return pnt.xgetY() != null;

}
}

+ 32
- 0
poi-ooxml/src/main/java/org/apache/poi/xslf/draw/geom/XSLFAdjustValue.java View File

@@ -0,0 +1,32 @@
/* ====================================================================
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
==================================================================== */

package org.apache.poi.xslf.draw.geom;

import org.apache.poi.sl.draw.geom.AdjustValueIf;
import org.apache.poi.util.Beta;
import org.openxmlformats.schemas.drawingml.x2006.main.CTGeomGuide;

/**
* Wrapper / delegate for XmlBeans custom geometry
*/
@Beta
public class XSLFAdjustValue extends XSLFGuide implements AdjustValueIf {
public XSLFAdjustValue(CTGeomGuide guide) {
super(guide);
}
}

+ 75
- 0
poi-ooxml/src/main/java/org/apache/poi/xslf/draw/geom/XSLFArcTo.java View File

@@ -0,0 +1,75 @@
/* ====================================================================
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
==================================================================== */

package org.apache.poi.xslf.draw.geom;

import org.apache.poi.sl.draw.geom.ArcToCommandIf;
import org.apache.poi.util.Beta;
import org.openxmlformats.schemas.drawingml.x2006.main.CTPath2DArcTo;

/**
* Wrapper / delegate for XmlBeans custom geometry
*/
@Beta
public class XSLFArcTo implements ArcToCommandIf {
private final CTPath2DArcTo arc;

public XSLFArcTo(CTPath2DArcTo arc) {
this.arc = arc;
}

@Override
public String getHR() {
return arc.xgetHR().getStringValue();
}

@Override
public void setHR(String hr) {
arc.setHR(hr);
}

@Override
public String getWR() {
return arc.xgetHR().getStringValue();
}

@Override
public void setWR(String wr) {
arc.setWR(wr);
}

@Override
public String getStAng() {
return arc.xgetStAng().getStringValue();
}

@Override
public void setStAng(String stAng) {
arc.setStAng(stAng);
}

@Override
public String getSwAng() {
return arc.xgetSwAng().getStringValue();
}

@Override
public void setSwAng(String swAng) {
arc.setSwAng(swAng);
}

}

+ 71
- 0
poi-ooxml/src/main/java/org/apache/poi/xslf/draw/geom/XSLFConnectionSite.java View File

@@ -0,0 +1,71 @@
/* ====================================================================
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
==================================================================== */

package org.apache.poi.xslf.draw.geom;

import org.apache.poi.sl.draw.geom.AdjustPointIf;
import org.apache.poi.sl.draw.geom.ConnectionSiteIf;
import org.apache.poi.util.Beta;
import org.openxmlformats.schemas.drawingml.x2006.main.CTAdjPoint2D;
import org.openxmlformats.schemas.drawingml.x2006.main.CTConnectionSite;

/**
* Wrapper / delegate for XmlBeans custom geometry
*/
@Beta
public class XSLFConnectionSite implements ConnectionSiteIf {

final CTConnectionSite cxn;

public XSLFConnectionSite(CTConnectionSite cxn) {
this.cxn = cxn;
}

@Override
public AdjustPointIf getPos() {
return new XSLFAdjustPoint(cxn.getPos());
}

@Override
public void setPos(AdjustPointIf pos) {
CTAdjPoint2D p = cxn.getPos();
if (p == null) {
p = cxn.addNewPos();
}
p.setX(pos.getX());
p.setY(pos.getY());
}

@Override
public String getAng() {
return cxn.xgetAng().getStringValue();
}

/**
* Sets the value of the ang property.
*/
@Override
public void setAng(String value) {
cxn.setAng(value);
}

@Override
public boolean isSetAng() {
return cxn.xgetAng() == null;
}

}

+ 79
- 0
poi-ooxml/src/main/java/org/apache/poi/xslf/draw/geom/XSLFCurveTo.java View File

@@ -0,0 +1,79 @@
/* ====================================================================
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
==================================================================== */

package org.apache.poi.xslf.draw.geom;

import org.apache.poi.sl.draw.geom.AdjustPointIf;
import org.apache.poi.sl.draw.geom.CurveToCommandIf;
import org.apache.poi.util.Beta;
import org.openxmlformats.schemas.drawingml.x2006.main.CTAdjPoint2D;
import org.openxmlformats.schemas.drawingml.x2006.main.CTPath2DCubicBezierTo;

/**
* Wrapper / delegate for XmlBeans custom geometry
*/
@Beta
public class XSLFCurveTo implements CurveToCommandIf {
private final CTPath2DCubicBezierTo bezier;

public XSLFCurveTo(CTPath2DCubicBezierTo bezier) {
this.bezier = bezier;
}

@Override
public XSLFAdjustPoint getPt1() {
return new XSLFAdjustPoint(bezier.getPtArray(0));
}

@Override
public void setPt1(AdjustPointIf pt1) {
CTAdjPoint2D xpt = getOrCreate(0);
xpt.setX(pt1.getX());
xpt.setY(pt1.getY());
}

@Override
public XSLFAdjustPoint getPt2() {
return new XSLFAdjustPoint(bezier.getPtArray(1));
}

@Override
public void setPt2(AdjustPointIf pt2) {
CTAdjPoint2D xpt = getOrCreate(1);
xpt.setX(pt2.getX());
xpt.setY(pt2.getY());
}

@Override
public XSLFAdjustPoint getPt3() {
return new XSLFAdjustPoint(bezier.getPtArray(2));
}

@Override
public void setPt3(AdjustPointIf pt3) {
CTAdjPoint2D xpt = getOrCreate(2);
xpt.setX(pt3.getX());
xpt.setY(pt3.getY());
}

private CTAdjPoint2D getOrCreate(int idx) {
for (int i=(idx+1)-bezier.sizeOfPtArray(); i > 0; i--) {
bezier.addNewPt();
}
return bezier.getPtArray(idx);
}
}

+ 89
- 0
poi-ooxml/src/main/java/org/apache/poi/xslf/draw/geom/XSLFCustomGeometry.java View File

@@ -0,0 +1,89 @@
/* ====================================================================
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
==================================================================== */

package org.apache.poi.xslf.draw.geom;

import org.apache.poi.sl.draw.geom.CustomGeometry;
import org.apache.poi.util.Beta;
import org.openxmlformats.schemas.drawingml.x2006.main.CTAdjustHandleList;
import org.openxmlformats.schemas.drawingml.x2006.main.CTConnectionSite;
import org.openxmlformats.schemas.drawingml.x2006.main.CTCustomGeometry2D;
import org.openxmlformats.schemas.drawingml.x2006.main.CTGeomGuide;
import org.openxmlformats.schemas.drawingml.x2006.main.CTGeomGuideList;
import org.openxmlformats.schemas.drawingml.x2006.main.CTGeomRect;
import org.openxmlformats.schemas.drawingml.x2006.main.CTPath2D;
import org.openxmlformats.schemas.drawingml.x2006.main.CTPath2DList;
import org.openxmlformats.schemas.drawingml.x2006.main.CTPolarAdjustHandle;
import org.openxmlformats.schemas.drawingml.x2006.main.CTXYAdjustHandle;

/**
* Wrapper / delegate for XmlBeans custom geometry
*/
@Beta
public class XSLFCustomGeometry {
public static CustomGeometry convertCustomGeometry(CTCustomGeometry2D custGeom) {
CustomGeometry cg = new CustomGeometry();

if (custGeom.isSetAhLst()) {
CTAdjustHandleList ahLst = custGeom.getAhLst();
for (CTXYAdjustHandle xy : ahLst.getAhXYArray()) {
cg.addAdjustHandle(new XSLFXYAdjustHandle(xy));
}
for (CTPolarAdjustHandle pol : ahLst.getAhPolarArray()) {
cg.addAdjustHandle(new XSLFPolarAdjustHandle(pol));
}
}

if (custGeom.isSetAvLst()) {
CTGeomGuideList avLst = custGeom.getAvLst();
for (CTGeomGuide gg : avLst.getGdArray()) {
cg.addAdjustGuide(new XSLFAdjustValue(gg));
}
}

if (custGeom.isSetGdLst()) {
CTGeomGuideList gdLst = custGeom.getGdLst();
for (CTGeomGuide gg : gdLst.getGdArray()) {
cg.addGeomGuide(new XSLFGuide(gg));
}
}

if (custGeom.isSetRect()) {
CTGeomRect r = custGeom.getRect();
cg.setTextBounds(
r.xgetL().getStringValue(),
r.xgetT().getStringValue(),
r.xgetR().getStringValue(),
r.xgetB().getStringValue());
}

if (custGeom.isSetCxnLst()) {
for (CTConnectionSite cxn : custGeom.getCxnLst().getCxnArray()) {
cg.addConnectionSite(new XSLFConnectionSite((cxn)));
}
}

CTPath2DList pl = custGeom.getPathLst();
if (pl != null) {
for (CTPath2D p : pl.getPathArray()) {
cg.addPath(new XSLFPath(p));
}
}

return cg;
}
}

+ 55
- 0
poi-ooxml/src/main/java/org/apache/poi/xslf/draw/geom/XSLFGuide.java View File

@@ -0,0 +1,55 @@
/* ====================================================================
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
==================================================================== */

package org.apache.poi.xslf.draw.geom;

import org.apache.poi.sl.draw.geom.GuideIf;
import org.apache.poi.util.Beta;
import org.openxmlformats.schemas.drawingml.x2006.main.CTGeomGuide;

/**
* Wrapper / delegate for XmlBeans custom geometry
*/
@Beta
public class XSLFGuide implements GuideIf {
final CTGeomGuide guide;

public XSLFGuide(CTGeomGuide guide) {
this.guide = guide;
}

@Override
public String getName() {
return guide.getName();
}

@Override
public void setName(String name) {
guide.setName(name);
}

@Override
public String getFmla() {
return guide.getFmla();
}

@Override
public void setFmla(String fmla) {
guide.setFmla(fmla);
}

}

+ 52
- 0
poi-ooxml/src/main/java/org/apache/poi/xslf/draw/geom/XSLFLineTo.java View File

@@ -0,0 +1,52 @@
/* ====================================================================
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
==================================================================== */

package org.apache.poi.xslf.draw.geom;

import org.apache.poi.sl.draw.geom.AdjustPointIf;
import org.apache.poi.sl.draw.geom.LineToCommandIf;
import org.apache.poi.util.Beta;
import org.openxmlformats.schemas.drawingml.x2006.main.CTAdjPoint2D;
import org.openxmlformats.schemas.drawingml.x2006.main.CTPath2DLineTo;

/**
* Wrapper / delegate for XmlBeans custom geometry
*/
@Beta
public class XSLFLineTo implements LineToCommandIf {

private final CTPath2DLineTo lineTo;

public XSLFLineTo(CTPath2DLineTo lineTo) {
this.lineTo = lineTo;
}

@Override
public AdjustPointIf getPt() {
return new XSLFAdjustPoint(lineTo.getPt());
}

@Override
public void setPt(AdjustPointIf pt) {
CTAdjPoint2D xpt = lineTo.getPt();
if (xpt == null) {
xpt = lineTo.addNewPt();
}
xpt.setX(pt.getX());
xpt.setY(pt.getY());
}
}

+ 52
- 0
poi-ooxml/src/main/java/org/apache/poi/xslf/draw/geom/XSLFMoveTo.java View File

@@ -0,0 +1,52 @@
/* ====================================================================
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
==================================================================== */

package org.apache.poi.xslf.draw.geom;

import org.apache.poi.sl.draw.geom.AdjustPointIf;
import org.apache.poi.sl.draw.geom.MoveToCommandIf;
import org.apache.poi.util.Beta;
import org.openxmlformats.schemas.drawingml.x2006.main.CTAdjPoint2D;
import org.openxmlformats.schemas.drawingml.x2006.main.CTPath2DMoveTo;

/**
* Wrapper / delegate for XmlBeans custom geometry
*/
@Beta
public class XSLFMoveTo implements MoveToCommandIf {

private final CTPath2DMoveTo moveTo;

public XSLFMoveTo(CTPath2DMoveTo moveTo) {
this.moveTo = moveTo;
}

@Override
public XSLFAdjustPoint getPt() {
return new XSLFAdjustPoint(moveTo.getPt());
}

@Override
public void setPt(AdjustPointIf pt) {
CTAdjPoint2D xpt = moveTo.getPt();
if (xpt == null) {
xpt = moveTo.addNewPt();
}
xpt.setX(pt.getX());
xpt.setY(pt.getY());
}
}

+ 178
- 0
poi-ooxml/src/main/java/org/apache/poi/xslf/draw/geom/XSLFPath.java View File

@@ -0,0 +1,178 @@
/* ====================================================================
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
==================================================================== */

package org.apache.poi.xslf.draw.geom;

import java.awt.geom.Path2D;

import org.apache.poi.sl.draw.geom.ClosePathCommand;
import org.apache.poi.sl.draw.geom.Context;
import org.apache.poi.sl.draw.geom.PathCommand;
import org.apache.poi.sl.draw.geom.PathIf;
import org.apache.poi.sl.usermodel.PaintStyle;
import org.apache.poi.util.Beta;
import org.apache.xmlbeans.XmlCursor;
import org.apache.xmlbeans.XmlObject;
import org.openxmlformats.schemas.drawingml.x2006.main.CTPath2D;
import org.openxmlformats.schemas.drawingml.x2006.main.CTPath2DArcTo;
import org.openxmlformats.schemas.drawingml.x2006.main.CTPath2DClose;
import org.openxmlformats.schemas.drawingml.x2006.main.CTPath2DCubicBezierTo;
import org.openxmlformats.schemas.drawingml.x2006.main.CTPath2DLineTo;
import org.openxmlformats.schemas.drawingml.x2006.main.CTPath2DMoveTo;
import org.openxmlformats.schemas.drawingml.x2006.main.CTPath2DQuadBezierTo;
import org.openxmlformats.schemas.drawingml.x2006.main.STPathFillMode;

/**
* Wrapper / delegate for XmlBeans custom geometry
*/
@Beta
public class XSLFPath implements PathIf {

private final CTPath2D pathXml;

public XSLFPath(CTPath2D pathXml) {
this.pathXml = pathXml;
}

@Override
public void addCommand(PathCommand cmd) {
// not supported
}

@Override
public Path2D.Double getPath(Context ctx) {
Path2D.Double path2D = new Path2D.Double();
XmlCursor cur = pathXml.newCursor();
try {
for (boolean hasNext = cur.toFirstChild(); hasNext; hasNext = cur.toNextSibling()) {
XmlObject xo = cur.getObject();
PathCommand pc;
if (xo instanceof CTPath2DArcTo) {
pc = new XSLFArcTo((CTPath2DArcTo) xo);
} else if (xo instanceof CTPath2DCubicBezierTo) {
pc = new XSLFCurveTo((CTPath2DCubicBezierTo) xo);
} else if (xo instanceof CTPath2DMoveTo) {
pc = new XSLFMoveTo((CTPath2DMoveTo) xo);
} else if (xo instanceof CTPath2DLineTo) {
pc = new XSLFLineTo((CTPath2DLineTo) xo);
} else if (xo instanceof CTPath2DQuadBezierTo) {
pc = new XSLFQuadTo((CTPath2DQuadBezierTo) xo);
} else if (xo instanceof CTPath2DClose) {
pc = new ClosePathCommand();
} else {
continue;
}
pc.execute(path2D, ctx);
}
} finally {
cur.dispose();
}
return path2D;
}

@Override
public boolean isStroked() {
return pathXml.getStroke();
}

@Override
public void setStroke(boolean stroke) {
pathXml.setStroke(stroke);
}

@Override
public boolean isFilled() {
return pathXml.getFill() != STPathFillMode.NONE;
}

@Override
public PaintStyle.PaintModifier getFill() {
switch (pathXml.getFill().intValue()) {
default:
case STPathFillMode.INT_NONE:
return PaintStyle.PaintModifier.NONE;
case STPathFillMode.INT_NORM:
return PaintStyle.PaintModifier.NORM;
case STPathFillMode.INT_LIGHTEN:
return PaintStyle.PaintModifier.LIGHTEN;
case STPathFillMode.INT_LIGHTEN_LESS:
return PaintStyle.PaintModifier.LIGHTEN_LESS;
case STPathFillMode.INT_DARKEN:
return PaintStyle.PaintModifier.DARKEN;
case STPathFillMode.INT_DARKEN_LESS:
return PaintStyle.PaintModifier.DARKEN_LESS;
}
}

@Override
public void setFill(PaintStyle.PaintModifier fill) {
STPathFillMode.Enum f;
switch (fill) {
default:
case NONE:
f = STPathFillMode.NONE;
break;
case NORM:
f = STPathFillMode.NORM;
break;
case LIGHTEN:
f = STPathFillMode.LIGHTEN;
break;
case LIGHTEN_LESS:
f = STPathFillMode.LIGHTEN_LESS;
break;
case DARKEN:
f = STPathFillMode.DARKEN;
break;
case DARKEN_LESS:
f = STPathFillMode.DARKEN_LESS;
break;
}
pathXml.setFill(f);
}

@Override
public long getW() {
return pathXml.getW();
}

@Override
public void setW(long w) {
pathXml.setW(w);
}

@Override
public long getH() {
return pathXml.getH();
}

@Override
public void setH(long h) {
pathXml.setH(h);
}

@Override
public boolean isExtrusionOk() {
return pathXml.getExtrusionOk();
}

@Override
public void setExtrusionOk(boolean extrusionOk) {
pathXml.setExtrusionOk(extrusionOk);
}

}

+ 36
- 0
poi-ooxml/src/main/java/org/apache/poi/xslf/draw/geom/XSLFPolarAdjustHandle.java View File

@@ -0,0 +1,36 @@
/* ====================================================================
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
==================================================================== */

package org.apache.poi.xslf.draw.geom;

import org.apache.poi.sl.draw.geom.AdjustHandle;
import org.apache.poi.util.Beta;
import org.openxmlformats.schemas.drawingml.x2006.main.CTPolarAdjustHandle;

/**
* Wrapper / delegate for XmlBeans custom geometry
*/
@Beta
public class XSLFPolarAdjustHandle implements AdjustHandle {
final CTPolarAdjustHandle xobj;

public XSLFPolarAdjustHandle(CTPolarAdjustHandle xobj) {
this.xobj = xobj;
}

// define more getter/setter when needed
}

+ 56
- 0
poi-ooxml/src/main/java/org/apache/poi/xslf/draw/geom/XSLFQuadTo.java View File

@@ -0,0 +1,56 @@
/* ====================================================================
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
==================================================================== */

package org.apache.poi.xslf.draw.geom;

import org.apache.poi.sl.draw.geom.AdjustPointIf;
import org.apache.poi.sl.draw.geom.QuadToCommandIf;
import org.apache.poi.util.Beta;
import org.openxmlformats.schemas.drawingml.x2006.main.CTPath2DQuadBezierTo;

/**
* Wrapper / delegate for XmlBeans custom geometry
*/
@Beta
public class XSLFQuadTo implements QuadToCommandIf {

private final CTPath2DQuadBezierTo bezier;

public XSLFQuadTo(CTPath2DQuadBezierTo bezier) {
this.bezier = bezier;
}

@Override
public AdjustPointIf getPt1() {
return new XSLFAdjustPoint(bezier.getPtArray(0));
}

@Override
public void setPt1(AdjustPointIf pt1) {

}

@Override
public AdjustPointIf getPt2() {
return new XSLFAdjustPoint(bezier.getPtArray(1));
}

@Override
public void setPt2(AdjustPointIf pt2) {

}
}

+ 35
- 0
poi-ooxml/src/main/java/org/apache/poi/xslf/draw/geom/XSLFXYAdjustHandle.java View File

@@ -0,0 +1,35 @@
/* ====================================================================
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
==================================================================== */

package org.apache.poi.xslf.draw.geom;

import org.apache.poi.sl.draw.geom.AdjustHandle;
import org.apache.poi.util.Beta;
import org.openxmlformats.schemas.drawingml.x2006.main.CTXYAdjustHandle;

/**
* Wrapper / delegate for XmlBeans custom geometry
*/
@Beta
public class XSLFXYAdjustHandle implements AdjustHandle {
final CTXYAdjustHandle xobj;
public XSLFXYAdjustHandle(CTXYAdjustHandle xobj) {
this.xobj = xobj;
}

// define more getter/setter when needed
}

+ 1
- 0
poi-ooxml/src/main/java/org/apache/poi/xslf/usermodel/XSLFBackground.java View File

@@ -75,6 +75,7 @@ public class XSLFBackground extends XSLFSimpleShape
return bg.getBgPr();
}

@Override
public void setFillColor(Color color) {
CTBackgroundProperties bgPr = getBgPr(true);


+ 2
- 18
poi-ooxml/src/main/java/org/apache/poi/xslf/usermodel/XSLFFreeformShape.java View File

@@ -24,21 +24,16 @@ import java.awt.geom.Path2D;
import java.awt.geom.PathIterator;
import java.awt.geom.Rectangle2D;

import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.poi.ooxml.POIXMLTypeLoader;
import org.apache.poi.ooxml.util.POIXMLUnits;
import org.apache.poi.sl.draw.geom.CustomGeometry;
import org.apache.poi.sl.draw.geom.PresetGeometries;
import org.apache.poi.sl.usermodel.FreeformShape;
import org.apache.poi.util.Beta;
import org.apache.poi.util.Units;
import org.apache.poi.xslf.draw.geom.XSLFCustomGeometry;
import org.apache.xmlbeans.XmlCursor;
import org.apache.xmlbeans.XmlObject;
import org.apache.xmlbeans.XmlOptions;
import org.openxmlformats.schemas.drawingml.x2006.main.CTAdjPoint2D;
import org.openxmlformats.schemas.drawingml.x2006.main.CTCustomGeometry2D;
import org.openxmlformats.schemas.drawingml.x2006.main.CTGeomRect;
@@ -135,18 +130,7 @@ public class XSLFFreeformShape extends XSLFAutoShape
return null;
}

XmlOptions xop = new XmlOptions(POIXMLTypeLoader.DEFAULT_XML_OPTIONS);
xop.setSaveOuter();

XMLStreamReader staxReader = ((CTShapeProperties)xo).getCustGeom().newXMLStreamReader(xop);
CustomGeometry custGeo = PresetGeometries.convertCustomGeometry(staxReader);
try {
staxReader.close();
} catch (XMLStreamException e) {
LOG.atWarn().log("An error occurred while closing a Custom Geometry XML Stream Reader: {}", e.getMessage());
}

return custGeo;
return XSLFCustomGeometry.convertCustomGeometry(((CTShapeProperties)xo).getCustGeom());
}

@Override

+ 6
- 15
poi-ooxml/src/main/java/org/apache/poi/xslf/usermodel/XSLFSimpleShape.java View File

@@ -22,9 +22,6 @@ package org.apache.poi.xslf.usermodel;
import java.awt.Color;
import java.awt.geom.Rectangle2D;

import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.poi.ooxml.util.POIXMLUnits;
@@ -47,6 +44,7 @@ import org.apache.poi.sl.usermodel.StrokeStyle.LineCompound;
import org.apache.poi.sl.usermodel.StrokeStyle.LineDash;
import org.apache.poi.util.Beta;
import org.apache.poi.util.Units;
import org.apache.poi.xslf.draw.geom.XSLFCustomGeometry;
import org.apache.poi.xslf.model.PropertyFetcher;
import org.apache.poi.xslf.usermodel.XSLFPropertiesDelegate.XSLFEffectProperties;
import org.apache.poi.xslf.usermodel.XSLFPropertiesDelegate.XSLFFillProperties;
@@ -240,7 +238,7 @@ public abstract class XSLFSimpleShape extends XSLFShape

/**
* @param color the color to paint the shape outline.
* A <code>null</code> value turns off the shape outline.
* A {@code null} value turns off the shape outline.
*/
public void setLineColor(Color color) {
CTLineProperties ln = getLn(this, true);
@@ -273,7 +271,7 @@ public abstract class XSLFSimpleShape extends XSLFShape

/**
*
* @return the color of the shape outline or <code>null</code>
* @return the color of the shape outline or {@code null}
* if outline is turned off
*/
@SuppressWarnings("WeakerAccess")
@@ -351,7 +349,7 @@ public abstract class XSLFSimpleShape extends XSLFShape

/**
*
* @param width line width in points. <code>0</code> means no line
* @param width line width in points. {@code 0} means no line
*/
@SuppressWarnings("WeakerAccess")
public void setLineWidth(double width) {
@@ -386,7 +384,7 @@ public abstract class XSLFSimpleShape extends XSLFShape
}

/**
* @return line width in points. <code>0</code> means no line.
* @return line width in points. {@code 0} means no line.
*/
@SuppressWarnings("WeakerAccess")
public double getLineWidth() {
@@ -709,14 +707,7 @@ public abstract class XSLFSimpleShape extends XSLFShape
throw new IllegalStateException("Unknown shape geometry: " + name + ", available geometries are: " + dict.keySet());
}
} else if (gp.isSetCustGeom()){
XMLStreamReader staxReader = gp.getCustGeom().newXMLStreamReader();
geom = PresetGeometries.convertCustomGeometry(staxReader);
try {
staxReader.close();
}
catch (XMLStreamException e) {
LOG.atWarn().log("An error occurred while closing a Custom Geometry XML Stream Reader: {}", e.getMessage());
}
geom = XSLFCustomGeometry.convertCustomGeometry(gp.getCustGeom());
} else {
geom = dict.get("rect");
}

+ 9
- 2
poi-ooxml/src/main/java/org/apache/poi/xslf/usermodel/XSLFTable.java View File

@@ -27,6 +27,8 @@ import java.util.List;

import javax.xml.namespace.QName;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.poi.ooxml.util.POIXMLUnits;
import org.apache.poi.sl.draw.DrawFactory;
import org.apache.poi.sl.draw.DrawTableShape;
@@ -52,6 +54,7 @@ import org.openxmlformats.schemas.presentationml.x2006.main.CTGraphicalObjectFra
public class XSLFTable extends XSLFGraphicFrame implements Iterable<XSLFTableRow>,
TableShape<XSLFShape,XSLFTextParagraph> {
/* package */ static final String TABLE_URI = "http://schemas.openxmlformats.org/drawingml/2006/table";
private static final Logger LOG = LogManager.getLogger(XSLFTable.class);

private final CTTable _table;
private final List<XSLFTableRow> _rows;
@@ -425,13 +428,17 @@ public class XSLFTable extends XSLFGraphicFrame implements Iterable<XSLFTableRow
for (int col2=col+1; col2<col+tc.getGridSpan(); col2++) {
assert(col2 < cols);
XSLFTableCell tc2 = getCell(row, col2);
assert(tc2.getGridSpan() == 1 && tc2.getRowSpan() == 1);
if (tc2.getGridSpan() != 1 || tc2.getRowSpan() != 1) {
LOG.warn("invalid table span - rendering result is probably wrong");
}
mergedBounds.add(tc2.getAnchor());
}
for (int row2=row+1; row2<row+tc.getRowSpan(); row2++) {
assert(row2 < rows);
XSLFTableCell tc2 = getCell(row2, col);
assert(tc2.getGridSpan() == 1 && tc2.getRowSpan() == 1);
if (tc2.getGridSpan() != 1 || tc2.getRowSpan() != 1) {
LOG.warn("invalid table span - rendering result is probably wrong");
}
mergedBounds.add(tc2.getAnchor());
}
tc.setAnchor(mergedBounds);

+ 7
- 1
poi-ooxml/src/main/java/org/apache/poi/xslf/util/PPTX2PNG.java View File

@@ -477,7 +477,13 @@ public final class PPTX2PNG {
if (outfile != null) {
return outfile;
}
String inname = String.format(Locale.ROOT, "%04d|%s|%s", slideNo, format, file.getName());

String fileName = file.getName();
if ("stdin".equals(fileName)) {
fileName += ".ext";
}

String inname = String.format(Locale.ROOT, "%04d|%s|%s", slideNo, format, fileName);
String outpat = (proxy.getSlideCount() > 1 && slideNo > 0 ? outPattern : outPattern.replaceAll("-?\\$\\{slideno}", ""));
return INPUT_PATTERN.matcher(inname).replaceAll(outpat);
}

BIN
poi-ooxml/src/main/java9/module-info.class View File


+ 1
- 0
poi-ooxml/src/main/java9/module-info.java View File

@@ -72,6 +72,7 @@ module org.apache.poi.ooxml {
exports org.apache.poi.xssf.streaming;
exports org.apache.poi.xssf.util;
exports org.apache.poi.xslf.draw;
exports org.apache.poi.xslf.draw.geom;
exports org.apache.poi.xslf.usermodel;
exports org.apache.poi.xslf.model;
exports org.apache.poi.xslf.util;

+ 10
- 1
poi-ooxml/src/test/java/org/apache/poi/xslf/usermodel/TestPPTX2PNG.java View File

@@ -35,6 +35,7 @@ import java.util.zip.ZipFile;

import org.apache.commons.compress.archivers.sevenz.SevenZArchiveEntry;
import org.apache.commons.compress.archivers.sevenz.SevenZFile;
import org.apache.commons.io.FilenameUtils;
import org.apache.poi.POIDataSamples;
import org.apache.poi.poifs.filesystem.FileMagic;
import org.apache.poi.xslf.util.PPTX2PNG;
@@ -126,7 +127,6 @@ class TestPPTX2PNG {
"-format", format, // png,gif,jpg,svg,pdf or null for test
"-slide", "-1", // -1 for all
"-outdir", tmpDir.getCanonicalPath(),
"-outpat", "${basename}-${slideno}-${ext}.${format}",
// "-dump", new File("build/tmp/", pptFile+".json").getCanonicalPath(),
"-dump", "null",
"-quiet",
@@ -157,17 +157,26 @@ class TestPPTX2PNG {
args.add("GBK");
}

final String basename = FilenameUtils.getBaseName(fileName);
final String ext = FilenameUtils.getExtension(fileName);

if (fileObj instanceof ZipEntry) {
ZipEntry ze = (ZipEntry)fileObj;
ZipFile zf = (ZipFile)fileContainer;
System.setIn(zf.getInputStream(ze));
args.add("-outpat");
args.add(basename+"-${slideno}-"+ext+".${format}");
args.add("stdin");
} else if (fileObj instanceof SevenZArchiveEntry) {
SevenZArchiveEntry ze = (SevenZArchiveEntry)fileObj;
SevenZFile zf = (SevenZFile)fileContainer;
System.setIn(zf.getInputStream(ze));
args.add("-outpat");
args.add(basename+"-${slideno}-"+ext+".${format}");
args.add("stdin");
} else if (fileObj instanceof File) {
args.add("-outpat");
args.add("${basename}-${slideno}-${ext}.${format}");
args.add(((File)fileObj).getAbsolutePath());
}


BIN
poi-ooxml/src/test/java9/module-info.class View File


+ 1
- 0
poi-ooxml/src/test/java9/module-info.java View File

@@ -70,6 +70,7 @@ module org.apache.poi.ooxml {
exports org.apache.poi.xssf.streaming;
exports org.apache.poi.xssf.util;
exports org.apache.poi.xslf.draw;
exports org.apache.poi.xslf.draw.geom;
exports org.apache.poi.xslf.usermodel;
exports org.apache.poi.xslf.model;
exports org.apache.poi.xslf.util;

+ 17
- 11
poi/src/main/java/org/apache/poi/sl/draw/DrawSimpleShape.java View File

@@ -37,6 +37,7 @@ import org.apache.poi.sl.draw.geom.Context;
import org.apache.poi.sl.draw.geom.CustomGeometry;
import org.apache.poi.sl.draw.geom.Outline;
import org.apache.poi.sl.draw.geom.Path;
import org.apache.poi.sl.draw.geom.PathIf;
import org.apache.poi.sl.usermodel.LineDecoration;
import org.apache.poi.sl.usermodel.LineDecoration.DecorationShape;
import org.apache.poi.sl.usermodel.LineDecoration.DecorationSize;
@@ -85,7 +86,7 @@ public class DrawSimpleShape extends DrawShape {

PaintModifier pm = null;
for (Outline o : elems) {
Path path = o.getPath();
PathIf path = o.getPath();
if (path.isFilled()) {
PaintModifier pmOld = pm;
pm = path.getFill();
@@ -169,7 +170,7 @@ public class DrawSimpleShape extends DrawShape {

for(Outline o : lst){
java.awt.Shape s = o.getOutline();
Path p = o.getPath();
PathIf p = o.getPath();
graphics.setRenderingHint(Drawable.GRADIENT_SHAPE, s);

if(p.isFilled()) {
@@ -197,10 +198,12 @@ public class DrawSimpleShape extends DrawShape {
double lineWidth = Math.max(2.5, stroke.getLineWidth());

Rectangle2D anchor = getAnchor(graphics, getShape());
double x2 = anchor.getX() + anchor.getWidth(),
y2 = anchor.getY() + anchor.getHeight();

double alpha = Math.atan(anchor.getHeight() / anchor.getWidth());
double x2 = 0, y2 = 0, alpha = 0;
if (anchor != null) {
x2 = anchor.getX() + anchor.getWidth();
y2 = anchor.getY() + anchor.getHeight();
alpha = Math.atan(anchor.getHeight() / anchor.getWidth());
}

AffineTransform at = new AffineTransform();
java.awt.Shape tailShape = null;
@@ -273,9 +276,12 @@ public class DrawSimpleShape extends DrawShape {
double lineWidth = Math.max(2.5, stroke.getLineWidth());

Rectangle2D anchor = getAnchor(graphics, getShape());
double x1 = anchor.getX(), y1 = anchor.getY();

double alpha = Math.atan(anchor.getHeight() / anchor.getWidth());
double x1 = 0, y1 = 0, alpha = 0;
if (anchor != null) {
x1 = anchor.getX();
y1 = anchor.getY();
alpha = Math.atan(anchor.getHeight() / anchor.getWidth());
}

AffineTransform at = new AffineTransform();
java.awt.Shape headShape = null;
@@ -362,7 +368,7 @@ public class DrawSimpleShape extends DrawShape {

for (Outline o : outlines) {
java.awt.Shape s = o.getOutline();
Path p = o.getPath();
PathIf p = o.getPath();
graphics.setRenderingHint(Drawable.GRADIENT_SHAPE, s);
graphics.setPaint(shadowColor);

@@ -389,7 +395,7 @@ public class DrawSimpleShape extends DrawShape {
if(anchor == null) {
return lst;
}
for (Path p : geom) {
for (PathIf p : geom) {

double w = p.getW(), h = p.getH(), scaleX, scaleY;
if (w == -1) {

+ 7
- 34
poi/src/main/java/org/apache/poi/sl/draw/geom/AdjustPoint.java View File

@@ -39,66 +39,39 @@ import java.util.Objects;
*/
// @XmlAccessorType(XmlAccessType.FIELD)
// @XmlType(name = "CT_AdjPoint2D")
public class AdjustPoint {
public class AdjustPoint implements AdjustPointIf {

// @XmlAttribute(name = "x", required = true)
private String x;
// @XmlAttribute(name = "y", required = true)
private String y;


/**
* Gets the value of the x property.
*
* @return
* possible object is
* {@link String }
*
*/
@Override
public String getX() {
return x;
}

/**
* Sets the value of the x property.
*
* @param value
* allowed object is
* {@link String }
*
*/
@Override
public void setX(String value) {
this.x = value;
}

@Override
public boolean isSetX() {
return (this.x!= null);
}

/**
* Gets the value of the y property.
*
* @return
* possible object is
* {@link String }
*
*/
@Override
public String getY() {
return y;
}

/**
* Sets the value of the y property.
*
* @param value
* allowed object is
* {@link String }
*
*/
@Override
public void setY(String value) {
this.y = value;
}

@Override
public boolean isSetY() {
return (this.y!= null);
}

+ 44
- 0
poi/src/main/java/org/apache/poi/sl/draw/geom/AdjustPointIf.java View File

@@ -0,0 +1,44 @@
/* ====================================================================
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
==================================================================== */

package org.apache.poi.sl.draw.geom;

public interface AdjustPointIf {
/**
* Gets the value of the x property.
*/
String getX();

/**
* Sets the value of the x property.
*/
void setX(String value);

boolean isSetX();

/**
* Gets the value of the y property.
*/
String getY();

/**
* Sets the value of the y property.
*/
void setY(String value);

boolean isSetY();
}

+ 1
- 7
poi/src/main/java/org/apache/poi/sl/draw/geom/AdjustValue.java View File

@@ -22,12 +22,6 @@ package org.apache.poi.sl.draw.geom;
/**
* Represents a shape adjust values (see section 20.1.9.5 in the spec)
*/
public class AdjustValue extends Guide {
public class AdjustValue extends Guide implements AdjustValueIf {

@Override
public double evaluate(Context ctx){
String name = getName();
Guide adj = ctx.getAdjustValue(name);
return (adj != null) ? adj.evaluate(ctx) : super.evaluate(ctx);
}
}

+ 32
- 0
poi/src/main/java/org/apache/poi/sl/draw/geom/AdjustValueIf.java View File

@@ -0,0 +1,32 @@
/* ====================================================================
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
==================================================================== */

package org.apache.poi.sl.draw.geom;

public interface AdjustValueIf extends GuideIf {
@Override
default double evaluate(Context ctx) {
return evaluateAdjustValue(ctx);
}

default double evaluateAdjustValue(Context ctx){
String name = getName();
GuideIf adj = ctx.getAdjustValue(name);
return (adj != null) ? adj.evaluate(ctx) : evaluateGuide(ctx);
}

}

+ 26
- 31
poi/src/main/java/org/apache/poi/sl/draw/geom/ArcToCommand.java View File

@@ -19,11 +19,6 @@

package org.apache.poi.sl.draw.geom;

import static org.apache.poi.sl.draw.geom.Formula.OOXML_DEGREE;

import java.awt.geom.Arc2D;
import java.awt.geom.Path2D;
import java.awt.geom.Point2D;
import java.util.Objects;

import org.apache.poi.util.Internal;
@@ -57,7 +52,7 @@ import org.apache.poi.util.Internal;
*/
// @XmlAccessorType(XmlAccessType.FIELD)
// @XmlType(name = "CT_Path2DArcTo")
public class ArcToCommand implements PathCommand {
public class ArcToCommand implements ArcToCommandIf {

// @XmlAttribute(name = "wR", required = true)
private String wr;
@@ -68,51 +63,51 @@ public class ArcToCommand implements PathCommand {
// @XmlAttribute(name = "swAng", required = true)
private String swAng;

@Override
public void setHR(String hr) {
this.hr = hr;
}

@Override
public String getHR() {
return hr;
}

@Override
public String getStAng() {
return stAng;
}

@Override
public String getWR() {
return wr;
}

@Override
public void setWR(String wr) {
this.wr = wr;
}

@Override
public void setStAng(String stAng) {
this.stAng = stAng;
}

public void setSwAng(String swAng) {
this.swAng = swAng;
@Override
public String getSwAng() {
return swAng;
}

@Override
public void execute(Path2D.Double path, Context ctx){
double rx = ctx.getValue(wr);
double ry = ctx.getValue(hr);
double ooStart = ctx.getValue(stAng) / OOXML_DEGREE;
double ooExtent = ctx.getValue(swAng) / OOXML_DEGREE;

// skew the angles for AWT output
double awtStart = convertOoxml2AwtAngle(ooStart, rx, ry);
double awtSweep = convertOoxml2AwtAngle(ooStart+ooExtent, rx, ry)-awtStart;

// calculate the inverse angle - taken from the (reversed) preset definition
double radStart = Math.toRadians(ooStart);
double invStart = Math.atan2(rx * Math.sin(radStart), ry * Math.cos(radStart));

Point2D pt = path.getCurrentPoint();
// calculate top/left corner
double x0 = pt.getX() - rx * Math.cos(invStart) - rx;
double y0 = pt.getY() - ry * Math.sin(invStart) - ry;

Arc2D arc = new Arc2D.Double(x0, y0, 2 * rx, 2 * ry, awtStart, awtSweep, Arc2D.OPEN);
path.append(arc, true);
public void setSwAng(String swAng) {
this.swAng = swAng;
}

/**
* Arc2D angles are skewed, OOXML aren't ... so we need to unskew them<p>
*
* Furthermore ooxml angle starts at the X-axis and increases clock-wise,
* where as Arc2D api states
* Furthermore, ooxml angle starts at the X-axis and increases clock-wise,
* whereas Arc2D api states
* "45 degrees always falls on the line from the center of the ellipse to
* the upper right corner of the framing rectangle"
* so we need to reverse it

+ 72
- 0
poi/src/main/java/org/apache/poi/sl/draw/geom/ArcToCommandIf.java View File

@@ -0,0 +1,72 @@
/*
* ====================================================================
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* ====================================================================
*/

package org.apache.poi.sl.draw.geom;

import static org.apache.poi.sl.draw.geom.Formula.OOXML_DEGREE;

import java.awt.geom.Arc2D;
import java.awt.geom.Path2D;
import java.awt.geom.Point2D;

public interface ArcToCommandIf extends PathCommand {

void setHR(String hr);

void setWR(String wr);

void setStAng(String stAng);

void setSwAng(String swAng);

String getHR();

String getWR();

String getStAng();

String getSwAng();


@Override
default void execute(Path2D.Double path, Context ctx){
double rx = ctx.getValue(getWR());
double ry = ctx.getValue(getHR());
double ooStart = ctx.getValue(getStAng()) / OOXML_DEGREE;
double ooExtent = ctx.getValue(getSwAng()) / OOXML_DEGREE;

// skew the angles for AWT output
double awtStart = ArcToCommand.convertOoxml2AwtAngle(ooStart, rx, ry);
double awtSweep = ArcToCommand.convertOoxml2AwtAngle(ooStart+ooExtent, rx, ry)-awtStart;

// calculate the inverse angle - taken from the (reversed) preset definition
double radStart = Math.toRadians(ooStart);
double invStart = Math.atan2(rx * Math.sin(radStart), ry * Math.cos(radStart));

Point2D pt = path.getCurrentPoint();
// calculate top/left corner
double x0 = pt.getX() - rx * Math.cos(invStart) - rx;
double y0 = pt.getY() - ry * Math.sin(invStart) - ry;

Arc2D arc = new Arc2D.Double(x0, y0, 2 * rx, 2 * ry, awtStart, awtSweep, Arc2D.OPEN);
path.append(arc, true);
}


}

+ 1
- 1
poi/src/main/java/org/apache/poi/sl/draw/geom/ClosePathCommand.java View File

@@ -39,7 +39,7 @@ import java.awt.geom.Path2D;
*/
// @XmlAccessorType(XmlAccessType.FIELD)
// @XmlType(name = "CT_Path2DClose")
public class ClosePathCommand implements PathCommand {
public class ClosePathCommand implements ClosePathCommandIf {

@Override
public void execute(Path2D.Double path, Context ctx){

+ 23
- 0
poi/src/main/java/org/apache/poi/sl/draw/geom/ClosePathCommandIf.java View File

@@ -0,0 +1,23 @@
/*
* ====================================================================
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* ====================================================================
*/

package org.apache.poi.sl.draw.geom;

public interface ClosePathCommandIf extends PathCommand {
}

+ 7
- 34
poi/src/main/java/org/apache/poi/sl/draw/geom/ConnectionSite.java View File

@@ -41,64 +41,37 @@ import java.util.Objects;
*/
// @XmlAccessorType(XmlAccessType.FIELD)
// @XmlType(name = "CT_ConnectionSite", propOrder = {"pos"})
public final class ConnectionSite {
public final class ConnectionSite implements ConnectionSiteIf {

// @XmlElement(required = true)
private final AdjustPoint pos = new AdjustPoint();
// @XmlAttribute(name = "ang", required = true)
private String ang;

/**
* Gets the value of the pos property.
*
* @return
* possible object is
* {@link AdjustPoint }
*
*/
@Override
public AdjustPoint getPos() {
return pos;
}

/**
* Sets the value of the pos property.
*
* @param pos
* allowed object is
* {@link AdjustPoint }
*
*/
public void setPos(AdjustPoint pos) {
@Override
public void setPos(AdjustPointIf pos) {
if (pos != null) {
this.pos.setX(pos.getX());
this.pos.setY(pos.getY());
}
}

/**
* Gets the value of the ang property.
*
* @return
* possible object is
* {@link String }
*
*/
@Override
public String getAng() {
return ang;
}

/**
* Sets the value of the ang property.
*
* @param value
* allowed object is
* {@link String }
*
*/
@Override
public void setAng(String value) {
this.ang = value;
}

@Override
public boolean isSetAng() {
return (this.ang!= null);
}

+ 44
- 0
poi/src/main/java/org/apache/poi/sl/draw/geom/ConnectionSiteIf.java View File

@@ -0,0 +1,44 @@
/* ====================================================================
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
==================================================================== */

package org.apache.poi.sl.draw.geom;

public interface ConnectionSiteIf {

/**
* Gets the value of the pos property.
*/
AdjustPointIf getPos();

/**
* Sets the value of the pos property.
*/
void setPos(AdjustPointIf pos);

/**
* Gets the value of the ang property.
*/
String getAng();

/**
* Sets the value of the ang property.
*/
void setAng(String value);

boolean isSetAng();

}

+ 6
- 6
poi/src/main/java/org/apache/poi/sl/draw/geom/Context.java View File

@@ -34,14 +34,14 @@ public class Context {
private final Map<String, Double> _ctx = new HashMap<>();
private final IAdjustableShape _props;
private final Rectangle2D _anchor;
public Context(CustomGeometry geom, Rectangle2D anchor, IAdjustableShape props){
_props = props;
_anchor = anchor;
for(Guide gd : geom.adjusts) {
for(GuideIf gd : geom.adjusts) {
evaluate(gd);
}
for(Guide gd : geom.guides) {
for(GuideIf gd : geom.guides) {
evaluate(gd);
}
}
@@ -50,7 +50,7 @@ public class Context {
return _anchor;
}

Guide getAdjustValue(String name){
GuideIf getAdjustValue(String name){
return _props.getAdjustValue(name);
}

@@ -65,8 +65,8 @@ public class Context {

public double evaluate(Formula fmla){
double result = fmla.evaluate(this);
if (fmla instanceof Guide) {
String key = ((Guide)fmla).getName();
if (fmla instanceof GuideIf) {
String key = ((GuideIf)fmla).getName();
if (key != null) {
_ctx.put(key, result);
}

+ 22
- 15
poi/src/main/java/org/apache/poi/sl/draw/geom/CurveToCommand.java View File

@@ -43,7 +43,7 @@ import java.util.Objects;
*/
// @XmlAccessorType(XmlAccessType.FIELD)
// @XmlType(name = "CT_Path2DCubicBezierTo", propOrder = {"pt"})
public final class CurveToCommand implements PathCommand {
public final class CurveToCommand implements CurveToCommandIf {

// @XmlElement(required = true)
private final AdjustPoint pt1 = new AdjustPoint();
@@ -52,38 +52,45 @@ public final class CurveToCommand implements PathCommand {
// @XmlElement(required = true)
private final AdjustPoint pt3 = new AdjustPoint();

public void setPt1(AdjustPoint pt1) {
@Override
public AdjustPoint getPt1() {
return pt1;
}

@Override
public void setPt1(AdjustPointIf pt1) {
if (pt1 != null) {
this.pt1.setX(pt1.getX());
this.pt1.setY(pt1.getY());
}
}

public void setPt2(AdjustPoint pt2) {
@Override
public AdjustPoint getPt2() {
return pt2;
}

@Override
public void setPt2(AdjustPointIf pt2) {
if (pt2 != null) {
this.pt2.setX(pt2.getX());
this.pt2.setY(pt2.getY());
}
}

public void setPt3(AdjustPoint pt3) {
@Override
public AdjustPoint getPt3() {
return pt3;
}

@Override
public void setPt3(AdjustPointIf pt3) {
if (pt3 != null) {
this.pt3.setX(pt3.getX());
this.pt3.setY(pt3.getY());
}
}

@Override
public void execute(Path2D.Double path, Context ctx){
double x1 = ctx.getValue(pt1.getX());
double y1 = ctx.getValue(pt1.getY());
double x2 = ctx.getValue(pt2.getX());
double y2 = ctx.getValue(pt2.getY());
double x3 = ctx.getValue(pt3.getX());
double y3 = ctx.getValue(pt3.getY());
path.curveTo(x1, y1, x2, y2, x3, y3);
}

@Override
public boolean equals(Object o) {
if (this == o) return true;

+ 50
- 0
poi/src/main/java/org/apache/poi/sl/draw/geom/CurveToCommandIf.java View File

@@ -0,0 +1,50 @@
/* ====================================================================
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
==================================================================== */

package org.apache.poi.sl.draw.geom;

import java.awt.geom.Path2D;

public interface CurveToCommandIf extends PathCommand {

AdjustPointIf getPt1();

void setPt1(AdjustPointIf pt1);

AdjustPointIf getPt2();

void setPt2(AdjustPointIf pt2);

AdjustPointIf getPt3();

void setPt3(AdjustPointIf pt3);


@Override
default void execute(Path2D.Double path, Context ctx){
AdjustPointIf pt1 = getPt1();
double x1 = ctx.getValue(pt1.getX());
double y1 = ctx.getValue(pt1.getY());
AdjustPointIf pt2 = getPt2();
double x2 = ctx.getValue(pt2.getX());
double y2 = ctx.getValue(pt2.getY());
AdjustPointIf pt3 = getPt3();
double x3 = ctx.getValue(pt3.getX());
double y3 = ctx.getValue(pt3.getY());
path.curveTo(x1, y1, x2, y2, x3, y3);
}
}

+ 10
- 10
poi/src/main/java/org/apache/poi/sl/draw/geom/CustomGeometry.java View File

@@ -49,19 +49,19 @@ import java.util.Objects;
* &lt;/complexType&gt;
* </pre>
*/
public final class CustomGeometry implements Iterable<Path>{
final List<AdjustValue> adjusts = new ArrayList<>();
final List<Guide> guides = new ArrayList<>();
final List<Path> paths = new ArrayList<>();
public final class CustomGeometry implements Iterable<PathIf>{
final List<AdjustValueIf> adjusts = new ArrayList<>();
final List<GuideIf> guides = new ArrayList<>();
final List<PathIf> paths = new ArrayList<>();
final List<AdjustHandle> handles = new ArrayList<>();
final List<ConnectionSite> connections = new ArrayList<>();
final List<ConnectionSiteIf> connections = new ArrayList<>();
Path textBounds;

public void addAdjustGuide(AdjustValue guide) {
public void addAdjustGuide(AdjustValueIf guide) {
adjusts.add(guide);
}

public void addGeomGuide(Guide guide) {
public void addGeomGuide(GuideIf guide) {
guides.add(guide);
}

@@ -69,11 +69,11 @@ public final class CustomGeometry implements Iterable<Path>{
handles.add(handle);
}

public void addConnectionSite(ConnectionSite connection) {
public void addConnectionSite(ConnectionSiteIf connection) {
connections.add(connection);
}

public void addPath(Path path) {
public void addPath(PathIf path) {
paths.add(path);
}

@@ -106,7 +106,7 @@ public final class CustomGeometry implements Iterable<Path>{


@Override
public Iterator<Path> iterator() {
public Iterator<PathIf> iterator() {
return paths.iterator();
}


+ 5
- 83
poi/src/main/java/org/apache/poi/sl/draw/geom/Guide.java View File

@@ -19,10 +19,7 @@

package org.apache.poi.sl.draw.geom;

import static java.lang.Math.*;

import java.util.Objects;
import java.util.regex.Pattern;

/**
* <p>Java class for CT_GeomGuide complex type.
@@ -44,12 +41,7 @@ import java.util.regex.Pattern;
*/
// @XmlAccessorType(XmlAccessType.FIELD)
// @XmlType(name = "CT_GeomGuide")
public class Guide implements Formula {
enum Op {
muldiv,addsub,adddiv,ifelse,val,abs,sqrt,max,min,at2,sin,cos,tan,cat2,sat2,pin,mod
}

private static final Pattern WHITESPACE = Pattern.compile("\\s+");
public class Guide implements GuideIf {

// @XmlAttribute(name = "name", required = true)
// @XmlJavaTypeAdapter(CollapsedStringAdapter.class)
@@ -57,97 +49,27 @@ public class Guide implements Formula {
// @XmlAttribute(name = "fmla", required = true)
private String fmla;

private Op op;
private String[] operands;

@Override
public String getName(){
return name;
}

@Override
public void setName(String name) {
this.name = name;
}

@Override
public String getFmla() {
return fmla;
}

@Override
public void setFmla(String fmla) {
this.fmla = fmla;
operands = WHITESPACE.split(fmla);
switch (operands[0]) {
case "*/": op = Op.muldiv; break;
case "+-": op = Op.addsub; break;
case "+/": op = Op.adddiv; break;
case "?:": op = Op.ifelse; break;
default: op = Op.valueOf(operands[0]); break;
}
}

@Override
public double evaluate(Context ctx) {
double x = (operands.length > 1) ? ctx.getValue(operands[1]) : 0;
double y = (operands.length > 2) ? ctx.getValue(operands[2]) : 0;
double z = (operands.length > 3) ? ctx.getValue(operands[3]) : 0;
switch (op) {
case abs:
// Absolute Value Formula
return abs(x);
case adddiv:
// Add Divide Formula
return (z == 0) ? 0 : (x + y) / z;
case addsub:
// Add Subtract Formula
return (x + y) - z;
case at2:
// ArcTan Formula: "at2 x y" = arctan( y / z ) = value of this guide
return toDegrees(atan2(y, x)) * OOXML_DEGREE;
case cos:
// Cosine Formula: "cos x y" = (x * cos( y )) = value of this guide
return x * cos(toRadians(y / OOXML_DEGREE));
case cat2:
// Cosine ArcTan Formula: "cat2 x y z" = (x * cos(arctan(z / y) )) = value of this guide
return x * cos(atan2(z, y));
case ifelse:
// If Else Formula: "?: x y z" = if (x > 0), then y = value of this guide,
// else z = value of this guide
return x > 0 ? y : z;
case val:
// Literal Value Expression
return x;
case max:
// Maximum Value Formula
return max(x, y);
case min:
// Minimum Value Formula
return min(x, y);
case mod:
// Modulo Formula: "mod x y z" = sqrt(x^2 + b^2 + c^2) = value of this guide
return sqrt(x*x + y*y + z*z);
case muldiv:
// Multiply Divide Formula
return (z == 0) ? 0 : (x * y) / z;
case pin:
// Pin To Formula: "pin x y z" = if (y < x), then x = value of this guide
// else if (y > z), then z = value of this guide
// else y = value of this guide
return max(x, min(y, z));
case sat2:
// Sine ArcTan Formula: "sat2 x y z" = (x*sin(arctan(z / y))) = value of this guide
return x * sin(atan2(z, y));
case sin:
// Sine Formula: "sin x y" = (x * sin( y )) = value of this guide
return x * sin(toRadians(y / OOXML_DEGREE));
case sqrt:
// Square Root Formula: "sqrt x" = sqrt(x) = value of this guide
return sqrt(x);
case tan:
// Tangent Formula: "tan x y" = (x * tan( y )) = value of this guide
return x * tan(toRadians(y / OOXML_DEGREE));
default:
return 0;
}
}

@Override
public boolean equals(Object o) {

+ 120
- 0
poi/src/main/java/org/apache/poi/sl/draw/geom/GuideIf.java View File

@@ -0,0 +1,120 @@
/*
* ====================================================================
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* ====================================================================
*/

package org.apache.poi.sl.draw.geom;

import static java.lang.Math.*;
import static java.lang.Math.toRadians;

import java.util.regex.Pattern;

public interface GuideIf extends Formula {
enum Op {
muldiv,addsub,adddiv,ifelse,val,abs,sqrt,max,min,at2,sin,cos,tan,cat2,sat2,pin,mod
}

Pattern WHITESPACE = Pattern.compile("\\s+");

String getName();

void setName(String name);

String getFmla();

void setFmla(String fmla);

@Override
default double evaluate(Context ctx) {
return evaluateGuide(ctx);
}

default double evaluateGuide(Context ctx) {
Guide.Op op;
String[] operands = WHITESPACE.split(getFmla());
switch (operands[0]) {
case "*/": op = Guide.Op.muldiv; break;
case "+-": op = Guide.Op.addsub; break;
case "+/": op = Guide.Op.adddiv; break;
case "?:": op = Guide.Op.ifelse; break;
default: op = Guide.Op.valueOf(operands[0]); break;
}

double x = (operands.length > 1) ? ctx.getValue(operands[1]) : 0;
double y = (operands.length > 2) ? ctx.getValue(operands[2]) : 0;
double z = (operands.length > 3) ? ctx.getValue(operands[3]) : 0;
switch (op) {
case abs:
// Absolute Value Formula
return abs(x);
case adddiv:
// Add Divide Formula
return (z == 0) ? 0 : (x + y) / z;
case addsub:
// Add Subtract Formula
return (x + y) - z;
case at2:
// ArcTan Formula: "at2 x y" = arctan( y / z ) = value of this guide
return toDegrees(atan2(y, x)) * OOXML_DEGREE;
case cos:
// Cosine Formula: "cos x y" = (x * cos( y )) = value of this guide
return x * cos(toRadians(y / OOXML_DEGREE));
case cat2:
// Cosine ArcTan Formula: "cat2 x y z" = (x * cos(arctan(z / y) )) = value of this guide
return x * cos(atan2(z, y));
case ifelse:
// If Else Formula: "?: x y z" = if (x > 0), then y = value of this guide,
// else z = value of this guide
return x > 0 ? y : z;
case val:
// Literal Value Expression
return x;
case max:
// Maximum Value Formula
return max(x, y);
case min:
// Minimum Value Formula
return min(x, y);
case mod:
// Modulo Formula: "mod x y z" = sqrt(x^2 + b^2 + c^2) = value of this guide
return sqrt(x*x + y*y + z*z);
case muldiv:
// Multiply Divide Formula
return (z == 0) ? 0 : (x * y) / z;
case pin:
// Pin To Formula: "pin x y z" = if (y < x), then x = value of this guide
// else if (y > z), then z = value of this guide
// else y = value of this guide
return max(x, min(y, z));
case sat2:
// Sine ArcTan Formula: "sat2 x y z" = (x*sin(arctan(z / y))) = value of this guide
return x * sin(atan2(z, y));
case sin:
// Sine Formula: "sin x y" = (x * sin( y )) = value of this guide
return x * sin(toRadians(y / OOXML_DEGREE));
case sqrt:
// Square Root Formula: "sqrt x" = sqrt(x) = value of this guide
return sqrt(x);
case tan:
// Tangent Formula: "tan x y" = (x * tan( y )) = value of this guide
return x * tan(toRadians(y / OOXML_DEGREE));
default:
return 0;
}
}
}

+ 1
- 1
poi/src/main/java/org/apache/poi/sl/draw/geom/IAdjustableShape.java View File

@@ -31,5 +31,5 @@ public interface IAdjustableShape {
* @param name name of a adjust value, e.g. adj1
* @return adjust guide defined in the shape or null
*/
Guide getAdjustValue(String name);
GuideIf getAdjustValue(String name);
}

+ 4
- 10
poi/src/main/java/org/apache/poi/sl/draw/geom/LineToCommand.java View File

@@ -19,7 +19,6 @@

package org.apache.poi.sl.draw.geom;

import java.awt.geom.Path2D;
import java.util.Objects;

/**
@@ -43,29 +42,24 @@ import java.util.Objects;
*/
// @XmlAccessorType(XmlAccessType.FIELD)
// @XmlType(name = "CT_Path2DLineTo", propOrder = {"pt"})
public final class LineToCommand implements PathCommand {
public final class LineToCommand implements LineToCommandIf {

// @XmlElement(required = true)
private final AdjustPoint pt = new AdjustPoint();

@Override
public AdjustPoint getPt() {
return pt;
}

public void setPt(AdjustPoint pt) {
@Override
public void setPt(AdjustPointIf pt) {
if (pt != null) {
this.pt.setX(pt.getX());
this.pt.setY(pt.getY());
}
}

@Override
public void execute(Path2D.Double path, Context ctx){
double x = ctx.getValue(pt.getX());
double y = ctx.getValue(pt.getY());
path.lineTo(x, y);
}


@Override
public boolean equals(Object o) {

+ 35
- 0
poi/src/main/java/org/apache/poi/sl/draw/geom/LineToCommandIf.java View File

@@ -0,0 +1,35 @@
/* ====================================================================
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
==================================================================== */

package org.apache.poi.sl.draw.geom;

import java.awt.geom.Path2D;

public interface LineToCommandIf extends PathCommand {

AdjustPointIf getPt();

void setPt(AdjustPointIf pt);

@Override
default void execute(Path2D.Double path, Context ctx){
AdjustPointIf pt = getPt();
double x = ctx.getValue(pt.getX());
double y = ctx.getValue(pt.getY());
path.lineTo(x, y);
}
}

+ 4
- 11
poi/src/main/java/org/apache/poi/sl/draw/geom/MoveToCommand.java View File

@@ -19,7 +19,6 @@

package org.apache.poi.sl.draw.geom;

import java.awt.geom.Path2D;
import java.util.Objects;

/**
@@ -43,30 +42,24 @@ import java.util.Objects;
*/
// @XmlAccessorType(XmlAccessType.FIELD)
// @XmlType(name = "CT_Path2DMoveTo", propOrder = {"pt"})
public final class MoveToCommand implements PathCommand {
public final class MoveToCommand implements MoveToCommandIf {

// @XmlElement(required = true)
private final AdjustPoint pt = new AdjustPoint();

@Override
public AdjustPoint getPt() {
return pt;
}

public void setPt(AdjustPoint pt) {
@Override
public void setPt(AdjustPointIf pt) {
if (pt != null) {
this.pt.setX(pt.getX());
this.pt.setY(pt.getY());
}
}

@Override
public void execute(Path2D.Double path, Context ctx){
double x = ctx.getValue(pt.getX());
double y = ctx.getValue(pt.getY());
path.moveTo(x, y);
}


@Override
public boolean equals(Object o) {
if (this == o) return true;

+ 35
- 0
poi/src/main/java/org/apache/poi/sl/draw/geom/MoveToCommandIf.java View File

@@ -0,0 +1,35 @@
/* ====================================================================
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
==================================================================== */

package org.apache.poi.sl.draw.geom;

import java.awt.geom.Path2D;

public interface MoveToCommandIf extends PathCommand {

AdjustPointIf getPt();

void setPt(AdjustPointIf pt);

@Override
default void execute(Path2D.Double path, Context ctx){
AdjustPointIf pt = getPt();
double x = ctx.getValue(pt.getX());
double y = ctx.getValue(pt.getY());
path.moveTo(x, y);
}
}

+ 4
- 4
poi/src/main/java/org/apache/poi/sl/draw/geom/Outline.java View File

@@ -22,15 +22,15 @@ package org.apache.poi.sl.draw.geom;
import java.awt.Shape;

public class Outline {
private Shape shape;
private Path path;
private final Shape shape;
private final PathIf path;

public Outline(Shape shape, Path path){
public Outline(Shape shape, PathIf path){
this.shape = shape;
this.path = path;
}

public Path getPath(){
public PathIf getPath(){
return path;
}


+ 14
- 1
poi/src/main/java/org/apache/poi/sl/draw/geom/Path.java View File

@@ -58,7 +58,7 @@ import org.apache.poi.sl.usermodel.PaintStyle.PaintModifier;
*/
// @XmlAccessorType(XmlAccessType.FIELD)
// @XmlType(name = "CT_Path2D", propOrder = {"closeOrMoveToOrLnTo"})
public final class Path {
public final class Path implements PathIf {

// @XmlElements({
// @XmlElement(name = "close", type = CTPath2DClose.class),
@@ -82,6 +82,7 @@ public final class Path {



@Override
public void addCommand(PathCommand cmd){
commands.add(cmd);
}
@@ -89,6 +90,7 @@ public final class Path {
/**
* Convert the internal represenation to java.awt.geom.Path2D
*/
@Override
public Path2D.Double getPath(Context ctx) {
Path2D.Double path = new Path2D.Double();
for(PathCommand cmd : commands) {
@@ -97,46 +99,57 @@ public final class Path {
return path;
}

@Override
public boolean isStroked(){
return stroke;
}

@Override
public void setStroke(boolean stroke) {
this.stroke = stroke;
}

@Override
public boolean isFilled(){
return fill != PaintModifier.NONE;
}

@Override
public PaintModifier getFill() {
return fill;
}

@Override
public void setFill(PaintModifier fill) {
this.fill = fill;
}

@Override
public long getW(){
return w;
}

@Override
public void setW(long w) {
this.w = w;
}

@Override
public long getH(){
return h;
}

@Override
public void setH(long h) {
this.h = h;
}

@Override
public boolean isExtrusionOk() {
return extrusionOk;
}

@Override
public void setExtrusionOk(boolean extrusionOk) {
this.extrusionOk = extrusionOk;
}

+ 55
- 0
poi/src/main/java/org/apache/poi/sl/draw/geom/PathIf.java View File

@@ -0,0 +1,55 @@
/* ====================================================================
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
==================================================================== */

package org.apache.poi.sl.draw.geom;

import java.awt.geom.Path2D;

import org.apache.poi.sl.usermodel.PaintStyle;

public interface PathIf {

void addCommand(PathCommand cmd);

/**
* Convert the internal represenation to java.awt.geom.Path2D
*/
Path2D.Double getPath(Context ctx);

boolean isStroked();

void setStroke(boolean stroke);

boolean isFilled();

PaintStyle.PaintModifier getFill();

void setFill(PaintStyle.PaintModifier fill);

long getW();

void setW(long w);

long getH();

void setH(long h);

boolean isExtrusionOk();

void setExtrusionOk(boolean extrusionOk);

}

+ 1
- 19
poi/src/main/java/org/apache/poi/sl/draw/geom/PresetGeometries.java View File

@@ -31,13 +31,9 @@ import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader;
import javax.xml.transform.stream.StreamSource;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.poi.util.XMLHelper;

public final class PresetGeometries {
private static final Logger LOG = LogManager.getLogger(PresetGeometries.class);

private final Map<String, CustomGeometry> map = new TreeMap<>();

private static class SingletonHelper{
@@ -57,7 +53,7 @@ public final class PresetGeometries {
try {
PresetParser p = new PresetParser(PresetParser.Mode.FILE);
p.parse(sr);
p.getGeom().forEach(map::put);
map.putAll(p.getGeom());
} finally {
sr.close();
}
@@ -67,20 +63,6 @@ public final class PresetGeometries {
}
}

/**
* Convert a single CustomGeometry object, i.e. from xmlbeans
*/
public static CustomGeometry convertCustomGeometry(XMLStreamReader staxReader) {
try {
PresetParser p = new PresetParser(PresetParser.Mode.SHAPE);
p.parse(staxReader);
return p.getGeom().values().stream().findFirst().orElse(null);
} catch (XMLStreamException e) {
LOG.atError().withThrowable(e).log("Unable to parse single custom geometry");
return null;
}
}

public CustomGeometry get(String name) {
return name == null ? null : map.get(name);
}

+ 15
- 13
poi/src/main/java/org/apache/poi/sl/draw/geom/QuadToCommand.java View File

@@ -19,7 +19,6 @@

package org.apache.poi.sl.draw.geom;

import java.awt.geom.Path2D;
import java.util.Objects;

/**
@@ -43,36 +42,39 @@ import java.util.Objects;
*/
// @XmlAccessorType(XmlAccessType.FIELD)
// @XmlType(name = "CT_Path2DQuadBezierTo", propOrder = {"pt"})
public final class QuadToCommand implements PathCommand {
public final class QuadToCommand implements QuadToCommandIf {

// @XmlElement(required = true)
private final AdjustPoint pt1 = new AdjustPoint();
// @XmlElement(required = true)
private final AdjustPoint pt2 = new AdjustPoint();

public void setPt1(AdjustPoint pt1) {
@Override
public AdjustPoint getPt1() {
return pt1;
}

@Override
public void setPt1(AdjustPointIf pt1) {
if (pt1 != null) {
this.pt1.setX(pt1.getX());
this.pt1.setY(pt1.getY());
}
}

public void setPt2(AdjustPoint pt2) {
@Override
public AdjustPoint getPt2() {
return pt2;
}

@Override
public void setPt2(AdjustPointIf pt2) {
if (pt2 != null) {
this.pt2.setX(pt2.getX());
this.pt2.setY(pt2.getY());
}
}

@Override
public void execute(Path2D.Double path, Context ctx){
double x1 = ctx.getValue(pt1.getX());
double y1 = ctx.getValue(pt1.getY());
double x2 = ctx.getValue(pt2.getX());
double y2 = ctx.getValue(pt2.getY());
path.quadTo(x1, y1, x2, y2);
}

@Override
public boolean equals(Object o) {
if (this == o) return true;

+ 42
- 0
poi/src/main/java/org/apache/poi/sl/draw/geom/QuadToCommandIf.java View File

@@ -0,0 +1,42 @@
/* ====================================================================
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
==================================================================== */

package org.apache.poi.sl.draw.geom;

import java.awt.geom.Path2D;

public interface QuadToCommandIf extends PathCommand {

AdjustPointIf getPt1();

void setPt1(AdjustPointIf pt1);

AdjustPointIf getPt2();

void setPt2(AdjustPointIf pt2);

@Override
default void execute(Path2D.Double path, Context ctx){
AdjustPointIf pt1 = getPt1();
double x1 = ctx.getValue(pt1.getX());
double y1 = ctx.getValue(pt1.getY());
AdjustPointIf pt2 = getPt2();
double x2 = ctx.getValue(pt2.getX());
double y2 = ctx.getValue(pt2.getY());
path.quadTo(x1, y1, x2, y2);
}
}

+ 1
- 24
poi/src/test/java/org/apache/poi/sl/draw/geom/TestPresetGeometries.java View File

@@ -24,10 +24,7 @@ import static org.junit.jupiter.api.Assertions.assertSame;

import java.awt.geom.Path2D;
import java.awt.geom.Rectangle2D;
import java.net.URL;
import java.util.Enumeration;

import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;

class TestPresetGeometries {
@@ -40,7 +37,7 @@ class TestPresetGeometries {
for(String name : shapes.keySet()) {
CustomGeometry geom = shapes.get(name);
Context ctx = new Context(geom, new Rectangle2D.Double(0, 0, 100, 100), presetName -> null);
for(Path p : geom){
for(PathIf p : geom){
Path2D path = p.getPath(ctx);
assertNotNull(path);
}
@@ -49,24 +46,4 @@ class TestPresetGeometries {
// we get the same instance on further calls
assertSame(shapes, PresetGeometries.getInstance());
}

@Disabled("problem solved? Turn back on if this debugging is still in process.")
void testCheckXMLParser() throws Exception{
// Gump reports a strange error because of an unavailable XML Parser, let's try to find out where
// this comes from
//
Enumeration<URL> resources = this.getClass().getClassLoader().getResources("META-INF/services/javax.xml.stream.XMLEventFactory");
printURLs(resources);
resources = ClassLoader.getSystemResources("META-INF/services/javax.xml.stream.XMLEventFactory");
printURLs(resources);
resources = ClassLoader.getSystemResources("org/apache/poi/sl/draw/geom/presetShapeDefinitions.xml");
printURLs(resources);
}

private void printURLs(Enumeration<URL> resources) {
while(resources.hasMoreElements()) {
URL url = resources.nextElement();
System.out.println("URL: " + url);
}
}
}

Loading…
Cancel
Save