public eblcSizeTreeNode(TTFFile file, TableDirectoryEntry entry, bitmapSizeTable size) : base(size.ppemX.ToString() + "×" + size.ppemY.ToString()) { this.file = file; this.entry = entry; this.size = size; }
public eblcGlyphList(TTFFile file, bitmapSizeTable size) { this.file = file; this.entry = file.tables["EBLC"]; this.size = size; this.InitComponents(); }
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)); } }
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++; } } }
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(); } }
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); }
public eblcTreeNode(TTFFile file, TableDirectoryEntry entry) : base(file, entry) { this.Nodes.Add("null"); }
public eblcSizeControl(TTFFile file, TableDirectoryEntry entry, bitmapSizeTable size) : this() { this.SetStrike(file, entry, size); }
internal TableTreeNode(TTFFile file, TableDirectoryEntry entry) : base(entry.TagName) { this.file = file; this.entry = entry; }