/* Start enumerating a path */ int gs_path_enum_copy_init(gs_path_enum * penum, const gs_state * pgs, bool copy) { gs_memory_t *mem = pgs->memory; if (copy) { gx_path *copied_path = gx_path_alloc(mem, "gs_path_enum_init"); int code; if (copied_path == 0) return_error(gs_error_VMerror); code = gx_path_copy(pgs->path, copied_path); if (code < 0) { gx_path_free(copied_path, "gs_path_enum_init"); return code; } gx_path_enum_init(penum, copied_path); penum->copied_path = copied_path; } else { gx_path_enum_init(penum, pgs->path); } penum->memory = mem; gs_currentmatrix(pgs, &penum->mat); return 0; }
/* * Copy the current path, because it was shared. */ static int path_alloc_copy(gx_path * ppath) { gx_path path_new; int code; gx_path_init_local(&path_new, ppath->memory); code = gx_path_copy(ppath, &path_new); if (code < 0) { gx_path_free(&path_new, "path_alloc_copy error"); return code; } ppath->last_charpath_segment = 0; return gx_path_assign_free(ppath, &path_new); }
int gx_path_add_dash_expansion(const gx_path * ppath_old, gx_path * ppath, const gs_imager_state * pis) { const subpath *psub; const gx_dash_params *dash = &gs_currentlineparams(pis)->dash; int code = 0; if (dash->pattern_size == 0) return gx_path_copy(ppath_old, ppath); for (psub = ppath_old->first_subpath; psub != 0 && code >= 0; psub = (const subpath *)psub->last->next ) code = subpath_expand_dashes(psub, ppath, pis, dash); return code; }