/// <summary> /// Writes the offset table that appears at the beginning of /// every TrueType/OpenType font. /// </summary> private void WriteOffsetTable() { // sfnt version (0x00010000 for version 1.0). stream.WriteFixed(0x00010000); // numTables field int numTables = tables.Count; stream.WriteUShort(numTables); // searchRange field ((Maximum power of 2 <= numTables) x 16) int maxPower = MaxPow2(numTables); int searchRange = maxPower * 16; stream.WriteUShort(searchRange); // entrySelector (Log2(maximum power of 2 <= numTables)) int entrySelector = (int)(Math.Log(maxPower, 2)); stream.WriteUShort(entrySelector); // NumTables x 16-searchRange. int rangeShift = numTables * 16 - searchRange; stream.WriteUShort(rangeShift); }
protected internal override void Write(FontFileWriter writer) { FontFileStream stream = writer.Stream; for (int i = 0; i < metrics.Count; i++) { HorizontalMetric metric = metrics[i]; stream.WriteUShort(metric.AdvanceWidth); stream.WriteShort(metric.LeftSideBearing); } }
/// <summary> /// Writes the contents of the head table to the supplied stream. /// </summary> /// <param name="writer"></param> protected internal override void Write(FontFileWriter writer) { FontFileStream stream = writer.Stream; stream.WriteFixed(versionNo); stream.WriteFixed(fontRevision); stream.WriteULong(0); stream.WriteULong(0x5F0F3CF5); stream.WriteUShort(flags); stream.WriteUShort(unitsPermEm); stream.WriteDateTime((long)(createDate - BaseDate).TotalSeconds); stream.WriteDateTime((long)(updateDate - BaseDate).TotalSeconds); stream.WriteShort(xMin); stream.WriteShort(yMin); stream.WriteShort(xMax); stream.WriteShort(yMax); stream.WriteUShort(macStyle); stream.WriteUShort(lowestRecPPEM); stream.WriteShort(fontDirectionHint); stream.WriteShort(1); stream.WriteShort(glyphDataFormat); }
protected internal override void Write(FontFileWriter writer) { FontFileStream stream = writer.Stream; stream.WriteFixed(versionNo); stream.WriteFWord(ascender); stream.WriteFWord(decender); stream.WriteFWord(lineGap); stream.WriteUFWord(advanceWidthMax); stream.WriteFWord(minLeftSideBearing); stream.WriteFWord(minRightSideBearing); stream.WriteFWord(xMaxExtent); stream.WriteShort(caretSlopeRise); stream.WriteShort(caretSlopeRun); stream.WriteShort(caretOffset); stream.WriteShort(0); stream.WriteShort(0); stream.WriteShort(0); stream.WriteShort(0); stream.WriteShort(metricDataFormat); stream.WriteUShort(numberOfHMetrics); }
protected internal override void Write(FontFileWriter writer) { FontFileStream stream = writer.Stream; // These two fields are common to versions 0.5 and 1.0 stream.WriteFixed(versionNo); stream.WriteUShort(numGlyphs); // Version 1.0 of this table contains more data if (versionNo == 0x00010000) { stream.WriteUShort(maxPoints); stream.WriteUShort(maxContours); stream.WriteUShort(maxCompositePoints); stream.WriteUShort(maxCompositeContours); stream.WriteUShort(maxZones); stream.WriteUShort(maxTwilightPoints); stream.WriteUShort(maxStorage); stream.WriteUShort(maxFunctionDefs); stream.WriteUShort(maxInstructionDefs); stream.WriteUShort(maxStackElements); stream.WriteUShort(maxSizeOfInstructions); stream.WriteUShort(maxComponentElements); stream.WriteUShort(maxComponentDepth); } }