aida@CSL.SRI.COM (Hitoshi Aida) (05/01/89)
The BuildChar interface of the Ghostscript is not compatible with the PostScript in that the character coordinate system is not translated to the currentpoint. This is a fix for it. Hitoshi AIDA (aida@csl.sri.com) Computer Science Laboratory, SRI International *** gschar.c Fri Apr 28 15:34:43 1989 --- gschar.c.org Fri Feb 24 01:03:58 1989 *************** *** 27,33 **** #include "gzdevice.h" /* must precede gxchar */ #include "gxfont.h" #include "gxchar.h" ! #include "gzpath.h" /* gxpath->gzpath 04/25/89 H.AIDA */ #include "gzstate.h" /* Export the FontType that corresponds to */ --- 27,33 ---- #include "gzdevice.h" /* must precede gxchar */ #include "gxfont.h" #include "gxchar.h" ! #include "gxpath.h" #include "gzstate.h" /* Export the FontType that corresponds to */ *************** *** 296,316 **** cc->offset.y = -min(cll.y, cur.y); /* Check whether the copy will succeed */ gx_color_render(pgs->color, pgs); ! /* Begin code modified by H.AIDA 04/27/89 */ ! if ( (code = gs_gsave(pgs)) < 0 ) ! { gx_unalloc_cached_char(dir, cc); ! return code; ! } ! cur.x = pgs->path->position.x - pgs->ctm.tx_fixed; ! cur.y = pgs->path->position.y - pgs->ctm.ty_fixed; ! gs_moveto(pgs, (floatp)0, (floatp)0); ! if ( gx_copy_cached_char(pgs, cc, 0) > 0 ) ! { gx_unalloc_cached_char(dir, cc); ! gs_grestore(pgs); ! return 0; ! } ! gs_grestore(pgs); ! /* End code modified by H.AIDA 04/27/89 */ /* Nothing can go wrong now.... */ penum->cc = cc; cc->code = gs_show_current_char(penum); --- 296,309 ---- cc->offset.y = -min(cll.y, cur.y); /* Check whether the copy will succeed */ gx_color_render(pgs->color, pgs); ! if ( gx_copy_cached_char(pgs, cc, 0) > 0 ) ! { gx_unalloc_cached_char(dir, cc); ! return 0; ! } ! if ( (code = gs_gsave(pgs)) < 0 ) ! { gx_unalloc_cached_char(dir, cc); ! return code; ! } /* Nothing can go wrong now.... */ penum->cc = cc; cc->code = gs_show_current_char(penum); *************** *** 322,334 **** pgs->device = &penum->dev_cache_dev; /* Adjust the translation in the graphics context */ /* so that the character lines up with the cache. */ - /* Modified by H.AIDA 04/27/89 */ - pgs->ctm.tx = fixed2float(pgs->ctm.tx_fixed = cc->offset.x); - pgs->ctm.ty = fixed2float(pgs->ctm.ty_fixed = cc->offset.y); - pgs->inverse_valid = 0; - pgs->path->position.x = cc->offset.x + cur.x; - pgs->path->position.y = cc->offset.y + cur.y; - /* Old code .... { gs_matrix mat; gs_currentmatrix(pgs, &mat); mat.tx = fixed2float(cc->offset.x); --- 315,320 ---- *************** *** 386,396 **** code = gx_copy_cached_char(pgs, cc, 1); if ( code < 0 ) return code; } ! } break; /* 04/27/89 H.AIDA */ case sws_no_cache: ; - gs_grestore(pgs); /* 04/27/89 H.AIDA */ } ! /* gs_grestore(pgs); 04/27/89 H.AIDA */ color_loaded = 0; move: if ( penum->add ) gs_rmoveto(pgs, penum->ax, penum->ay); --- 372,381 ---- code = gx_copy_cached_char(pgs, cc, 1); if ( code < 0 ) return code; } ! } case sws_no_cache: ; } ! gs_grestore(pgs); color_loaded = 0; move: if ( penum->add ) gs_rmoveto(pgs, penum->ax, penum->ay); *************** *** 453,462 **** /* Character is not cached, client must render it. */ if ( (code = gs_gsave(pgs)) < 0 ) return code; gs_setmatrix(pgs, &pgs->char_tm); - /* quick "currentpoint translate" 04/26/89 H.AIDA */ - pgs->ctm.tx = fixed2float(pgs->ctm.tx_fixed = pgs->path->position.x); - pgs->ctm.ty = fixed2float(pgs->ctm.ty_fixed = pgs->path->position.y); - pgs->inverse_valid = 0; penum->width_set = sws_none; penum->update = 1; /* Try using the build procedure in the font. */ --- 438,443 ----