/* * Force the enumerator to be a gs_show_enum *, which the current * implementation code requires. */ static int show_n_begin(gs_show_enum *penum, gs_state *pgs, int code, gs_text_enum_t *pte) { if (code < 0) return code; if (gs_object_type(pgs->memory, pte) != &st_gs_show_enum) { /* Use the default implementation. */ gx_device *dev = pgs->device; gs_text_params_t text; gs_memory_t *mem = pte->memory; dev_proc_text_begin((*text_begin)) = dev_proc(dev, text_begin); text = pte->text; gs_text_release(pte, "show_n_begin"); /* Temporarily reset the text_begin procedure to the default. */ set_dev_proc(dev, text_begin, gx_default_text_begin); code = gs_text_begin(pgs, &text, mem, &pte); set_dev_proc(dev, text_begin, text_begin); if (code < 0) return code; } /* Now we know pte points to a gs_show_enum. */ *penum = *(gs_show_enum *)pte; gs_free_object(pgs->memory, pte, "show_n_begin"); return code; }
int gx_forward_text_begin(gx_device * dev, gs_imager_state * pis, const gs_text_params_t * text, gs_font * font, gx_path * path, const gx_device_color * pdcolor, const gx_clip_path * pcpath, gs_memory_t * memory, gs_text_enum_t ** ppenum) { gx_device_forward * const fdev = (gx_device_forward *)dev; gx_device *tdev = fdev->target; dev_proc_text_begin((*proc)) = (tdev == 0 ? (tdev = dev, gx_default_text_begin) : dev_proc(tdev, text_begin)); return proc(tdev, pis, text, font, path, pdcolor, pcpath, memory, ppenum); }