From 69ddd04bd8a27d498dcaa333c28cd9976c14074f Mon Sep 17 00:00:00 2001 From: Andreas Beeker Date: Tue, 15 Sep 2020 22:53:09 +0000 Subject: [PATCH] #64716 - wmf display error - WmfExtTextOut - move current location to the end of the string after its written to the GraphicsCtx git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1881750 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/poi/hwmf/draw/HwmfGraphics.java | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/scratchpad/src/org/apache/poi/hwmf/draw/HwmfGraphics.java b/src/scratchpad/src/org/apache/poi/hwmf/draw/HwmfGraphics.java index 38b473da03..b849a55bfb 100644 --- a/src/scratchpad/src/org/apache/poi/hwmf/draw/HwmfGraphics.java +++ b/src/scratchpad/src/org/apache/poi/hwmf/draw/HwmfGraphics.java @@ -31,6 +31,7 @@ import java.awt.Shape; import java.awt.TexturePaint; import java.awt.font.FontRenderContext; import java.awt.font.GlyphVector; +import java.awt.font.LineBreakMeasurer; import java.awt.font.TextAttribute; import java.awt.font.TextLayout; import java.awt.geom.AffineTransform; @@ -475,6 +476,9 @@ public class HwmfGraphics implements HwmfCharsetAware { calculateDx(textString, dx, font, fontInfo, frc, as); + LineBreakMeasurer lbm = new LineBreakMeasurer(as.getIterator(), frc); + TextLayout textLayout = lbm.nextLayout(Integer.MAX_VALUE); + final double angle = Math.toRadians(-font.getEscapement()/10.); final Point2D dst = getRotatedOffset(angle, frc, as); @@ -494,6 +498,19 @@ public class HwmfGraphics implements HwmfCharsetAware { graphicsCtx.translate(dst.getX(), dst.getY()); graphicsCtx.setColor(prop.getTextColor().getColor()); graphicsCtx.drawString(as.getIterator(), 0, 0); + + // move current location to the end of string + AffineTransform atRev = new AffineTransform(); + atRev.translate(-dst.getX(), -dst.getY()); + if (scale != null) { + atRev.scale(scale.getWidth() < 0 ? 1 : -1, scale.getHeight() < 0 ? 1 : -1); + } + atRev.rotate(-angle); + + Point2D deltaX = new Point2D.Double(textLayout.getBounds().getWidth(), 0); + Point2D oldLoc = prop.getLocation(); + prop.setLocation(oldLoc.getX() + deltaX.getX(), oldLoc.getY() + deltaX.getY()); + } finally { graphicsCtx.setTransform(at); graphicsCtx.setClip(clipShape);