/* * Add a new saved page to the end of an in memory list. Refer to the * documentation for gx_saved_pages_list. This allocates the saved_ * page as well as the saved_pages_list_element and relies on the * gdev_prn_save_page to use non_gc_memory since this list is never * in GC memory. */ int gx_saved_pages_list_add(gx_device_printer * pdev) { gx_saved_pages_list *list = pdev->saved_pages_list; gx_saved_pages_list_element *new_list_element; gx_saved_page *newpage; int code; if ((newpage = (gx_saved_page *)gs_alloc_bytes(list->mem, sizeof(gx_saved_page), "gx_saved_pages_list_add")) == NULL) return_error (gs_error_VMerror); if ((new_list_element = (gx_saved_pages_list_element *)gs_alloc_bytes(list->mem, sizeof(gx_saved_pages_list_element), "gx_saved_pages_list_add")) == NULL) { gs_free_object(list->mem, newpage, "gx_saved_pages_list_add"); return_error (gs_error_VMerror); } if ((code = gdev_prn_save_page(pdev, newpage)) < 0) { gs_free_object(list->mem, new_list_element, "gx_saved_pages_list_add"); gs_free_object(list->mem, newpage, "gx_saved_pages_list_add"); return code; } new_list_element->sequence_number = ++list->count; new_list_element->page = newpage; new_list_element->next = NULL; if (list->tail == NULL) { /* list was empty, start it */ new_list_element->prev = NULL; list->head = list->tail = new_list_element; } else { /* place as new tail */ new_list_element->prev = list->tail; list->tail->next = new_list_element; list->tail = new_list_element; } return 0; /* success */ }
/* Write the page. */ static int pcx2up_print_page(gx_device_printer * pdev, FILE * file) { gx_device_2up *pdev2 = (gx_device_2up *) pdev; const gx_device_printer *prdev_template = (const gx_device_printer *)&gs_pcx2up_device; if (!pdev2->have_odd_page) { /* This is the odd page, just save it. */ pdev2->have_odd_page = true; return gdev_prn_save_page(pdev, &pdev2->odd_page, 1); } else { /* This is the even page, do 2-up output. */ gx_saved_page even_page; gx_placed_page pages[2]; int x_offset = (int)(pdev->HWResolution[0] * 0.5); int code = gdev_prn_save_page(pdev, &even_page, 1); int prdev_size = prdev_template->params_size; gx_device_printer *prdev; #define rdev ((gx_device *)prdev) if (code < 0) return code; /* Create the placed page list. */ pages[0].page = &pdev2->odd_page; pages[0].offset.x = x_offset; pages[0].offset.y = 0 /*y_offset */ ; pages[1].page = &even_page; pages[1].offset.x = pdev->width + x_offset * 3; pages[1].offset.y = 0 /*y_offset */ ; /* Create and open a device for rendering. */ prdev = (gx_device_printer *) gs_alloc_bytes(pdev->memory, prdev_size, "pcx2up_print_page(device)"); if (prdev == 0) return_error(gs_error_VMerror); memcpy(prdev, prdev_template, prdev_size); check_device_separable((gx_device *)rdev); gx_device_fill_in_procs(rdev); set_dev_proc(prdev, open_device, dev_proc(&gs_pcx256_device, open_device)); prdev->printer_procs.print_page = gs_pcx256_device.printer_procs.print_page; prdev->space_params.band = pages[0].page->info.band_params; /* either one will do */ prdev->space_params.MaxBitmap = 0; prdev->space_params.BufferSpace = prdev->space_params.band.BandBufferSpace; prdev->width = prdev->space_params.band.BandWidth; prdev->OpenOutputFile = false; code = (*dev_proc(rdev, open_device)) (rdev); if (code < 0) return code; rdev->is_open = true; prdev->file = pdev->file; /* Render the pages. */ code = gdev_prn_render_pages(prdev, pages, 2); /* Clean up. */ if (pdev->file != 0) prdev->file = 0; /* don't close it */ gs_closedevice(rdev); pdev2->have_odd_page = false; return code; #undef rdev } }