diff options
Diffstat (limited to 'devices/vector/gdevtxtw.c')
-rw-r--r-- | devices/vector/gdevtxtw.c | 22 |
1 files changed, 18 insertions, 4 deletions
diff --git a/devices/vector/gdevtxtw.c b/devices/vector/gdevtxtw.c index 5c885f5f..71be58b6 100644 --- a/devices/vector/gdevtxtw.c +++ b/devices/vector/gdevtxtw.c @@ -1167,7 +1167,7 @@ txtwrite_put_params(gx_device * dev, gs_param_list * plist) if (code < 0) return code; - if (ofs.data != 0) { /* Close the file if it's open. */ + if (ofs.data != 0 && (ofs.size != strlen(tdev->fname) || strncmp((const char *)ofs.data, tdev->fname, ofs.size)) != 0) { /* Close the file if it's open. */ if (tdev->file != 0) { gp_fclose(tdev->file); tdev->file = 0; @@ -1185,10 +1185,10 @@ txtwrite_put_params(gx_device * dev, gs_param_list * plist) dev->is_open = false; code = gx_default_put_params(dev, plist); + dev->is_open = open; if (code < 0) return code; - dev->is_open = open; dev->interpolate_control = 0; @@ -1875,10 +1875,14 @@ textw_text_process(gs_text_enum_t *pte) if (!penum->SpanDeltaX) return gs_note_error(gs_error_VMerror); } +retry: { switch (font->FontType) { case ft_CID_encrypted: case ft_CID_TrueType: + errprintf(pte->memory, "\n\n*** The txtwrite device does not currently support the use of CID-Keyed fonts. ***\n\n"); + return_error(gs_error_typecheck); + break; case ft_composite: code = txtwrite_process_cmap_text(pte); break; @@ -1886,13 +1890,14 @@ textw_text_process(gs_text_enum_t *pte) case ft_encrypted2: case ft_TrueType: case ft_user_defined: + case ft_PDF_user_defined: case ft_PCL_user_defined: case ft_GL2_stick_user_defined: case ft_GL2_531: code = txtwrite_process_plain_text(pte); break; default: - return_error(gs_error_rangecheck); + return_error(gs_error_rangecheck); break; } if (code == 0) { @@ -1935,6 +1940,9 @@ textw_text_process(gs_text_enum_t *pte) penum->pte_fallback = pte_fallback; gs_text_enum_copy_dynamic(pte_fallback, pte, false); + if (font->FontType == ft_PDF_user_defined && pte->text.size != 1) + pte_fallback->text.size = pte->index + 1; + code = gs_text_process(pte_fallback); if (code != 0) { penum->returned.current_char = pte_fallback->returned.current_char; @@ -1943,6 +1951,8 @@ textw_text_process(gs_text_enum_t *pte) } gs_text_release(NULL, pte_fallback, "txtwrite_text_process"); penum->pte_fallback = 0; + if (font->FontType == ft_PDF_user_defined) + goto retry; } } return code; @@ -1954,7 +1964,11 @@ textw_text_process(gs_text_enum_t *pte) static int textw_text_resync(gs_text_enum_t *pte, const gs_text_enum_t *pfrom) { - return gs_text_resync(pte, pfrom); + if ((pte->text.operation ^ pfrom->text.operation) & ~TEXT_FROM_ANY) + return_error(gs_error_rangecheck); + pte->text = pfrom->text; + gs_text_enum_copy_dynamic(pte, pfrom, false); + return 0; } static bool textw_text_is_width_only(const gs_text_enum_t *pte) |