/* <frequency> <angle> <proc> setscreen - */ static int zsetscreen(i_ctx_t *i_ctx_p) { os_ptr op = osp; gs_screen_halftone screen; gx_ht_order order; int code = zscreen_params(op, &screen); gs_memory_t *mem; int space_index = r_space_index(op); if (code < 0) return code; mem = (gs_memory_t *)idmemory->spaces_indexed[space_index]; /* * Allocate the halftone in the same VM space as the procedure. * This keeps the space relationships consistent. */ code = gs_screen_order_init_memory(&order, igs, &screen, gs_currentaccuratescreens(mem), mem); if (code < 0) return code; return zscreen_enum_init(i_ctx_p, &order, &screen, op, 3, setscreen_finish, space_index); }
static int zsetcolorscreen(i_ctx_t *i_ctx_p) { os_ptr op = osp; gs_colorscreen_halftone cscreen; ref sprocs[4]; gs_halftone *pht; gx_device_halftone *pdht; int i; int code = 0; int space = 0; gs_memory_t *mem; for (i = 0; i < 4; i++) { os_ptr op1 = op - 9 + i * 3; int code = zscreen_params(op1, &cscreen.screens.indexed[i]); if (code < 0) return code; cscreen.screens.indexed[i].spot_function = spot_dummy; sprocs[i] = *op1; space = max(space, r_space_index(op1)); } mem = (gs_memory_t *)idmemory->spaces_indexed[space]; check_estack(8); /* for sampling screens */ rc_alloc_struct_0(pht, gs_halftone, &st_halftone, mem, pht = 0, "setcolorscreen(halftone)"); rc_alloc_struct_0(pdht, gx_device_halftone, &st_device_halftone, mem, pdht = 0, "setcolorscreen(device halftone)"); if (pht == 0 || pdht == 0) code = gs_note_error(e_VMerror); else { pht->type = ht_type_colorscreen; pht->params.colorscreen = cscreen; code = gs_sethalftone_prepare(igs, pht, pdht); } if (code >= 0) { /* Schedule the sampling of the screens. */ es_ptr esp0 = esp; /* for backing out */ esp += 8; make_mark_estack(esp - 7, es_other, setcolorscreen_cleanup); memcpy(esp - 6, sprocs, sizeof(ref) * 4); /* procs */ make_istruct(esp - 2, 0, pht); make_istruct(esp - 1, 0, pdht); make_op_estack(esp, setcolorscreen_finish); for (i = 0; i < 4; i++) { /* Shuffle the indices to correspond to */ /* the component order. */ code = zscreen_enum_init(i_ctx_p, &pdht->components[(i + 1) & 3].corder, &pht->params.colorscreen.screens.indexed[i], &sprocs[i], 0, 0, space); if (code < 0) { esp = esp0; break; } } } if (code < 0) { gs_free_object(mem, pdht, "setcolorscreen(device halftone)"); gs_free_object(mem, pht, "setcolorscreen(halftone)"); return code; } pop(12); return o_push_estack; }