CET 18-02c and 18-02d., makepattern error reporting
Alex Cherepanov <[email protected]> Fri, 23 Feb 2007 12:24:57 -0500
| Newsgroups | gmane.comp.printing.ghostscript.patches |
|---|---|
| Message-ID | <[email protected]> |
This is a multi-part message in MIME format.
--------------070304040809090705090209
Content-Type: text/plain; charset=us-ascii; format=flowed
Content-Transfer-Encoding: 7bit
Use stricter validation of the pattern dictionary parameters to
match CET 18-02c and 18-02d.
DETAILS:
In particular, don't accept the degenerative matrix, unnormalized,
or empty bounding box. The difference in the operand stack
is not yet fixed. Adobe doesn't restore operands of rectfill
operator when an error happen in the PaintProc function but
Ghostscript does.
DIFFERENCES:
No other CET differences, no comparefiles differences.
--------------070304040809090705090209
Content-Type: text/plain;
name="18-02c3.diff"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
filename="18-02c3.diff"
Index: gs/lib/gs_lev2.ps
===================================================================
--- gs/lib/gs_lev2.ps (revision 7732)
+++ gs/lib/gs_lev2.ps (working copy)
@@ -852,7 +852,13 @@
def
/makepattern { % <proto_dict> <matrix> makepattern <pattern>
- //.patterntypes 2 .argindex /PatternType get get
+ dup type /dicttype eq {
+ % "<dict> makepattern" reports /typecheck on Adobe
+ /makepattern .systemvar /typecheck signalerror
+ } if
+ //.patterntypes 2 .argindex /PatternType get .knownget not {
+ /makepattern .systemvar /rangecheck signalerror
+ } if
.currentglobal false .setglobal exch
% Stack: proto matrix global buildproc
3 index dup length 1 add dict .copydict
Index: gs/src/zpcolor.c
===================================================================
--- gs/src/zpcolor.c (revision 7732)
+++ gs/src/zpcolor.c (working copy)
@@ -89,20 +89,58 @@
gs_client_color cc_instance;
ref *pPaintProc;
+ code = read_matrix(imemory, op, &mat);
+ if (code < 0)
+ return code;
check_type(*op1, t_dictionary);
check_dict_read(*op1);
gs_pattern1_init(&template);
- if ((code = read_matrix(imemory, op, &mat)) < 0 ||
- (code = dict_uid_param(op1, &template.uid, 1, imemory, i_ctx_p)) != 1 ||
- (code = dict_int_param(op1, "PaintType", 1, 2, 0, &template.PaintType)) < 0 ||
- (code = dict_int_param(op1, "TilingType", 1, 3, 0, &template.TilingType)) < 0 ||
- (code = dict_floats_param(imemory, op1, "BBox", 4, BBox, NULL)) < 0 ||
- (code = dict_float_param(op1, "XStep", 0.0, &template.XStep)) != 0 ||
- (code = dict_float_param(op1, "YStep", 0.0, &template.YStep)) != 0 ||
- (code = dict_find_string(op1, "PaintProc", &pPaintProc)) <= 0
- )
- return_error((code < 0 ? code : e_rangecheck));
+
+ code = dict_uid_param(op1, &template.uid, 1, imemory, i_ctx_p);
+ if (code < 0)
+ return code;
+ if (code != 1)
+ return_error(e_rangecheck);
+
+ code = dict_int_param(op1, "PaintType", 1, 2, 0, &template.PaintType);
+ if (code < 0)
+ return code;
+
+ code = dict_int_param(op1, "TilingType", 1, 3, 0, &template.TilingType);
+ if (code < 0)
+ return code;
+
+ code = dict_floats_param(imemory, op1, "BBox", 4, BBox, NULL);
+ if (code < 0)
+ return code;
+ if (code == 0)
+ return_error(e_undefined);
+
+ code = dict_float_param(op1, "XStep", 0.0, &template.XStep);
+ if (code < 0)
+ return code;
+ if (code == 1)
+ return_error(e_undefined);
+
+ code = dict_float_param(op1, "YStep", 0.0, &template.YStep);
+ if (code < 0)
+ return code;
+ if (code == 1)
+ return_error(e_undefined);
+
+ code = dict_find_string(op1, "PaintProc", &pPaintProc);
+ if (code < 0)
+ return code;
+ if (code == 0)
+ return_error(e_undefined);
+
check_proc(*pPaintProc);
+
+ if (mat.xx * mat.yy == mat.xy * mat.yx)
+ return_error(e_undefinedresult);
+ if (BBox[0] >= BBox[2] || BBox[1] >= BBox[3])
+ return_error(e_rangecheck);
+
template.BBox.p.x = BBox[0];
template.BBox.p.y = BBox[1];
template.BBox.q.x = BBox[2];
Index: gs/lib/pdf_ops.ps
===================================================================
--- gs/lib/pdf_ops.ps (revision 7732)
+++ gs/lib/pdf_ops.ps (working copy)
@@ -152,8 +152,8 @@
/csdevcmyk [/DeviceCMYK] readonly def
/cspattern [/Pattern] readonly def
/nullpattern1 mark
- /PatternType 1 /PaintType 1 /TilingType 3 /BBox [0 0 0 0]
- /XStep 1 /YStep 1 /PaintProc { }
+ /PatternType 1 /PaintType 1 /TilingType 3 /BBox [0 0 1 1]
+ /XStep 1 /YStep 1 /PaintProc { pop } bind
.dicttomark readonly def
/nullpattern2 nullpattern1 dup length dict copy readonly def
Index: gs/doc/pscet_status.txt
===================================================================
--- gs/doc/pscet_status.txt (revision 7734)
+++ gs/doc/pscet_status.txt (working copy)
@@ -3712,11 +3712,12 @@
18-02B-9 AOK 18-02A-4 repeat
Fill rule is ok, shadings sharper in GS than Adobe. - Raph
-18-02C-1 DIFF rangecheck vs. typecheck.
- undefined in cpsi not in GS. assign: Alex
+18-02C-1 DIFF Partialy fixed by rev. 7735.
+ Adobe doesn't restore operands of rectfill operator when
+ an error happen in the PaintProc function but
+ Ghostscript does. assign: Alex
-18-02D-1 DIFF GS missing text. GS has different error messages.
- GS printing extra pattern mid-page. assign Alex
+18-02D-1 OK Fixed by rev. 7735. - Alex
18-02E-1 DIFF much of postscript dump missing in gs. assign Ray
--------------070304040809090705090209
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline
_______________________________________________
gs-code-review mailing list
[email protected]
http://www.ghostscript.com/mailman/listinfo/gs-code-review
--------------070304040809090705090209--