//--------------------------------------------------------------------// // M e t h o d // // w r i t e H d d r // //--------------------------------------------------------------------// // // // Generate font header descriptor, segmented data and checksum byte. // // // //--------------------------------------------------------------------// private Boolean writeHddr(ref Boolean monoSpaced, Boolean fmt16, Boolean segGTLast, Boolean usePCLT, Boolean glyphZeroExists, Boolean symSetUnbound, Boolean tabvmtxPresent, Boolean flagVMetrics, Byte symSetType, UInt16 firstCode, UInt16 lastCode, UInt16 numChars, UInt16 unitsPerEm, UInt16 symSet, UInt16 style, SByte strokeWeight, UInt16 typeface, UInt64 charCollComp, Byte [] conversionText) { Boolean flagOK = true; UInt16 cellWidth = 0, cellHeight = 0, textWidth = 0, textHeight = 0, pitch = 0, xHeight = 0, capHeight = 0, mUlinePosU = 0, mUlineDep = 0; Int16 mUlinePos = 0; UInt32 fontNo = 0; Int32 sum; Int32 convTextLen; Int32 hddrLen; Byte mod256; Byte serifStyle = 0; Byte fontFormat; Byte fontType; Byte fontSpacing; SByte widthType = 0; Byte [] fontNamePCLT = new Byte [ToolSoftFontGenTTF.cSizeFontname]; Byte [] panoseData = new Byte [ToolSoftFontGenTTF.cSizePanose]; Byte [] hddrDesc = new Byte [cSizeHddrDesc]; //----------------------------------------------------------------// // // // Get relevant PCL data from TrueType font. // // // //----------------------------------------------------------------// monoSpaced = false; _ttfHandler.getPCLFontHeaderData(usePCLT, ref monoSpaced, ref cellWidth, ref cellHeight, ref textWidth, ref textHeight, ref pitch, ref xHeight, ref capHeight, ref mUlinePos, ref mUlineDep, ref fontNo, ref serifStyle, ref widthType, ref fontNamePCLT, ref panoseData); mUlinePosU = (UInt16)mUlinePos; //----------------------------------------------------------------// if (fmt16) { fontFormat = 16; // Format = Universal } else { fontFormat = 15; // Format = TrueType scalable } if (monoSpaced) { fontSpacing = 0; // Spacing = Fixed-pitch } else { fontSpacing = 1; // Spacing = Proportional } if (symSetUnbound) { fontType = 11; // Type = unbound Unicode-indexed firstCode = 0; lastCode = numChars; } else { fontType = symSetType; // Type = as per target symbol set } //----------------------------------------------------------------// // // // Calculate total size of header. // // Write PCL 'download header' escape sequence. // // // //----------------------------------------------------------------// convTextLen = conversionText.Length; hddrLen = cSizeHddrDesc + _baseHandler.getHddrSegmentsLen( false, fmt16, glyphZeroExists, symSetUnbound, tabvmtxPresent, flagVMetrics, convTextLen) + cSizeHddrTrail; if ((hddrLen > cSizeHddrFmt15Max) && (!fmt16)) { flagOK = false; MessageBox.Show("Header length of '" + hddrLen + "' is incompatible with 'format 15'" + " font.", "Soft font header invalid", MessageBoxButton.OK, MessageBoxImage.Error); } else { PCLWriter.fontDownloadHddr(_binWriter, (UInt32)hddrLen); //------------------------------------------------------------// // // // Write font header descriptor. // // // //------------------------------------------------------------// hddrDesc [0] = msByte(cSizeHddrDesc); hddrDesc [1] = lsByte(cSizeHddrDesc); hddrDesc [2] = fontFormat; // Font Format hddrDesc [3] = fontType; // Font Type hddrDesc [4] = msByte(style); // Style MSB hddrDesc [5] = 0; // Reserved hddrDesc [6] = 0; // Baseline Position MSB hddrDesc [7] = 0; // Baseline Position LSB hddrDesc [8] = msByte(cellWidth); // Cell width MSB hddrDesc [9] = lsByte(cellWidth); // Cell Width LSB hddrDesc [10] = msByte(cellHeight); // Cell Height MSB hddrDesc [11] = lsByte(cellHeight); // Cell Height LSB hddrDesc [12] = 0; // Orientation hddrDesc [13] = fontSpacing; // Spacing hddrDesc [14] = msByte(symSet); // Symbol Set MSB hddrDesc [15] = lsByte(symSet); // Symbol Set LSB hddrDesc [16] = msByte(pitch); // Pitch MSB hddrDesc [17] = lsByte(pitch); // Pitch LSB hddrDesc [18] = 0; // Height MSB hddrDesc [19] = 0; // Height LSB hddrDesc [20] = msByte(xHeight); // xHeight MSB hddrDesc [21] = msByte(xHeight); // xHeight LSB hddrDesc [22] = (Byte)widthType; // Width Type hddrDesc [23] = lsByte(style); // Style LSB hddrDesc [24] = (Byte)strokeWeight; // Stroke Weight hddrDesc [25] = lsByte(typeface); // Typeface LSB hddrDesc [26] = msByte(typeface); // Typeface MSB hddrDesc [27] = serifStyle; // Serif Style hddrDesc [28] = 2; // Quality = Letter hddrDesc [29] = 0; // Placement hddrDesc [30] = 0; // Underline Position hddrDesc [31] = 0; // Underline Thickness hddrDesc [32] = msByte(textHeight); // Text Height MSB hddrDesc [33] = lsByte(textHeight); // Text Height LSB hddrDesc [34] = msByte(textWidth); // Text Width MSB hddrDesc [35] = lsByte(textWidth); // Text Width LSB hddrDesc [36] = msByte(firstCode); // First Code MSB hddrDesc [37] = lsByte(firstCode); // First Code LSB hddrDesc [38] = msByte(lastCode); // Last Code MSB hddrDesc [39] = lsByte(lastCode); // Last Code LSB hddrDesc [40] = 0; // Pitch Extended hddrDesc [41] = 0; // Height Extended hddrDesc [42] = msByte(capHeight); // Cap Height MSB hddrDesc [43] = lsByte(capHeight); // Cap Height LSB hddrDesc [44] = msByte(msUInt16(fontNo)); // Font No. byte 0 hddrDesc [45] = lsByte(msUInt16(fontNo)); // Font No. byte 1 hddrDesc [46] = msByte(lsUInt16(fontNo)); // Font No. byte 2 hddrDesc [47] = lsByte(lsUInt16(fontNo)); // Font No. byte 3 hddrDesc [48] = fontNamePCLT [0]; // Font Name byte 0 hddrDesc [49] = fontNamePCLT [1]; // Font Name byte 1 hddrDesc [50] = fontNamePCLT [2]; // Font Name byte 2 hddrDesc [51] = fontNamePCLT [3]; // Font Name byte 3 hddrDesc [52] = fontNamePCLT [4]; // Font Name byte 4 hddrDesc [53] = fontNamePCLT [5]; // Font Name byte 5 hddrDesc [54] = fontNamePCLT [6]; // Font Name byte 6 hddrDesc [55] = fontNamePCLT [7]; // Font Name byte 7 hddrDesc [56] = fontNamePCLT [8]; // Font Name byte 8 hddrDesc [57] = fontNamePCLT [9]; // Font Name byte 9 hddrDesc [58] = fontNamePCLT [10]; // Font Name byte 10 hddrDesc [59] = fontNamePCLT [11]; // Font Name byte 11 hddrDesc [60] = fontNamePCLT [12]; // Font Name byte 12 hddrDesc [61] = fontNamePCLT [13]; // Font Name byte 13 hddrDesc [62] = fontNamePCLT [14]; // Font Name byte 14 hddrDesc [63] = fontNamePCLT [15]; // Font Name byte 15 hddrDesc [64] = msByte(unitsPerEm); // Scale Factor MSB hddrDesc [65] = lsByte(unitsPerEm); // Scale Factor LSB hddrDesc [66] = msByte(mUlinePosU); // Master U-line Pos. MSB hddrDesc [67] = lsByte(mUlinePosU); // Master U-line Pos. LSB hddrDesc [68] = msByte(mUlineDep); // Master U-line Dep. MSB hddrDesc [69] = lsByte(mUlineDep); // Master U-line Dep. LSB hddrDesc [70] = 1; // Scaling Tech. = TrueType hddrDesc [71] = 0; // Variety _baseHandler.writeBuffer(cSizeHddrDesc, hddrDesc); //------------------------------------------------------------// // // // Start calculating checksum byte from byte 64 onwards of // // header. // // // //------------------------------------------------------------// sum = 0; for (Int32 i = 64; i < cSizeHddrDesc; i++) { sum += hddrDesc [i]; } mod256 = (Byte)(sum % 256); //------------------------------------------------------------// // // // Write header segmented data. // // // //------------------------------------------------------------// flagOK = _baseHandler.writeHddrSegments(false, fmt16, segGTLast, glyphZeroExists, symSetUnbound, tabvmtxPresent, flagVMetrics, charCollComp, conversionText, panoseData, ref mod256); if (flagOK) { //--------------------------------------------------------// // // // Write 'reserved byte' and (calculated) checksum byte. // // // //--------------------------------------------------------// mod256 = (Byte)((256 - mod256) % 256); Byte [] trailer = new Byte [cSizeHddrTrail]; trailer [0] = 0; trailer [1] = mod256; _baseHandler.writeBuffer(cSizeHddrTrail, trailer); } } return(flagOK); }