From: maqiyuan Date: Mon, 12 May 2014 14:44:10 +0000 (+0800) Subject: finished font mapping (via hash algorithm). X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;ds=sidebyside;h=dd7bc75acf2b0513a19f1501df1f5a908810883d;p=putex%2Fputex.git finished font mapping (via hash algorithm). --- diff --git a/src/texsourc/tex3.c b/src/texsourc/tex3.c index 3943cca..ae83822 100644 --- a/src/texsourc/tex3.c +++ b/src/texsourc/tex3.c @@ -1525,8 +1525,8 @@ lab50: /* sec 0515 */ void begin_name (void) { - area_delimiter = 0; /* index between `file area' and `file name' */ - ext_delimiter = 0; /* index between `file name' and `file extension' */ + area_delimiter = 0; + ext_delimiter = 0; } /* This gathers up a file name and makes a string of it */ /* Also tries to break it into `file area' `file name' and `file extension' */ @@ -1544,26 +1544,18 @@ bool more_name_(ASCII_code c) return true; /* accept ending quote, but throw away */ } else - { -/* *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** */ -/* convert pseudo tilde back to '~' 95/Sep/26 */ /* moved here 97/June/5 */ -/* if (pseudo_tilde != 0 && c == pseudo_tilde) c = '~'; */ -/* convert pseudo space back to ' ' 97/June/5 */ /* moved here 97/June/5 */ -/* if (pseudo_space != 0 && c == pseudo_space) c = ' '; */ -/* *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** */ + { str_room(1); append_char(c); -/* *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** */ -// if ((c == 47)) /* / */ -// for DOS/Windows - if ((c == '/' || c == '\\' || c == ':')) /* 94/Mar/1 */ -/* *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** */ + // for DOS/Windows + if ((c == '/' || c == '\\' || c == ':')) { area_delimiter = cur_length; ext_delimiter = 0; } else if (c == '.') ext_delimiter = cur_length; + return true; } } @@ -1583,8 +1575,6 @@ int find_string (int start, int end) int k, nlen = end - start; char *s; -// int trace_flag = 1; // debugging only - if (trace_flag) { sprintf(log_line, "\nLOOKING for string (str_ptr %d nlen %d) ", str_ptr, end - start); @@ -1686,19 +1676,17 @@ void end_name (void) if (str_ptr + 3 > current_max_strings) { - overflow("number of strings", current_max_strings - init_str_ptr); /* 97/Mar/7 */ + overflow("number of strings", current_max_strings - init_str_ptr); return; // abort_flag set } #else if (str_ptr + 3 > max_strings) { - overflow("number of strings", max_strings - init_str_ptr); /* number of strings */ + overflow("number of strings", max_strings - init_str_ptr); return; // abort_flag set } #endif -// if (notfirst++ == 0) show_all_strings(); // debugging only - if (area_delimiter == 0) // no area delimiter ':' '/' or '\' found cur_area = 335; // "" default area else diff --git a/src/texsourc/tex9.c b/src/texsourc/tex9.c index 22b5391..686403d 100644 --- a/src/texsourc/tex9.c +++ b/src/texsourc/tex9.c @@ -342,6 +342,7 @@ void close_files_and_terminate (void) } HPDF_Free(yandy_pdf); + font_name_hash_free(gentbl); } else { diff --git a/src/texsourc/texd.h b/src/texsourc/texd.h index 8c5360c..7a10615 100644 --- a/src/texsourc/texd.h +++ b/src/texsourc/texd.h @@ -255,7 +255,7 @@ typedef integer trie_op_code; /* sec 0925 */ typedef integer trie_pointer; /* typedef short hyph_pointer; */ /* increased 1996/Oct/20 ??? */ -typedef integer hyph_pointer; +typedef integer hyph_pointer; EXTERN integer bad; EXTERN ASCII_code xord[256]; @@ -1145,6 +1145,8 @@ extern int load_pool_strings (integer spare_size); #define help6(...) tex_help(6, __VA_ARGS__) /********BINDING WITH LIBHARU*********/ +typedef struct _mapping_table mapping_table; +typedef struct _mapping_entry mapping_entry; EXTERN HPDF_Doc yandy_pdf; EXTERN HPDF_Page yandy_page; EXTERN HPDF_Font yandy_font[1024]; @@ -1152,6 +1154,9 @@ EXTERN bool pdf_doing_string; EXTERN bool pdf_doing_text; EXTERN integer scaled_out; EXTERN bool pdf_output_flag; +EXTERN mapping_table * gentbl; +EXTERN mapping_table * font_name_hash_init (void); +EXTERN void font_name_hash_free (mapping_table * tbl); EXTERN void pdf_ship_out(pointer p); EXTERN void pdf_vlist_out (void); EXTERN void pdf_hlist_out (void); diff --git a/src/texsourc/yandy_pdf_backend.c b/src/texsourc/yandy_pdf_backend.c index b9430db..d06ba81 100644 --- a/src/texsourc/yandy_pdf_backend.c +++ b/src/texsourc/yandy_pdf_backend.c @@ -35,10 +35,102 @@ static integer ten_pow[10] = 1000000000 }; integer scaled_out; +integer pdf_font_sum = 0; HPDF_Doc yandy_pdf; HPDF_Page yandy_page; HPDF_Font yandy_font[1024]; +mapping_table * gentbl; + +#define mapping_size 31627 + +struct _mapping_table +{ + mapping_entry * entries[mapping_size]; +}; + +struct _mapping_entry +{ + mapping_entry * next; + char * key; + int val; +}; + +unsigned int font_name_hash(const char * s) +{ + const char * p; + unsigned int h = 0, g; + + for (p = s; *p != '\0'; p++) + { + h = (h << 4) + *p; + + if ((g = h & 0xf0000000)) + { + h = h ^ (g >> 24); + h = h ^ g; + } + } + + return h; +} + +mapping_table * font_name_hash_init (void) +{ + mapping_table * temp_table; + int i; + + temp_table = (mapping_table *) malloc(sizeof(mapping_table)); + + for (i = 0; i < mapping_size; i++) + temp_table->entries[i] = NULL; + + return temp_table; +} + +void font_name_hash_free (mapping_table * tbl) +{ + int i; + mapping_entry *e, *next; + + for (i = 0; i < mapping_size; i++) + for (e = tbl->entries[i]; e; e = next) + { + next = e->next; + free(e->key); + free(e); + } + + free(tbl); +} + +void font_name_hash_insert (mapping_table * tbl, const char *key, int val) +{ + int i; + mapping_entry * e; + + i = font_name_hash(key) % mapping_size; + e = (mapping_entry *) malloc(sizeof(mapping_entry)); + e->next = tbl->entries[i]; + e->key = (char *) strdup(key); + e->val = val; + tbl->entries[i] = e; +} + +int font_name_hash_lookup (mapping_table * tbl, const char *key) +{ + int i; + mapping_entry *e; + + i = font_name_hash(key) % mapping_size; + + for (e = tbl->entries[i]; e; e = e-> next) + if (!strcmp(key, e->key)) + return e->val; + + return -1; +} + // report error. void pdf_error(const char * t, const char * p) { @@ -286,36 +378,47 @@ void pdf_error_handler (HPDF_STATUS error_no, HPDF_STATUS detail_no, void * user longjmp(jumpbuffer, 1); } -void pdf_font_def(internal_font_number f) +void pdf_font_def (internal_font_number f) { - /* int k; const char * fnt_name; char * afm_name; char * pfb_name; - char buffer[256]; + char * fnt_buffer = (char *) malloc(length(font_name[f]) + 1); - memcpy(buffer, (const char *) str_pool + str_start[font_name[f]], length(font_name[f])); - buffer[length(font_name[f])] = '\0'; + memcpy(fnt_buffer, (const char *) str_pool + str_start[font_name[f]], length(font_name[f])); + fnt_buffer[length(font_name[f])] = '\0'; - k = get_font_index(buffer); - printf("DEF: %s--%d.\n", buffer, k); + k = font_name_hash_lookup(gentbl, fnt_buffer); - if (k == 0) + if (k == -1) { - afm_name = kpse_find_file(strcat(strdup(buffer), ".afm"), kpse_afm_format, 1); - printf("path: %s.\n", afm_name); - pfb_name = kpse_find_file(strcat(strdup(buffer), ".pfb"), kpse_type1_format, 1); + { + char * afm_temp = (char *) malloc(strlen(fnt_buffer) + 5); + char * pfb_temp = (char *) malloc(strlen(fnt_buffer) + 5); + strcpy(afm_temp, fnt_buffer); strcpy(afm_temp + strlen(fnt_buffer), ".afm"); + strcpy(pfb_temp, fnt_buffer); strcpy(pfb_temp + strlen(fnt_buffer), ".pfb"); + afm_name = kpse_find_file(afm_temp, kpse_afm_format, 1); + pfb_name = kpse_find_file(pfb_temp, kpse_type1_format, 1); + free(afm_temp); + free(pfb_temp); + } if (afm_name != NULL && pfb_name != NULL) { - k = insert_font_index(buffer); + font_name_hash_insert(gentbl, fnt_buffer, pdf_font_sum + 1); + pdf_font_sum += 1; fnt_name = HPDF_LoadType1FontFromFile (yandy_pdf, afm_name, pfb_name); - yandy_font[k] = HPDF_GetFont(yandy_pdf, fnt_name, NULL); + yandy_font[pdf_font_sum] = HPDF_GetFont(yandy_pdf, fnt_name, NULL); + HPDF_Page_SetFontAndSize(yandy_page, yandy_font[pdf_font_sum], (font_size[f] / 65535)); } } - */ - HPDF_Page_SetFontAndSize(yandy_page, yandy_font[0], (font_size[f] / 65535)); + else + { + HPDF_Page_SetFontAndSize(yandy_page, yandy_font[k], (font_size[f] / 65535)); + } + + free(fnt_buffer); } void pdf_ship_out(halfword p) @@ -408,6 +511,7 @@ void pdf_ship_out(halfword p) if (total_pages == 0) { + gentbl = font_name_hash_init(); yandy_pdf = HPDF_New (pdf_error_handler, NULL); HPDF_SetCompressionMode (yandy_pdf, HPDF_COMP_ALL); yandy_pdf -> pdf_version = HPDF_VER_17; @@ -416,7 +520,6 @@ void pdf_ship_out(halfword p) } yandy_page = HPDF_AddPage (yandy_pdf); - HPDF_Page_SetFontAndSize(yandy_page, yandy_font[0], 10); HPDF_Page_SetSize (yandy_page, HPDF_PAGE_SIZE_A4, HPDF_PAGE_PORTRAIT); cur_v = height(p) + v_offset; @@ -494,7 +597,8 @@ lab21: dvi_f = f; } - HPDF_Page_BeginText(yandy_page);HPDF_Page_SetFontAndSize(yandy_page, yandy_font[0], 10); + HPDF_Page_BeginText(yandy_page); + pdf_font_def(f); HPDF_Page_MoveTextPos(yandy_page, pdf_sp_to_bp(cur_h) + 72, (841.89 - (pdf_sp_to_bp(cur_v) + 72))); HPDF_Page_ShowText(yandy_page, pdf_char_to_string(c)); HPDF_Page_EndText(yandy_page);