home *** CD-ROM | disk | FTP | other *** search
/ Carousel Volume 2 #1 / carousel.iso / mactosh / unix / unix_dra.hqx / mactext.c < prev    next >
Encoding:
C/C++ Source or Header  |  1987-02-14  |  15.3 KB  |  390 lines

  1. /*
  2.     This routine is meant to act as an interface between drawimp
  3.     (which knows nothing about how text is done on the Imagen or
  4.     the format of a font file) and the textimp routine (which
  5.     knows nothing about Macintoshs or MacDraw.
  6.     It translates MacDraw font and style numbers into font
  7.     specifications and also does ajustments for the weird way
  8.     that the MacDraw text is placed in the object rectangles.
  9. */
  10.  
  11. #include <stdio.h>
  12. #include "drawimp.h"
  13.  
  14. /* This table and the following constants are used to specify the font
  15.    file names.  The constants should correspond to the strings in "fontname". 
  16.    In other words, fontname[AMR] should be "amr". */
  17. /* We have since changed over to the CM fonts.  Only the names in this
  18.    array have been changed, the constants like AMR have been left as is. */
  19. static char *fontname[] = { "cmr", "cmbx", "cmti", "cmsy",
  20.                 "cmbsy", "cmmi", "cmmib" };
  21. #define ANY    -2
  22. #define NONE    -1
  23. #define AMR     0
  24. #define AMBX    1
  25. #define AMTI    2
  26. #define AMSY    3
  27. #define AMBSY    4
  28. #define AMMI    5
  29. #define AMBI    6
  30. #define DEF_FONT AMR
  31.  
  32. #define MAX_SIZES   8
  33.  
  34. /* The following table maps the Mac font sizes into TeX font sizes.  The
  35.    value of "f_size" is combined with the font name from the "fontname"
  36.    array to make a string like "amr10".  The "d_size" and "a_size" fields
  37.    are the "design size" and "at size" for the font in TeX sp units (65536
  38.    sp's to a point) and are used to select the size of font to be used.  The
  39.    d_size is just the f_size * 65536.  The a_size is selected to match one
  40.    of the fonts available on the system.  The routines which find the
  41.    font file will look for a file with a name like "amr10.nnnnpxl", where
  42.    nnnn is the integer result of 
  43.     (a_size / d_size) * (printer_resolution_in_DPI / 200) * 1000.
  44.    The a_size values should be changed to cause the above equation to give
  45.    a result that matches whatever font size is desired for that size of Mac
  46.    font.  The values in the table below were selected to produce characters
  47.    of about the right size on a 300DPI Imagen given the available font
  48.    files.  Since I don't know what fonts are usually around for 240DPI
  49.    devices so I can't tell if any of these values will map to the fonts that
  50.    would be available for that resolution printer.
  51.  
  52.    TeX does all this in a much cleaner way, but this will do for now.
  53. */ 
  54. static struct fontsize { 
  55.     int f_size, d_size, a_size;
  56.     int il_size, sp_size, tab_size;
  57.     int shift_down, shift_right;
  58.  } fontsize[MAX_SIZES] = {
  59.      0,        0,       0,     0,     0,     0,     0,     0,
  60.      9,   589824,  589824,    12,      3,     6,     9,     1, /* 9 */ 
  61.     10,   655360,  655360,    12,     3,      6,     9,     1, /* 10 */ 
  62.     10,   655360,  786432,    16,     4,     8,     11,     1, /* 12 */
  63.     10,   655360,  943718,    19,     4,     8,    13,      1, /* 14 */ 
  64.     10,   655360, 1132462,    23,     6,    12,    16,     2, /* 18 */
  65.     10,   655360, 1630745,    29,     8,    16,    20,     2, /* 24 */
  66.     10,   655360, 2174485,    46,    12,    24,    33,     2  /* 36 */
  67.  };
  68.  
  69. /* This table maps Mac font and character codes to TeX font and character
  70.    codes.  The table contains three entries for each Mac character code.
  71.    The entries give the TeX font and character for plain, bold, italic.
  72.    Control characters such as carriage return, tab, and space are in the
  73.    table with a 0x80 added to the ASCII code to flag them so textimp can
  74.    handle them differently. */
  75. static struct fontcode {
  76.     short font;
  77.     short code;
  78. } fontcode[224][3] = {    /* order is: plain, bold, italic */
  79.     NONE,    0,    NONE,    0,    NONE,    0,    
  80.     NONE,    0,    NONE,    0,    NONE,    0,    
  81.     NONE,    0,    NONE,    0,    NONE,    0,    
  82.     NONE,    0,    NONE,    0,    NONE,    0,    
  83.     NONE,    0,    NONE,    0,    NONE,    0,    
  84.     NONE,    0,    NONE,    0,    NONE,    0,    
  85.     NONE,    0,    NONE,    0,    NONE,    0,    
  86.     NONE,    0,    NONE,    0,    NONE,    0,    
  87.     NONE,    0,    NONE,    0,    NONE,    0,    
  88.     ANY,    0x89,    ANY,    0x89,    ANY,    0x89,    /* 09 tab */
  89.     NONE,    0,    NONE,    0,    NONE,    0,    
  90.     NONE,    0,    NONE,    0,    NONE,    0,    
  91.     NONE,    0,    NONE,    0,    NONE,    0,    
  92.     ANY,    0x8D,    ANY,    0x8D,    ANY,    0x8D,    /* 0D carriage ret */
  93.     NONE,    0,    NONE,    0,    NONE,    0,    
  94.     NONE,    0,    NONE,    0,    NONE,    0,    
  95.  
  96.     NONE,    0,    NONE,    0,    NONE,    0,    
  97.     NONE,    0,    NONE,    0,    NONE,    0,    
  98.     NONE,    0,    NONE,    0,    NONE,    0,    
  99.     NONE,    0,    NONE,    0,    NONE,    0,    
  100.     NONE,    0,    NONE,    0,    NONE,    0,    
  101.     NONE,    0,    NONE,    0,    NONE,    0,    
  102.     NONE,    0,    NONE,    0,    NONE,    0,    
  103.     NONE,    0,    NONE,    0,    NONE,    0,    
  104.     NONE,    0,    NONE,    0,    NONE,    0,    
  105.     NONE,    0,    NONE,    0,    NONE,    0,    
  106.     NONE,    0,    NONE,    0,    NONE,    0,    
  107.     NONE,    0,    NONE,    0,    NONE,    0,    
  108.     NONE,    0,    NONE,    0,    NONE,    0,    
  109.     NONE,    0,    NONE,    0,    NONE,    0,    
  110.     NONE,    0,    NONE,    0,    NONE,    0,    
  111.     NONE,    0,    NONE,    0,    NONE,    0,    
  112.  
  113.     ANY,    0xA0,    ANY,    0xA0,    ANY,    0xA0,    /* 20 space */
  114.     AMR,    0041,    AMBX,    0041,    AMTI,    0041,    /* 21 ! */
  115.     AMR,    0175,    AMBX,    0175,    AMTI,    0175,    /* 22 " */
  116.     AMR,    0043,    AMBX,    0043,    AMTI,    0043,    /* 23 # */
  117.     AMR,    0044,    AMBX,    0044,    AMTI,    0044,    /* 24 $ */
  118.     AMR,    0045,    AMBX,    0045,    AMTI,    0045,    /* 25 % */
  119.     AMR,    0046,    AMBX,    0046,    AMTI,    0046,    /* 26 & */
  120.     AMR,    0023,    AMBX,    0023,    AMTI,    0023,    /* 27 ' */
  121.     AMR,    0050,    AMBX,    0050,    AMTI,    0050,    /* 28 ( */
  122.     AMR,    0051,    AMBX,    0051,    AMTI,    0051,    /* 29 ) */
  123.     AMR,    0052,    AMBX,    0052,    AMTI,    0052,    /* 2A * */
  124.     AMR,    0053,    AMBX,    0053,    AMTI,    0053,    /* 2B + */
  125.     AMR,    0054,    AMBX,    0054,    AMTI,    0054,    /* 2C , */
  126.     AMR,    0055,    AMBX,    0055,    AMTI,    0055,    /* 2D - */
  127.     AMR,    0056,    AMBX,    0056,    AMTI,    0056,    /* 2E . */
  128.     AMR,    0057,    AMBX,    0057,    AMTI,    0057,    /* 2F / */
  129.  
  130.     AMR,    0060,    AMBX,    0060,    AMTI,    0060,    /* 30 0 */
  131.     AMR,    0061,    AMBX,    0061,    AMTI,    0061,    /* 31 1 */
  132.     AMR,    0062,    AMBX,    0062,    AMTI,    0062,    /* 32 2 */
  133.     AMR,    0063,    AMBX,    0063,    AMTI,    0063,    /* 33 3 */
  134.     AMR,    0064,    AMBX,    0064,    AMTI,    0064,    /* 34 4 */
  135.     AMR,    0065,    AMBX,    0065,    AMTI,    0065,    /* 35 5 */
  136.     AMR,    0066,    AMBX,    0066,    AMTI,    0066,    /* 36 6 */
  137.     AMR,    0067,    AMBX,    0067,    AMTI,    0067,    /* 37 7 */
  138.     AMR,    0070,    AMBX,    0070,    AMTI,    0070,    /* 38 8 */
  139.     AMR,    0071,    AMBX,    0071,    AMTI,    0071,    /* 39 9 */
  140.     AMR,    0072,    AMBX,    0072,    AMTI,    0072,    /* 3A : */
  141.     AMR,    0073,    AMBX,    0073,    AMTI,    0073,    /* 3B ; */
  142.     AMMI,    0074,    AMBI,    0074,    AMMI,    0074,    /* 3C < */
  143.     AMR,    0075,    AMBX,    0075,    AMTI,    0075,    /* 3D = */
  144.     AMMI,    0076,    AMBI,    0076,    AMMI,    0076,    /* 3E > */
  145.     AMR,    0077,    AMBX,    0077,    AMTI,    0077,    /* 3F ? */
  146.  
  147.     AMR,    0100,    AMBX,    0100,    AMTI,    0100,    /* 40 @ */
  148.     AMR,    0101,    AMBX,    0101,    AMTI,    0101,    /* 41 A */
  149.     AMR,    0102,    AMBX,    0102,    AMTI,    0102,    /* 42 B */
  150.     AMR,    0103,    AMBX,    0103,    AMTI,    0103,    /* 43 C */
  151.     AMR,    0104,    AMBX,    0104,    AMTI,    0104,    /* 44 D */
  152.     AMR,    0105,    AMBX,    0105,    AMTI,    0105,    /* 45 E */
  153.     AMR,    0106,    AMBX,    0106,    AMTI,    0106,    /* 46 F */
  154.     AMR,    0107,    AMBX,    0107,    AMTI,    0107,    /* 47 G */
  155.     AMR,    0110,    AMBX,    0110,    AMTI,    0110,    /* 48 H */
  156.     AMR,    0111,    AMBX,    0111,    AMTI,    0111,    /* 49 I */
  157.     AMR,    0112,    AMBX,    0112,    AMTI,    0112,    /* 4A J */
  158.     AMR,    0113,    AMBX,    0113,    AMTI,    0113,    /* 4B K */
  159.     AMR,    0114,    AMBX,    0114,    AMTI,    0114,    /* 4C L */
  160.     AMR,    0115,    AMBX,    0115,    AMTI,    0115,    /* 4D M */
  161.     AMR,    0116,    AMBX,    0116,    AMTI,    0116,    /* 4E N */
  162.     AMR,    0117,    AMBX,    0117,    AMTI,    0117,    /* 4F O */
  163.  
  164.     AMR,    0120,    AMBX,    0120,    AMTI,    0120,    /* 50 P */
  165.     AMR,    0121,    AMBX,    0121,    AMTI,    0121,    /* 51 Q */
  166.     AMR,    0122,    AMBX,    0122,    AMTI,    0122,    /* 52 R */
  167.     AMR,    0123,    AMBX,    0123,    AMTI,    0123,    /* 53 S */
  168.     AMR,    0124,    AMBX,    0124,    AMTI,    0124,    /* 54 T */
  169.     AMR,    0125,    AMBX,    0125,    AMTI,    0125,    /* 55 U */
  170.     AMR,    0126,    AMBX,    0126,    AMTI,    0126,    /* 56 V */
  171.     AMR,    0127,    AMBX,    0127,    AMTI,    0127,    /* 57 W */
  172.     AMR,    0130,    AMBX,    0130,    AMTI,    0130,    /* 58 X */
  173.     AMR,    0131,    AMBX,    0131,    AMTI,    0131,    /* 59 Y */
  174.     AMR,    0132,    AMBX,    0132,    AMTI,    0132,    /* 5A Z */
  175.     AMR,    0133,    AMBX,    0133,    AMTI,    0133,    /* 5B [ */
  176.     AMSY,    0156,    AMBSY,    0156,    AMSY,    0156,    /* 5C \ */
  177.     AMR,    0135,    AMBX,    0135,    AMTI,    0135,    /* 5D ] */
  178.     AMR,    0136,    AMBX,    0136,    AMTI,    0136,    /* 5E ^ */
  179.     NONE,    0,    NONE,    0,    NONE,    0,    /* 5F _ */
  180.  
  181.     AMR,    0022,    AMBX,    0022,    AMTI,    0022,    /* 60 ` */
  182.     AMR,    0141,    AMBX,    0141,    AMTI,    0141,    /* 61 a */
  183.     AMR,    0142,    AMBX,    0142,    AMTI,    0142,    /* 62 b */
  184.     AMR,    0143,    AMBX,    0143,    AMTI,    0143,    /* 63 c */
  185.     AMR,    0144,    AMBX,    0144,    AMTI,    0144,    /* 64 d */
  186.     AMR,    0145,    AMBX,    0145,    AMTI,    0145,    /* 65 e */
  187.     AMR,    0146,    AMBX,    0146,    AMTI,    0146,    /* 66 f */
  188.     AMR,    0147,    AMBX,    0147,    AMTI,    0147,    /* 67 g */
  189.     AMR,    0150,    AMBX,    0150,    AMTI,    0150,    /* 68 h */
  190.     AMR,    0151,    AMBX,    0151,    AMTI,    0151,    /* 69 i */
  191.     AMR,    0152,    AMBX,    0152,    AMTI,    0152,    /* 6A j */
  192.     AMR,    0153,    AMBX,    0153,    AMTI,    0153,    /* 6B k */
  193.     AMR,    0154,    AMBX,    0154,    AMTI,    0154,    /* 6C l */
  194.     AMR,    0155,    AMBX,    0155,    AMTI,    0155,    /* 6D m */
  195.     AMR,    0156,    AMBX,    0156,    AMTI,    0156,    /* 6E n */
  196.     AMR,    0157,    AMBX,    0157,    AMTI,    0157,    /* 6F o */
  197.  
  198.     AMR,    0160,    AMBX,    0160,    AMTI,    0160,    /* 70 p */
  199.     AMR,    0161,    AMBX,    0161,    AMTI,    0161,    /* 71 q */
  200.     AMR,    0162,    AMBX,    0162,    AMTI,    0162,    /* 72 r */
  201.     AMR,    0163,    AMBX,    0163,    AMTI,    0163,    /* 73 s */
  202.     AMR,    0164,    AMBX,    0164,    AMTI,    0164,    /* 74 t */
  203.     AMR,    0165,    AMBX,    0165,    AMTI,    0165,    /* 75 u */
  204.     AMR,    0166,    AMBX,    0166,    AMTI,    0166,    /* 76 v */
  205.     AMR,    0167,    AMBX,    0167,    AMTI,    0167,    /* 77 w */
  206.     AMR,    0170,    AMBX,    0170,    AMTI,    0170,    /* 78 x */
  207.     AMR,    0171,    AMBX,    0171,    AMTI,    0171,    /* 79 y */
  208.     AMR,    0172,    AMBX,    0172,    AMTI,    0172,    /* 7A z */
  209.     AMSY,    0146,    AMBSY,    0146,    AMSY,    0146,    /* 7B { */
  210.     AMSY,    0152,    AMBSY,    0152,    AMSY,    0152,    /* 7C | */
  211.     AMSY,    0147,    AMBSY,    0147,    AMSY,    0147,    /* 7D } */
  212.     AMR,    0176,    AMBX,    0176,    AMTI,    0176,    /* 7E ~ */
  213.     NONE,    0,    NONE,    0,    NONE,    0,    /* 7F  */
  214.  
  215.     /* the next two groups (0x8* and 0x9*) are letters with things
  216.     above or below them, like accent marks.  For now, just output
  217.     the letter without the extra mark */
  218.  
  219.     AMR,    0101,    AMBX,    0101,    AMTI,    0101,    /* 80 A */
  220.     AMR,    0101,    AMBX,    0101,    AMTI,    0101,    /* 81 A */
  221.     AMR,    0103,    AMBX,    0103,    AMTI,    0103,    /* 82 C */
  222.     AMR,    0105,    AMBX,    0105,    AMTI,    0105,    /* 83 E */
  223.     AMR,    0116,    AMBX,    0116,    AMTI,    0116,    /* 84 N */
  224.     AMR,    0117,    AMBX,    0117,    AMTI,    0117,    /* 85 O */
  225.     AMR,    0125,    AMBX,    0125,    AMTI,    0125,    /* 86 U */
  226.     AMR,    0141,    AMBX,    0141,    AMTI,    0141,    /* 87 a */
  227.     AMR,    0141,    AMBX,    0141,    AMTI,    0141,    /* 88 a */
  228.     AMR,    0141,    AMBX,    0141,    AMTI,    0141,    /* 89 a */
  229.     AMR,    0141,    AMBX,    0141,    AMTI,    0141,    /* 8A a */
  230.     AMR,    0141,    AMBX,    0141,    AMTI,    0141,    /* 8B a */
  231.     AMR,    0141,    AMBX,    0141,    AMTI,    0141,    /* 8C a */
  232.     AMR,    0143,    AMBX,    0143,    AMTI,    0143,    /* 8D c */
  233.     AMR,    0145,    AMBX,    0145,    AMTI,    0145,    /* 8E e */
  234.     AMR,    0145,    AMBX,    0145,    AMTI,    0145,    /* 8F e */
  235.  
  236.     AMR,    0145,    AMBX,    0145,    AMTI,    0145,    /* 90 e */
  237.     AMR,    0145,    AMBX,    0145,    AMTI,    0145,    /* 91 e */
  238.     AMR,    0151,    AMBX,    0151,    AMTI,    0151,    /* 92 i */
  239.     AMR,    0151,    AMBX,    0151,    AMTI,    0151,    /* 93 i */
  240.     AMR,    0151,    AMBX,    0151,    AMTI,    0151,    /* 94 i */
  241.     AMR,    0151,    AMBX,    0151,    AMTI,    0151,    /* 95 i */
  242.     AMR,    0156,    AMBX,    0156,    AMTI,    0156,    /* 96 n */
  243.     AMR,    0157,    AMBX,    0157,    AMTI,    0157,    /* 97 o */
  244.     AMR,    0157,    AMBX,    0157,    AMTI,    0157,    /* 98 o */
  245.     AMR,    0157,    AMBX,    0157,    AMTI,    0157,    /* 99 o */
  246.     AMR,    0157,    AMBX,    0157,    AMTI,    0157,    /* 9A o */
  247.     AMR,    0157,    AMBX,    0157,    AMTI,    0157,    /* 9B o */
  248.     AMR,    0165,    AMBX,    0165,    AMTI,    0165,    /* 9C u */
  249.     AMR,    0165,    AMBX,    0165,    AMTI,    0165,    /* 9D u */
  250.     AMR,    0165,    AMBX,    0165,    AMTI,    0165,    /* 9E u */
  251.     AMR,    0165,    AMBX,    0165,    AMTI,    0165,    /* 9F u */
  252.  
  253.     AMSY,    0171,    AMBSY,    0171,    AMSY,    0171,    /* A0 dagger */
  254.     AMR,    0027,    AMBX,    0027,    AMTI,    0027,    /* A1 degree */
  255.     NONE,    0,    NONE,    0,    NONE,    0,    /* A2 cents */
  256.     AMTI,    0044,    AMTI,    0044,    AMTI,    0044,    /* A3 British pound */
  257.     AMSY,    0170,    AMBSY,    0170,    AMSY,    0170,    /* A4 ?? */
  258.     AMSY,    0017,    AMBSY,    0017,    AMSY,    0017,    /* A5 filled dot */
  259.     AMSY,    0173,    AMBSY,    0173,    AMSY,    0173,    /* A6 paragraph */
  260.     AMR,    0031,    AMBX,    0031,    AMTI,    0031,    /* A7 ?? */
  261.     NONE,    0,    NONE,    0,    NONE,    0,    /* A8 registered */
  262.     NONE,    0,    NONE,    0,    NONE,    0,    /* A9 copyright */
  263.     NONE,    0,    NONE,    0,    NONE,    0,    /* AA trademark */
  264.     AMR,    0023,    AMBX,    0023,    AMTI,    0023,    /* AB accent */
  265.     AMR,    0177,    AMBX,    0177,    AMTI,    0177,    /* AC two dots */
  266.     NONE,    0,    NONE,    0,    NONE,    0,    /* AD not equal */
  267.     AMR,    0035,    AMBX,    0035,    AMTI,    0035,    /* AE AE */
  268.     AMR,    0037,    AMBX,    0037,    AMTI,    0037,    /* AF O with slash */
  269.  
  270.     AMSY,    0061,    AMBSY,    0061,    AMSY,    0061,    /* B0 infinity */
  271.     AMSY,    0006,    AMBSY,    0006,    AMSY,    0006,    /* B1 plus-minus */
  272.     AMSY,    0024,    AMBSY,    0024,    AMSY,    0024,    /* B2 <= */
  273.     AMSY,    0025,    AMBSY,    0025,    AMSY,    0025,    /* B3 >= */
  274.     AMMI,    0022,    AMBI,    0022,    AMMI,    0022,    /* B4 theta (??) Yen */
  275.     AMMI,    0026,    AMBI,    0026,    AMMI,    0026,    /* B5 mu */
  276.     AMMI,    0100,    AMBI,    0100,    AMMI,    0100,    /* B6 partial */
  277.     AMR,    0006,    AMBX,    0006,    AMTI,    0006,    /* B7 Sigma */
  278.     AMR,    0005,    AMBX,    0005,    AMTI,    0005,    /* B8 Pi */
  279.     AMMI,    0031,    AMBI,    0031,    AMMI,    0031,    /* B9 pi */
  280.     AMSY,    0163,    AMBSY,    0163,    AMSY,    0163,    /* BA integral */
  281.     AMMI,    0013,    AMBI,    0013,    AMMI,    0013,    /* BB alpha (??) a underbar */
  282.     AMMI,    0041,    AMBI,    0041,    AMMI,    0041,    /* BC omega (??) o underbar */
  283.     AMR,    0012,    AMBX,    0012,    AMTI,    0012,    /* BD Omega */
  284.     AMR,    0032,    AMBX,    0032,    AMTI,    0032,    /* BE ae */
  285.     AMMI,    0014,    AMBI,    0014,    AMMI,    0014,    /* BF beta (??) o with slash) */
  286.  
  287.     AMR,    0076,    AMBX,    0076,    AMTI,    0076,    /* C0 ? upside down */
  288.     AMR,    0074,    AMBX,    0074,    AMTI,    0074,    /* C1 ! upside down */
  289.     AMSY,    0072,    AMBSY,    0072,    AMSY,    0072,    /* C2 not */
  290.     AMSY,    0160,    AMBSY,    0160,    AMSY,    0160,    /* C3 radical */
  291.     NONE,    0,    NONE,    0,    NONE,    0,    /* C4 ?? */
  292.     AMSY,    0031,    AMBSY,    0031,    AMSY,    0031,    /* C5 approx. equal */
  293.     AMSY,    0064,    AMBSY,    0064,    AMSY,    0064,    /* C6 triangle */
  294.     AMSY,    0034,    AMBSY,    0034,    AMSY,    0034,    /* C7 << */
  295.     AMSY,    0035,    AMBSY,    0035,    AMSY,    0035,    /* C8 >> */
  296.     NONE,    0,    NONE,    0,    NONE,    0,    /* C9 ellipsis */
  297.     NONE,    0,    NONE,    0,    NONE,    0,    /* CA non-brea. sp. */
  298.     AMR,    0101,    AMBX,    0101,    AMTI,    0101,    /* CB A with accent */
  299.     AMR,    0101,    AMBX,    0101,    AMTI,    0101,    /* CC A with tilde */
  300.     AMR,    0117,    AMBX,    0117,    AMTI,    0117,    /* CD O with tilde */
  301.     AMR,    0036,    AMBX,    0036,    AMTI,    0036,    /* CE OE */
  302.     AMR,    0033,    AMBX,    0033,    AMTI,    0033,    /* CF oe */
  303.  
  304.     AMR,    0173,    AMBX,    0173,    AMTI,    0173,    /* D0 n-dash */
  305.     AMR,    0174,    AMBX,    0174,    AMTI,    0174,    /* D1 m-dash */
  306.     AMR,    0134,    AMBX,    0134,    AMTI,    0134,    /* D2 open quotes */
  307.     AMR,    0042,    AMBX,    0042,    AMTI,    0042,    /* D3 close quotes */
  308.     AMR,    0140,    AMBX,    0140,    AMTI,    0140,    /* D4 open quote */
  309.     AMR,    0047,    AMBX,    0047,    AMTI,    0047,    /* D5 close quote */
  310.     AMSY,    0004,    AMBSY,    0004,    AMSY,    0004,    /* D6 divide */
  311.     AMSY,    0005,    AMBSY,    0005,    AMSY,    0005,    /* D7 diamond */
  312.     AMR,    0171,    AMBX,    0171,    AMTI,    0171,    /* D8 y with umlaut */
  313.     NONE,    0,    NONE,    0,    NONE,    0,    
  314.     NONE,    0,    NONE,    0,    NONE,    0,    
  315.     NONE,    0,    NONE,    0,    NONE,    0,    
  316.     NONE,    0,    NONE,    0,    NONE,    0,    
  317.     NONE,    0,    NONE,    0,    NONE,    0,    
  318.     NONE,    0,    NONE,    0,    NONE,    0,    
  319.     NONE,    0,    NONE,    0,    NONE,    0,    
  320.  
  321. };
  322. #define MAX_CHAR (sizeof(fontcode) / sizeof(struct fontcode))
  323.  
  324. int il_size, sp_size, tab_size;
  325. static init = 0;
  326. static char fontspec[40];
  327. extern char *malloc();
  328.  
  329. mactext(s,startv,starth,style,font,size,spacing,align,angle)
  330. char *s;
  331. int startv,starth,style,font,size,spacing,align,angle;
  332. {
  333.     int id, i, v, h, cur_font, new_line;
  334.     struct fontsize *fs;
  335.     struct fontcode *fc;
  336.     char *p, *b;
  337.     if (init == 0) {
  338.         fs = fontsize;    /* change things to Imagen units */
  339.         for (i = 0; i <= MAX_SIZES; i++) {
  340.             fs->il_size     = md2im(fs->il_size);
  341.             fs->sp_size     = md2im(fs->sp_size);
  342.             fs->tab_size    = md2im(fs->tab_size);
  343.             fs->shift_down  = md2im(fs->shift_down);
  344.             fs->shift_right = md2im(fs->shift_right);
  345.             fs++;
  346.         }
  347.         init = 1;
  348.     }
  349.     if (size > 7)
  350.         size = 7;
  351.     fs = &fontsize[size];
  352.     il_size = fs->il_size;
  353.     sp_size = fs->sp_size;
  354.     tab_size= fs->tab_size;
  355.     v = startv + fs->shift_down;
  356.     h = starth + fs->shift_right;
  357. /*    fprintf(stderr,"startv=%d, starth=%d, size=%d, v=%d, h=%d\n",
  358.         startv, starth, size, v, h); */
  359.     if (style > 2)        /* only plain, bold, and italic */
  360.         style = 0;    /* anything else is plain */
  361.     b = malloc(strlen(s) + 1);
  362.     new_line = 1;
  363.     while (*s != '\0') {
  364.         p = b;
  365.         cur_font = NONE;
  366.         while (*s != '\0') {
  367.             i = *s & 0377;
  368.             if (i >= MAX_CHAR)
  369.                 i = 0;
  370.             fc = &fontcode[i][style];
  371.             if (cur_font == NONE && fc->font != ANY)
  372.                 cur_font = fc->font;
  373.             if (fc->font != ANY && fc->font != NONE &&
  374.                 cur_font != fc->font)
  375.                 break;    /* changed fonts */
  376.             if (fc->font != NONE)
  377.                 *p++ = fc->code;
  378.             s++;
  379.         }
  380.         *p = '\0';
  381.         if (cur_font == NONE)
  382.             cur_font = DEF_FONT;
  383.         sprintf(fontspec,"%s%d",fontname[cur_font],fs->f_size);
  384. /*        fprintf(stderr,"%s %s\n",fontspec,b); */
  385.         id = selectfont(fontspec, fs->a_size, fs->d_size);
  386.         textimp(b,v,h,new_line);
  387.         new_line = 0;    /* make textimp leave position as is */
  388.     }
  389. }
  390.