diff options
Diffstat (limited to 'devices/vector/gdevpdtt.c')
-rw-r--r-- | devices/vector/gdevpdtt.c | 38 |
1 files changed, 34 insertions, 4 deletions
diff --git a/devices/vector/gdevpdtt.c b/devices/vector/gdevpdtt.c index 98ce8892..9483e051 100644 --- a/devices/vector/gdevpdtt.c +++ b/devices/vector/gdevpdtt.c @@ -86,6 +86,30 @@ pdf_text_current_width(const gs_text_enum_t *pte, gs_point *pwidth) return gs_text_current_width(penum->pte_default, pwidth); return_error(gs_error_rangecheck); /* can't happen */ } + +static void +pdf_show_text_release(gs_text_enum_t *pte, client_name_t cname) +{ + gs_show_enum *const penum = (gs_show_enum *)pte; + gs_text_enum_procs_t *procs = (gs_text_enum_procs_t *)penum->procs; + + penum->cc = 0; + if (penum->dev_cache2) { + gx_device_retain((gx_device *)penum->dev_cache2, false); + penum->dev_cache2 = 0; + } + if (penum->dev_cache) { + gx_device_retain((gx_device *)penum->dev_cache, false); + penum->dev_cache = 0; + } + if (penum->dev_null) { + gx_device_retain((gx_device *)penum->dev_null, false); + penum->dev_null = 0; + } + gx_default_text_release(pte, cname); + gs_free_object(penum->memory->non_gc_memory, procs, "pdf_show_text_release"); +} + static int pdf_text_set_cache(gs_text_enum_t *pte, const double *pw, gs_text_cache_control_t control) @@ -655,7 +679,7 @@ gdev_pdf_text_begin(gx_device * dev, gs_gstate * pgs, penum->output_char_code = GS_NO_CHAR; code = gs_text_enum_init((gs_text_enum_t *)penum, &pdf_text_procs, dev, pgs, text, font, pcpath, mem); - penum->k_text_release = 1; /* early release of black_text_state */ + penum->k_text_release = 1; /* early release of black_textvec_state */ if (code < 0) { gs_free_object(mem, penum, "gdev_pdf_text_begin"); @@ -3392,12 +3416,18 @@ pdf_text_process(gs_text_enum_t *pte) */ gs_show_enum psenum = *(gs_show_enum *)pte_default; gs_gstate *pgs = (gs_gstate *)penum->pgs; - gs_text_enum_procs_t special_procs = *pte_default->procs; + gs_text_enum_procs_t *special_procs; void (*save_proc)(gx_device *, gs_matrix *) = pdev->procs.get_initial_matrix; gs_matrix m, savem; - special_procs.set_cache = pdf_text_set_cache; - pte_default->procs = &special_procs; + special_procs = (gs_text_enum_procs_t *)gs_alloc_bytes(pte_default->memory->non_gc_memory, sizeof(gs_text_enum_procs_t), "pdf_text_process"); + if (special_procs == NULL) + return_error(gs_error_VMerror); + + *special_procs = *pte_default->procs; + special_procs->set_cache = pdf_text_set_cache; + special_procs->release = pdf_show_text_release; + pte_default->procs = special_procs; { /* We should not come here if we already have a cached character (except for the special case |