protected override void FormatTagElement(DefineFont3Tag tag, XElement xTag) { xTag.Add(new XAttribute(LANGUAGE_ATTRIB, tag.Language)); xTag.Add(new XAttribute(SHIFT_JIS_ATTRIB, CommonFormatter.Format(tag.ShiftJIS))); xTag.Add(new XAttribute(UNICODE_ATTRIB, CommonFormatter.Format(tag.SmallText))); xTag.Add(new XAttribute(ANSI_ATTRIB, CommonFormatter.Format(tag.ANSI))); xTag.Add(new XAttribute(WIDE_GLYPH_OFFSETS_ATTRIB, CommonFormatter.Format(tag.WideOffsets))); xTag.Add(new XAttribute("wideCodes", CommonFormatter.Format(tag.WideCodes))); xTag.Add(new XAttribute(ITALIC_ATTRIB, CommonFormatter.Format(tag.Italic))); xTag.Add(new XAttribute(BOLD_ATTRIB, CommonFormatter.Format(tag.Bold))); xTag.Add(new XAttribute(NAME_ATTRIB, tag.FontName.TrimEnd('\0'))); var xGlyphs = new XElement("glyphs"); foreach (var glyph in tag.Glyphs) { var xGlyph = XGlyph.ToXml(glyph); xGlyphs.Add(xGlyph); } xTag.Add(xGlyphs); if (tag.HasLayout) { xTag.Add(new XAttribute("ascent", tag.Ascent)); xTag.Add(new XAttribute("descent", tag.Descent)); xTag.Add(new XAttribute("leading", tag.Leading)); var xAdvance = new XElement("advance"); foreach (var glyph in tag.Glyphs) { var xGlyph = new XElement("Short"); xGlyph.Add(new XAttribute("value", glyph.Advance)); xAdvance.Add(xGlyph); } xTag.Add(xAdvance); var xBounds = new XElement("bounds"); foreach (var glyph in tag.Glyphs) { xBounds.Add(XRect.ToXml(glyph.Bounds)); } xTag.Add(xBounds); var xKerningRecords = new XElement("wideKerning"); foreach (var kerningRecord in tag.KerningRecords) { xKerningRecords.Add(XKerningRecord.ToXml(kerningRecord)); } xTag.Add(xKerningRecords); } }
protected override bool AcceptTagElement(DefineFont3Tag tag, XElement element) { switch (element.Name.LocalName) { case "wideKerning": tag.HasLayout = true; foreach (var xRecord in element.Elements()) { tag.KerningRecords.Add(XKerningRecord.FromXml(xRecord)); } break; case "advance": tag.HasLayout = true; var advanceIndex = 0; foreach (var xAdvance in element.Elements()) { var xValue = xAdvance.Attribute("value"); tag.Glyphs[advanceIndex].Advance = short.Parse(xValue.Value); advanceIndex++; } break; case "bounds": tag.HasLayout = true; var boundIndex = 0; foreach (var xBound in element.Elements()) { tag.Glyphs[boundIndex].Bounds = XRect.FromXml(xBound); boundIndex++; } break; case "glyphs": foreach (var xGlyph in element.Elements()) { tag.Glyphs.Add(XGlyph.FromXml(xGlyph)); } break; default: return(false); } return(true); }