*** orig/raster.c Tue Jan 20 03:05:00 1998 --- raster.c Thu May 28 02:04:14 1998 *************** *** 23,28 **** --- 23,33 ---- #include "buffer.h" #include "err.h" + #ifdef VIRTUALFONT + /* virtual.c */ + void local_charinfo_flush(FONT_INFO *); + #endif + uint num_char; CHAR_INFO *char_info_ptr; /* current char_info */ *************** *** 38,43 **** --- 43,53 ---- for (font = first_font_info; font; font = font->next_font) { for (i = 0; i < CHAR_ROOT; i++) font->char_info[i] = NULL; + #ifdef VIRTUALFONT + if (font->font_type == VIRTUAL_FONT) { + local_charinfo_flush(font->ext.local_font); + } + #endif } raster_buf_pointer->current = raster_buf_pointer->start; raster_buf_pointer->flush++; *** orig/main.c Tue Jan 20 03:05:00 1998 --- main.c Fri Jun 05 04:37:56 1998 *************** *** 84,89 **** --- 84,90 ---- extern char *const title_copyright; static void information_out(DIMENSION *dim); + void show_fontinfo(FONT_INFO *, int *, int); extern int f_flush_pk; extern uint num_char; *************** *** 407,426 **** error(DATAINFO, "Status of Buffers"); } #define MAX_FOPEN 30 /* test-flag時には,これが表示される. */ static void information_out(DIMENSION *dim) { FONT_INFO *font; ! char *fname, *ftype; ! int font_num, f_kanji, i, fh; ! ! #ifndef NOVFONT ! int vchk_flg; - #endif - V_JFM *vjfm; int f_open[MAX_FOPEN]; ENTER("information_out"); --- 408,424 ---- error(DATAINFO, "Status of Buffers"); } + #ifndef NOVFONT + int vchk_flg; + #endif #define MAX_FOPEN 30 /* test-flag時には,これが表示される. */ static void information_out(DIMENSION *dim) { FONT_INFO *font; ! int font_num, i; int f_open[MAX_FOPEN]; ENTER("information_out"); *************** *** 432,596 **** #ifndef NOVFONT vchk_flg = #endif ! font_num = open_num = 0; for (i = 0; i < MAX_FOPEN; i++) f_open[i] = 0; for (font = first_font_info; font != NULL; font = font->next_font) { font_num++; ! if (test_flg == 0) ! continue; ! f_kanji = 0; ! ftype = "?"; ! fname = ""; ! switch (font->font_type) { ! ! case (SUBTFM): ! ftype = "TFM"; ! break; ! ! case (SUBJFM): ! ftype = "JFM"; ! break; ! ! case (PK_FONT): ! ftype = "PK"; ! break; ! ! case (PKD_FONT): ! ftype = "PKD"; ! goto jxl; ! ! #ifdef VFD ! case (VFD_FONT): ! ftype = "VFD"; ! goto jxl; ! #endif ! #ifdef TTFONT ! case (CMTTF): ! ftype = "TT"; ! goto jxl; ! #endif ! ! case (JXL): ! ftype = "JXL"; ! jxl: if (font->ext.fh > 0) { ! fname = "+"; ! open_num++; ! } ! else ! fname = "-"; ! break; ! ! case (ROM_FONT): ! ftype = "ROM"; ! f_kanji = 1; ! break; ! #ifndef NOVFONT ! #ifdef BEZIERFONT ! case (JG_FONT): ! #endif ! #ifdef TTFONT ! case (TT_FONT): ! #endif ! case (ZS_FONT): ! ftype = "Vec(**)"; ! vjfm = get_vjfm((font->ext.kdir)->fh); ! ftype[4] = (char)vjfm->long_wide; ! ftype[5] = (char)vjfm->slant; ! fname = (font->ext.kdir)->name; ! f_kanji = 1; ! if (vchk_flg++ == 0) { ! for (i = 0; i < MAX_VFONT; i++) { ! if (vfont[i] != NULL && ! vfont[i]->status == V_OPEN) { ! open_num++; ! if (vfont[i]->v_fh[1] > 0) open_num++; ! #ifdef BEZIERFONT ! if (vfont[i]->v_fh[2] > 0) open_num++; ! #endif ! } ! } ! } ! break; ! #endif ! #ifdef WIN32 ! case (WINTT_FONT): ! ftype = "WinAPI"; ! vjfm = get_vjfm((font->ext.kdir)->fh); ! fname = vfont[vjfm->font_no]->v_font_name + 1; ! f_kanji = 1; ! break; ! #endif ! #ifdef LBP ! case (JLBP): ! ftype = "LBPfont"; ! goto kfont0; ! #endif ! ! case (JIS_FONT): ! ftype = ""; ! kfont: if ((fh = font->ext.kdir->fh) > 0) { ! for (i = 0; i < MAX_FOPEN; i++) { ! if (f_open[i] == fh) ! break; ! else if (f_open[i] == 0) { ! f_open[i] = fh; ! open_num++; ! break; ! } ! } ! } ! kfont0: fname = (font->ext.kdir)->name; ! f_kanji = 1; ! break; ! ! case (JIS_PK): ! ftype = "PK"; ! goto kfont; ! ! case (JIS_PKH): ! ftype = "PK/H"; ! goto kfont; ! ! case (GAIJI): ! ftype = "KG"; ! goto kfont; ! ! case (PXL1001): ! ftype = "PXL1001"; ! break; ! ! case (PXL1002): ! ftype = "PXL1002"; ! break; ! ! case (PXL1003): ! ftype = "PXL1003"; ! break; ! ! } ! #ifndef WIN32 ! if (test_flg == 2 || test_flg < 0) ! continue; ! #endif ! i = font->n[MAX_NAME_LEN-1]; ! error(C_MSG, "%5d %s(%d)%c\t%s %s", ! font->font_code, font->n, font->dpi, ! (font->texpk_pos<0)?' ':((i==' ')?'^':i), ! get_font_name(font), fname); ! if (f_kanji != 0) { ! error(C_MSG, "(%dx%d)", font->k_width, font->k_height); ! if (font->f_goth & K_DBL) ! error(C_MSG, "2"); ! if (font->f_goth & F_GOTH) ! error(C_MSG, "G"); ! } ! #ifdef TTFONT ! if (font->font_type == CMTTF) { ! error(C_MSG, "(%d)", sptopixel(font->size_para)); ! } ! #endif ! error(C_MSG, " %s\n", ftype); } #ifndef WIN32 --- 430,441 ---- #ifndef NOVFONT vchk_flg = #endif ! font_num = open_num = 0; for (i = 0; i < MAX_FOPEN; i++) f_open[i] = 0; for (font = first_font_info; font != NULL; font = font->next_font) { font_num++; ! if (test_flg != 0) show_fontinfo(font, f_open, 0); } #ifndef WIN32 *************** *** 599,605 **** #endif #ifdef JAPANESE error(C_MSG, ! "\n使用フォント\t\t: 以上 %d個 (%d dpi)" # ifdef WIN32 ", " # else --- 444,450 ---- #endif #ifdef JAPANESE error(C_MSG, ! "\n使用フォント\t\t: 以上 %d 個, (%d dpi)" # ifdef WIN32 ", " # else *************** *** 634,636 **** --- 479,656 ---- #endif error(DATAINFO, "Status of Fonts"); } + + void show_fontinfo(FONT_INFO *font, int *f_open, int depth) + { + int f_kanji, i, fh; + char *fname, *ftype; + char *indent; + V_JFM *vjfm; + + f_kanji = 0; + ftype = "?"; + fname = ""; + switch (font->font_type) { + + case (SUBTFM): + ftype = "TFM"; + break; + + case (SUBJFM): + ftype = "JFM"; + break; + + case (PK_FONT): + ftype = "PK"; + break; + + case (PKD_FONT): + ftype = "PKD"; + goto jxl; + + #ifdef VFD + case (VFD_FONT): + ftype = "VFD"; + goto jxl; + #endif + #ifdef TTFONT + case (CMTTF): + ftype = "TT"; + goto jxl; + #endif + + case (JXL): + ftype = "JXL"; + jxl: if (font->ext.fh > 0) { + fname = "+"; + open_num++; + } else { + fname = "-"; + } + break; + + #ifdef VIRTUALFONT + case (VIRTUAL_FONT): + ftype = "Virtual"; + break; + #endif + case (ROM_FONT): + ftype = "ROM"; + f_kanji = 1; + break; + #ifndef NOVFONT + #ifdef BEZIERFONT + case (JG_FONT): + #endif + #ifdef TTFONT + case (TT_FONT): + #endif + case (ZS_FONT): + ftype = "Vec(**)"; + vjfm = get_vjfm((font->ext.kdir)->fh); + ftype[4] = (char)vjfm->long_wide; + ftype[5] = (char)vjfm->slant; + fname = (font->ext.kdir)->name; + f_kanji = 1; + if (vchk_flg++ == 0) { + for (i = 0; i < MAX_VFONT; i++) { + if (vfont[i] != NULL && + vfont[i]->status == V_OPEN) { + open_num++; + if (vfont[i]->v_fh[1] > 0) open_num++; + #ifdef BEZIERFONT + if (vfont[i]->v_fh[2] > 0) open_num++; + #endif + } + } + } + break; + #endif + #ifdef WIN32 + case (WINTT_FONT): + ftype = "WinAPI"; + vjfm = get_vjfm((font->ext.kdir)->fh); + fname = vfont[vjfm->font_no]->v_font_name + 1; + f_kanji = 1; + break; + #endif + #ifdef LBP + case (JLBP): + ftype = "LBPfont"; + goto kfont0; + #endif + + case (JIS_FONT): + ftype = ""; + kfont: if ((fh = font->ext.kdir->fh) > 0) { + for (i = 0; i < MAX_FOPEN; i++) { + if (f_open[i] == fh) + break; + else if (f_open[i] == 0) { + f_open[i] = fh; + open_num++; + break; + } + } + } + kfont0: fname = (font->ext.kdir)->name; + f_kanji = 1; + break; + + case (JIS_PK): + ftype = "PK"; + goto kfont; + + case (JIS_PKH): + ftype = "PK/H"; + goto kfont; + + case (GAIJI): + ftype = "KG"; + goto kfont; + + case (PXL1001): + ftype = "PXL1001"; + break; + + case (PXL1002): + ftype = "PXL1002"; + break; + + case (PXL1003): + ftype = "PXL1003"; + break; + + } + #ifndef WIN32 + if (test_flg == 2 || test_flg < 0) return; + #endif + i = font->n[MAX_NAME_LEN-1]; + indent = "\t\t\t\t\t" + 5 - ((depth > 5)? 5 : depth); + error(C_MSG, "%s", indent); + error(C_MSG, "%5d %s(%d)%c\t%s %s", + font->font_code, font->n, font->dpi, + (font->texpk_pos<0)?' ':((i==' ')?'^':i), + get_font_name(font), fname); + if (f_kanji != 0) { + error(C_MSG, "(%dx%d)", font->k_width, font->k_height); + if (font->f_goth & K_DBL) + error(C_MSG, "2"); + if (font->f_goth & F_GOTH) + error(C_MSG, "G"); + } + #ifdef TTFONT + if (font->font_type == CMTTF) { + error(C_MSG, "(%d)", sptopixel(font->size_para)); + } + #endif + error(C_MSG, " %s\n", ftype); + #ifdef VIRTUALFONT + if (font->font_type == VIRTUAL_FONT) { + FONT_INFO *lf; + for (lf = font->ext.local_font; lf; lf = lf->next_font) { + show_fontinfo(lf, f_open, depth + 1); + } + } + #endif + } \ No newline at end of file *** orig/buffer.c Sun Jan 25 03:05:00 1998 --- buffer.c Thu May 28 02:21:26 1998 *************** *** 50,55 **** --- 50,59 ---- /* vfont.c */ V_JFM *get_vjfm(int); + #ifdef VIRTUALFONT + void local_pkbuf_flush(FONT_INFO *); + void local_font_flush(FONT_INFO *); + #endif extern V_FONT *vfont[]; extern int f_init; extern int f_path_cash; *************** *** 137,144 **** { FONT_INFO *font; ! for (font = first_font_info; font; font = font->next_font) font->pk = NULL; pk_buf_pointer->current = pk_buf_pointer->start; pk_buf_pointer->flush++; } --- 141,154 ---- { FONT_INFO *font; ! for (font = first_font_info; font; font = font->next_font) { font->pk = NULL; + #ifdef VIRTUALFONT + if (font->font_type == VIRTUAL_FONT) { + local_pkbuf_flush(font->ext.local_font); + } + #endif + } pk_buf_pointer->current = pk_buf_pointer->start; pk_buf_pointer->flush++; } *************** *** 170,175 **** --- 180,191 ---- Free(font->ext.kdir); } break; + #ifdef VIRTUALFONT + case(VIRTUAL_FONT): + local_font_flush(font->ext.local_font); + font->ext.local_font = NULL; + break; + #endif } Free(font); font = nfont; *** orig/pret.c Sat Jan 31 03:05:00 1998 --- pret.c Sat May 30 01:34:42 1998 *************** *** 110,115 **** --- 110,121 ---- /* fontdef.c */ char *get_font_name(FONT_INFO *); + #ifdef VIRTUALFONT + /* virtual.c */ + void pret_vf_packet(FONT_INFO *, BUFFER *, int, + SCALED_PT, SCALED_PT, PIXEL, PIXEL); + #endif + extern DIMENSION dviout_dimension; extern FONT_INFO *font_info_root; *************** *** 898,903 **** --- 904,910 ---- #ifdef LBP && (font->font_type != JLBP || draw_boxpic) #endif + ) rewrite_preamble_ptex(preamble, num); *************** *** 917,922 **** --- 924,936 ---- write_rule(H, V, 1, sptopixel(preamble->tfm_width)); } + #ifdef VIRTUALFONT + if (font->font_type == VIRTUAL_FONT) { + pret_vf_packet(font, preamble->raster, preamble->byte_width, + h, v, H0, V0); + goto end; + } + #endif #ifdef FDOWN if (f_assigned){ # if !defined(NOTPIC) && !defined(NOTPIC_EXTENSION) *** orig/getfont.c Sat Jan 31 03:05:00 1998 --- getfont.c Sat May 30 23:23:54 1998 *************** *** 81,86 **** --- 81,87 ---- #define JTFM_ID (11<<8) #define JTFMP_ID (9<<8) /* this definition is used in LBP.C, too */ #define CMTTF_ID ('t' + 't' + 'f') + #define VIRTUALFONT_ID (0xCAF7) /* 247(pre), 202(id) */ #define BASE_RATIO 151 *************** *** 155,160 **** --- 156,168 ---- int search_djtable(uint code, uint font_code); #endif + #ifdef VIRTUALFONT + /* virfont.c */ + BUFFER *get_virtualfont(FONT_INFO *, int, int *); + long virtualfont_tfm_width(BUFFER *, int, int); + BOOL load_character_packet(BUFFER *, int, PREAMBLE *); + #endif + // #ifdef WIN32 int k_scale = 1000; // #else *************** *** 462,467 **** --- 470,482 ---- } } } + #ifdef VIRTUALFONT + if (font->font_type == VIRTUAL_FONT) { + /* load a character packet instead of bitmap */ + if (load_character_packet(pk, flag_byte, preamble) == TRUE) + goto c_inf; + } + #endif raster_buf_alloc(&preamble, raster_size); if(font->font_type == SUBTFM){ *preamble->raster = 0; *************** *** 1048,1053 **** --- 1063,1077 ---- } break; #endif + #ifdef VIRTUALFONT + case (VIRTUALFONT_ID): + font->font_type = VIRTUAL_FONT; + font->ext.local_font = NULL; + pk = font->pk + 2; + tmp = get_ubyte(pk); + move_ptr(pk, tmp); + goto checksum; + #endif default: /* */ err_id: pos = strlen(msg = get_font_name(font)); *************** *** 1198,1203 **** --- 1222,1231 ---- } pos = ((char_code >> 8) - tmp) * 94 + (char_code & 0x7f) - 0x21; RETURN(get_jxl(jxl_info, font, jxl_info[i] + (pos << 3), flag_ptr)); + #ifdef VIRTUALFONT + case (VIRTUAL_FONT): + RETURN(get_virtualfont(font, char_code, flag_ptr)); + #endif } RETURN(NULL); } *************** *** 1561,1566 **** --- 1589,1602 ---- preamble->tfm_width = mult20(get_long(pk), font->size_para); pk -= 8; break; + #ifdef VIRTUALFONT + case (VIRTUAL_FONT): + preamble->width = preamble->height = preamble->pitch_offset + = preamble->depth_offset = 1; + tmp = virtualfont_tfm_width(pk, flag_byte, char_code); + preamble->tfm_width = mult20(tmp, font->size_para); + break; + #endif } preamble->byte_width = (preamble->width + 7) / 8; *pk_ptr = pk; *** orig/dd.h Sun Mar 08 03:05:04 1998 --- dd.h Sun Jun 07 21:20:16 1998 *************** *** 161,166 **** --- 161,169 ---- #ifdef TTFONT CMTTF, #endif + #ifdef VIRTUALFONT + VIRTUAL_FONT, + #endif ROM_FONT, ZS_FONT, #ifdef BEZIERFONT JG_FONT, *************** *** 410,415 **** --- 413,421 ---- int fh; /* JXL, PKD_FONT, VFD_FONT (file handle) */ /* ZS_FONT, JG_FONT, TT_FONT (use as ID) */ long count; + #ifdef VIRTUALFONT + FONT_INFO *local_font; + #endif }; #define CHAR_ROOT 8 /* should be a power of 2 */ *** orig/tabctrl.c Tue Mar 17 03:05:04 1998 --- tabctrl.c Wed Jun 03 00:30:48 1998 *************** *** 2912,2917 **** --- 2912,2918 ---- {"ttf", IDC_TTF, IDH_TTF, TAB_INT, 0}, {"c", IDC_C, IDH_C, TAB_BOOL, 0}, {"Fkeep", IDC_FKEEP, IDH_FKEEP, TAB_BOOL, 0}, + {"virtual",IDC_VIRTUAL,0, TAB_BOOL, 0}, {"", IDC_GENB, IDH_GEN, TAB_HELP, 0}, {"", IDC_FLUSH, IDH_FLUSH, TAB_HELP, 0}, {NULL, 0, 0, 0, 0} *************** *** 2943,2948 **** --- 2944,2950 ---- case IDC_C: case IDC_FKEEP: + case IDC_VIRTUAL: goto check; case IDC_GENB: *************** *** 4042,4047 **** --- 4044,4050 ---- {"+ A", TAB_INT}, {"+ c", TAB_BOOL}, {"+ Fkeep", TAB_BOOL}, + {"+ virtual", TAB_BOOL}, {"+ mag", TAB_MAG}, {"+ dpiv", TAB_INT}, {"+ e", TAB_INT}, *** orig/fontdef.c Tue Mar 17 03:05:04 1998 --- fontdef.c Fri Jun 05 04:29:16 1998 *************** *** 77,85 **** extern char *genfont_tmpl; void CutLast(char *src); static void genfont_init(void); static void genfont_out(FILE *, int); ! static void genfont_proc(FILE *, long, long); static void free_tmpl(void); #ifdef INTEGER_CALC # define KETA 5 --- 77,86 ---- extern char *genfont_tmpl; void CutLast(char *src); + char * genfont_main(char *, ulong, ulong, uint, uint, uint); static void genfont_init(void); static void genfont_out(FILE *, int); ! static void genfont_proc(FILE *, char *, long, long); static void free_tmpl(void); #ifdef INTEGER_CALC # define KETA 5 *************** *** 212,218 **** #define MAX_FCASH_REV 16 static int dpis, mags; ! static int texpk_pos; uchar *path_font; uchar *path_cash; int f_path_cash; --- 213,219 ---- #define MAX_FCASH_REV 16 static int dpis, mags; ! int texpk_pos; uchar *path_font; uchar *path_cash; int f_path_cash; *************** *** 325,330 **** --- 326,334 ---- #ifdef TTFONT extern int f_use_ttf; #endif + #ifdef VIRTUALFONT + extern BOOL f_use_virtualfont; + #endif /* path_cash[] = *************** *** 1778,1828 **** } #ifndef NO_GENFONT if (genfont_tmpl && *genfont_tmpl) { ! if (root_tmpl[0] == NULL) ! genfont_init(); ! if (genflag) { /* make and run gen_tmp.bat */ ! if ((gentmpfp = fopen(gentmp,"w"))==NULL) ! error(PROGRAM_STOP, "Can't make tmp-batch file"); ! genfont_out(gentmpfp, 0); ! genfont_proc(gentmpfp, atr->d, atr->s); ! genfont_out(gentmpfp, 2); ! fclose(gentmpfp); ! f_sub_font = 0; ! i = 0; ! #ifdef WIN32 ! { ! char *argv[4]; ! char msg[64]; ! sprintf(msg, "Creating font: %s %d/%ddpi", ! fntname, fig, dpis); ! DisplayMessage(msg); ! argv[0] = (f_osversion<0)?"command.com":"cmd.exe"; ! argv[1] = "/c"; ! argv[2] = gentmp; ! argv[3] = NULL; ! if(WinMinExecute(argv, 0)) ! goto chk; ! } ! #endif ! if (!system(gentmp)){ ! chk: for(i = 2; i > 0; i--){ ! if((path_name = font_name_check(atr->n, fig, figl)) ! != NULL) break; ! sleep(500); ! } ! } ! #ifdef WIN32 ! DisplayMessage(NULL); ! #endif ! if (i) goto exist; ! } f_error = FE_NOFONT; if (genfntfp == NULL) { /* make gen_font.bat */ if ((genfntfp=fopenf(genfnt,"w")) == NULL) error(PROGRAM_STOP, "Can't make fnt-batch file"); genfont_out(genfntfp, 0); } ! genfont_proc(genfntfp, atr->d, atr->s); } #endif skip: --- 1782,1796 ---- } #ifndef NO_GENFONT if (genfont_tmpl && *genfont_tmpl) { ! path_name = genfont_main(fntname, atr->d, atr->s, fig, figl, dpis); ! if (path_name != NULL) goto exist; f_error = FE_NOFONT; if (genfntfp == NULL) { /* make gen_font.bat */ if ((genfntfp=fopenf(genfnt,"w")) == NULL) error(PROGRAM_STOP, "Can't make fnt-batch file"); genfont_out(genfntfp, 0); } ! genfont_proc(genfntfp, fntname, atr->d, atr->s); } #endif skip: *************** *** 2156,2161 **** --- 2124,2136 ---- goto loop; } #endif + #ifdef VIRTUALFONT + if (f_use_virtualfont != TRUE) { + tmp = strrchr(tmp_buf, '.'); + if (tmp > (char*)tmp_buf && strcmpi(tmp, ".vf") == 0) + goto loop; + } + #endif if (f_sub_font >= 2) { error(C_MSG, "Searched %s\n", tmp_buf); goto loop; *************** *** 2827,2832 **** --- 2802,2851 ---- src[len-1] = 0; } + char *genfont_main(char *name, ulong atrd, ulong atrs, + uint fig, uint figl, uint dpi) + { + char *path_name; + int i; + + if (root_tmpl[0] == NULL) + genfont_init(); + if (!genflag) return (NULL); + /* make and run gen_tmp.bat */ + if ((gentmpfp = fopen(gentmp,"w"))==NULL) + error(PROGRAM_STOP, "Can't make tmp-batch file"); + genfont_out(gentmpfp, 0); + genfont_proc(gentmpfp, name, atrd, atrs); + genfont_out(gentmpfp, 2); + fclose(gentmpfp); + f_sub_font = 0; + #ifdef WIN32 + { + char *argv[4]; + char msg[64]; + sprintf(msg, "Creating font: %s %d/%ddpi", name, fig, dpi); + DisplayMessage(msg); + argv[0] = (f_osversion<0)?"command.com":"cmd.exe"; + argv[1] = "/c"; + argv[2] = gentmp; + argv[3] = NULL; + if(WinMinExecute(argv, 0)) goto chk; + } + #endif + if (!system(gentmp)){ + chk: for(i = 2; i > 0; i--){ + if((path_name = font_name_check(name, fig, figl)) != NULL) + break; + sleep(500); + } + } + #ifdef WIN32 + DisplayMessage(NULL); + #endif + if (i > 0) return (path_name); + return (NULL); + } + /* read and store the template file for auto-font-generation */ static void genfont_init(void) { *************** *** 2925,2931 **** } /* replace ^? and write statements to the batch file */ ! static void genfont_proc(FILE *fp, long atrd, long atrs) { char *ss; struct gen_tmpl *cur_tmpl; --- 2944,2950 ---- } /* replace ^? and write statements to the batch file */ ! static void genfont_proc(FILE *fp, char *name, long atrd, long atrs) { char *ss; struct gen_tmpl *cur_tmpl; *************** *** 2947,2953 **** if (*ss == '^') switch(*(++ss)) { case 's': ! fprintf(fp, "%s", fntname); break; case 'm': fprintf(fp, "%.5f", magsize); --- 2966,2972 ---- if (*ss == '^') switch(*(++ss)) { case 's': ! fprintf(fp, "%s", name); break; case 'm': fprintf(fp, "%.5f", magsize); *** orig/prtinit.h Tue Mar 17 03:05:04 1998 --- prtinit.h Mon May 18 03:09:38 1998 *************** *** 40,45 **** --- 40,48 ---- extern char *exec_dviprt; extern char *s_font; extern char *spi; + #ifdef VIRTUALFONT + extern BOOL f_use_virtualfont; + #endif #ifdef WIN32 #define WINDVIOUT *************** *** 298,303 **** --- 301,310 ---- INIT_FONT}, # endif #endif + #ifdef VIRTUALFONT + {"virtual", BOOLTYPE, (void *)&f_use_virtualfont, + "Virtualフォント", INIT_FONT}, + #endif #ifndef NO_NTTRPL {"nttF", STRING, (void *)&ntt_subst_fonts, "NTTjTeXでの非標準和文フォントの代替フォント指定", *************** *** 788,793 **** --- 795,805 ---- {"ttf", INTEGER, (void *)&f_use_ttf, "TrueType Font[0:Off(default) :Draw sw]", INIT_FONT, 1000, 0, 1000}, + #endif + #ifdef VIRTUALFONT + {"virtual", BOOLTYPE, (void *)&f_use_virtualfont, + "Virtual font", INIT_FONT, + FALSE, 0, 0}, #endif #ifndef NO_NTTRPL *** orig/dviout.rc Wed Mar 18 03:05:04 1998 --- dviout.rc Sun May 31 03:22:30 1998 *************** *** 865,880 **** CONTROL "", IDC_GEN, "EDIT", ES_LEFT | ES_AUTOHSCROLL | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_GROUP | WS_TABSTOP, 45, 5, 214, 12 CONTROL "", IDC_TEXPKD, "EDIT", ES_LEFT | ES_AUTOHSCROLL | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_GROUP | WS_TABSTOP, 45, 27, 214, 12 CONTROL "", IDC_TEXFLI, "EDIT", ES_LEFT | ES_AUTOHSCROLL | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_GROUP | WS_TABSTOP, 45, 49, 214, 12 ! CONTROL "A:", -1, "STATIC", SS_LEFT | WS_CHILD | WS_VISIBLE | WS_GROUP, 23, 73, 9, 8 ! CONTROL "", IDC_A, "EDIT", ES_LEFT | ES_NUMBER | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_GROUP | WS_TABSTOP, 44, 70, 31, 12 ! CONTROL "ttf:", -1, "STATIC", SS_LEFT | WS_CHILD | WS_VISIBLE | WS_GROUP, 104, 72, 20, 8 ! CONTROL "", IDC_TTF, "EDIT", ES_LEFT | ES_NUMBER | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_GROUP | WS_TABSTOP, 125, 70, 33, 12 ! CONTROL "&CheckFontID(c:)", IDC_C, "BUTTON", BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_GROUP | WS_TABSTOP, 8, 107, 68, 12 ! CONTROL "&Save", ID_SAVE, "BUTTON", BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_GROUP | WS_TABSTOP, 209, 70, 50, 10 ! CONTROL "&Restore", ID_RESTORE, "BUTTON", BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 209, 83, 50, 10 ! CONTROL "&Keep Path(Fkeep:)", IDC_FKEEP, "button", BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 8, 93, 84, 12, 0 CONTROL "TEXPKD:", -1, "STATIC", SS_LEFT | WS_CHILD | WS_VISIBLE | WS_GROUP, 5, 29, 40, 7 ! CONTROL "&Flush", IDC_FLUSH, "button", BS_PUSHBUTTON | BS_CENTER | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 111, 95, 50, 10, 0 } // IDD_TAB_JFONT DIALOG 0, 5, 281, 127 --- 865,881 ---- CONTROL "", IDC_GEN, "EDIT", ES_LEFT | ES_AUTOHSCROLL | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_GROUP | WS_TABSTOP, 45, 5, 214, 12 CONTROL "", IDC_TEXPKD, "EDIT", ES_LEFT | ES_AUTOHSCROLL | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_GROUP | WS_TABSTOP, 45, 27, 214, 12 CONTROL "", IDC_TEXFLI, "EDIT", ES_LEFT | ES_AUTOHSCROLL | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_GROUP | WS_TABSTOP, 45, 49, 214, 12 ! CONTROL "A:", -1, "STATIC", SS_LEFT | WS_CHILD | WS_VISIBLE | WS_GROUP, 151, 79, 9, 8 ! CONTROL "", IDC_A, "EDIT", ES_LEFT | ES_NUMBER | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_GROUP | WS_TABSTOP, 164, 76, 33, 12 ! CONTROL "ttf:", -1, "STATIC", SS_LEFT | WS_CHILD | WS_VISIBLE | WS_GROUP, 203, 78, 20, 8 ! CONTROL "", IDC_TTF, "EDIT", ES_LEFT | ES_NUMBER | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_GROUP | WS_TABSTOP, 224, 76, 33, 12 ! CONTROL "&CheckFontID(c:)", IDC_C, "BUTTON", BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_GROUP | WS_TABSTOP, 8, 82, 72, 12 ! CONTROL "&Save", ID_SAVE, "BUTTON", BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_GROUP | WS_TABSTOP, 152, 100, 50, 10 ! CONTROL "&Restore", ID_RESTORE, "BUTTON", BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 208, 100, 50, 10 ! CONTROL "&Keep Path(Fkeep:)", IDC_FKEEP, "button", BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 8, 68, 84, 12, 0 CONTROL "TEXPKD:", -1, "STATIC", SS_LEFT | WS_CHILD | WS_VISIBLE | WS_GROUP, 5, 29, 40, 7 ! CONTROL "&Flush", IDC_FLUSH, "button", BS_PUSHBUTTON | BS_CENTER | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 92, 68, 50, 10, 0 ! CONTROL "&VirtualFont(virtual:)", IDC_VIRTUAL, "button", BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_GROUP | WS_TABSTOP, 8, 95, 100, 12, 0 } // IDD_TAB_JFONT DIALOG 0, 5, 281, 127 *** orig/makefile Sun Mar 08 03:05:04 1998 --- makefile Sun May 31 10:47:16 1998 *************** *** 18,24 **** # OPT = -O1 -K -I$(BC5)\INCLUDE -DNOFLOAT;ENGLISH;VFTPIC;DVIPRT;TTFONT;FLI;ND;GCC;GIF;NO_OUTP;RAWOUT;WIN32 ! OPT = -K -I$(BC5)\INCLUDE -DNOFLOAT;ENGLISH;VFTPIC;DVIPRT;LIPS3;ESCPAGE;RAWOUT;JDWN;FAX;TTFONT;FLI;ND;GCC;GIF;NO_OUTP;WIN32 cfgexe: @copy &&| --- 18,24 ---- # OPT = -O1 -K -I$(BC5)\INCLUDE -DNOFLOAT;ENGLISH;VFTPIC;DVIPRT;TTFONT;FLI;ND;GCC;GIF;NO_OUTP;RAWOUT;WIN32 ! OPT = -K -I$(BC5)\INCLUDE -DNOFLOAT;ENGLISH;VFTPIC;DVIPRT;LIPS3;ESCPAGE;RAWOUT;JDWN;FAX;TTFONT;FLI;ND;GCC;GIF;NO_OUTP;WIN32;VIRTUALFONT cfgexe: @copy &&| *************** *** 72,77 **** --- 72,78 ---- tabctrl.obj\ poutw32c.obj\ plug_in.obj\ + virfont.obj\ dviout.res *************** *** 119,125 **** mwndproc.obj+ tabctrl.obj+ poutw32c.obj+ ! plug_in.obj dviout.exe -x $(BC5)\BIN\..\lib\import32 $(BC5)\lib\cw32 --- 120,127 ---- mwndproc.obj+ tabctrl.obj+ poutw32c.obj+ ! plug_in.obj+ ! virfont.obj dviout.exe -x $(BC5)\BIN\..\lib\import32 $(BC5)\lib\cw32 *** /dev/null Sun Jun 07 21:41:10 1998 --- virfont.c Sun Jun 07 21:40:28 1998 *************** *** 0 **** --- 1,417 ---- + #include + + #include "dd.h" + #include "err.h" + #include "buffer.h" + + BOOL f_use_virtualfont = TRUE; + struct STACK { + SCALED_PT h, v, w, x, y, z; + }; + #define LOCALSTACK_SIZE 16 + #define LONG_CHAR 242 + + + BUFFER *get_virtualfont(FONT_INFO *, int, int *); + void make_localfont_list(FONT_INFO *); + void local_pkbuf_flush(FONT_INFO *); + void local_font_flush(FONT_INFO *); + void local_charinfo_flush(FONT_INFO *); + long virtualfont_tfm_width(BUFFER *, int, int); + BOOL load_character_packet(BUFFER *, int, PREAMBLE *); + void pret_vf_packet(FONT_INFO *, BUFFER *, int, + SCALED_PT, SCALED_PT, PIXEL, PIXEL); + long get_nbyte(BUFFER **, int); + long signed_get_nbyte(BUFFER **, int); + SCALED_PT vf_cput(uint, FONT_INFO *, PIXEL, PIXEL); + FONT_INFO *set_localfont(FONT_INFO *, int); + + /* prtinit.c */ + extern DIMENSION dviout_dimension; + + /* buffer.c */ + FONT_INFO *font_info_alloc(void); + + /* misc.c */ + SCALED_PT mult20(SCALED_PT, SCALED_PT); + + /* fontdef.c */ + char *font_name_check(char *, uint, uint); + char *genfont_main(char *, ulong, ulong, uint, uint, uint); + extern int texpk_pos; + + /* raster.c */ + void raster_buf_alloc(PREAMBLE **, long); + + /* getfont */ + PREAMBLE *get_font(uint*, FONT_INFO *); + + /* bitmap.c */ + void write_font(PIXEL, PIXEL, PREAMBLE *); + void write_rule(PIXEL, PIXEL, PIXEL, PIXEL); + + /* size.c, prtsize.c */ + PIXEL sptopixel(SCALED_PT); + PIXEL vtopixel(SCALED_PT); + + extern long sp_per_h, v_per_h; + + + /* seek to the objective character packet */ + BUFFER *get_virtualfont(FONT_INFO *font, int char_code, int *flag_ptr) + { + BUFFER *pk, *pkt; + int cmd; + unsigned long packet_length; + + if (font->ext.local_font == NULL) { + make_localfont_list(font); + } + pk = font->pk; + move_ptr(pk, font->last); /* skip preamble & font defs */ + /* character packets */ + while ((cmd = get_ubyte(pk)) <= LONG_CHAR) { + pkt = pk; + if (cmd == LONG_CHAR) { /* long form packet */ + packet_length = get_long(pk); + if (char_code == get_long(pk)) { /* found! */ + *flag_ptr = cmd; + RETURN(pkt); + } + move_ptr(pk, 4); /* tfm */ + } else { /* short form packet */ + packet_length = cmd; + if (char_code == get_ubyte(pk)) { /* found! */ + *flag_ptr = cmd; + RETURN(pkt); + } + move_ptr(pk, 3); /* tfm */ + } + move_ptr(pk, (int)packet_length); /* skip DVI commands */ + } + /* failure */ + return (NULL); + } + + void make_localfont_list(FONT_INFO *font) + { + BUFFER *pk; + FONT_INFO *local_font; + char *p; + int cmd; + uint fig, figl, fmags; + ulong atrs, atrd, atrt; + + pk = font->pk; + /* preamble */ + move_ptr(pk, 2); /* skip pre(247), id(202) */ + cmd = get_ubyte(pk); /* size of a comment */ + move_ptr(pk, cmd + 8); /* skip comment, check sum, design size */ + + /* font definitions */ + for (cmd = get_ubyte(pk); cmd >= FNT_DEF_1 && cmd < PRE;) { + if (font->ext.local_font == NULL) { + font->ext.local_font = local_font = font_info_alloc(); + } else { + local_font->next_font = font_info_alloc(); + local_font = local_font->next_font; + } + local_font->font_code = get_nbyte(&pk, cmd - FNT_DEF_1 + 1); + local_font->c = get_long(pk); + local_font->size_para = mult20(font->size_para, get_long(pk)); + local_font->des_para = get_long(pk) >> 4; + cmd = get_ubyte(pk); + cmd += get_ubyte(pk); + for (p = local_font->n; cmd > 0; cmd--) { + *p++ = get_ubyte(pk); + } + *p = '\0'; + local_font->n[MAX_NAME_LEN-1] = ' '; + + /* calculate font dpi (from fontdef.c) */ + atrt = (ulong)dviout_dimension.dpi * (ulong)dviout_dimension.mag; + if (local_font->size_para == local_font->des_para) { + atrs = atrt; + atrd = 100; + cmd = 1; + } else { + atrs = local_font->size_para; + atrd = local_font->des_para; + while (atrd > 6000L) { + atrs >>= 1; + atrd >>= 1; + } + fig = (uint)((atrs * 1000 + (atrd >> 1)) / atrd); + if (atrd > 2000L) atrs /= 4; + else atrd *= 4; + atrs *= atrt / 25L; + cmd = 2; + } + for (fmags = dviout_dimension.mag; cmd > 0; cmd--) { + if (fmags == 1095) + atrs += atrs / 2460; /* 1095.4451... */ + else if (fmags == 2074) + atrs -= atrs / 5183; /* 2073.6 */ + else if (fmags == 2488) + atrs += atrs / 7775; /* 2488.32 */ + fmags = fig; + } + fig = (uint)((atrd * 5 + atrs) / (atrd * 10)); + figl = (uint)((atrd + atrs) / (atrd * 2)); + local_font->dpi = fig; + local_font->font_type = UNKNOWN; + local_font->name = font_name_check(local_font->n, fig, figl); + #ifndef NO_GENFONT + if (local_font->name == NULL) { + local_font->name + = genfont_main(local_font->n, + local_font->des_para, + local_font->size_para, + fig, figl, dviout_dimension.dpi); + } + #endif + if (local_font->name == NULL) { + error(NO_FONT, "%s.%03u(%03u):\n", local_font->n, fig, figl); + } + + local_font->next_font = local_font->before_font + = local_font->after_font = NULL; + local_font->f_goth = 0; + for(cmd = 0; cmd < CHAR_ROOT; cmd++) + local_font->char_info[cmd] = NULL; + local_font->texpk_pos = texpk_pos; + local_font->pk = NULL; + cmd = get_ubyte(pk); + } + font->last = pk - font->pk - 1; /* size of preamble & fon defs */ + return; + } + + void local_pkbuf_flush(FONT_INFO *local_font) + { + FONT_INFO *font; + + if (local_font == NULL) return; + for (font = local_font; font; font = font->next_font) { + if (font->font_type == VIRTUAL_FONT) { + local_pkbuf_flush(font); + } + font->pk = NULL; + } + } + + void local_font_flush(FONT_INFO *local_font) + { + FONT_INFO *font, *nfont; + + if (local_font == NULL) return; + for (font = local_font; font; ) { + nfont = font->next_font; + if (font->font_type == VIRTUAL_FONT) { + local_font_flush(font); + } + if (font->name != NULL) Free(font->name); + Free(font); + font = nfont; + } + } + + void local_charinfo_flush(FONT_INFO *local_font) + { + FONT_INFO *font; + int i; + + if (local_font == NULL) return; + for (font = local_font; font; font = font->next_font) { + if (font->font_type == VIRTUAL_FONT) { + local_charinfo_flush(font); + } + for (i = 0; i < CHAR_ROOT; i++) { + font->char_info[i] = NULL; + } + } + } + + /* read tfm width in virtual font */ + long virtualfont_tfm_width(BUFFER *pk, int cmd, int cc) + { + long tfm_width; + + if (pk == NULL) { + tfm_width = 0; + } else { + if (cmd == LONG_CHAR) { + move_ptr(pk, 8); /* skip pl & cc */ + tfm_width = get_long(pk); + } else { + move_ptr(pk, 1); /* skip cc */ + tfm_width = get_mid(pk); + } + } + return (tfm_width); + } + + BOOL load_character_packet(BUFFER *pk, int cmd, PREAMBLE *preamble) + { + long packet_length; + BUFFER *raster; + + if (pk == NULL) return (FALSE); + if (cmd == LONG_CHAR) { + packet_length = get_long(pk); + move_ptr(pk, 8); /* skip cc & tfm */ + } else { + packet_length = cmd; + move_ptr(pk, 4); /* skip cc & tfm */ + } + raster_buf_alloc(&preamble, packet_length); + preamble->byte_width = packet_length; + for (raster = preamble->raster; packet_length > 0; packet_length--) { + *raster++ = get_ubyte(pk); + } + return (TRUE); + } + + void pret_vf_packet(FONT_INFO *vf, BUFFER *pkt, int pl, + SCALED_PT h, SCALED_PT v, PIXEL H0, PIXEL V0) + { + FONT_INFO *font; + BUFFER *end_pkt; + SCALED_PT w, x, y, z; + SCALED_PT a, b; + PIXEL A, B; + uint cmd, c, stackp; + struct STACK local_stack[LOCALSTACK_SIZE]; + #define VF_SCALE(s) mult20(font->size_para, s) + + w = x = y = z = 0; + stackp = 0; + font = set_localfont(vf->ext.local_font, 0); /* default font */ + for (end_pkt = pkt + pl; pkt < end_pkt;) { + cmd = get_ubyte(pkt); + if (cmd < SET1) { /* set_char */ + h += vf_cput(cmd, font, sptopixel(h) - H0, vtopixel(v) - V0); + } else if (cmd < SET_RULE) { /* set(n) */ + c = get_nbyte(&pkt, cmd - SET1 + 1); + h += vf_cput(c, font, sptopixel(h) - H0, vtopixel(v) - V0); + } else if (cmd == SET_RULE || cmd == PUT_RULE) { /* set/put_rule */ + a = VF_SCALE(get_long(pkt)); + b = VF_SCALE(get_long(pkt)); + A = vtopixel(a + ((a > 0) ? (v_per_h) : (-v_per_h))); + B = sptopixel(b + sp_per_h); + write_rule(sptopixel(h) - H0, vtopixel(v) - V0, A, B); + if (cmd == SET_RULE) { + h += b; + } + } else if (cmd < PUT_RULE) { /* put(n) */ + c = get_nbyte(&pkt, cmd - PUT1 + 1); + vf_cput(c, font, sptopixel(h) - H0, vtopixel(v) - V0); + } else if (cmd < PUSH) { /* nop, bop, eop */ + return; + } else if (cmd == PUSH) { /* push */ + if (stackp < LOCALSTACK_SIZE) { + local_stack[stackp].h = h; + local_stack[stackp].v = v; + local_stack[stackp].w = w; + local_stack[stackp].x = x; + local_stack[stackp].y = y; + local_stack[stackp].z = z; + stackp++; + } + } else if (cmd == POP) { /* pop */ + if (stackp > 0) { + stackp--; + h = local_stack[stackp].h; + v = local_stack[stackp].v; + w = local_stack[stackp].w; + x = local_stack[stackp].x; + y = local_stack[stackp].y; + z = local_stack[stackp].z; + } + } else if (cmd < W0) { /* right(n) */ + b = VF_SCALE(signed_get_nbyte(&pkt, cmd - RIGHT1 + 1)); + h += b; + } else if (cmd == W0) { /* w0 */ + h += w; + } else if (cmd < X0) { /* w(n) */ + w = VF_SCALE(signed_get_nbyte(&pkt, cmd - W0)); + h += w; + } else if (cmd == X0) { /* x0 */ + h += x; + } else if (cmd < DOWN1) { /* x(n) */ + x = VF_SCALE(signed_get_nbyte(&pkt, cmd - W0)); + h += x; + } else if (cmd < Y0) { /* down(n) */ + a = VF_SCALE(signed_get_nbyte(&pkt, cmd - DOWN1 + 1)); + v += a; + } else if (cmd == Y0) { /* y0 */ + v += y; + } else if (cmd < Z0) { /* y(n) */ + y = VF_SCALE(signed_get_nbyte(&pkt, cmd - Y0)); + v += y; + } else if (cmd == Z0) { /* z0 */ + v += z; + } else if (cmd < FNT_NUM_0) { /* z(n) */ + z = VF_SCALE(signed_get_nbyte(&pkt, cmd - Z0)); + v += z; + } else if (cmd < FNT1) { /* fnt_num_n */ + cmd -= FNT_NUM_0; + font = set_localfont(vf->ext.local_font, cmd); + } else if (cmd < XXX1) { /* fnt(n) */ + c = get_nbyte(&pkt, cmd - FNT1 + 1); + font = set_localfont(vf->ext.local_font, c); + } else if (cmd < FNT_DEF_1) { /* xxx(n) */ + c = get_nbyte(&pkt, cmd - XXX1 + 1); + move_ptr(pkt, c); /* skip! */ + } + } + } + + long get_nbyte(BUFFER **p, int n) + { + long d; + + if(n--) + d = (unsigned char)get_ubyte(*p); + else + return 0; + while (n-- > 0) + d = (d<<8) + (unsigned char)get_ubyte(*p); + return d; + } + + long signed_get_nbyte(BUFFER **p, int n) + { + long d; + + if(n--) + d = (signed char)get_byte(*p); + else + return 0; + while (n-- > 0) + d = (d<<8) + (unsigned char)get_ubyte(*p); + return d; + } + + SCALED_PT vf_cput(uint code, FONT_INFO *font, PIXEL H, PIXEL V) + { + PREAMBLE *preamble; + + if (font == NULL) return (0); + if (font->name == NULL) return (0); + if ((preamble = get_font(&code, font)) == NULL) return (0); + write_font(H, V, preamble); + return (preamble->tfm_width); + } + + FONT_INFO *set_localfont(FONT_INFO *local_font, int num) + { + FONT_INFO *font; + + for (font = local_font; font; font = font->next_font) { + if (font->font_code == num) { + return (font); + } + } + return (local_font); /* ???? */ + } *** orig/resource.h Tue Mar 17 03:05:04 1998 --- resource.h Sun May 31 02:44:32 1998 *************** *** 325,330 **** --- 325,332 ---- #define IDC_FKEEP 107 #define IDC_BUTTON4 108 #define IDC_FLUSH 108 + #define IDC_CHECKBOX3 109 + #define IDC_VIRTUAL 109 #define IDC_GROUPBOX20 101 #define IDC_LSPEED 168 #define IDC_CONTRAST 123