/* Get the device parameters. */ int gs_get_device_or_hw_params(gx_device * orig_dev, gs_param_list * plist, bool is_hardware) { /* * We must be prepared to copy the device if it is the read-only * prototype. */ gx_device *dev; int code; if (orig_dev->memory) dev = orig_dev; else { code = gs_copydevice(&dev, orig_dev, plist->memory); if (code < 0) return code; } gx_device_set_procs(dev); fill_dev_proc(dev, get_params, gx_default_get_params); fill_dev_proc(dev, get_page_device, gx_default_get_page_device); fill_dev_proc(dev, get_alpha_bits, gx_default_get_alpha_bits); code = (is_hardware ? (*dev_proc(dev, get_hardware_params)) (dev, plist) : (*dev_proc(dev, get_params)) (dev, plist)); if (dev != orig_dev) gx_device_retain(dev, false); /* frees the copy */ return code; }
/* Forward the color mapping procedures from a device to its target. */ void gx_device_forward_color_procs(gx_device_forward * dev) { set_dev_proc(dev, map_rgb_color, gx_forward_map_rgb_color); set_dev_proc(dev, map_color_rgb, gx_forward_map_color_rgb); set_dev_proc(dev, map_cmyk_color, gx_forward_map_cmyk_color); set_dev_proc(dev, map_rgb_alpha_color, gx_forward_map_rgb_alpha_color); set_dev_proc(dev, get_color_mapping_procs, gx_forward_get_color_mapping_procs); set_dev_proc(dev, get_color_comp_index, gx_forward_get_color_comp_index); set_dev_proc(dev, encode_color, gx_forward_encode_color); set_dev_proc(dev, decode_color, gx_forward_decode_color); set_dev_proc(dev, get_profile, gx_forward_get_profile); /* Not strictly a color proc, but may affect color encoding */ fill_dev_proc(dev, set_graphics_type_tag, gx_forward_set_graphics_type_tag); fill_dev_proc(dev, dev_spec_op, gx_forward_dev_spec_op); }
/* Get the color map for a device. Return true if there is one. */ static bool param_HWColorMap(gx_device * dev, byte * palette /* 3 << 8 */ ) { int depth = dev->color_info.depth; int colors = dev->color_info.num_components; if (depth <= 8 && colors <= 3) { byte *p = palette; gx_color_value rgb[3]; gx_color_index i; fill_dev_proc(dev, map_color_rgb, gx_default_map_color_rgb); for (i = 0; (i >> depth) == 0; i++) { int j; if ((*dev_proc(dev, map_color_rgb)) (dev, i, rgb) < 0) return false; for (j = 0; j < colors; j++) *p++ = gx_color_value_to_byte(rgb[j]); } return true; }
/* drawing operations. */ void gx_device_forward_fill_in_procs(register gx_device_forward * dev) { gx_device_set_procs((gx_device *) dev); /* NOT open_device */ fill_dev_proc(dev, get_initial_matrix, gx_forward_get_initial_matrix); fill_dev_proc(dev, sync_output, gx_forward_sync_output); fill_dev_proc(dev, output_page, gx_forward_output_page); /* NOT close_device */ fill_dev_proc(dev, map_rgb_color, gx_forward_map_rgb_color); fill_dev_proc(dev, map_color_rgb, gx_forward_map_color_rgb); /* NOT fill_rectangle */ /* NOT tile_rectangle */ /* NOT copy_mono */ /* NOT copy_color */ /* NOT draw_line (OBSOLETE) */ fill_dev_proc(dev, get_bits, gx_forward_get_bits); fill_dev_proc(dev, get_params, gx_forward_get_params); fill_dev_proc(dev, put_params, gx_forward_put_params); fill_dev_proc(dev, map_cmyk_color, gx_forward_map_cmyk_color); fill_dev_proc(dev, get_xfont_procs, gx_forward_get_xfont_procs); fill_dev_proc(dev, get_xfont_device, gx_forward_get_xfont_device); fill_dev_proc(dev, map_rgb_alpha_color, gx_forward_map_rgb_alpha_color); fill_dev_proc(dev, get_page_device, gx_forward_get_page_device); /* NOT get_alpha_bits (OBSOLETE) */ /* NOT copy_alpha */ fill_dev_proc(dev, get_band, gx_forward_get_band); fill_dev_proc(dev, copy_rop, gx_forward_copy_rop); fill_dev_proc(dev, fill_path, gx_forward_fill_path); fill_dev_proc(dev, stroke_path, gx_forward_stroke_path); fill_dev_proc(dev, fill_mask, gx_forward_fill_mask); fill_dev_proc(dev, fill_trapezoid, gx_forward_fill_trapezoid); fill_dev_proc(dev, fill_parallelogram, gx_forward_fill_parallelogram); fill_dev_proc(dev, fill_triangle, gx_forward_fill_triangle); fill_dev_proc(dev, draw_thin_line, gx_forward_draw_thin_line); fill_dev_proc(dev, begin_image, gx_forward_begin_image); /* NOT image_data (OBSOLETE) */ /* NOT end_image (OBSOLETE) */ /* NOT strip_tile_rectangle */ fill_dev_proc(dev, strip_copy_rop, gx_forward_strip_copy_rop); fill_dev_proc(dev, get_clipping_box, gx_forward_get_clipping_box); fill_dev_proc(dev, begin_typed_image, gx_forward_begin_typed_image); fill_dev_proc(dev, get_bits_rectangle, gx_forward_get_bits_rectangle); fill_dev_proc(dev, map_color_rgb_alpha, gx_forward_map_color_rgb_alpha); fill_dev_proc(dev, create_compositor, gx_no_create_compositor); fill_dev_proc(dev, get_hardware_params, gx_forward_get_hardware_params); fill_dev_proc(dev, text_begin, gx_forward_text_begin); fill_dev_proc(dev, get_color_mapping_procs, gx_forward_get_color_mapping_procs); fill_dev_proc(dev, get_color_comp_index, gx_forward_get_color_comp_index); fill_dev_proc(dev, encode_color, gx_forward_encode_color); fill_dev_proc(dev, decode_color, gx_forward_decode_color); fill_dev_proc(dev, pattern_manage, gx_forward_pattern_manage); fill_dev_proc(dev, fill_rectangle_hl_color, gx_forward_fill_rectangle_hl_color); fill_dev_proc(dev, include_color_space, gx_forward_include_color_space); fill_dev_proc(dev, fill_linear_color_scanline, gx_forward_fill_linear_color_scanline); fill_dev_proc(dev, fill_linear_color_trapezoid, gx_forward_fill_linear_color_trapezoid); fill_dev_proc(dev, fill_linear_color_triangle, gx_forward_fill_linear_color_triangle); fill_dev_proc(dev, update_spot_equivalent_colors, gx_forward_update_spot_equivalent_colors); fill_dev_proc(dev, ret_devn_params, gx_forward_ret_devn_params); fill_dev_proc(dev, fillpage, gx_forward_fillpage); gx_device_fill_in_procs((gx_device *) dev); }