summaryrefslogtreecommitdiff
path: root/base/gxscanc.h
diff options
context:
space:
mode:
authorRobin Watts <Robin.Watts@artifex.com>2019-02-21 14:20:40 +0000
committerRobin Watts <Robin.Watts@artifex.com>2019-02-22 15:10:30 +0000
commit02b6572798cfa75f1b77cfa666748add0ae7db31 (patch)
tree865ead588e8e0fb866b6bfa087c5284e0e19f5e8 /base/gxscanc.h
parented1d07fb8c324dea9988359bbcc400979155ffa8 (diff)
downloadghostpdl-02b6572798cfa75f1b77cfa666748add0ae7db31.tar.gz
Bug 700643: Rejig scan converter - back off in high memory cases.
Group scan converter calling logic together, and call it through a single gx_scan_convert_and_fill function. Have the scan converter bale if the required memory is larger than an arbitrary size (currently 1Meg). We subdivide the path into bands and retry.
Diffstat (limited to 'base/gxscanc.h')
-rw-r--r--base/gxscanc.h54
1 files changed, 42 insertions, 12 deletions
diff --git a/base/gxscanc.h b/base/gxscanc.h
index f4cf466cd..c46d29e7a 100644
--- a/base/gxscanc.h
+++ b/base/gxscanc.h
@@ -41,24 +41,39 @@ struct gx_edgebuffer_s {
int *table;
};
+typedef struct {
+ int (*scan_convert)(gx_device * gs_restrict pdev,
+ gx_path * gs_restrict path,
+ const gs_fixed_rect * gs_restrict rect,
+ gx_edgebuffer * gs_restrict edgebuffer,
+ fixed flatness);
+ int (*filter)(gx_device * gs_restrict pdev,
+ gx_edgebuffer * gs_restrict edgebuffer,
+ int rule);
+ int (*fill)(gx_device * gs_restrict pdev,
+ const gx_device_color * gs_restrict pdevc,
+ gx_edgebuffer * gs_restrict edgebuffer,
+ int log_op);
+} gx_scan_converter_t;
+
/* "Pixel centre" scanline routines */
int
gx_scan_convert(gx_device * gs_restrict pdev,
gx_path * gs_restrict path,
const gs_fixed_rect * gs_restrict rect,
gx_edgebuffer * gs_restrict edgebuffer,
- fixed flatness);
+ fixed flatness);
int
gx_filter_edgebuffer(gx_device * gs_restrict pdev,
gx_edgebuffer * gs_restrict edgebuffer,
- int rule);
+ int rule);
int
gx_fill_edgebuffer(gx_device * gs_restrict pdev,
const gx_device_color * gs_restrict pdevc,
gx_edgebuffer * gs_restrict edgebuffer,
- int log_op);
+ int log_op);
/* "Any Part of a Pixel" (app) scanline routines */
int
@@ -66,18 +81,18 @@ gx_scan_convert_app(gx_device * gs_restrict pdev,
gx_path * gs_restrict path,
const gs_fixed_rect * gs_restrict rect,
gx_edgebuffer * gs_restrict edgebuffer,
- fixed flatness);
+ fixed flatness);
int
gx_filter_edgebuffer_app(gx_device * gs_restrict pdev,
gx_edgebuffer * gs_restrict edgebuffer,
- int rule);
+ int rule);
int
gx_fill_edgebuffer_app(gx_device * gs_restrict pdev,
const gx_device_color * gs_restrict pdevc,
gx_edgebuffer * gs_restrict edgebuffer,
- int log_op);
+ int log_op);
/* "Pixel centre" trapezoid routines */
int
@@ -85,18 +100,18 @@ gx_scan_convert_tr(gx_device * gs_restrict pdev,
gx_path * gs_restrict path,
const gs_fixed_rect * gs_restrict rect,
gx_edgebuffer * gs_restrict edgebuffer,
- fixed flatness);
+ fixed flatness);
int
gx_filter_edgebuffer_tr(gx_device * gs_restrict pdev,
gx_edgebuffer * gs_restrict edgebuffer,
- int rule);
+ int rule);
int
gx_fill_edgebuffer_tr(gx_device * gs_restrict pdev,
const gx_device_color * gs_restrict pdevc,
gx_edgebuffer * gs_restrict edgebuffer,
- int log_op);
+ int log_op);
/* "Any Part of a Pixel" (app) trapezoid routines */
int
@@ -104,18 +119,33 @@ gx_scan_convert_tr_app(gx_device * gs_restrict pdev,
gx_path * gs_restrict path,
const gs_fixed_rect * gs_restrict rect,
gx_edgebuffer * gs_restrict edgebuffer,
- fixed flatness);
+ fixed flatness);
int
gx_filter_edgebuffer_tr_app(gx_device * gs_restrict pdev,
gx_edgebuffer * gs_restrict edgebuffer,
- int rule);
+ int rule);
int
gx_fill_edgebuffer_tr_app(gx_device * gs_restrict pdev,
const gx_device_color * gs_restrict pdevc,
gx_edgebuffer * gs_restrict edgebuffer,
- int log_op);
+ int log_op);
+
+extern gx_scan_converter_t gx_scan_converter;
+extern gx_scan_converter_t gx_scan_converter_app;
+extern gx_scan_converter_t gx_scan_converter_tr;
+extern gx_scan_converter_t gx_scan_converter_tr_app;
+
+int
+gx_scan_convert_and_fill(const gx_scan_converter_t *sc,
+ gx_device *dev,
+ gx_path *ppath,
+ const gs_fixed_rect *ibox,
+ fixed flat,
+ int rule,
+ const gx_device_color *pdevc,
+ int lop);
/* Equivalent to filling it full of 0's */
void gx_edgebuffer_init(gx_edgebuffer * edgebuffer);