[gs-cvs] rev 8843 - trunk/gs/src

giles at ghostscript.com giles at ghostscript.com
Tue Jul 15 13:29:14 PDT 2008


Author: giles
Date: 2008-07-15 13:29:13 -0700 (Tue, 15 Jul 2008)
New Revision: 8843

Removed:
   trunk/gs/src/gdevpnga.c
Modified:
   trunk/gs/src/devs.mak
Log:
Remove the obsolete pnga device. Bug 689971.

This was a test framework used in the development of the PDF 1.4
compositor. It's no longer used.


Modified: trunk/gs/src/devs.mak
===================================================================
--- trunk/gs/src/devs.mak	2008-07-15 13:27:29 UTC (rev 8842)
+++ trunk/gs/src/devs.mak	2008-07-15 20:29:13 UTC (rev 8843)
@@ -1531,18 +1531,6 @@
 	$(SETPDEV2) $(DD)pngalpha $(png_)
 	$(ADDMOD) $(DD)pngalpha $(png_i_)
 
-### -------------------- PNG with transparency -------------------- ###
-
-pnga_=$(GLOBJ)gdevpnga.$(OBJ)
-$(DD)pnga.dev :	$(pnga_)
-	$(SETDEV) $(DD)pnga $(pnga_)
-
-$(GLOBJ)gdevpnga.$(OBJ) : $(GLSRC)gdevpnga.c $(png__h)\
- $(gscdefs_h) $(gsdevice_h) $(gxblend_h) $(gxtext_h)\
- $(gdevmem_h) $(gdevpccm_h) $(gdevprn_h)
-	$(CC_) $(I_)$(GLI_) $(II)$(PI_)$(_I) $(PCF_) $(GLF_) $(GLO_)gdevpnga.$(OBJ) $(C_) $(GLSRC)gdevpnga.c
-
-
 ### --------------------- WTS Halftoning drivers ----------------------  ###
 
 ### IMDI from Argyll

Deleted: trunk/gs/src/gdevpnga.c
===================================================================
--- trunk/gs/src/gdevpnga.c	2008-07-15 13:27:29 UTC (rev 8842)
+++ trunk/gs/src/gdevpnga.c	2008-07-15 20:29:13 UTC (rev 8843)
@@ -1,1112 +0,0 @@
-/* Copyright (C) 2001-2006 Artifex Software, Inc.
-   All Rights Reserved.
-  
-   This software is provided AS-IS with no warranty, either express or
-   implied.
-
-   This software is distributed under license and may not be copied, modified
-   or distributed except as expressly authorized under the terms of that
-   license.  Refer to licensing information at http://www.artifex.com/
-   or contact Artifex Software, Inc.,  7 Mt. Lassen Drive - Suite A-134,
-   San Rafael, CA  94903, U.S.A., +1(415)492-9861, for further information.
-*/
-
-/* $Id$ */
-/* Test driver for PDF 1.4 transparency stuff */
-
-#include "gdevprn.h"
-#include "gdevpccm.h"
-#include "gscdefs.h"
-#include "gsdevice.h"
-#include "gdevmem.h"
-#include "gxcindex.h"
-#include "gxblend.h"
-#include "gxtext.h"
-
-# define INCR(v) DO_NOTHING
-
-#define PNG_INTERNAL
-/*
- * libpng versions 1.0.3 and later allow disabling access to the stdxxx
- * files while retaining support for FILE * I/O.
- */
-#define PNG_NO_CONSOLE_IO
-/*
- * Earlier libpng versions require disabling FILE * I/O altogether.
- * This produces a compiler warning about no prototype for png_init_io.
- * The right thing will happen at link time, since the library itself
- * is compiled with stdio support.  Unfortunately, we can't do this
- * conditionally depending on PNG_LIBPNG_VER, because this is defined
- * in png.h.
- */
-/*#define PNG_NO_STDIO*/
-#include "png_.h"
-
-/* Buffer stack data structure */
-
-#define PDF14_MAX_PLANES 16
-
-typedef struct pdf14_buf_s pdf14_buf;
-typedef struct pdf14_ctx_s pdf14_ctx;
-
-struct pdf14_buf_s {
-    pdf14_buf *saved;
-
-    bool isolated;
-    bool knockout;
-    byte alpha;
-    byte shape;
-    gs_blend_mode_t blend_mode;
-
-    bool has_alpha_g;
-    bool has_shape;
-
-    gs_int_rect rect;
-    /* Note: the traditional GS name for rowstride is "raster" */
-
-    /* Data is stored in planar format. Order of planes is: pixel values,
-       alpha, shape if present, alpha_g if present. */
-
-    int rowstride;
-    int planestride;
-    int n_chan; /* number of pixel planes including alpha */
-    int n_planes; /* total number of planes including alpha, shape, alpha_g */
-    byte *data;
-};
-
-struct pdf14_ctx_s {
-    pdf14_buf *stack;
-    gs_memory_t *memory;
-    gs_int_rect rect;
-    int n_chan;
-};
-
-/* GC procedures for buffer stack */
-
-static
-ENUM_PTRS_WITH(pdf14_buf_enum_ptrs, pdf14_buf *buf)
-    return 0;
-    case 0: return ENUM_OBJ(buf->saved);
-    case 1: return ENUM_OBJ(buf->data);
-ENUM_PTRS_END
-
-static
-RELOC_PTRS_WITH(pdf14_buf_reloc_ptrs, pdf14_buf *buf)
-{
-    RELOC_VAR(buf->saved);
-    RELOC_VAR(buf->data);
-}
-RELOC_PTRS_END
-
-gs_private_st_composite(st_pdf14_buf, pdf14_buf, "pdf14_buf",
-			pdf14_buf_enum_ptrs, pdf14_buf_reloc_ptrs);
-
-gs_private_st_ptrs1(st_pdf14_ctx, pdf14_ctx, "pdf14_ctx",
-		    pdf14_ctx_enum_ptrs, pdf14_ctx_reloc_ptrs,
-		    stack);
-
-/* ------ The device descriptors ------ */
-
-/*
- * Default X and Y resolution.
- */
-#define X_DPI 72
-#define Y_DPI 72
-
-static int pnga_open(gx_device * pdev);
-static dev_proc_close_device(pnga_close);
-static int pnga_output_page(gx_device * pdev, int num_copies, int flush);
-static dev_proc_fill_rectangle(pnga_fill_rectangle);
-static dev_proc_fill_path(pnga_fill_path);
-static dev_proc_stroke_path(pnga_stroke_path);
-static dev_proc_begin_typed_image(pnga_begin_typed_image);
-static dev_proc_text_begin(pnga_text_begin);
-static dev_proc_begin_transparency_group(pnga_begin_transparency_group);
-static dev_proc_end_transparency_group(pnga_end_transparency_group);
-
-#define XSIZE (8.5 * X_DPI)	/* 8.5 x 11 inch page, by default */
-#define YSIZE (11 * Y_DPI)
-
-/* 24-bit color. */
-
-static const gx_device_procs pnga_procs =
-{
-	pnga_open,			/* open */
-	NULL,	/* get_initial_matrix */
-	NULL,	/* sync_output */
-	pnga_output_page,		/* output_page */
-	pnga_close,			/* close */
-	gx_default_rgb_map_rgb_color,
-	gx_default_rgb_map_color_rgb,
-	pnga_fill_rectangle,	/* fill_rectangle */
-	NULL,	/* tile_rectangle */
-	NULL,	/* copy_mono */
-	NULL,	/* copy_color */
-	NULL,	/* draw_line */
-	NULL,	/* get_bits */
-	NULL,   /* get_params */
-	NULL,   /* put_params */
-	NULL,	/* map_cmyk_color */
-	NULL,	/* get_xfont_procs */
-	NULL,	/* get_xfont_device */
-	NULL,	/* map_rgb_alpha_color */
-#if 0
-	gx_page_device_get_page_device,	/* get_page_device */
-#else
-	NULL,   /* get_page_device */
-#endif
-	NULL,	/* get_alpha_bits */
-	NULL,	/* copy_alpha */
-	NULL,	/* get_band */
-	NULL,	/* copy_rop */
-	pnga_fill_path,		/* fill_path */
-	pnga_stroke_path,	/* stroke_path */
-	NULL,	/* fill_mask */
-	NULL,	/* fill_trapezoid */
-	NULL,	/* fill_parallelogram */
-	NULL,	/* fill_triangle */
-	NULL,	/* draw_thin_line */
-	NULL,	/* begin_image */
-	NULL,	/* image_data */
-	NULL,	/* end_image */
-	NULL,	/* strip_tile_rectangle */
-	NULL,	/* strip_copy_rop, */
-	NULL,	/* get_clipping_box */
-	pnga_begin_typed_image,	/* begin_typed_image */
-	NULL,	/* get_bits_rectangle */
-	NULL,	/* map_color_rgb_alpha */
-	NULL,	/* create_compositor */
-	NULL,	/* get_hardware_params */
-	pnga_text_begin,	/* text_begin */
-	NULL,	/* finish_copydevice */
-	pnga_begin_transparency_group,
-	pnga_end_transparency_group
-};
-
-typedef struct pnga_device_s {
-    gx_device_common;
-
-    pdf14_ctx *ctx;
-
-} pnga_device;
-
-gs_private_st_composite_use_final(st_pnga_device, pnga_device, "pnga_device",
-				  pnga_device_enum_ptrs, pnga_device_reloc_ptrs,
-				  gx_device_finalize);
-
-const gx_device_printer gs_pnga_device = {
-    std_device_color_stype_body(pnga_device, &pnga_procs, "pnga",
-				&st_pnga_device,
-				XSIZE, YSIZE, X_DPI, Y_DPI, 24, 255, 0),
-    { 0 }
-};
-
-#if 0
-prn_device(pnga_procs, "pnga",
-	   DEFAULT_WIDTH_10THS, DEFAULT_HEIGHT_10THS,
-	   X_DPI, Y_DPI,
-	   0, 0, 0, 0,		/* margins */
-	   24, pnga_print_page);
-#endif
-
-/* GC procedures */
-static 
-ENUM_PTRS_WITH(pnga_device_enum_ptrs, pnga_device *pdev) return 0;
-case 0: return ENUM_OBJ(pdev->ctx);
-ENUM_PTRS_END
-static RELOC_PTRS_WITH(pnga_device_reloc_ptrs, pnga_device *pdev)
-{
-    RELOC_VAR(pdev->ctx);
-}
-RELOC_PTRS_END
-
-/* ------ The device descriptors for the marking device ------ */
-
-static dev_proc_fill_rectangle(pnga_mark_fill_rectangle);
-static dev_proc_fill_rectangle(pnga_mark_fill_rectangle_ko_simple);
-
-static const gx_device_procs pnga_mark_procs =
-{
-	NULL,	/* open */
-	NULL,	/* get_initial_matrix */
-	NULL,	/* sync_output */
-	NULL,	/* output_page */
-	NULL,	/* close */
-	gx_default_rgb_map_rgb_color,
-	gx_default_rgb_map_color_rgb,
-	NULL,	/* fill_rectangle */
-	NULL,	/* tile_rectangle */
-	NULL,	/* copy_mono */
-	NULL,	/* copy_color */
-	NULL,	/* draw_line */
-	NULL,	/* get_bits */
-	NULL,   /* get_params */
-	NULL,   /* put_params */
-	NULL,	/* map_cmyk_color */
-	NULL,	/* get_xfont_procs */
-	NULL,	/* get_xfont_device */
-	NULL,	/* map_rgb_alpha_color */
-#if 0
-	gx_page_device_get_page_device,	/* get_page_device */
-#else
-	NULL,   /* get_page_device */
-#endif
-	NULL,	/* get_alpha_bits */
-	NULL,	/* copy_alpha */
-	NULL,	/* get_band */
-	NULL,	/* copy_rop */
-	NULL,	/* fill_path */
-	NULL,	/* stroke_path */
-	NULL,	/* fill_mask */
-	NULL,	/* fill_trapezoid */
-	NULL,	/* fill_parallelogram */
-	NULL,	/* fill_triangle */
-	NULL,	/* draw_thin_line */
-	NULL,	/* begin_image */
-	NULL,	/* image_data */
-	NULL,	/* end_image */
-	NULL,	/* strip_tile_rectangle */
-	NULL,	/* strip_copy_rop, */
-	NULL,	/* get_clipping_box */
-	NULL,	/* begin_typed_image */
-	NULL,	/* get_bits_rectangle */
-	NULL,	/* map_color_rgb_alpha */
-	NULL,	/* create_compositor */
-	NULL,	/* get_hardware_params */
-	NULL,	/* text_begin */
-	NULL	/* finish_copydevice */
-};
-
-typedef struct pnga_mark_device_s {
-    gx_device_common;
-
-    pnga_device *pnga_dev;
-    float opacity;
-    float shape;
-    float alpha; /* alpha = opacity * shape */
-    gs_blend_mode_t blend_mode;
-} pnga_mark_device;
-
-gs_private_st_simple_final(st_pnga_mark_device, pnga_mark_device,
-			   "pnga_mark_device", gx_device_finalize);
-
-const gx_device_printer gs_pnga_mark_device = {
-    std_device_color_stype_body(pnga_mark_device, &pnga_mark_procs,
-				"pnga_mark",
-				&st_pnga_mark_device,
-				XSIZE, YSIZE, X_DPI, Y_DPI, 24, 255, 0),
-    { 0 }
-};
-
-typedef struct pnga_text_enum_s {
-    gs_text_enum_common;
-    gs_text_enum_t *target_enum;
-} pnga_text_enum_t;
-extern_st(st_gs_text_enum);
-gs_private_st_suffix_add1(st_pnga_text_enum, pnga_text_enum_t,
-			  "pnga_text_enum_t", pnga_text_enum_enum_ptrs,
-			  pnga_text_enum_reloc_ptrs, st_gs_text_enum,
-			  target_enum);
-
-/* ------ Private definitions ------ */
-
-/**
- * pdf14_buf_new: Allocate a new PDF 1.4 buffer.
- * @n_chan: Number of pixel channels including alpha.
- *
- * Return value: Newly allocated buffer, or NULL on failure.
- **/
-static pdf14_buf *
-pdf14_buf_new(gs_int_rect *rect, bool has_alpha_g, bool has_shape,
-	       int n_chan,
-	       gs_memory_t *memory)
-{
-    pdf14_buf *result;
-    int rowstride = (rect->q.x - rect->p.x + 3) & -4;
-    int planestride = rowstride * (rect->q.y - rect->p.y);
-    int n_planes = n_chan + (has_shape ? 1 : 0) + (has_alpha_g ? 1 : 0);
-
-    result = gs_alloc_struct(memory, pdf14_buf, &st_pdf14_buf,
-			     "pdf14_buf_new");
-    if (result == NULL)
-	return result;
-
-    result->isolated = false;
-    result->knockout = false;
-    result->has_alpha_g = has_alpha_g;
-    result->has_shape = has_shape;
-    result->rect = *rect;
-    result->n_chan = n_chan;
-    result->n_planes = n_planes;
-    result->rowstride = rowstride;
-    result->planestride = planestride;
-    result->data = gs_alloc_bytes(memory, planestride * n_planes,
-				  "pdf14_buf_new");
-    if (result->data == NULL) {
-	gs_free_object(memory, result, "pdf_buf_new");
-	return NULL;
-    }
-    if (has_alpha_g) {
-	int alpha_g_plane = n_chan + (has_shape ? 1 : 0);
-	memset (result->data + alpha_g_plane * planestride, 0, planestride);
-    }
-    return result;
-}
-
-static void
-pdf14_buf_free(pdf14_buf *buf, gs_memory_t *memory)
-{
-    gs_free_object(memory, buf->data, "pdf14_buf_free");
-    gs_free_object(memory, buf, "pdf14_buf_free");
-}
-
-static pdf14_ctx *
-pdf14_ctx_new(gs_int_rect *rect, int n_chan, gs_memory_t *memory)
-{
-    pdf14_ctx *result;
-    pdf14_buf *buf;
-
-    result = gs_alloc_struct(memory, pdf14_ctx, &st_pdf14_ctx,
-			     "pdf14_ctx_new");
-
-    buf = pdf14_buf_new(rect, false, false, n_chan, memory);
-    if (buf == NULL) {
-	gs_free_object(memory, result, "pdf14_ctx_new");
-	return NULL;
-    }
-    result->stack = buf;
-    result->n_chan = n_chan;
-    result->memory = memory;
-    result->rect = *rect;
-    if (result == NULL)
-	return result;
-    return result;
-}
-
-static void
-pdf14_ctx_free(pdf14_ctx *ctx)
-{
-    pdf14_buf *buf, *next;
-
-    for (buf = ctx->stack; buf != NULL; buf = next) {
-	next = buf->saved;
-	pdf14_buf_free(buf, ctx->memory);
-    }
-    gs_free_object (ctx->memory, ctx, "pdf14_ctx_free");
-}
-
-/**
- * pdf14_find_backdrop_buf: Find backdrop buffer.
- *
- * Return value: Backdrop buffer for current group operation, or NULL
- * if backdrop is fully transparent.
- **/
-static pdf14_buf *
-pdf14_find_backdrop_buf(pdf14_ctx *ctx)
-{
-    pdf14_buf *buf = ctx->stack;
-
-    while (buf != NULL) {
-	if (buf->isolated) return NULL;
-	if (!buf->knockout) return buf->saved;
-	buf = buf->saved;
-    }
-    /* this really shouldn't happen, as bottom-most buf should be
-       non-knockout */
-    return NULL;
-}
-
-static int
-pdf14_push_transparency_group(pdf14_ctx *ctx, gs_int_rect *rect,
-			      bool isolated, bool knockout,
-			      byte alpha, byte shape,
-			      gs_blend_mode_t blend_mode)
-{
-    pdf14_buf *tos = ctx->stack;
-    pdf14_buf *buf, *backdrop;
-    bool has_shape;
-
-    /* todo: fix this hack, which makes all knockout groups isolated.
-       For the vast majority of files, there won't be any visible
-       effects, but it still isn't correct. The pixel compositing code
-       for non-isolated knockout groups gets pretty hairy, which is
-       why this is here. */
-    if (knockout) isolated = true;
-
-    has_shape = tos->has_shape || tos->knockout;
-
-    buf = pdf14_buf_new(rect, !isolated, has_shape, ctx->n_chan, ctx->memory);
-    if (buf == NULL)
-	return_error(gs_error_VMerror);
-    buf->isolated = isolated;
-    buf->knockout = knockout;
-    buf->alpha = alpha;
-    buf->shape = shape;
-    buf->blend_mode = blend_mode;
-
-    buf->saved = tos;
-    ctx->stack = buf;
-
-    backdrop = pdf14_find_backdrop_buf(ctx);
-    if (backdrop == NULL) {
-	memset(buf->data, 0, buf->planestride * (buf->n_chan +
-						 (buf->has_shape ? 1 : 0)));
-    } else {
-	/* make copy of backdrop for compositing */
-	byte *buf_plane = buf->data;
-	byte *tos_plane = tos->data + buf->rect.p.x - tos->rect.p.x +
-	    (buf->rect.p.y - tos->rect.p.y) * tos->rowstride;
-	int width = buf->rect.q.x - buf->rect.p.x;
-	int y0 = buf->rect.p.y;
-	int y1 = buf->rect.q.y;
-	int i;
-	int n_chan_copy = buf->n_chan + (tos->has_shape ? 1 : 0);
-
-	for (i = 0; i < n_chan_copy; i++) {
-	    byte *buf_ptr = buf_plane;
-	    byte *tos_ptr = tos_plane;
-	    int y;
-
-	    for (y = y0; y < y1; ++y) {
-		memcpy (buf_ptr, tos_ptr, width); 
-		buf_ptr += buf->rowstride;
-		tos_ptr += tos->rowstride;
-	    }
-	    buf_plane += buf->planestride;
-	    tos_plane += tos->planestride;
-	}
-	if (has_shape && !tos->has_shape)
-	    memset (buf_plane, 0, buf->planestride);
-    }
-
-    return 0;
-}
-
-static int
-pdf14_pop_transparency_group(pdf14_ctx *ctx)
-{
-    pdf14_buf *tos = ctx->stack;
-    pdf14_buf *nos = tos->saved;
-    int n_chan = ctx->n_chan;
-    byte alpha = tos->alpha;
-    byte shape = tos->shape;
-    byte blend_mode = tos->blend_mode;
-    int x0 = tos->rect.p.x;
-    int y0 = tos->rect.p.y;
-    int x1 = tos->rect.q.x;
-    int y1 = tos->rect.q.y;
-    byte *tos_ptr = tos->data;
-    byte *nos_ptr = nos->data + x0 - nos->rect.p.x +
-	(y0 - nos->rect.p.y) * nos->rowstride;
-    int tos_planestride = tos->planestride;
-    int nos_planestride = nos->planestride;
-    int width = x1 - x0;
-    int x, y;
-    int i;
-    byte tos_pixel[PDF14_MAX_PLANES];
-    byte nos_pixel[PDF14_MAX_PLANES];
-    bool tos_isolated = tos->isolated;
-    bool nos_knockout = nos->knockout;
-    byte *nos_alpha_g_ptr;
-    int tos_shape_offset = n_chan * tos_planestride;
-    int tos_alpha_g_offset = tos_shape_offset +
-	(tos->has_shape ? tos_planestride : 0);
-    int nos_shape_offset = n_chan * nos_planestride;
-    bool nos_has_shape = nos->has_shape;
-
-    if (nos == NULL)
-	return_error(gs_error_rangecheck);
-
-    /* for now, only simple non-knockout */
-
-    if (nos->has_alpha_g)
-	nos_alpha_g_ptr = nos_ptr + n_chan * nos_planestride;
-    else
-	nos_alpha_g_ptr = NULL;
-
-    for (y = y0; y < y1; ++y) {
-	for (x = 0; x < width; ++x) {
-	    for (i = 0; i < n_chan; ++i) {
-		tos_pixel[i] = tos_ptr[x + i * tos_planestride];
-		nos_pixel[i] = nos_ptr[x + i * nos_planestride];
-	    }
-	    
-	    if (nos_knockout) {
-		byte *nos_shape_ptr = nos_has_shape ?
-		    &nos_ptr[x + nos_shape_offset] : NULL;
-		byte tos_shape = tos_ptr[x + tos_shape_offset];
-
-#if 1
-		art_pdf_composite_knockout_isolated_8 (nos_pixel,
-						       nos_shape_ptr,
-						       tos_pixel,
-						       n_chan - 1,
-						       tos_shape,
-						       alpha, shape);
-#else
-		tos_pixel[3] = tos_ptr[x + tos_shape_offset];
-		art_pdf_composite_group_8(nos_pixel, nos_alpha_g_ptr,
-					  tos_pixel,
-					  n_chan - 1,
-					  alpha, blend_mode);
-#endif
-	    } else if (tos_isolated) {
-		art_pdf_composite_group_8(nos_pixel, nos_alpha_g_ptr,
-					  tos_pixel,
-					  n_chan - 1,
-					  alpha, blend_mode);
-	    } else {
-		byte tos_alpha_g = tos_ptr[x + tos_alpha_g_offset];
-		art_pdf_recomposite_group_8(nos_pixel, nos_alpha_g_ptr,
-					    tos_pixel, tos_alpha_g,
-					    n_chan - 1,
-					    alpha, blend_mode);
-	    }
-	    if (nos_has_shape) {
-		nos_ptr[x + nos_shape_offset] =
-		    art_pdf_union_mul_8 (nos_ptr[x + nos_shape_offset],
-					 tos_ptr[x + tos_shape_offset],
-					 shape);
-	    }
-	    /* todo: knockout cases */
-	    
-	    for (i = 0; i < n_chan; ++i) {
-		nos_ptr[x + i * nos_planestride] = nos_pixel[i];
-	    }
-	    if (nos_alpha_g_ptr != NULL)
-		++nos_alpha_g_ptr;
-	}
-	tos_ptr += tos->rowstride;
-	nos_ptr += nos->rowstride;
-	if (nos_alpha_g_ptr != NULL)
-	    nos_alpha_g_ptr += nos->rowstride - width;
-    }
-
-    ctx->stack = nos;
-    pdf14_buf_free(tos, ctx->memory);
-    return 0;
-}
-
-static int
-pnga_open(gx_device *dev)
-{
-    pnga_device *pdev = (pnga_device *)dev;
-    gs_int_rect rect;
-
-    if_debug2('v', "[v]pnga_open: width = %d, height = %d\n",
-	     dev->width, dev->height);
-
-    rect.p.x = 0;
-    rect.p.y = 0;
-    rect.q.x = dev->width;
-    rect.q.y = dev->height;
-    pdev->ctx = pdf14_ctx_new(&rect, 4, dev->memory);
-    if (pdev->ctx == NULL)
-	return_error(gs_error_VMerror);
-
-    return 0;
-}
-
-static int
-pnga_close(gx_device *dev)
-{
-    pnga_device *pdev = (pnga_device *)dev;
-
-    if (pdev->ctx)
-	pdf14_ctx_free(pdev->ctx);
-    return 0;
-}
-
-static int
-pnga_output_page(gx_device *dev, int num_copies, int flush)
-{
-    pnga_device *pdev = (pnga_device *)dev;
-    gs_memory_t *mem = dev->memory;
-    int width = dev->width;
-    int height = dev->height;
-    int rowbytes = width << 2;
-
-    /* PNG structures */
-    byte *row = gs_alloc_bytes(mem, rowbytes, "png raster buffer");
-    png_struct *png_ptr =
-    png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
-    png_info *info_ptr =
-    png_create_info_struct(png_ptr);
-    int depth = dev->color_info.depth;
-    int y;
-    int code;			/* return code */
-    const char *software_key = "Software";
-    char software_text[256];
-    png_text text_png;
-    char prefix[] = "pnga_png";
-    char fname[gp_file_name_sizeof];
-    FILE *file;
-
-    pdf14_buf *buf = pdev->ctx->stack;
-    int planestride = buf->planestride;
-    byte *buf_ptr = buf->data;
-
-    file = gp_open_scratch_file(prefix, fname, "wb");
-    if (file == NULL) {
-	code = gs_note_error(gs_error_invalidfileaccess);
-	goto done;
-    }
-    /* todo: suck from OutputFile instead */
-
-    if_debug0('v', "[v]pnga_output_page\n");
-
-    if (row == 0 || png_ptr == 0 || info_ptr == 0) {
-	code = gs_note_error(gs_error_VMerror);
-	goto done;
-    }
-    /* set error handling */
-    if (setjmp(png_ptr->jmpbuf)) {
-	/* If we get here, we had a problem reading the file */
-	code = gs_note_error(gs_error_VMerror);
-	goto done;
-    }
-
-    code = 0;			/* for normal path */
-    /* set up the output control */
-    png_init_io(png_ptr, file);
-
-    /* set the file information here */
-    info_ptr->width = dev->width;
-    info_ptr->height = dev->height;
-    /* resolution is in pixels per meter vs. dpi */
-    info_ptr->x_pixels_per_unit =
-	(png_uint_32) (dev->HWResolution[0] * (100.0 / 2.54));
-    info_ptr->y_pixels_per_unit =
-	(png_uint_32) (dev->HWResolution[1] * (100.0 / 2.54));
-    info_ptr->phys_unit_type = PNG_RESOLUTION_METER;
-    info_ptr->valid |= PNG_INFO_pHYs;
-
-    /* At present, only supporting 32-bit rgba */
-    info_ptr->bit_depth = 8;
-    info_ptr->color_type = PNG_COLOR_TYPE_RGB_ALPHA;
-
-    /* add comment */
-    sprintf(software_text, "%s %d.%02d", gs_product,
-	    (int)(gs_revision / 100), (int)(gs_revision % 100));
-    text_png.compression = -1;	/* uncompressed */
-    text_png.key = (char *)software_key;	/* not const, unfortunately */
-    text_png.text = software_text;
-    text_png.text_length = strlen(software_text);
-    info_ptr->text = &text_png;
-    info_ptr->num_text = 1;
-
-    /* write the file information */
-    png_write_info(png_ptr, info_ptr);
-
-    /* don't write the comments twice */
-    info_ptr->num_text = 0;
-    info_ptr->text = NULL;
-
-    /* Write the contents of the image. */
-    for (y = 0; y < height; ++y) {
-	int x;
-
-	for (x = 0; x < width; ++x) {
-	    row[(x << 2)] = buf_ptr[x];
-	    row[(x << 2) + 1] = buf_ptr[x + planestride];
-	    row[(x << 2) + 2] = buf_ptr[x + planestride * 2];
-	    row[(x << 2) + 3] = buf_ptr[x + planestride * 3];
-	}
-	png_write_row(png_ptr, row);
-	buf_ptr += buf->rowstride;
-    }
-
-    /* write the rest of the file */
-    png_write_end(png_ptr, info_ptr);
-
-  done:
-    /* free the structures */
-    png_destroy_write_struct(&png_ptr, &info_ptr);
-    gs_free_object(mem, row, "png raster buffer");
-
-    fclose (file);
-
-    return code;
-}
-
-static void
-pnga_finalize(gx_device *dev)
-{
-    if_debug1('v', "[v]finalizing %lx\n", dev);
-}
-
-/**
- * pnga_get_marking_device: Obtain a marking device.
- * @dev: Original device.
- * @pis: Imager state.
- *
- * The current implementation creates a marking device each time this
- * routine is called. A potential optimization is to cache a single
- * instance in the original device.
- *
- * Return value: Marking device, or NULL on error.
- **/
-static gx_device *
-pnga_get_marking_device(gx_device *dev, const gs_imager_state *pis)
-{
-    pnga_device *pdev = (pnga_device *)dev;
-    pdf14_buf *buf = pdev->ctx->stack;
-    pnga_mark_device *mdev;
-    int code = gs_copydevice((gx_device **)&mdev,
-			     (const gx_device *)&gs_pnga_mark_device,
-			     dev->memory);
-
-    if (code < 0)
-	return NULL;
-
-    check_device_separable((gx_device *)mdev);
-    gx_device_fill_in_procs((gx_device *)mdev);
-    mdev->pnga_dev = pdev;
-    mdev->opacity = pis->opacity.alpha;
-    mdev->shape = pis->shape.alpha;
-    mdev->alpha = pis->opacity.alpha * pis->shape.alpha;
-    mdev->blend_mode = pis->blend_mode;
-
-    if (buf->knockout) {
-	fill_dev_proc((gx_device *)mdev, fill_rectangle,
-		      pnga_mark_fill_rectangle_ko_simple);
-    } else {
-	fill_dev_proc((gx_device *)mdev, fill_rectangle,
-		      pnga_mark_fill_rectangle);
-    }
-
-    if_debug1('v', "[v]creating %lx\n", mdev);
-    mdev->finalize = pnga_finalize;
-    return (gx_device *)mdev;
-}
-
-static void
-pnga_release_marking_device(gx_device *marking_dev)
-{
-    rc_decrement_only(marking_dev, "pnga_release_marking_device");
-}
-
-static int
-pnga_fill_path(gx_device *dev, const gs_imager_state *pis,
-			   gx_path *ppath, const gx_fill_params *params,
-			   const gx_drawing_color *pdcolor,
-			   const gx_clip_path *pcpath)
-{
-    int code;
-    gx_device *mdev = pnga_get_marking_device(dev, pis);
-
-    if (mdev == 0)
-	return_error(gs_error_VMerror);
-    code = gx_default_fill_path(mdev, pis, ppath, params, pdcolor, pcpath);
-    pnga_release_marking_device(mdev);
-    return code;
-}
-
-static int
-pnga_stroke_path(gx_device *dev, const gs_imager_state *pis,
-			     gx_path *ppath, const gx_stroke_params *params,
-			     const gx_drawing_color *pdcolor,
-			     const gx_clip_path *pcpath)
-{
-    int code;
-    gx_device *mdev = pnga_get_marking_device(dev, pis);
-
-    if (mdev == 0)
-	return_error(gs_error_VMerror);
-    code = gx_default_stroke_path(mdev, pis, ppath, params, pdcolor, pcpath);
-    pnga_release_marking_device(mdev);
-    return code;
-}
-
-static int
-pnga_begin_typed_image(gx_device * dev, const gs_imager_state * pis,
-			   const gs_matrix *pmat, const gs_image_common_t *pic,
-			   const gs_int_rect * prect,
-			   const gx_drawing_color * pdcolor,
-			   const gx_clip_path * pcpath, gs_memory_t * mem,
-			   gx_image_enum_common_t ** pinfo)
-{
-    gx_device *mdev = pnga_get_marking_device(dev, pis);
-    int code;
-
-    if (mdev == 0)
-	return_error(gs_error_VMerror);
-
-    code = gx_default_begin_typed_image(mdev, pis, pmat, pic, prect, pdcolor,
-					pcpath, mem, pinfo);
-
-    rc_decrement_only(mdev, "pnga_begin_typed_image");
-
-    return code;
-}
-
-static int
-pnga_text_resync(gs_text_enum_t *pte, const gs_text_enum_t *pfrom)
-{
-    pnga_text_enum_t *const penum = (pnga_text_enum_t *)pte;
-
-    if ((pte->text.operation ^ pfrom->text.operation) & ~TEXT_FROM_ANY)
-	return_error(gs_error_rangecheck);
-    if (penum->target_enum) {
-	int code = gs_text_resync(penum->target_enum, pfrom);
-
-	if (code < 0)
-	    return code;
-    }
-    pte->text = pfrom->text;
-    gs_text_enum_copy_dynamic(pte, pfrom, false);
-    return 0;
-}
-
-static int
-pnga_text_process(gs_text_enum_t *pte)
-{
-    pnga_text_enum_t *const penum = (pnga_text_enum_t *)pte;
-    int code;
-
-    code = gs_text_process(penum->target_enum);
-    gs_text_enum_copy_dynamic(pte, penum->target_enum, true);
-    return code;
-}
-
-static bool
-pnga_text_is_width_only(const gs_text_enum_t *pte)
-{
-    const pnga_text_enum_t *const penum = (const pnga_text_enum_t *)pte;
-
-    if (penum->target_enum)
-	return gs_text_is_width_only(penum->target_enum);
-    return false;
-}
-
-static int
-pnga_text_current_width(const gs_text_enum_t *pte, gs_point *pwidth)
-{
-    const pnga_text_enum_t *const penum = (const pnga_text_enum_t *)pte;
-
-    if (penum->target_enum)
-	return gs_text_current_width(penum->target_enum, pwidth);
-    return_error(gs_error_rangecheck); /* can't happen */
-}
-
-static int
-pnga_text_set_cache(gs_text_enum_t *pte, const double *pw,
-		   gs_text_cache_control_t control)
-{
-    pnga_text_enum_t *const penum = (pnga_text_enum_t *)pte;
-
-    if (penum->target_enum)
-	return gs_text_set_cache(penum->target_enum, pw, control);
-    return_error(gs_error_rangecheck); /* can't happen */
-}
-
-static int
-pnga_text_retry(gs_text_enum_t *pte)
-{
-    pnga_text_enum_t *const penum = (pnga_text_enum_t *)pte;
-
-    if (penum->target_enum)
-	return gs_text_retry(penum->target_enum);
-    return_error(gs_error_rangecheck); /* can't happen */
-}
-
-static void
-pnga_text_release(gs_text_enum_t *pte, client_name_t cname)
-{
-    pnga_text_enum_t *const penum = (pnga_text_enum_t *)pte;
-
-    if (penum->target_enum) {
-	gs_text_release(penum->target_enum, cname);
-	penum->target_enum = 0;
-    }
-    gx_default_text_release(pte, cname);
-}
-
-static const gs_text_enum_procs_t pnga_text_procs = {
-    pnga_text_resync, pnga_text_process,
-    pnga_text_is_width_only, pnga_text_current_width,
-    pnga_text_set_cache, pnga_text_retry,
-    pnga_text_release
-};
-
-static int
-pnga_text_begin(gx_device * dev, gs_imager_state * pis,
-		 const gs_text_params_t * text, gs_font * font,
-		 gx_path * path, const gx_device_color * pdcolor,
-		 const gx_clip_path * pcpath, gs_memory_t * memory,
-		 gs_text_enum_t ** ppenum)
-{
-    int code;
-    gx_device *mdev = pnga_get_marking_device(dev, pis);
-    pnga_text_enum_t *penum;
-    gs_text_enum_t *target_enum;
-
-    if (mdev == 0)
-	return_error(gs_error_VMerror);
-    if_debug0('v', "[v]pnga_text_begin\n");
-    code = gx_default_text_begin(mdev, pis, text, font, path, pdcolor, pcpath,
-				 memory, &target_enum);
-
-    rc_alloc_struct_1(penum, pnga_text_enum_t, &st_pnga_text_enum, memory,
-		      return_error(gs_error_VMerror), "pnga_text_begin");
-    penum->rc.free = rc_free_text_enum;
-    penum->target_enum = target_enum;
-    code = gs_text_enum_init((gs_text_enum_t *)penum, &pnga_text_procs,
-			     dev, pis, text, font, path, pdcolor, pcpath,
-			     memory);
-    if (code < 0) {
-	gs_free_object(memory, penum, "pnga_text_begin");
-	return code;
-    }
-    *ppenum = (gs_text_enum_t *)penum;
-    rc_decrement_only(mdev, "pnga_text_begin");
-    return code;
-}
-
-static int
-pnga_fill_rectangle(gx_device * dev,
-		    int x, int y, int w, int h, gx_color_index color)
-{
-    if_debug4('v', "[v]pnga_fill_rectangle, (%d, %d), %d x %d\n", x, y, w, h);
-    return 0;
-}
-
-
-static int
-pnga_begin_transparency_group(gx_device *dev,
-			      const gs_transparency_group_params_t *ptgp,
-			      const gs_rect *pbbox,
-			      gs_imager_state *pis,
-			      gs_transparency_state_t **ppts,
-			      gs_memory_t *mem)
-{
-    pnga_device *pdev = (pnga_device *)dev;
-    double alpha = pis->opacity.alpha * pis->shape.alpha;
-    int code;
-
-    if_debug4('v', "[v]begin_transparency_group, I = %d, K = %d, alpha = %g, bm = %d\n",
-	      ptgp->Isolated, ptgp->Knockout, alpha, pis->blend_mode);
-
-    code = pdf14_push_transparency_group(pdev->ctx, &pdev->ctx->rect,
-					 ptgp->Isolated, ptgp->Knockout,
-					 floor (255 * alpha + 0.5),
-					 floor (255 * pis->shape.alpha + 0.5),
-					 pis->blend_mode);
-    return code;
-}
-
-static int
-pnga_end_transparency_group(gx_device *dev,
-			      gs_imager_state *pis,
-			      gs_transparency_state_t **ppts)
-{
-    pnga_device *pdev = (pnga_device *)dev;
-    int code;
-
-    if_debug0('v', "[v]end_transparency_group\n");
-    code = pdf14_pop_transparency_group(pdev->ctx);
-    return code;
-}
-
-static int
-pnga_mark_fill_rectangle(gx_device * dev,
-			 int x, int y, int w, int h, gx_color_index color)
-{
-    pnga_mark_device *mdev = (pnga_mark_device *)dev;
-    pnga_device *pdev = (pnga_device *)mdev->pnga_dev;
-    pdf14_buf *buf = pdev->ctx->stack;
-    int i, j, k;
-    byte *line, *dst_ptr;
-    byte src[PDF14_MAX_PLANES];
-    byte dst[PDF14_MAX_PLANES];
-    gs_blend_mode_t blend_mode = mdev->blend_mode;
-    int rowstride = buf->rowstride;
-    int planestride = buf->planestride;
-    bool has_alpha_g = buf->has_alpha_g;
-    bool has_shape = buf->has_shape;
-    int shape_off = buf->n_chan * planestride;
-    int alpha_g_off = shape_off + (has_shape ? planestride : 0);
-    byte shape;
-
-    src[0] = color >> 16;
-    src[1] = (color >> 8) & 0xff;
-    src[2] = color & 0xff;
-    src[3] = floor (255 * mdev->alpha + 0.5);
-    if (has_shape)
-	shape = floor (255 * mdev->shape + 0.5);
-
-    if (x < buf->rect.p.x) x = buf->rect.p.x;
-    if (y < buf->rect.p.x) y = buf->rect.p.y;
-    if (x + w > buf->rect.q.x) w = buf->rect.q.x - x;
-    if (y + h > buf->rect.q.y) h = buf->rect.q.y - y;
-
-    line = buf->data + (x - buf->rect.p.x) + (y - buf->rect.p.y) * rowstride;
-
-    for (j = 0; j < h; ++j) {
-	dst_ptr = line;
-	for (i = 0; i < w; ++i) {
-	    for (k = 0; k < 4; ++k)
-		dst[k] = dst_ptr[k * planestride];
-	    art_pdf_composite_pixel_alpha_8(dst, src, 3, blend_mode);
-	    for (k = 0; k < 4; ++k)
-		dst_ptr[k * planestride] = dst[k];
-	    if (has_alpha_g) {
-		int tmp = (255 - dst_ptr[alpha_g_off]) * (255 - src[3]) + 0x80;
-		dst_ptr[alpha_g_off] = 255 - ((tmp + (tmp >> 8)) >> 8);
-	    }
-	    if (has_shape) {
-		int tmp = (255 - dst_ptr[shape_off]) * (255 - shape) + 0x80;
-		dst_ptr[shape_off] = 255 - ((tmp + (tmp >> 8)) >> 8);
-	    }
-	    ++dst_ptr;
-	}
-	line += rowstride;
-    }
-    return 0;
-}
-
-static int
-pnga_mark_fill_rectangle_ko_simple(gx_device * dev,
-				   int x, int y, int w, int h, gx_color_index color)
-{
-    pnga_mark_device *mdev = (pnga_mark_device *)dev;
-    pnga_device *pdev = (pnga_device *)mdev->pnga_dev;
-    pdf14_buf *buf = pdev->ctx->stack;
-    int i, j, k;
-    byte *line, *dst_ptr;
-    byte src[PDF14_MAX_PLANES];
-    byte dst[PDF14_MAX_PLANES];
-    int rowstride = buf->rowstride;
-    int planestride = buf->planestride;
-    int shape_off = buf->n_chan * planestride;
-    bool has_shape = buf->has_shape;
-    byte opacity;
-
-    src[0] = color >> 16;
-    src[1] = (color >> 8) & 0xff;
-    src[2] = color & 0xff;
-    src[3] = floor (255 * mdev->shape + 0.5);
-    opacity = floor (255 * mdev->opacity + 0.5);
-
-    if (x < buf->rect.p.x) x = buf->rect.p.x;
-    if (y < buf->rect.p.x) y = buf->rect.p.y;
-    if (x + w > buf->rect.q.x) w = buf->rect.q.x - x;
-    if (y + h > buf->rect.q.y) h = buf->rect.q.y - y;
-
-    line = buf->data + (x - buf->rect.p.x) + (y - buf->rect.p.y) * rowstride;
-
-    for (j = 0; j < h; ++j) {
-	dst_ptr = line;
-	for (i = 0; i < w; ++i) {
-	    for (k = 0; k < 4; ++k)
-		dst[k] = dst_ptr[k * planestride];
-	    art_pdf_composite_knockout_simple_8(dst, has_shape ? dst_ptr + shape_off : NULL,
-						src, 3, opacity);
-	    for (k = 0; k < 4; ++k)
-		dst_ptr[k * planestride] = dst[k];
-	    ++dst_ptr;
-	}
-	line += rowstride;
-    }
-    return 0;
-}



More information about the gs-cvs mailing list