You are viewing a plain text version of this content. The canonical link for it is here.
Posted to fop-commits@xmlgraphics.apache.org by je...@apache.org on 2009/02/05 17:27:09 UTC

svn commit: r741165 [2/2] - in /xmlgraphics/fop/branches/Temp_AreaTreeNewDesign: src/documentation/intermediate-format-ng/ src/java/org/apache/fop/afp/ src/java/org/apache/fop/afp/fonts/ src/java/org/apache/fop/afp/modca/ src/java/org/apache/fop/afp/ut...

Modified: xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/render/ps/PSPainter.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/render/ps/PSPainter.java?rev=741165&r1=741164&r2=741165&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/render/ps/PSPainter.java (original)
+++ xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/render/ps/PSPainter.java Thu Feb  5 16:27:08 2009
@@ -312,8 +312,33 @@
         }
     }
 
+    private String formatMptAsPt(PSGenerator gen, int value) {
+        return gen.formatDouble(value / 1000.0);
+    }
+
+    /* Disabled: performance experiment (incomplete)
+
+    private static final String ZEROS = "0.00";
+
+    private String formatMptAsPt1(int value) {
+        String s = Integer.toString(value);
+        int len = s.length();
+        StringBuffer sb = new StringBuffer();
+        if (len < 4) {
+            sb.append(ZEROS.substring(0, 5 - len));
+            sb.append(s);
+        } else {
+            int dec = len - 3;
+            sb.append(s.substring(0, dec));
+            sb.append('.');
+            sb.append(s.substring(dec));
+        }
+        return sb.toString();
+    }*/
+
     /** {@inheritDoc} */
-    public void drawText(int x, int y, int[] dx, int[] dy, String text) throws IFException {
+    public void drawText(int x, int y, int letterSpacing, int wordSpacing,
+            int[] dx, String text) throws IFException {
         try {
             //Note: dy is currently ignored
             PSGenerator generator = getGenerator();
@@ -334,16 +359,13 @@
                 singleByteFont = (SingleByteFont)tf;
             }
             Font font = getFontInfo().getFontInstance(triplet, sizeMillipoints);
-            //String fontName = font.getFontName();
 
             PSResource res = this.documentHandler.getPSResourceForFontKey(fontKey);
             generator.useFont("/" + res.getName(), fontSize);
             generator.getResourceTracker().notifyResourceUsageOnPage(res);
-            //textutil.updateTf(fontKey, fontSize, tf.isMultiByte());
 
-            generator.writeln("1 0 0 -1 " + generator.formatDouble(x / 1000.0)
-                    + " " + generator.formatDouble(y / 1000.0) + " Tm");
-            //textutil.writeTextMatrix(new AffineTransform(1, 0, 0, -1, x / 1000f, y / 1000f));
+            generator.writeln("1 0 0 -1 " + formatMptAsPt(generator, x)
+                    + " " + formatMptAsPt(generator, y) + " Tm");
 
             int textLen = text.length();
             if (singleByteFont != null && singleByteFont.hasAdditionalEncodings()) {
@@ -356,7 +378,8 @@
                     int encoding = mapped / 256;
                     if (currentEncoding != encoding) {
                         if (i > 0) {
-                            writeText(text, start, i - start, dx, dy, font, tf);
+                            writeText(text, start, i - start,
+                                    letterSpacing, wordSpacing, dx, font, tf);
                         }
                         if (encoding == 0) {
                             useFont(fontKey, sizeMillipoints);
@@ -367,62 +390,98 @@
                         start = i;
                     }
                 }
-                writeText(text, start, textLen - start, dx, dy, font, tf);
+                writeText(text, start, textLen - start,
+                        letterSpacing, wordSpacing, dx, font, tf);
             } else {
                 //Simple single-font painting
                 useFont(fontKey, sizeMillipoints);
-                writeText(text, 0, textLen, dx, dy, font, tf);
+                writeText(text, 0, textLen,
+                        letterSpacing, wordSpacing, dx, font, tf);
             }
         } catch (IOException ioe) {
             throw new IFException("I/O error in drawText()", ioe);
         }
     }
 
-    private void writeText(String text, int start, int len, int[] dx, int[] dy,
+    private void writeText(String text, int start, int len,
+            int letterSpacing, int wordSpacing, int[] dx,
             Font font, Typeface tf) throws IOException {
         PSGenerator generator = getGenerator();
         int end = start + len;
         int initialSize = len;
         initialSize += initialSize / 2;
+
+        boolean hasLetterSpacing = (letterSpacing != 0);
+        boolean needTJ = false;
+
+        int lineStart = 0;
+        StringBuffer accText = new StringBuffer(initialSize);
         StringBuffer sb = new StringBuffer(initialSize);
-        sb.append("(");
-        int[] offsets = new int[len];
         int dxl = (dx != null ? dx.length : 0);
         for (int i = start; i < end; i++) {
             char orgChar = text.charAt(i);
             char ch;
             int cw;
+            int glyphAdjust = 0;
             if (CharUtilities.isFixedWidthSpace(orgChar)) {
                 //Fixed width space are rendered as spaces so copy/paste works in a reader
                 ch = font.mapChar(CharUtilities.SPACE);
-                //int spaceDiff = font.getCharWidth(ch) - font.getCharWidth(orgChar);
-                //glyphAdjust = -(spaceDiff);
+                cw = font.getCharWidth(orgChar);
+                glyphAdjust = font.getCharWidth(ch) - cw;
             } else {
+                if ((wordSpacing != 0) && CharUtilities.isAdjustableSpace(orgChar)) {
+                    glyphAdjust -= wordSpacing;
+                }
                 ch = font.mapChar(orgChar);
-                //cw = tf.getWidth(ch, font.getFontSize()) / 1000;
+                cw = font.getCharWidth(orgChar);
             }
 
-            cw = font.getCharWidth(orgChar);
-            int glyphAdjust = 0;
             if (dx != null && i < dxl - 1) {
-                glyphAdjust += dx[i + 1];
+                glyphAdjust -= dx[i + 1];
             }
-            offsets[i - start] = cw + glyphAdjust;
             char codepoint = (char)(ch % 256);
-            PSGenerator.escapeChar(codepoint, sb);
-        }
-        sb.append(")" + PSGenerator.LF + "[");
-        for (int i = 0; i < len; i++) {
-            if (i > 0) {
-                if (i % 8 == 0) {
-                    sb.append(PSGenerator.LF);
-                } else {
-                    sb.append(" ");
+            PSGenerator.escapeChar(codepoint, accText); //add character to accumulated text
+            if (glyphAdjust != 0) {
+                needTJ = true;
+                if (sb.length() == 0) {
+                    sb.append('['); //Need to start TJ
                 }
+                if (accText.length() > 0) {
+                    if ((sb.length() - lineStart + accText.length()) > 200) {
+                        sb.append(PSGenerator.LF);
+                        lineStart = sb.length();
+                    }
+                    sb.append('(');
+                    sb.append(accText);
+                    sb.append(") ");
+                    accText.setLength(0); //reset accumulated text
+                }
+                sb.append(Integer.toString(glyphAdjust)).append(' ');
+            }
+        }
+        if (needTJ) {
+            if (accText.length() > 0) {
+                sb.append('(');
+                sb.append(accText);
+                sb.append(')');
+            }
+            if (hasLetterSpacing) {
+                sb.append("] " + formatMptAsPt(generator, letterSpacing) + " ATJ");
+            } else {
+                sb.append("] TJ");
+            }
+        } else {
+            sb.append('(').append(accText).append(")");
+            if (hasLetterSpacing) {
+                StringBuffer spb = new StringBuffer();
+                spb.append(formatMptAsPt(generator, letterSpacing))
+                    .append(" 0 ");
+                sb.insert(0, spb.toString());
+                sb.append(" ashow");
+            } else {
+                sb.append(" show");
             }
-            sb.append(generator.formatDouble(offsets[i] / 1000f));
         }
-        sb.append("]" + PSGenerator.LF + "xshow");
         generator.writeln(sb.toString());
     }
 

Modified: xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/sandbox/org/apache/fop/render/svg/SVGPainter.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/sandbox/org/apache/fop/render/svg/SVGPainter.java?rev=741165&r1=741164&r2=741165&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/sandbox/org/apache/fop/render/svg/SVGPainter.java (original)
+++ xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/sandbox/org/apache/fop/render/svg/SVGPainter.java Thu Feb  5 16:27:08 2009
@@ -325,19 +325,23 @@
     }
 
     /** {@inheritDoc} */
-    public void drawText(int x, int y, int[] dx, int[] dy, String text) throws IFException {
+    public void drawText(int x, int y, int letterSpacing, int wordSpacing, int[] dx, String text)
+                throws IFException {
         try {
             establish(MODE_TEXT);
             AttributesImpl atts = new AttributesImpl();
             XMLUtil.addAttribute(atts, XMLConstants.XML_SPACE, "preserve");
             XMLUtil.addAttribute(atts, "x", Integer.toString(x));
             XMLUtil.addAttribute(atts, "y", Integer.toString(y));
+            if (letterSpacing != 0) {
+                XMLUtil.addAttribute(atts, "letter-spacing", Integer.toString(letterSpacing));
+            }
+            if (wordSpacing != 0) {
+                XMLUtil.addAttribute(atts, "word-spacing", Integer.toString(wordSpacing));
+            }
             if (dx != null) {
                 XMLUtil.addAttribute(atts, "dx", IFUtil.toString(dx));
             }
-            if (dy != null) {
-                XMLUtil.addAttribute(atts, "dy", IFUtil.toString(dy));
-            }
             handler.startElement("text", atts);
             char[] chars = text.toCharArray();
             handler.characters(chars, 0, chars.length);

Modified: xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/test/layoutengine/standard-testcases/block_letter-spacing.xml
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/test/layoutengine/standard-testcases/block_letter-spacing.xml?rev=741165&r1=741164&r2=741165&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/test/layoutengine/standard-testcases/block_letter-spacing.xml (original)
+++ xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/test/layoutengine/standard-testcases/block_letter-spacing.xml Thu Feb  5 16:27:08 2009
@@ -71,11 +71,23 @@
     <eval expected="Default space between characters is defined to" xpath="//if:text[14]"/>
     <eval expected="0" xpath="//if:text[14]/@x"/>
     <eval expected="197466" xpath="//if:text[14]/@y"/>
-    <eval expected="0 2000 2000 2000 2000 2000 2000 0 4000 2000 2000 2000 2000 0 4000 2000 2000 2000 2000 2000 2000 0 4000 2000 2000 2000 2000 2000 2000 2000 2000 2000 0 4000 2000 0 4000 2000 2000 2000 2000 2000 2000 0 4000 2000" xpath="//if:text[14]/@dx"/>
+    <eval expected="2000" xpath="//if:text[14]/@letter-spacing"/>
+    <true xpath="not(//if:text[14]/@word-spacing)"/>
+    <true xpath="not(//if:text[14]/@dx)"/>
 
     <eval expected="Default space between characters is defined to be" xpath="//if:text[20]"/>
     <eval expected="0" xpath="//if:text[20]/@x"/>
     <eval expected="283866" xpath="//if:text[20]/@y"/>
-    <eval expected="0 1938 1938 1938 1938 1938 1938 0 3836 1938 1938 1938 1938 0 3836 1938 1938 1938 1938 1938 1938 0 3836 1938 1938 1938 1938 1938 1938 1938 1938 1938 0 3836 1938 0 3836 1938 1938 1938 1938 1938 1938 0 3836 1938 0 3836 1938" xpath="//if:text[20]/@dx"/>
+    <eval expected="1938" xpath="//if:text[20]/@letter-spacing"/>
+    <eval expected="-40" xpath="//if:text[20]/@word-spacing"/>
+    <true xpath="not(//if:text[20]/@dx)"/>
+
+    <eval expected="2000" xpath="//if:text[21]/@letter-spacing"/>
+    <true xpath="not(//if:text[21]/@word-spacing)"/>
+    <true xpath="not(//if:text[21]/@dx)"/>
+
+    <eval expected="1364" xpath="//if:text[22]/@letter-spacing"/>
+    <eval expected="-362" xpath="//if:text[22]/@word-spacing"/>
+    <true xpath="not(//if:text[22]/@dx)"/>
   </if-checks>
 </testcase>

Modified: xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/test/layoutengine/standard-testcases/kerning_1_on.xml
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/test/layoutengine/standard-testcases/kerning_1_on.xml?rev=741165&r1=741164&r2=741165&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/test/layoutengine/standard-testcases/kerning_1_on.xml (original)
+++ xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/test/layoutengine/standard-testcases/kerning_1_on.xml Thu Feb  5 16:27:08 2009
@@ -69,37 +69,51 @@
     <eval expected=" text-text Hello World." xpath="//if:text[2]"/>
     <eval expected="36420" xpath="//if:text[2]/@x"/>
     <eval expected="10266" xpath="//if:text[2]/@y"/>
+    <true xpath="not(//if:text[2]/@letter-spacing)"/>
+    <true xpath="not(//if:text[2]/@word-spacing)"/>
     <eval expected="0 0 0 -360 0 0 0 0 -360 0 0 0 0 0 0 0 0 0 -360 0 180" xpath="//if:text[2]/@dx"/>
 
     <eval expected="VAVAV" xpath="//if:text[3]"/>
     <eval expected="0" xpath="//if:text[3]/@x"/>
     <eval expected="24666" xpath="//if:text[3]/@y"/>
-    <eval expected="0 40 160 40 160" xpath="//if:text[3]/@dx"/>
+    <eval expected="1000" xpath="//if:text[3]/@letter-spacing"/>
+    <true xpath="not(//if:text[3]/@word-spacing)"/>
+    <eval expected="0 -960 -840 -960 -840" xpath="//if:text[3]/@dx"/>
     
     <eval expected=" text-text Hello World." xpath="//if:text[4]"/>
     <eval expected="40420" xpath="//if:text[4]/@x"/>
     <eval expected="24666" xpath="//if:text[4]/@y"/>
-    <eval expected="0 2000 1000 640 1000 1000 1000 1000 640 1000 0 2000 1000 1000 1000 1000 0 2000 640 1000 1180 1000 1000" xpath="//if:text[4]/@dx"/>
-
+    <eval expected="1000" xpath="//if:text[4]/@letter-spacing"/>
+    <true xpath="not(//if:text[3]/@word-spacing)"/>
+    <eval expected="0 0 0 -360 0 0 0 0 -360 0 0 0 0 0 0 0 0 0 -360 0 180" xpath="//if:text[4]/@dx"/>
+    
     <eval expected="VAVAV" xpath="//if:text[5]"/>
     <eval expected="0" xpath="//if:text[5]/@x"/>
     <eval expected="39066" xpath="//if:text[5]/@y"/>
+    <true xpath="not(//if:text[5]/@letter-spacing)"/>
+    <eval expected="5000" xpath="//if:text[5]/@word-spacing"/>
     <eval expected="0 -960 -840 -960 -840" xpath="//if:text[5]/@dx"/>
     
     <eval expected=" text-text Hello World." xpath="//if:text[6]"/>
     <eval expected="36420" xpath="//if:text[6]/@x"/>
     <eval expected="39066" xpath="//if:text[6]/@y"/>
-    <eval expected="0 5000 0 -360 0 0 0 0 -360 0 0 5000 0 0 0 0 0 5000 -360 0 180" xpath="//if:text[6]/@dx"/>
-
+    <true xpath="not(//if:text[5]/@letter-spacing)"/>
+    <eval expected="5000" xpath="//if:text[6]/@word-spacing"/>
+    <eval expected="0 0 0 -360 0 0 0 0 -360 0 0 0 0 0 0 0 0 0 -360 0 180" xpath="//if:text[4]/@dx"/>
+    
     <eval expected="VAVAV" xpath="//if:text[7]"/>
     <eval expected="0" xpath="//if:text[7]/@x"/>
     <eval expected="53466" xpath="//if:text[7]/@y"/>
-    <eval expected="0 40 160 40 160" xpath="//if:text[7]/@dx"/>
+    <eval expected="1000" xpath="//if:text[7]/@letter-spacing"/>
+    <eval expected="3000" xpath="//if:text[7]/@word-spacing"/>  <!-- TODO Not sure that's correct! -->
+    <eval expected="0 -960 -840 -960 -840" xpath="//if:text[7]/@dx"/>
     
     <eval expected=" text-text Hello World." xpath="//if:text[8]"/>
     <eval expected="40420" xpath="//if:text[8]/@x"/>
     <eval expected="53466" xpath="//if:text[8]/@y"/>
-    <eval expected="0 5000 1000 640 1000 1000 1000 1000 640 1000 0 5000 1000 1000 1000 1000 0 5000 640 1000 1180 1000 1000" xpath="//if:text[8]/@dx"/>
+    <eval expected="1000" xpath="//if:text[8]/@letter-spacing"/>
+    <eval expected="3000" xpath="//if:text[8]/@word-spacing"/> <!-- TODO Not sure that's correct! -->
+    <eval expected="0 0 0 -360 0 0 0 0 -360 0 0 0 0 0 0 0 0 0 -360 0 180" xpath="//if:text[8]/@dx"/>
     
   </if-checks>
 </testcase>



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