You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@poi.apache.org by ki...@apache.org on 2018/09/26 22:16:33 UTC

svn commit: r1842056 - in /poi/branches/hemf/src/scratchpad: src/org/apache/poi/hemf/draw/ src/org/apache/poi/hemf/record/emf/ src/org/apache/poi/hwmf/draw/ src/org/apache/poi/hwmf/record/ testcases/org/apache/poi/hemf/usermodel/

Author: kiwiwings
Date: Wed Sep 26 22:16:33 2018
New Revision: 1842056

URL: http://svn.apache.org/viewvc?rev=1842056&view=rev
Log:
#60656 - Support export file that contains emf and render it correctly

Modified:
    poi/branches/hemf/src/scratchpad/src/org/apache/poi/hemf/draw/HemfGraphics.java
    poi/branches/hemf/src/scratchpad/src/org/apache/poi/hemf/record/emf/HemfComment.java
    poi/branches/hemf/src/scratchpad/src/org/apache/poi/hemf/record/emf/HemfMisc.java
    poi/branches/hemf/src/scratchpad/src/org/apache/poi/hemf/record/emf/HemfText.java
    poi/branches/hemf/src/scratchpad/src/org/apache/poi/hwmf/draw/HwmfGraphics.java
    poi/branches/hemf/src/scratchpad/src/org/apache/poi/hwmf/record/HwmfColorRef.java
    poi/branches/hemf/src/scratchpad/src/org/apache/poi/hwmf/record/HwmfMisc.java
    poi/branches/hemf/src/scratchpad/src/org/apache/poi/hwmf/record/HwmfPenStyle.java
    poi/branches/hemf/src/scratchpad/src/org/apache/poi/hwmf/record/HwmfText.java
    poi/branches/hemf/src/scratchpad/testcases/org/apache/poi/hemf/usermodel/HemfPictureTest.java

Modified: poi/branches/hemf/src/scratchpad/src/org/apache/poi/hemf/draw/HemfGraphics.java
URL: http://svn.apache.org/viewvc/poi/branches/hemf/src/scratchpad/src/org/apache/poi/hemf/draw/HemfGraphics.java?rev=1842056&r1=1842055&r2=1842056&view=diff
==============================================================================
--- poi/branches/hemf/src/scratchpad/src/org/apache/poi/hemf/draw/HemfGraphics.java (original)
+++ poi/branches/hemf/src/scratchpad/src/org/apache/poi/hemf/draw/HemfGraphics.java Wed Sep 26 22:16:33 2018
@@ -104,7 +104,7 @@ public class HemfGraphics extends HwmfGr
         prop.setLocation(path.getCurrentPoint());
         if (!useBracket) {
             // TODO: when to use draw vs. fill?
-            graphicsCtx.draw(path);
+            super.draw(path);
         }
 
     }

Modified: poi/branches/hemf/src/scratchpad/src/org/apache/poi/hemf/record/emf/HemfComment.java
URL: http://svn.apache.org/viewvc/poi/branches/hemf/src/scratchpad/src/org/apache/poi/hemf/record/emf/HemfComment.java?rev=1842056&r1=1842055&r2=1842056&view=diff
==============================================================================
--- poi/branches/hemf/src/scratchpad/src/org/apache/poi/hemf/record/emf/HemfComment.java (original)
+++ poi/branches/hemf/src/scratchpad/src/org/apache/poi/hemf/record/emf/HemfComment.java Wed Sep 26 22:16:33 2018
@@ -217,7 +217,7 @@ public class HemfComment {
 
         @Override
         public String toString() {
-            return "\""+new String(privateData, LocaleUtil.CHARSET_1252)+"\"";
+            return "\""+new String(privateData, LocaleUtil.CHARSET_1252).replaceAll("\\p{Cntrl}", ".")+"\"";
         }
     }
 

Modified: poi/branches/hemf/src/scratchpad/src/org/apache/poi/hemf/record/emf/HemfMisc.java
URL: http://svn.apache.org/viewvc/poi/branches/hemf/src/scratchpad/src/org/apache/poi/hemf/record/emf/HemfMisc.java?rev=1842056&r1=1842055&r2=1842056&view=diff
==============================================================================
--- poi/branches/hemf/src/scratchpad/src/org/apache/poi/hemf/record/emf/HemfMisc.java (original)
+++ poi/branches/hemf/src/scratchpad/src/org/apache/poi/hemf/record/emf/HemfMisc.java Wed Sep 26 22:16:33 2018
@@ -272,6 +272,15 @@ public class HemfMisc {
             ctx.addObjectTableEntry(this, brushIdx);
         }
 
+
+        @Override
+        public String toString() {
+            return
+                "{ brushIndex: "+brushIdx+
+                ", brushStyle: '"+brushStyle+"'"+
+                ", colorRef: "+colorRef+
+                ", brushHatch: '"+brushHatch+"' }";
+        }
     }
 
     /**
@@ -329,6 +338,11 @@ public class HemfMisc {
         public void draw(HemfGraphics ctx) {
             ctx.addObjectTableEntry(this, penIndex);
         }
+
+        @Override
+        public String toString() {
+            return super.toString().replaceFirst("\\{", "{ penIndex: "+penIndex+", ");
+        }
     }
 
     public static class EmfExtCreatePen extends EmfCreatePen {
@@ -421,6 +435,13 @@ public class HemfMisc {
 
             return size;
         }
+
+        @Override
+        public String toString() {
+            // TODO: add style entries + bmp
+            return super.toString().replaceFirst("\\{",
+                "{ brushStyle: '"+brushStyle+"', hatchStyle: '"+hatchStyle+"', ");
+        }
     }
 
     /**

Modified: poi/branches/hemf/src/scratchpad/src/org/apache/poi/hemf/record/emf/HemfText.java
URL: http://svn.apache.org/viewvc/poi/branches/hemf/src/scratchpad/src/org/apache/poi/hemf/record/emf/HemfText.java?rev=1842056&r1=1842055&r2=1842056&view=diff
==============================================================================
--- poi/branches/hemf/src/scratchpad/src/org/apache/poi/hemf/record/emf/HemfText.java (original)
+++ poi/branches/hemf/src/scratchpad/src/org/apache/poi/hemf/record/emf/HemfText.java Wed Sep 26 22:16:33 2018
@@ -18,18 +18,19 @@
 package org.apache.poi.hemf.record.emf;
 
 import static java.nio.charset.StandardCharsets.UTF_16LE;
-import static org.apache.poi.hemf.record.emf.HemfDraw.readRectL;
 import static org.apache.poi.hemf.record.emf.HemfDraw.readDimensionFloat;
 import static org.apache.poi.hemf.record.emf.HemfDraw.readPointL;
+import static org.apache.poi.hemf.record.emf.HemfDraw.readRectL;
+import static org.apache.poi.hemf.record.emf.HemfRecordIterator.HEADER_SIZE;
 
 import java.awt.geom.Dimension2D;
 import java.awt.geom.Rectangle2D;
 import java.io.IOException;
 import java.nio.charset.Charset;
-import java.util.ArrayList;
-import java.util.List;
 
+import org.apache.commons.codec.Charsets;
 import org.apache.poi.hemf.draw.HemfGraphics;
+import org.apache.poi.hwmf.draw.HwmfGraphics;
 import org.apache.poi.hwmf.record.HwmfText;
 import org.apache.poi.hwmf.record.HwmfText.WmfSetTextAlign;
 import org.apache.poi.util.Dimension2DDouble;
@@ -37,6 +38,7 @@ import org.apache.poi.util.IOUtils;
 import org.apache.poi.util.Internal;
 import org.apache.poi.util.LittleEndianConsts;
 import org.apache.poi.util.LittleEndianInputStream;
+import org.apache.poi.util.LocaleUtil;
 import org.apache.poi.util.RecordFormatException;
 
 /**
@@ -53,9 +55,7 @@ public class HemfText {
         GM_COMPATIBLE, GM_ADVANCED
     }
 
-    public static class EmfExtTextOutA implements HemfRecord {
-
-        protected final Rectangle2D bounds = new Rectangle2D.Double();
+    public static class EmfExtTextOutA extends HwmfText.WmfExtTextOut implements HemfRecord {
 
         protected EmfGraphicsMode graphicsMode;
 
@@ -65,14 +65,8 @@ public class HemfText {
          */
         protected final Dimension2D scale = new Dimension2DDouble();
 
-        protected final EmrTextObject textObject;
-
         public EmfExtTextOutA() {
-            this(false);
-        }
-
-        protected EmfExtTextOutA(boolean isUnicode) {
-            textObject = new EmrTextObject(isUnicode);
+            super(new EmfExtTextOutOptions());
         }
 
         @Override
@@ -95,12 +89,70 @@ public class HemfText {
 
             size += readDimensionFloat(leis, scale);
 
-            // guarantee to read the rest of the EMRTextObjectRecord
-            size += textObject.init(leis, recordSize, (int)size);
+            // A WMF PointL object that specifies the coordinates of the reference point used to position the string.
+            // The reference point is defined by the last EMR_SETTEXTALIGN record.
+            // If no such record has been set, the default alignment is TA_LEFT,TA_TOP.
+            size += readPointL(leis, reference);
+            // A 32-bit unsigned integer that specifies the number of characters in the string.
+            stringLength = (int)leis.readUInt();
+            // A 32-bit unsigned integer that specifies the offset to the output string, in bytes,
+            // from the start of the record in which this object is contained.
+            // This value MUST be 8- or 16-bit aligned, according to the character format.
+            int offString = (int)leis.readUInt();
+            size += 2*LittleEndianConsts.INT_SIZE;
+
+            size += options.init(leis);
+            // An optional WMF RectL object that defines a clipping and/or opaquing rectangle in logical units.
+            // This rectangle is applied to the text output performed by the containing record.
+            if (options.isClipped() || options.isOpaque()) {
+                size += readRectL(leis, bounds);
+            }
+
+            // A 32-bit unsigned integer that specifies the offset to an intercharacter spacing array, in bytes,
+            // from the start of the record in which this object is contained. This value MUST be 32-bit aligned.
+            int offDx = (int)leis.readUInt();
+            size += LittleEndianConsts.INT_SIZE;
+
+            int undefinedSpace1 = (int)(offString - size - HEADER_SIZE);
+            assert (undefinedSpace1 >= 0);
+            leis.skipFully(undefinedSpace1);
+            size += undefinedSpace1;
+
+            rawTextBytes = IOUtils.safelyAllocate(stringLength*(isUnicode()?2:1), MAX_RECORD_LENGTH);
+            leis.readFully(rawTextBytes);
+            size += rawTextBytes.length;
+
+            dx.clear();
+            if (offDx > 0) {
+                int undefinedSpace2 = (int) (offDx - size - HEADER_SIZE);
+                assert (undefinedSpace2 >= 0);
+                leis.skipFully(undefinedSpace2);
+                size += undefinedSpace2;
+
+                // An array of 32-bit unsigned integers that specify the output spacing between the origins of adjacent
+                // character cells in logical units. The location of this field is specified by the value of offDx
+                // in bytes from the start of this record. If spacing is defined, this field contains the same number
+                // of values as characters in the output string.
+                //
+                // If the Options field of the EmrText object contains the ETO_PDY flag, then this buffer
+                // contains twice as many values as there are characters in the output string, one
+                // horizontal and one vertical offset for each, in that order.
+                //
+                // If ETO_RTLREADING is specified, characters are laid right to left instead of left to right.
+                // No other options affect the interpretation of this field.
+                while (size < recordSize) {
+                    dx.add((int) leis.readUInt());
+                    size += LittleEndianConsts.INT_SIZE;
+                }
+            }
 
             return size;
         }
 
+        protected boolean isUnicode() {
+            return false;
+        }
+
         /**
          *
          * To be implemented!  We need to get the current character set
@@ -114,15 +166,7 @@ public class HemfText {
          * @throws IOException
          */
         public String getText(Charset charset) throws IOException {
-            return textObject.getText(charset);
-        }
-
-        /**
-         *
-         * @return the x offset for the EmrTextObject
-         */
-        public EmrTextObject getTextObject() {
-            return textObject;
+            return super.getText(charset);
         }
 
         public EmfGraphicsMode getGraphicsMode() {
@@ -134,7 +178,19 @@ public class HemfText {
         }
 
         @Override
+        public void draw(HwmfGraphics ctx) {
+            Rectangle2D bounds = new Rectangle2D.Double(reference.getX(), reference.getY(), 0, 0);
+            ctx.drawString(rawTextBytes, bounds, dx, isUnicode());
+        }
+
+        @Override
         public String toString() {
+            String text = "";
+            try {
+                text = getText(isUnicode() ? Charsets.UTF_16LE : LocaleUtil.CHARSET_1252);
+            } catch (IOException ignored) {
+            }
+
             return
                 "{ bounds: { x: "+bounds.getX()+
                 ", y: "+bounds.getY()+
@@ -142,17 +198,13 @@ public class HemfText {
                 ", h: "+bounds.getHeight()+
                 "}, graphicsMode: '"+graphicsMode+"'"+
                 ", scale: { w: "+scale.getWidth()+", h: "+scale.getHeight()+" }"+
-                ", textObject: "+textObject+
+                ", text: '"+text.replaceAll("\\p{Cntrl}",".")+"'"+
                 "}";
         }
     }
 
     public static class EmfExtTextOutW extends EmfExtTextOutA {
 
-        public EmfExtTextOutW() {
-            super(true);
-        }
-
         @Override
         public HemfRecordType getEmfRecordType() {
             return HemfRecordType.exttextoutw;
@@ -161,6 +213,10 @@ public class HemfText {
         public String getText() throws IOException {
             return getText(UTF_16LE);
         }
+
+        protected boolean isUnicode() {
+            return true;
+        }
     }
 
     /**
@@ -200,77 +256,6 @@ public class HemfText {
         }
     }
 
-    public static class EmrTextObject extends HwmfText.WmfExtTextOut {
-        protected final boolean isUnicode;
-        protected final List<Integer> outputDx = new ArrayList<>();
-
-        public EmrTextObject(boolean isUnicode) {
-            super(new EmfExtTextOutOptions());
-            this.isUnicode = isUnicode;
-        }
-
-        @Override
-        public int init(LittleEndianInputStream leis, final long recordSize, final int offset) throws IOException {
-            // A WMF PointL object that specifies the coordinates of the reference point used to position the string.
-            // The reference point is defined by the last EMR_SETTEXTALIGN record.
-            // If no such record has been set, the default alignment is TA_LEFT,TA_TOP.
-            long size = readPointL(leis, reference);
-            // A 32-bit unsigned integer that specifies the number of characters in the string.
-            stringLength = (int)leis.readUInt();
-            // A 32-bit unsigned integer that specifies the offset to the output string, in bytes,
-            // from the start of the record in which this object is contained.
-            // This value MUST be 8- or 16-bit aligned, according to the character format.
-            int offString = (int)leis.readUInt();
-            size += 2*LittleEndianConsts.INT_SIZE;
-
-            size += options.init(leis);
-            // An optional WMF RectL object that defines a clipping and/or opaquing rectangle in logical units.
-            // This rectangle is applied to the text output performed by the containing record.
-            if (options.isClipped() || options.isOpaque()) {
-                size += readRectL(leis, bounds);
-            }
-
-            // A 32-bit unsigned integer that specifies the offset to an intercharacter spacing array, in bytes,
-            // from the start of the record in which this object is contained. This value MUST be 32-bit aligned.
-            int offDx = (int)leis.readUInt();
-            size += LittleEndianConsts.INT_SIZE;
-
-            int undefinedSpace1 = (int)(offString-offset-size-2*LittleEndianConsts.INT_SIZE);
-            assert (undefinedSpace1 >= 0);
-            leis.skipFully(undefinedSpace1);
-            size += undefinedSpace1;
-
-            rawTextBytes = IOUtils.safelyAllocate(stringLength*(isUnicode?2:1), MAX_RECORD_LENGTH);
-            leis.readFully(rawTextBytes);
-            size += rawTextBytes.length;
-
-            outputDx.clear();
-            if (offDx > 0) {
-                int undefinedSpace2 = (int) (offDx - offset - size - 2 * LittleEndianConsts.INT_SIZE);
-                assert (undefinedSpace2 >= 0);
-                leis.skipFully(undefinedSpace2);
-                size += undefinedSpace2;
-
-                // An array of 32-bit unsigned integers that specify the output spacing between the origins of adjacent
-                // character cells in logical units. The location of this field is specified by the value of offDx
-                // in bytes from the start of this record. If spacing is defined, this field contains the same number
-                // of values as characters in the output string.
-                //
-                // If the Options field of the EmrText object contains the ETO_PDY flag, then this buffer
-                // contains twice as many values as there are characters in the output string, one
-                // horizontal and one vertical offset for each, in that order.
-                //
-                // If ETO_RTLREADING is specified, characters are laid right to left instead of left to right.
-                // No other options affect the interpretation of this field.
-                while (size < recordSize) {
-                    outputDx.add((int) leis.readUInt());
-                    size += LittleEndianConsts.INT_SIZE;
-                }
-            }
-
-            return (int)size;
-        }
-    }
 
 
     public static class ExtCreateFontIndirectW extends HwmfText.WmfCreateFontIndirect

Modified: poi/branches/hemf/src/scratchpad/src/org/apache/poi/hwmf/draw/HwmfGraphics.java
URL: http://svn.apache.org/viewvc/poi/branches/hemf/src/scratchpad/src/org/apache/poi/hwmf/draw/HwmfGraphics.java?rev=1842056&r1=1842055&r2=1842056&view=diff
==============================================================================
--- poi/branches/hemf/src/scratchpad/src/org/apache/poi/hwmf/draw/HwmfGraphics.java (original)
+++ poi/branches/hemf/src/scratchpad/src/org/apache/poi/hwmf/draw/HwmfGraphics.java Wed Sep 26 22:16:33 2018
@@ -37,6 +37,7 @@ import java.util.List;
 import java.util.ListIterator;
 import java.util.NoSuchElementException;
 
+import org.apache.commons.codec.Charsets;
 import org.apache.poi.common.usermodel.fonts.FontInfo;
 import org.apache.poi.hwmf.record.HwmfBrushStyle;
 import org.apache.poi.hwmf.record.HwmfFont;
@@ -325,7 +326,12 @@ public class HwmfGraphics {
         drawString(text, bounds, null);
     }
 
-    public void drawString(byte[] text, Rectangle2D bounds, int dx[]) {
+    public void drawString(byte[] text, Rectangle2D bounds, List<Integer> dx) {
+        drawString(text, bounds, dx, false);
+    }
+
+    public void drawString(byte[] text, Rectangle2D bounds, List<Integer> dx, boolean isUnicode) {
+
         HwmfFont font = getProperties().getFont();
         if (font == null || text == null || text.length == 0) {
             return;
@@ -335,14 +341,21 @@ public class HwmfGraphics {
         // TODO: another approx. ...
         double fontW = fontH/1.8;
         
-        Charset charset = (font.getCharset().getCharset() == null)?
-                DEFAULT_CHARSET : font.getCharset().getCharset();
+        Charset charset;
+        if (isUnicode) {
+            charset = Charsets.UTF_16LE;
+        } else {
+            charset = font.getCharset().getCharset();
+            if (charset == null) {
+                charset = DEFAULT_CHARSET;
+            }
+        }
+
         String textString = new String(text, charset);
         AttributedString as = new AttributedString(textString);
-        if (dx == null || dx.length == 0) {
+        if (dx == null || dx.isEmpty()) {
             addAttributes(as, font);
         } else {
-            int[] dxNormed = dx;
             //for multi-byte encodings (e.g. Shift_JIS), the byte length
             //might not equal the string length().
             //The x information is stored in dx[], an array parallel to the
@@ -357,41 +370,41 @@ public class HwmfGraphics {
             // needs to be remapped as:
             //dxNormed[0] = 13 textString.get(0) = U+30D7
             //dxNormed[1] = 14 textString.get(1) = U+30ED
-            if (textString.length() != text.length) {
-                int codePoints = textString.codePointCount(0, textString.length());
-                dxNormed = new int[codePoints];
+
+            final List<Integer> dxNormed;
+            if (textString.length() == text.length) {
+                dxNormed = new ArrayList<>(dx);
+            } else {
+                dxNormed = new ArrayList<>(dx.size());
                 int dxPosition = 0;
+                int[] chars = {0};
                 for (int offset = 0; offset < textString.length(); ) {
-                    dxNormed[offset] = dx[dxPosition];
-                    int[] chars = new int[1];
-                    int cp = textString.codePointAt(offset);
-                    chars[0] = cp;
+                    dxNormed.add(dx.get(dxPosition));
+                    chars[0] = textString.codePointAt(offset);
                     //now figure out how many bytes it takes to encode that
                     //code point in the charset
                     int byteLength = new String(chars, 0, chars.length).getBytes(charset).length;
                     dxPosition += byteLength;
-                    offset += Character.charCount(cp);
+                    offset += Character.charCount(chars[0]);
                 }
             }
-            for (int i = 0; i < dxNormed.length; i++) {
+            for (int i = 0; i < dxNormed.size(); i++) {
                 addAttributes(as, font);
                 // Tracking works as a prefix/advance space on characters whereas
                 // dx[...] is the complete width of the current char
                 // therefore we need to add the additional/suffix width to the next char
-                if (i < dxNormed.length - 1) {
-                    as.addAttribute(TextAttribute.TRACKING, (dxNormed[i] - fontW) / fontH, i + 1, i + 2);
-                }
+                as.addAttribute(TextAttribute.TRACKING, (dxNormed.get(i) - fontW) / fontH, i + 1, i + 2);
             }
         }
         
         
         double angle = Math.toRadians(-font.getEscapement()/10.);
-        
-        
+
         final AffineTransform at = graphicsCtx.getTransform();
         try {
-            graphicsCtx.translate(bounds.getX(), bounds.getY()+fontH);
+            graphicsCtx.translate(bounds.getX(), bounds.getY());
             graphicsCtx.rotate(angle);
+            graphicsCtx.translate(0, fontH);
             if (getProperties().getBkMode() == HwmfBkMode.OPAQUE) {
                 // TODO: validate bounds
                 graphicsCtx.setBackground(getProperties().getBackgroundColor().getColor());

Modified: poi/branches/hemf/src/scratchpad/src/org/apache/poi/hwmf/record/HwmfColorRef.java
URL: http://svn.apache.org/viewvc/poi/branches/hemf/src/scratchpad/src/org/apache/poi/hwmf/record/HwmfColorRef.java?rev=1842056&r1=1842055&r2=1842056&view=diff
==============================================================================
--- poi/branches/hemf/src/scratchpad/src/org/apache/poi/hwmf/record/HwmfColorRef.java (original)
+++ poi/branches/hemf/src/scratchpad/src/org/apache/poi/hwmf/record/HwmfColorRef.java Wed Sep 26 22:16:33 2018
@@ -19,6 +19,7 @@ package org.apache.poi.hwmf.record;
 
 import java.awt.Color;
 import java.io.IOException;
+import java.util.Locale;
 
 import org.apache.poi.util.LittleEndianConsts;
 import org.apache.poi.util.LittleEndianInputStream;
@@ -72,6 +73,6 @@ public class HwmfColorRef implements Clo
 
     @Override
     public String toString() {
-        return String.format("%#8X", colorRef.getRGB());
+        return String.format(Locale.ROOT, "%#08X", colorRef.getRGB()&0xFFFFFF);
     }
 }

Modified: poi/branches/hemf/src/scratchpad/src/org/apache/poi/hwmf/record/HwmfMisc.java
URL: http://svn.apache.org/viewvc/poi/branches/hemf/src/scratchpad/src/org/apache/poi/hwmf/record/HwmfMisc.java?rev=1842056&r1=1842055&r2=1842056&view=diff
==============================================================================
--- poi/branches/hemf/src/scratchpad/src/org/apache/poi/hwmf/record/HwmfMisc.java (original)
+++ poi/branches/hemf/src/scratchpad/src/org/apache/poi/hwmf/record/HwmfMisc.java Wed Sep 26 22:16:33 2018
@@ -554,6 +554,14 @@ public class HwmfMisc {
             p.setPenColor(colorRef);
             p.setPenWidth(dimension.getWidth());
         }
+
+        @Override
+        public String toString() {
+            return
+                "{ penStyle: "+penStyle+
+                ", dimension: { width: "+dimension.getWidth()+", height: "+dimension.getHeight()+" }"+
+                ", colorRef: "+colorRef+"}";
+        }
     }
 
     /**
@@ -634,5 +642,13 @@ public class HwmfMisc {
             p.setBrushColor(colorRef);
             p.setBrushHatch(brushHatch);
         }
+
+        @Override
+        public String toString() {
+            return
+                "{ brushStyle: '"+brushStyle+"'"+
+                ", colorRef: "+colorRef+
+                ", brushHatch: '"+brushHatch+"' }";
+        }
     }
 }
\ No newline at end of file

Modified: poi/branches/hemf/src/scratchpad/src/org/apache/poi/hwmf/record/HwmfPenStyle.java
URL: http://svn.apache.org/viewvc/poi/branches/hemf/src/scratchpad/src/org/apache/poi/hwmf/record/HwmfPenStyle.java?rev=1842056&r1=1842055&r2=1842056&view=diff
==============================================================================
--- poi/branches/hemf/src/scratchpad/src/org/apache/poi/hwmf/record/HwmfPenStyle.java (original)
+++ poi/branches/hemf/src/scratchpad/src/org/apache/poi/hwmf/record/HwmfPenStyle.java Wed Sep 26 22:16:33 2018
@@ -195,4 +195,15 @@ public class HwmfPenStyle implements Clo
             throw new InternalError();
         }
     }
+
+    @Override
+    public String toString() {
+        return
+            "{ lineCap: '"+getLineCap()+"'"+
+            ", lineDash: '"+getLineDash()+"'"+
+            ", lineJoin: '"+getLineJoin()+"'"+
+            (isAlternateDash()?", alternateDash: true ":"")+
+            (isGeometric()?", geometric: true ":"")+
+            "}";
+    }
 }

Modified: poi/branches/hemf/src/scratchpad/src/org/apache/poi/hwmf/record/HwmfText.java
URL: http://svn.apache.org/viewvc/poi/branches/hemf/src/scratchpad/src/org/apache/poi/hwmf/record/HwmfText.java?rev=1842056&r1=1842055&r2=1842056&view=diff
==============================================================================
--- poi/branches/hemf/src/scratchpad/src/org/apache/poi/hwmf/record/HwmfText.java (original)
+++ poi/branches/hemf/src/scratchpad/src/org/apache/poi/hwmf/record/HwmfText.java Wed Sep 26 22:16:33 2018
@@ -28,6 +28,8 @@ import java.io.IOException;
 import java.io.InputStreamReader;
 import java.io.Reader;
 import java.nio.charset.Charset;
+import java.util.ArrayList;
+import java.util.List;
 
 import org.apache.poi.hwmf.draw.HwmfDrawProperties;
 import org.apache.poi.hwmf.draw.HwmfGraphics;
@@ -334,7 +336,7 @@ public class HwmfText {
          * character cell i and character cell i + 1. If this field is present, there MUST be the same 
          * number of values as there are characters in the string.
          */
-        private int dx[];
+        protected final List<Integer> dx = new ArrayList<>();
 
         public WmfExtTextOut() {
             this(new WmfExtTextOutOptions());
@@ -380,9 +382,8 @@ public class HwmfText {
                 logger.log(POILogger.WARN, "META_EXTTEXTOUT tracking info doesn't cover all characters");
             }
 
-            dx = new int[stringLength]; 
             for (int i=0; i<dxLen; i++) {
-                dx[i] = leis.readShort();
+                dx.add((int)leis.readShort());
                 size += LittleEndianConsts.SHORT_SIZE;
             }
             
@@ -392,7 +393,7 @@ public class HwmfText {
         @Override
         public void draw(HwmfGraphics ctx) {
             Rectangle2D bounds = new Rectangle2D.Double(reference.getX(), reference.getY(), 0, 0);
-            ctx.drawString(getTextBytes(), bounds, dx);
+            ctx.drawString(rawTextBytes, bounds, dx);
         }
 
 
@@ -432,18 +433,6 @@ public class HwmfText {
         public Rectangle2D getBounds() {
             return bounds;
         }
-
-        /**
-         *
-         * @return a copy of a trimmed byte array of rawTextBytes bytes.
-         * This includes only the bytes from 0..stringLength.
-         * This does not include the extra optional padding on the byte array.
-         */
-        private byte[] getTextBytes() {
-            byte[] ret = IOUtils.safelyAllocate(stringLength, MAX_RECORD_LENGTH);
-            System.arraycopy(rawTextBytes, 0, ret, 0, stringLength);
-            return ret;
-        }
     }
     
     public enum HwmfTextAlignment {

Modified: poi/branches/hemf/src/scratchpad/testcases/org/apache/poi/hemf/usermodel/HemfPictureTest.java
URL: http://svn.apache.org/viewvc/poi/branches/hemf/src/scratchpad/testcases/org/apache/poi/hemf/usermodel/HemfPictureTest.java?rev=1842056&r1=1842055&r2=1842056&view=diff
==============================================================================
--- poi/branches/hemf/src/scratchpad/testcases/org/apache/poi/hemf/usermodel/HemfPictureTest.java (original)
+++ poi/branches/hemf/src/scratchpad/testcases/org/apache/poi/hemf/usermodel/HemfPictureTest.java Wed Sep 26 22:16:33 2018
@@ -88,7 +88,9 @@ public class HemfPictureTest {
             FileWriter fw = new FileWriter("record-list.txt");
             int i=0;
             for (HemfRecord r : emf.getRecords())  {
-                fw.write(i + " "+r.getEmfRecordType()+" "+r.toString()+"\n");
+                if (r.getEmfRecordType() != HemfRecordType.comment) {
+                    fw.write(i + " " + r.getEmfRecordType() + " " + r.toString() + "\n");
+                }
                 i++;
             }
             fw.close();
@@ -170,7 +172,7 @@ public class HemfPictureTest {
             for (HemfRecord record : pic) {
                 if (record.getEmfRecordType().equals(HemfRecordType.exttextoutw)) {
                     HemfText.EmfExtTextOutW extTextOutW = (HemfText.EmfExtTextOutW) record;
-                    Point2D reference = extTextOutW.getTextObject().getReference();
+                    Point2D reference = extTextOutW.getReference();
                     if (lastY > -1 && lastY != reference.getY()) {
                         sb.append("\n");
                         lastX = -1;
@@ -204,7 +206,7 @@ public class HemfPictureTest {
             for (HemfRecord record : pic) {
                 if (record.getEmfRecordType().equals(HemfRecordType.exttextoutw)) {
                     HemfText.EmfExtTextOutW extTextOutW = (HemfText.EmfExtTextOutW) record;
-                    Point2D reference = extTextOutW.getTextObject().getReference();
+                    Point2D reference = extTextOutW.getReference();
                     if (lastY > -1 && lastY != reference.getY()) {
                         sb.append("\n");
                         lastX = -1;



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