[gs-cvs] rev 8528 - trunk/gs/src
leonardo at ghostscript.com
leonardo at ghostscript.com
Sun Feb 17 14:32:16 PST 2008
Author: leonardo
Date: 2008-02-17 14:32:15 -0800 (Sun, 17 Feb 2008)
New Revision: 8528
Modified:
trunk/gs/src/gdevbmpa.c
trunk/gs/src/gdevijs.c
trunk/gs/src/gdevm24.c
trunk/gs/src/gdevmem.c
trunk/gs/src/gdevpng.c
trunk/gs/src/gdevppla.c
trunk/gs/src/gdevppla.h
trunk/gs/src/gdevprn.c
trunk/gs/src/gdevprn.h
trunk/gs/src/gxclist.c
trunk/gs/src/gxclread.c
trunk/gs/src/gxdevbuf.h
trunk/gs/src/gxdevmem.h
Log:
Fix (images) : Improve coordinate precision when scaling an image (continued 2).
DETAILS :
Ghostscript Bug 687345 "Image interpolation problem at a band boundary"
This patch does not change the algorithm,
except adding a debug printing with y coordinate of an image rectangle
in the page coordinate systems. It allows to compare
image fragments, which fall to verious bands depending on band size.
We could wrap the definition of gx_device_memory_s::band_y
and all access to it with #ifdef DEBUG,
but we don't want to reduce the readability and because
memory and the CPU time expense is too small.
EXPECTED DIFFERENCES :
None.
Modified: trunk/gs/src/gdevbmpa.c
===================================================================
--- trunk/gs/src/gdevbmpa.c 2008-02-17 03:59:45 UTC (rev 8527)
+++ trunk/gs/src/gdevbmpa.c 2008-02-17 22:32:15 UTC (rev 8528)
@@ -452,7 +452,7 @@
/* Set up the buffer device. */
code = gdev_create_buf_device(crdev->buf_procs.create_buf_device,
- &bdev, crdev->target, &render_plane,
+ &bdev, crdev->target, 0, &render_plane,
dev->memory, NULL);
if (code < 0)
goto done;
Modified: trunk/gs/src/gdevijs.c
===================================================================
--- trunk/gs/src/gdevijs.c 2008-02-17 03:59:45 UTC (rev 8527)
+++ trunk/gs/src/gdevijs.c 2008-02-17 22:32:15 UTC (rev 8528)
@@ -482,12 +482,12 @@
return 0;
}
-static int gsijs_create_buf_device(gx_device **pbdev, gx_device *target,
+static int gsijs_create_buf_device(gx_device **pbdev, gx_device *target, int y,
const gx_render_plane_t *render_plane, gs_memory_t *mem, gx_band_complexity_t *for_band)
{
gx_device_ijs *ijsdev = (gx_device_ijs *)target;
int n_chan = ijsdev->color_info.num_components;
- int code = gx_default_create_buf_device(pbdev, target, render_plane, mem, for_band);
+ int code = gx_default_create_buf_device(pbdev, target, y, render_plane, mem, for_band);
if (code < 0 || n_chan != 3)
return code;
Modified: trunk/gs/src/gdevm24.c
===================================================================
--- trunk/gs/src/gdevm24.c 2008-02-17 03:59:45 UTC (rev 8527)
+++ trunk/gs/src/gdevm24.c 2008-02-17 22:32:15 UTC (rev 8528)
@@ -468,6 +468,7 @@
{
gx_device_memory * const mdev = (gx_device_memory *)dev;
+ if_debug1('w', "[w]device y=%d:\n", y + mdev->band_y); /* See siscale.c about 'w'. */
fit_copy(dev, base, sourcex, sraster, id, x, y, w, h);
mem_copy_byte_rect(mdev, base, sourcex, sraster, x, y, w, h);
return 0;
Modified: trunk/gs/src/gdevmem.c
===================================================================
--- trunk/gs/src/gdevmem.c 2008-02-17 03:59:45 UTC (rev 8527)
+++ trunk/gs/src/gdevmem.c 2008-02-17 22:32:15 UTC (rev 8528)
@@ -174,6 +174,7 @@
}
check_device_separable((gx_device *)dev);
gx_device_fill_in_procs((gx_device *)dev);
+ dev->band_y = 0;
}
/* Make a monobit memory device. This is never a page device. */
/* Note that white=0, black=1. */
Modified: trunk/gs/src/gdevpng.c
===================================================================
--- trunk/gs/src/gdevpng.c 2008-02-17 03:59:45 UTC (rev 8527)
+++ trunk/gs/src/gdevpng.c 2008-02-17 22:32:15 UTC (rev 8528)
@@ -447,12 +447,12 @@
}
static int
-pngalpha_create_buf_device(gx_device **pbdev, gx_device *target,
+pngalpha_create_buf_device(gx_device **pbdev, gx_device *target, int y,
const gx_render_plane_t *render_plane, gs_memory_t *mem,
gx_band_complexity_t *band_complexity)
{
gx_device_printer *ptarget = (gx_device_printer *)target;
- int code = gx_default_create_buf_device(pbdev, target,
+ int code = gx_default_create_buf_device(pbdev, target, y,
render_plane, mem, band_complexity);
/* Now set copy_alpha to one that handles RGBA */
set_dev_proc(*pbdev, copy_alpha, ptarget->orig_procs.copy_alpha);
Modified: trunk/gs/src/gdevppla.c
===================================================================
--- trunk/gs/src/gdevppla.c 2008-02-17 03:59:45 UTC (rev 8527)
+++ trunk/gs/src/gdevppla.c 2008-02-17 22:32:15 UTC (rev 8528)
@@ -93,11 +93,11 @@
/* Create a planar buffer device. */
int
-gdev_prn_create_buf_planar(gx_device **pbdev, gx_device *target,
+gdev_prn_create_buf_planar(gx_device **pbdev, gx_device *target, int y,
const gx_render_plane_t *render_plane,
gs_memory_t *mem, gx_band_complexity_t *for_band)
{
- int code = gx_default_create_buf_device(pbdev, target, render_plane, mem,
+ int code = gx_default_create_buf_device(pbdev, target, y, render_plane, mem,
for_band);
if (code < 0)
Modified: trunk/gs/src/gdevppla.h
===================================================================
--- trunk/gs/src/gdevppla.h 2008-02-17 03:59:45 UTC (rev 8527)
+++ trunk/gs/src/gdevppla.h 2008-02-17 22:32:15 UTC (rev 8528)
@@ -32,7 +32,7 @@
/* Create a planar buffer device. */
/* Use this instead of the default if UsePlanarBuffer is true. */
-int gdev_prn_create_buf_planar(gx_device **pbdev, gx_device *target,
+int gdev_prn_create_buf_planar(gx_device **pbdev, gx_device *target, int y,
const gx_render_plane_t *render_plane,
gs_memory_t *mem, gx_band_complexity_t *for_band);
Modified: trunk/gs/src/gdevprn.c
===================================================================
--- trunk/gs/src/gdevprn.c 2008-02-17 03:59:45 UTC (rev 8527)
+++ trunk/gs/src/gdevprn.c 2008-02-17 22:32:15 UTC (rev 8528)
@@ -366,7 +366,7 @@
ppdev->buffer_space = 0;
if ((code = gdev_create_buf_device
(ppdev->printer_procs.buf_procs.create_buf_device,
- &bdev, pdev, NULL, NULL, NULL)) < 0 ||
+ &bdev, pdev, 0, NULL, NULL, NULL)) < 0 ||
(code = ppdev->printer_procs.buf_procs.setup_buf_device
(bdev, base, buf_space.raster,
(byte **)(base + buf_space.bits), 0, pdev->height,
@@ -976,11 +976,11 @@
*/
int
gdev_create_buf_device(create_buf_device_proc_t cbd_proc, gx_device **pbdev,
- gx_device *target,
+ gx_device *target, int y,
const gx_render_plane_t *render_plane,
gs_memory_t *mem, gx_band_complexity_t *band_complexity)
{
- int code = cbd_proc(pbdev, target, render_plane, mem, band_complexity);
+ int code = cbd_proc(pbdev, target, y, render_plane, mem, band_complexity);
if (code < 0)
return code;
@@ -994,7 +994,7 @@
* possibly preceded by a plane extraction device.
*/
int
-gx_default_create_buf_device(gx_device **pbdev, gx_device *target,
+gx_default_create_buf_device(gx_device **pbdev, gx_device *target, int y,
const gx_render_plane_t *render_plane, gs_memory_t *mem, gx_band_complexity_t *band_complexity)
{
int plane_index = (render_plane ? render_plane->index : -1);
@@ -1027,6 +1027,7 @@
gs_make_mem_device(mdev, mdproto, mem, (band_complexity == NULL ? 1 : 0),
(target == (gx_device *)mdev ? NULL : target));
mdev->width = target->width;
+ mdev->band_y = y;
/*
* The matrix in the memory device is irrelevant,
* because all we do with the device is call the device-level
Modified: trunk/gs/src/gdevprn.h
===================================================================
--- trunk/gs/src/gdevprn.h 2008-02-17 03:59:45 UTC (rev 8527)
+++ trunk/gs/src/gdevprn.h 2008-02-17 22:32:15 UTC (rev 8528)
@@ -635,7 +635,7 @@
*/
typedef dev_proc_create_buf_device((*create_buf_device_proc_t));
int gdev_create_buf_device(create_buf_device_proc_t cbd_proc,
- gx_device **pbdev, gx_device *target,
+ gx_device **pbdev, gx_device *target, int y,
const gx_render_plane_t *render_plane,
gs_memory_t *mem, gx_band_complexity_t *band_complexity);
Modified: trunk/gs/src/gxclist.c
===================================================================
--- trunk/gs/src/gxclist.c 2008-02-17 03:59:45 UTC (rev 8527)
+++ trunk/gs/src/gxclist.c 2008-02-17 22:32:15 UTC (rev 8528)
@@ -355,7 +355,7 @@
int code;
/* Call create_buf_device to get the memory planarity set up. */
- cdev->buf_procs.create_buf_device(&pbdev, target, NULL, NULL, clist_get_band_complexity(0, 0));
+ cdev->buf_procs.create_buf_device(&pbdev, target, 0, NULL, NULL, clist_get_band_complexity(0, 0));
/* HACK - if the buffer device can't do copy_alpha, disallow */
/* copy_alpha in the commmand list device as well. */
if (dev_proc(pbdev, copy_alpha) == gx_no_copy_alpha)
Modified: trunk/gs/src/gxclread.c
===================================================================
--- trunk/gs/src/gxclread.c 2008-02-17 03:59:45 UTC (rev 8527)
+++ trunk/gs/src/gxclread.c 2008-02-17 22:32:15 UTC (rev 8528)
@@ -425,7 +425,7 @@
clist_select_render_plane(dev, y, line_count, &render_plane, plane_index);
code = gdev_create_buf_device(cdev->buf_procs.create_buf_device,
- &bdev, cdev->target, &render_plane,
+ &bdev, cdev->target, y, &render_plane,
dev->memory, clist_get_band_complexity(dev,y));
if (code < 0)
return code;
@@ -463,7 +463,7 @@
uint raster = gx_device_raster(bdev, true);
code = gdev_create_buf_device(cdev->buf_procs.create_buf_device,
- &bdev, cdev->target, &render_plane,
+ &bdev, cdev->target, y, &render_plane,
dev->memory, clist_get_band_complexity(dev, y));
if (code < 0)
return code;
Modified: trunk/gs/src/gxdevbuf.h
===================================================================
--- trunk/gs/src/gxdevbuf.h 2008-02-17 03:59:45 UTC (rev 8527)
+++ trunk/gs/src/gxdevbuf.h 2008-02-17 22:32:15 UTC (rev 8528)
@@ -71,7 +71,7 @@
*/
#define dev_proc_create_buf_device(proc)\
- int proc(gx_device **pbdev, gx_device *target,\
+ int proc(gx_device **pbdev, gx_device *target, int y,\
const gx_render_plane_t *render_plane, gs_memory_t *mem,\
gx_band_complexity_t *band_complexity)
Modified: trunk/gs/src/gxdevmem.h
===================================================================
--- trunk/gs/src/gxdevmem.h 2008-02-17 03:59:45 UTC (rev 8527)
+++ trunk/gs/src/gxdevmem.h 2008-02-17 22:32:15 UTC (rev 8528)
@@ -141,6 +141,7 @@
gx_color_index save_color; /* last (only) color displayed */
/* Following are used only for planar devices. */
int plane_depth; /* if non-zero, depth of all planes */
+ int band_y; /* Debug purpose only. */
};
extern_st(st_device_memory);
More information about the gs-cvs
mailing list