home *** CD-ROM | disk | FTP | other *** search
/ Amiga ISO Collection / AmigaUtilCD2.iso / Misc / PFONTM-A.DMS / in.adf / Chapter02 < prev    next >
Encoding:
Text File  |  1995-11-12  |  99.4 KB  |  2,251 lines

  1.  
  2.  "Personal Fonts Maker -  2. Personal Fonts Maker Basics"
  3.  
  4.  2. Personal Fonts Maker Basics
  5.     2.1  From Gutenberg's Type to Computer Fonts
  6.     2.2  A Note on Style
  7.     2.3  Typeface Classification and Typographic Basics
  8.     2.4  Storage of Fonts
  9.     2.5  Downloaded Printer Fonts
  10.     2.6  Program and Font Parameters
  11.          2.6.1  The AUDC Parameter
  12.          2.6.2  The AUDE Parameter
  13.          2.6.3  The BRHA Parameter
  14.          2.6.4  The COLR Parameter
  15.          2.6.5  The COLG Parameter
  16.          2.6.6  The COLB Parameter
  17.          2.6.7  The COOR Parameter
  18.          2.6.8  The CSET Parameter
  19.          2.6.9  The EPIL Parameter
  20.          2.6.10 The FILR Parameter
  21.          2.6.11 The GRID Parameter
  22.          2.6.12 The ICON Parameter
  23.          2.6.13 The ITAF Parameter
  24.          2.6.14 The JOIN Parameter
  25.          2.6.15 The LANG Parameter
  26.          2.6.16 The MCRO Parameter
  27.          2.6.17 The PROL Parameter
  28.          2.6.18 The RNGE Parameter
  29.          2.6.19 The SQON Parameter
  30.          2.6.20 The SQOF Parameter
  31.          2.6.21 The STCM Parameter
  32.          2.6.22 The WBEN Parameter
  33.          2.6.23 The XDPI Parameter
  34.          2.6.24 The XMAX Parameter
  35.          2.6.25 The YDPI Parameter
  36.          2.6.26 The YMAX Parameter
  37.     2.7  Programming the Output Format: The Cloanto FFDL
  38.          2.7.1  FFDL Constants
  39.          2.7.2  FFDL Variables
  40.                 2.7.2.1  FFDL Variables: ATRB
  41.                 2.7.2.2  FFDL Variables: CHQT
  42.                 2.7.2.3  FFDL Variables: CIDT
  43.                 2.7.2.4  FFDL Variables: CNUM
  44.                 2.7.2.5  FFDL Variables: EQAM
  45.                 2.7.2.6  FFDL Variables: FCLM
  46.                 2.7.2.7  FFDL Variables: FRST
  47.                 2.7.2.8  FFDL Variables: HDAT
  48.  
  49.                 2.7.2.9  FFDL Variables: HICD
  50.                 2.7.2.10 FFDL Variables: KERN
  51.                 2.7.2.11 FFDL Variables: LAST
  52.                 2.7.2.12 FFDL Variables: LCLM
  53.                 2.7.2.13 FFDL Variables: LENG()
  54.                 2.7.2.14 FFDL Variables: REF1-4
  55.                 2.7.2.15 FFDL Variables: REPT()
  56.                 2.7.2.16 FFDL Variables: SPCE
  57.                 2.7.2.17 FFDL Variables: VDAT
  58.                 2.7.2.18 FFDL Variables: VIDT
  59.                 2.7.2.19 FFDL Variables: XBYT
  60.                 2.7.2.20 FFDL Variables: XDPI
  61.                 2.7.2.21 FFDL Variables: XMAX
  62.                 2.7.2.22 FFDL Variables: XSIZ
  63.                 2.7.2.23 FFDL Variables: YBYT
  64.                 2.7.2.24 FFDL Variables: YDPI
  65.                 2.7.2.25 FFDL Variables: YMAX
  66.                 2.7.2.26 FFDL Variables: YSIZ
  67.          2.7.3  FFDL Operators
  68.                 2.7.3.1  FFDL Algebrical Operators
  69.                 2.7.3.2  FFDL Relational Operators
  70.                 2.7.3.3  FFDL Bit Manipulation Operators
  71.                 2.7.3.4  FFDL Operator Priorities
  72.          2.7.4  FFDL Prefixes
  73.     2.8  Character Sets
  74.  
  75.  
  76.  
  77. "Personal Fonts Maker -  2. Personal Fonts Maker Basics"
  78.  
  79.  
  80. 2.         Personal Fonts Maker Basics
  81.  
  82.    This chapter is an introduction to all general concepts which are part
  83. of the Personal Fonts Maker environment. The first sections give a general
  84. overview of some important notions and terms used in typography. Many
  85. solutions which are presented in the following chapters (often coming from
  86. very different fields) should be kept in mind when working with the
  87. Personal Fonts Maker. The Font Format Description Language (FFDL) and
  88. other unique program features are also described in this chapter. Chapters
  89. 3 to 12 give more detailed instructions on how to use all the commands and
  90. functions, while chapter 13 contains several real-use examples.
  91.  
  92.  
  93. 2.1        From Gutenberg's Type to Computer Fonts
  94.  
  95.    Writing is one of the most ingenious inventions of mankind. It allows
  96. experience to be transmitted through generations, giving speech a solid
  97. and visible aspect. It took thousands of years for writing to develop from
  98. pictograms through ideograms to the phonetic character systems now used
  99. almost all over the world. In the 15th century Johannes Gensfleisch zur
  100. Laden "Gutenberg" started a revolution which has not yet come to an end.
  101. Gutenberg invented and first used movable type to print his books.
  102.  
  103.    The earliest metal type was cast by Gutenberg in 1434-44. The first
  104. typefaces were copies of the hand-written characters used in manuscripts.
  105. Type originally was a piece of hand-cast metal (composed of lead, tin and
  106. antimony, with the addition of bismuth) with a relief on one end.
  107.  
  108.    It is not difficult to describe type when it is something which can be
  109. touched with the hand. A film-strip, called font, which contains negative
  110. images of the characters, is used in phototypesetting. Since electronic
  111. text processing and non-impact (e.g. laser) printing methods were
  112. introduced, the word type has become even more abstract, because it refers
  113. only to the resulting typographic image, and not to the image source
  114. itself.
  115.  
  116.    Generally speaking, a font is the collection of all the various
  117. characters and symbols of a particular type design in a particular size.
  118. Fonts may consist of very few special signs, the basic alphabet or even
  119. several hundreds of characters. In this guide, and in the terminology
  120. generally used for computer printing, a font is a set of bitmaps that
  121. constitutes an alphabet of characters of a certain point size. Concepts
  122. like bitmap and point size are explained in the following paragraphs. The
  123. words typeface and type are often used as synonyms of font, though in fact
  124. a font is a typeface in a particular type size, whereas a typeface can
  125. include fonts of different sizes.
  126.  
  127.    The last five centuries have brought a series of major technical
  128. advances in the mechanization of typesetting. Every day personal computers
  129. play a more important role among the heirs of Gutenberg. Today, we use
  130. different techniques to edit, store and print computer fonts. The most
  131. important methods are based either on vector graphics or on bitmaps. With
  132. vector graphics, each character in a font is represented as a mathematical
  133. description of its shape. Outline fonts and stroke fonts are examples of
  134. fonts adopting this technique. The other approach uses arrays of dots to
  135. represent the characters in a font as bitmaps. The Personal Fonts Maker
  136. works with the second technique.
  137.  
  138.    A device which produces an image consisting of separated dots is called
  139. a raster device. Conventionally, dots refer to printed output, and pixels
  140.  (from PICture ELements) to screen output. In terms of raster imaging
  141. there is no difference between the two. In this guide, the word dot is
  142. generally used to focus on the output of a printer, while pixel is used
  143. where the attention is concentrated on display technology.
  144.  
  145.    The Personal Fonts Maker stores the information regarding each
  146. character in a font in the form of a digital bitmap that defines the shape
  147. as a placement of dots. This method is implemented by the Amiga computer
  148. and most printers and video output systems (raster devices). The Amiga
  149. operating system (version 2.0 and beyond) can also store and scale vector
  150. fonts. Utilities like "Fountain" were designed to provide additional
  151. support for these fonts. The Personal Fonts Maker can load Amiga vector
  152. fonts, scaling them to different bitmap sizes.
  153.  
  154.    Fonts based on vector graphics can occupy less memory than their
  155. bitmap-based equivalent and can more easily be scaled to another size, but
  156. are much more expensive in terms of software size and processing speed. In
  157. practice, bitmap fonts offer many more advantages to the users of personal
  158. computers like the Amiga. The Personal Fonts Maker is a powerful tool
  159. which can manipulate video fonts and convert them into printer
  160. downloadable fonts. The Amiga screen fonts and the fonts which can be
  161. printed on standard 24-pin printers are relatively small (those of 9-pin
  162. printers even smaller). Fonts in these sizes can be more compact if they
  163. are stored as bitmaps, rather than vectors. The final output quality of
  164. these fonts is much better if the characters are designed and stored as
  165. bitmaps. This is caused by the fact that even fonts based on vector
  166. graphics have to be converted to bitmaps when they are output to paper or
  167. on a screen. The result of this automatic conversion is as poor on the
  168. devices described above as it is excellent on very high resolution output
  169. devices.
  170.  
  171.    Bit-mapped fonts are much easier to design and edit than their vector
  172. graphics based counterpart. With the Personal Fonts Maker, each pixel of a
  173. font is always displayed and can be modified (a so-called WYSIWYG display,
  174. meaning "What You See Is What You Get"), while users of a font editor
  175. based on vector graphics generally need a lot of imagination to guess what
  176. the font will look like on paper.
  177.  
  178.    A bitmap can be compared with a piece of graph paper in which some
  179. squares are filled in, while others are left blank. The pattern of squares
  180. corresponds to the pattern of dots that make up each character in a font.
  181. A font stored as a bitmap consists of a sequence of bits (see section
  182. 1.3.1). For each position (square) in the map there is a bit. A bit set to
  183. 1 means that there should be a dot, while a 0 indicates that the position
  184. should be left blank.
  185.  
  186.    What if the Amiga fonts or the other available fonts do not have all
  187. the necessary characters? Or if an Amiga screen font cannot be used for
  188. fast and high resolution prints on a 24-pin printer? Or if a company logo
  189. is to be included in a font or a whole new font needs to be designed? Or
  190. if the shape of a letter in a font used every day is simply horrible? The
  191. Cloanto Personal Fonts Maker can solve these problems, and many more. The
  192. Personal Fonts Maker is a professional tool which was designed to let
  193. Amiga users load, edit, store and download fonts. Its main area of
  194. usefulness is as a sophisticated programmable-format font generating
  195. system that can be used in combination with most available word processors
  196. and printers. Available typefaces can be used as a point of departure to
  197. create new or partially modified character sets. The different input
  198. formats allow the user to load Personal Fonts Maker files, Amiga fonts and
  199. IFF-ILBM (which stands for "Interchange File Format - InterLeaved BitMap")
  200. brushes. It is even possible to scan a typeface from a book of the early
  201. XVI century and use the Personal Fonts Maker to download the resulting
  202. font to the printer. This was actualy done to create the "Perseus" font on
  203. the data disk. A professional scanning device was used, and the single
  204. characters were cut from the resulting picture with an Amiga paint
  205. program.
  206.  
  207.    One of the most interesting features of the Personal Fonts Maker is its
  208. ability to output fonts in a user-programmable format. This means that it
  209. will be used to do things even the designers of the Personal Fonts Maker
  210. did not think of. The Personal Fonts Maker can create font files for other
  211. computers or other programs. Most important, it can create fonts which can
  212. be downloaded to a printer (sections 2.4, 2.5, 2.7, 7.3, 12.2, 12.6, 13.4
  213. and 13.5). This has always been a problem, as almost all modern dot matrix
  214. printers accept downloaded fonts, but most printers require a different
  215. data format. Downloaded fonts have a reputation for being excessively
  216. difficult to use. That reputation is thoroughly deserved, but the Cloanto
  217. Personal Fonts Maker makes the reality different from the reputation. With
  218. the Personal Fonts Maker, users of the Amiga computers do not need to
  219. print texts in slow and poor quality graphic mode any more.
  220.  
  221.    Some sophisticated off-the-shelf word processing and desktop publishing
  222. software packages for the Amiga computer offer more page layout, graphics,
  223. and character-design options than are generally available in commonly used
  224. phototypesetting systems (at a fraction of their price). However, they
  225. usually provide these capabilities with coarse character definition and/or
  226. slow output speeds. Downloaded fonts are printed with the same speed and
  227. quality as the built-in fonts that come with the printer.
  228.  
  229.    Fonts are generally used to print text on paper. The Personal Fonts
  230. Maker solves the major problem which prevented users from downloading
  231. fonts to their printer. For these reasons, this guide and the software
  232. package itself give full support to users who work with printers (without
  233. being limited to this category). The Personal Fonts Maker can send data
  234. directly to the printer. The Printer Driver Modifier program and other
  235. utilities are enclosed with the Cloanto Personal Fonts Maker package. This
  236. manual contains several useful descriptions and explanations for the users
  237. who want to download and print their fonts.
  238.  
  239.  
  240. 2.2        A Note on Style
  241.  
  242.    The use of appropriate typefaces not only helps to communicate, but
  243. also adds an element of prestige and a personal stamp to printed material.
  244. Whether the desired look is unusual or elegant, a personal or corporate
  245. image can only be enhanced by good typography. Getting and maintaining the
  246. reader's attention is of great importance for effective communication, as
  247. only the most visually appealing messages will be read. Whether it is for
  248. printed material or for display on a computer screen, the correct use of
  249. fonts helps to catch and hold the reader's eye.
  250.  
  251.    Typesetting machines and typewriters succeeded Gutenberg's press.
  252. Millions of people use typewriters to write their texts. Personal
  253. computers are quickly replacing the typewriter, though in most cases
  254. people use personal computers and printers as the equivalent of fast
  255. typewriters. Even if some early typewriters actually had printers' type on
  256. the typebars, typewriters do not create type. Modern printers make it
  257. possible to use proportionally spaced characters for greater legibility
  258. and elegance, and there is no reason to be restricted to typewriter-like
  259. fonts. Some qualities make typeset characters unique and immediately
  260. identifiable. A list of these attributes includes: proportional spacing,
  261. clean character edges, variations in character strokes (thick and thin),
  262. variety of typeface designs, design variations of a single style (bold,
  263. italic, outline, etc.). Users of the Personal Fonts Maker can create type
  264. meeting these criteria.
  265.  
  266.    Usually, the choice of a typeface is from a list, and the selection is
  267. based on criteria related to the purpose of the message (utilitarian,
  268. glamour, business), the environment using it (home, office, shop), the
  269. needs of the user (space factors, sizes, typefaces), the size and needs of
  270. the audience (short-lived information, archival storage, entertainment),
  271. and the methods of reproducing the message (copier, page printer,
  272. conventional printing).
  273.  
  274.    Some type has serifs (little tails on the letters, such as Times), and
  275. some is sans serif (without tails, e.g. Helvetica). Some people have a
  276. strong preference for one over the other. A sans serif type is generally
  277. used for headlines, and a serif type for the body copy.
  278.  
  279.    If the reader of a long text becomes aware of the letter design, that
  280. typeface should not be used. The selected font should be transparent to
  281. the reader, rather than distracting the attention from the content of the
  282. text. A good typeface presents an even texture on the page: there are no
  283. darker or lighter clusters of letters. Most professional designers use few
  284. decorative typefaces. "Fancy fonts" should be reserved for specialized
  285. uses, and even then, never for longer paragraphs of text.
  286.  
  287.    Different type styles, like italics and boldfaces, can be used for
  288. emphasis. CAPITALS CAN ALSO BE USED FOR EMPHASIS, BUT ARE MORE DIFFICULT
  289. TO READ, because they lack the additional visual information provided by
  290. ascenders and descenders (section 2.3). As for typefaces, the use of each
  291. different style variation should be coherent and adhere to an accepted
  292. rule of style. An excess in different type styles can draw away the
  293. reader's attention from the contextual importance of the "emphasized"
  294. text.
  295.  
  296.    The Personal Fonts Maker is a professional tool, and therefore must be
  297. used with professional care. In unskilled hands, a normal, healthy-looking
  298. typeface can become horrible arabesque, which in most cases is not what
  299. the user wanted. It is extremely easy to design typefaces that are too
  300. "designy". A very limited number of typefaces is used in the major
  301. newspapers and magazines. The mixing of an inordinate number of type faces
  302. and styles is a sure sign of amateurism. Many beginning desktop publishers
  303. go crazy using every possible face and style variation in their
  304. publications. Typefaces can reflect a good deal about a publication;
  305. depending on how they are used, they can enhance the publication's image
  306. or detract from it.
  307.  
  308.  
  309. 2.3        Typeface Classification and Typographic Basics
  310.  
  311.    Fonts either have or do not have serifs. Serifs are ending strokes on
  312. the arms, stems, and tails of the characters in a typeface. A typeface
  313. with serifs is called a roman typeface, while a typeface without serifs is
  314. called sans serif. Italic variations of a typeface are those where all
  315. characters in the font (serif or sans serif) slant to the right. Bold
  316. typefaces have thicker lines, while light typefaces have thinner and more
  317. delicate lines.
  318.  
  319.    An outlined character has all its external and internal borders drawn,
  320. but is empty inside the borders. A shadowed character has a visible
  321. shadow. A reverse, or negative character has the foreground (e.g. black)
  322. and background (e.g. paper white) colours reversed. Superscripts and
  323. subscripts are the small characters which can be printed just above or
  324. below the other characters in a line. Superscripts, for example, are used
  325. to write the small numbers which appear after a word referenced by a
  326. footnote. All these variations, and many others, can be used to create a
  327. new typeface.
  328.  
  329.    A type family includes the different sizes of a basic font and all its
  330. stylistically related variations. With the Personal Fonts Maker, any one
  331. of the available typefaces can be used as a point of departure to create
  332. an entire family with italic, bold, outline, shadow and other variations.
  333. Type is classified according to families. A family can contain several
  334. typefaces (e.g. bold and italic). A typeface in a particular size is
  335. called a font. A font is a typeface in a particular size.
  336.  
  337.    The differences in the weight of the strokes which compose each
  338. character vary from font to font. A text is more readable if it is printed
  339. with a roman font that has very little difference between thin and thick
  340. strokes.
  341.  
  342.    It is extremely easy to calculate the number of characters that will
  343. fit in a line when all the characters which are used have identical
  344. widths, such as in typewriting. A standard typewriter can print either 10
  345. or 12 characters per inch (abbreviated cpi). The number of characters that
  346. fit in an inch (the pitch) is a value that can be associated with the
  347. width of fixed-spaced, constant-width characters (opposed to
  348. proportionally spaced characters). A pitch of 10 cpi is called pica, while
  349. elite is used to indicate a pitch of 12 cpi. Fine, or condensed text
  350. usually has 15 or 17 cpi, while there are about 5 characters to the inch
  351. of large (enlarged) text. The Amiga system software and most other
  352. programs use this same terminology.
  353.  
  354.    When different fonts and characters of various widths occupy a line,
  355. calculating the number of characters per line is a much more difficult
  356. task. An accepted standard to measure the width of the characters is based
  357. on the em measurement. For this purpose, the box containing the largest
  358. letter of the font (usually the 'M') is divided into 18 vertical slices,
  359. called relative units (RU). On more sophisticated typesetting machines,
  360. the em space can be divided into a higher number of units. A space of 6
  361. relative units (about the size of an 'i' character, generally one third of
  362. an em-space) usually separates adjacent words in a line. Other units
  363. relative to the size of particular characters in the font are also in use.
  364. These include: the en space and the three-to-the-em space, the line
  365. (equivalent to 120 percent of the size of an em) and the figure, which is
  366. the width of a zero.
  367.  
  368.    In many proportionally spaced fonts built into printers all the 10
  369. number characters ('0' to '9') have fixed width (the figure width). This
  370. allows the numbers to be properly ordered in columns without having to
  371. change font. In some fonts the space character is equal to the average
  372. width of the characters in a line. In this way, texts (e.g. an address on
  373. a right margin of a business letter) can be more easily justified by hand
  374. on a video display which uses fixed-width characters.
  375.  
  376.    When characters are processed electronically, as in the Personal Fonts
  377. Maker or in the Amiga environment, the word width may have a slightly
  378. different meaning. The width of a character (for most Indo-European
  379. alphabets) is the distance between the beginning of a character and the
  380. beginning of the following character, rather than the size of an isolated
  381. character. This means that the width of a character can include some white
  382. space before and after the character.
  383.  
  384.    In typography, the size of the letters is measured in points. 72 points
  385. make up an inch. The size is determined by measuring the distance from the
  386. uppermost limit of an ascender (upward reaching letter) to the lowermost
  387. limit of a descender (downward projecting letter). Text type is usually
  388. between 9 and 12 points. A size which is often used because it offers a
  389. good compromise between space efficiency and readability is 11 points.
  390. When raster devices are used, the size is more commonly measured in pixels
  391. and dots.
  392.  
  393.    Four typographic lines of reference help the designer of a font to
  394. maintain a coherent relationship from one character to another. The
  395. Personal Fonts Maker allows the user to place four reference points
  396. (marked by little arrows), which always show the position of the lines, at
  397. the left of the character editing box (section 3.21, "Reference Points").
  398. All characters rest on the baseline. The mean line, just above the
  399. baseline, is the upper limit of the main part of the lowercase characters.
  400. Lowercase characters that ascend upward over the mean line ('b', 'd', 'f',
  401. 'h', 'k', 'l', 't') are called ascenders. The uppermost point of an
  402. ascender is the ascender line, also called the cap line. Lowercase
  403. characters that descend below the baseline ('g', 'j', 'p', 'q', 'y') are
  404. called descenders. The descender line limits the lowermost point of the
  405. descenders. The Personal Fonts Maker associates a default usage to each of
  406. its reference points. This is explained in section 3.21 ("Reference
  407. Points").
  408.  
  409.    The distance between the baseline and the mean line is called the
  410. x-height, because it is the height of the lowercase 'x' letter. Typefaces
  411. with larger x-heights are usually easier to read. Small capitals are
  412. capital letters at x-height.
  413.  
  414.    Some notions described in this section can take on different meanings
  415. when fonts are used for video display or downloading on a printer, rather
  416. than more traditional typographic techniques. The character width and
  417. height can, for example, be measured in display pixels, screen lines or
  418. rows of printer pins.
  419.  
  420.  
  421. 2.4        Storage of Fonts
  422.  
  423.    As already described in sections 1.3.1 and 2.1, the Personal Fonts
  424. Maker stores fonts in bitmaps. Each character is treated as a graphic
  425. image of given height and width, expressed in dots. Each dot of the image
  426. occupies one bit of memory. One bit is sufficient to store the status of
  427. the dot, which can only be "black" or "white", supposing that the font is
  428. used to print black characters on white background.
  429.  
  430.    The memory occupied by a single character in the font can be calculated
  431. by multiplying the height of the character by the width of the character
  432. (expressed in dots, or bits). The result is the number of bits which are
  433. necessary to store the character data. The number of bytes occupied by the
  434. character can be calculated by dividing the result by 8.
  435.  
  436.    The exact formula which can be followed to calculate the total RAM
  437. needed by the Personal Fonts Maker to store a font's graphical data is:
  438.  
  439.      TotalBytes = 257 * (((XMAX + 7) >> 3) * YMAX)
  440.  
  441.    Sections 7.3.1 and 7.3.2 explain the "X Max" and "Y Max" parameters.
  442. The '>>' (shift right) operator is described in section 2.7.3.3 ("FFDL Bit
  443. Manipulation Operators").
  444.  
  445.    The graphic data of a font containing 127 characters in a 36 by 24
  446. matrix will, for example, occupy a minimum of 13716 bytes (36 x 24 x 127 /
  447. 8). This is a typical size for a letter quality font downloadable on a
  448. 24-pin printer. In practice, the number of bytes can be different, as
  449. proportional characters do not have all the same width, and the number of
  450. downloaded characters can be optimized to include only the characters to
  451. be printed. Depending on the purpose for which the font is stored, some
  452. additional bytes can be added to round the number of bits in a row to a
  453. multiple of 8 or 16, or give more detailed information on how the font is
  454. to be represented. In the previous example, the number 36 should have been
  455. rounded to the next multiple of 8, which is 40, to calculate the amount of
  456. memory occupied internally by the program. Section 1.3.1 ("Measurement
  457. Units") contains a similar example.
  458.  
  459.    The Personal Fonts Maker can store and load fonts in two predefined
  460. formats (PFM and Amiga), and generate font files in any format programmed
  461. by the user, or selected from one of the predefined font description files
  462. that come with the software package. Single characters, or parts thereof,
  463. can be loaded and saved as standard Amiga IFF ILBM graphical files.
  464.  
  465.    The Personal Fonts Maker stores fonts in its own format by default. PFM
  466. font files follow the IFF (Interchange File Format) standard. Font files
  467. in this format contain more information (e.g. X/Y aspect ratio, reference
  468. points and other attributes) than the Amiga font files, in almost half the
  469. space. A single PFM IFF file can contain font data, a character set
  470. description, a colour palette and more. Appendix O contains a very
  471. detailed technical description of the data structures used by the Personal
  472. Fonts Maker to store its fonts. Additional information on the IFF format
  473. can be found in the official Commodore documentation. Sections 4.3 and 4.4
  474. explain how to load and save fonts in this format.
  475.  
  476.    Amiga fonts can be loaded with the Personal Fonts Maker. They can be
  477. modified and saved in the Amiga or Personal Fonts Maker formats. Most
  478. important, Amiga fonts can be downloaded to a printer. In this way, it is
  479. possible to print a text using the same font displayed on the screen. A
  480. font of height 24 can be downloaded to the printer, while a font of the
  481. same family, but of smaller height (the resolution of the screen is
  482. usually not as high as that of the printer) can be used for true WYSIWYG
  483. screen display. All fonts which can be displayed with the Personal Fonts
  484. Maker can be stored in Amiga format. Since this is not the default PFM
  485. format, and font files in this format contain less information than
  486. standard PFM font files, the verbs import and export are often preferred
  487. to describe load and save operations in Amiga format. Fonts saved in Amiga
  488. format can be loaded by all Amiga software using standard fonts. Sections
  489. 4.5 and 4.6 explain how to load and save fonts in the Amiga screen font
  490. format.
  491.  
  492.    One of the most interesting features of the Personal Fonts Maker is its
  493. capability of creating font files in a user programmable format. With the
  494. powerful FFDL (Font Format Description Language), fonts can be downloaded
  495. to any printer, or imported by other programs on different computers. It
  496. is even possible (but not necessary, as there is a special function
  497. described in section 7.8 to do so) to create a standard Workbench ".info"
  498. icon file using the FFDL. FFDL descriptions can be written with a text
  499. editor or with the requester described in section 7.3. The PFM disks
  500. contain several FFDL descriptions ready to be used to download fonts to
  501. some of the most used printers. More detailed information regarding this
  502. feature can be found in sections 2.1, 2.7, 7.3, 12.2, 12.6, 13.4 and 13.6.
  503. Many examples in this guide describe FFDL applications for printers. This
  504. is because printer download formats are among the most complex formats to
  505. handle, and most Amiga users feel the need of fast and high quality prints
  506. with custom fonts. This of course does not limit the use of the FFDL,
  507. which is also used in several other fields, ranging from the video sector
  508. to the creation of fonts for other computers.
  509.  
  510.    Graphic data in IFF ILBM (Interchange File Format - InterLeaved BitMap)
  511. formats can be used to load and save a PFM brush (section 5.1). With this
  512. function, graphic data can be exchanged with popular paint programs. This
  513. is particularly useful when fonts are to be extracted from a large
  514. picture, as an image generated by a scanning device (also see section 2.1)
  515. or a video camera.
  516.  
  517.    It should be noted that the IFF ILBM format is different from IFF CPFM,
  518. used by the Personal Fonts Maker to store its data. Both files adhere to
  519. the Interchange File Format standard, but ILBM files are used for bitmap
  520. graphics, while CPFM (Cloanto Personal Fonts Maker) files contain Personal
  521. Fonts Maker font and character set data.
  522.  
  523.  
  524. 2.5        Downloaded Printer Fonts
  525.  
  526.   All devices which do not print characters as a single entity (like
  527. daisy-wheel printers) build their symbols from a bitmap. These printers
  528. may adopt different techniques, like matrix impact, ink jet, optical or
  529. thermal transfer. The Personal Fonts Maker can be used to download fonts
  530. to almost all these different types of printers which accept downloaded
  531. fonts.
  532.  
  533.    There are some technical details regarding the printer which should be
  534. known before a font is designed and downloaded. The following paragraphs
  535. will explain how the printer's memory works, how to transfer the font data
  536. to it, and how each dot is finally put on paper.
  537.  
  538.    Printers are manifactured with a limited number of fonts which are
  539. stored in ROM (Read Only Memory). It would not be possible to store enough
  540. typefaces in different sizes to match all user's needs in ROM. For this
  541. reason, modern printers support the downloading (installation) of fonts
  542. from the computer. Downloaded fonts are often called soft font, as opposed
  543. to the "hard" fonts built into the printer. These fonts can be designed
  544. and edited with the Personal Fonts Maker, saved on disk, and downloaded to
  545. the printer as required.
  546.  
  547.    The printers which support the downloading of fonts have a built-in
  548. RAM. If no font is downloaded, all of this memory can be used as a buffer
  549.  to store the data received by the computer which has not yet been
  550. printed. In most cases the printer's memory can be shared by the buffer
  551. and the download functions.
  552.  
  553.    The content of the RAM is cleared whenever the printer is switched off.
  554. This means that the downloaded soft fonts will also disappear from the
  555. printer's memory. There are different ways to make sure the preferred soft
  556. fonts are always in the printer's RAM. Some programs, like the Personal
  557. Write word processor, are clever enough to automatically download any soft
  558. font selected by the user. "PrintRawFiles" is a utility (described in
  559. section 12.2) included with the Personal Fonts Maker package which can be
  560. used to download a file to the printer. The Personal Fonts Maker itself
  561. can, of course, be used to download a font.
  562.  
  563.    Most printers have special commands which let a ROM-font be copied to
  564. the printer's RAM. This can be useful if the Personal Fonts Maker is used
  565. to modify only a few of the characters which already exist in the
  566. printer's ROM. Once a ROM font is copied to the RAM, it can be partially
  567. overwritten by user-designed characters.
  568.  
  569.    With some printers it is not possible to download and use more than one
  570. font at a time, while others can handle two or more fonts. The RAM of some
  571. printers is not large enough to support the downloading of a full high
  572. resolution font. In such a case, if no additional memory can be added, the
  573. characters which are not used in the text to be printed should not be
  574. downloaded. This saves a lot of memory. The "TextChars" utility, described
  575. in section 12.1, automatically analyzes the contents of an ASCII text file
  576. and creates a PFM macro which excludes all characters which are not
  577. contained in the file.
  578.  
  579.    Characters having a code greater than 127 cannot be downloaded on some
  580. printers. Some Amiga printer drivers also have problems handling these
  581. characters. The Printer Driver Modifier (described in chapters 9 to 11),
  582. which is included with the Personal Fonts Maker package, can be used to
  583. enable the download and printing of even these "forbidden" characters.
  584.  
  585.    Downloaded fonts can be printed with the same speed and quality as the
  586. fonts built into the printer. Unfortunately, downloading a font is not an
  587. easy task. Amiga screen fonts cannot just be "sent" to the printer, nor
  588. should they be printed in slow and poor-quality graphics modes. Printers
  589. require the use of special control codes and initialization sequences. The
  590. bitmaps must be formatted so that they can be used by the printer's
  591. graphic interpreter as a series of printable characters. The reason for
  592. which the download functions are in most cases unused, lies in the fact
  593. that there is no standard way to download a font. A program which is to
  594. download fonts to different printers should be able to use a different
  595. format for every printer on the market. This is exactly what the Personal
  596. Fonts Maker does. Section 2.7 explains the use of the Cloanto FFDL (Font
  597. Format Description Language), which is the key which opens the doors to
  598. all printers.
  599.  
  600.    The Personal Fonts Maker can create soft fonts in any format defined
  601. through a sequence of FFDL commands. The resulting data can either be
  602. directly downloaded into the printer's memory, or be saved to a file from
  603. where it can be used whenever it is needed (see section 4.13 for more
  604. details). Please note that a data file saved in a printer download format
  605. cannot be loaded and edited by the Personal Fonts Maker. For this reason,
  606. a user-designed font should always be saved either in Amiga or PFM format,
  607. even if a printer file has already been written.
  608.  
  609.    The hardware used to print the bitmap can limit the accuracy, frequency
  610. and size of the dots. It is important to understand how a printer puts the
  611. downloaded bitmaps on paper, since this can have implications on the early
  612. design stages of a font. The shape of the dots is usually quite different
  613. from the rectangular pixels displayed on the screen. Printer pins are
  614. normally round, but can also be more or less elliptical. Thermal transfer
  615. printers print square or rectangular dots.
  616.  
  617.    To make diagonal lines of circular dots more readable, some impact
  618. matrix printers overlap the dots. Ideally, good print quality can be
  619. achieved through a dense matrix of small dots, as expensive laser printers
  620. use. Impact printers are limited by the same technology which makes them
  621. so inexpensive and popular. The pins in a printer head cannot be too
  622. small, or they would pass through the ribbon. The overlapping of dots is a
  623. good compromise to achieve a better print quality. Horizontal overlapping
  624. can be achieved by passing the print head more than once on the same line.
  625. The paper can be shifted up by a fraction of the dot diameter after a
  626. first print pass, so that dots can be overlapped vertically. Some printers
  627. have more rows of pins on the head, so that they can print overlapping
  628. dots in one pass.
  629.  
  630.    Some impact matrix printers cannot print two horizontally adjacent dots
  631. in one pass of the printer head. This is caused by the fact that the
  632. electromechanical device which presses the inked ribbon to print a dot on
  633. the paper needs some time before it is ready for another "fire". For this
  634. reason, when the printer is in letter quality mode, it passes on the same
  635. line several times. In high speed draft mode, it simply does not print
  636. adjacent dots. Special draft mode fonts are designed in such a way that
  637. there are no adjacent dots in the bitmap (e.g. the "Oberon_Draft_24"
  638. font).
  639.  
  640.  
  641. 2.6        Program and Font Parameters
  642.  
  643.    Several program and font parameters can be set to adapt the Personal
  644. Fonts Maker to the most different user needs and tastes. Different
  645. parameters are used to store the level of the audio volume, the screen
  646. colours, the appearance of the font on the screen and on paper, and many
  647. other details.
  648.  
  649.    All parameters can be set through the Amiga user interface, usually by
  650. selecting the proper menu item in the "Preferences" menu (chapter 7). The
  651. settings can be stored and loaded again at any time, using the functions
  652. described in sections 7.1 and 7.2. Using the "Save Preferences" and "Load
  653. Preferences" functions, the user does not need to regulate the parameters
  654. every time the program is used. Once the parameters are stored, they can
  655. be loaded automatically or manually every time the Personal Fonts Maker is
  656. used.
  657.  
  658.    All parameters have a default value, programmed by the designers of the
  659. Personal Fonts Maker. The default value is automatically set until another
  660. value is specified.
  661.  
  662.    The parameters can be logically grouped in two classes: font parameters
  663. and program parameters. Font parameters only affect the way fonts are
  664. represented on screen, on paper or as described through the FFDL (section
  665. 2.7). Most font parameters can be accessed through the FFDL. Program
  666. parameters, on the contrary, allow the user to control the user interface
  667. of the Personal Fonts Maker.
  668.  
  669.    The Personal Fonts Maker allows the user to work with two different
  670. environments at the same time. Two completely different fonts, font
  671. parameters and character sets can coexist in one work session. The user
  672. can switch between the two environments with the "Font" gadget, described
  673. in section 3.2. When the user works with font number one, the first set of
  674. font parameters is applied to the font. When the user switches to font
  675. number two another font can be edited, and the second set of font
  676. parameters will be used. Since the program parameters are shared by the
  677. two font environments, the user interface will still use the same program
  678. parameters.
  679.  
  680.    As explained in section 1.11, the "StartupF1.prf" and "StartupF2.prf"
  681. files in the "PFM:PFM_Prefs" drawer contain the initial settings for the
  682. two environments. The Personal Fonts Maker automatically tries to load
  683. these two parameter files when the program is started.
  684.  
  685.    The Personal Fonts Maker stores the parameters as plain ASCII
  686. (pronounced "asky", from "American Standard Code for Information
  687. Interchange") text files. This means that the parameters contained in the
  688. files can be accessed and modified either through the user interface of
  689. the Personal Fonts Maker, or with a text editor or a word processor like
  690. Personal Write. Users who are not interested in accessing the parameter
  691. files directly may skip the remaining part of this section.
  692.  
  693.    A parameter file is a plain ASCII text file. The parameter file must
  694. begin with the header "PFM PREF" (from "Personal Fonts Maker PREFerences")
  695. to be recognized as such by the Personal Fonts Maker. A four letter
  696. abbreviation is associated with each parameter of the Personal Fonts
  697. Maker. Exactly as menus and gadgets can be used to modify a parameter with
  698. the standard Amiga user interface, the four-letter codes allow the user to
  699. set the parameter from within a text file. The four letters should be
  700. written in upper case, to be coherent with the style of the FFDL commands,
  701. though the Personal Fonts Maker will also interpret lower case
  702. characters.
  703.  
  704.    A parameter file consists of the header ("PFM PREF"), followed by one
  705. or more parameter settings. To assign a given value to a parameter, the
  706. four letter code (keyword) must be followed by an equal sign ('=') and the
  707. desired value. The macro file name keyword ("MCRO") requires an additional
  708. parameter (the letter associated with the macro referred to) before the
  709. equal sign. The RNGE parameter requires two values (separated by one or
  710. more spaces or TABs) to follow the equal sign.
  711.  
  712.    Numerical parameters can only be followed by digits. File name string
  713. parameters are alphanumerical parameters, i.e. they can be followed by a
  714. sequence of letters, numbers and other signs, preceded and followed by a
  715. quote character ('"', as in "string"). No quote characters may appear
  716. within the string. File name parameters are used to select the files to be
  717. loaded. The third type of parameter is the FFDL sequence. An FFDL sequence
  718. must not be enclosed by quotes. Space and TAB characters before an FFDL
  719. sequence are optional, as for all other parameters. Section 2.7 explains
  720. how to write an FFDL sequence.
  721.  
  722.    The parameter (all three types) and the value assigned to it must stay
  723. on the same line. The assignment of a parameter (numerical or
  724. alphanumerical) can be followed by another parameter or by a comment. A
  725. comment must begin with a semicolon (';') and cannot be followed by other
  726. data (which would be interpreted as being part of the comment) on the same
  727. line. FFDL sequences cannot be followed by other data nor by a comment, as
  728. any additional characters on the same line would be interpreted as being
  729. part of the FFDL sequence.
  730.  
  731.    The maximum length of a line in a PFM parameter file is 400 characters.
  732. Some text editors cannot handle such long lines. In these cases, a word
  733. processor like Personal Write can be used to edit and save the text. The
  734. word processor must be able to save the text as an ASCII file.
  735.  
  736.    Space (' ') and TAB (decimal ASCII code 9) characters can be used to
  737. separate equal signs, semicolons or other elements in each line. Space and
  738. TAB characters are skipped by the Personal Fonts Maker (i.e. the program
  739. behaves as if they did not exist), unless they are part of a string value
  740. assigned to a file name parameter.
  741.  
  742.    If a parameter file containing syntax errors, or incoherent data is
  743. read, all parameters in the file are ignored and the previous values (the
  744. default values, if the initial settings were being loaded) are used. An
  745. error message is displayed unless the error occurs during the initial load
  746. of the default settings ("StartupF1.prf" and "StartupF2.prf" files).
  747.  
  748.    The following is an example of a valid preference file:
  749.  
  750. PFM PREF
  751.  
  752. WBEN = 0              ;comment: this line closes the Workbench screen
  753. COOR = 2
  754.  
  755. ICON = 2    GRID = 1  ;other data can follow the assignment of a
  756. parameter
  757.  
  758. MCRO A = "PFM:PFM_Macros/MyMacro.mcr"  MCRO B =
  759. "PFM:PFM_Macros/Outline.mcr"
  760.  
  761. SQON = ESC \& (0) CNUM CNUM (1) XSIZ (1) VDAT   ITAF=2
  762.          ;WARNING: the above line will cause a syntax error message
  763.          ;         to be displayed during the execution of the FFDL
  764.          ;         sequence. ITAF will not be set to 2
  765.  
  766. SQON = ESC \& (0) CNUM CNUM (1) XSIZ (1) VDAT
  767. ITAF = 2              ;this is what we wanted for SQON and ITAF
  768.  
  769.  
  770.  
  771.   The following sections list all parameters which can be accessed through
  772. four-letter codes in a parameter file. Some of these parameters (the font
  773. parameters) can also be accessed through the FFDL, described in section
  774. 2.7. Appendix N contains a table of all parameters.
  775.  
  776.  
  777. 2.6.1      The AUDC Parameter
  778.  
  779. Parameter Type  : Numerical
  780. Valid Range     : 0 to 64
  781. Default         : 64
  782. Example         : AUDC = 30
  783. More in Sections: 7.13
  784.  
  785.    This parameter controls the volume of the standard feedback sounds of
  786. the Personal Fonts Maker.
  787.  
  788.  
  789. 2.6.2      The AUDE Parameter
  790.  
  791. Parameter Type  : Numerical
  792. Valid Range     : 0 to 64
  793. Default         : 64
  794. Example         : AUDE = 64
  795. More in Sections: 7.13
  796.  
  797.    This parameter controls the volume of the acoustic error signals of the
  798. Personal Fonts Maker.
  799.  
  800.  
  801. 2.6.3      The BRHA Parameter
  802.  
  803. Parameter Type  : Numerical
  804. Valid Values    : 0, 1, 2, 3, 4
  805. Default         : 2
  806. Example         : BRHA = 1
  807. More in Sections: 5.9, 6.6.2
  808.  
  809.    The position of the brush handle is determined by this parameter. A
  810. value of 0 places the handle at the upper left of the brush, 1 at the
  811. upper right, 2 at the centre, 3 at the lower left and 4 at the lower right
  812. of the brush.
  813.  
  814.  
  815. 2.6.4      The COLR Parameter
  816.  
  817. Parameter Type  : Numerical
  818. Valid Range     : -15 to +15
  819. Default         : 0
  820. Example         : COLR = 0
  821. More in Sections: 7.14
  822.  
  823.   This parameter controls the level of red in the user interface colours,
  824. relative to the default setting.
  825.  
  826.  
  827. 2.6.5      The COLG Parameter
  828.  
  829. Parameter Type  : Numerical
  830. Valid Range     : -15 to +15
  831. Default         : 0
  832. Example         : COLG = 5
  833. More in Sections: 7.14
  834.  
  835.   This parameter controls the level of green in the user interface
  836. colours, relative to the default setting.
  837.  
  838.  
  839. 2.6.6      The COLB Parameter
  840.  
  841. Parameter Type  : Numerical
  842. Valid Range     : -15 to +15
  843. Default         : 0
  844. Example         : COLR = -6
  845. More in Sections: 7.14
  846.  
  847.   This parameter controls the level of blue in the user interface colours,
  848. relative to the default setting.
  849.  
  850.  
  851. 2.6.7      The COOR Parameter
  852.  
  853. Parameter Type  : Numerical
  854. Valid Values    : 0, 1, 2
  855. Default         : 0
  856. Example         : COOR = 1
  857. More in Sections: 7.5
  858.  
  859.    A value of 0 causes no coordinates to be displayed on the title bar. If
  860. the value is 1 or 2, the coordinates will be displayed with a starting
  861. position of 0:0 and 1:1, respectively.
  862.  
  863.  
  864. 2.6.8      The CSET Parameter
  865.  
  866. Parameter Type  : String (File Name)
  867. Maximum Length  : 192 Characters
  868. Default         : "PFM:PFM_CharSets/PC/PC_Usa2.set"
  869. Example         : CSET = "PFM:PFM_CharSets/PC/PC_Usa2.set"
  870. More in Sections: 4.8
  871.  
  872.    This string must contain the entire path and file name which the
  873. program can use to access a file containing character set data. The
  874. maximum length of the path is 128 characters.
  875.  
  876.  
  877. 2.6.9      The EPIL Parameter
  878.  
  879. Parameter Type  : FFDL Sequence
  880. Maximum Length  : 400 Characters
  881. Default         : no sequence
  882. Example         : EPIL = ESC \% (1)
  883. More in Sections: 2.7, 7.3
  884.  
  885.    This FFDL sequence describes the format of the final data (epilogue) of
  886. an FFDL output.
  887.  
  888.  
  889. 2.6.10     The FILR Parameter
  890.  
  891. Parameter Type  : Numerical (four bits)
  892. Valid Values    : 0 to 15
  893. Default         : 13
  894. Example         : FILR = 1
  895. More in Sections: 7.11
  896.  
  897.    This parameter consists of four bits. The first bit determines whether
  898. paths in the file requester are to be expanded (section 7.11.1). The
  899. second bit determines whether icon (".icon" and ".info") file names are to
  900. be displayed in the file requester, while the status of the third bit
  901. controls whether a double-click is handled in the file requester (section
  902. 3.23) and macro requester (section 6.1). If the fourth bit is set, the
  903. Personal Fonts Maker displays a warning message before overwriting data on
  904. an existing file. The desired value can be obtained by adding 1, 2, 4 and
  905. 8 if the first, second, third and fourth bit are set, respectively. There
  906. are sixteen possible combinations: 0 = no path expansion, no icon files,
  907. no double-click, no overwrite warning; 1 = expand path names, no icon
  908. files, no double-click, no overwrite warning; 2 = no path expansion, list
  909. icon files, no double-click, no overwrite warning; 3 = expand path names
  910. and list icon files, but no double-click nor overwrite warnings. The
  911. settings 4 to 7 are the same as 0 to 3, respectively, but double clicks
  912. are interpreted. Settings 8 to 15 are similar to those from 0 to 7, only
  913. that overwrite warning messsages are activated.
  914.  
  915.  
  916. 2.6.11     The GRID Parameter
  917.  
  918. Parameter Type  : Numerical
  919. Valid Values    : 0, 1, 2
  920. Default         : 1
  921. Example         : GRID = 1
  922. More in Sections: 7.6
  923.  
  924.    This parameter controls the appearance of the grid in the character
  925. editing box. If the parameter is set to 0, no grid is displayed. If the
  926. value is 1 or 2, the grid is displayed consisting of coloured lines or
  927. blank lines between the dots, respectively.
  928.  
  929.  
  930. 2.6.12     The ICON Parameter
  931.  
  932. Parameter Type  : Numerical
  933. Valid Values    : 0, 1, 2
  934. Default         : 1
  935. Example         : ICON = 1
  936. More in Sections: 7.8
  937.  
  938.    A value of 0 means that no Workbench icon files will be saved along
  939. with the files saved by the Personal Fonts Maker. If the value is 1 or 2,
  940. icon files are always saved. A value of 1 will cause the standard image to
  941. be used for font files, while if the value is 2, the image used for the
  942. Workbench icon will be extracted from the currently displayed character.
  943.  
  944.  
  945. 2.6.13     The ITAF Parameter
  946.  
  947. Parameter Type  : Numerical
  948. Valid Range     : 1 to 255
  949. Default         : 3
  950. Example         : ITAF = 2
  951. More in Sections: 5.6, 6.6.8, 7.4
  952.  
  953.    This parameter determines the number of consecutive lines which have to
  954. be slanted to the right by one dot, relative to the lines below them when
  955. the "Italicize" function is called.
  956.  
  957.  
  958. 2.6.14     The JOIN Parameter
  959.  
  960. Parameter Type  : Numerical
  961. Valid Values    : 0, 1
  962. Default         : 1
  963. Example         : JOIN = 1
  964. More in Sections: 7.9
  965.  
  966.    The Personal Fonts Maker allows the user to work with two fonts at a
  967. time. If this parameter is set, whenever a character is selected from one
  968. font, the character having the same code in the other font becomes the
  969. current character of that font. This means that the current character of
  970. the two fonts will always have the same code, i.e. it will be the same
  971. character, if one character set is used for both fonts. If the parameter
  972. is not set, each font has its own, independent, current character.
  973.  
  974.  
  975. 2.6.15     The LANG Parameter
  976.  
  977. Parameter Type  : Numerical
  978. Valid Range     : 0 to 255
  979. Default         : 0
  980. Example         : LANG = 0
  981. More in Sections: 7.12
  982.  
  983.    In multi-lingual versions of the Personal Fonts Maker this value
  984. controls the user interface language. The following languages, for
  985. example, are associated with the first numbers: 0 = English, 1 = Italian,
  986. 2 = German, 3 = French and 4 = Spanish. There are slight differences
  987. between the British and the American English versions of the Personal
  988. Fonts Maker texts.
  989.  
  990.  
  991. 2.6.16     The MCRO Parameter
  992.  
  993. Parameter Type  : String (File Name)
  994. Maximum Length  : 192 Characters
  995. Default         : no macro
  996. Example         : MCRO A = "PFM:PFM_Macros/Outline.mcr"
  997. More in Sections: 6.1
  998.  
  999.    This string must contain the entire path and file name which the
  1000. Personal Fonts Maker can use to access a macro file. The maximum length of
  1001. the path is 128 characters. The letter before the equal sign indicates the
  1002. key (from <A> to <Z>) to which the macro is to be associated.
  1003.  
  1004.    It is possible to select up to 26 different macros (in the ASCII
  1005. character set the letters from A to Z are 26) from the same parameter
  1006. file.
  1007.  
  1008.  
  1009. 2.6.17     The PROL Parameter
  1010.  
  1011. Parameter Type  : FFDL Sequence
  1012. Maximum Length  : 400 Characters
  1013. Default         : no sequence
  1014. Example         : PROL = ESC \x (1) ESC \: NUL NUL NUL
  1015. More in Sections: 2.7, 7.3.5
  1016.  
  1017.    This FFDL sequence describes the format of the initial data (prologue)
  1018. of an FFDL output.
  1019.  
  1020.  
  1021. 2.6.18     The RNGE Parameter
  1022.  
  1023. Parameter Type  : Numerical (two values)
  1024. Valid Range     : -1, -2, -3 and 0 to 255
  1025. Default         : 0 255
  1026. Example         : RNGE = 0 255
  1027. More in Sections: 7.3.9
  1028.  
  1029.    The RNGE variable specifies the starting and ending characters of the
  1030. font for which the SQON and SQOF FFDL sequences must be repeated.
  1031.  
  1032.  
  1033. 2.6.19     The SQON Parameter
  1034.  
  1035. Parameter Type  : FFDL Sequence
  1036. Maximum Length  : 400 Characters
  1037. Default         : no sequence
  1038. Example         : SQON = ESC \& (0) CNUM CNUM (1) XSIZ (1) VDAT
  1039. More in Sections: 2.7, 7.3.6
  1040.  
  1041.    This is the FFDL sequence associated with the active characters.
  1042.  
  1043.  
  1044. 2.6.20     The SQOF Parameter
  1045.  
  1046. Parameter Type  : FFDL Sequence
  1047. Maximum Length  : 400 Characters
  1048. Default         : no sequence
  1049. Example         : SQOF = (0)
  1050. More in Sections: 2.7, 7.3.7
  1051.  
  1052.    This is the FFDL sequence associated with the characters which are not
  1053. active.
  1054.  
  1055.  
  1056. 2.6.21     The STCM Parameter
  1057.  
  1058. Parameter Type  : Numerical (two bits)
  1059. Valid Values    : 0, 1, 2, 3
  1060. Default         : 3
  1061. Example         : STCM = 3
  1062. More in Sections: 3.12, 4.3, 4.5, 7.3.1, 7.3.2, 7.10
  1063.  
  1064.    The first bit determines whether the maximum or the proportional
  1065. stretch mode is to be used. If the second bit is set, the stretch function
  1066. is automatically used when data is exchanged between fonts through the
  1067. character buffer's "Paste" function. The following values are possible: 0
  1068. = maximum stretch, no stretch from buffer; 1 = proportional stretch, no
  1069. stretch from buffer; 2 = maximum stretch, buffer data stretched
  1070. automatically; 3 = proportional stretch, automatic buffer stretch.
  1071.  
  1072.  
  1073. 2.6.22     The WBEN Parameter
  1074.  
  1075. Parameter Type  : Numerical
  1076. Valid Values    : 0, 1
  1077. Default         : 1
  1078. Example         : WBEN = 0
  1079. More in Sections: 4.15, 7.7
  1080.  
  1081.    If the parameter is set to 0, the Personal Fonts Maker tries to close
  1082. the Workbench screen. The default is 0 if the Personal Fonts Maker is
  1083. loaded on a computer with less than 1 Mbyte of RAM.
  1084.  
  1085.  
  1086. 2.6.23     The XDPI Parameter
  1087.  
  1088. Parameter Type  : Numerical
  1089. Valid Range     : 1 to 65535
  1090. Default         : 360
  1091. Example         : XDPI = 360
  1092. More in Sections: 2.7.2.20, 7.3.3
  1093.  
  1094.    This parameter contains the number of horizontal dots per inch of the
  1095. output device (e.g. printer or video).
  1096.  
  1097.  
  1098. 2.6.24     The XMAX Parameter
  1099.  
  1100. Parameter Type  : Numerical
  1101. Valid Range     : 1 to 255
  1102. Default         : 36
  1103. Example         : XMAX = 37
  1104. More in Sections: 6.6.57, 2.7.2.21, 2.7.2.22, 3.4, 7.3.1
  1105.  
  1106.    The maximum horizontal size of each character, expressed in dots, is
  1107. defined by this parameter.
  1108.  
  1109.  
  1110. 2.6.25     The YDPI Parameter
  1111.  
  1112. Parameter Type  : Numerical
  1113. Valid Range     : 1 to 65535
  1114. Default         : 180
  1115. Example         : YDPI = 360
  1116. More in Sections: 2.7.2.24, 7.3.4
  1117.  
  1118.    This parameter contains the number of vertical dots per inch of the
  1119. output device.
  1120.  
  1121.  
  1122. 2.6.26     The YMAX Parameter
  1123.  
  1124. Parameter Type  : Numerical
  1125. Valid Range     : 1 to 255
  1126. Default         : 24
  1127. Example         : YMAX = 24
  1128. More in Sections: 2.7.2.25, 7.3.2
  1129.  
  1130.    The maximum vertical size of the font (i.e. all characters in the
  1131. font), expressed in dots, is defined by this parameter.
  1132.  
  1133.  
  1134. 2.7        Programming the Output Format: The Cloanto FFDL
  1135.  
  1136.    The Font Format Description Language is a powerful tool which can be
  1137. used to describe the format of the data to be output. This is necessary
  1138. whenever the Personal Fonts Maker is used to create font data (a font
  1139. file, or printer download data) in a format different from the standard
  1140. Amiga or Personal Fonts Maker font file format. The FFDL makes the
  1141. Personal Fonts Maker so flexible that it can create download files for the
  1142. most different printers (see sections 2.1 and 2.4).
  1143.  
  1144.    Section 7.3 explains how FFDL sequences can be combined to create font
  1145. data downloadable to a printer or ready to be processed by another program
  1146. or system. This section explains how to use the different "bricks" of the
  1147. FFDL, in order to write an FFDL description which can be interpreted by
  1148. the Personal Fonts Maker.
  1149.  
  1150.    The following three lines are examples of FFDL sequences:
  1151.  
  1152.      w(\A + 32)
  1153.      ESC \x (1) ESC \: NUL NUL NUL
  1154.      ESC \& (0) CNUM CNUM (1) XSIZ (1) VDAT
  1155.  
  1156.    An FFDL sequence is a text string written by the user. The FFDL is used
  1157. to specify what data is to be output, in which order and in what format.
  1158. The FFDL allows the user to specify the data format as a sequence of data
  1159. units. Data units in an FFDL sequence are interpreted in their order of
  1160. appearance (left to right) to generate the associated output. Successive
  1161. data units in a string are separated by one or more space characters.
  1162.  
  1163.    A data unit can consist of constants and variables. A constant is a
  1164. number which is defined by the user and is not varied by the program. A
  1165. variable is a value which is referenced to by the user, but is defined by
  1166. the program at output time. Variables are written as four-letter codes.
  1167. Only capital letters can be used for variables. The number 27, for
  1168. example, is a constant. The width of a character (XSIZ) in a font is a
  1169. variable, as it is determined at output time, depending on the width of
  1170. the character currently processed. Several font parameters can also be
  1171. accessed as variables.
  1172.  
  1173.    Both constants and variables can be terms of algebraical and logical
  1174. operators. Operators are used to perform "calculations". The plus sign
  1175. ('+') is an example of an algebrical operator. Other operators are listed
  1176. in section 2.7.3.
  1177.  
  1178.    There are different kinds of data units. Some font parameters (like
  1179. XDPI) are also variables which are immediately recognized as data units.
  1180. Constants can be written either as standard ASCII control code
  1181. abbreviations (like ESC), as ASCII character constants (having a decimal
  1182. code in the range 33-126) identified by a '\' prefix (e.g. \A), or as a
  1183. number enclosed in parentheses, like (32). Parentheses can contain
  1184. constants, variables and operators. All the data between two parentheses
  1185. is called expression, and is interpreted and treated as one data unit.
  1186.  
  1187.    There are a few data units with peculiar properties. CIDT, HDAT, HICD,
  1188. VDAT and VIDT cannot be treated as operands (except as arguments in LENG).
  1189. Instead, they are already complete data units, which tell the Personal
  1190. Fonts Maker that the character graphic data is to be output in a
  1191. particular format. LENG must be followed by an expression contained
  1192. between parentheses. REPT must also precede two parentheses, but the
  1193. latter must contain two expressions separated by a comma (','). All
  1194. variables and data units are described in detail in the following
  1195. sections.
  1196.  
  1197.  
  1198. 2.7.1      FFDL Constants
  1199.  
  1200.    Constants are the most used data units and easiest to understand. A
  1201. constant is a number which is written by the user and is not modified by
  1202. the Personal Fonts Maker at output time.
  1203.  
  1204.    When the FFDL is used to describe the format of font data to be
  1205. downloaded to a printer, constants are typically used to make up the
  1206. control sequences as described in the printer's documentation.
  1207.  
  1208.    A subset of the FFDL, where only constants are interpreted, is used by
  1209. the Printer Driver Modifier (chapters 9 to 11), as only standard printer
  1210. control sequences need to be described.
  1211.  
  1212.    There are three ways of using constants to create a data unit. If the
  1213. code to be output can be logically associated with the character in the
  1214. standard character set (see section 2.8) having the same code, then it may
  1215. be most intuitive to type that character. The character must be prefixed
  1216. with a backslash ('\'), so that the Personal Fonts Maker can interpret it
  1217. as a character constant. Otherwise the program would search for the
  1218. character in its internal dictionary of variables and constants,
  1219. displaying an error message if the character cannot be found there. A data
  1220. unit which is to cause the output of the capital letter 'A' (code 65)
  1221. would be: \A. A backslash (code 92) would be written as: \\. Appendixes B
  1222. and D list the codes which may be useful to create data units in this
  1223. format. The quote sign ('"', ASCII code 34) can be used to enclose a
  1224. sequence of ASCII characters. If either the quote or the backslash
  1225. character are to appear in the string, they must be preceded by a
  1226. backslash. For example, \A \B \C \" \\ SP \D could be written as "ABC\"\\
  1227. D".
  1228.  
  1229.    The second way to output a constant value is to write a data unit in
  1230. the form of an ASCII control code abbreviation. There are 33 standard two-
  1231. or three-letter abbreviations for the codes from 0 to 32. These are:
  1232.  
  1233.      00-09:   NUL  SOH  STX  ETX  EOT  ENQ  ACK  BEL  BS   HT
  1234.      10-19:   LF   VT   FF   CR   SO   SI   DLE  DC1  DC2  DC3
  1235.      20-29:   DC4  NAK  SYN  ETB  CAN  EM   SUB  ESC  FS   GS
  1236.      30-32:   RS   US   SP
  1237.  
  1238.    Appendix B has a detailed listing of these codes. The codes do not need
  1239. to be prefixed by a backslash. The abbreviations must be written in
  1240. capital letters.
  1241.  
  1242.    The third method which can be used to define a data unit with constant
  1243. data is to write the code in numbers between parentheses. This is not
  1244. immediately recognized by the program as a constant, since the expression
  1245. contained in the parentheses must first be evaluated (section 2.7.3), but
  1246. the result is the same: a constant.
  1247.  
  1248.    Decimal, hexadecimal and octal numbers are accepted between
  1249. parentheses. Hexadecimal numbers must be preceded by a "0x" prefix, while
  1250. octal numbers must begin with a '0' digit. This follows the standard
  1251. adopted by the C programming language, and explained in section 2.7.3.
  1252.  
  1253.    When the handbook of a printer says that a sequence like
  1254.  
  1255.      ESC % 1
  1256. or
  1257.      CHR$(27) "%" CHR$(1)
  1258.  
  1259. has to be sent to the printer (these are two ways to represent the same
  1260. control codes) to activate a certain function, the equivalent Personal
  1261. Fonts Maker data units could be:
  1262.  
  1263.      (27) (37) (1)
  1264. or
  1265.      ESC \% (01)
  1266. or
  1267.      ESC (0x25) SOH
  1268.  
  1269.    This is just an example to show how the same data units can be written
  1270. in different ways with the FFDL.
  1271.  
  1272.    It should be noted that a number alone (without parentheses), or a
  1273. character without the preceding backslash, are not data units. When the
  1274. Personal Fonts Maker encounters a number or another character without the
  1275. signs just mentioned, it searches to see if it recognizes that group of
  1276. characters as a variable. If it cannot find a matching variable, an error
  1277. message is displayed and the output of the FFDL sequence data is aborted.
  1278.  
  1279.  
  1280. 2.7.2      FFDL Variables
  1281.  
  1282.    The Personal Fonts Maker allows the user to create a definition of the
  1283. font data format as an entity which is completely independent from the
  1284. font data itself. This means that once an FFDL sequence has been written,
  1285. it can be used for different fonts in different sizes, without having to
  1286. be rewritten. To do this, variables can be inserted in the FFDL
  1287. sequences.
  1288.  
  1289.    Variables are data units written as codes consisting of four capital
  1290. letters. When the FFDL sequence is read by the program to output the data,
  1291. the values currently associated with each variable are output.
  1292.  
  1293.    Some variables are character relative. This means that different values
  1294. can be associated to the variable, depending on the character currently
  1295. processed. These variables are relative to the current character. The
  1296. variable CNUM, for example, always contains the code associated with the
  1297. current character. These variables are often described as "current
  1298. character-relative".
  1299.  
  1300.    As described in section 7.3, some FFDL sequences can be repeated for a
  1301. series of characters. This means that the same FFDL sequence is used to
  1302. output data of many different characters. Current character-relative
  1303. variables are generally used only in these FFDL sequences. If a current
  1304. character-relative variable is used in another FFDL sequence, then the
  1305. current character will be the character currently selected and displayed
  1306. in the font editing box.
  1307.  
  1308.    The following sections explain each variable in detail.
  1309.  
  1310.  
  1311. 2.7.2.1    FFDL Variables: ATRB
  1312.  
  1313.    This variable contains one bit for each of the font style attributes
  1314. which the Personal Fonts Maker can handle (chapter 8). The variable
  1315. describes the style of the current font, and is updated whenever a font is
  1316. loaded or imported, or when the style flags are modified manually, as
  1317. described in chapter 8. The following table shows the meaning of each
  1318. bit.
  1319.  
  1320.      BIT     ATTRIBUTE                          SECTION
  1321.  
  1322.       0      Italic                             8.1
  1323.       1      Bold                               8.2
  1324.       2      Light                              8.3
  1325.       3      Underlined                         8.4
  1326.       4      Outline                            8.5
  1327.       5      Shadow                             8.6
  1328.       6      Superscript                        8.7
  1329.       7      Subscript                          8.8
  1330.       8      Enlarged                           8.9
  1331.       9      Condensed                          8.10
  1332.      10      Reverse                            8.11
  1333.      11      Serif                              8.12
  1334.      12      Draft                              8.13
  1335.      13      Fixed Pitch                        8.14
  1336.      14      Right to Left                      8.15
  1337.      15      Landscape                          8.16
  1338.  
  1339.    For example, the following sequence outputs a 1 (one) if the "Shadow"
  1340. flag is set, 0 (zero) otherwise:
  1341.  
  1342.      (ATRB >> 5 & 1)
  1343.  
  1344.    Similarly, this sequence outputs a 1 (one) if either the "Outline"
  1345. and/or the "Shadow" flags are set, 0 otherwise:
  1346.  
  1347.      ((ATRB & (1 << 4 | 1 << 5)) != 0)
  1348.  
  1349.    The ATRB is particularly useful for adding style information to
  1350. downloaded fonts. Most page printers support similar functions.
  1351.  
  1352.  
  1353. 2.7.2.2    FFDL Variables: CHQT
  1354.  
  1355.    This variable (the name is an abbreviation of "CHaracter QuanTity")
  1356. contains the number of characters in the selected range of the font which
  1357. are active (see section 3.10). If no character is active, CHQT is 0.
  1358.  
  1359.  
  1360. 2.7.2.3    FFDL Variables: CIDT
  1361.  
  1362.    This data unit outputs the graphical bitmap of the current character.
  1363. The vertical columns of the bitmap are processed and output from left to
  1364. right, in two passes (CIDT comes from "Character Interlaced DaTa"). This
  1365. format is used by some printers which - as described in section 2.5 -
  1366. shift the paper up by a fraction of the dot diameter after a first print
  1367. pass, so that dots can be overlapped vertically. The CIDT data unit (like
  1368. VIDT) outputs data in a format which is ready to be used by these
  1369. printers.
  1370.  
  1371.    In the first pass, only dots appearing at odd lines (i.e. odd numbered
  1372. positions from the top, counting from one) in each column are output. Dots
  1373. which are contained in even-numbered rows are output in the second pass.
  1374.  
  1375.    CIDT outputs the bitmap of the current character in two single passes
  1376. (character priority mode). This is different from VIDT (section 2.7.2.18),
  1377. which repeats the odd/even passes for each column in the character (column
  1378. priority mode).
  1379.  
  1380.    This format is generally used only to create high quality download
  1381. fonts, as draft and high-speed fonts are usually not printed with
  1382. multi-pass techniques.
  1383.  
  1384.    This data unit cannot be used as a term of an expression. The variable
  1385. contains graphic data, which cannot be handled by the operators described
  1386. in section 2.7.3. No prefix codes can be used before this variable. CIDT
  1387. can, however, appear as an expression in the LENG() function. HDAT, HICD,
  1388. VDAT and VIDT work in the same way. These bitmap output formats are
  1389. described in sections 2.7.2.8, 2.7.2.9, 2.7.2.17 and 2.7.2.18.
  1390.  
  1391.  
  1392. 2.7.2.4    FFDL Variables: CNUM
  1393.  
  1394.    This is the code of the current character. This is not the Amiga
  1395. character set code of the character, which can be obtained with the
  1396. variable described in section 2.7.2.5. It is, on the contrary, the code
  1397. displayed on the screen when the characters are edited (section 3.3).
  1398.  
  1399.  
  1400. 2.7.2.5    FFDL Variables: EQAM
  1401.  
  1402.    This is the code of the current character translated into the Amiga
  1403. character set code. If no equivalent character was defined in the Amiga
  1404. set, then EQAM (from "EQuals AMiga") will contain -1.
  1405.  
  1406.    Sections 2.8 and 4.10 have more on character sets.
  1407.  
  1408.  
  1409. 2.7.2.6    FFDL Variables: FCLM
  1410.  
  1411.    The first column of the current character which contains at least one
  1412. coloured dot is referenced by this variable. The code of the leftmost
  1413. column is zero, and may also be returned to indicate that the character is
  1414. completely empty. FCLM and LCLM (section 2.7.2.12) can be used in fixed
  1415. pitch fonts in a way similar to the KERN-SPCE combination in
  1416. proportionally spaced fonts.
  1417.  
  1418.  
  1419. 2.7.2.7    FFDL Variables: FRST
  1420.  
  1421.    This variable indicates the code of the first character on which the
  1422. SQON and SQOF FFDL sequences are being repeated. This may not be the same
  1423. as the first value of the RNGE parameter (section 2.6.18) if one of the
  1424. special codes (-1, -2 and -3) is used to define the range, as described in
  1425. section 7.3.9. FRST is not relative to the character currently processed,
  1426. but has the same value throughout the whole output cycle. If the start
  1427. code of the range is defined by a -1, -2 or -3, FRST respectively contains
  1428. the code of the first "On" character, the first "Off" character or the
  1429. character which was the current character before the data output began.
  1430.  
  1431.    FRST is generally used to describe an "optimized" font download format
  1432. (section 12.6.4 , "Parameter Files: Printer Font Descriptions"), as in the
  1433. following example:
  1434.  
  1435.      ; Fujitsu Optim
  1436.      ; copy ROM set to RAM,
  1437.      ; only one command to activate the redefinition of
  1438.      ; all characters from FRST to LAST
  1439.  
  1440.      PROL = ESC \: NUL NUL NUL ESC \& (0x10) FRST LAST
  1441.  
  1442.      ; XSIZ (> 0) means that (XSIZ*3) bytes of data follow in VDAT
  1443.      SQON = XSIZ VDAT
  1444.  
  1445.      ; (0) means that no data is sent ("Off" character)
  1446.      SQOF = (0)
  1447.  
  1448.      ; activate the downloaded characters
  1449.      EPIL = ESC \% (5) (0)
  1450.  
  1451.  
  1452. 2.7.2.8    FFDL Variables: HDAT
  1453.  
  1454.    This data unit causes the output of the graphical bitmap of the current
  1455. character. The horizontal lines of the bitmap are processed and output
  1456. from top to bottom, as horizontal rows of dots (HDAT comes from
  1457. "Horizontal DATa").
  1458.  
  1459.    This data unit cannot be used as a term of an expression. The variable
  1460. contains graphic data, which cannot be handled by the operators described
  1461. in section 2.7.3. No prefix codes can be used before this variable. HDAT
  1462. can, however, appear as an expression in the LENG() function.
  1463.  
  1464.  
  1465. 2.7.2.9    FFDL Variables: HICD
  1466.  
  1467.    This data unit outputs the current character's interlaced bitmap, in
  1468. character priority mode (sections 2.7.2.3 and 2.7.2.18). The bitmap is
  1469. output in two passes of odd/even rows (HICD comes from "Horizontal
  1470. Interlaced Compact Data"). Only coloured dots are output. For each
  1471. coloured dot, the exact coordinates are given.
  1472.  
  1473.    This is a relatively complex data unit, designed to meet very unusual
  1474. hardware and software needs. For example, the horizontal printing density
  1475. of a Honeywell Bull 4/4x series printer, which requires such a data
  1476. format, is about four times its vertical density. Fonts created for this
  1477. printer are subjected to very restrictive rules regarding the number and
  1478. displacement of coloured dots. When these specifications are met, the HICD
  1479. data unit produces the most compact and efficient data outputs.
  1480.  
  1481.    The first pass (in which odd-numbered rows are processed) is prefixed
  1482. by a single 8-bit value indicating the length of the data (in bytes plus
  1483. one) transmitted during that pass (e.g. a prefix of one would mean "zero
  1484. bytes follow"). Each pass is divided into horizontal stripes, each
  1485. addressing a maximum of 7 adjacent vertical printer pins. A byte prefixing
  1486. each stripe indicates which pins are addressed within that stripe (bits
  1487. 7-1), and whether other stripes follow (bit 0) in the same pass. Each
  1488. stripe contains a sequence of horizontal coordinate values (leftmost
  1489. position = 0) for each printer pin marked as "used" by that stripe's
  1490. prefix. A sequence of coordinates referring to the same printer pin must
  1491. be terminated by setting the 7th bit of the last coordinate.
  1492.  
  1493.    The HICD data unit cannot be used as a term of an expression. The
  1494. variable contains graphic data, which cannot be handled by the operators
  1495. described in section 2.7.3. No prefix codes can be used before this
  1496. variable. HICD may appear as an expression in the LENG() function.
  1497.  
  1498.  
  1499. 2.7.2.10   FFDL Variables: KERN
  1500.  
  1501.    This variable contains the offset from the left at which the graphic
  1502. data of the current character is to appear. The variable is associated
  1503. with the "Kerning" parameter described in section 3.6.
  1504.  
  1505.    The meaning of the word "kerning" used in this documentation is
  1506. inherited from the Amiga environment. Amiga fonts do not have a
  1507. two-dimensional kerning table like those of other systems.
  1508.  
  1509.  
  1510. 2.7.2.11   FFDL Variables: LAST
  1511.  
  1512.    This variable is similar to FRST (section 2.7.2.7), only that it is
  1513. relative to the last character on which the SQON and SQOF FFDL sequences
  1514. are repeated.
  1515.  
  1516.  
  1517. 2.7.2.12   FFDL Variables: LCLM
  1518.  
  1519.    This variable indicates the last column of the current character which
  1520. contains at least one coloured dot. A value of XSIZ-1 may be used to
  1521. indicate that the character is completely empty. A variable often used in
  1522. combination with LCLM (last column) is FCLM (first column), which is
  1523. described in section 2.7.2.6.
  1524.  
  1525.  
  1526. 2.7.2.13   FFDL Variables: LENG()
  1527.  
  1528.    This data unit is complete only if the four-letter code is followed by
  1529. an expression contained in parentheses. This is a function, rather than a
  1530. variable. It calculates and outputs the length (in bytes) which would be
  1531. occupied by the output of the FFDL sequence contained in the parentheses.
  1532. No data associated with the FFDL sequence is actually output. If the FFDL
  1533. sequence is also to be output, it must be repeated after the LENG(...)
  1534. function. The first parenthesis must immediately follow the "LENG"
  1535. keyword.
  1536.  
  1537. For example:
  1538.  
  1539.      LENG(wXDPI)
  1540.  
  1541. equals 2 (one word = two bytes).
  1542.  
  1543.    This function is useful whenever it is necessary to know in advance how
  1544. many bytes will be occupied by the output of an FFDL sequence. LENG() is
  1545. similar to the "sizeof()" operator of the C programming language.
  1546.  
  1547.  
  1548. 2.7.2.14   FFDL Variables: REF1-4
  1549.  
  1550.    This is a set of four variables: REF1, REF2, REF3 and REF4. They are
  1551. associated with the "Reference Point" parameters described in sections 2.3
  1552. and 3.21.
  1553.  
  1554.  
  1555. 2.7.2.15   FFDL Variables: REPT()
  1556.  
  1557.    Like LENG(), this is a function. The name is an abbreviation of
  1558. "REPeaT". Two expressions, separated by a comma sign (','), must be
  1559. contained between two parentheses immediately following the four-letter
  1560. code. No space may appear between "REPT" and the first '('.
  1561.  
  1562.    The data unit causes the output of the data associated with the second
  1563. expression for as many times as specified by the first expression. This
  1564. means that the first expression specifies how many times the second
  1565. expression is to be output. REPT() can be compared to the "for" statement
  1566. which can be found in many computer programming languages. If the first
  1567. value is smaller than 1 (zero or negative), no data is output. Graphical
  1568. data variables (e.g. CIDT, HDAT, HICD, VDAT and VIDT) cannot appear in the
  1569. second expression of REPT().
  1570.  
  1571.    To specify the output format of the second expression, the whole data
  1572. unit must be prefixed with the desired prefix (as described in section
  1573. 2.7.4). For example, to output 10 "zero" words (20 bytes),
  1574.  
  1575.      REPT((10),wNUL)
  1576.  
  1577. cannot be written, and would result in an error, while
  1578.  
  1579.      wREPT((10),NUL)
  1580.  
  1581. would be correct, and
  1582.  
  1583.      REPT((20),NUL)
  1584.  
  1585. would produce the same result.
  1586.  
  1587.    One possible application of this function is the output of pad data to
  1588. fill space. This may be necessary if a printer accepts only fixed-width
  1589. characters, but a font which was designed as proportionally-spaced is to
  1590. be output.
  1591.  
  1592.    The following sequence is one of the FFDL sequences used to output
  1593. draft mode characters in an 11 x 8 (width by height) matrix to an IBM
  1594. Proprinter printer. It contains the REPT() function to add some "zero"
  1595. bytes after the last column of dots. This makes sure that sequence always
  1596. has a constant length. If the character is less than 11 columns wide, then
  1597. some empty columns are added. The sequence is:
  1598.  
  1599.      ESC \= x(1*13+2) (20) CNUM (0) (0) VDAT REPT((11-LENG(VDAT)),NUL)
  1600.  
  1601.    This sequence is repeated for every active character in the selected
  1602. range of the font, as described in section 7.3.6.
  1603.  
  1604.    This function can also be used to output some data only if a particular
  1605. condition is met. If the first expression is a logical expression,
  1606. containing one or more relational operators (section 2.7.3.2), the data
  1607. associated with the second expression will only be output if the first
  1608. expression is true.
  1609.  
  1610. For example:
  1611.  
  1612.      sREPT((CNUM==(CNUM/10)*10),CNUM)
  1613.  
  1614. will output a string consisting of the digits which make up the ASCII code
  1615. of CNUM, if (and only if) CNUM is a multiple of 10.
  1616.  
  1617.  
  1618. 2.7.2.16   FFDL Variables: SPCE
  1619.  
  1620.    This variable contains the "logical" horizontal space (opposed to the
  1621. "physical" space, defined by the XSIZ variable) in dots occupied by the
  1622. current character. The variable is associated with the "Space" parameter
  1623. described in section 3.5.
  1624.  
  1625.    SPCE indicates by how many dots the print position has to be moved to
  1626. the right after the graphic data associated with the current character is
  1627. printed.
  1628.  
  1629.  
  1630. 2.7.2.17   FFDL Variables: VDAT
  1631.  
  1632.    The VDAT data unit (from "Vertical DATa") causes the output of the
  1633. current character's bitmap data as a sequence of columns, from the left to
  1634. the right of the bitmap.
  1635.  
  1636.    This data unit cannot be used as a term of an expression. The variable
  1637. contains graphic data, which cannot be handled by the operators described
  1638. in section 2.7.3. No prefix codes can be used before this variable. VDAT
  1639. can, however, appear as an expression in the LENG() function.
  1640.  
  1641.  
  1642. 2.7.2.18   FFDL Variables: VIDT
  1643.  
  1644.    This data unit is similar to CIDT (section 2.7.2.3). It too, outputs
  1645. interlaced graphical data in the form of vertical columns from left to
  1646. right. While CIDT outputs the data in just two passes (character priority
  1647. mode), VIDT (from "Vertical Interlaced DaTa") cycles through the odd/even
  1648. steps at every column (column priority mode).
  1649.  
  1650.    Like CIDT, HDAT, HICD and VDAT, VIDT cannot be used as a term of an
  1651. expression. The variable contains graphic data, which cannot be handled by
  1652. the operators described in section 2.7.3. No prefix codes can be used
  1653. before this variable. VIDT can, however, appear as an expression in the
  1654. LENG() function.
  1655.  
  1656.  
  1657. 2.7.2.19   FFDL Variables: XBYT
  1658.  
  1659.    This variable indicates how many bytes are necessary to store one
  1660. horizontal ("X") row of dots of the bitmap of the current character. If
  1661. the number of bits (dots) is not a multiple of 8, the value is rounded up
  1662. to the next multiple of 8 before it is converted into bytes (i.e. divided
  1663. by 8).
  1664.  
  1665.  
  1666. 2.7.2.20   FFDL Variables: XDPI
  1667.  
  1668.    This variable is associated with the "Horizontal Dots Per Inch"
  1669. parameter, described in section 7.3.3. The equivalent program parameter is
  1670. described in section 2.6.23.
  1671.  
  1672.    Since the value may easily exceed 255, which is the maximum number
  1673. which can be output by a standard data unit without prefix, the 'w' prefix
  1674. should be used to force the variable to be output as two bytes (see
  1675. section 2.7.4).
  1676.  
  1677.  
  1678. 2.7.2.21   FFDL Variables: XMAX
  1679.  
  1680.    This variable is associated with the parameter described in section
  1681. 7.3.1. The equivalent program parameter is described in section 2.6.24.
  1682.  
  1683.    The maximum horizontal size of each character in the font, expressed in
  1684. dots, is defined by the XMAX parameter. XMAX is not current
  1685. character-relative.
  1686.  
  1687.  
  1688. 2.7.2.22   FFDL Variables: XSIZ
  1689.  
  1690.    This variable is associated with the "XSize" variable described in
  1691. section 3.4. The variable contains the physical size occupied by the
  1692. current character.
  1693.  
  1694.    Unlike SPCE (section 2.7.2.16), which determines the "logical"
  1695. horizontal space occupied by the current character, XSIZ contains the
  1696. exact width of the character matrix.
  1697.  
  1698.  
  1699. 2.7.2.23   FFDL Variables: YBYT
  1700.  
  1701.    This variable indicates the number of bytes which are necessary to
  1702. store one vertical ("Y") column of dots of a character bitmap. This value
  1703. is constant for all characters in the font, as all characters have the
  1704. same height. If the number of bits (dots) per column is not a multiple of
  1705. 8, the value is rounded up to the next multiple of 8 before it is
  1706. converted into bytes (i.e. divided by 8).
  1707.  
  1708.  
  1709. 2.7.2.24   FFDL Variables: YDPI
  1710.  
  1711.    This variable is associated with the "Vertical Dots Per Inch"
  1712. parameter, described in section 7.3.4. The equivalent program parameter is
  1713. described in section 2.6.25.
  1714.  
  1715.    Since the value may easily exceed 255, which is the maximum number
  1716. which can be output by a standard data unit without prefix, the 'w' prefix
  1717. should be used to force the variable to be output as two bytes (see
  1718. section 2.7.4).
  1719.  
  1720.  
  1721. 2.7.2.25   FFDL Variables: YMAX
  1722.  
  1723.    This variable is associated with the parameter described in section
  1724. 7.3.2. The equivalent program parameter is described in section 2.6.26.
  1725.  
  1726.    The maximum vertical size of each character in the font, expressed in
  1727. dots, is defined by the YMAX parameter. YMAX is not current
  1728. character-relative.
  1729.  
  1730.    As all characters in the font have the same height, YMAX can be used as
  1731. a synonym of YSIZ.
  1732.  
  1733.  
  1734. 2.7.2.26   FFDL Variables: YSIZ
  1735.  
  1736.    The Personal Fonts Maker does not use a "YSize" variable. This variable
  1737. exists only to create a logical pair with XSIZ.
  1738.  
  1739.    The height of the matrix of each character in a font is constant.
  1740. Therefore, even if YSIZ is current character-relative, it is always equal
  1741. to YMAX.
  1742.  
  1743.  
  1744. 2.7.3      FFDL Operators
  1745.  
  1746.    Whenever the Personal Fonts Maker encounters a left parenthesis in an
  1747. FFDL sequence, it enters a formula parser mode. A formula (or expression)
  1748. may contain constants (ASCII codes, characters, decimal and hexadecimal
  1749. codes), variables (all variables except those which contain graphic data:
  1750. CIDT, HDAT, HICD, VDAT and VIDT) and algebrical and logical operators.
  1751.  
  1752.    Two parentheses and the whole expression between them can be used
  1753. exactly like a variable, therefore also as a complete data unit. If the
  1754. expression is part of another expression, it is not output as a data unit,
  1755. but only used for calculations. Only the outermost level of parentheses is
  1756. treated as a data unit.
  1757.  
  1758.    The LENG() and REPT() functions (sections 2.7.2.13 and 2.7.2.15)
  1759. perform an operation on the content of the parentheses following them. The
  1760. parentheses following these funcions are linked to the functions, and are
  1761. not considered independent data units.
  1762.  
  1763.    Data unit prefixes (described in section 2.7.4) cannot be used inside
  1764. the parentheses, but are accepted to define the output format of the whole
  1765. expression as a data unit. To do so, the prefix must come immediately
  1766. before the initial left parenthesis.
  1767.  
  1768.    The "0x" and '0' prefixes can (and must) always be used to prefix
  1769. hexadecimal and octal numbers, respectively.
  1770.  
  1771.    FFDL operators are very similar to the operators which are used in the
  1772. C programming language, though C has some more operators. The following
  1773. sections describe each operator in detail.
  1774.  
  1775.  
  1776. 2.7.3.1    FFDL Algebrical Operators
  1777.  
  1778.    There are five algebrical operators: '+' (plus), '-' (minus), '*'
  1779. (multiply), '/' (divide) and '**' (power).
  1780.  
  1781.    The result of the '+' operator is the sum of the operands, while the
  1782. result of the '-' operator is the difference of the operands. The multiply
  1783. and divide signs are used to perform standard multiplication and division
  1784. operations.
  1785.  
  1786.    The result of the '**' operator is the first operand to the power of
  1787. the second operand, i.e. the first operand is multiplied by itself as many
  1788. times as defined by the second operand minus one.
  1789.  
  1790. For example:
  1791.  
  1792.      (4 ** 3)
  1793.  
  1794. equals 64 (four cubed).
  1795.  
  1796.    The '-' (minus) sign can also be used as unary operator. A '-' sign
  1797. after another operator or an open parenthesis indicates that the following
  1798. value is negative (or positive, if '-' precedes a variable whose value is
  1799. already negative). The unary plus sign ('+') is simply skipped by the
  1800. Personal Fonts Maker, as it is not significant in the evaluation of an
  1801. expression.
  1802.  
  1803. For example:
  1804.  
  1805.      -5 + +4
  1806.  
  1807. equals -1. Examples of other valid expressions are:
  1808.  
  1809.      (2 * -XMAX)
  1810.  
  1811. and
  1812.  
  1813.      (-(CNUM + 1) * 10)
  1814.  
  1815.    A detailed description of the priorities of the algebrical operators
  1816. follows in section 2.7.3.4.
  1817.  
  1818.  
  1819. 2.7.3.2    FFDL Relational Operators
  1820.  
  1821.    These operators are called "relational" because they are used to
  1822. determine the relationship between one operand (a variable or a constant)
  1823. and another. These operators are used to compare two quantities, and
  1824. modify some data accordingly.
  1825.  
  1826.    The result of the '==' (equal to), '!=' (not equal to) '<' (less than),
  1827. '>' (greater than), '<=' (less than or equal to) and '>=' (greater than or
  1828. equal to), operators is always either 1 (one) or 0 (zero).
  1829.  
  1830.    All relational operators yield 1 if the specified relation is true, and
  1831. 0 if it is false.
  1832.  
  1833.    The result of
  1834.  
  1835.       (XSIZ > 8)
  1836.  
  1837. will be 1 if XSIZ is greater than 8, zero otherwise.
  1838.  
  1839.    An operand cannot be shared by more than one operator. For example:
  1840.  
  1841.      (\A <= CNUM <= \Z)
  1842.  
  1843. always yields 1 ("\A <= CNUM" can only yield 0 or 1; both values are
  1844. smaller than \Z), while the result of
  1845.  
  1846.      ((\A <= CNUM) & (CNUM <= \Z))
  1847.  
  1848. which is the same as
  1849.  
  1850.      ((\A <= CNUM) == (CNUM <= \Z))
  1851.  
  1852. will be 1 if the ASCII code of CNUM corresponds to a capital letter
  1853. between 'A' and 'Z', 0 otherwise.
  1854.  
  1855.  
  1856. 2.7.3.3    FFDL Bit Manipulation Operators
  1857.  
  1858.    The bit manipulation operators are used to operate on the single data
  1859. bits which constitute the output stream. Section 1.3 introduces concepts
  1860. like bit and byte.
  1861.  
  1862.    There are five FFDL operators to manipulate bits. These are: '&'
  1863. (bitwise AND), '^' (bitwise eXclusive OR = XOR), '|' (bitwise inclusive
  1864. OR), '<<' (shift left) and '>>' (shift right).
  1865.  
  1866.    The result of the AND operation is a value whose bits are set only at
  1867. those positions in which the same bits of both operands are set. The OR
  1868. operator produces a value which has all those bits set where the same bits
  1869. are also set in either one or both operands. The bits in the result of the
  1870. XOR operation are only set in those positions where the same bits in the
  1871. two operands have different values (i.e. one is 0 and the other 1, or vice
  1872. versa).
  1873.  
  1874.    For example, the number 1 (one = binary 01) has only the first bit set.
  1875. The number 2 (two = binary 10) has only the second bit set, while the
  1876. number 3 (three = binary 11) has the first two bits set. Leading 0s
  1877. (zeroes) in binary numbers are used for readability only. Therefore:
  1878.  
  1879.       (1 & 3)        yields 1,
  1880.  
  1881.       (1 & 2)        yields 0,
  1882.  
  1883.       (1 ^ 3)        yields 2,
  1884.  
  1885.       (1 ^ 1)        yields 0,
  1886.  
  1887.       (1 | 2)        yields 3 and
  1888.  
  1889.       (1 | 3)        yields 3.
  1890.  
  1891.    The '&', '^' and '|' operators are associative. More operands of the
  1892. same operator may be rearranged. For example, the result of both
  1893.  
  1894.       (\A | \B | 32)
  1895.  
  1896. and
  1897.  
  1898.       (32 | \A | \B)
  1899.  
  1900. is the ASCII code of the lower case 'c' letter. A look at the ASCII
  1901. character codes in appendix B may make this easier to understand.
  1902.  
  1903.    These first three operators perform a logical AND, XOR and OR operation
  1904. on each bit of their operands. Therefore, they can also be used as
  1905. logical, rather than bitwise operators, if they are used to manipulate
  1906. only data which can be either 0 or 1, like the result of the relational
  1907. operators described in section 2.7.3.2. In this case, the bitwise
  1908. operators work only on one bit, becoming logical operators, so that the
  1909. truth-value (0 or 1) of a multiple condition can be found. For example:
  1910.  
  1911.      (REF1 < 8 & REF2 < 16)
  1912.  
  1913. can be read as "IF REF1 is smaller than 8 AND REF2 is smaller than 16 THEN
  1914. the expression is TRUE (= 1), OTHERWISE it is FALSE (= 0)". More properly,
  1915. it should be read as the bitwise AND operation of two values which can
  1916. either be 0 or 1, therefore yielding 1 only if both values are 1 (i.e.
  1917. REF1 < 8 and REF2 < 16) and 0 otherwise.
  1918.  
  1919.    The shift operators move (shift) the bits which make up a value to the
  1920. left or to the right, inside the byte (or word, as in section 2.7.4) which
  1921. contains them. The step (i.e. the number of bits) by which the data bits
  1922. are shifted to the left or to the right is determined by the operand
  1923. following the shift operator. The second operand cannot be negative, nor
  1924. greater than or equal to the length, in bits, of the first operand (i.e. 8
  1925. or 16).
  1926.  
  1927.    The '<<' (shift left) operator moves the bits which make up the content
  1928. of the first operand to the left. In the process, bit 1 is changed to what
  1929. was bit 0, bit 2 takes the previous content of bit 1, and so on. Bit 0 is
  1930. always cleared (set to 0). The last bit on the left is "lost". This is
  1931. done as many times as specified by the second operand. Since all FFDL
  1932. variables are internally represented with 16 bits, the "lost" bits can be
  1933. recovered by a successive '>>' (shift right) operation, as long as they
  1934. are not shifted out of the 16-bit range. The value referred to by the
  1935. first operand is doubled as many times as specified by the second
  1936. operand.
  1937.  
  1938.     The '>>' (shift right) operator is similar to the other shift
  1939. operator, only that it moves the bits to the right. The last bit on the
  1940. left is cleared to 0 if the first operand is positive (or 0), and set to 1
  1941. otherwise (this preserves the sign of the first operand). Since the
  1942. Personal Fonts Maker internally always uses 16 bits to store FFDL values,
  1943. the leftmost bit is bit 15. The rightmost bit is lost. The first operand
  1944. is halved the number of times specified by the the second operand.
  1945.  
  1946.    For example:
  1947.  
  1948.      (1 << 1)        yields 2  (01 shifted left by one bit becomes 10),
  1949.      (1 << 2)        yields 4  (001 shifted left by two bits becomes
  1950. 100),
  1951.      (3 << 2)        yields 12 (0011 shifted left by two bits becomes
  1952. 1100),
  1953.      (1 >> 1)        yields 0  (1 shifted right by one bit becomes 0) and
  1954.      (3 >> 1)        yields 1  (11 shifted right by one bit becomes 01).
  1955.  
  1956.    The operators described in this section can be especially useful when
  1957. several variables are to be "packed" into a single data unit. Some
  1958. printers, for example, use four bits of a byte to store one value, and the
  1959. remaining four for another value. This, of course, can only be done if the
  1960. values do not exceed 15 (which is the maximum number which can be
  1961. represented using four bits).
  1962.  
  1963.    If, for example, the XBYT and YBYT variables are to be output as a
  1964. single byte (XBYT being stored in the highmost four bits), the
  1965. corresponding data unit must be described as:
  1966.  
  1967.      b((XBYT << 4 ) | YBYT)
  1968.  
  1969. which could also be written as
  1970.  
  1971.      (XBYT << 4 | YBYT)
  1972.  
  1973. since the "shift left" operator has a higher priority than the OR operator
  1974. (section 2.7.3.4) and 'b' is the default data format (section 2.7.4). The
  1975. first of the two examples is more explicit and readable, also because
  1976. spaces were used to isolate variables.
  1977.  
  1978.  
  1979. 2.7.3.4    FFDL Operator Priorities
  1980.  
  1981.    Each FFDL operator has an associated priority, which is a value that
  1982. can range from 1 to 11. The priority determines the order in which
  1983. calculations are performed when there is more than one operator in an
  1984. expression. Generally speaking, expressions are evaluated from the left to
  1985. the right (left-to-right associativity), but operators with higher
  1986. priority are evaluated before those having lower priorities. Several
  1987. operators with the same priority are also handled from the left to the
  1988. right. The only exception is the unary minus operator (the unary plus is
  1989. simply skipped), which has right-to-left associativity.
  1990.  
  1991.    Parentheses (round brackets) force the formula parser to process the
  1992. data between the parentheses as a unit, before the data outside the
  1993. parentheses. Two parentheses and the data they contain can be used as a
  1994. single operand. Parentheses can be nested. The inner levels of parentheses
  1995. are processed before outer levels. The priority of a couple of parentheses
  1996. is higher than that of any operator.
  1997.  
  1998.    For example (the priority of '*' is higher than that of '+'):
  1999.  
  2000.      (2 * 3 + 4)     yields 10,
  2001.      (4 + 2 * 3)     yields 10, but
  2002.      (2 * (3 + 4))   yields 14.
  2003.  
  2004.    Parentheses in excess are allowed. This can be useful to make an FFDL
  2005. sequence more readable. Once again it should be noted that only the
  2006. outermost level of parentheses is handled as a data unit, and therefore
  2007. output by the Personal Fonts Maker. The nesting of parentheses does not
  2008. cause any "side effects".
  2009.  
  2010.      ((2 * ((3))) + (4))
  2011.  
  2012. gives the same result (10) as
  2013.  
  2014.      (2 * 3 + 4)
  2015.  
  2016.    To save parentheses, the operators are distributed among eleven levels
  2017. of priorities:
  2018.  
  2019.      Level 11: '(' and ')' parentheses (highest priority)
  2020.  
  2021.      Level 10: '+' and '-' (unary plus and minus,
  2022.                 having right-to-left associativity)
  2023.  
  2024.      Level  9: '**' (power)
  2025.  
  2026.      Level  8: '*' (multiply) and '/' (divide)
  2027.  
  2028.      Level  7: '+' (plus) and '-' (minus)
  2029.  
  2030.      Level  6: '<<' (shift left) and '>>' (shift right)
  2031.  
  2032.      Level  5: '>' (greater than), '<' (less than), '>=' (greater than or
  2033.                equal to) and '<='(less than or equal to)
  2034.  
  2035.      Level  4: '==' (equal to) and '!=' (not equal to)
  2036.  
  2037.      Level  3: '&' (bitwise AND)
  2038.  
  2039.      Level  2: '^' (bitwise XOR)
  2040.  
  2041.      Level  1: '|' (bitwise OR).
  2042.  
  2043.    The expression
  2044.  
  2045.      ((2+4) > (1+3))
  2046.  
  2047. can be written as
  2048.  
  2049.      ( 4 + 2 > 3 + 1 )
  2050.  
  2051. yielding the same result (1).
  2052.  
  2053.  
  2054.  
  2055. 2.7.4      FFDL Prefixes
  2056.  
  2057.    Data units can be prefixed by a single character to force the data to
  2058. be output in a certain format. This operation is generally referred to as
  2059. casting. By default, each data data unit is output as a single byte
  2060. (8-bits, signed).
  2061.  
  2062.    The prefix must immediately precede the data unit, be it a constant, a
  2063. variable or an expression delimited by parentheses.
  2064.  
  2065.    The following prefixes are accepted:
  2066.  
  2067.  b:   The data unit is output as a signed 8-bit byte. This is the default
  2068.       format.
  2069.  
  2070.  w:   The data unit is output as a signed word (16 bits), consisting of
  2071. the
  2072.       high byte followed by the low byte (the format used by Motorola
  2073.       microprocessors).
  2074.  
  2075.  x:   The data unit is output as a signed word in the format used
  2076.       by Intel microprocessors, with the low byte before the high byte.
  2077.  
  2078.  s:   The data unit is output as a signed decimal string (i.e. a series
  2079. of
  2080.       digits from '0' to '9', ASCII codes 48 to 57). The number must be
  2081. in
  2082.       the range from -32768 to 32767. A '-' sign is prefixed to negative
  2083.       numbers.
  2084.  
  2085.  u:   The data unit is output as an unsigned decimal string. The number
  2086. must
  2087.       be in the range from 0 to 65535.
  2088.  
  2089.  $:   The data unit is output as a hexadecimal string (i.e. a series of
  2090.       digits from '0' to 'F', ASCII codes 48 to 57 and 65 to 70). The
  2091.       number must be in the range from 0 to FFFF (65535 decimal). This is
  2092.       similar to the "0x" prefix used to define FFDL constants, only that
  2093.       it is used for data output.
  2094.  
  2095.    The 'b', 'w' and 'x' prefixes cause all values to be output in the
  2096. "signed" format. This means that one bit is used to indicate whether the
  2097. remaining bits represent a positive or a negative number.
  2098.  
  2099.    Most computer microprocessors have adopted the two's complement
  2100. arithmetic to represent negative numbers. The most significant bit
  2101. determines the sign (0 = positive, 1 = negative). In simple words, the
  2102. rule to change the sign is "flip the bits and add 1". This does not cover
  2103. some special cases, but is sufficient for the following example:
  2104.  
  2105.       b(1)           is output as binary 00000001, and
  2106.       b(-1)          is output as binary 11111111, but
  2107.       b(255)         is also output as 11111111.
  2108.  
  2109.    The 'b' prefix was not necessary in the above examples, as it is the
  2110. default format. The example should make clear how the interpretation of
  2111. the values is up to the program or device receiving the data. It is not
  2112. possible to distinguish between a group of n bits from a group of n-1 bits
  2113. plus a sign bit. Therefore, if a negative number is output to a device
  2114. which expects only positive numbers in its input stream, the value will be
  2115. interpreted as positive.
  2116.  
  2117.    No negative values should be output if the recipient cannot handle
  2118. them. This latter case implies that it is not necessary to output negative
  2119. values. Conversely, if the recipient handles negative numbers, the most
  2120. significant bit must only be set if the value is negative. Otherwise, a -1
  2121. can be interpreted as 255, or vice versa.
  2122.  
  2123.    The 's', 'u' and '$' prefixes cause the data unit to be output as a
  2124. sequence of ASCII digits. No zero (NUL) code is output after the last
  2125. character. If this is requested by the recipient to distinguish the end of
  2126. the string, it must be hand coded in FFDL by adding a (0).
  2127.  
  2128.    Examples:
  2129.  
  2130.      (1+2*5)            yields 11 (byte).
  2131.      s(100/(-2+4))      yields 50 (decimal string: "50").
  2132.      w(CR+LF)           yields 23 (word: CR = 13 + LF = 10).
  2133.      $((5+4)-(15-5))    yields FFFF (hexadecimal string: "FFFF").
  2134.      b(2 * XSIZ)        yields 60 (byte) if XSIZ is 30.
  2135.      (0x10-0x6)         yields 10 (byte).
  2136.      x(LENG($(255))*2)  yields 4 (exception word: byte 4 + byte 0).
  2137.  
  2138.  
  2139. 2.8        Character Sets
  2140.  
  2141.    Character sets are another aspect of fonts. Character sets have nothing
  2142. to do with the graphical and artistical part of the font. Instead, a
  2143. character set determines the order in which the signs appear in the font.
  2144. A character set defines which letters, figures, symbols, and other signs
  2145. are to be part of a font, and the position of the signs in the font.
  2146.  
  2147.    Each character in a font has a unique code, which indicates the
  2148. position of the character in the font. The code indicates the position of
  2149. each character as an offset from the first character. The code of the
  2150. first character is 0 (zero). The code of the second character is 1 (one),
  2151. and so on.
  2152.  
  2153.    Unfortunately, there is not one universal character set. There are
  2154. different character sets for different countries, computers, programs and
  2155. printers. If there were one standard character set, all fonts would
  2156. provide the same collection of characters. But different character sets
  2157. does not necessarily mean different fonts. The characters in a font can be
  2158. re-arranged to match the codes of different character sets. The Personal
  2159. Fonts Maker can do this automatically.
  2160.  
  2161.    The minimal character set for most fonts is the 7-bit ASCII set,
  2162. originally developed for the North-American market. This character set has
  2163. 96 characters, which include all letters, numbers and other symbols which
  2164. can be found on a standard (US) computer terminal or typewriter. The ASCII
  2165. character set also has 32 special codes reserved for control characters,
  2166. like LF (Line Feed) and FF (Form Feed). The sum of 96 and 32 is 128, which
  2167. is the maximum number of different codes which can be represented with 7
  2168. bits.
  2169.  
  2170.    It is easy to imagine that neither 96 nor 128 characters can be
  2171. sufficient for all possible user requirements. Variants of the US 7-bit
  2172. ASCII set were developed to match different user needs. Little-used
  2173. characters of the US set, like the backslash ('\'), some braces and
  2174. brackets ('{', '}', '[' and ']') and other signs were replaced with the
  2175. characters needed by different groups of users. In the Legal set, for
  2176. example, the "registered", "trademark" and "copyright" symbols replaced
  2177. other signs. Different national character sets replace unused characters
  2178. with local signs, like accented letters.
  2179.  
  2180.    Since it is often not practicable to select a new character set to
  2181. write a sign which is not part of the few of a particular variant of the
  2182. US ASCII set, extended (or composite) character sets with up to 192 or 256
  2183. characters were provided. The Personal Fonts Maker can deal with fonts and
  2184. character sets with as many as 256 codes (plus one, as explained in the
  2185. following paragraphs). As for 7-bit character sets, no standard for 8-bit
  2186. extended character sets exists.
  2187.  
  2188.    The Personal Fonts Maker comes with different character set files which
  2189. cover most 7-bit character sets and several extended sets.
  2190.  
  2191.    When standard Amiga characters are displayed on the Personal Fonts
  2192. Maker screen, on the title bar or to show FFDL sequences or parameters in
  2193. string gadgets, the default Amiga character set is used. Most printers, on
  2194. the other hand, adopt the IBM PC 8-bit character set, and/or the Epson
  2195. 7-bit national character sets. Appendixes C, D and E show the differences
  2196. between these character sets.
  2197.  
  2198.    Most fonts which come with the Personal Fonts Maker use the original
  2199. IBM PC character set. Amiga fonts, and the fonts which can be saved and
  2200. read by the Personal Fonts Maker in this format, use the Amiga character
  2201. set.
  2202.  
  2203.    The Personal Fonts Maker can be programmed to use different character
  2204. sets (see sections 4.7 to 4.11). A character set can be designed, saved
  2205. and loaded again at any time. Each font environment (sections 2.6, 2.6.8
  2206. and 3.2) can use a different character set.
  2207.  
  2208.    A character set file contains graphic data like a font. This data is
  2209. used for the default character representation of each character (section
  2210. 3.7). This is necessary to show the user what character is currently being
  2211. edited, using a complete default picture of the character. The Amiga fonts
  2212. cannot be used to do this, as some character sets have signs which are not
  2213. contained in the Amiga character set.
  2214.  
  2215.    A character set file also contains an encoding vector. This is a
  2216. programmable conversion table, used to exchange non-Amiga fonts with the
  2217. Amiga font handling routines. This flexibility in character encoding is
  2218. valuable for two reasons. First, it allows the user to work with fonts in
  2219. which the characters are not ordered following the standard Amiga set,
  2220. like printer fonts adopting the PC set. Second, it makes it possible to
  2221. import and export font data between the Amiga fonts and fonts with a
  2222. different encoding.
  2223.  
  2224.    As described in section 4.10, the data in the encoding vector can be
  2225. programmed by the user. For each character in a set to be described, the
  2226. equivalent Amiga code must be written. The positions in the encoding
  2227. vector for which the Amiga has no equivalent character must be filled with
  2228. a "-1". These characters are not translated during the exchange of Amiga
  2229. font data with fonts arranged according to a different character set.
  2230.  
  2231.    The character set of the Amiga and the other sets which can be used by
  2232. the Personal Fonts Maker define a maximum of 256 characters. Amiga font
  2233. files, however, always contain graphical data for an additional character.
  2234. This is the undefined character. The undefined character is displayed by
  2235. all programs, including the Amiga operating system, whenever no graphic
  2236. data has been defined for a code to be displayed. The Amiga default
  2237. undefined character is a rectangle similar to a squared 'O' letter. The
  2238. Personal Fonts Maker also allows the editing of this additional character,
  2239. which has the code 256 (it is, thus, the 257th character counting from 1).
  2240. The undefined character is always used when data is exchanged in the Amiga
  2241. font format. It can also be saved with fonts in the PFM format. The
  2242. undefined character cannot, however, be accessed by the FFDL, nor can it
  2243. appear in the character set encoding vector.
  2244.  
  2245.    The standard ASCII set table appears in appendix B. Appendix C contains
  2246. the default codes adopted by the Personal Fonts Maker and most printers.
  2247. Appendix D lists the Amiga character set, while appendix E contains
  2248. different 7-bit character sets. Section 13.3 describes how to create an
  2249. extended font combining the characters of an existing font.
  2250.  
  2251.