示例#1
0
 public eblcSizeTreeNode(TTFFile file, TableDirectoryEntry entry, bitmapSizeTable size)
     : base(size.ppemX.ToString() + "×" + size.ppemY.ToString())
 {
     this.file  = file;
     this.entry = entry;
     this.size  = size;
 }
示例#2
0
 public eblcGlyphList(TTFFile file, bitmapSizeTable size)
 {
     this.file  = file;
     this.entry = file.tables["EBLC"];
     this.size  = size;
     this.InitComponents();
 }
示例#3
0
        public static TableTreeNode CreateTreeNode(TTFFile file, TableDirectoryEntry entry)
        {
            switch (entry.TagName)
            {
            case "EBLC": return(new eblcTreeNode(file, entry));

            case "head": return(new headTreeNode(file, entry));

            default:
                return(new TableTreeNode(file, entry));
            }
        }
示例#4
0
        public unsafe void SetStrike(TTFFile file, TableDirectoryEntry entry, bitmapSizeTable size)
        {
            this.file  = file;
            this.entry = entry;
            this.size  = size;
            this.horiLineMetrics.SetLineMetrics(size.hori);
            this.vertLineMetrics.SetLineMetrics(size.vert);

            // set text to labels
            this.lStartGlyphIndex.Text  = "0x" + ((uint)this.size.startGlyphIndex).ToString("X4");
            this.lEndGlyphIndex.Text    = "0x" + ((uint)this.size.endGlyphIndex).ToString("X4");
            this.lPpemX.Text            = this.size.ppemX.ToString();
            this.lPpemY.Text            = this.size.ppemY.ToString();
            this.lBitDepth.Text         = this.size.bitDepth.ToString();
            this.lColorRef.Text         = "0x" + ((uint)this.size.colorRef).ToString("X8");
            this.pictColorRef.BackColor = System.Drawing.Color.FromArgb((int)(uint)this.size.colorRef);
            this.chkHoriLayout.Checked  = this.size.HorizontalLayout;
            this.chkVertLayout.Checked  = this.size.VerticalLayout;

            // indexSubTableArray
            this.listView1.Items.Clear();
            fixed(byte *pImg = &this.file.image[0])
            {
                indexSubTableArray *subtableAB = (indexSubTableArray *)(pImg + (uint)entry.offset + (uint)size.indexSubTableArrayOffset);
                indexSubTableArray *subtableAM = subtableAB + (uint)size.numberOfIndexSubTables;
                indexSubTableArray *subtableA  = subtableAB;
                indexSubHeader *    subheader;

                while (subtableA < subtableAM)
                {
                    subheader = (indexSubHeader *)((byte *)subtableAB + (uint)subtableA->additionalOffsetToIndexSubTable);

                    string[] items = new string[] {
                        string.Format("{0:X4} - {1:X4}", (ushort)subtableA->firstGlyphIndex, (ushort)subtableA->lastGlyphIndex)
                        , subheader->IndexFormatString
                        , subheader->ImageFormatString
                        , subheader->NumberOfGlyph(*subtableA).ToString()
                    };
                    this.listView1.Items.Add(new System.Windows.Forms.ListViewItem(items));
                    subtableA++;
                }
            }
        }
示例#5
0
        private unsafe void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
        {
            if (e.Node.Text != "EBLC")
            {
                return;
            }
            if (e.Node.Parent != null && e.Node.Parent.Tag is TTFFile)
            {
                TTFFile             file  = (TTFFile)e.Node.Parent.Tag;
                TableDirectoryEntry entry = file.tables["EBLC"];
                Program.ErrorOut.WriteLine("EBLC 表を読みます。");
                Program.ErrorOut.AddIndent();
                fixed(byte *pBase = &file.image[0])
                {
                    byte *p = pBase;

                    p += (uint)entry.offset;

                    //-- header
                    eblcHeader *header = (eblcHeader *)p;
                    uint        nSize  = (uint)header->numSizes;

                    Program.ErrorOut.WriteLine("表バージョン番号: {0}", header->version.Value);
                    Program.ErrorOut.WriteLine("strike の数: {0}", nSize);
                    p += sizeof(eblcHeader);

                    //-- bitmapSizeTables
                    bitmapSizeTable *size  = (bitmapSizeTable *)p;
                    bitmapSizeTable *sizeM = size + nSize;

                    while (size < sizeM)
                    {
                        Program.ErrorOut.WriteLine("Size {{ppemX:{0} ; ppemY: {1}}}", size->ppemX, size->ppemY);
                        size++;
                    }
                }

                Program.ErrorOut.RemoveIndent();
            }
        }
示例#6
0
 public headTreeNode(TTFFile file, TableDirectoryEntry entry) : base(file, entry)
 {
 }
        public void Serialize(BinaryWriter writer, OpenTypeFont font)
        {
            DataTypeConverter.WriteFixed(writer, font.SfntVersion);
            DataTypeConverter.WriteUShort(writer, (ushort)font.Tables.Count);

            var pow         = Math.Floor(Math.Log(font.Tables.Count, 2));
            var searchRange = Math.Pow(2, pow) * 16;

            DataTypeConverter.WriteUShort(writer, (ushort)searchRange);
            DataTypeConverter.WriteUShort(writer, (ushort)pow);
            DataTypeConverter.WriteUShort(writer, (ushort)(font.Tables.Count * 16 - searchRange));

            var tableDirectoryStartOffset = writer.BaseStream.Position;

            writer.BaseStream.Position += 4 * DataTypeLength.ULong * font.Tables.Count;

            var entryList      = new List <TableDirectoryEntry>(font.Tables.Count);
            var additionalInfo = new SerializationInfo(); // Shared info among all IOpenTypeFontSerializable class

            foreach (
                var table in font.Tables.OrderByDescending(table => TableDirectoryEntry.GetPriorityOfTag(table.Tag)))
            {
                var startOffsetOfThisTable = writer.BaseStream.Position;

                table.Serialize(writer, startOffsetOfThisTable, additionalInfo);

                entryList.Add(new TableDirectoryEntry
                {
                    Tag    = table.Tag,
                    Offset = (uint)startOffsetOfThisTable,
                    Length = (uint)(writer.BaseStream.Position - startOffsetOfThisTable)
                });

                // 4byte padding
                if (writer.BaseStream.Position % 4 != 0)
                {
                    var zeroCount = 4 - writer.BaseStream.Position % 4;
                    for (var i = 0; i < zeroCount; i++)
                    {
                        writer.Write((byte)0);
                    }
                }
            }

            // Write table directory
            var reader = new BinaryReader(writer.BaseStream);

            writer.BaseStream.Position = tableDirectoryStartOffset;
            foreach (var entry in entryList.OrderBy(entry => entry.Tag, StringComparer.Ordinal))
            {
                DataTypeConverter.WriteTag(writer, entry.Tag);
                DataTypeConverter.WriteULong(writer,
                                             EnableChecksum ? CalculateChecksum(reader, entry.Offset, entry.Length) : 0);
                DataTypeConverter.WriteULong(writer, entry.Offset);
                DataTypeConverter.WriteULong(writer, entry.Length);
            }

            // Calculate checksum for the entire font
            if (EnableChecksum)
            {
                writer.BaseStream.Position = entryList.Single(entry => entry.Tag == "head").Offset +
                                             2 * DataTypeLength.Fixed;
                DataTypeConverter.WriteULong(writer,
                                             0xB1B0AFBA - CalculateChecksum(reader, 0, (uint)reader.BaseStream.Length));
            }
        }
        public OpenTypeFont Deserialize(BinaryReader reader)
        {
            var font = new OpenTypeFont {
                SfntVersion = DataTypeConverter.ReadFixed(reader)
            };

            if (!_supportedSfntVersions.Contains(font.SfntVersion))
            {
                throw new NotSupportedException("Bad sfnt version.");
            }

            // Table directory
            var numberOfTables = DataTypeConverter.ReadUShort(reader);

            reader.BaseStream.Position += 3 * DataTypeLength.UShort; // searchRange, entrySelector, rangeShift
            var entryList = Enumerable.Range(0, numberOfTables).Select(i =>
            {
                var entry = new TableDirectoryEntry {
                    Tag = DataTypeConverter.ReadTag(reader)
                };
                reader.BaseStream.Position += DataTypeLength.ULong; // checksum
                entry.Offset = DataTypeConverter.ReadULong(reader);
                entry.Length = DataTypeConverter.ReadULong(reader);
                return(entry);
            }).ToList();

            // Tables
            font.Tables.AddRange(
                entryList.OrderBy(entry => entry.Priority).Select <TableDirectoryEntry, IOpenTypeFontTable>(entry =>
            {
                switch (entry.Tag)
                {
                case "cmap":
                    return(CmapTable.Deserialize(reader, entry.Offset));

                case "head":
                    return(HeadTable.Deserialize(reader, entry.Offset));

                case "maxp":
                    return(MaxpTable.Deserialize(reader, entry.Offset));

                case "loca":
                    return(LocaTable.Deserialize(reader, entry.Offset,
                                                 font.Get <MaxpTable>().NumberOfGlyphs,
                                                 font.Get <HeadTable>().LocaTableVersion));

                case "glyf":
                    return(GlyfTable.Deserialize(reader, entry.Offset, entry.Length,
                                                 font.Get <LocaTable>()));

                case "hhea":
                    return(HheaTable.Deserialize(reader, entry.Offset));

                case "hmtx":
                    return(HmtxTable.Deserialize(reader, entry.Offset, font.Get <HheaTable>().NumberOfHMetrics,
                                                 font.Get <MaxpTable>().NumberOfGlyphs));

                case "post":
                    return(PostTable.Deserialize(reader, entry.Offset));

                default:
                    return(BinaryDataTable.Deserialize(reader, entry.Offset, entry.Length, entry.Tag));
                }
            }));

            return(font);
        }
示例#9
0
 public eblcTreeNode(TTFFile file, TableDirectoryEntry entry) : base(file, entry)
 {
     this.Nodes.Add("null");
 }
示例#10
0
 public eblcSizeControl(TTFFile file, TableDirectoryEntry entry, bitmapSizeTable size) : this()
 {
     this.SetStrike(file, entry, size);
 }
示例#11
0
 internal TableTreeNode(TTFFile file, TableDirectoryEntry entry) : base(entry.TagName)
 {
     this.file  = file;
     this.entry = entry;
 }