mirror of https://github.com/apache/poi.git
#59004 - HSLF rendering - adjust values for presetShapeDefinition differs in HSLF/XSLF
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1859102 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
4e663c4b5d
commit
049baa86d7
|
@ -316,7 +316,7 @@ public class DrawSimpleShape extends DrawShape {
|
||||||
Color shadowColor = DrawPaint.applyColorTransform(shadowPaint.getSolidColor());
|
Color shadowColor = DrawPaint.applyColorTransform(shadowPaint.getSolidColor());
|
||||||
|
|
||||||
double shapeRotation = getShape().getRotation();
|
double shapeRotation = getShape().getRotation();
|
||||||
if(getShape().getFlipVertical()) {
|
if (getShape().getFlipVertical()) {
|
||||||
shapeRotation += 180;
|
shapeRotation += 180;
|
||||||
}
|
}
|
||||||
double angle = shadow.getAngle() - shapeRotation;
|
double angle = shadow.getAngle() - shapeRotation;
|
||||||
|
@ -326,13 +326,13 @@ public class DrawSimpleShape extends DrawShape {
|
||||||
|
|
||||||
graphics.translate(dx, dy);
|
graphics.translate(dx, dy);
|
||||||
|
|
||||||
for(Outline o : outlines){
|
for (Outline o : outlines) {
|
||||||
java.awt.Shape s = o.getOutline();
|
java.awt.Shape s = o.getOutline();
|
||||||
Path p = o.getPath();
|
Path p = o.getPath();
|
||||||
graphics.setRenderingHint(Drawable.GRADIENT_SHAPE, s);
|
graphics.setRenderingHint(Drawable.GRADIENT_SHAPE, s);
|
||||||
graphics.setPaint(shadowColor);
|
graphics.setPaint(shadowColor);
|
||||||
|
|
||||||
if(fill != null && p.isFilled()){
|
if (fill != null && p.isFilled()) {
|
||||||
fillPaintWorkaround(graphics, s);
|
fillPaintWorkaround(graphics, s);
|
||||||
} else if (line != null && p.isStroked()) {
|
} else if (line != null && p.isStroked()) {
|
||||||
graphics.draw(s);
|
graphics.draw(s);
|
||||||
|
@ -342,65 +342,6 @@ public class DrawSimpleShape extends DrawShape {
|
||||||
graphics.translate(-dx, -dy);
|
graphics.translate(-dx, -dy);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected static CustomGeometry getCustomGeometry(String name) {
|
|
||||||
return getCustomGeometry(name, null);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected static CustomGeometry getCustomGeometry(String name, Graphics2D graphics) {
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
Map<String, CustomGeometry> presets = (graphics == null)
|
|
||||||
? null
|
|
||||||
: (Map<String, CustomGeometry>)graphics.getRenderingHint(Drawable.PRESET_GEOMETRY_CACHE);
|
|
||||||
|
|
||||||
if (presets == null) {
|
|
||||||
presets = new HashMap<>();
|
|
||||||
if (graphics != null) {
|
|
||||||
graphics.setRenderingHint(Drawable.PRESET_GEOMETRY_CACHE, presets);
|
|
||||||
}
|
|
||||||
|
|
||||||
String packageName = "org.apache.poi.sl.draw.binding";
|
|
||||||
InputStream presetIS = Drawable.class.getResourceAsStream("presetShapeDefinitions.xml");
|
|
||||||
|
|
||||||
// StAX:
|
|
||||||
EventFilter startElementFilter = new EventFilter() {
|
|
||||||
@Override
|
|
||||||
public boolean accept(XMLEvent event) {
|
|
||||||
return event.isStartElement();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
try {
|
|
||||||
XMLInputFactory staxFactory = StaxHelper.newXMLInputFactory();
|
|
||||||
XMLEventReader staxReader = staxFactory.createXMLEventReader(presetIS);
|
|
||||||
XMLEventReader staxFiltRd = staxFactory.createFilteredReader(staxReader, startElementFilter);
|
|
||||||
// Ignore StartElement:
|
|
||||||
staxFiltRd.nextEvent();
|
|
||||||
// JAXB:
|
|
||||||
JAXBContext jaxbContext = JAXBContext.newInstance(packageName);
|
|
||||||
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
|
|
||||||
|
|
||||||
while (staxFiltRd.peek() != null) {
|
|
||||||
StartElement evRoot = (StartElement)staxFiltRd.peek();
|
|
||||||
String cusName = evRoot.getName().getLocalPart();
|
|
||||||
// XMLEvent ev = staxReader.nextEvent();
|
|
||||||
JAXBElement<org.apache.poi.sl.draw.binding.CTCustomGeometry2D> el = unmarshaller.unmarshal(staxReader, CTCustomGeometry2D.class);
|
|
||||||
CTCustomGeometry2D cusGeom = el.getValue();
|
|
||||||
|
|
||||||
presets.put(cusName, new CustomGeometry(cusGeom));
|
|
||||||
}
|
|
||||||
|
|
||||||
staxFiltRd.close();
|
|
||||||
staxReader.close();
|
|
||||||
} catch (Exception e) {
|
|
||||||
throw new RuntimeException("Unable to load preset geometries.", e);
|
|
||||||
} finally {
|
|
||||||
IOUtils.closeQuietly(presetIS);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return presets.get(name);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected Collection<Outline> computeOutlines(Graphics2D graphics) {
|
protected Collection<Outline> computeOutlines(Graphics2D graphics) {
|
||||||
final SimpleShape<?,?> sh = getShape();
|
final SimpleShape<?,?> sh = getShape();
|
||||||
|
|
||||||
|
|
|
@ -51,8 +51,7 @@ public class Context {
|
||||||
}
|
}
|
||||||
|
|
||||||
Guide getAdjustValue(String name){
|
Guide getAdjustValue(String name){
|
||||||
// ignore HSLF props for now ... the results with default value are usually better - see #59004
|
return _props.getAdjustValue(name);
|
||||||
return (_props.getClass().getName().contains("hslf")) ? null : _props.getAdjustValue(name);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public double getValue(String key){
|
public double getValue(String key){
|
||||||
|
|
|
@ -321,8 +321,10 @@ public abstract class HSLFSimpleShape extends HSLFShape implements SimpleShape<H
|
||||||
name = "1";
|
name = "1";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
final int adjInt = Integer.parseInt(name);
|
||||||
|
|
||||||
short escherProp;
|
short escherProp;
|
||||||
switch (Integer.parseInt(name)) {
|
switch (adjInt) {
|
||||||
case 1: escherProp = EscherProperties.GEOMETRY__ADJUSTVALUE; break;
|
case 1: escherProp = EscherProperties.GEOMETRY__ADJUSTVALUE; break;
|
||||||
case 2: escherProp = EscherProperties.GEOMETRY__ADJUST2VALUE; break;
|
case 2: escherProp = EscherProperties.GEOMETRY__ADJUST2VALUE; break;
|
||||||
case 3: escherProp = EscherProperties.GEOMETRY__ADJUST3VALUE; break;
|
case 3: escherProp = EscherProperties.GEOMETRY__ADJUST3VALUE; break;
|
||||||
|
@ -336,14 +338,36 @@ public abstract class HSLFSimpleShape extends HSLFShape implements SimpleShape<H
|
||||||
default: throw new HSLFException();
|
default: throw new HSLFException();
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: the adjust values need to be corrected somehow depending on the shape width/height
|
|
||||||
// see https://social.msdn.microsoft.com/Forums/en-US/3f69ebb3-62a0-4fdd-b367-64790dfb2491/presetshapedefinitionsxml-does-not-specify-width-and-height-form-some-autoshapes?forum=os_binaryfile
|
|
||||||
|
|
||||||
// the adjust value can be format dependent, e.g. hexagon has different values,
|
|
||||||
// other shape types have the same adjust values in OOXML and native
|
|
||||||
int adjval = getEscherProperty(escherProp, -1);
|
int adjval = getEscherProperty(escherProp, -1);
|
||||||
|
|
||||||
return (adjval == -1) ? null : new Guide(name, "val "+adjval);
|
if (adjval == -1) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Bug 59004
|
||||||
|
// the adjust value are format dependent, we scale them up so they match the OOXML ones.
|
||||||
|
// see https://social.msdn.microsoft.com/Forums/en-US/33e458e6-58df-48fe-9a10-e303ab08991d/preset-shapes-for-ppt?forum=os_binaryfile
|
||||||
|
|
||||||
|
// usually we deal with length units and only very few degree units:
|
||||||
|
boolean isDegreeUnit = false;
|
||||||
|
switch (getShapeType()) {
|
||||||
|
case ARC:
|
||||||
|
case BLOCK_ARC:
|
||||||
|
case CHORD:
|
||||||
|
case PIE:
|
||||||
|
isDegreeUnit = (adjInt == 1 || adjInt == 2);
|
||||||
|
break;
|
||||||
|
case CIRCULAR_ARROW:
|
||||||
|
case LEFT_CIRCULAR_ARROW:
|
||||||
|
case LEFT_RIGHT_CIRCULAR_ARROW:
|
||||||
|
isDegreeUnit = (adjInt == 2 || adjInt == 3 || adjInt == 4);
|
||||||
|
break;
|
||||||
|
case MATH_NOT_EQUAL:
|
||||||
|
isDegreeUnit = (adjInt == 2);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return new Guide(name, "val "+Math.rint(adjval * (isDegreeUnit ? 65536. : 100000./21000.)));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
Loading…
Reference in New Issue