Example #1
0
/*
 * 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 */
}
Example #2
0
/* 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
    }
}