[ 
https://issues.apache.org/jira/browse/FOP-3135?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17745491#comment-17745491
 ] 

Dave Roxburgh commented on FOP-3135:
------------------------------------

Further work focussed on the possibility of the issue being caused by a 
mismatch between of FOP's default resolution of 72dpi and SVG's default 
resolution of 96dpi.

[^WIP.patch] makes 2 changes:

1) SVGUserAgent sets pixelUnitToMM to a value suitable for use at 96dpi instead 
of delegating to FOUserAgent which had set it to a value suitable for use at 
72dpi. This change may possibly be safe for general use. It resolves the 
horizontal glyph spacing issue and the vertical line spacing issue.

2) FOPGVTFontFamily.deriveFont() scales the font size up by a factor of 96/72 - 
again converting the font size for use at 96dpi instead of 72dpi. This change 
is clearly not a general solution.

Run against MI-test.fo and MI-tspan.svg, the mods produce the output shown in 
[^WIP-out.pdf] which looks correct.

> SVG <tspan> content is displayed on a single line without spaces
> ----------------------------------------------------------------
>
>                 Key: FOP-3135
>                 URL: https://issues.apache.org/jira/browse/FOP-3135
>             Project: FOP
>          Issue Type: Bug
>          Components: image/svg
>            Reporter: Julien Lacour
>            Priority: Minor
>         Attachments: MI-out-patch.pdf, MI-out.pdf, MI-test.fo, MI-tspan.svg, 
> MI.patch, WIP-out.pdf, WIP.patch, tspan.svg
>
>
> We have found an issue in FOP when transforming PDFs with SVGs containing 
> <tspan> with multiple @x and/or @y attributes values.
> The problem is located in 
> org.apache.fop.svg.PDFTextPainter.writeGlyphs(FOPGVTGlyphVector, 
> GeneralPath), the positions given by x and y are never used when set.
> A possible fix for this issue is the following:
> {code:java}
>     for (int i = 0, n = gv.getNumGlyphs(); i < n; i++) {
>         int     gc              = gv.getGlyphCode(i);
>         int[]   pa              = ((i > dp.length) || (dp[i] == null)) ? 
> paZero : dp[i];
>         if (gv.getGlyphPosition(i) != null) {
>             Point2D gp              = gv.getGlyphPosition(i);
>             double x                = gp.getX() - initialPos.getX();
>             double y                = -(gp.getY() - initialPos.getY());
>             double xd               = x - xoLast;
>             double yd               = y - yoLast;
>             textUtil.writeTd(xd, yd);
>             textUtil.writeTj((char) gc, true, false);
>             xc = x + pa[2];
>             yc = y + pa[3];
>             xoLast = x;
>             yoLast = y;
>         } else {
>             double  xo              = xc + pa[0];
>             double  yo              = yc + pa[1];
>             double  xa              = f.getWidth(gc);
>             double  ya              = 0;
>             double  xd              = (xo - xoLast) / 1000f;
>             double  yd              = (yo - yoLast) / 1000f;
>            
>             textUtil.writeTd(xd, yd);
>             textUtil.writeTj((char) gc, true, false);
>             xc += xa + pa[2];
>             yc += ya + pa[3];
>             xoLast = xo;
>             yoLast = yo;
>         }
>     }
> {code}
> I also attached an example for testing, it can be opened in Batik for 
> comparison.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to