int gs_push_device_filter(gs_memory_t *mem, gs_state *pgs, gs_device_filter_t *df) { gs_device_filter_stack_t *dfs; gx_device *new_dev = NULL; int code; dfs = gs_alloc_struct(mem, gs_device_filter_stack_t, &st_gs_device_filter_stack, "gs_push_device_filter"); if (dfs == NULL) return_error(gs_error_VMerror); rc_increment(pgs->device); dfs->next_device = pgs->device; code = df->push(df, mem, pgs, &new_dev, pgs->device); if (code < 0) { gs_free_object(mem, dfs, "gs_push_device_filter"); return code; } dfs->next = pgs->dfilter_stack; pgs->dfilter_stack = dfs; dfs->df = df; rc_init(dfs, mem, 1); gs_setdevice_no_init(pgs, new_dev); rc_decrement_only(new_dev, "gs_push_device_filter"); return code; }
/* End a compositing operation. */ static void end_composite(i_ctx_t *i_ctx_p, alpha_composite_state_t * pcp) { /* Close and free the compositor and the compositing object. */ if (pcp->cdev != pcp->orig_dev) { gs_closedevice(pcp->cdev); /* also frees the device */ gs_setdevice_no_init(igs, pcp->orig_dev); } ifree_object(pcp->pcte, "end_composite(gs_composite_t)"); }
/* Begin a compositing operation. */ static int begin_composite(i_ctx_t *i_ctx_p, alpha_composite_state_t * pcp) { gx_device *dev = gs_currentdevice(igs); int code = gs_create_composite_alpha(&pcp->pcte, &pcp->params, imemory); if (code < 0) return code; pcp->orig_dev = pcp->cdev = dev; /* for end_composite */ code = (*dev_proc(dev, create_compositor)) (dev, &pcp->cdev, pcp->pcte, (gs_imager_state *)igs, imemory, NULL); if (code < 0) { end_composite(i_ctx_p, pcp); return code; } gs_setdevice_no_init(igs, pcp->cdev); return 0; }
int gs_pop_device_filter(gs_memory_t *mem, gs_state *pgs) { gs_device_filter_stack_t *dfs_tos = pgs->dfilter_stack; gx_device *tos_device = pgs->device; gs_device_filter_t *df; int code; if (dfs_tos == NULL) return_error(gs_error_rangecheck); df = dfs_tos->df; pgs->dfilter_stack = dfs_tos->next; code = df->prepop(df, mem, pgs, tos_device); rc_increment(tos_device); gs_setdevice_no_init(pgs, dfs_tos->next_device); rc_decrement_only(dfs_tos->next_device, "gs_pop_device_filter"); dfs_tos->df = NULL; rc_decrement_only(dfs_tos, "gs_pop_device_filter"); code = df->postpop(df, mem, pgs, tos_device); rc_decrement_only(tos_device, "gs_pop_device_filter"); return code; }