--- ./src/gsint.h.orig Thu Jun 25 15:18:32 1998 +++ ./src/gsint.h Mon Nov 27 22:18:18 2000 @@ -188,7 +188,9 @@ ENC_VMS, ENC_HP8, ENC_KOI8, - ENC_PS + ENC_PS, + ENC_BIG5, + ENC_UNICNS_UTF8, } InputEncoding; typedef enum --- ./src/main.c.orig Thu Jun 25 16:26:00 1998 +++ ./src/main.c Mon Nov 27 22:18:18 2000 @@ -864,7 +864,8 @@ {{"koi8", NULL, NULL}, ENC_KOI8, '\n', 8}, {{"ps", "PS", NULL}, ENC_PS, '\n', 8}, {{"pslatin1", "ISOLatin1Encoding", NULL}, ENC_ISO_8859_1, '\n', 8}, - + {{"big5", "Formal Chinese", NULL}, ENC_BIG5, '\n', 8}, + {{"UniCNS-UTF8", "Formal Chinese", NULL}, ENC_UNICNS_UTF8, '\n', 8}, {{NULL, NULL, NULL}, 0, 0, 0}, }; --- ./src/psgen.c.orig Thu Jun 25 15:18:54 1998 +++ ./src/psgen.c Mon Nov 27 22:18:18 2000 @@ -303,15 +303,22 @@ if (!paste_file ("enscript", ".pro")) FATAL ((stderr, _("couldn't find prolog \"%s\": %s\n"), "enscript.pro", strerror (errno))); + if (encoding == ENC_BIG5 || encoding == ENC_UNICNS_UTF8) + { /*overwrite the defintion of MF for CJK */ + OUTPUT((cofp, "/MF {exch findfont definefont pop} def\n")); + } OUTPUT ((cofp, "%%%%EndResource\n")); /* Encoding vector. */ - OUTPUT ((cofp, "%%%%BeginResource: procset Enscript-Encoding-%s %s\n", - encoding_name, ps_version_string)); - if (!paste_file (encoding_name, ".enc")) - FATAL ((stderr, _("couldn't find encoding file \"%s.enc\": %s\n"), - encoding_name, strerror (errno))); - OUTPUT ((cofp, "%%%%EndResource\n")); + if (encoding != ENC_BIG5 && encoding != ENC_UNICNS_UTF8) { + OUTPUT ((cofp, "%%%%BeginResource: procset Enscript-Encoding-%s %s\n", + encoding_name, ps_version_string)); + if (!paste_file (encoding_name, ".enc")) + FATAL ((stderr, _("couldn't find encoding file \"%s.enc\": %s\n"), + encoding_name, strerror (errno))); + OUTPUT ((cofp, "%%%%EndResource\n")); + } + OUTPUT ((cofp, "%%%%EndProlog\n")); @@ -339,6 +346,7 @@ /* Select our fonts. */ /* Header font HF. */ + OUTPUT ((cofp, "/%s /HF-gs-font MF\n", HFname)); OUTPUT ((cofp, "/HF /HF-gs-font findfont [HFpt_w 0 0 HFpt_h 0 0] makefont def\n")); @@ -1033,7 +1041,12 @@ /* Help macros. */ /* Check if character fits to current line. */ -#define FITS_ON_LINE(ch) ((linepos + CHAR_WIDTH (ch) < linew) || col == 0) +/* NO wraping for CJK at this moment. Added by C.S. Chin Sept.1 */ + +#define FITS_ON_LINE(ch) ( ( (encoding == ENC_BIG5 && b5firstc) ||\ + (encoding == ENC_UNICNS_UTF8 && u8firstc) ) ?\ + (linepos + 2 * CHAR_WIDTH (ch) < linew) :\ + (linepos + CHAR_WIDTH (ch) < linew || in_u8) ) /* Is line buffer empty? */ #define BUFFER_EMPTY() (bufpos == 0) @@ -1473,8 +1486,12 @@ static unsigned int buflen = 0; /* output buffer's length */ unsigned int bufpos = 0; /* current position in output buffer */ int ch = 0; + int ch2 = 0; int done = 0; int i; + int b5firstc = 0; + int u8firstc = 0; + int in_u8 = 0; static int pending_token = tNONE; unsigned int original_col = col; @@ -1624,6 +1641,39 @@ break; } + /*Check for big5 characters*/ + if (encoding == ENC_BIG5) + { + if (ch >= 161 && ch <= 249 && b5firstc == 0) + { + ch2 = is_getc (is); + if ((ch2 >= 161 && ch2 <=254) || (ch2 >=64 && ch2 <= 126)) /*big5 char*/ + { + b5firstc = 1; + } else { + b5firstc = 0; + } + is_ungetc(ch2, is); + } else { + b5firstc = 0; + } + } + + /*Check for utf8 character*/ + if (encoding == ENC_UNICNS_UTF8) + { + if (ch >= 0340 && u8firstc==0) { + u8firstc = 1; + } else { + u8firstc = 0; + } + if (ch >= 0200) { + in_u8 = 1; + } else { + in_u8 = 0; + } + } + /* Check normal characters. */ if (EXISTS (ch)) { @@ -1741,7 +1791,7 @@ /* Got a string. */ /* Check for wrapped line. */ - if (done == DONE_WRAP) + if (done == DONE_WRAP) { /* This line is too long. */ ch = nl; --- ./src/util.c.orig Wed Jun 24 14:48:21 1998 +++ ./src/util.c Mon Nov 27 22:18:18 2000 @@ -774,6 +774,7 @@ if (!strhash_get (afm_cache, Fname, strlen (Fname), (void **) &font)) { /* AFM file was not cached, open it from disk. */ + error = afm_open_font (afm, AFM_I_COMPOSITES, Fname, &font); if (error != AFM_SUCCESS) { @@ -782,11 +783,18 @@ * Do not report failures for "Courier*" fonts because * AFM library's default font will fix them. */ - if (strncmp (Fname, COUR, strlen (COUR)) != 0) - MESSAGE (0, - (stderr, - _("couldn't open AFM file for font \"%s\", using default\n"), - Fname)); + if (strncmp (Fname, COUR, strlen (COUR)) != 0) { + if (encoding == ENC_BIG5 || encoding == ENC_UNICNS_UTF8) + { MESSAGE(0, + (stderr, + _("CJK encoding, ignore AFM file, use default.\n"),Fname)); + } else { + MESSAGE (0, + (stderr, + _("couldn't open AFM file for font \"%s\", using default\n"), + Fname)); + } + } error = afm_open_default_font (afm, &font); if (error != AFM_SUCCESS) { @@ -796,7 +804,7 @@ buf)); } } - + /* Apply encoding. */ switch (encoding) { @@ -879,6 +887,12 @@ case ENC_PS: /* Let's use font's default encoding -- nothing here. */ break; + case ENC_BIG5: + /* CJK encoding, ignore AFM, added by C.S.Chin Aug.31 00 */ + break; + case ENC_UNICNS_UTF8: + /* CJK encoding, ignore AFM, added by C.S.Chin Aug.31 00 */ + break; } /* Put it to the AFM cache. */ @@ -888,20 +902,57 @@ font_info = (CachedFontInfo *) xcalloc (1, sizeof (*font_info)); /* Read character widths and types. */ - for (i = 0; i < 256; i++) - { - AFMNumber w0x, w0y; - - (void) afm_font_charwidth (font, Fpt.w, i, &w0x, &w0y); - font_info->font_widths[i] = w0x; - - if (font->encoding[i] == AFM_ENC_NONE) - font_info->font_ctype[i] = ' '; - else if (font->encoding[i] == AFM_ENC_NON_EXISTENT) - font_info->font_ctype[i] = '.'; - else - font_info->font_ctype[i] = '*'; - } + if (encoding != ENC_BIG5 && encoding != ENC_UNICNS_UTF8) { + for (i = 0; i < 256; i++) + { + AFMNumber w0x, w0y; + + (void) afm_font_charwidth (font, Fpt.w, i, &w0x, &w0y); + font_info->font_widths[i] = w0x; + + if (font->encoding[i] == AFM_ENC_NONE) + font_info->font_ctype[i] = ' '; + else if (font->encoding[i] == AFM_ENC_NON_EXISTENT) + font_info->font_ctype[i] = '.'; + else + font_info->font_ctype[i] = '*'; + } + } else { + if (encoding == ENC_BIG5) + { + for (i = 0; i < 256; i++) + { + AFMNumber w0x, w0y; + if ( i < 040 ) + { + font_info->font_widths[i] = Fpt.w * 0.525; + font_info->font_ctype[i] = ' '; + } else { + font_info->font_widths[i] = Fpt.w * 0.525; + font_info->font_ctype[i] = '*'; + } + } + } else { + /*UTF8*/ + for (i = 0; i < 256; i++) + { + AFMNumber w0x, w0y; + if ( i < 040 ) + { + font_info->font_widths[i] = Fpt.w * 0.525; + font_info->font_ctype[i] = ' '; + } else { + if (i >= 0200) { + font_info->font_widths[i] = Fpt.w * 0.525 * 2.0 / 3.0; + } else { + font_info->font_widths[i] = Fpt.w * 0.525; + } + font_info->font_ctype[i] = '*'; + } + } + } + } + font_info->font_is_fixed = font->writing_direction_metrics[0].IsFixedPitch;