From f57b7562c79a9e3649e95e7bafa6193b571154bb Mon Sep 17 00:00:00 2001 From: Chris Liddell Date: Mon, 23 Apr 2012 13:36:53 +0100 Subject: Handle the remaining CIDFonts that FAPI was missing. This causes a number of cluster file differences, almost all are the usual single pixel differences. There are few cases slightly better, and a few slightly worse. One file is a "regression" (depending on your point of view) which is badq.pdf where the two contours making up the lower case "q" both go in the same direction, so non-zero winding for filling results in the "loop" in the "q" being completely filled. The font is to blame here, but I will continue to look into a solution for Freetype. --- gs/psi/zfapi.c | 41 +++++++++++++++++++++++++++++------------ 1 file changed, 29 insertions(+), 12 deletions(-) (limited to 'gs') diff --git a/gs/psi/zfapi.c b/gs/psi/zfapi.c index 16ce38c25..a31f03d37 100644 --- a/gs/psi/zfapi.c +++ b/gs/psi/zfapi.c @@ -1379,6 +1379,7 @@ static int FAPI_prepare_font(i_ctx_t *i_ctx_p, FAPI_server *I, ref *pdr, gs_font pbfont1->FontBBox = pbfont->FontBBox; /* Inherit FontBBox from the type 9 font. */ if(array_get(imemory, rFDArray, i, &f) < 0 || r_type(&f) != t_dictionary) return_error(e_invalidfont); + I->ff.client_font_data = pbfont1; pbfont1->FAPI = pbfont->FAPI; I->ff.client_font_data2 = &f; @@ -1567,6 +1568,7 @@ static int zFAPIrebuildfont(i_ctx_t *i_ctx_p) if (code < 0) return code; + check_type(*op, t_boolean); if (pbfont->FAPI != 0) { /* If the font was processed with zFAPIpassfont, @@ -1608,8 +1610,6 @@ static int zFAPIrebuildfont(i_ctx_t *i_ctx_p) if (pfont->FontType == ft_CID_encrypted && v == NULL) { if ((code = build_proc_name_refs(imemory, &build, ".FAPIBuildGlyph9", ".FAPIBuildGlyph9")) < 0) return code; - pop(1); - return 0; } else if ((code = build_proc_name_refs(imemory, &build, ".FAPIBuildChar", ".FAPIBuildGlyph")) < 0) return code; @@ -2083,7 +2083,7 @@ static int FAPI_do_char(i_ctx_t *i_ctx_p, gs_font_base *pbfont, gx_device *dev, bool bIsType1GlyphData = IsType1GlyphData(pbfont); gs_log2_scale_point log2_scale = {0, 0}; int alpha_bits = (*dev_proc(dev, get_alpha_bits)) (dev, go_text); - double FontMatrix_div = (bCID && bIsType1GlyphData && font_file_path == NULL ? 1000 : 1); + double FontMatrix_div = 1; bool bVertical = (gs_rootfont(igs)->WMode != 0), bVertical0 = bVertical; double *sbwp, sbw[4] = {0, 0, 0, 0}; double em_scale_x, em_scale_y; @@ -2710,7 +2710,8 @@ retry_oversampling: /* We must use the FontBBox, but it seems some buggy fonts have glyphs which extend outside the * FontBBox, so we have to do this.... */ - if (pbfont->FontBBox.q.x > pbfont->FontBBox.p.x && pbfont->FontBBox.q.y > pbfont->FontBBox.p.y) { + if (!bCID && pbfont->FontBBox.q.x > pbfont->FontBBox.p.x + && pbfont->FontBBox.q.y > pbfont->FontBBox.p.y) { char_bbox.p.x = min(char_bbox.p.x, pbfont->FontBBox.p.x); char_bbox.p.y = min(char_bbox.p.y, pbfont->FontBBox.p.y); char_bbox.q.x = max(char_bbox.q.x, pbfont->FontBBox.q.x); @@ -2865,7 +2866,8 @@ static int FAPI_char(i_ctx_t *i_ctx_p, bool bBuildGlyph, ref *charstring) } static int FAPIBuildGlyph9aux(i_ctx_t *i_ctx_p) -{ os_ptr op = osp; /* */ +{ + os_ptr op = osp; /* */ ref font9 = *pfont_dict(gs_currentfont(igs)); ref *rFDArray, f; int font_index; @@ -2886,24 +2888,27 @@ static int FAPIBuildGlyph9aux(i_ctx_t *i_ctx_p) if ((code = FAPI_char(i_ctx_p, true, op - 2)) < 0) return code; /* */ - return 0; + return code; } /* .FAPIBuildChar - */ static int zFAPIBuildChar(i_ctx_t *i_ctx_p) -{ return FAPI_char(i_ctx_p, false, NULL); +{ + return FAPI_char(i_ctx_p, false, NULL); } /* non-CID : .FAPIBuildGlyph - */ /* CID : .FAPIBuildGlyph - */ static int zFAPIBuildGlyph(i_ctx_t *i_ctx_p) -{ return FAPI_char(i_ctx_p, true, NULL); +{ + return FAPI_char(i_ctx_p, true, NULL); } /* .FAPIBuildGlyph9 - */ static int zFAPIBuildGlyph9(i_ctx_t *i_ctx_p) -{ /* The alghorithm is taken from %Type9BuildGlyph - see gs_cidfn.ps . */ - os_ptr op = osp; +{ + /* The alghorithm is taken from %Type9BuildGlyph - see gs_cidfn.ps . */ + os_ptr lop, op = osp; int cid, code; avm_space s = ialloc_space(idmemory); @@ -2915,11 +2920,23 @@ static int zFAPIBuildGlyph9(i_ctx_t *i_ctx_p) op[0] = op[-2]; /* */ ialloc_set_space(idmemory, (r_is_local(op - 3) ? avm_global : avm_local)); /* for ztype9mapcid */ code = FAPIBuildGlyph9aux(i_ctx_p); - if (code != 0) { /* */ + lop = osp; + if (code == 5) { + int i, ind = (lop - op); + op = osp; + + for (i = ind; i >= 0; i--) { + op[-i - 2] = op[-i]; + } + pop(2); + } + else if (code < 0) { /* */ /* Adjust ostack for the correct error handling : */ make_int(op - 2, cid); pop(2); /* */ - } else { /* */ + } else if (code != 5) { /* */ + + pop(2); /* */ /* Note that this releases the charstring, and it may be garbage-collected before the interpreter calls fapi_finish_render. This requires the server -- cgit v1.2.3