[gs-code-review] Fix for 35_all-12, glyphshow errors
Alex Cherepanov
alexcher at quadnet.net
Fri Feb 16 20:55:55 PST 2007
CET 35_all-12 tests, among other things, how glyphshow operator handles
type 32 fonts without glyph 0.
The proposed patch add a check to the BuildGlyph procedure of type 32
font for the missing 0 glyph that throws /invalidfont error.
The offending command name is retrieved from the text enumeration
structure using a new operator - .getshowoperator
DIFFERENCES:
There's no raster differences on regression test
but the order of dictionary and resource enumeration is disturbed
in all possible places.
23-32-02 different address of an operator
28-06-01 different directory enumeration order
23-25-03 different order of resource enumeration
09-56-01 different order of resource enumeration
409-01.PS different order of resource enumeration
Type1C fonts in PDF files depend on directory enumeration order.
-------------- next part --------------
Index: gs/src/zcharx.c
===================================================================
--- gs/src/zcharx.c (revision 7704)
+++ gs/src/zcharx.c (working copy)
@@ -19,6 +19,7 @@
#include "gstext.h"
#include "gxfixed.h" /* for gxfont.h */
#include "gxfont.h"
+#include "gxtext.h"
#include "ialloc.h"
#include "ichar.h"
#include "igstate.h"
@@ -58,6 +59,7 @@
if ((code = glyph_show_setup(i_ctx_p, &glyph)) != 0 ||
(code = gs_glyphshow_begin(igs, glyph, imemory, &penum)) < 0)
return code;
+ *(op_proc_t *)&penum->enum_client_data = zglyphshow;
if ((code = op_show_finish_setup(i_ctx_p, penum, 1, NULL)) < 0) {
ifree_object(penum, "zglyphshow");
return code;
Index: gs/src/zfont32.c
===================================================================
--- gs/src/zfont32.c (revision 7704)
+++ gs/src/zfont32.c (working copy)
@@ -19,8 +19,10 @@
#include "gsmatrix.h"
#include "gsutil.h"
#include "gxfont.h"
+#include "gxtext.h"
#include "bfont.h"
#include "store.h"
+#include "ichar.h"
/* The encode_char procedure of a Type 32 font should never be called. */
private gs_glyph
@@ -59,10 +61,31 @@
return define_gs_font((gs_font *) pfont);
}
+/* - .getshowoperator <oper|null> */
+/* Get the calling operator for error reporting in %Type32BuildGlyph */
+private int
+zgetshowoperator(i_ctx_t *i_ctx_p)
+{
+ os_ptr op = osp;
+ gs_text_enum_t *osenum = op_show_find(i_ctx_p);
+
+ push(1);
+ if (osenum == NULL)
+ make_null(op);
+ else {
+ op_proc_t proc;
+ *(void **)&proc = osenum->enum_client_data;
+ make_oper(op, 0, proc);
+ }
+ return 0;
+}
+
+
/* ------ Initialization procedure ------ */
const op_def zfont32_op_defs[] =
{
{"2.buildfont32", zbuildfont32},
+ {"0.getshowoperator", zgetshowoperator},
op_def_end(0)
};
Index: gs/lib/gs_typ32.ps
===================================================================
--- gs/lib/gs_typ32.ps (revision 7704)
+++ gs/lib/gs_typ32.ps (working copy)
@@ -95,8 +95,14 @@
(%Type32BuildGlyph) cvn { % <font> <cid> %Type32BuildGlyph -
1 index /CharStrings get
% Stack: font cid CharStrings
- dup 2 index .knownget
- { exch pop } { 0 get } ifelse
+ dup 2 index .knownget {
+ exch pop
+ } {
+ 0 .knownget not {
+ exch pop % Stack: cid
+ .getshowoperator /invalidfont signalerror
+ } if
+ } ifelse
% Stack: font cid cstr
dup //.getmetrics32 % use // because of .undef below
dup 14 gt {
@@ -116,7 +122,7 @@
[ 1 0 0 1 11 -2 roll exch neg exch neg ] 5 -1 roll imagemask
} ifelse
pop pop pop pop
-} bind def
+} .bind def
systemdict /.getmetrics32 .undef
Index: gs/src/int.mak
===================================================================
--- gs/src/int.mak (revision 7704)
+++ gs/src/int.mak (working copy)
@@ -777,8 +777,8 @@
$(PSCC) $(PSO_)zchar32.$(OBJ) $(C_) $(PSSRC)zchar32.c
$(PSOBJ)zfont32.$(OBJ) : $(PSSRC)zfont32.c $(OP)\
- $(gsccode_h) $(gsmatrix_h) $(gsutil_h) $(gxfont_h)\
- $(bfont_h) $(store_h)
+ $(gsccode_h) $(gsmatrix_h) $(gsutil_h) $(gxfont_h) $(gxtext_h)\
+ $(bfont_h) $(store_h) $(ichar_h)
$(PSCC) $(PSO_)zfont32.$(OBJ) $(C_) $(PSSRC)zfont32.c
type32_=$(PSOBJ)zchar32.$(OBJ) $(PSOBJ)zfont32.$(OBJ)
@@ -1438,7 +1438,7 @@
$(PSCC) $(PSO_)ibnum.$(OBJ) $(C_) $(PSSRC)ibnum.c
$(PSOBJ)zcharx.$(OBJ) : $(PSSRC)zcharx.c $(OP)\
- $(gsmatrix_h) $(gstext_h) $(gxfixed_h) $(gxfont_h)\
+ $(gsmatrix_h) $(gstext_h) $(gxfixed_h) $(gxfont_h) $(gxtext_h)\
$(ialloc_h) $(ibnum_h) $(ichar_h) $(iname_h) $(igstate_h) $(memory__h)
$(PSCC) $(PSO_)zcharx.$(OBJ) $(C_) $(PSSRC)zcharx.c
Index: gs/doc/pscet_status.txt
===================================================================
--- gs/doc/pscet_status.txt (revision 7709)
+++ gs/doc/pscet_status.txt (working copy)
@@ -5523,7 +5523,7 @@
GS is not removing glyphs from previous page "currentfont removeall".
Assign: Ray
-35_all-12 DIFF glyphshow : Different error reporting. Analyzed by Igor. assign: Alex.
+35_all-12 OK Fixed by rev. 7710 - Alex.
35_all-2 OK Fixed as of rev 7583.
More information about the gs-code-review
mailing list