206 lines
9.1 KiB
Diff
206 lines
9.1 KiB
Diff
diff --git a/devices/vector/gdevtxtw.c b/devices/vector/gdevtxtw.c
|
|
index b958027..7f02608 100644
|
|
--- a/devices/vector/gdevtxtw.c
|
|
+++ b/devices/vector/gdevtxtw.c
|
|
@@ -1693,97 +1693,100 @@ static int get_unicode(textw_text_enum_t *penum, gs_font *font, gs_glyph glyph,
|
|
|
|
length = font->procs.decode_glyph((gs_font *)font, glyph, ch, NULL, 0);
|
|
if (length == 0) {
|
|
- code = font->procs.glyph_name(font, glyph, &gnstr);
|
|
- if (code >= 0 && gnstr.size == 7) {
|
|
- if (!memcmp(gnstr.data, "uni", 3)) {
|
|
- static const char *hexdigits = "0123456789ABCDEF";
|
|
- char *d0 = strchr(hexdigits, gnstr.data[3]);
|
|
- char *d1 = strchr(hexdigits, gnstr.data[4]);
|
|
- char *d2 = strchr(hexdigits, gnstr.data[5]);
|
|
- char *d3 = strchr(hexdigits, gnstr.data[6]);
|
|
-
|
|
- if (d0 != NULL && d1 != NULL && d2 != NULL && d3 != NULL) {
|
|
- *Buffer++ = ((d0 - hexdigits) << 12) + ((d1 - hexdigits) << 8) + ((d2 - hexdigits) << 4) + (d3 - hexdigits);
|
|
- return 1;
|
|
- }
|
|
- }
|
|
- }
|
|
- if (length == 0) {
|
|
- single_glyph_list_t *sentry = (single_glyph_list_t *)&SingleGlyphList;
|
|
- double_glyph_list_t *dentry = (double_glyph_list_t *)&DoubleGlyphList;
|
|
- treble_glyph_list_t *tentry = (treble_glyph_list_t *)&TrebleGlyphList;
|
|
- quad_glyph_list_t *qentry = (quad_glyph_list_t *)&QuadGlyphList;
|
|
-
|
|
- /* Search glyph to single Unicode value table */
|
|
- while (sentry->Glyph != 0) {
|
|
- if (sentry->Glyph[0] < gnstr.data[0]) {
|
|
- sentry++;
|
|
- continue;
|
|
- }
|
|
- if (sentry->Glyph[0] > gnstr.data[0]){
|
|
- break;
|
|
- }
|
|
- if (strlen(sentry->Glyph) == gnstr.size) {
|
|
- if(memcmp(gnstr.data, sentry->Glyph, gnstr.size) == 0) {
|
|
- *Buffer = sentry->Unicode;
|
|
+ if (glyph != GS_NO_GLYPH) {
|
|
+ code = font->procs.glyph_name(font, glyph, &gnstr);
|
|
+ if (code >= 0 && gnstr.size == 7) {
|
|
+ if (!memcmp(gnstr.data, "uni", 3)) {
|
|
+ static const char *hexdigits = "0123456789ABCDEF";
|
|
+ char *d0 = strchr(hexdigits, gnstr.data[3]);
|
|
+ char *d1 = strchr(hexdigits, gnstr.data[4]);
|
|
+ char *d2 = strchr(hexdigits, gnstr.data[5]);
|
|
+ char *d3 = strchr(hexdigits, gnstr.data[6]);
|
|
+
|
|
+ if (d0 != NULL && d1 != NULL && d2 != NULL && d3 != NULL) {
|
|
+ *Buffer++ = ((d0 - hexdigits) << 12) + ((d1 - hexdigits) << 8) + ((d2 - hexdigits) << 4) + (d3 - hexdigits);
|
|
return 1;
|
|
}
|
|
}
|
|
- sentry++;
|
|
}
|
|
|
|
- /* Search glyph to double Unicode value table */
|
|
- while (dentry->Glyph != 0) {
|
|
- if (dentry->Glyph[0] < gnstr.data[0]) {
|
|
- dentry++;
|
|
- continue;
|
|
- }
|
|
- if (dentry->Glyph[0] > gnstr.data[0]){
|
|
- break;
|
|
- }
|
|
- if (strlen(dentry->Glyph) == gnstr.size) {
|
|
- if(memcmp(gnstr.data, dentry->Glyph, gnstr.size) == 0) {
|
|
- memcpy(Buffer, dentry->Unicode, 2);
|
|
- return 2;
|
|
+ if (length == 0) {
|
|
+ single_glyph_list_t *sentry = (single_glyph_list_t *)&SingleGlyphList;
|
|
+ double_glyph_list_t *dentry = (double_glyph_list_t *)&DoubleGlyphList;
|
|
+ treble_glyph_list_t *tentry = (treble_glyph_list_t *)&TrebleGlyphList;
|
|
+ quad_glyph_list_t *qentry = (quad_glyph_list_t *)&QuadGlyphList;
|
|
+
|
|
+ /* Search glyph to single Unicode value table */
|
|
+ while (sentry->Glyph != 0) {
|
|
+ if (sentry->Glyph[0] < gnstr.data[0]) {
|
|
+ sentry++;
|
|
+ continue;
|
|
+ }
|
|
+ if (sentry->Glyph[0] > gnstr.data[0]){
|
|
+ break;
|
|
+ }
|
|
+ if (strlen(sentry->Glyph) == gnstr.size) {
|
|
+ if(memcmp(gnstr.data, sentry->Glyph, gnstr.size) == 0) {
|
|
+ *Buffer = sentry->Unicode;
|
|
+ return 1;
|
|
+ }
|
|
}
|
|
+ sentry++;
|
|
}
|
|
- dentry++;
|
|
- }
|
|
|
|
- /* Search glyph to triple Unicode value table */
|
|
- while (tentry->Glyph != 0) {
|
|
- if (tentry->Glyph[0] < gnstr.data[0]) {
|
|
- tentry++;
|
|
- continue;
|
|
- }
|
|
- if (tentry->Glyph[0] > gnstr.data[0]){
|
|
- break;
|
|
- }
|
|
- if (strlen(tentry->Glyph) == gnstr.size) {
|
|
- if(memcmp(gnstr.data, tentry->Glyph, gnstr.size) == 0) {
|
|
- memcpy(Buffer, tentry->Unicode, 3);
|
|
- return 3;
|
|
+ /* Search glyph to double Unicode value table */
|
|
+ while (dentry->Glyph != 0) {
|
|
+ if (dentry->Glyph[0] < gnstr.data[0]) {
|
|
+ dentry++;
|
|
+ continue;
|
|
}
|
|
+ if (dentry->Glyph[0] > gnstr.data[0]){
|
|
+ break;
|
|
+ }
|
|
+ if (strlen(dentry->Glyph) == gnstr.size) {
|
|
+ if(memcmp(gnstr.data, dentry->Glyph, gnstr.size) == 0) {
|
|
+ memcpy(Buffer, dentry->Unicode, 2);
|
|
+ return 2;
|
|
+ }
|
|
+ }
|
|
+ dentry++;
|
|
}
|
|
- tentry++;
|
|
- }
|
|
|
|
- /* Search glyph to quadruple Unicode value table */
|
|
- while (qentry->Glyph != 0) {
|
|
- if (qentry->Glyph[0] < gnstr.data[0]) {
|
|
- qentry++;
|
|
- continue;
|
|
- }
|
|
- if (qentry->Glyph[0] > gnstr.data[0]){
|
|
- break;
|
|
+ /* Search glyph to triple Unicode value table */
|
|
+ while (tentry->Glyph != 0) {
|
|
+ if (tentry->Glyph[0] < gnstr.data[0]) {
|
|
+ tentry++;
|
|
+ continue;
|
|
+ }
|
|
+ if (tentry->Glyph[0] > gnstr.data[0]){
|
|
+ break;
|
|
+ }
|
|
+ if (strlen(tentry->Glyph) == gnstr.size) {
|
|
+ if(memcmp(gnstr.data, tentry->Glyph, gnstr.size) == 0) {
|
|
+ memcpy(Buffer, tentry->Unicode, 3);
|
|
+ return 3;
|
|
+ }
|
|
+ }
|
|
+ tentry++;
|
|
}
|
|
- if (strlen(qentry->Glyph) == gnstr.size) {
|
|
- if(memcmp(gnstr.data, qentry->Glyph, gnstr.size) == 0) {
|
|
- memcpy(Buffer, qentry->Unicode, 4);
|
|
- return 4;
|
|
+
|
|
+ /* Search glyph to quadruple Unicode value table */
|
|
+ while (qentry->Glyph != 0) {
|
|
+ if (qentry->Glyph[0] < gnstr.data[0]) {
|
|
+ qentry++;
|
|
+ continue;
|
|
+ }
|
|
+ if (qentry->Glyph[0] > gnstr.data[0]){
|
|
+ break;
|
|
}
|
|
+ if (strlen(qentry->Glyph) == gnstr.size) {
|
|
+ if(memcmp(gnstr.data, qentry->Glyph, gnstr.size) == 0) {
|
|
+ memcpy(Buffer, qentry->Unicode, 4);
|
|
+ return 4;
|
|
+ }
|
|
+ }
|
|
+ qentry++;
|
|
}
|
|
- qentry++;
|
|
}
|
|
}
|
|
*Buffer = fallback;
|
|
@@ -1890,8 +1893,8 @@ txtwrite_process_cmap_text(gs_text_enum_t *pte)
|
|
pte->returned.total_width.x += dpt.x;
|
|
pte->returned.total_width.y += dpt.y;
|
|
|
|
- penum->TextBufferIndex += get_unicode(penum, (gs_font *)pte->orig_font, glyph, chr, &penum->TextBuffer[penum->TextBufferIndex]);
|
|
penum->Widths[penum->TextBufferIndex] += dpt.x;
|
|
+ penum->TextBufferIndex += get_unicode(penum, (gs_font *)pte->orig_font, glyph, chr, &penum->TextBuffer[penum->TextBufferIndex]);
|
|
break;
|
|
case 2: /* end of string */
|
|
return 0;
|
|
diff --git a/psi/zbfont.c b/psi/zbfont.c
|
|
index 262fea9..abc03aa 100644
|
|
--- a/psi/zbfont.c
|
|
+++ b/psi/zbfont.c
|
|
@@ -272,7 +272,7 @@ gs_font_map_glyph_to_unicode(gs_font *font, gs_glyph glyph, int ch, ushort *u, u
|
|
* can't be a default value for FontInfo.GlyphNames2Unicode .
|
|
*/
|
|
}
|
|
- if (glyph <= GS_MIN_CID_GLYPH) {
|
|
+ if (glyph <= GS_MIN_CID_GLYPH && glyph != GS_NO_GLYPH) {
|
|
UnicodeDecoding = zfont_get_to_unicode_map(font->dir);
|
|
if (UnicodeDecoding != NULL && r_type(UnicodeDecoding) == t_dictionary)
|
|
return gs_font_map_glyph_by_dict(font->memory, UnicodeDecoding, glyph, u, length);
|