[
https://issues.apache.org/jira/browse/PDFBOX-4106?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16366501#comment-16366501
]
Aaron Madlon-Kay edited comment on PDFBOX-4106 at 2/16/18 1:19 AM:
-------------------------------------------------------------------
[~tilman]
{quote}Re patch 6:
I removed "protected" thus making these fields package local, so we don't
expose these previously private fields.
I'm wondering whether this commit is the best solution: from what I see, it
"undoes" and/or "improves" something that is done in
CIDFont.readVerticalDisplacements(). Had this been wrong before? Or was it
wrong only for type 2 and not for type 0? If so, should there be an abstract
method in the base class and a method in the subclasses?{quote}
Thanks for pointing this out. I am also not so happy with it; allow me to
explain:
# Loading a TTF file as a vertical font: the {{PDCIDFont}} constructor is
called as {{super}} from the {{PDCIDFontType2}} constructor; there we read
vertical displacements from the CIDFont dictionary (DW2, W2 entries). In the
case of a type 2 font being loaded from a file, there will be no DW2 or W2 so
the result is that it loads nothing.
# Back in {{PDCIDFontType2}}, we must fix up the vertical displacement data
based on the TTF. That is what {{fixVerticalDisplacements}} is doing.
# Vertical metrics are weird in that the TTF 'vhea' and 'vmtx' tables are never
used by PDF readers; instead that info must be translated into DW2 and W2
entries. After (2) the in-memory font is inconsistent in that it has vertical
displacement data loaded but not present in the CIDFont dictionary. Thus we
write the loaded data back into the CIDFont; that's
{{freezeVerticalPositions}}. If we don't do this then e.g. when rendering to
bitmap the font gets re-loaded from memory and the vertical positions will be
wrong.
I wanted to simply override {{readVerticalDisplacements}}, but it would take
significant changes to the initialization of both classes: we need the {{ttf}}
and {{cid2gid}} fields to be initialized before we can fix up the
displacements, but {{readVerticalDisplacements}} is called from the {{super}}
constructor so these won't be initialized yet.
I chose to manipulate the vertical data fields directly rather than duplicate
them and add getters because there's some extensive position-getting logic in
the parent class that it seems I would need to duplicate.
If you have an idea for a better solution please let me know.
was (Author: amake):
[~tilman]
{quote}Re patch 6:
I removed "protected" thus making these fields package local, so we don't
expose these previously private fields.
I'm wondering whether this commit is the best solution: from what I see, it
"undoes" and/or "improves" something that is done in
CIDFont.readVerticalDisplacements(). Had this been wrong before? Or was it
wrong only for type 2 and not for type 0? If so, should there be an abstract
method in the base class and a method in the subclasses?{quote}
Thanks for pointing this out. I am also not so happy with it; allow me to
explain:
# Loading a TTF file as a vertical font: the {{PDCIDFont}} constructor is
called as {{super}} from the {{PDCIDFontType2}} constructor; there we read
vertical displacements from the CIDFont dictionary (DW2, W2 entries). In the
case of a type 2 font being loaded from a file, there will be no DW2 or W2 so
the result is that it loads nothing.
# Back in {{PDCIDFontType2}}, we must fix up the vertical displacement data
based on the TTF. That is what {{fixVerticalDisplacements}} is doing.
# Vertical metrics are weird in that the TTF 'vhea' and 'vmtx' tables are never
used by PDF readers; instead that info must be translated into DW2 and W2
tables. After (2) the in-memory font is inconsistent in that it has vertical
displacement data loaded but not present in the CIDFont dictionary. We write
the loaded data back into the CIDFont; that's {{freezeVerticalPositions}}. If
we don't do this then e.g. when rendering to bitmap the font gets re-loaded
from memory and the vertical positions will be wrong.
I wanted to simply override {{readVerticalDisplacements}}, but it would take
significant changes to the initialization of both classes: we need the {{ttf}}
and {{cid2gid}} fields to be initialized before we can fix up the
displacements, but {{readVerticalDisplacements}} is called from the {{super}}
constructor so these won't be initialized yet.
I chose to manipulate the vertical data fields directly rather than duplicate
them and add getters because there's some extensive position-getting logic in
the parent class that it seems I would need to duplicate.
If you have an idea for a better solution please let me know.
> Vertical text creation
> ----------------------
>
> Key: PDFBOX-4106
> URL: https://issues.apache.org/jira/browse/PDFBOX-4106
> Project: PDFBox
> Issue Type: New Feature
> Components: FontBox, Parsing, Writing
> Reporter: Aaron Madlon-Kay
> Priority: Major
> Labels: embed, gsub, parsing, vertical
> Attachments:
> 0001-Add-OpenTypeScript-class-to-get-OT-script-tags-for-c.patch,
> 0002-Optimize-Unicode-script-storage-and-lookup.patch,
> 0003-Parse-GSUB-table.patch,
> 0004-Abstract-cmap-lookup-into-an-interface.patch,
> 0005-Implement-GSUB-substitution-on-TrueTypeFont.patch,
> 0006-Use-vhea-vmtx-to-fix-vertical-displacements-in-PCIDF.patch,
> 0007-Add-factory-methods-for-loading-TTF-as-vertical-font.patch,
> 0008-Implement-vertical-metrics-support-when-embedding-subsetting.patch,
> sample_code.txt, vertical.pdf
>
>
> I needed to output vertical Japanese text, but was stymied by several
> limitations:
> * No API to load a TTF as Identity-V encoding
> * No support for 'vert' glyph substitution
> * No support for vertical metrics ('vhea' and 'vmtx' tables are parsed but
> not used at all)
> I have attached a series of patches that implement the above features.
> Highlights:
> * The GSUB glyph substitution table is parsed (limitation: type 1 lookups
> only; this is sufficient for many features including 'vert'/'vrt2' vertical
> glyph substitution)
> * Cmap lookup makes use of GSUB when features are enabled on a TTF
> * 'vhea' and 'vmtx' metrics are applied to PDCIDFont when appropriate, and
> are embedded/subsetted correctly through the DW2/W2 CIDFont dictionary
> * An API has been added for loading a TTF as a vertical font, setting
> Identity-V encoding and enabling 'vert'/'vrt2' substitution
> Each patch could approximately be split out into a separate ticket, if
> desired.
> Also attached is some sample code that exercises these patches and
> illustrates the effect of vertical glyph positioning. The sample output PDF
> is also attached.
--
This message was sent by Atlassian JIRA
(v7.6.3#76005)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]