/* Define the default implementation of ImageType 3 processing. */ static IMAGE3_MAKE_MID_PROC(make_mid_default); /* check prototype */ static int make_mid_default(gx_device **pmidev, gx_device *dev, int width, int height, gs_memory_t *mem) { gx_device_memory *midev = gs_alloc_struct(mem, gx_device_memory, &st_device_memory, "make_mid_default"); int code; if (midev == 0) return_error(gs_error_VMerror); gs_make_mem_mono_device(midev, mem, NULL); midev->bitmap_memory = mem; midev->width = width; midev->height = height; check_device_separable((gx_device *)midev); gx_device_fill_in_procs((gx_device *)midev); code = dev_proc(midev, open_device)((gx_device *)midev); if (code < 0) { gs_free_object(mem, midev, "make_mid_default"); return code; } midev->is_open = true; dev_proc(midev, fill_rectangle) ((gx_device *)midev, 0, 0, width, height, (gx_color_index)0); *pmidev = (gx_device *)midev; return 0; }
RELOC_PTRS_END /* Initialize a mask clipping device. */ int gx_mask_clip_initialize(gx_device_mask_clip * cdev, const gx_device_mask_clip * proto, const gx_bitmap * bits, gx_device * tdev, int tx, int ty, gs_memory_t *mem) { int buffer_width = bits->size.x; int buffer_height = tile_clip_buffer_size / (bits->raster + sizeof(byte *)); gx_device_init((gx_device *)cdev, (const gx_device *)proto, mem, true); cdev->width = tdev->width; cdev->height = tdev->height; cdev->color_info = tdev->color_info; gx_device_set_target((gx_device_forward *)cdev, tdev); cdev->phase.x = -tx; cdev->phase.y = -ty; if (buffer_height > bits->size.y) buffer_height = bits->size.y; gs_make_mem_mono_device(&cdev->mdev, 0, 0); for (;;) { ulong bitmap_size = max_ulong; if (buffer_height <= 0) { /* * The tile is too wide to buffer even one scan line. * We could do copy_mono in chunks, but for now, we punt. */ cdev->mdev.base = 0; return_error(gs_error_VMerror); } cdev->mdev.width = buffer_width; cdev->mdev.height = buffer_height; gdev_mem_bitmap_size(&cdev->mdev, &bitmap_size); if (bitmap_size <= tile_clip_buffer_size) break; buffer_height--; } cdev->mdev.base = cdev->buffer.bytes; return (*dev_proc(&cdev->mdev, open_device))((gx_device *)&cdev->mdev); }