예제 #1
0
 public CompactFontFormatFont(CompactFontFormatTopLevelDictionary topDictionary, CompactFontFormatPrivateDictionary privateDictionary,
                              ICompactFontFormatCharset charset,
                              Union <Type1CharStrings, Type2CharStrings> charStrings)
 {
     TopDictionary     = topDictionary;
     PrivateDictionary = privateDictionary;
     Charset           = charset;
     CharStrings       = charStrings;
 }
예제 #2
0
 internal CompactFontFormatFont(CompactFontFormatTopLevelDictionary topDictionary, CompactFontFormatPrivateDictionary privateDictionary,
                                ICompactFontFormatCharset charset,
                                Union <Type1CharStrings, Type2CharStrings> charStrings, Encoding fontEncoding)
 {
     TopDictionary     = topDictionary;
     PrivateDictionary = privateDictionary;
     Charset           = charset;
     CharStrings       = charStrings;
     Encoding          = fontEncoding;
 }
예제 #3
0
 public CompactFontFormatCidFont(CompactFontFormatTopLevelDictionary topDictionary, CompactFontFormatPrivateDictionary privateDictionary,
                                 ICompactFontFormatCharset charset,
                                 Union <Type1CharStrings, Type2CharStrings> charStrings,
                                 IReadOnlyList <CompactFontFormatTopLevelDictionary> fontDictionaries,
                                 IReadOnlyList <CompactFontFormatPrivateDictionary> privateDictionaries,
                                 ICompactFontFormatFdSelect fdSelect) : base(topDictionary, privateDictionary, charset, charStrings, null)
 {
     FontDictionaries    = fontDictionaries;
     PrivateDictionaries = privateDictionaries;
     FdSelect            = fdSelect;
 }
        private static Type2CharStrings ReadCharStrings(CompactFontFormatData data, CompactFontFormatTopLevelDictionary topDictionary,
                                                        CompactFontFormatIndex charStringIndex,
                                                        CompactFontFormatSubroutinesSelector subroutinesSelector,
                                                        ICompactFontFormatCharset charset)
        {
            data.Seek(topDictionary.CharStringsOffset);

            switch (topDictionary.CharStringType)
            {
            case CompactFontFormatCharStringType.Type1:
                throw new NotImplementedException("Type 1 CharStrings are not currently supported in CFF font.");

            case CompactFontFormatCharStringType.Type2:
                return(Type2CharStringParser.Parse(charStringIndex, subroutinesSelector, charset));

            default:
                throw new ArgumentOutOfRangeException($"Unexpected CharString type in CFF font: {topDictionary.CharStringType}.");
            }
        }
        private CompactFontFormatCidFont ReadCidFont(CompactFontFormatData data, CompactFontFormatTopLevelDictionary topLevelDictionary,
                                                     int numberOfGlyphs,
                                                     IReadOnlyList <string> stringIndex,
                                                     CompactFontFormatPrivateDictionary privateDictionary,
                                                     ICompactFontFormatCharset charset,
                                                     CompactFontFormatIndex globalSubroutines,
                                                     CompactFontFormatIndex localSubroutinesTop,
                                                     CompactFontFormatIndex charStringIndex)
        {
            var offset = topLevelDictionary.CidFontOperators.FontDictionaryArray;

            data.Seek(offset);

            var fontDict = CompactFontFormatIndexReader.ReadDictionaryData(data);

            var privateDictionaries  = new List <CompactFontFormatPrivateDictionary>();
            var fontDictionaries     = new List <CompactFontFormatTopLevelDictionary>();
            var fontLocalSubroutines = new List <CompactFontFormatIndex>();

            foreach (var index in fontDict)
            {
                var topLevelDictionaryCid = topLevelDictionaryReader.Read(new CompactFontFormatData(index), stringIndex);

                if (!topLevelDictionaryCid.PrivateDictionaryLocation.HasValue)
                {
                    throw new InvalidFontFormatException("The CID keyed Compact Font Format font did not contain a private dictionary for the font dictionary.");
                }

                var privateDictionaryBytes = data.SnapshotPortion(topLevelDictionaryCid.PrivateDictionaryLocation.Value.Offset,
                                                                  topLevelDictionaryCid.PrivateDictionaryLocation.Value.Size);

                var privateDictionaryCid = privateDictionaryReader.Read(privateDictionaryBytes, stringIndex);

                // CFFParser.java line 625 - read the local subroutines.
                if (privateDictionaryCid.LocalSubroutineOffset.HasValue && privateDictionaryCid.LocalSubroutineOffset.Value > 0)
                {
                    data.Seek(topLevelDictionaryCid.PrivateDictionaryLocation.Value.Offset + privateDictionaryCid.LocalSubroutineOffset.Value);
                    var localSubroutines = CompactFontFormatIndexReader.ReadDictionaryData(data);
                    fontLocalSubroutines.Add(localSubroutines);
                }
                else
                {
                    fontLocalSubroutines.Add(null);
                }

                fontDictionaries.Add(topLevelDictionaryCid);
                privateDictionaries.Add(privateDictionaryCid);
            }

            data.Seek(topLevelDictionary.CidFontOperators.FontDictionarySelect);

            var format = data.ReadCard8();

            ICompactFontFormatFdSelect fdSelect;

            switch (format)
            {
            case 0:
            {
                fdSelect = ReadFormat0FdSelect(data, numberOfGlyphs, topLevelDictionary.CidFontOperators.Ros);
                break;
            }

            case 3:
            {
                fdSelect = ReadFormat3FdSelect(data, topLevelDictionary.CidFontOperators.Ros);
                break;
            }

            default:
                throw new InvalidFontFormatException($"Invalid Font Dictionary Select format: {format}.");
            }

            var subroutineSelector = new CompactFontFormatSubroutinesSelector(globalSubroutines, localSubroutinesTop,
                                                                              fdSelect, fontLocalSubroutines);

            var charStrings = ReadCharStrings(data, topLevelDictionary, charStringIndex, subroutineSelector, charset);

            var union = Union <Type1CharStrings, Type2CharStrings> .Two(charStrings);

            return(new CompactFontFormatCidFont(topLevelDictionary, privateDictionary, charset, union,
                                                fontDictionaries, privateDictionaries, fdSelect));
        }
        private static ICompactFontFormatCharset ReadCharset(CompactFontFormatData data, CompactFontFormatTopLevelDictionary topDictionary,
                                                             CompactFontFormatIndex charStringIndex, IReadOnlyList <string> stringIndex)
        {
            data.Seek(topDictionary.CharSetOffset);

            var format = data.ReadCard8();

            switch (format)
            {
            case 0:
            {
                var glyphToNamesAndStringId = new List <(int glyphId, int stringId, string name)>();

                for (var glyphId = 1; glyphId < charStringIndex.Count; glyphId++)
                {
                    var stringId = data.ReadSid();
                    glyphToNamesAndStringId.Add((glyphId, stringId, ReadString(stringId, stringIndex)));
                }

                return(new CompactFontFormatFormat0Charset(glyphToNamesAndStringId));
            }

            case 1:
            case 2:
            {
                var glyphToNamesAndStringId = new List <(int glyphId, int stringId, string name)>();

                for (var glyphId = 1; glyphId < charStringIndex.Count; glyphId++)
                {
                    var firstSid      = data.ReadSid();
                    var numberInRange = format == 1 ? data.ReadCard8() : data.ReadCard16();

                    glyphToNamesAndStringId.Add((glyphId, firstSid, ReadString(firstSid, stringIndex)));
                    for (var i = 0; i < numberInRange; i++)
                    {
                        glyphId++;
                        var sid = firstSid + i + 1;
                        glyphToNamesAndStringId.Add((glyphId, sid, ReadString(sid, stringIndex)));
                    }
                }

                if (format == 1)
                {
                    return(new CompactFontFormatFormat1Charset(glyphToNamesAndStringId));
                }

                return(new CompactFontFormatFormat2Charset(glyphToNamesAndStringId));
            }

            default:
                throw new InvalidOperationException($"Unrecognized format for the Charset table in a CFF font. Got: {format}.");
            }
        }