diff options
Diffstat (limited to 'Build')
-rw-r--r-- | Build/source/texk/web2c/xetexdir/XeTeX_ext.c | 70 | ||||
-rw-r--r-- | Build/source/texk/web2c/xetexdir/XeTeX_ext.h | 6 | ||||
-rw-r--r-- | Build/source/texk/web2c/xetexdir/xetex.ch | 98 | ||||
-rw-r--r-- | Build/source/texk/web2c/xetexdir/xetex.defines | 3 |
4 files changed, 166 insertions, 11 deletions
diff --git a/Build/source/texk/web2c/xetexdir/XeTeX_ext.c b/Build/source/texk/web2c/xetexdir/XeTeX_ext.c index 0e90547c385..6ee4089f796 100644 --- a/Build/source/texk/web2c/xetexdir/XeTeX_ext.c +++ b/Build/source/texk/web2c/xetexdir/XeTeX_ext.c @@ -594,8 +594,14 @@ printchars(const unsigned short* str, int len) printchar(*(str++)); } +#ifdef WORDS_BIGENDIAN +#define UTF16_NATIVE kForm_UTF16BE +#else +#define UTF16_NATIVE kForm_UTF16LE +#endif + void* -load_mapping_file(const char* s, const char* e) +load_mapping_file(const char* s, const char* e, char byteMapping) { char* mapPath; TECkit_Converter cnv = 0; @@ -618,13 +624,15 @@ load_mapping_file(const char* s, const char* e) mapping = xmalloc(mappingSize); fread(mapping, 1, mappingSize, mapFile); fclose(mapFile); - status = TECkit_CreateConverter(mapping, mappingSize, + if (byteMapping != 0) + status = TECkit_CreateConverter(mapping, mappingSize, + false, + UTF16_NATIVE, kForm_Bytes, + &cnv); + else + status = TECkit_CreateConverter(mapping, mappingSize, true, -#ifdef WORDS_BIGENDIAN - kForm_UTF16BE, kForm_UTF16BE, -#else - kForm_UTF16LE, kForm_UTF16LE, -#endif + UTF16_NATIVE, UTF16_NATIVE, &cnv); free(mapping); } @@ -637,6 +645,52 @@ load_mapping_file(const char* s, const char* e) return cnv; } +char *saved_mapping_name = NULL; +void +checkfortfmfontmapping() +{ + char* cp = strstr((char*)nameoffile + 1, ":mapping="); + if (saved_mapping_name != NULL) { + free(saved_mapping_name); + saved_mapping_name = NULL; + } + if (cp != NULL) { + *cp = 0; + cp += 9; + while (*cp && *cp <= ' ') + ++cp; + if (*cp) + saved_mapping_name = xstrdup(cp); + } +} + +void* +loadtfmfontmapping() +{ + void* rval = NULL; + if (saved_mapping_name != NULL) { + rval = load_mapping_file(saved_mapping_name, + saved_mapping_name + strlen(saved_mapping_name), 1); + free(saved_mapping_name); + saved_mapping_name = NULL; + } + return rval; +} + +int +applytfmfontmapping(void* cnv, int c) +{ + UniChar in = c; + Byte out[2]; + UInt32 inUsed, outUsed; + TECkit_Status status = TECkit_ConvertBuffer((TECkit_Converter)cnv, + (const Byte*)&in, sizeof(in), &inUsed, out, sizeof(out), &outUsed, 1); + if (outUsed < 1) + return 0; + else + return out[0]; +} + double read_double(const char** s) { @@ -765,7 +819,7 @@ readCommonFeatures(const char* feat, const char* end, float* extend, float* slan sep = feat + 7; if (*sep != '=') return -1; - loadedfontmapping = load_mapping_file(sep + 1, end); + loadedfontmapping = load_mapping_file(sep + 1, end, 0); return 1; } diff --git a/Build/source/texk/web2c/xetexdir/XeTeX_ext.h b/Build/source/texk/web2c/xetexdir/XeTeX_ext.h index 3fd3a25a81d..3f07ce07bc4 100644 --- a/Build/source/texk/web2c/xetexdir/XeTeX_ext.h +++ b/Build/source/texk/web2c/xetexdir/XeTeX_ext.h @@ -225,7 +225,7 @@ extern "C" { int getencodingmodeandinfo(integer* info); void printutf8str(const unsigned char* str, int len); void printchars(const unsigned short* str, int len); - void* load_mapping_file(const char* s, const char* e); + void* load_mapping_file(const char* s, const char* e, char byteMapping); void* findnativefont(unsigned char* name, integer scaled_size); void releasefontengine(void* engine, int type_flag); int readCommonFeatures(const char* feat, const char* end, float* extend, float* slant, float* embolden, float* letterspace, UInt32* rgbValue); @@ -281,6 +281,10 @@ extern "C" { void terminatefontmanager(); int maketexstring(const char* s); + void checkfortfmfontmapping(); + void* loadtfmfontmapping(); + int applytfmfontmapping(void* mapping, int c); + #ifndef XETEX_MAC typedef void* ATSUStyle; /* dummy declaration just so the stubs can compile */ #endif diff --git a/Build/source/texk/web2c/xetexdir/xetex.ch b/Build/source/texk/web2c/xetexdir/xetex.ch index 934c7123832..da084242e35 100644 --- a/Build/source/texk/web2c/xetexdir/xetex.ch +++ b/Build/source/texk/web2c/xetexdir/xetex.ch @@ -64,8 +64,8 @@ authorization from SIL International. @d eTeX_version_string=='-2.2' {current \eTeX\ version} @d XeTeX_version=0 -@d XeTeX_revision==".998.1" -@d XeTeX_version_string=='-0.998.1' {current \XeTeX\ version} +@d XeTeX_revision==".998" +@d XeTeX_version_string=='-0.998.2-dev' {current \XeTeX\ version} @z @x @@ -3418,11 +3418,20 @@ file_opened:=false; if not b_open_in(tfm_file) then abort; file_opened:=true @y +check_for_tfm_font_mapping; if b_open_in(tfm_file) then begin file_opened:=true @z @x +fmem_ptr:=fmem_ptr+lf; font_ptr:=f; g:=f; goto done +@y +fmem_ptr:=fmem_ptr+lf; font_ptr:=f; g:=f; +font_mapping[f]:=load_tfm_font_mapping; +goto done +@z + +@x @ When \TeX\ wants to typeset a character that doesn't exist, the character node is not created; thus the output routine can assume that characters exist when it sees them. The following procedure @@ -3553,6 +3562,13 @@ procedure dvi_font_def(@!f:internal_font_number); @z @x +var k:pool_pointer; {index into |str_pool|} +@y +var k:pool_pointer; {index into |str_pool|} +l:integer; {length of name without mapping option} +@z + +@x begin if f<=256+font_base then @y begin if is_native_font(f) then dvi_native_font_def(f) else @@ -3560,10 +3576,24 @@ begin if f<=256+font_base then @z @x +dvi_out(length(font_name[f])); @<Output the font name whose internal number is |f|@>; @y +if font_mapping[f]<>nil then begin + l:=0; + k:=str_start_macro(font_name[f]); + while (l=0) and (k<str_start_macro(font_name[f]+1)) do begin + if so(str_pool[k]) = ":" then l:=k-str_start_macro(font_name[f]); + incr(k); + end; + dvi_out(l); + for k:=str_start_macro(font_name[f]) to str_start_macro(font_name[f])+l-1 do + dvi_out(so(str_pool[k])); +end else begin +dvi_out(length(font_name[f])); @<Output the font name whose internal number is |f|@>; end; +end; @z @x @@ -3734,6 +3764,13 @@ while (q <> null) and (not is_char_node(q)) and (type(q) = disc_node) do @z @x + repeat f:=font(p); c:=character(p); +@y + repeat f:=font(p); c:=character(p); + if (p<>lig_trick) and (font_mapping[f]<>nil) then c:=apply_tfm_font_mapping(font_mapping[f],c); +@z + +@x @p procedure vlist_out; {output a |vlist_node| box} @y @p procedure vlist_out; {output a |vlist_node| box} @@ -3922,6 +3959,12 @@ label reswitch, common_ending, exit, restart; @z @x +p:=lig_trick; goto reswitch; +@y +p:=lig_trick; ligature_present:=true; goto reswitch; +@z + +@x @d vpack(#)==vpackage(#,max_dimen) {special case of unconstrained depth} @y @d vpack(#)==vpackage(#,max_dimen) {special case of unconstrained depth} @@ -4871,6 +4914,13 @@ label done,done1,done2,done3,done4,done5,done6,continue, restart; @z @x + ligature_node: begin f:=font(lig_char(v));@/ +@y + ligature_node: begin f:=font(lig_char(v));@/ + ligature_present:=true; +@z + +@x othercases confusion("disc1") @y whatsit_node: @@ -4884,6 +4934,13 @@ label done,done1,done2,done3,done4,done5,done6,continue, restart; @z @x + ligature_node: begin f:=font(lig_char(s)); +@y + ligature_node: begin f:=font(lig_char(s)); + ligature_present:=true; +@z + +@x othercases confusion("disc2") @y whatsit_node: @@ -4903,6 +4960,20 @@ label done,done1,done2,done3,done4,done5,done6,continue, restart; @z @x +ligature_node: begin f:=font(lig_char(cur_p)); +@y +ligature_node: begin f:=font(lig_char(cur_p)); + ligature_present:=true; +@z + +@x + ligature_node: begin f:=font(lig_char(s)); +@y + ligature_node: begin f:=font(lig_char(s)); + ligature_present:=true; +@z + +@x othercases confusion("disc3") @y whatsit_node: @@ -4916,6 +4987,13 @@ label done,done1,done2,done3,done4,done5,done6,continue, restart; @z @x + ligature_node: begin f:=font(lig_char(s)); +@y + ligature_node: begin f:=font(lig_char(s)); + ligature_present:=true; +@z + +@x othercases confusion("disc4") @y whatsit_node: @@ -8417,6 +8495,22 @@ end; @z @x +begin result:=c; {return |c| unless it does not exist in the font} +@y +begin if (not ligature_present) and (font_mapping[f]<>nil) then + c:=apply_tfm_font_mapping(font_mapping[f],c); +result:=c; {return |c| unless it does not exist in the font} +@z + +@x +begin if not mltex_enabled_p then +@y +begin if (not ligature_present) and (font_mapping[f]<>nil) then + c:=apply_tfm_font_mapping(font_mapping[f],c); +if not mltex_enabled_p then +@z + +@x effective_char_info:=null_character; exit:end; @y diff --git a/Build/source/texk/web2c/xetexdir/xetex.defines b/Build/source/texk/web2c/xetexdir/xetex.defines index d1ccb6530e9..be239481b07 100644 --- a/Build/source/texk/web2c/xetexdir/xetex.defines +++ b/Build/source/texk/web2c/xetexdir/xetex.defines @@ -64,6 +64,9 @@ authorization from SIL International. @define function initpool(); @define type gzFile; @define function weof(); +@define procedure checkfortfmfontmapping; +@define function loadtfmfontmapping; +@define function applytfmfontmapping(); @define procedure initGraphiteBreaking(); @define function findNextGraphiteBreak(); |