/* <gstate> currentgstate <gstate> */ int zcurrentgstate(i_ctx_t *i_ctx_p) { os_ptr op = osp; gs_state *pgs; int_gstate *pistate; int code; gs_memory_t *mem; check_stype(*op, st_igstate_obj); check_write(*op); code = gstate_unshare(i_ctx_p); if (code < 0) return code; pgs = igstate_ptr(op); pistate = gs_int_gstate(pgs); code = gstate_check_space(i_ctx_p, istate, r_space(op)); if (code < 0) return code; #define gsref_save(p) ref_save(op, p, "currentgstate") int_gstate_map_refs(pistate, gsref_save); #undef gsref_save mem = gs_state_swap_memory(pgs, imemory); code = gs_currentgstate(pgs, igs); gs_state_swap_memory(pgs, mem); if (code < 0) return code; int_gstate_map_refs(pistate, ref_mark_new); return 0; }
/* <gstate> setgstate - */ static int z2setgstate(i_ctx_t *i_ctx_p) { os_ptr op = osp; check_stype(*op, st_igstate_obj); if (!restore_page_device(igs, igstate_ptr(op))) return zsetgstate(i_ctx_p); return push_callout(i_ctx_p, "%setgstatepagedevice"); }
/* <gstate> setgstate - */ int zsetgstate(i_ctx_t *i_ctx_p) { os_ptr op = osp; int code; check_stype(*op, st_igstate_obj); check_read(*op); code = gs_setgstate(igs, igstate_ptr(op)); if (code < 0) return code; pop(1); return 0; }
/* Common code for composite and dissolve. */ static int composite_image(i_ctx_t *i_ctx_p, const gs_composite_alpha_params_t * params) { os_ptr op = osp; alpha_composite_state_t cstate; gs_image2_t image; double src_rect[4]; double dest_pt[2]; gs_matrix save_ctm; int code = xywh_param(op - 4, src_rect); cstate.params = *params; gs_image2_t_init(&image); if (code < 0 || (code = num_params(op - 1, 2, dest_pt)) < 0 ) return code; if (r_has_type(op - 3, t_null)) image.DataSource = igs; else { check_stype(op[-3], st_igstate_obj); check_read(op[-3]); image.DataSource = igstate_ptr(op - 3); } image.XOrigin = src_rect[0]; image.YOrigin = src_rect[1]; image.Width = src_rect[2]; image.Height = src_rect[3]; image.PixelCopy = true; /* Compute appropriate transformations. */ gs_currentmatrix(igs, &save_ctm); gs_translate(igs, dest_pt[0], dest_pt[1]); gs_make_identity(&image.ImageMatrix); if (image.DataSource == igs) { image.XOrigin -= dest_pt[0]; image.YOrigin -= dest_pt[1]; } code = begin_composite(i_ctx_p, &cstate); if (code >= 0) { code = process_non_source_image(i_ctx_p, (const gs_image_common_t *)&image, "composite_image"); end_composite(i_ctx_p, &cstate); if (code >= 0) pop(8); } gs_setmatrix(igs, &save_ctm); return code; }
/* copy for gstates */ int zcopy_gstate(i_ctx_t *i_ctx_p) { os_ptr op = osp; os_ptr op1 = op - 1; gs_state *pgs; gs_state *pgs1; int_gstate *pistate; gs_memory_t *mem; int code; check_stype(*op, st_igstate_obj); check_stype(*op1, st_igstate_obj); check_write(*op); code = gstate_unshare(i_ctx_p); if (code < 0) return code; pgs = igstate_ptr(op); pgs1 = igstate_ptr(op1); pistate = gs_int_gstate(pgs); code = gstate_check_space(i_ctx_p, gs_int_gstate(pgs1), r_space(op)); if (code < 0) return code; #define gsref_save(p) ref_save(op, p, "copygstate") int_gstate_map_refs(pistate, gsref_save); #undef gsref_save mem = gs_state_swap_memory(pgs, imemory); code = gs_copygstate(pgs, pgs1); gs_state_swap_memory(pgs, mem); if (code < 0) return code; int_gstate_map_refs(pistate, ref_mark_new); *op1 = *op; pop(1); return 0; }