/* relatives. */ int gx_path_add_char_path(gx_path * to_path, gx_path * from_path, gs_char_path_mode mode) { int code; gs_fixed_rect bbox; switch (mode) { default: /* shouldn't happen! */ gx_path_new(from_path); return 0; case cpm_charwidth: { gs_fixed_point cpt; code = gx_path_current_point(from_path, &cpt); if (code < 0) break; return gx_path_add_point(to_path, cpt.x, cpt.y); } case cpm_true_charpath: case cpm_false_charpath: return gx_path_add_path(to_path, from_path); case cpm_true_charboxpath: gx_path_bbox(from_path, &bbox); code = gx_path_add_rectangle(to_path, bbox.p.x, bbox.p.y, bbox.q.x, bbox.q.y); break; case cpm_false_charboxpath: gx_path_bbox(from_path, &bbox); code = gx_path_add_point(to_path, bbox.p.x, bbox.p.y); if (code >= 0) code = gx_path_add_line(to_path, bbox.q.x, bbox.q.y); break; } if (code < 0) return code; gx_path_new(from_path); return 0; }
int gs_viewclippath(gs_state * pgs) { gx_path cpath; gx_clip_path *pcpath = pgs->view_clip; int code; gx_path_init_local(&cpath, pgs->memory); if (pcpath == 0 || pcpath->rule == 0) { /* No view clip path is active: fabricate one. */ gs_fixed_rect box; code = gx_default_clip_box(pgs, &box); if (code < 0) return code; code = gx_path_add_rectangle(&cpath, box.p.x, box.p.y, box.q.x, box.q.y); } else { code = gx_cpath_to_path(pcpath, &cpath); } if (code < 0) return code; return gx_path_assign_free(pgs->path, &cpath); }