static CompositeGlyph ReadCompositeGlyph(DataReader reader) { // we need to keep reading glyphs for as long as // our flags tell us that there are more to read var subglyphs = new List <Subglyph>(); CompositeGlyphFlags flags; do { flags = (CompositeGlyphFlags)reader.ReadUInt16BE(); var subglyph = new Subglyph { Flags = flags }; subglyph.Index = reader.ReadUInt16BE(); // read in args; they vary in size based on flags if ((flags & CompositeGlyphFlags.ArgsAreWords) != 0) { subglyph.Arg1 = reader.ReadInt16BE(); subglyph.Arg2 = reader.ReadInt16BE(); } else { subglyph.Arg1 = reader.ReadSByte(); subglyph.Arg2 = reader.ReadSByte(); } // figure out the transform; we can either have no scale, a uniform // scale, two independent scales, or a full 2x2 transform matrix // transform components are in 2.14 fixed point format var transform = Matrix3x2.Identity; if ((flags & CompositeGlyphFlags.HaveScale) != 0) { var scale = reader.ReadInt16BE() / F2Dot14ToFloat; transform.M11 = scale; transform.M22 = scale; } else if ((flags & CompositeGlyphFlags.HaveXYScale) != 0) { transform.M11 = reader.ReadInt16BE() / F2Dot14ToFloat; transform.M22 = reader.ReadInt16BE() / F2Dot14ToFloat; } else if ((flags & CompositeGlyphFlags.HaveTransform) != 0) { transform.M11 = reader.ReadInt16BE() / F2Dot14ToFloat; transform.M12 = reader.ReadInt16BE() / F2Dot14ToFloat; transform.M21 = reader.ReadInt16BE() / F2Dot14ToFloat; transform.M22 = reader.ReadInt16BE() / F2Dot14ToFloat; } subglyph.Transform = transform; subglyphs.Add(subglyph); } while ((flags & CompositeGlyphFlags.MoreComponents) != 0); var result = new CompositeGlyph { Subglyphs = subglyphs.ToArray() }; // if we have instructions, read them now if ((flags & CompositeGlyphFlags.HaveInstructions) != 0) { var instructionLength = reader.ReadUInt16BE(); result.Instructions = reader.ReadBytes(instructionLength); } return(result); }
static CompositeGlyph ReadCompositeGlyph(DataReader reader) { // we need to keep reading glyphs for as long as // our flags tell us that there are more to read var subglyphs = new List<Subglyph>(); CompositeGlyphFlags flags; do { flags = (CompositeGlyphFlags)reader.ReadUInt16BE(); var subglyph = new Subglyph { Flags = flags }; subglyph.Index = reader.ReadUInt16BE(); // read in args; they vary in size based on flags if ((flags & CompositeGlyphFlags.ArgsAreWords) != 0) { subglyph.Arg1 = reader.ReadInt16BE(); subglyph.Arg2 = reader.ReadInt16BE(); } else { subglyph.Arg1 = reader.ReadSByte(); subglyph.Arg2 = reader.ReadSByte(); } // figure out the transform; we can either have no scale, a uniform // scale, two independent scales, or a full 2x2 transform matrix // transform components are in 2.14 fixed point format var transform = Matrix3x2.Identity; if ((flags & CompositeGlyphFlags.HaveScale) != 0) { var scale = reader.ReadInt16BE() / F2Dot14ToFloat; transform.M11 = scale; transform.M22 = scale; } else if ((flags & CompositeGlyphFlags.HaveXYScale) != 0) { transform.M11 = reader.ReadInt16BE() / F2Dot14ToFloat; transform.M22 = reader.ReadInt16BE() / F2Dot14ToFloat; } else if ((flags & CompositeGlyphFlags.HaveTransform) != 0) { transform.M11 = reader.ReadInt16BE() / F2Dot14ToFloat; transform.M12 = reader.ReadInt16BE() / F2Dot14ToFloat; transform.M21 = reader.ReadInt16BE() / F2Dot14ToFloat; transform.M22 = reader.ReadInt16BE() / F2Dot14ToFloat; } subglyph.Transform = transform; subglyphs.Add(subglyph); } while ((flags & CompositeGlyphFlags.MoreComponents) != 0); var result = new CompositeGlyph { Subglyphs = subglyphs.ToArray() }; // if we have instructions, read them now if ((flags & CompositeGlyphFlags.HaveInstructions) != 0) { var instructionLength = reader.ReadUInt16BE(); result.Instructions = reader.ReadBytes(instructionLength); } return result; }