Class OTFSubSetFile


  • public class OTFSubSetFile
    extends OTFSubSetWriter
    Reads an OpenType CFF file and generates a subset The OpenType specification can be found at the Microsoft Typography site: http://www.microsoft.com/typography/otspec/
    • Field Detail

      • subsetGlyphs

        protected java.util.Map<java.lang.Integer,​java.lang.Integer> subsetGlyphs
        A map containing each glyph to be included in the subset with their existing and new GID's
      • gidToSID

        protected java.util.Map<java.lang.Integer,​java.lang.Integer> gidToSID
        A map of the new GID to SID used to construct the charset table
      • subsetLocalIndexSubr

        protected java.util.List<byte[]> subsetLocalIndexSubr
        List of subroutines to write to the local / global indexes in the subset font
      • subsetGlobalIndexSubr

        protected java.util.List<byte[]> subsetGlobalIndexSubr
      • fdSubrs

        protected java.util.List<java.util.List<byte[]>> fdSubrs
        For fonts which have an FDSelect or ROS flag in Top Dict, this is used to store the local subroutine indexes for each group as opposed to the above subsetLocalIndexSubr
      • subsetFDSelect

        private java.util.Map<java.lang.Integer,​OTFSubSetFile.FDIndexReference> subsetFDSelect
        The subset FD Select table used to store the mappings between glyphs and their associated FDFont object which point to a private dict and local subroutines.
      • localUniques

        protected java.util.List<java.lang.Integer> localUniques
        A list of unique subroutines from the global / local subroutine indexes
      • globalUniques

        protected java.util.List<java.lang.Integer> globalUniques
      • subsetLocalSubrCount

        protected int subsetLocalSubrCount
        A store of the number of subroutines each global / local subroutine will store
      • subsetGlobalSubrCount

        protected int subsetGlobalSubrCount
      • subsetCharStringsIndex

        protected java.util.List<byte[]> subsetCharStringsIndex
        A list of char string data for each glyph to be stored in the subset font
      • embeddedName

        protected java.lang.String embeddedName
        The embedded name to change in the name table
      • stringIndexData

        protected java.util.List<byte[]> stringIndexData
        An array used to hold the string index data for the subset font
      • cffReader

        protected CFFDataReader cffReader
        The CFF reader object used to read data and offsets from the original font file
      • mbFont

        private MultiByteFont mbFont
        The class used to represent this font
      • NUM_STANDARD_STRINGS

        public static final int NUM_STANDARD_STRINGS
        The number of standard strings in CFF
        See Also:
        Constant Field Values
      • LOCAL_SUBROUTINE

        private static final int LOCAL_SUBROUTINE
        The operator used to identify a local subroutine reference
        See Also:
        Constant Field Values
      • GLOBAL_SUBROUTINE

        private static final int GLOBAL_SUBROUTINE
        The operator used to identify a global subroutine reference
        See Also:
        Constant Field Values
    • Constructor Detail

      • OTFSubSetFile

        public OTFSubSetFile()
                      throws java.io.IOException
        Throws:
        java.io.IOException
    • Method Detail

      • readFont

        public void readFont​(FontFileReader in,
                             java.lang.String embeddedName,
                             MultiByteFont mbFont)
                      throws java.io.IOException
        Description copied from class: OpenFont
        Reads a font.
        Overrides:
        readFont in class OpenFont
        Parameters:
        in - FontFileReader to read from
        Throws:
        java.io.IOException - in case of an I/O problem
      • readFont

        void readFont​(FontFileReader in,
                      java.lang.String embeddedName,
                      MultiByteFont mbFont,
                      java.util.Map<java.lang.Integer,​java.lang.Integer> usedGlyphs)
               throws java.io.IOException
        Reads and creates a subset of the font.
        Parameters:
        in - FontFileReader to read from
        embeddedName - Name to be checked for in the font file
        usedGlyphs - Map of glyphs (glyphs has old index as (Integer) key and new index as (Integer) value)
        Throws:
        java.io.IOException - in case of an I/O problem
      • mapChars

        private void mapChars​(java.util.Map<java.lang.Integer,​java.lang.Integer> usedGlyphs)
                       throws java.io.IOException
        Throws:
        java.io.IOException
      • sortByValue

        private java.util.Map<java.lang.Integer,​java.lang.Integer> sortByValue​(java.util.Map<java.lang.Integer,​java.lang.Integer> map)
      • createCFF

        protected void createCFF()
                          throws java.io.IOException
        Throws:
        java.io.IOException
      • writeFDArray

        private int writeFDArray​(java.util.List<java.lang.Integer> subsetFDFonts,
                                 java.util.List<java.lang.Integer> fontNameSIDs)
                          throws java.io.IOException
        Throws:
        java.io.IOException
      • isCharStringBeforeFD

        private boolean isCharStringBeforeFD()
      • storeFDStrings

        protected java.util.List<java.lang.Integer> storeFDStrings​(java.util.List<java.lang.Integer> uniqueNewRefs)
                                                            throws java.io.IOException
        Throws:
        java.io.IOException
      • writeTopDICT

        protected int writeTopDICT()
                            throws java.io.IOException
        Throws:
        java.io.IOException
      • writeROSEntry

        private byte[] writeROSEntry​(CFFDataReader.DICTEntry dictEntry)
                              throws java.io.IOException
        Throws:
        java.io.IOException
      • writeCIDCount

        protected byte[] writeCIDCount​(CFFDataReader.DICTEntry dictEntry)
                                throws java.io.IOException
        Throws:
        java.io.IOException
      • writeTopDictStringEntry

        private byte[] writeTopDictStringEntry​(CFFDataReader.DICTEntry dictEntry)
                                        throws java.io.IOException
        Throws:
        java.io.IOException
      • writeStringIndex

        private void writeStringIndex()
                               throws java.io.IOException
        Throws:
        java.io.IOException
      • createCharStringDataCID

        protected void createCharStringDataCID()
                                        throws java.io.IOException
        Throws:
        java.io.IOException
      • writeFDSelect

        protected void writeFDSelect()
      • getFormat3Index

        private java.util.Map<java.lang.Integer,​java.lang.Integer> getFormat3Index()
      • getUsedFDFonts

        protected java.util.List<java.lang.Integer> getUsedFDFonts()
      • writeCIDDictsAndSubrs

        protected java.util.List<java.lang.Integer> writeCIDDictsAndSubrs​(java.util.List<java.lang.Integer> uniqueNewRefs)
                                                                   throws java.io.IOException
        Throws:
        java.io.IOException
      • resizeToFitOpLen

        private byte[] resizeToFitOpLen​(byte[] fdPrivateDictByteData,
                                        CFFDataReader.DICTEntry subrs)
                                 throws java.io.IOException
        Throws:
        java.io.IOException
      • writeFDArray

        protected int writeFDArray​(java.util.List<java.lang.Integer> uniqueNewRefs,
                                   java.util.List<java.lang.Integer> privateDictOffsets,
                                   java.util.List<java.lang.Integer> fontNameSIDs)
                            throws java.io.IOException
        Throws:
        java.io.IOException
      • createCharStringData

        private void createCharStringData()
                                   throws java.io.IOException
        Throws:
        java.io.IOException
      • preScanForSubsetIndexSize

        private void preScanForSubsetIndexSize​(byte[] data)
                                        throws java.io.IOException
        Throws:
        java.io.IOException
      • preScanForSubsetIndexSize

        private void preScanForSubsetIndexSize​(CFFDataReader.CFFIndexData indexSubr,
                                               java.util.List<java.lang.Integer> uniques)
                                        throws java.io.IOException
        Throws:
        java.io.IOException
      • getSubrNumber

        private int getSubrNumber​(int numSubroutines,
                                  int operand)
      • readCharStringData

        private byte[] readCharStringData​(byte[] data,
                                          int subsetLocalSubrCount)
                                   throws java.io.IOException
        Throws:
        java.io.IOException
      • getNewRefForReference

        private int getNewRefForReference​(int subrNumber,
                                          java.util.List<java.lang.Integer> uniquesArray,
                                          CFFDataReader.CFFIndexData indexSubr,
                                          java.util.List<byte[]> subsetIndexSubr,
                                          int subrCount)
                                   throws java.io.IOException
        Throws:
        java.io.IOException
      • getBias

        private int getBias​(int subrCount)
      • constructNewRefData

        private byte[] constructNewRefData​(int curDataPos,
                                           byte[] currentData,
                                           OTFSubSetFile.BytesNumber operand,
                                           int fullSubsetIndexSize,
                                           int curSubsetIndexSize,
                                           int[] operatorCode)
                                    throws java.io.IOException
        Throws:
        java.io.IOException
      • createNewRef

        public static byte[] createNewRef​(int newRef,
                                          int[] operatorCode,
                                          int forceLength,
                                          boolean isDict)
      • writeIndex

        protected int writeIndex​(java.util.List<byte[]> dataArray)
      • writeIndex

        protected int writeIndex​(java.util.List<byte[]> dataArray,
                                 int offSize)
      • getOffSize

        private int getOffSize​(int totLength)
      • writeCharsetTable

        private void writeCharsetTable​(boolean cidFont)
                                throws java.io.IOException
        Throws:
        java.io.IOException
      • writePrivateDict

        protected void writePrivateDict()
                                 throws java.io.IOException
        Throws:
        java.io.IOException
      • updateOffsets

        protected void updateOffsets​(OTFSubSetFile.Offsets offsets)
                              throws java.io.IOException
        Throws:
        java.io.IOException
      • updateCIDOffsets

        protected void updateCIDOffsets​(OTFSubSetFile.Offsets offsets)
                                 throws java.io.IOException
        Throws:
        java.io.IOException
      • updateOffset

        private void updateOffset​(int position,
                                  int length,
                                  int replacement)
                           throws java.io.IOException
        Throws:
        java.io.IOException
      • updateOffset

        private void updateOffset​(byte[] out,
                                  int position,
                                  int length,
                                  int replacement)
      • getCFFReader

        public CFFDataReader getCFFReader()
        Returns the parsed CFF data for the original font.
        Returns:
        The CFFDataReader contaiing the parsed data