mike@srava.sra.junet (Michael Smolenski) (06/01/89)
Thank you for version 1.2 of Ghostscript. I have been very happy with the performance. I have made a number of changes that I think you might be interested in. I have included the context diffs in this mail - feel free to use any that you think will improve ghostscript. Most changes have fairly obvious reasons, but some may be obscure. In particular, in gxfill.c I added a " <= 0.001" to find_cross_y(). This fixed some character drawing problems that were visible when things were scaled down (as far as characters, I especially remember 'h' and 90 rotated 'y' as being problems). If you haven`t seen these problems, it might be better not to apply that patch. If you have any questions, I can be reached at 'mike@sra.junet'. -------------- diffs diff -bc ghostscript-1.2/gschar.c newgs/gschar.c *** ghostscript-1.2/gschar.c Fri Feb 24 18:03:44 1989 --- newgs/gschar.c Wed May 31 19:17:38 1989 *************** *** 398,406 **** /* and undo the extra gsave. */ if ( penum->for_stringwidth ) { gs_point end_pt, start_pt; gs_currentpoint(pgs, &end_pt); gs_grestore(pgs); ! gs_currentpoint(pgs, &start_pt); penum->width.x = end_pt.x - start_pt.x; penum->width.y = end_pt.y - start_pt.y; } --- 398,411 ---- /* and undo the extra gsave. */ if ( penum->for_stringwidth ) { gs_point end_pt, start_pt; + gs_fixed_point pt; gs_currentpoint(pgs, &end_pt); gs_grestore(pgs); ! if ( gx_path_current_point(pgs->path, &pt) < 0 ) ! start_pt.x = start_pt.y = 0; /* no current point, use (0,0) */ ! else ! gs_itransform(pgs, fixed2float(pt.x), fixed2float(pt.y), ! &start_pt); penum->width.x = end_pt.x - start_pt.x; penum->width.y = end_pt.y - start_pt.y; } diff -bc ghostscript-1.2/gxfill.c newgs/gxfill.c *** ghostscript-1.2/gxfill.c Fri Feb 24 18:31:07 1989 --- newgs/gxfill.c Wed May 31 19:25:42 1989 *************** *** 303,312 **** find_cross_y(active_line *endp, active_line *alp, fixed y, fixed y1, fixed *cross_yp) { float cross_slope = al_slope(endp) - al_slope(alp); ! fixed diff_x; fixed y_limit; ! if ( cross_slope <= 0 ) return 0; ! diff_x = (float)(alp->x_current - endp->x_current); /* Compute the y limit, the min of endp's end, alp's end, and y1. */ y_limit = endp->y_end; if ( alp->y_end < y_limit ) y_limit = alp->y_end; --- 303,312 ---- find_cross_y(active_line *endp, active_line *alp, fixed y, fixed y1, fixed *cross_yp) { float cross_slope = al_slope(endp) - al_slope(alp); ! float diff_x; fixed y_limit; ! if ( cross_slope <= 0.001 ) return 0; ! diff_x = fixed2float(alp->x_current - endp->x_current); /* Compute the y limit, the min of endp's end, alp's end, and y1. */ y_limit = endp->y_end; if ( alp->y_end < y_limit ) y_limit = alp->y_end; *************** *** 316,326 **** printf("[f]cross? %lx %lx y_limit=%f -> ", (ulong)endp, (ulong)alp, fixed2float(y_limit)); #endif ! if ( diff_x < (y_limit - y) * cross_slope ) ! { *cross_yp = y + diff_x / cross_slope; #ifdef gs_DEBUG if ( gs_debug['f'] ) ! printf("%f\n", *cross_yp); #endif return 1; } --- 316,326 ---- printf("[f]cross? %lx %lx y_limit=%f -> ", (ulong)endp, (ulong)alp, fixed2float(y_limit)); #endif ! if ( diff_x < fixed2float(y_limit - y) * cross_slope ) ! { *cross_yp = float2fixed(fixed2float(y) + (diff_x / cross_slope)); #ifdef gs_DEBUG if ( gs_debug['f'] ) ! printf("%f\n", fixed2float(*cross_yp)); #endif return 1; } diff -bc ghostscript-1.2/gxpath.c newgs/gxpath.c *** ghostscript-1.2/gxpath.c Fri Feb 24 17:40:48 1989 --- newgs/gxpath.c Fri Mar 10 16:54:40 1989 *************** *** 188,193 **** --- 188,195 ---- gx_path_add_line(gx_path *ppath, fixed x, fixed y) { subpath *psub = ppath->current_subpath; register line_segment *lp; + if ( !ppath->position_valid ) + return_error(gs_error_nocurrentpoint); path_open(); path_alloc_segment(lp, line_segment, s_line); path_alloc_link(lp); *************** *** 230,235 **** --- 232,239 ---- fixed x1, fixed y1, fixed x2, fixed y2, fixed x3, fixed y3) { subpath *psub = ppath->current_subpath; register curve_segment *lp; + if ( !ppath->position_valid ) + return_error(gs_error_nocurrentpoint); path_open(); path_alloc_segment(lp, curve_segment, s_curve); path_alloc_link(lp); diff -bc ghostscript-1.2/iname.c newgs/iname.c *** ghostscript-1.2/iname.c Fri Feb 24 16:53:41 1989 --- newgs/iname.c Tue Mar 14 16:26:08 1989 *************** *** 36,41 **** --- 36,48 ---- while ( --pname >= name_table ) pname->value.pname = 0; } + /* get a names length */ + int + name_length(ref *ppname) + { + return ppname->value.pname->string.size; + } + /* Look up or enter a name in the table. */ /* Return 0 or an error code. */ /* The return may overlap the characters of the string! */ diff -bc ghostscript-1.2/iscan.c newgs/iscan.c *** ghostscript-1.2/iscan.c Fri Feb 24 16:49:53 1989 --- newgs/iscan.c Wed May 31 18:39:09 1989 *************** *** 389,395 **** while ( 1 ) { c = sgetc(s); if ( isdigit(c) ) c -= '0'; ! else if ( isalpha(c) ) c = toupper(c) - ('A' - 10); else break; if ( c >= radix ) break; if ( ival >= imax && (ival > imax || c > irem) ) --- 393,400 ---- while ( 1 ) { c = sgetc(s); if ( isdigit(c) ) c -= '0'; ! else if ( islower(c) ) c = c - ('a' - 10); ! else if ( isupper(c) ) c = c - ('A' - 10); else break; if ( c >= radix ) break; if ( ival >= imax && (ival > imax || c > irem) ) diff -bc ghostscript-1.2/zfile.c newgs/zfile.c *** ghostscript-1.2/zfile.c Fri Feb 24 17:02:53 1989 --- newgs/zfile.c Wed May 31 19:05:35 1989 *************** *** 358,363 **** --- 358,364 ---- sflush(s); if ( !s->writing ) fseek(s->file, 0L, 2); /* set to end */ + pop(1); return 0; } *************** *** 451,457 **** {"1bytesavailable", zbytesavailable}, {"1closefile", zclosefile}, {"0currentfile", zcurrentfile}, ! {"0currentfileposition", zcurrentfileposition}, {"1echo", zecho}, {"2file", zfile}, {"0flush", zflush}, --- 452,458 ---- {"1bytesavailable", zbytesavailable}, {"1closefile", zclosefile}, {"0currentfile", zcurrentfile}, ! {"1currentfileposition", zcurrentfileposition}, {"1echo", zecho}, {"2file", zfile}, {"0flush", zflush}, diff -bc ghostscript-1.2/zgeneric.c newgs/zgeneric.c *** ghostscript-1.2/zgeneric.c Fri Feb 24 17:32:10 1989 --- newgs/zgeneric.c Wed May 31 18:43:39 1989 *************** *** 76,81 **** --- 76,84 ---- zlength(register ref *op) { switch ( r_type(op) ) { + case t_name: /* names are also allowed in 'length' */ + make_int(op, name_length(op)); + return 0; case t_array: case t_packedarray: case t_string: *************** *** 135,142 **** if ( code ) return code; /* error */ } break; case t_array: - case t_packedarray: check_type(*op1, t_integer); if ( op1->value.intval < 0 || op1->value.intval >= op2->size ) return e_rangecheck; --- 138,146 ---- if ( code ) return code; /* error */ } break; + case t_packedarray: /* put into a packed array gets error */ + return e_invalidaccess; /* (doesn't matter now but, ...) */ case t_array: check_type(*op1, t_integer); if ( op1->value.intval < 0 || op1->value.intval >= op2->size ) return e_rangecheck; diff -bc ghostscript-1.2/zmath.c newgs/zmath.c *** ghostscript-1.2/zmath.c Fri Feb 24 17:11:25 1989 --- newgs/zmath.c Wed May 31 19:28:12 1989 *************** *** 136,141 **** --- 136,142 ---- if ( args[0] < 0.0 && (modf(args[1], &frac), frac != 0.0) ) return e_undefinedresult; result = pow(args[0], args[1]); + pop(1); make_real(op, result); return 0; } *************** *** 211,219 **** {"1log", zlog}, {"0rand", zrand}, {"0rrand", zrrand}, ! {"0sin", zsin}, ! {"0sqrt", zsqrt}, ! {"0srand", zsrand}, op_def_end }; z_op_init(my_defs); --- 212,220 ---- {"1log", zlog}, {"0rand", zrand}, {"0rrand", zrrand}, ! {"1sin", zsin}, ! {"1sqrt", zsqrt}, ! {"1srand", zsrand}, op_def_end }; z_op_init(my_defs); diff -bc ghostscript-1.2/zmisc.c newgs/zmisc.c *** ghostscript-1.2/zmisc.c Fri Feb 24 17:16:55 1989 --- newgs/zmisc.c Fri Mar 10 19:01:54 1989 *************** *** 37,44 **** { ref *bsp = op; /* bottom of stack */ /****** WHAT ABOUT PACKED ARRAYS? ******/ /****** SHOULD MAKE INNER ARRAYS READ-ONLY ******/ ! check_type(*op, t_array); ! if ( !(r_attrs(op) & a_write) ) return e_invalidaccess; *++bsp = *op; while ( bsp > op ) { while ( bsp->size ) --- 37,79 ---- { ref *bsp = op; /* bottom of stack */ /****** WHAT ABOUT PACKED ARRAYS? ******/ /****** SHOULD MAKE INNER ARRAYS READ-ONLY ******/ ! /* ! This postscript fragment show what to do about packed arrays when ! sent to a LaserWriter: ! ! /Times-Roman findfont 20 scalefont setfont ! ! /p { ( bound) systemdict /show get exec } def ! ! /a { moveto show p } def ! /b { moveto show p } bind def ! /c { moveto show p } readonly bind def ! /d { moveto show p } bind readonly def ! ! true setpacking ! ! /e { moveto show p } def ! /f { moveto show p } bind def ! /g { moveto show p } readonly bind def ! /h { moveto show p } bind readonly def ! ! /show { systemdict /show get exec ! ( not) systemdict /show get exec } def ! ! (def - ) 100 100 a ! (bind def - ) 100 200 b ! (readonly bind def - ) 100 300 c ! (bind readonly def - ) 100 400 d ! (def - ) 300 150 e ! (bind def - ) 300 250 f ! (readonly bind def - ) 300 350 g ! (bind readonly def - ) 300 450 h ! ! showpage ! */ ! check_array(*op); ! if ( r_type(op) != t_packedarray && /*can bind a readonly packed array*/ ! !(r_attrs(op) & a_write) ) return 0; *++bsp = *op; while ( bsp > op ) { while ( bsp->size ) *************** *** 54,60 **** } break; case t_array: /* push into array if procedure */ ! if ( !(~r_attrs(tp) & (a_executable+a_write)) && bsp < ostop ) *++bsp = *tp; } } --- 89,97 ---- } break; case t_array: /* push into array if procedure */ ! if ( (r_attrs(tp) & a_executable) && ! (r_type(tp) != t_packedarray && ! !(~r_attrs(tp) & a_write)) && bsp < ostop ) *++bsp = *tp; } } diff -bc ghostscript-1.2/zrelbit.c newgs/zrelbit.c *** ghostscript-1.2/zrelbit.c Fri Feb 24 17:14:24 1989 --- newgs/zrelbit.c Mon Mar 6 17:54:07 1989 *************** *** 229,234 **** --- 229,235 ---- break; default: return e_typecheck; } + break; case t_real: real1 = op1->value.realval; switch ( r_type(op) ) diff -bc ghostscript-1.2/ztype.c newgs/ztype.c *** ghostscript-1.2/ztype.c Fri Feb 24 17:04:38 1989 --- newgs/ztype.c Mon May 8 08:17:16 1989 *************** *** 191,197 **** } val = (ival < 0 ? -ival : ival); do ! { *--dp = val % radix + '0'; val /= radix; } while ( val ); --- 191,198 ---- } val = (ival < 0 ? -ival : ival); do ! { ! *--dp = val % radix + ((val % radix) < 10 ? '0' : ('A' - 10)); val /= radix; } while ( val ); -------------- end diffs