public static void TransformPoints(GlyphPoint[] p, GlyphComponent c) { foreach (var t in p) { var px = t.X; var py = t.Y; t.X = (short)(c.XScale * px + c.Scale01 * py + c.DX); t.Y = (short)(c.Scale10 * px + c.YScale * py + c.DY); } }
public static GlyphComponent Load(FontSource p) { var gc = new GlyphComponent(); var flags = p.ReadUShort(); gc.GlyphId = p.ReadUShort(); if ((flags & 1) > 0) { if ((flags & 2) > 0) { gc.DX = p.ReadShort(); gc.DY = p.ReadShort(); } else { gc.MatchedPoints = new[] { p.ReadUShort(), p.ReadUShort() }; } } else { if ((flags & 2) > 0) { gc.DX = p.ReadSByte(); gc.DY = p.ReadSByte(); } else { gc.MatchedPoints = new[] { p.ReadUShort(), p.ReadUShort() }; } } if ((flags & 8) > 0) { gc.XScale = gc.YScale = p.ReadF2Dot14(); } else if ((flags & 64) > 0) { gc.XScale = p.ReadF2Dot14(); gc.YScale = p.ReadF2Dot14(); } else if ((flags & 128) > 0) { gc.XScale = p.ReadF2Dot14(); gc.Scale01 = p.ReadF2Dot14(); gc.Scale10 = p.ReadF2Dot14(); gc.YScale = p.ReadF2Dot14(); } gc.MoreComponents = (flags & 32) > 0; return(gc); }
public GlyphComponent[] GetGlyphComponents(FontSource source) { source.Offset = Offset; var list = new List <GlyphComponent>(); var limit = 10; while (limit-- > 0) { var component = GlyphComponent.Load(source); list.Add(component); if (!component.MoreComponents) { break; } } return(list.ToArray()); }