public static Glyph ParseGlyph(FontParser parser,FontFace font,float range){ // How many contours has it got? int contourCount=parser.ReadInt16(); // Skip bounds - we don't trust these too much, so we'll figure them out ourselves: parser.Position+=8; if(contourCount>0){ // This glyph is not a composite. // Create the glyph: Glyph glyph=new Glyph(font); if(Fonts.Preload){ LoadGlyph(glyph,contourCount,parser,range); }else{ // Increase unloaded count: font.UnloadedGlyphs++; // Add position info: glyph.AddPathNode(new LoadMetaPoint(parser.Position,contourCount)); } return glyph; }else if(contourCount==0){ // Empty glyph e.g. space. Create the glyph: Glyph glyph=new Glyph(font); return glyph; } CompositeGlyph compGlyph=new CompositeGlyph(font); bool moreComponents=true; while(moreComponents){ ushort cFlags=parser.ReadUInt16(); ushort glyphIndex=parser.ReadUInt16(); VectorTransform component=new VectorTransform(glyphIndex); if ((cFlags & 1) > 0) { // The arguments are words component.Dx = (float)parser.ReadInt16() / range; component.Dy = (float)parser.ReadInt16() / range; } else { // The arguments are bytes component.Dx = (float)parser.ReadByte() / range; component.Dy = (float)parser.ReadByte() / range; } if ((cFlags & 8) > 0) { // We have one scale component.XScale = component.YScale = parser.ReadF2Dot14(); } else if ((cFlags & 64) > 0) { // We have an X / Y scale component.XScale = parser.ReadF2Dot14(); component.YScale = parser.ReadF2Dot14(); } else if ((cFlags & 128) > 0) { // We have a 2x2 transformation component.XScale = parser.ReadF2Dot14(); component.Scale01 = parser.ReadF2Dot14(); component.Scale10 = parser.ReadF2Dot14(); component.YScale = parser.ReadF2Dot14(); } // Push the component to the end: compGlyph.AddComponent(component); moreComponents = ((cFlags & 32)==32); } return compGlyph; }
public static Glyph ParseGlyph(FontParser parser, FontFace font, float range) { // How many contours has it got? int contourCount = parser.ReadInt16(); // Skip bounds - we don't trust these too much, so we'll figure them out ourselves: parser.Position += 8; if (contourCount > 0) { // This glyph is not a composite. // Create the glyph: Glyph glyph = new Glyph(font); if (Fonts.Preload) { LoadGlyph(glyph, contourCount, parser, range); } else { // Increase unloaded count: font.UnloadedGlyphs++; // Add position info: glyph.AddPathNode(new LoadMetaPoint(parser.Position, contourCount)); } return(glyph); } else if (contourCount == 0) { // Empty glyph e.g. space. Create the glyph: Glyph glyph = new Glyph(font); return(glyph); } CompositeGlyph compGlyph = new CompositeGlyph(font); bool moreComponents = true; while (moreComponents) { ushort cFlags = parser.ReadUInt16(); ushort glyphIndex = parser.ReadUInt16(); VectorTransform component = new VectorTransform(glyphIndex); if ((cFlags & 1) > 0) { // The arguments are words component.Dx = (float)parser.ReadInt16() / range; component.Dy = (float)parser.ReadInt16() / range; } else { // The arguments are bytes component.Dx = (float)parser.ReadByte() / range; component.Dy = (float)parser.ReadByte() / range; } if ((cFlags & 8) > 0) { // We have one scale component.XScale = component.YScale = parser.ReadF2Dot14(); } else if ((cFlags & 64) > 0) { // We have an X / Y scale component.XScale = parser.ReadF2Dot14(); component.YScale = parser.ReadF2Dot14(); } else if ((cFlags & 128) > 0) { // We have a 2x2 transformation component.XScale = parser.ReadF2Dot14(); component.Scale01 = parser.ReadF2Dot14(); component.Scale10 = parser.ReadF2Dot14(); component.YScale = parser.ReadF2Dot14(); } // Push the component to the end: compGlyph.AddComponent(component); moreComponents = ((cFlags & 32) == 32); } return(compGlyph); }