/* * ESC * v <nbytes> W * * This command creates only the basic element of the the palette: the cid_data * array. Other parts are created as needed. */ static int pcl_configure_image_data(pcl_args_t * pargs, pcl_state_t * pcs) { if (pcs->personality == pcl5e || pcs->raster_state.graphics_mode) return 0; #ifdef DEBUG if (gs_debug_c('i')) { pcl_debug_dump_data(pcs->memory, arg_data(pargs), uint_arg(pargs)); } #endif return install_cid_data(uint_arg(pargs), arg_data(pargs), pcs, false, false); }
static int set_logical_page(pcl_args_t * pargs, pcl_state_t * pcs) { uint count = uint_arg(pargs); const pcl_logical_page_t *plogpage = (pcl_logical_page_t *) arg_data(pargs); pcl_paper_size_t *pcur_paper; #ifdef DEBUG if (gs_debug_c('i')) { pcl_debug_dump_data(pcs->memory, arg_data(pargs), uint_arg(pargs)); } #endif /* the currently selected paper size */ pcur_paper = (pcl_paper_size_t *) pcs->xfm_state.paper_size; /* the command can set width, height and offsets (10) or just offsets (4) */ if (count != 10 && count != 4) return e_Range; if (count == 10) { pcur_paper->width = pl_get_uint16(plogpage->Width) * 10; pcur_paper->height = pl_get_uint16(plogpage->Height) * 10; if (pcur_paper->width == 0 || pcur_paper->height == 0) return e_Range; } pcur_paper->offset_portrait = pl_get_int16(plogpage->LeftOffset) * 10; pcur_paper->offset_landscape = pl_get_int16(plogpage->TopOffset) * 10; new_page_size(pcs, pcur_paper, false, false); gs_erasepage(pcs->pgs); pcs->page_marked = false; return 0; }
/* * ESC * l <nbytes> W * * Set color lookup table. */ static int set_lookup_tbl(pcl_args_t * pargs, pcl_state_t * pcs) { uint len = uint_arg(pargs); pcl_lookup_tbl_t *plktbl = 0; pcl__lookup_tbl_t *ptbl = 0; int code = 0; #ifdef DEBUG if (gs_debug_c('i')) { pcl_debug_dump_data(pcs->memory, arg_data(pargs), uint_arg(pargs)); } #endif if (pcs->personality == pcl5e || pcs->raster_state.graphics_mode) return 0; /* check for clearing of lookup tables, and for incorrect size */ if (len == 0) return pcl_palette_set_lookup_tbl(pcs, NULL); else if (len != sizeof(pcl__lookup_tbl_t)) return e_Range; rc_alloc_struct_1(plktbl, pcl_lookup_tbl_t, &st_lookup_tbl_t, pcs->memory, return e_Memory, "set color lookup table"); plktbl->rc.free = free_lookup_tbl; plktbl->ptbl = 0; /* either take possession of buffer, or allocate a new one */ if (pargs->data_on_heap) { ptbl = (pcl__lookup_tbl_t *) arg_data(pargs); arg_data(pargs) = 0; } else { ptbl = (pcl__lookup_tbl_t *) gs_alloc_bytes(pcs->memory, sizeof(pcl__lookup_tbl_t), "set color lookup table"); if (ptbl == 0) { free_lookup_tbl(plktbl->rc.memory, plktbl, "set color lookup table"); return e_Memory; } memcpy(ptbl, arg_data(pargs), sizeof(pcl__lookup_tbl_t)); } plktbl->ptbl = ptbl; /* for the CMY color space, convert to RGB color space */ if (pcl_lookup_tbl_get_cspace(plktbl) == pcl_cspace_CMY) { int i; for (i = 0; i < 128; i++) { byte b1 = ptbl->data[i]; byte b2 = ptbl->data[255 - i]; ptbl->data[i] = 255 - b2; ptbl->data[255 - i] = 255 - b1; } ptbl->cspace = (byte) pcl_cspace_RGB; } /* update the current palette; release our reference to the lookup table */ code = pcl_palette_set_lookup_tbl(pcs, plktbl); pcl_lookup_tbl_release(plktbl); return code; }