diff options
Diffstat (limited to 'src')
100 files changed, 10142 insertions, 5967 deletions
diff --git a/src/Speedo/bics-iso.h b/src/Speedo/bics-iso.h index f520562..d3cd35b 100644 --- a/src/Speedo/bics-iso.h +++ b/src/Speedo/bics-iso.h @@ -26,6 +26,7 @@ other dealings in this Software without prior written authorization from The Open Group. */ +/* $XFree86: xc/lib/font/Speedo/bics-iso.h,v 1.7 2001/12/14 19:56:41 dawes Exp $ */ int sp_bics_map[] = { 32, 0, diff --git a/src/Speedo/do_char.c b/src/Speedo/do_char.c index 0ae416b..f28af7c 100644 --- a/src/Speedo/do_char.c +++ b/src/Speedo/do_char.c @@ -21,6 +21,7 @@ INCIDENTAL OR CONSEQUENTIAL DAMAGES, ARISING OUT OF OR IN ANY WAY CONNECTED WITH THE SPEEDO SOFTWARE OR THE BITSTREAM CHARTER OUTLINE FONT. */ +/* $XFree86: xc/lib/font/Speedo/do_char.c,v 1.4 2001/08/27 19:49:50 dawes Exp $ */ /***************************** D O - C H A R . C ***************************** * * @@ -52,24 +53,16 @@ WITH THE SPEEDO SOFTWARE OR THE BITSTREAM CHARTER OUTLINE FONT. /***** STATIC FUNCTIONS *****/ -#if PROTOS_AVAIL static boolean sp_make_simp_char(PROTO_DECL2 ufix8 FONTFAR *pointer,ufix8 format); static boolean sp_make_comp_char(PROTO_DECL2 ufix8 FONTFAR *pointer); static ufix8 FONTFAR *sp_get_char_org(PROTO_DECL2 ufix16 char_index,boolean top_level); static fix15 sp_get_posn_arg(PROTO_DECL2 ufix8 FONTFAR *STACKFAR *ppointer,ufix8 format); static fix15 sp_get_scale_arg(PROTO_DECL2 ufix8 FONTFAR *STACKFAR *ppointer,ufix8 format); -#else -static boolean sp_make_simp_char(); /* Process simple character data */ -static boolean sp_make_comp_char(); /* Process compound character data */ -static ufix8 FONTFAR *sp_get_char_org(); /* Look up char in character directory */ -static fix15 sp_get_posn_arg(); /* Read Xpos Ypos args in DOCH instruction */ -static fix15 sp_get_scale_arg(); /* read Xscale Yscale args in DOCH instruction */ -#endif -FUNCTION ufix16 get_char_id(char_index) +FUNCTION ufix16 get_char_id( GDECL -ufix16 char_index; /* Index to character in char directory */ +ufix16 char_index) /* Index to character in char directory */ /* * Returns character id for specified character index in currently * selected font. @@ -97,9 +90,9 @@ return 0xffff & NEXT_WORD(pointer); /* Return character id */ #if INCL_METRICS -FUNCTION fix31 get_char_width(char_index) +FUNCTION fix31 get_char_width( GDECL -ufix16 char_index; /* Index to character in char directory */ +ufix16 char_index) /* Index to character in char directory */ /* * Returns character set width for specified character index in currently * selected font in units of 1/65536 em. @@ -131,10 +124,10 @@ return set_width; /* Return in 1/65536 em units */ #endif #if INCL_METRICS -FUNCTION fix15 get_track_kern(track, point_size) +FUNCTION fix15 get_track_kern( GDECL -fix15 track; /* Track required (0 - 3) */ -fix15 point_size; /* Point size (units of whole points) */ +fix15 track, /* Track required (0 - 3) */ +fix15 point_size) /* Point size (units of whole points) */ /* * Returns inter-character spacing adjustment in units of 1/256 * points for the specified kerning track and point size. @@ -153,16 +146,16 @@ fix15 point_size; /* Point size (units of whole points) */ */ { ufix8 FONTFAR *pointer; /* Pointer to character data */ -fix15 no_tracks; /* Number of kerning tracks in font */ -ufix8 format; /* Track kerning format byte */ -fix15 i; /* Track counter */ -fix15 min_pt_size; /* Minimum point size for track */ -fix15 max_pt_size; /* Maximum point size for track */ -fix15 min_adj; /* Adjustment for min point size */ -fix15 max_adj; /* Adjustment for max point size */ -fix31 delta_pt_size;/* Max point size - min point size */ -fix31 delta_adj; /* Min adjustment - max adjustment */ -fix15 adj = 0; /* Interpolated adjustment */ +fix15 no_tracks; /* Number of kerning tracks in font */ +ufix8 format; /* Track kerning format byte */ +fix15 i; /* Track counter */ +fix15 min_pt_size = 0; /* Minimum point size for track */ +fix15 max_pt_size = 0; /* Maximum point size for track */ +fix15 min_adj = 0; /* Adjustment for min point size */ +fix15 max_adj = 0; /* Adjustment for max point size */ +fix31 delta_pt_size; /* Max point size - min point size */ +fix31 delta_adj; /* Min adjustment - max adjustment */ +fix15 adj = 0; /* Interpolated adjustment */ if (track == 0) /* Track zero selected? */ { @@ -220,10 +213,10 @@ return adj; /* Return interpolated adjustment (1/256 points #endif #if INCL_METRICS -FUNCTION fix31 get_pair_kern(char_index1, char_index2) +FUNCTION fix31 get_pair_kern( GDECL -ufix16 char_index1; /* Index to first character in char directory */ -ufix16 char_index2; /* Index to second character in char directory */ +ufix16 char_index1, /* Index to first character in char directory */ +ufix16 char_index2) /* Index to second character in char directory */ /* * Returns inter-character spacing adjustment in units of 1/65536 em * for the specified pair of characters. @@ -243,7 +236,7 @@ fix15 nn; /* Number of kern pairs in first partition */ fix15 base; /* Index to first record in rem kern pairs */ fix15 i; /* Index to kern pair being tested */ fix31 adj = 0; /* Returned value of adjustment */ -fix15 adj_base; /* Adjustment base for relative adjustments */ +fix15 adj_base = 0; /* Adjustment base for relative adjustments */ if (!sp_globals.specs_valid) /* Font specs not defined? */ { @@ -310,10 +303,10 @@ return adj; /* Return pair kerning adjustment */ #if INCL_METRICS #ifdef old -FUNCTION boolean get_char_bbox(char_index, bbox) +FUNCTION boolean get_char_bbox( GDECL -ufix16 char_index; -bbox_t *bbox; +ufix16 char_index, +bbox_t *bbox) { /* * returns true if character exists, false if it doesn't @@ -368,10 +361,10 @@ return TRUE; #else /* new code, 4/25/91 */ -FUNCTION boolean get_char_bbox(char_index, bbox) +FUNCTION boolean get_char_bbox( GDECL -ufix16 char_index; -bbox_t *bbox; +ufix16 char_index, +bbox_t *bbox) { /* * returns true if character exists, false if it doesn't @@ -447,10 +440,10 @@ return TRUE; #if INCL_ISW -FUNCTION boolean make_char_isw(char_index,imported_setwidth) +FUNCTION boolean make_char_isw( GDECL -ufix16 char_index; -ufix32 imported_setwidth; +ufix16 char_index, +ufix32 imported_setwidth) { fix15 xmin; /* Minimum X ORU value in font */ fix15 xmax; /* Maximum X ORU value in font */ @@ -481,17 +474,17 @@ if (sp_globals.isw_modified_constants) return (return_value); } -FUNCTION boolean make_char(char_index) +FUNCTION boolean make_char( GDECL -ufix16 char_index; /* Index to character in char directory */ +ufix16 char_index) /* Index to character in char directory */ { sp_globals.import_setwidth_act = FALSE; return (do_make_char(char_index)); } -FUNCTION static boolean do_make_char(char_index) +FUNCTION static boolean do_make_char(GDECL ufix16 char_index) #else -FUNCTION boolean make_char(char_index) +FUNCTION boolean make_char(GDECL ufix16 char_index) #endif /* * Outputs specified character using the currently selected font and @@ -500,8 +493,6 @@ FUNCTION boolean make_char(char_index) * previously set. * Reports Error 12 and returns FALSE if character data not available. */ -GDECL -ufix16 char_index; { ufix8 FONTFAR *pointer; /* Pointer to character data */ fix15 x_orus; @@ -594,10 +585,10 @@ else } } -FUNCTION static boolean sp_make_simp_char(pointer, format) +FUNCTION static boolean sp_make_simp_char( GDECL -ufix8 FONTFAR *pointer; /* Pointer to first byte of position argument */ -ufix8 format; /* Character format byte */ +ufix8 FONTFAR *pointer, /* Pointer to first byte of position argument */ +ufix8 format) /* Character format byte */ /* * Called by sp_make_char() to output a simple (non-compound) character. * Returns TRUE on completion. @@ -655,9 +646,9 @@ if (fn_begin_char(sp_globals.Psw, Pmin, Pmax)) /* Signal start of character return TRUE; } -FUNCTION static boolean sp_make_comp_char(pointer) +FUNCTION static boolean sp_make_comp_char( GDECL -ufix8 FONTFAR *pointer; /* Pointer to first byte of position argument */ +ufix8 FONTFAR *pointer) /* Pointer to first byte of position argument */ /* * Called by sp_make_char() to output a compound character. * Returns FALSE if data for any sub-character is not available. @@ -796,10 +787,10 @@ return TRUE; } #if INCL_LCD /* Dynamic load character data supported? */ -FUNCTION static ufix8 FONTFAR *sp_get_char_org(char_index, top_level) +FUNCTION static ufix8 FONTFAR *sp_get_char_org( GDECL -ufix16 char_index; /* Index of character to be accessed */ -boolean top_level; /* Not a compound character element */ +ufix16 char_index, /* Index of character to be accessed */ +boolean top_level) /* Not a compound character element */ /* * Called by sp_get_char_id(), sp_get_char_width(), sp_make_char() and * sp_make_comp_char() to get a pointer to the start of the character data @@ -864,10 +855,10 @@ return pchar_data->org; /* Return pointer into character data buff #if INCL_LCD #else /* Dynamic load character data not supported? */ -FUNCTION static ufix8 FONTFAR *sp_get_char_org(char_index, top_level) +FUNCTION static ufix8 FONTFAR *sp_get_char_org( GDECL -ufix16 char_index; /* Index of character to be accessed */ -boolean top_level; /* Not a compound character element */ +ufix16 char_index, /* Index of character to be accessed */ +boolean top_level) /* Not a compound character element */ /* * Called by sp_get_char_id(), sp_get_char_width(), sp_make_char() and * sp_make_comp_char() to get a pointer to the start of the character data @@ -915,10 +906,10 @@ return sp_globals.pfont->org + char_offset; /* Return pointer into font buf #endif -FUNCTION static fix15 sp_get_posn_arg(ppointer, format) +FUNCTION static fix15 sp_get_posn_arg( GDECL -ufix8 FONTFAR * STACKFAR *ppointer; /* Pointer to first byte of position argument */ -ufix8 format; /* Format of DOCH arguments */ +ufix8 FONTFAR * STACKFAR *ppointer, /* Pointer to first byte of position argument */ +ufix8 format) /* Format of DOCH arguments */ /* * Called by sp_make_comp_char() to read a position argument from the * specified point in the font/char buffer. @@ -939,10 +930,10 @@ default: } } -FUNCTION static fix15 sp_get_scale_arg(ppointer, format) +FUNCTION static fix15 sp_get_scale_arg( GDECL -ufix8 FONTFAR *STACKFAR *ppointer; /* Pointer to first byte of position argument */ -ufix8 format; /* Format of DOCH arguments */ +ufix8 FONTFAR *STACKFAR *ppointer, /* Pointer to first byte of position argument */ +ufix8 format) /* Format of DOCH arguments */ /* * Called by sp_make_comp_char() to read a scale argument from the * specified point in the font/char buffer. @@ -956,10 +947,10 @@ else return (fix15)ONE_SCALE; } #if INCL_ISW || INCL_SQUEEZING -FUNCTION static void preview_bounding_box(pointer,format) +FUNCTION static void preview_bounding_box( GDECL -ufix8 FONTFAR *pointer; /* Pointer to first byte of position argument */ -ufix8 format; /* Character format byte */ +ufix8 FONTFAR *pointer, /* Pointer to first byte of position argument */ +ufix8 format) /* Character format byte */ { point_t Pmin, Pmax; /* Transformed corners of bounding box */ @@ -984,9 +975,9 @@ x */ } #endif #if INCL_ISW -FUNCTION static boolean reset_xmax(xmax) +FUNCTION static boolean reset_xmax( GDECL -fix31 xmax; +fix31 xmax) { fix15 xmin; /* Minimum X ORU value in font */ diff --git a/src/Speedo/do_trns.c b/src/Speedo/do_trns.c index b003284..25bc02a 100644 --- a/src/Speedo/do_trns.c +++ b/src/Speedo/do_trns.c @@ -21,6 +21,7 @@ INCIDENTAL OR CONSEQUENTIAL DAMAGES, ARISING OUT OF OR IN ANY WAY CONNECTED WITH THE SPEEDO SOFTWARE OR THE BITSTREAM CHARTER OUTLINE FONT. */ +/* $XFree86: xc/lib/font/Speedo/do_trns.c,v 1.4 2001/08/27 19:49:50 dawes Exp $ */ /**************************** D O _ T R N S . C ****************************** * * @@ -53,21 +54,16 @@ WITH THE SPEEDO SOFTWARE OR THE BITSTREAM CHARTER OUTLINE FONT. /***** STATIC FUNCTIONS *****/ -#if PROTOS_AVAIL static void sp_split_curve(PROTO_DECL2 point_t P1,point_t P2,point_t P3,fix15 depth); static ufix8 FONTFAR *sp_get_args(PROTO_DECL2 ufix8 FONTFAR *pointer,ufix8 format,point_t STACKFAR *pP); -#else -static void sp_split_curve(); /* Split Bezier curve into vectors */ -static ufix8 FONTFAR *sp_get_args(); /* Read X Y argument pair */ -#endif -FUNCTION ufix8 FONTFAR *read_bbox(pointer, pPmin, pPmax, set_flag) +FUNCTION ufix8 FONTFAR *read_bbox( GDECL -ufix8 FONTFAR *pointer; /* Pointer to next byte in char data */ -point_t STACKFAR *pPmin; /* Lower left corner of bounding box */ -point_t STACKFAR *pPmax; /* Upper right corner of bounding box */ -boolean set_flag; /* flag to indicate whether global oru bbox should be saved */ +ufix8 FONTFAR *pointer, /* Pointer to next byte in char data */ +point_t STACKFAR *pPmin, /* Lower left corner of bounding box */ +point_t STACKFAR *pPmax, /* Upper right corner of bounding box */ +boolean set_flag) /* flag to indicate whether global oru bbox should be saved */ /* * Called by make_simp_char() and make_comp_char() to read the * bounding box data from the font. @@ -79,7 +75,7 @@ boolean set_flag; /* flag to indicate whether global oru bbox should be saved */ */ { ufix8 format1; -ufix8 format; +ufix8 format = 0; fix15 i; point_t P; @@ -155,9 +151,9 @@ printf("BBOX %6.1f(Xint 0), %6.1f(Yint 0), %6.1f(Xint %d), %6.1f(Yint %d)\n", return pointer; } -FUNCTION void proc_outl_data(pointer) +FUNCTION void proc_outl_data( GDECL -ufix8 FONTFAR *pointer; /* Pointer to next byte in char data */ +ufix8 FONTFAR *pointer) /* Pointer to next byte in char data */ /* * Called by make_simp_char() and make_comp_char() to read the * outline data from the font. @@ -310,12 +306,12 @@ record_yint((fix15)(sp_globals.y_int - sp_globals.Y_int_org)); /* Record yint da } } -FUNCTION static void sp_split_curve(P1, P2, P3, depth) +FUNCTION static void sp_split_curve( GDECL -point_t P1; /* First control point of Bezier curve */ -point_t P2; /* Second control point of Bezier curve */ -point_t P3; /* End point of Bezier curve */ -fix15 depth; /* Levels of recursive subdivision required */ +point_t P1, /* First control point of Bezier curve */ +point_t P2, /* Second control point of Bezier curve */ +point_t P3, /* End point of Bezier curve */ +fix15 depth) /* Levels of recursive subdivision required */ /* * Called by proc_outl_data() to subdivide Bezier curves into an * appropriate number of vectors, whenever curves are not enabled @@ -369,11 +365,11 @@ else } } -FUNCTION static ufix8 FONTFAR *sp_get_args(pointer, format, pP) +FUNCTION static ufix8 FONTFAR *sp_get_args( GDECL -ufix8 FONTFAR *pointer; /* Pointer to next byte in char data */ -ufix8 format; /* Format specifiaction of argument pair */ -point_t STACKFAR *pP; /* Resulting transformed point */ +ufix8 FONTFAR *pointer, /* Pointer to next byte in char data */ +ufix8 format, /* Format specifiaction of argument pair */ +point_t STACKFAR *pP) /* Resulting transformed point */ /* * Called by read_bbox() and proc_outl_data() to read an X Y argument * pair from the font. diff --git a/src/Speedo/out_bl2d.c b/src/Speedo/out_bl2d.c index d14f8c3..74a7310 100644 --- a/src/Speedo/out_bl2d.c +++ b/src/Speedo/out_bl2d.c @@ -21,6 +21,7 @@ INCIDENTAL OR CONSEQUENTIAL DAMAGES, ARISING OUT OF OR IN ANY WAY CONNECTED WITH THE SPEEDO SOFTWARE OR THE BITSTREAM CHARTER OUTLINE FONT. */ +/* $XFree86: xc/lib/font/Speedo/out_bl2d.c,v 1.4 2001/01/17 19:43:17 dawes Exp $ */ /*************************** O U T _ B L 2 D . C ***************************** * * @@ -54,21 +55,15 @@ WITH THE SPEEDO SOFTWARE OR THE BITSTREAM CHARTER OUTLINE FONT. /***** STATIC FUNCTIONS *****/ #if INCL_2D -#if PROTOS_AVAIL static void sp_draw_vector_to_2d(PROTO_DECL2 fix15 x0,fix15 y0,fix15 x1,fix15 y1,band_t GLOBALFAR *band); static void sp_add_intercept_2d(PROTO_DECL2 fix15 y,fix15 x); static void sp_proc_intercepts_2d(PROTO_DECL1); -#else -static void sp_add_intercept_2d(); -static void sp_proc_intercepts_2d(); -static void sp_draw_vector_to_2d(); -#endif #endif #if INCL_2D -FUNCTION boolean init_2d(specsarg) +FUNCTION boolean init_2d( GDECL -specs_t GLOBALFAR *specsarg; +specs_t GLOBALFAR *specsarg) /* * init_out_2d() is called by sp_set_specs() to initialize the output module. * Returns TRUE if output module can accept requested specifications. @@ -87,11 +82,11 @@ return TRUE; #endif #if INCL_2D -FUNCTION boolean begin_char_2d(Psw, Pmin, Pmax) +FUNCTION boolean begin_char_2d( GDECL -point_t Psw; -point_t Pmin; -point_t Pmax; +point_t Psw, +point_t Pmin, +point_t Pmax) /* Called once at the start of the character generation process * Initializes intercept table, either calculates pixel maxima or * decides that they need to be collected @@ -113,10 +108,10 @@ return TRUE; #if INCL_2D -FUNCTION void begin_contour_2d(P1, outside) +FUNCTION void begin_contour_2d( GDECL -point_t P1; -boolean outside; +point_t P1, +boolean outside) /* Called at the start of each contour */ { @@ -133,9 +128,9 @@ sp_globals.y0_spxl = P1.y; #endif #if INCL_2D -FUNCTION void line_2d(P1) +FUNCTION void line_2d( GDECL -point_t P1; +point_t P1) /* * Called for each vector in the transformed character * "draws" vector into intercept table @@ -180,13 +175,13 @@ sp_globals.x0_spxl = P1.x; sp_globals.y0_spxl = P1.y; /* update endpoint */ } -FUNCTION static void sp_draw_vector_to_2d(x0, y0, x1, y1, band) +FUNCTION static void sp_draw_vector_to_2d( GDECL -fix15 x0; /* X coordinate */ -fix15 y0; /* Y coordinate */ -fix15 x1; -fix15 y1; -band_t GLOBALFAR *band; +fix15 x0, /* X coordinate */ +fix15 y0, /* Y coordinate */ +fix15 x1, +fix15 y1, +band_t GLOBALFAR *band) { register fix15 how_many_y; /* # of intercepts at y = n + 1/2 */ register fix15 yc; /* Current scan-line */ @@ -290,7 +285,6 @@ if (how_many_y < 0) #if INCL_2D FUNCTION boolean end_char_2d() -GDECL /* Called when all character data has been output * Return TRUE if output process is complete * Return FALSE to repeat output of the transformed data beginning @@ -530,11 +524,11 @@ else #endif #if INCL_2D -FUNCTION static void sp_add_intercept_2d(y, x) +FUNCTION static void sp_add_intercept_2d( GDECL -fix15 y; /* Y coordinate in relative pixel units */ +fix15 y, /* Y coordinate in relative pixel units */ /* (0 is lowest sample in band) */ -fix15 x; /* X coordinate of intercept in subpixel units */ +fix15 x) /* X coordinate of intercept in subpixel units */ /* Called by line() to add an intercept to the intercept list structure */ @@ -609,7 +603,6 @@ if (++sp_globals.next_offset >= MAX_INTERCEPTS) /* Intercept buffer full? */ #if INCL_2D FUNCTION static void sp_proc_intercepts_2d() -GDECL /* Called by sp_make_char to output accumulated intercept lists * Clips output to xmin, xmax, sp_globals.ymin, ymax boundaries */ diff --git a/src/Speedo/out_blk.c b/src/Speedo/out_blk.c index 71e39af..e56eb1b 100644 --- a/src/Speedo/out_blk.c +++ b/src/Speedo/out_blk.c @@ -21,7 +21,7 @@ INCIDENTAL OR CONSEQUENTIAL DAMAGES, ARISING OUT OF OR IN ANY WAY CONNECTED WITH THE SPEEDO SOFTWARE OR THE BITSTREAM CHARTER OUTLINE FONT. */ - +/* $XFree86: xc/lib/font/Speedo/out_blk.c,v 1.3 2001/01/17 19:43:17 dawes Exp $ */ /*************************** O U T _ B L K . C ********************************* @@ -58,20 +58,15 @@ WITH THE SPEEDO SOFTWARE OR THE BITSTREAM CHARTER OUTLINE FONT. /***** STATIC FUNCTIONS *****/ #if INCL_BLACK -#if PROTOS_AVAIL static void sp_add_intercept_black(PROTO_DECL2 fix15 y, fix15 x); static void sp_proc_intercepts_black(PROTO_DECL1); -#else -static void sp_add_intercept_black(); -static void sp_proc_intercepts_black(); -#endif #endif #if INCL_BLACK -FUNCTION boolean init_black(specsarg) +FUNCTION boolean init_black( GDECL -specs_t GLOBALFAR *specsarg; +specs_t GLOBALFAR *specsarg) /* * init_out0() is called by sp_set_specs() to initialize the output module. * Returns TRUE if output module can accept requested specifications. @@ -89,11 +84,11 @@ return (TRUE); #if INCL_BLACK -FUNCTION boolean begin_char_black(Psw, Pmin, Pmax) +FUNCTION boolean begin_char_black( GDECL -point_t Psw; -point_t Pmin; -point_t Pmax; +point_t Psw, +point_t Pmin, +point_t Pmax) /* Called once at the start of the character generation process */ { @@ -110,10 +105,10 @@ return TRUE; #if INCL_BLACK -FUNCTION void begin_contour_black(P1, outside) +FUNCTION void begin_contour_black( GDECL -point_t P1; -boolean outside; +point_t P1, +boolean outside) /* Called at the start of each contour */ { @@ -129,9 +124,9 @@ sp_globals.y_pxl = (sp_globals.y0_spxl + sp_globals.pixrnd) >> sp_globals.pixshi #endif #if INCL_BLACK -FUNCTION void line_black(P1) +FUNCTION void line_black( GDECL -point_t P1; +point_t P1) /* Called for each vector in the transformed character */ { @@ -522,11 +517,11 @@ else #endif #if INCL_BLACK -FUNCTION LOCAL void sp_add_intercept_black(y, x) +FUNCTION LOCAL void sp_add_intercept_black( GDECL -fix15 y; /* Y coordinate in relative pixel units */ +fix15 y, /* Y coordinate in relative pixel units */ /* (0 is lowest sample in band) */ -fix15 x; /* X coordinate of intercept in subpixel units */ +fix15 x) /* X coordinate of intercept in subpixel units */ /* Called by line() to add an intercept to the intercept list structure */ diff --git a/src/Speedo/out_scrn.c b/src/Speedo/out_scrn.c index 3d04db6..e17f7f6 100644 --- a/src/Speedo/out_scrn.c +++ b/src/Speedo/out_scrn.c @@ -21,6 +21,7 @@ INCIDENTAL OR CONSEQUENTIAL DAMAGES, ARISING OUT OF OR IN ANY WAY CONNECTED WITH THE SPEEDO SOFTWARE OR THE BITSTREAM CHARTER OUTLINE FONT. */ +/* $XFree86: xc/lib/font/Speedo/out_scrn.c,v 1.5 2001/01/17 19:43:17 dawes Exp $ */ /*************************** O U T _ S C R N . C ***************************** @@ -56,19 +57,14 @@ WITH THE SPEEDO SOFTWARE OR THE BITSTREAM CHARTER OUTLINE FONT. /***** STATIC FUNCTIONS *****/ -#if PROTOS_AVAIL static void sp_add_intercept_screen(PROTO_DECL2 fix15 y,fix31 x); static void sp_proc_intercepts_screen(PROTO_DECL1); -#else -static void sp_add_intercept_screen(); -static void sp_proc_intercepts_screen(); -#endif #if INCL_SCREEN -FUNCTION boolean init_screen(specsarg) +FUNCTION boolean init_screen( GDECL -specs_t FONTFAR *specsarg; +specs_t FONTFAR *specsarg) /* * init_out0() is called by sp_set_specs() to initialize the output module. * Returns TRUE if output module can accept requested specifications. @@ -84,11 +80,11 @@ return (TRUE); #if INCL_SCREEN -FUNCTION boolean begin_char_screen(Psw, Pmin, Pmax) +FUNCTION boolean begin_char_screen( GDECL -point_t Psw; -point_t Pmin; -point_t Pmax; +point_t Psw, +point_t Pmin, +point_t Pmax) /* Called once at the start of the character generation process */ { @@ -111,10 +107,10 @@ return TRUE; #if INCL_SCREEN -FUNCTION void begin_contour_screen(P1, outside) +FUNCTION void begin_contour_screen( GDECL -point_t P1; -boolean outside; +point_t P1, +boolean outside) /* Called at the start of each contour */ { @@ -130,10 +126,10 @@ sp_globals.y_pxl = (sp_globals.y0_spxl + sp_globals.pixrnd) >> sp_globals.pixshi #endif #if INCL_SCREEN -FUNCTION void curve_screen(P1, P2, P3, depth) +FUNCTION void curve_screen( GDECL -point_t P1, P2, P3; -fix15 depth; +point_t P1, point_t P2, point_t P3, +fix15 depth) { fix31 X0; fix31 Y0; @@ -187,9 +183,9 @@ sp_globals.y0_spxl = P3.y; sp_globals.y_pxl = (P3.y + sp_globals.pixrnd) >> sp_globals.pixshift; /* calculate new end-scan sp_globals.line */ } -FUNCTION void scan_curve_screen(X0,Y0,X1,Y1,X2,Y2,X3,Y3) +FUNCTION void scan_curve_screen( GDECL -fix31 X0,Y0,X1,Y1,X2,Y2,X3,Y3; +fix31 X0, fix31 Y0, fix31 X1, fix31 Y1, fix31 X2, fix31 Y2, fix31 X3, fix31 Y3) /* Called for each curve in the transformed character if curves out enabled */ { @@ -200,7 +196,7 @@ fix31 Pctrl1y; fix31 Pctrl2x; fix31 Pctrl2y; -#if DBGCRV +#ifdef DBGCRV printf("SCAN_CURVE_SCREEN(%6.4f, %6.4f, %6.4f, %6.4f, %6.4f, %6.4f, %6.4f, %6.4f)\n", (real)(X0-32768) / 65536.0, (real)(Y0-32768) / 65536.0, (real)(X1-32768) / 65536.0, (real)(Y1-32768) / 65536.0, @@ -214,7 +210,7 @@ if (((Y3 >> 16)) == (Y0 >> 16) || (Y3+1) == Y0 || Y3 == (Y0+1)) } if ((X3 >> 16) == (X0 >> 16)) { - vert_line_screen(X3,(Y0>>16),(Y3>>16)); + vert_line_screen(X3,(fix15)(Y0>>16),(fix15)(Y3>>16)); return; } Pmidx = (X0 + (X1 + X2) * 3 + X3 + 4 ) >> 3; @@ -233,13 +229,13 @@ Pctrl2y = (Y2 + Y3 + 1 ) >> 1; scan_curve_screen(Pmidx,Pmidy, Pctrl1x,Pctrl1y, Pctrl2x,Pctrl2y, X3,Y3); } -FUNCTION void vert_line_screen(x,y1,y2) +FUNCTION void vert_line_screen( GDECL -fix31 x; -fix15 y1, y2; +fix31 x, +fix15 y1, fix15 y2) { -#if DBGCRV +#ifdef DBGCRV printf("VERT_LINE_SCREEN(%6.4f, %6.4f, %6.4f)\n", (real)(x - 32768) / 65536.0, (real)(y1 - 32768) / 65536.0, @@ -287,9 +283,9 @@ else if (y2 > y1) /* Line goes upwards ? */ #if INCL_SCREEN -FUNCTION void line_screen(P1) +FUNCTION void line_screen( GDECL -point_t P1; +point_t P1) /* Called for each vector in the transformed character */ { @@ -683,11 +679,11 @@ else #endif #if INCL_SCREEN -FUNCTION LOCAL void sp_add_intercept_screen(y, x) +FUNCTION LOCAL void sp_add_intercept_screen( GDECL -fix15 y; /* Y coordinate in relative pixel units */ +fix15 y, /* Y coordinate in relative pixel units */ /* (0 is lowest sample in band) */ -fix31 x; /* X coordinate of intercept in subpixel units */ +fix31 x) /* X coordinate of intercept in subpixel units */ /* Called by line() to add an intercept to the intercept list structure */ diff --git a/src/Speedo/out_util.c b/src/Speedo/out_util.c index b3316a5..357763f 100644 --- a/src/Speedo/out_util.c +++ b/src/Speedo/out_util.c @@ -21,6 +21,7 @@ INCIDENTAL OR CONSEQUENTIAL DAMAGES, ARISING OUT OF OR IN ANY WAY CONNECTED WITH THE SPEEDO SOFTWARE OR THE BITSTREAM CHARTER OUTLINE FONT. */ +/* $XFree86: xc/lib/font/Speedo/out_util.c,v 1.3 2001/01/17 19:43:17 dawes Exp $ */ #define DEBUG 0 @@ -37,9 +38,9 @@ WITH THE SPEEDO SOFTWARE OR THE BITSTREAM CHARTER OUTLINE FONT. #define ABS(X) ( (X < 0) ? -X : X) #if INCL_BLACK || INCL_2D || INCL_SCREEN -FUNCTION void init_char_out(Psw,Pmin,Pmax) +FUNCTION void init_char_out( GDECL -point_t Psw, Pmin, Pmax; +point_t Psw, point_t Pmin, point_t Pmax) { sp_globals.set_width.x = (fix31)Psw.x << sp_globals.poshift; sp_globals.set_width.y = (fix31)Psw.y << sp_globals.poshift; @@ -64,11 +65,11 @@ else sp_globals.first_pass = TRUE; } -FUNCTION void begin_sub_char_out(Psw, Pmin, Pmax) +FUNCTION void begin_sub_char_out( GDECL -point_t Psw; -point_t Pmin; -point_t Pmax; +point_t Psw, +point_t Pmin, +point_t Pmax) /* Called at the start of each sub-character in a composite character */ { @@ -89,10 +90,10 @@ if (!sp_globals.extents_running) } } -FUNCTION void curve_out(P1, P2, P3,depth) +FUNCTION void curve_out( GDECL -point_t P1, P2, P3; -fix15 depth; +point_t P1, point_t P2, point_t P3, +fix15 depth) /* Called for each curve in the transformed character if curves out enabled */ { @@ -216,10 +217,10 @@ sp_globals.first_offset = sp_globals.next_offset; -FUNCTION void set_first_band_out(Pmin, Pmax) +FUNCTION void set_first_band_out( GDECL -point_t Pmin; -point_t Pmax; +point_t Pmin, +point_t Pmax) { sp_globals.ymin = Pmin.y; diff --git a/src/Speedo/reset.c b/src/Speedo/reset.c index 786ec43..7711951 100644 --- a/src/Speedo/reset.c +++ b/src/Speedo/reset.c @@ -21,6 +21,7 @@ INCIDENTAL OR CONSEQUENTIAL DAMAGES, ARISING OUT OF OR IN ANY WAY CONNECTED WITH THE SPEEDO SOFTWARE OR THE BITSTREAM CHARTER OUTLINE FONT. */ +/* $XFree86: xc/lib/font/Speedo/reset.c,v 1.3 2001/01/17 19:43:17 dawes Exp $ */ @@ -85,9 +86,9 @@ sp_globals.outline_device_set = FALSE; } #if INCL_KEYS -FUNCTION void set_key(key) +FUNCTION void set_key( GDECL -ufix8 key[]; /* Specified decryption key */ +ufix8 key[]) /* Specified decryption key */ /* * Dynamically sets font decryption key. */ @@ -102,9 +103,9 @@ sp_globals.key8 = key[8]; -FUNCTION ufix16 get_cust_no(font_buff) +FUNCTION ufix16 get_cust_no( GDECL -buff_t font_buff; +buff_t font_buff) /* returns customer number from font */ diff --git a/src/Speedo/set_spcs.c b/src/Speedo/set_spcs.c index d060a4b..14ab53e 100644 --- a/src/Speedo/set_spcs.c +++ b/src/Speedo/set_spcs.c @@ -21,6 +21,7 @@ INCIDENTAL OR CONSEQUENTIAL DAMAGES, ARISING OUT OF OR IN ANY WAY CONNECTED WITH THE SPEEDO SOFTWARE OR THE BITSTREAM CHARTER OUTLINE FONT. */ +/* $XFree86: xc/lib/font/Speedo/set_spcs.c,v 1.4 2001/08/27 19:49:50 dawes Exp $ */ /*************************** S E T _ S P C S . C ***************************** @@ -52,24 +53,17 @@ WITH THE SPEEDO SOFTWARE OR THE BITSTREAM CHARTER OUTLINE FONT. /****** STATIC FUNCTIONS *****/ -#if PROTOS_AVAIL static boolean sp_setup_consts(PROTO_DECL2 fix15 xmin, fix15 xmax, fix15 ymin, fix15 ymax); static void sp_setup_tcb(PROTO_DECL2 tcb_t GLOBALFAR *ptcb); static fix15 sp_setup_mult(PROTO_DECL2 fix31 input_mult); static fix31 sp_setup_offset(PROTO_DECL2 fix31 input_offset); -#else -static void sp_setup_tcb(); /* Set up transformation control block */ -static fix15 sp_setup_mult(); /* Convert mult to internal form */ -static fix31 sp_setup_offset(); /* Convert offset to internal form */ -static boolean sp_setup_consts(); /* Set up scaling constants */ -#endif -FUNCTION boolean set_specs(specsarg) +FUNCTION boolean set_specs( GDECL -specs_t STACKFAR *specsarg; /* Bundle of conversion specifications */ +specs_t STACKFAR *specsarg) /* Bundle of conversion specifications */ /* * Called by host software to set character generation specifications */ @@ -336,10 +330,10 @@ return TRUE; #if INCL_MULTIDEV #if INCL_BLACK || INCL_SCREEN || INCL_2D -FUNCTION boolean set_bitmap_device(bfuncs,size) +FUNCTION boolean set_bitmap_device( GDECL -bitmap_t *bfuncs; -ufix16 size; +bitmap_t *bfuncs, +ufix16 size) { if (size != sizeof(sp_globals.bitmap_device)) @@ -351,10 +345,10 @@ sp_globals.bitmap_device_set = TRUE; #endif #if INCL_OUTLINE -FUNCTION boolean set_outline_device(ofuncs,size) +FUNCTION boolean set_outline_device( GDECL -outline_t *ofuncs; -ufix16 size; +outline_t *ofuncs, +ufix16 size) { if (size != sizeof(sp_globals.outline_device)) @@ -368,15 +362,20 @@ sp_globals.outline_device_set = TRUE; #ifdef old -FUNCTION boolean sp_setup_consts(xmin, xmax, ymin, ymax) +FUNCTION boolean sp_setup_consts( +GDECL +fix15 xmin, /* Minimum X ORU value in font */ +fix15 xmax, /* Maximum X ORU value in font */ +fix15 ymin, /* Minimum Y ORU value in font */ +fix15 ymax) /* Maximum Y ORU value in font */ #else -static FUNCTION boolean sp_setup_consts(xmin, xmax, ymin, ymax) -#endif +static FUNCTION boolean sp_setup_consts( GDECL -fix15 xmin; /* Minimum X ORU value in font */ -fix15 xmax; /* Maximum X ORU value in font */ -fix15 ymin; /* Minimum Y ORU value in font */ -fix15 ymax; /* Maximum Y ORU value in font */ +fix15 xmin, /* Minimum X ORU value in font */ +fix15 xmax, /* Maximum X ORU value in font */ +fix15 ymin, /* Minimum Y ORU value in font */ +fix15 ymax) /* Maximum Y ORU value in font */ +#endif /* * Sets the following constants used for fixed point arithmetic: * sp_globals.multshift multipliers and products; range is 14 to 8 @@ -403,7 +402,7 @@ fix31 offset; /* Constant in transformation */ fix15 i; /* Loop counter */ fix15 x, y; /* Successive corners of bounding box in ORUs */ fix31 pixval; /* Successive pixel values multiplied by orus per em */ -fix15 xx, yy; /* Bounding box corner that produces max pixel value */ +fix15 xx = 0, yy = 0;/* Bounding box corner that produces max pixel value */ /* Determine numerator and denominator of largest multiplier value */ mult = sp_globals.pspecs->xxmult >> 16; @@ -531,12 +530,14 @@ return TRUE; } #ifdef old -FUNCTION void sp_setup_tcb(ptcb) +FUNCTION void sp_setup_tcb( +GDECL +tcb_t GLOBALFAR *ptcb) /* Pointer to transformation control bloxk */ #else -static FUNCTION void sp_setup_tcb(ptcb) -#endif +static FUNCTION void sp_setup_tcb( GDECL -tcb_t GLOBALFAR *ptcb; /* Pointer to transformation control bloxk */ +tcb_t GLOBALFAR *ptcb) /* Pointer to transformation control bloxk */ +#endif /* * Convert transformation coeffs to internal form */ @@ -559,9 +560,9 @@ SHOW(ptcb->yoffset); type_tcb(ptcb); /* Classify transformation type */ } -FUNCTION static fix15 sp_setup_mult(input_mult) +FUNCTION static fix15 sp_setup_mult( GDECL -fix31 input_mult; /* Multiplier in input format */ +fix31 input_mult) /* Multiplier in input format */ /* * Called by sp_setup_tcb() to convert multiplier in transformation * matrix from external to internal form. @@ -582,9 +583,9 @@ else return -(fix15)((-input_mult + imrnd) / imdenom); } -FUNCTION static fix31 sp_setup_offset(input_offset) +FUNCTION static fix31 sp_setup_offset( GDECL -fix31 input_offset; /* Multiplier in input format */ +fix31 input_offset) /* Multiplier in input format */ /* * Called by sp_setup_tcb() to convert offset in transformation * matrix from external to internal form. @@ -599,9 +600,9 @@ imrnd = ((fix31)1 << imshift) >> 1; return (((input_offset >> 1) + imrnd) >> imshift) + sp_globals.mprnd; } -FUNCTION void type_tcb(ptcb) +FUNCTION void type_tcb( GDECL -tcb_t GLOBALFAR *ptcb; /* Pointer to transformation control bloxk */ +tcb_t GLOBALFAR *ptcb) /* Pointer to transformation control bloxk */ { fix15 x_trans_type; fix15 y_trans_type; @@ -733,9 +734,9 @@ SHOW(ptcb->xpos); SHOW(ptcb->ypos); } -FUNCTION fix31 read_long(pointer) +FUNCTION fix31 read_long( GDECL -ufix8 FONTFAR *pointer; /* Pointer to first byte of encrypted 3-byte integer */ +ufix8 FONTFAR *pointer) /* Pointer to first byte of encrypted 3-byte integer */ /* * Reads a 3-byte encrypted integer from the byte string starting at * the specified point. @@ -750,9 +751,9 @@ tmpfix31 += (fix31)((*pointer) ^ sp_globals.key6); /* Read le return tmpfix31; } -FUNCTION fix15 read_word_u(pointer) +FUNCTION fix15 read_word_u( GDECL -ufix8 FONTFAR *pointer; /* Pointer to first byte of unencrypted 2-byte integer */ +ufix8 FONTFAR *pointer) /* Pointer to first byte of unencrypted 2-byte integer */ /* * Reads a 2-byte unencrypted integer from the byte string starting at * the specified point. diff --git a/src/Speedo/set_trns.c b/src/Speedo/set_trns.c index 8ef34ac..b7f0e31 100644 --- a/src/Speedo/set_trns.c +++ b/src/Speedo/set_trns.c @@ -21,6 +21,7 @@ INCIDENTAL OR CONSEQUENTIAL DAMAGES, ARISING OUT OF OR IN ANY WAY CONNECTED WITH THE SPEEDO SOFTWARE OR THE BITSTREAM CHARTER OUTLINE FONT. */ +/* $XFree86: xc/lib/font/Speedo/set_trns.c,v 1.5 2002/09/18 17:11:44 tsi Exp $ */ @@ -65,15 +66,9 @@ WITH THE SPEEDO SOFTWARE OR THE BITSTREAM CHARTER OUTLINE FONT. /***** STATIC FUNCTIONS *****/ -#if PROTOS_AVAIL static void sp_constr_update(PROTO_DECL1); static ufix8 FONTFAR *sp_setup_pix_table(PROTO_DECL2 ufix8 FONTFAR *pointer,boolean short_form,fix15 no_X_ctrl_zones,fix15 no_Y_ctrl_zones); static ufix8 FONTFAR *sp_setup_int_table(PROTO_DECL2 ufix8 FONTFAR *pointer,fix15 no_X_int_zones,fix15 no_Y_int_zones); -#else -static void sp_constr_update(); /* Update constraint table */ -static ufix8 FONTFAR *sp_setup_pix_table(); /* Read control zone table */ -static ufix8 FONTFAR *sp_setup_int_table(); /* Read interpolation zone table */ -#endif FUNCTION void init_tcb() @@ -86,13 +81,13 @@ GDECL sp_globals.tcb = sp_globals.tcb0; } -FUNCTION void scale_tcb(ptcb, x_pos, y_pos, x_scale, y_scale) +FUNCTION void scale_tcb( GDECL -tcb_t GLOBALFAR *ptcb; /* Transformation control block */ -fix15 x_pos; /* X position (outline res units) */ -fix15 y_pos; /* Y position (outline res units) */ -fix15 x_scale; /* X scale factor * ONE_SCALE */ -fix15 y_scale; /* Y scale factor * ONE_SCALE */ +tcb_t GLOBALFAR *ptcb, /* Transformation control block */ +fix15 x_pos, /* X position (outline res units) */ +fix15 y_pos, /* Y position (outline res units) */ +fix15 x_scale, /* X scale factor * ONE_SCALE */ +fix15 y_scale) /* Y scale factor * ONE_SCALE */ /* * Called by make_comp_char() to apply position and scale for each of the * components of a compound character. @@ -115,10 +110,10 @@ ptcb->yoffset = MULT16(yx_mult, x_pos) + MULT16(yy_mult, y_pos) + y_offset; type_tcb(ptcb); /* Reclassify transformation types */ } -FUNCTION ufix8 FONTFAR *skip_interpolation_table(pointer,format) +FUNCTION ufix8 FONTFAR *skip_interpolation_table( GDECL -ufix8 FONTFAR *pointer; /* Pointer to next byte in char data */ -ufix8 format; /* Character format byte */ +ufix8 FONTFAR *pointer, /* Pointer to next byte in char data */ +ufix8 format) /* Character format byte */ { fix15 i,n; ufix8 intsize[9]; @@ -133,8 +128,8 @@ intsize[6] = 2; intsize[7] = 0; intsize[8] = 0; -n = ((format & BIT6)? (fix15)NEXT_BYTE(pointer): 0) + - ((format & BIT7)? (fix15)NEXT_BYTE(pointer): 0); +n = ((format & BIT6)? (fix15)NEXT_BYTE(pointer): 0); +n += ((format & BIT7)? (fix15)NEXT_BYTE(pointer): 0); for (i = 0; i < n; i++) /* For each entry in int table ... */ { format = NEXT_BYTE(pointer); /* Read format byte */ @@ -150,10 +145,10 @@ for (i = 0; i < n; i++) /* For each entry in int table ... */ } return pointer; } -FUNCTION ufix8 FONTFAR *skip_control_zone(pointer,format) +FUNCTION ufix8 FONTFAR *skip_control_zone( GDECL -ufix8 FONTFAR *pointer; /* Pointer to next byte in char data */ -ufix8 format; /* Character format byte */ +ufix8 FONTFAR *pointer, /* Pointer to next byte in char data */ +ufix8 format) /* Character format byte */ { fix15 i,n; ufix16 tmpufix16; @@ -175,10 +170,10 @@ return pointer; #if INCL_RULES #else -FUNCTION ufix8 FONTFAR *plaid_tcb(pointer, format) +FUNCTION ufix8 FONTFAR *plaid_tcb( GDECL -ufix8 FONTFAR *pointer; /* Pointer to next byte in char data */ -ufix8 format; /* Character format byte */ +ufix8 FONTFAR *pointer, /* Pointer to next byte in char data */ +ufix8 format) /* Character format byte */ /* * Called by make_simp_char() and make_comp_char() to set up the controlled * coordinate table and skip all other intelligent scaling rules embedded @@ -211,10 +206,10 @@ return pointer; #endif #if INCL_RULES -FUNCTION ufix8 FONTFAR *plaid_tcb(pointer, format) +FUNCTION ufix8 FONTFAR *plaid_tcb( GDECL -ufix8 FONTFAR *pointer; /* Pointer to next byte in char data */ -ufix8 format; /* Character format byte */ +ufix8 FONTFAR *pointer, /* Pointer to next byte in char data */ +ufix8 format) /* Character format byte */ /* * Called by make_simp_char() and make_comp_char() to set up the controlled * coordinate table and process all intelligent scaling rules embedded @@ -442,9 +437,9 @@ for (i = 0; i < n; i++) } #endif -FUNCTION ufix8 FONTFAR *read_oru_table(pointer) +FUNCTION ufix8 FONTFAR *read_oru_table( GDECL -ufix8 FONTFAR *pointer; /* Pointer to first byte in controlled coord table */ +ufix8 FONTFAR *pointer) /* Pointer to first byte in controlled coord table */ /* * Called by plaid_tcb() to read the controlled coordinate table from the * character data in the font. @@ -525,15 +520,14 @@ for (i = 0; i < n; i++) return pointer; /* Update pointer */ } #if INCL_SQUEEZING || INCL_ISW -FUNCTION static void calculate_x_pix(start_edge, end_edge, constr_nr, - x_scale, x_offset, ppo, setwidth_pix) +FUNCTION static void calculate_x_pix( GDECL -ufix8 start_edge, end_edge; -ufix16 constr_nr; -fix31 x_scale; -fix31 x_offset; -fix31 ppo; -fix15 setwidth_pix; +ufix8 start_edge, ufix8 end_edge, +ufix16 constr_nr, +fix31 x_scale, +fix31 x_offset, +fix31 ppo, +fix15 setwidth_pix) /* * Called by sp_setup_pix_table() when X squeezing is necessary * to insert the correct edge in the global pix array @@ -593,14 +587,13 @@ if ((sp_globals.pspecs->flags & SQUEEZE_RIGHT) && #endif #if INCL_SQUEEZING -FUNCTION static void calculate_y_pix(start_edge, end_edge,constr_nr, - top_scale, bottom_scale,ppo,em_top_pix, em_bot_pix) +FUNCTION static void calculate_y_pix( GDECL -ufix8 start_edge, end_edge; -ufix16 constr_nr; -fix31 top_scale, bottom_scale; -fix31 ppo; -fix15 em_top_pix, em_bot_pix; +ufix8 start_edge, ufix8 end_edge, +ufix16 constr_nr, +fix31 top_scale, fix31 bottom_scale, +fix31 ppo, +fix15 em_top_pix, fix15 em_bot_pix) /* * Called by sp_setup_pix_table() when Y squeezing is necessary @@ -697,9 +690,9 @@ if ((sp_globals.pspecs->flags & SQUEEZE_BOTTOM) && FUNCTION boolean calculate_x_scale(x_factor, x_offset, no_X_ctrl_zones) GDECL -fix31 *x_factor; -fix31 *x_offset; -fix15 no_X_ctrl_zones; /* Number of X control zones */ +fix31 *x_factor, +fix31 *x_offset, +fix15 no_X_ctrl_zones) /* Number of X control zones */ /* * Called by sp_setup_pix_table() when squeezing is included * to determine whether X scaling is necessary. If it is, the @@ -850,12 +843,11 @@ for (i=0; i < (no_X_ctrl_zones+1); i++) return TRUE; } -FUNCTION boolean calculate_y_scale(top_scale, bottom_scale, - first_Y_zone, no_Y_ctrl_zones) +FUNCTION boolean calculate_y_scale( GDECL -fix31 *top_scale, *bottom_scale; -fix15 first_Y_zone; -fix15 no_Y_ctrl_zones; +fix31 *top_scale, fix31 *bottom_scale, +fix15 first_Y_zone, +fix15 no_Y_ctrl_zones) /* * Called by sp_setup_pix_table() when squeezing is included * to determine whether Y scaling is necessary. If it is, @@ -929,12 +921,11 @@ return TRUE; #if INCL_RULES FUNCTION static ufix8 FONTFAR *sp_setup_pix_table( - pointer, short_form, no_X_ctrl_zones, no_Y_ctrl_zones) GDECL -ufix8 FONTFAR *pointer; /* Pointer to first byte in control zone table */ -boolean short_form; /* TRUE if 1 byte from/to specification */ -fix15 no_X_ctrl_zones; /* Number of X control zones */ -fix15 no_Y_ctrl_zones; /* Number of Y control zones */ +ufix8 FONTFAR *pointer, /* Pointer to first byte in control zone table */ +boolean short_form, /* TRUE if 1 byte from/to specification */ +fix15 no_X_ctrl_zones, /* Number of X control zones */ +fix15 no_Y_ctrl_zones) /* Number of Y control zones */ /* * Called by plaid_tcb() to read the control zone table from the * character data in the font. @@ -1158,11 +1149,11 @@ return pointer; #if INCL_RULES -FUNCTION static ufix8 FONTFAR *sp_setup_int_table(pointer, no_X_int_zones, no_Y_int_zones) +FUNCTION static ufix8 FONTFAR *sp_setup_int_table( GDECL -ufix8 FONTFAR *pointer; /* Pointer to first byte in interpolation zone table */ -fix15 no_X_int_zones; /* Number of X interpolation zones */ -fix15 no_Y_int_zones; /* Number of X interpolation zones */ +ufix8 FONTFAR *pointer, /* Pointer to first byte in interpolation zone table */ +fix15 no_X_int_zones, /* Number of X interpolation zones */ +fix15 no_Y_int_zones) /* Number of X interpolation zones */ /* * Called by plaid_tcb() to read the interpolation zone table from the * character data in the font. @@ -1176,15 +1167,15 @@ fix15 i, j, k, l, n; ufix8 format; ufix8 format_copy; ufix8 tmpufix8; -fix15 start_orus; +fix15 start_orus = 0; ufix8 edge_org; ufix8 edge; ufix16 adj_factor; fix15 adj_orus; -fix15 end_orus; +fix15 end_orus = 0; fix31 zone_orus; -fix15 start_pix; -fix15 end_pix; +fix15 start_pix = 0; +fix15 end_pix = 0; #if INCL_PLAID_OUT /* Plaid data monitoring included? */ diff --git a/src/Speedo/spdo_prv.h b/src/Speedo/spdo_prv.h index 47c5252..272ffbf 100644 --- a/src/Speedo/spdo_prv.h +++ b/src/Speedo/spdo_prv.h @@ -21,6 +21,7 @@ INCIDENTAL OR CONSEQUENTIAL DAMAGES, ARISING OUT OF OR IN ANY WAY CONNECTED WITH THE SPEEDO SOFTWARE OR THE BITSTREAM CHARTER OUTLINE FONT. */ +/* $XFree86: xc/lib/font/Speedo/spdo_prv.h,v 1.5 2001/01/17 19:43:18 dawes Exp $ */ @@ -31,11 +32,6 @@ WITH THE SPEEDO SOFTWARE OR THE BITSTREAM CHARTER OUTLINE FONT. /***** CONFIGURATION DEFINITIONS *****/ -#ifndef INCL_PLAID_OUT -#define INCL_PLAID_OUT 0 /* 1 to include plaid data monitoring */ -#endif /* 0 to omit plaid data monitoring */ - - /***** PRIVATE FONT HEADER OFFSET CONSTANTS *****/ #define FH_ORUMX 0 /* U Max ORU value 2 bytes */ #define FH_PIXMX 2 /* U Max Pixel value 2 bytes */ @@ -269,7 +265,7 @@ WITH THE SPEEDO SOFTWARE OR THE BITSTREAM CHARTER OUTLINE FONT. #else -#define GDECL SPEEDO_GLOBALS* sp_global_ptr; +#define GDECL SPEEDO_GLOBALS* sp_global_ptr, #define get_char_id(char_index) sp_get_char_id(sp_global_ptr,char_index) #define get_char_width(char_index) sp_get_char_width(sp_global_ptr,char_index) diff --git a/src/Speedo/speedo.h b/src/Speedo/speedo.h index 277c6a6..a0b607f 100644 --- a/src/Speedo/speedo.h +++ b/src/Speedo/speedo.h @@ -21,6 +21,7 @@ INCIDENTAL OR CONSEQUENTIAL DAMAGES, ARISING OUT OF OR IN ANY WAY CONNECTED WITH THE SPEEDO SOFTWARE OR THE BITSTREAM CHARTER OUTLINE FONT. */ +/* $XFree86: xc/lib/font/Speedo/speedo.h,v 3.6 2001/07/25 15:04:55 dawes Exp $ */ #ifndef _SPEEDO_H_ #define _SPEEDO_H_ @@ -94,9 +95,9 @@ WITH THE SPEEDO SOFTWARE OR THE BITSTREAM CHARTER OUTLINE FONT. #define SHORT_LISTS 1 /* 1 to allocate small intercept lists */ #endif -#ifndef PROTOS_AVAIL /* 1 to use function prototyping */ -#define PROTOS_AVAIL 0 /* 0 to suppress it */ -#endif +#ifndef INCL_PLAID_OUT +#define INCL_PLAID_OUT 0 /* 1 to include plaid data monitoring */ +#endif /* 0 to omit plaid data monitoring */ #ifndef FONTFAR /* if Intel mixed memory model implementation */ #define FONTFAR /* pointer type modifier for font buffer */ @@ -171,7 +172,7 @@ typedef CARD32 ufix32; #endif #ifndef NULL -#define NULL 0 +#include <stddef.h> #endif #define FUNCTION @@ -215,8 +216,6 @@ typedef CARD32 ufix32; #endif /***** STRUCTURE DEFINITIONS *****/ -#if PROTOS_AVAIL - #if REENTRANT_ALLOC #define PROTO_DECL1 struct speedo_global_data GLOBALFAR *sp_global_ptr #define PROTO_DECL2 PROTO_DECL1 , @@ -224,7 +223,6 @@ typedef CARD32 ufix32; #define PROTO_DECL1 void #define PROTO_DECL2 #endif -#endif typedef struct buff_tag @@ -280,11 +278,7 @@ typedef struct specs_tag /* Bit 14: Clip top if set */ /* Bit 15: Clip bottom if set */ /* Bits 16-31 not used */ -#ifdef __STDC__ void *out_info; /* information for output module */ -#else - char *out_info; -#endif } specs_t; /* Specs structure for fw_set_specs */ @@ -365,7 +359,6 @@ typedef struct plaid_tag #endif #if INCL_MULTIDEV -#if PROTOS_AVAIL typedef struct bitmap_tag { void (*p_open_bitmap)(PROTO_DECL2 fix31 x_set_width, fix31 y_set_width, fix31 xorg, fix31 yorg, fix15 xsize,fix15 ysize); @@ -383,25 +376,6 @@ typedef struct outline_tag void (*p_close_contour)(PROTO_DECL1); void (*p_close_outline)(PROTO_DECL1); } outline_t; -#else -typedef struct bitmap_tag - { - void (*p_open_bitmap)(); - void (*p_set_bits)(); - void (*p_close_bitmap)(); - } bitmap_t; - -typedef struct outline_tag - { - void (*p_open_outline)(); - void (*p_start_char)(); - void (*p_start_contour)(); - void (*p_curve)(); - void (*p_line)(); - void (*p_close_contour)(); - void (*p_close_outline)(); - } outline_t; -#endif #endif /* ---------------------------------------------------*/ @@ -521,7 +495,6 @@ typedef struct speedo_global_data fix15 pixfix; /* Mask to remove fractional pixels */ fix15 onepix; /* 1.0 pixels in sub-pixel units */ -#if PROTOS_AVAIL boolean (*init_out)(PROTO_DECL2 specs_t GLOBALFAR *specsarg); boolean (*begin_char)(PROTO_DECL2 point_t Psw,point_t Pmin,point_t Pmax); void (*begin_sub_char)(PROTO_DECL2 point_t Psw,point_t Pmin,point_t Pmax); @@ -531,18 +504,6 @@ typedef struct speedo_global_data void (*end_contour)(PROTO_DECL1); void (*end_sub_char)(PROTO_DECL1); boolean (*end_char)(PROTO_DECL1); -#else /* if not protos */ - boolean (*init_out)(); - boolean (*begin_char)(); - void (*begin_sub_char)(); - void (*begin_contour)(); - void (*curve)(); - void (*line)(); - void (*end_contour)(); - void (*end_sub_char)(); - boolean (*end_char)(); -#endif /* end not protos */ - specs_t GLOBALFAR *pspecs; /* Pointer to specifications bundle */ specs_t specs; /* copy specs onto stack */ ufix8 FONTFAR *font_org; /* Pointer to start of font data */ @@ -762,7 +723,6 @@ EXTERN SPEEDO_GLOBALS GLOBALFAR *sp_global_ptr; * ***********************************************************************************/ -#if PROTOS_AVAIL /* do_char.c functions */ ufix16 sp_get_char_id(PROTO_DECL2 ufix16 char_index); boolean sp_make_char(PROTO_DECL2 ufix16 char_index); @@ -927,155 +887,4 @@ void sp_record_int_zone(PROTO_DECL2 fix31 start, fix31 end); /* Record void sp_end_plaid_data(PROTO_DECL1); /* Signal end of plaid data */ #endif -#else /* NO PROTOTYPES AVAILABLE */ - - - -/* do_char.c functions */ -boolean sp_make_char(); /* Make specified character */ -#if INCL_ISW -fix31 sp_compute_isw_scale(); -static boolean sp_do_make_char(); -boolean sp_make_char_isw(); /* Make specified character with */ - /* imported set widths.*/ -static boolean sp_reset_xmax(); -#endif -#if INCL_ISW || INCL_SQUEEZING -static void sp_preview_bounding_box(); -#endif -ufix16 sp_get_char_id(); /* Get character id for specified char */ - -#if INCL_METRICS /* Metrics functions supported? */ -fix31 sp_get_char_width(); /* Get character width for specified char */ -fix15 sp_get_track_kern(); /* Get track kerning for specified size */ -fix31 sp_get_pair_kern(); /* Get kerning for specified char pair */ -boolean sp_get_char_bbox(); -#endif - -/* do_trns.c functions */ -ufix8 FONTFAR *sp_read_bbox(); /* Read bounding box */ -void sp_proc_outl_data(); /* Process outline data */ - -/* out_0c.c functions */ -boolean sp_init_black(); -boolean sp_begin_char_black(); -void sp_begin_contour_black(); -void sp_line_black(); -boolean sp_end_char_black(); - -/* out_util.c functions */ -#if INCL_BLACK || INCL_SCREEN || INCL_2D - -void sp_init_char_out(); -void sp_begin_sub_char_out(); -void sp_curve_out(); -void sp_end_contour_out(); -void sp_end_sub_char_out(); -void sp_init_intercepts_out(); -void sp_restart_intercepts_out(); -void sp_set_first_band_out(); -void sp_reduce_band_size_out(); -boolean sp_next_band_out(); -#endif - -#if INCL_USEROUT -boolean sp_init_userout(); -#endif - -/* reset.c functions */ -void sp_reset(); /* Initialize Fontware mechanism */ - -#if INCL_KEYS -void sp_set_key(); -#endif -ufix16 sp_get_cust_no(); - -/* set_spcs.c functions */ -boolean sp_set_specs(); /* Set specifications */ -void sp_type_tcb(); /* Update transformation class in tcb */ - -fix31 sp_read_long(); /* Read long as 3 bytes encrypted */ -fix15 sp_read_word_u(); /* Read word as 2 bytes unencrypted */ - -/* set_trns.c functions */ -void sp_init_tcb(); /* Initialize current trans control block */ -void sp_scale_tcb(); /* Transform trans control block */ -ufix8 FONTFAR *sp_plaid_tcb(); /* Enable intelligent transformation */ -ufix8 FONTFAR *sp_skip_interpolation_table(); -ufix8 FONTFAR *sp_skip_control_zone(); - -ufix8 FONTFAR *sp_read_oru_table(); /* Read controlled coord table */ -#if INCL_SQUEEZING || INCL_ISW -static void sp_calculate_x_pix(); -#endif -#if INCL_SQUEEZING -static void sp_calculate_y_pix(); -boolean sp_calculate_x_scale(); -boolean sp_calculate_y_scale() ; -#endif - -/* user defined functions */ - -#if INCL_BLACK || INCL_SCREEN || INCL_2D -void sp_open_bitmap(); -void sp_set_bitmap_bits(); -void sp_close_bitmap(); -#endif - -#if INCL_OUTLINE -void sp_open_outline(); -void sp_start_new_char(); -void sp_start_contour(); -void sp_curve_to(); -void sp_line_to(); -void sp_close_contour(); -void sp_close_outline(); -#endif - -#if INCL_LCD /* Dynamic load character data supported? */ -buff_t *sp_load_char_data(); /* Load character data from font file */ -#endif - -#if INCL_PLAID_OUT /* Plaid data monitoring included? */ -void sp_record_xint(); /* Record xint data */ -void sp_record_yint(); /* Record yint data */ -void sp_begin_plaid_data(); /* Signal start of plaid data */ -void sp_begin_ctrl_zones(); /* Signal start of control zones */ -void sp_record_ctrl_zone(); /* Record control zone data */ -void sp_begin_int_zones(); /* Signal start of interpolation zones */ -void sp_record_int_zone(); /* Record interpolation zone data */ -void sp_end_plaid_data(); /* Signal end of plaid data */ -#endif - -boolean sp_init_screen(); /* If only screen-writer mode supported */ -boolean sp_begin_char_screen(); /* If screenwriter mode supported */ -void sp_begin_contour_screen(); /* If screenwriter mode supported */ -void sp_line_screen(); /* If screenwriter mode supported */ -void sp_curve_screen(); /* If screenwriter mode supported */ -void sp_scan_curve_screen(); -void sp_vert_line_screen(); -void sp_end_contour_screen(); -boolean sp_end_char_screen(); /* If screenwriter mode supported */ - - -boolean sp_init_outline(); /* If only vector output mode supported */ -boolean sp_begin_char_outline(); /* If only vector output mode supported */ -void sp_begin_sub_char_outline(); /* If only vector output mode supported */ -void sp_begin_contour_outline(); /* If only vector output mode supported */ -void sp_curve_outline(); /* If only vector output mode supported */ -void sp_line_outline(); /* If only vector output mode supported */ -void sp_end_contour_outline(); /* If only vector output mode supported */ -void sp_end_sub_char_outline(); /* If only vector output mode supported */ -boolean sp_end_char_outline(); /* If only vector output mode supported */ - -boolean sp_init_2d(); /* If screen-writer and other modes supported */ -boolean sp_begin_char_2d(); /* If screen-writer and other modes supported */ -void sp_begin_contour_2d(); /* If screen-writer and other modes supported */ -void sp_line_2d(); /* If screen-writer and other modes supported */ -boolean sp_end_char_2d(); /* If screen-writer and other modes supported */ - -#endif - - - #endif /* _SPEEDO_H_ */ diff --git a/src/Speedo/spencode.c b/src/Speedo/spencode.c index b74e71d..0daccff 100644 --- a/src/Speedo/spencode.c +++ b/src/Speedo/spencode.c @@ -47,12 +47,14 @@ other dealings in this Software without prior written authorization from The Open Group. */ +/* $XFree86: xc/lib/font/Speedo/spencode.c,v 1.7 2001/12/14 19:56:41 dawes Exp $ */ #include "spint.h" -#include "bics-iso.h" +/* No longer needed with new encoding code */ +/* #include "bics-iso.h" -int sp_bics_map_size = (sizeof(sp_bics_map) / (sizeof(int) * 2)); +int sp_bics_map_size = (sizeof(sp_bics_map) / (sizeof(int) * 2));*/ #ifdef EXTRAFONTS #include "adobe-iso.h" diff --git a/src/Speedo/sperr.c b/src/Speedo/sperr.c index 8d94d85..8be42c6 100644 --- a/src/Speedo/sperr.c +++ b/src/Speedo/sperr.c @@ -52,10 +52,15 @@ other dealings in this Software without prior written authorization from The Open Group. */ +/* $XFree86: xc/lib/font/Speedo/sperr.c,v 1.7 2002/05/31 18:45:48 dawes Exp $ */ + #include "spint.h" -#if NeedVarargsPrototypes +#ifndef FONTMODULE #include <stdarg.h> +#endif + +extern void ErrorF(const char* f, ...); void SpeedoErr(char *str, ...) @@ -70,20 +75,6 @@ SpeedoErr(char *str, ...) va_end(v); } -#else - -/* VARARGS1 */ -void -SpeedoErr(str, a1) - char *str; - char *a1; -{ - ErrorF("Speedo: "); - ErrorF(str, a1); -} -#endif /* NeedVarargsPrototypes else */ - - /* * Called by Speedo character generator to report an error. * @@ -91,8 +82,7 @@ SpeedoErr(str, a1) * that happens many times, don't report it to user */ void -sp_report_error(n) - fix15 n; +sp_report_error(fix15 n) { switch (n) { case 1: diff --git a/src/Speedo/spfile.c b/src/Speedo/spfile.c index 2eac82e..a5c34b3 100644 --- a/src/Speedo/spfile.c +++ b/src/Speedo/spfile.c @@ -49,11 +49,18 @@ other dealings in this Software without prior written authorization from The Open Group. */ +/* $XFree86: xc/lib/font/Speedo/spfile.c,v 1.14 2001/12/14 19:56:41 dawes Exp $ */ -#include <stdio.h> #include "fntfilst.h" +#include "fontenc.h" +#ifndef FONTMODULE +#include <stdio.h> +#else +#include "xf86_ansic.h" +#endif #include "spint.h" +#include "bics-unicode.h" SpeedoFontPtr sp_fp_cur = (SpeedoFontPtr) 0; @@ -122,8 +129,7 @@ static ufix8 mkey[] = static fix15 -read_2b(ptr) - ufix8 *ptr; +read_2b(ufix8 *ptr) { fix15 tmp; @@ -133,8 +139,7 @@ read_2b(ptr) } static fix31 -read_4b(ptr) - ufix8 *ptr; +read_4b(ufix8 *ptr) { fix31 tmp; @@ -149,10 +154,7 @@ read_4b(ptr) * loads the specified char's data */ buff_t * -sp_load_char_data(file_offset, num, cb_offset) - fix31 file_offset; - fix15 num; - fix15 cb_offset; +sp_load_char_data(fix31 file_offset, fix15 num, fix15 cb_offset) { SpeedoMasterFontPtr master = sp_fp_cur->master; @@ -172,10 +174,115 @@ sp_load_char_data(file_offset, num, cb_offset) return &master->char_data; } +struct speedo_encoding { + char *name; + int *enc; + int enc_size; +}; + +/* Takes care of caching encodings already referenced */ +static int +find_encoding(const char *fontname, const char *filename, + int **enc, int *enc_size) +{ + static struct speedo_encoding *known_encodings=0; + static int number_known_encodings=0; + static int known_encodings_size=0; + + char *encoding_name; + int iso8859_1; + FontMapPtr mapping; + int i, j, k, size; + struct speedo_encoding *temp; + int *new_enc; + char *new_name; + + iso8859_1 = 0; + + encoding_name = FontEncFromXLFD(fontname, strlen(fontname)); + if(!encoding_name) { + encoding_name="iso8859-1"; + iso8859_1=1; + } + /* We don't go through the font library if asked for Latin-1 */ + iso8859_1 = iso8859_1 || !strcmp(encoding_name, "iso8859-1"); + + for(i=0; i<number_known_encodings; i++) { + if(!strcmp(encoding_name, known_encodings[i].name)) { + *enc=known_encodings[i].enc; + *enc_size=known_encodings[i].enc_size; + return Successful; + } + } + + /* it hasn't been cached yet, need to compute it */ + + /* ensure we've got enough storage first */ + + if(known_encodings==0) { + if((known_encodings= + (struct speedo_encoding*)xalloc(2*sizeof(struct speedo_encoding))) + ==0) + return AllocError; + number_known_encodings=0; + known_encodings_size=2; + } + + if(number_known_encodings >= known_encodings_size) { + if((temp= + (struct speedo_encoding*)xrealloc(known_encodings, + 2*sizeof(struct speedo_encoding)* + known_encodings_size))==0) + return AllocError; + known_encodings=temp; + known_encodings_size*=2; + } + + mapping=0; + if(!iso8859_1) { + mapping = FontEncMapFind(encoding_name, + FONT_ENCODING_UNICODE, -1, -1, + filename); + } +#define SPEEDO_RECODE(c) \ + (mapping? \ + unicode_to_bics(FontEncRecode(c, mapping)): \ + unicode_to_bics(c)) + + if((new_name = (char*)xalloc(strlen(encoding_name)))==0) + return AllocError; + strcpy(new_name, encoding_name); + + /* For now, we limit ourselves to 256 glyphs */ + size=0; + for(i=0; i < (mapping?mapping->encoding->size:256) && i < 256; i++) + if(SPEEDO_RECODE(i)>=0) + size++; + new_enc = (int*)xalloc(2*size*sizeof(int)); + if(!new_enc) { + xfree(new_name); + return AllocError; + } + for(i=j=0; i < (mapping?mapping->encoding->size:256) && i < 256; i++) + if((k = SPEEDO_RECODE(i))>=0) { + new_enc[2*j] = i; + new_enc[2*j+1] = k; + j++; + } + known_encodings[number_known_encodings].name = new_name; + known_encodings[number_known_encodings].enc = new_enc; + known_encodings[number_known_encodings].enc_size = size; + number_known_encodings++; + + *enc = new_enc; + *enc_size = size; + return Successful; +#undef SPEEDO_RECODE +} + int -sp_open_master(filename, master) - char *filename; - SpeedoMasterFontPtr *master; +sp_open_master(const char *fontname, const char *filename, + SpeedoMasterFontPtr *master) { SpeedoMasterFontPtr spmf; ufix8 tmp[16]; @@ -273,8 +380,8 @@ sp_open_master(filename, master) spmf->num_chars = read_2b(f_buffer + FH_NCHRL); - spmf->enc = sp_bics_map; - spmf->enc_size = sp_bics_map_size; + spmf->enc = 0; + spmf->enc_size = 0; #ifdef EXTRAFONTS { /* choose the proper encoding */ @@ -291,7 +398,11 @@ sp_open_master(filename, master) } #endif - /* XXX slam back to ISO Latin1 */ + if(!spmf->enc) + if((ret=find_encoding(fontname, filename, &spmf->enc, &spmf->enc_size)) + !=Successful) + goto cleanup; + spmf->first_char_id = spmf->enc[0]; /* size of extents array */ spmf->max_id = spmf->enc[(spmf->enc_size - 1) * 2]; @@ -308,8 +419,7 @@ cleanup: } void -sp_close_master_font(spmf) - SpeedoMasterFontPtr spmf; +sp_close_master_font(SpeedoMasterFontPtr spmf) { if (!spmf) return; @@ -324,8 +434,7 @@ sp_close_master_font(spmf) } void -sp_close_master_file(spmf) - SpeedoMasterFontPtr spmf; +sp_close_master_file(SpeedoMasterFontPtr spmf) { (void) fclose(spmf->fp); spmf->state &= ~MasterFileOpen; @@ -336,8 +445,7 @@ sp_close_master_file(spmf) * reset the encryption key, and make sure the file is opened */ void -sp_reset_master(spmf) - SpeedoMasterFontPtr spmf; +sp_reset_master(SpeedoMasterFontPtr spmf) { sp_set_key(spmf->key); if (!(spmf->state & MasterFileOpen)) { diff --git a/src/Speedo/spfont.c b/src/Speedo/spfont.c index ebfc526..61ec6d4 100644 --- a/src/Speedo/spfont.c +++ b/src/Speedo/spfont.c @@ -21,6 +21,7 @@ * * Author: Dave Lemke, Network Computing Devices Inc */ +/* $XFree86: xc/lib/font/Speedo/spfont.c,v 3.12 2001/12/14 19:56:41 dawes Exp $ */ /* @@ -56,7 +57,9 @@ from The Open Group. #include "FSproto.h" #include "spint.h" -#include <servermd.h> +#include "servermd.h" +#include "fontutil.h" +#ifndef FONTMODULE #ifdef _XOPEN_SOURCE #include <math.h> #else @@ -64,6 +67,9 @@ from The Open Group. #include <math.h> #undef _XOPEN_SOURCE #endif +#else +#include "xf86_ansic.h" +#endif #ifndef M_PI #define M_PI 3.14159 @@ -78,19 +84,16 @@ from The Open Group. #endif -extern void SpeedoCloseFont(); -static int sp_get_glyphs(); -static int sp_get_metrics(); -static int sp_load_font(); +static void SpeedoCloseFont(FontPtr pfont); static int -sp_get_glyphs(pFont, count, chars, charEncoding, glyphCount, glyphs) - FontPtr pFont; - unsigned long count; - register unsigned char *chars; - FontEncoding charEncoding; - unsigned long *glyphCount; /* RETURN */ - CharInfoPtr *glyphs; /* RETURN */ +sp_get_glyphs( + FontPtr pFont, + unsigned long count, + register unsigned char *chars, + FontEncoding charEncoding, + unsigned long *glyphCount, /* RETURN */ + CharInfoPtr *glyphs) /* RETURN */ { SpeedoFontPtr spf; unsigned int firstCol; @@ -196,13 +199,13 @@ sp_get_glyphs(pFont, count, chars, charEncoding, glyphCount, glyphs) static CharInfoRec nonExistantChar; static int -sp_get_metrics(pFont, count, chars, charEncoding, glyphCount, glyphs) - FontPtr pFont; - unsigned long count; - register unsigned char *chars; - FontEncoding charEncoding; - unsigned long *glyphCount; /* RETURN */ - xCharInfo **glyphs; /* RETURN */ +sp_get_metrics( + FontPtr pFont, + unsigned long count, + register unsigned char *chars, + FontEncoding charEncoding, + unsigned long *glyphCount, /* RETURN */ + xCharInfo **glyphs) /* RETURN */ { int ret; SpeedoFontPtr spf; @@ -219,15 +222,15 @@ sp_get_metrics(pFont, count, chars, charEncoding, glyphCount, glyphs) } int -sp_open_font(fontname, filename, entry, vals, format, fmask, flags, spfont) - char *fontname, - *filename; - FontEntryPtr entry; - FontScalablePtr vals; - fsBitmapFormat format; - fsBitmapFormatMask fmask; - Mask flags; - SpeedoFontPtr *spfont; +sp_open_font( + char *fontname, + char *filename, + FontEntryPtr entry, + FontScalablePtr vals, + fsBitmapFormat format, + fsBitmapFormatMask fmask, + Mask flags, + SpeedoFontPtr *spfont) { SpeedoFontPtr spf; SpeedoMasterFontPtr spmf; @@ -239,7 +242,7 @@ sp_open_font(fontname, filename, entry, vals, format, fmask, flags, spfont) spmf = (SpeedoMasterFontPtr) entry->u.scalable.extra->private; if (!spmf) { - ret = sp_open_master(filename, &spmf); + ret = sp_open_master(fontname, filename, &spmf); if (ret != Successful) return ret; entry->u.scalable.extra->private = (pointer) spmf; @@ -314,15 +317,15 @@ sp_open_font(fontname, filename, entry, vals, format, fmask, flags, spfont) } static int -sp_load_font(fontname, filename, entry, vals, format, fmask, pfont, flags) +sp_load_font( char *fontname, - *filename; - FontEntryPtr entry; - FontScalablePtr vals; - fsBitmapFormat format; - fsBitmapFormatMask fmask; - FontPtr pfont; - Mask flags; + char *filename, + FontEntryPtr entry, + FontScalablePtr vals, + fsBitmapFormat format, + fsBitmapFormatMask fmask, + FontPtr pfont, + Mask flags) { SpeedoFontPtr spf; SpeedoMasterFontPtr spmf; @@ -377,8 +380,6 @@ sp_load_font(fontname, filename, entry, vals, format, fmask, pfont, flags) pfont->unload_font = SpeedoCloseFont; pfont->unload_glyphs = NULL; pfont->refcnt = 0; - pfont->maxPrivate = -1; - pfont->devPrivates = (pointer *) 0; /* have to hold on to master for min/max id */ sp_close_master_file(spmf); @@ -387,15 +388,15 @@ sp_load_font(fontname, filename, entry, vals, format, fmask, pfont, flags) } int -SpeedoFontLoad(ppfont, fontname, filename, entry, vals, format, fmask, flags) - FontPtr *ppfont; - char *fontname; - char *filename; - FontEntryPtr entry; - FontScalablePtr vals; - fsBitmapFormat format; - fsBitmapFormatMask fmask; - Mask flags; +SpeedoFontLoad( + FontPtr *ppfont, + char *fontname, + char *filename, + FontEntryPtr entry, + FontScalablePtr vals, + fsBitmapFormat format, + fsBitmapFormatMask fmask, + Mask flags) { FontPtr pfont; int ret; @@ -405,24 +406,22 @@ SpeedoFontLoad(ppfont, fontname, filename, entry, vals, format, fmask, flags) hypot(vals->pixel_matrix[2], vals->pixel_matrix[3]) < 1.0) return BadFontName; - pfont = (FontPtr) xalloc(sizeof(FontRec)); - if (!pfont) { + if (!(pfont = CreateFontRec())) return AllocError; - } + ret = sp_load_font(fontname, filename, entry, vals, format, fmask, pfont, flags); if (ret == Successful) *ppfont = pfont; else - xfree (pfont); + DestroyFontRec (pfont); return ret; } void -sp_close_font(spf) - SpeedoFontPtr spf; +sp_close_font(SpeedoFontPtr spf) { SpeedoMasterFontPtr spmf; @@ -435,9 +434,8 @@ sp_close_font(spf) xfree(spf); } -void -SpeedoCloseFont(pfont) - FontPtr pfont; +static void +SpeedoCloseFont(FontPtr pfont) { SpeedoFontPtr spf; @@ -445,6 +443,6 @@ SpeedoCloseFont(pfont) sp_close_font(spf); xfree(pfont->info.isStringProp); xfree(pfont->info.props); - xfree(pfont->devPrivates); - xfree(pfont); + DestroyFontRec(pfont); + } diff --git a/src/Speedo/spfuncs.c b/src/Speedo/spfuncs.c index 0cd09ee..18204eb 100644 --- a/src/Speedo/spfuncs.c +++ b/src/Speedo/spfuncs.c @@ -49,24 +49,27 @@ other dealings in this Software without prior written authorization from The Open Group. */ +/* $XFree86: xc/lib/font/Speedo/spfuncs.c,v 1.8 2001/12/14 19:56:42 dawes Exp $ */ +#ifndef FONTMODULE #include <X11/Xos.h> +#endif #include "fntfilst.h" +#include "fontutil.h" #include "spint.h" /* ARGSUSED */ -int -SpeedoOpenScalable (fpe, pFont, flags, entry, fileName, vals, format, fmask, - non_cachable_font) - FontPathElementPtr fpe; - FontPtr *pFont; - int flags; - FontEntryPtr entry; - char *fileName; - FontScalablePtr vals; - fsBitmapFormat format; - fsBitmapFormatMask fmask; - FontPtr non_cachable_font; /* We don't do licensing */ +static int +SpeedoOpenScalable ( + FontPathElementPtr fpe, + FontPtr *pFont, + int flags, + FontEntryPtr entry, + char *fileName, + FontScalablePtr vals, + fsBitmapFormat format, + fsBitmapFormatMask fmask, + FontPtr non_cachable_font) /* We don't do licensing */ { char fullName[MAXFONTNAMELEN]; @@ -85,13 +88,13 @@ SpeedoOpenScalable (fpe, pFont, flags, entry, fileName, vals, format, fmask, * and to simply save the values without doing the work. */ static int -get_font_info(pinfo, fontname, filename, entry, vals, spfont) - FontInfoPtr pinfo; - char *fontname; - char *filename; - FontEntryPtr entry; - FontScalablePtr vals; - SpeedoFontPtr *spfont; +get_font_info( + FontInfoPtr pinfo, + char *fontname, + char *filename, + FontEntryPtr entry, + FontScalablePtr vals, + SpeedoFontPtr *spfont) { SpeedoFontPtr spf; int err; @@ -122,14 +125,14 @@ get_font_info(pinfo, fontname, filename, entry, vals, spfont) } /* ARGSUSED */ -int -SpeedoGetInfoScaleable(fpe, pFontInfo, entry, fontName, fileName, vals) - FontPathElementPtr fpe; - FontInfoPtr pFontInfo; - FontEntryPtr entry; - FontNamePtr fontName; - char *fileName; - FontScalablePtr vals; +static int +SpeedoGetInfoScaleable( + FontPathElementPtr fpe, + FontInfoPtr pFontInfo, + FontEntryPtr entry, + FontNamePtr fontName, + char *fileName, + FontScalablePtr vals) { SpeedoFontPtr spf = NULL; char fullName[MAXFONTNAMELEN]; @@ -147,8 +150,8 @@ SpeedoGetInfoScaleable(fpe, pFontInfo, entry, fontName, fileName, vals) } static FontRendererRec renderer = { - ".spd", 4, (int (*)()) 0, SpeedoOpenScalable, - (int (*)()) 0, SpeedoGetInfoScaleable, 0 + ".spd", 4, NULL, SpeedoOpenScalable, + NULL, SpeedoGetInfoScaleable, 0 , CAP_MATRIX | CAP_CHARSUBSETTING }; diff --git a/src/Speedo/spglyph.c b/src/Speedo/spglyph.c index ff0f370..6db6302 100644 --- a/src/Speedo/spglyph.c +++ b/src/Speedo/spglyph.c @@ -49,9 +49,11 @@ other dealings in this Software without prior written authorization from The Open Group. */ +/* $XFree86: xc/lib/font/Speedo/spglyph.c,v 1.7 2001/12/14 19:56:42 dawes Exp $ */ #include <X11/X.h> /* for bit order #defines */ #include "spint.h" +#include "fontutil.h" #undef CLIP_BBOX_NOISE @@ -62,12 +64,12 @@ static int bit_order, scan; unsigned long -sp_compute_data_size(pfont, mappad, scanlinepad, start, end) - FontPtr pfont; +sp_compute_data_size( + FontPtr pfont, int mappad, - scanlinepad; + int scanlinepad, unsigned long start, - end; + unsigned long end) { unsigned long ch; unsigned long size = 0; @@ -121,8 +123,7 @@ sp_compute_data_size(pfont, mappad, scanlinepad, start, end) } static void -finish_line(spf) - SpeedoFontPtr spf; +finish_line(SpeedoFontPtr spf) { int bpr = cfv->bpr; CharInfoPtr ci = &spf->encoding[cfv->char_id - spf->master->first_char_id]; @@ -131,17 +132,14 @@ finish_line(spf) bpr = GLYPH_SIZE(ci, cfv->scanpad); } if (bpr) { /* char may not have any metrics... */ - cfv->bp += bpr; + cfv->bp = (char *)cfv->bp + bpr; } assert(cfv->bp - sp_fp_cur->bitmaps <= sp_fp_cur->bitmap_size); } void -sp_set_bitmap_bits(y, xbit1, xbit2) - fix15 y; - fix15 xbit1, - xbit2; +sp_set_bitmap_bits(fix15 y, fix15 xbit1, fix15 xbit2) { int nmiddle; CARD8 startmask, @@ -188,7 +186,7 @@ sp_set_bitmap_bits(y, xbit1, xbit2) xbit1 = 0; nmiddle = (xbit1 >> 3); - dst = (CARD8 *) (cfv->bp + nmiddle); + dst = (CARD8 *)cfv->bp + nmiddle; xbit2 -= (xbit1 & ~7); nmiddle = (xbit2 >> 3); xbit1 &= 7; @@ -212,13 +210,8 @@ sp_set_bitmap_bits(y, xbit1, xbit2) /* ARGSUSED */ void -sp_open_bitmap(x_set_width, y_set_width, xorg, yorg, xsize, ysize) - fix31 x_set_width; - fix31 y_set_width; - fix31 xorg; - fix31 yorg; - fix15 xsize; - fix15 ysize; +sp_open_bitmap(fix31 x_set_width, fix31 y_set_width, fix31 xorg, fix31 yorg, + fix15 xsize, fix15 ysize) { CharInfoPtr ci = &sp_fp_cur->encoding[cfv->char_id - sp_fp_cur->master->first_char_id]; @@ -314,10 +307,10 @@ sp_close_bitmap() } int -sp_build_all_bitmaps(pfont, format, fmask) - FontPtr pfont; - fsBitmapFormat format; - fsBitmapFormatMask fmask; +sp_build_all_bitmaps( + FontPtr pfont, + fsBitmapFormat format, + fsBitmapFormatMask fmask) { int ret, glyph = 1, @@ -372,7 +365,7 @@ sp_build_all_bitmaps(pfont, format, fmask) int j; cfv->char_index = spmf->enc[i * 2 + 1]; cfv->char_id = spmf->enc[i * 2]; -#if DEBUG +#ifdef DEBUG fprintf(stderr, "build_all_sp_bitmaps:i = %d, Char ID = %d\n", i, cfv->char_id); #endif if (!cfv->char_id) diff --git a/src/Speedo/spinfo.c b/src/Speedo/spinfo.c index 05d3f24..d857485 100644 --- a/src/Speedo/spinfo.c +++ b/src/Speedo/spinfo.c @@ -49,10 +49,16 @@ other dealings in this Software without prior written authorization from The Open Group. */ +/* $XFree86: xc/lib/font/Speedo/spinfo.c,v 1.13 2002/09/10 16:14:33 tsi Exp $ */ #include "fntfilst.h" +#include "fontutil.h" #include "spint.h" +#ifndef FONTMODULE #include <math.h> +#else +#include "xf86_ansic.h" +#endif /* percentage of pointsize used to specify ascent & descent */ #define STRETCH_FACTOR 120 @@ -95,7 +101,9 @@ static fontProp extraProps[] = { { "RAW_POINT_SIZE", 0, }, { "RAW_ASCENT", 0, }, { "RAW_DESCENT", 0, }, - { "RAW_AVERAGE_WIDTH", 0, } + { "RAW_AVERAGE_WIDTH", 0, }, + { "FONT_TYPE", 0, }, + { "RASTERIZER_NAME", 0, } }; /* this is a bit kludgy */ @@ -106,15 +114,14 @@ static fontProp extraProps[] = { #define RAWASCENTPROP 4 #define RAWDESCENTPROP 5 #define RAWWIDTHPROP 6 - +#define FONT_TYPEPROP 7 +#define RASTERIZER_NAMEPROP 8 #define NNAMEPROPS (sizeof(fontNamePropTable) / sizeof(fontProp)) #define NEXTRAPROPS (sizeof(extraProps) / sizeof(fontProp)) #define NPROPS (NNAMEPROPS + NEXTRAPROPS) -extern Atom MakeAtom(); - void sp_make_standard_props() { @@ -130,9 +137,9 @@ sp_make_standard_props() } void -sp_make_header(spf, pinfo) - SpeedoFontPtr spf; - FontInfoPtr pinfo; +sp_make_header( + SpeedoFontPtr spf, + FontInfoPtr pinfo) { int pixel_size; SpeedoMasterFontPtr spmf = spf->master; @@ -172,10 +179,10 @@ sp_make_header(spf, pinfo) } static void -adjust_min_max(minc, maxc, tmp) +adjust_min_max( xCharInfo *minc, - *maxc, - *tmp; + xCharInfo *maxc, + xCharInfo *tmp) { #define MINMAX(field,ci) \ if (minc->field > (ci)->field) \ @@ -199,11 +206,11 @@ adjust_min_max(minc, maxc, tmp) void -sp_compute_bounds(spf, pinfo, flags, sWidth) - SpeedoFontPtr spf; - FontInfoPtr pinfo; - unsigned long flags; - long *sWidth; +sp_compute_bounds( + SpeedoFontPtr spf, + FontInfoPtr pinfo, + unsigned long flags, + long *sWidth) { int i, id, @@ -327,18 +334,18 @@ sp_compute_bounds(spf, pinfo, flags, sWidth) } void -sp_compute_props(spf, fontname, pinfo, sWidth) - SpeedoFontPtr spf; - char *fontname; - FontInfoPtr pinfo; - long sWidth; +sp_compute_props( + SpeedoFontPtr spf, + char *fontname, + FontInfoPtr pinfo, + long sWidth) { FontPropPtr pp; int i, nprops; fontProp *fpt; char *is_str; - char *ptr1, + char *ptr1 = NULL, *ptr2; char *ptr3; char tmpname[1024]; @@ -352,6 +359,7 @@ sp_compute_props(spf, fontname, pinfo, sWidth) pinfo->isStringProp = (char *) 0; xfree(pinfo->props); pinfo->props = (FontPropPtr) 0; + pinfo->nprops = 0; return; } bzero(pinfo->isStringProp, (sizeof(char) * nprops)); @@ -416,6 +424,16 @@ sp_compute_props(spf, fontname, pinfo, sWidth) pp->value = MakeAtom(spf->master->copyright, strlen(spf->master->copyright), TRUE); break; + case FONT_TYPEPROP: + *is_str = TRUE; + pp->value = MakeAtom("Speedo", strlen("Speedo"), TRUE); + break; + case RASTERIZER_NAMEPROP: + *is_str = TRUE; + pp->value = MakeAtom("X Consortium Speedo Rasterizer", + strlen("X Consortium Speedo Rasterizer"), + TRUE); + break; case RAWPIXELPROP: *is_str = FALSE; pp->value = 1000; diff --git a/src/Speedo/spint.h b/src/Speedo/spint.h index d915238..377edd8 100644 --- a/src/Speedo/spint.h +++ b/src/Speedo/spint.h @@ -47,12 +47,17 @@ other dealings in this Software without prior written authorization from The Open Group. */ +/* $XFree86: xc/lib/font/Speedo/spint.h,v 1.10 2001/12/14 19:56:42 dawes Exp $ */ #ifndef _SPINT_H_ #define _SPINT_H_ -#include <stdio.h> #include "fntfilst.h" +#ifndef XFree86LOADER +#include <stdio.h> +#else +#include <xf86_ansic.h> +#endif #include <X11/Xfuncproto.h> #include "speedo.h" @@ -141,24 +146,27 @@ typedef struct _sp_font { extern SpeedoFontPtr sp_fp_cur; -extern int sp_open_font(); -extern int sp_open_master(); -extern void sp_close_font(); -extern void sp_close_master_font(); -extern void sp_close_master_file(); -extern void sp_reset_master(); -#if NeedVarargsPrototypes +extern int sp_open_font(char *, char *, FontEntryPtr, FontScalablePtr, + fsBitmapFormat, fsBitmapFormatMask, Mask, + SpeedoFontPtr *); +extern int sp_open_master(const char *, const char *, SpeedoMasterFontPtr *); +extern void sp_close_font(SpeedoFontPtr); +extern void sp_close_master_font(SpeedoMasterFontPtr); +extern void sp_close_master_file(SpeedoMasterFontPtr); +extern void sp_reset_master(SpeedoMasterFontPtr); extern void SpeedoErr(char *fmt, ...); -#else -extern void SpeedoErr(); -#endif -extern void sp_make_standard_props(); -extern void sp_make_header(); -extern void sp_compute_bounds(); -extern void sp_compute_props(); -extern int sp_build_all_bitmaps(); -extern unsigned long sp_compute_data_size(); +extern void sp_make_standard_props(void); +extern void sp_make_header(SpeedoFontPtr, FontInfoPtr); +extern void sp_compute_bounds(SpeedoFontPtr, FontInfoPtr, unsigned long, long *); +extern void sp_compute_props(SpeedoFontPtr, char *, FontInfoPtr, long); +extern int sp_build_all_bitmaps(FontPtr, fsBitmapFormat, fsBitmapFormatMask); +extern unsigned long sp_compute_data_size(FontPtr, int, int, unsigned long, + unsigned long); + +extern int SpeedoFontLoad(FontPtr *, char *, char *, FontEntryPtr, + FontScalablePtr, fsBitmapFormat, fsBitmapFormatMask, + Mask); extern int sp_bics_map[]; extern int sp_bics_map_size; diff --git a/src/Type1/arith.c b/src/Type1/arith.c index 65162ea..693b970 100644 --- a/src/Type1/arith.c +++ b/src/Type1/arith.c @@ -26,6 +26,8 @@ * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF * THIS SOFTWARE. */ +/* $XFree86: xc/lib/font/Type1/arith.c,v 1.6 2002/02/18 20:51:57 herrb Exp $ */ + /* ARITH CWEB V0006 ******** */ /* :h1.ARITH Module - Portable Module for Multiple Precision Fixed Point Arithmetic @@ -48,9 +50,11 @@ assembly language, unlike C, will have 64-bit multiply products and The included files are: */ +#include "os.h" #include "objects.h" #include "spaces.h" #include "arith.h" + /* :h3. @@ -104,10 +108,8 @@ SIGNBITON tests the high order bit of a long 'w': The two multiplicands must be positive. */ -void DLmult(product, u, v) - register doublelong *product; - register unsigned long u; - register unsigned long v; +void +DLmult(doublelong *product, unsigned long u, unsigned long v) { #ifdef LONG64 /* printf("DLmult(? ?, %lx, %lx)\n", u, v); */ @@ -155,9 +157,9 @@ void DLmult(product, u, v) Both the dividend and the divisor must be positive. */ -void DLdiv(quotient, divisor) - doublelong *quotient; /* also where dividend is, originally */ - unsigned long divisor; +void +DLdiv(doublelong *quotient, /* also where dividend is, originally */ + unsigned long divisor) { #ifdef LONG64 /* printf("DLdiv(%lx %lx)\n", quotient, divisor); */ @@ -213,7 +215,7 @@ void DLdiv(quotient, divisor) divisor >>= 1; if ((u1u2 >> (LONGSIZE - shift)) != 0 && shift != 0) - abort("DLdiv: dividend too large"); + Abort("DLdiv: dividend too large"); u1u2 = (u1u2 << shift) + ((shift == 0) ? 0 : u3u4 >> (LONGSIZE - shift)); u3u4 <<= shift; @@ -276,7 +278,7 @@ void DLdiv(quotient, divisor) */ u1u2 = t; if (HIGHDIGIT(u1u2) != 0) - abort("divide algorithm error"); + Abort("divide algorithm error"); u1u2 = ASSEMBLE(u1u2, LOWDIGIT(u3)); u3 = LOWDIGIT(u3u4); q3q4 = ASSEMBLE(q3q4, qhat); @@ -299,9 +301,9 @@ carry. Conversely, if there was a carry, the sum of the lows must be less than the max of the lows. So, the test is "if and only if". */ -void DLadd(u, v) - doublelong *u; /* u = u + v */ - doublelong *v; +void +DLadd(doublelong *u, /* u = u + v */ + doublelong *v) { #ifdef LONG64 /* printf("DLadd(%lx %lx)\n", *u, *v); */ @@ -324,9 +326,9 @@ Testing for a borrow is even easier. If the v.low is greater than u.low, there must be a borrow. */ -void DLsub(u, v) - doublelong *u; /* u = u - v */ - doublelong *v; +void +DLsub(doublelong *u, /* u = u - v */ + doublelong *v) { #ifdef LONG64 /* printf("DLsub(%lx %lx)\n", *u, *v); */ @@ -358,8 +360,8 @@ overflow will occur when the resulting value is passed back as a fractpel. */ -fractpel FPmult(u, v) - register fractpel u,v; +fractpel +FPmult(fractpel u, fractpel v) { doublelong w; register int negative = FALSE; /* sign flag */ @@ -403,9 +405,8 @@ fractpel FPmult(u, v) These values may be signed. The function returns the quotient. */ -fractpel FPdiv(dividend, divisor) - register fractpel dividend; - register fractpel divisor; +fractpel +FPdiv(fractpel dividend, fractpel divisor) { doublelong w; /* result will be built here */ int negative = FALSE; /* flag for sign bit */ @@ -451,8 +452,10 @@ an operator that first multiplies by one constant then divides by another, keeping the intermediate result in extended precision. */ -fractpel FPstarslash(a, b, c) - register fractpel a,b,c; /* result = a * b / c */ +fractpel +FPstarslash(fractpel a, /* result = a * b / c */ + fractpel b, + fractpel c) { doublelong w; /* result will be built here */ int negative = FALSE; diff --git a/src/Type1/arith.h b/src/Type1/arith.h index ab9412b..0eae659 100644 --- a/src/Type1/arith.h +++ b/src/Type1/arith.h @@ -26,21 +26,20 @@ * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF * THIS SOFTWARE. */ +/* $XFree86: xc/lib/font/Type1/arith.h,v 1.5 2001/01/17 19:43:22 dawes Exp $ */ + /*SHARED*/ #include <X11/Xmd.h> /* LONG64 */ -void DLmult(),DLdiv(),DLadd(),DLsub(); - -fractpel FPmult(); -fractpel FPdiv(); -fractpel FPstarslash(); - /*END SHARED*/ /*SHARED*/ +#undef SHORTSIZE #define SHORTSIZE (sizeof(short)*8) +#undef LONGSIZE #define LONGSIZE (SHORTSIZE*2) +#undef MAXSHORT #define MAXSHORT ((1<<SHORTSIZE)-1) /*END SHARED*/ @@ -67,4 +66,12 @@ typedef struct { } #endif +extern void DLmult ( doublelong *product, unsigned long u, unsigned long v ); +extern void DLdiv ( doublelong *quotient, unsigned long divisor ); +extern void DLadd ( doublelong *u, doublelong *v ); +extern void DLsub ( doublelong *u, doublelong *v ); +extern fractpel FPmult ( fractpel u, fractpel v ); +extern fractpel FPdiv ( fractpel dividend, fractpel divisor ); +extern fractpel FPstarslash ( fractpel a, fractpel b, fractpel c ); + /*END SHARED*/ diff --git a/src/Type1/blues.h b/src/Type1/blues.h index 2480b14..c3943ec 100644 --- a/src/Type1/blues.h +++ b/src/Type1/blues.h @@ -28,8 +28,10 @@ * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ +/* $XFree86: xc/lib/font/Type1/blues.h,v 1.4 2001/01/17 19:43:22 dawes Exp $ */ + -extern psobj *GetType1CharString(); +extern psobj *GetType1CharString ( psfont *fontP, unsigned char code ); #define TOPLEFT 1 #define BOTTOMRIGHT 2 diff --git a/src/Type1/curves.c b/src/Type1/curves.c index d1033fe..206958a 100644 --- a/src/Type1/curves.c +++ b/src/Type1/curves.c @@ -29,6 +29,8 @@ /* CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT */ /* OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS */ /* SOFTWARE. */ +/* $XFree86: xc/lib/font/Type1/curves.c,v 1.8 2002/02/18 20:51:57 herrb Exp $ */ + /* :h1.CURVES Module - Stepping Beziers @@ -42,6 +44,7 @@ through. Include files needed: */ +#include "os.h" #include "objects.h" #include "spaces.h" #include "paths.h" @@ -88,8 +91,11 @@ struct bezierinfo { to subdivide. */ -static int BezierTerminationTest(xa,ya,xb,yb,xc,yc,xd,yd) -fractpel xa,ya,xb,yb,xc,yc,xd,yd; +static int +BezierTerminationTest(fractpel xa, fractpel ya, + fractpel xb, fractpel yb, + fractpel xc, fractpel yc, + fractpel xd, fractpel yd) { fractpel dmax; dmax = ABS(xa - xb); @@ -112,13 +118,12 @@ Bezier to define his curves as he did. If the input region 'R' is NULL, the result is a path that is the 'flattened' curve; otherwise StepBezier returns nothing special. */ -static struct segment *StepBezierRecurse(I,xA,yA,xB,yB,xC,yC,xD,yD) - struct bezierinfo *I; /* Region under construction or NULL */ - fractpel xA,yA; /* A control point */ - fractpel xB,yB; /* B control point */ - fractpel xC,yC; /* C control point */ - fractpel xD,yD; /* D control point */ - +static struct segment * +StepBezierRecurse(struct bezierinfo *I, /* Region under construction or NULL */ + fractpel xA, fractpel yA, /* A control point */ + fractpel xB, fractpel yB, /* B control point */ + fractpel xC, fractpel yC, /* C control point */ + fractpel xD, fractpel yD) /* D control point */ { if (BezierTerminationTest(xA,yA,xB,yB,xC,yC,xD,yD)) { @@ -167,6 +172,7 @@ static struct segment *StepBezierRecurse(I,xA,yA,xB,yB,xC,yC,xD,yD) StepBezierRecurse(I, xABCD, yABCD, xBCD, yBCD, xCD, yCD, xD, yD); } } + return NULL; /*NOTREACHED*/ } @@ -177,6 +183,7 @@ Intermediate values in the Bezier subdivision are 8 times bigger than the starting values. If this overflows, a 'long', we are in trouble: */ +#undef BITS #define BITS (sizeof(long)*8) #define HIGHTEST(p) (((p)>>(BITS-4)) != 0) /* includes sign bit */ #define TOOBIG(xy) ((xy < 0) ? HIGHTEST(-xy) : HIGHTEST(xy)) @@ -187,12 +194,12 @@ the starting values. If this overflows, a 'long', we are in trouble: This is the entry point called from outside the module. */ -struct segment *StepBezier(R, xA, yA, xB, yB, xC, yC, xD, yD) - struct region *R; /* Region under construction or NULL */ - fractpel xA,yA; /* A control point */ - fractpel xB,yB; /* B control point */ - fractpel xC,yC; /* C control point */ - fractpel xD,yD; /* D control point */ +struct segment * +StepBezier(struct region *R, /* Region under construction or NULL */ + fractpel xA, fractpel yA, /* A control point */ + fractpel xB, fractpel yB, /* B control point */ + fractpel xC, fractpel yC, /* C control point */ + fractpel xD, fractpel yD) /* D control point */ { struct bezierinfo Info; @@ -209,7 +216,7 @@ struct segment *StepBezier(R, xA, yA, xB, yB, xC, yC, xD, yD) if ( TOOBIG(xB) || TOOBIG(yB) || TOOBIG(xC) || TOOBIG(yC) || TOOBIG(xD) || TOOBIG(yD) ) - abort("Beziers this big not yet supported"); + Abort("Beziers this big not yet supported"); return(StepBezierRecurse(&Info, (fractpel) 0, (fractpel) 0, xB, yB, xC, yC, xD, yD)); diff --git a/src/Type1/curves.h b/src/Type1/curves.h index 4138a6f..ff2bf48 100644 --- a/src/Type1/curves.h +++ b/src/Type1/curves.h @@ -26,6 +26,8 @@ * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF * THIS SOFTWARE. */ +/* $XFree86: xc/lib/font/Type1/curves.h,v 1.4 2001/01/17 19:43:22 dawes Exp $ */ + /*SHARED*/ #define StepConic(R,xA,yA,xB,yB,xC,yC,r) t1_StepConic(R,xA,yA,xB,yB,xC,yC,r) @@ -33,8 +35,10 @@ #define FlattenConic(xM,yM,xC,yC,r) t1_StepConic(NULL,(fractpel)0,(fractpel)0,xM,yM,xC,yC,r) #define FlattenBezier(xB,yB,xC,yC,xD,yD) t1_StepBezier(NULL,(fractpel)0,(fractpel)0,xB,yB,xC,yC,xD,yD) - + +#if 0 struct segment *t1_StepConic(); -struct segment *t1_StepBezier(); - +#endif +extern struct segment *t1_StepBezier ( struct region *R, fractpel xA, fractpel yA, fractpel xB, fractpel yB, fractpel xC, fractpel yC, fractpel xD, fractpel yD ); + /*END SHARED*/ diff --git a/src/Type1/fontfcn.c b/src/Type1/fontfcn.c index 5516468..471a4ee 100644 --- a/src/Type1/fontfcn.c +++ b/src/Type1/fontfcn.c @@ -1,4 +1,4 @@ -/* $Xorg: fontfcn.c,v 1.5 2000/12/01 16:26:25 steve Exp $ */ +/* $Xorg: fontfcn.c,v 1.4 2000/08/17 19:46:30 cpqbld Exp $ */ /* Copyright International Business Machines,Corp. 1991 * All Rights Reserved * @@ -28,15 +28,55 @@ * SOFTWARE. */ /* Author: Katherine A. Hitchcock IBM Almaden Research Laboratory */ +/* Copyright (c) 1994-1999 Silicon Graphics, Inc. All Rights Reserved. + * + * The contents of this file are subject to the CID Font Code Public Licence + * Version 1.0 (the "License"). You may not use this file except in compliance + * with the Licence. You may obtain a copy of the License at Silicon Graphics, + * Inc., attn: Legal Services, 2011 N. Shoreline Blvd., Mountain View, CA + * 94043 or at http://www.sgi.com/software/opensource/cid/license.html. + * + * Software distributed under the License is distributed on an "AS IS" basis. + * ALL WARRANTIES ARE DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED + * WARRANTIES OF MERCHANTABILITY, OF FITNESS FOR A PARTICULAR PURPOSE OR OF + * NON-INFRINGEMENT. See the License for the specific language governing + * rights and limitations under the License. + * + * The Original Software is CID font code that was developed by Silicon + * Graphics, Inc. + */ +/* $XFree86: xc/lib/font/Type1/fontfcn.c,v 1.11 2001/11/23 19:21:31 dawes Exp $ */ +#ifndef FONTMODULE #include <stdio.h> #include <string.h> +#else +#include "Xmd.h" /* For INT32 declaration */ +#include "Xdefs.h" /* For Bool */ +#include "xf86_ansic.h" +#endif #include "t1imager.h" #include "util.h" +#ifdef BUILDCID +#include "range.h" +#include "Xdefs.h" +#endif +#include "fntfilst.h" #include "fontfcn.h" -#include "fontmisc.h" - -extern xobject Type1Char(); + +extern struct segment *Type1Char ( char *env, XYspace S, + psobj *charstrP, psobj *subrsP, + psobj *osubrsP, + struct blues_struct *bluesP, int *modeP ); + +#ifdef BUILDCID +extern struct xobject *CIDChar ( char *env, XYspace S, + psobj *charstrP, psobj *subrsP, + psobj *osubrsP, + struct blues_struct *bluesP, int *modeP ); +static boolean initCIDFont( int cnt ); +#endif + /***================================================================***/ /* GLOBALS */ /***================================================================***/ @@ -45,7 +85,16 @@ char *CurFontEnv; char *vm_base = NULL; psfont *FontP = NULL; psfont TheCurrentFont; - +#ifdef BUILDCID +char CurCIDFontName[CID_PATH_MAX]; +char CurCMapName[CID_PATH_MAX]; +cidfont *CIDFontP = NULL; +cmapres *CMapP = NULL; +cidfont TheCurrentCIDFont; +cmapres TheCurrentCMap; +psfont *FDArrayP = NULL; +int FDArrayIndex = 0; +#endif /***================================================================***/ /* SearchDict - look for name */ @@ -53,9 +102,8 @@ psfont TheCurrentFont; /* return 0 - not found. */ /* return n - nth element in dictionary. */ /***================================================================***/ -int SearchDictName(dictP,keyP) - psdict *dictP; - psobj *keyP; +int +SearchDictName(psdict *dictP, psobj *keyP) { int i,n; @@ -73,15 +121,68 @@ int SearchDictName(dictP,keyP) } return(0); } + +#ifdef BUILDCID +static boolean +initCIDFont(int cnt) +{ + if (!(vm_init(cnt))) return(FALSE); + vm_base = vm_next_byte(); + strcpy(CurCIDFontName, ""); /* initialize to none */ + strcpy(CurCMapName, ""); /* initialize to none */ + /* cause a font data reset on the next Type 1 font */ + strcpy(CurFontName, ""); /* initialize to none */ + CIDFontP = &TheCurrentCIDFont; + CMapP = &TheCurrentCMap; + CIDFontP->vm_start = vm_next_byte(); + CIDFontP->spacerangecnt = 0; + CIDFontP->notdefrangecnt = 0; + CIDFontP->cidrangecnt = 0; + CIDFontP->spacerangeP = NULL; + CIDFontP->notdefrangeP = NULL; + CIDFontP->cidrangeP = NULL; + CIDFontP->CIDFontFileName.len = 0; + CIDFontP->CIDFontFileName.data.valueP = CurCIDFontName; + CMapP->CMapFileName.len = 0; + CMapP->CMapFileName.data.valueP = CurCMapName; + CMapP->firstRow = 0xFFFF; + CMapP->firstCol = 0xFFFF; + CMapP->lastRow = 0; + CMapP->lastCol = 0; + return(TRUE); +} + /***================================================================***/ -boolean initFont(cnt) -int cnt; +boolean +initCIDType1Font(void) +{ + strcpy(CurFontName, ""); /* initialize to none */ + FontP = &FDArrayP[FDArrayIndex]; + FontP->vm_start = vm_next_byte(); + FontP->FontFileName.len = 0; + FontP->FontFileName.data.valueP = CurFontName; + FontP->Subrs.len = 0; + FontP->Subrs.data.stringP = NULL; + FontP->CharStringsP = NULL; + FontP->Private = NULL; + FontP->fontInfoP = NULL; + FontP->BluesP = NULL; + return(TRUE); +} +#endif + +boolean +initFont(int cnt) { if (!(vm_init(cnt))) return(FALSE); vm_base = vm_next_byte(); if (!(Init_BuiltInEncoding())) return(FALSE); strcpy(CurFontName, ""); /* iniitialize to none */ +#ifdef BUILDCID + /* cause a font data reset on the next CID-keyed font */ + strcpy(CurCIDFontName, ""); /* initialize to none */ +#endif FontP = &TheCurrentFont; FontP->vm_start = vm_next_byte(); FontP->FontFileName.len = 0; @@ -89,8 +190,53 @@ int cnt; return(TRUE); } /***================================================================***/ -static void resetFont(env) - char *env; +#ifdef BUILDCID +static void +resetCIDFont(char *cidfontname, char *cmapfile) +{ + + vm_next = CIDFontP->vm_start; + vm_free = vm_size - ( vm_next - vm_base); + CIDFontP->spacerangecnt = 0; + CIDFontP->notdefrangecnt = 0; + CIDFontP->cidrangecnt = 0; + CIDFontP->spacerangeP = NULL; + CIDFontP->notdefrangeP = NULL; + CIDFontP->cidrangeP = NULL; + CIDFontP->CIDfontInfoP = NULL; + /* This will load the font into the FontP */ + strcpy(CurCIDFontName,cidfontname); + strcpy(CurCMapName,cmapfile); + CIDFontP->CIDFontFileName.len = strlen(CurCIDFontName); + CIDFontP->CIDFontFileName.data.valueP = CurCIDFontName; + CMapP->CMapFileName.len = strlen(CurCMapName); + CMapP->CMapFileName.data.valueP = CurCMapName; + CMapP->firstRow = 0xFFFF; + CMapP->firstCol = 0xFFFF; + CMapP->lastRow = 0; + CMapP->lastCol = 0; +} + +static void +resetCIDType1Font(void) +{ + + vm_next = FontP->vm_start; + vm_free = vm_size - ( vm_next - vm_base); + FontP->Subrs.len = 0; + FontP->Subrs.data.stringP = NULL; + FontP->CharStringsP = NULL; + FontP->Private = NULL; + FontP->fontInfoP = NULL; + FontP->BluesP = NULL; + /* This will load the font into the FontP */ + FontP->FontFileName.len = strlen(CurFontName); + FontP->FontFileName.data.valueP = CurFontName; +} +#endif + +static void +resetFont(char *env) { vm_next = FontP->vm_start; @@ -107,9 +253,55 @@ static void resetFont(env) FontP->FontFileName.data.valueP = CurFontName; } + +#ifdef BUILDCID /***================================================================***/ -int readFont(env) -char *env; +int +readCIDFont(char *cidfontname, char *cmapfile) +{ + int rcode; + + /* restore the virtual memory and eliminate old font */ + resetCIDFont(cidfontname, cmapfile); + /* This will load the font into the FontP */ + rcode = scan_cidfont(CIDFontP, CMapP); + if (rcode == SCAN_OUT_OF_MEMORY) { + /* free the memory and start again */ + if (!(initCIDFont(vm_size * 2))) { + /* we are really out of memory */ + return(SCAN_OUT_OF_MEMORY); + } + resetCIDFont(cidfontname, cmapfile); + rcode = scan_cidfont(CIDFontP, CMapP); + /* only double the memory twice, then report error */ + if (rcode == SCAN_OUT_OF_MEMORY) { + /* free the memory and start again */ + if (!(initCIDFont(vm_size * 2))) { + /* we are really out of memory */ + return(SCAN_OUT_OF_MEMORY); + } + resetCIDFont(cidfontname, cmapfile); + rcode = scan_cidfont(CIDFontP, CMapP); + } + } + return(rcode); +} + +int +readCIDType1Font(void) +{ + int rcode; + + resetCIDType1Font(); + + /* This will load the font into the FontP */ + rcode = scan_cidtype1font(FontP); + return(rcode); +} +#endif + +int +readFont(char *env) { int rcode; @@ -119,26 +311,39 @@ char *env; rcode = scan_font(FontP); if (rcode == SCAN_OUT_OF_MEMORY) { /* free the memory and start again */ +#ifdef BUILDCID + /* xfree(vm_base); */ +#else xfree(vm_base); +#endif if (!(initFont(vm_size * 2))) { /* we are really out of memory */ return(SCAN_OUT_OF_MEMORY); } resetFont(env); rcode = scan_font(FontP); +#ifdef BUILDCID + /* only double the memory twice, then report error */ + if (rcode == SCAN_OUT_OF_MEMORY) { + /* free the memory and start again */ + /* xfree(vm_base) */ + if (!(initFont(vm_size * 2))) { + /* we are really out of memory */ + return(SCAN_OUT_OF_MEMORY); + } + resetFont(env); + rcode = scan_font(FontP); + } +#else /* only double the memory once, then report error */ +#endif } return(rcode); } /***================================================================***/ -xobject fontfcnB(S,code,lenP,mode) -XYspace S; -unsigned char *code; -int *lenP; -int *mode; +struct xobject * +fontfcnB(struct XYspace *S, unsigned char *code, int *lenP, int *mode) { - path updateWidth(); - psobj *charnameP; /* points to psobj that is name of character*/ int N; psdict *CharStringsDictP; /* dictionary with char strings */ @@ -146,7 +351,7 @@ int *mode; psobj *SubrsArrayP; psobj *theStringP; - path charpath; /* the path for this character */ + struct xobject *charpath; /* the path for this character */ charnameP = &CodeName; charnameP->len = *lenP; @@ -168,16 +373,87 @@ int *mode; SubrsArrayP = &(FontP->Subrs); /* scale the Adobe fonts to 1 unit high */ /* call the type 1 routine to rasterize the character */ - charpath = Type1Char(FontP,S,theStringP,SubrsArrayP,NULL, + charpath = (struct xobject *)Type1Char((char *)FontP,S,theStringP, + SubrsArrayP,NULL, FontP->BluesP , mode); /* if Type1Char reported an error, then return */ if ( *mode == FF_PARSE_ERROR) return(NULL); /* fill with winding rule unless path was requested */ if (*mode != FF_PATH) { - charpath = Interior(charpath,WINDINGRULE+CONTINUITY); + charpath = (struct xobject *)Interior((struct segment *)charpath, + WINDINGRULE+CONTINUITY); } return(charpath); } + +#ifdef BUILDCID +/***================================================================***/ +/* CIDfontfcnA(cidfontname, cmapfile, mode) */ +/* */ +/* 1) initialize the font - global indicates it has been done */ +/* 2) load the font */ +/***================================================================***/ +Bool +CIDfontfcnA(char *cidfontname, char *cmapfile, int *mode) +{ + int rcode, cidinit; + + cidinit = 0; + if (CIDFontP == NULL || strcmp(CurCIDFontName, "") == 0) { + InitImager(); + if (!(initCIDFont(VM_SIZE))) { + /* we are really out of memory */ + *mode = SCAN_OUT_OF_MEMORY; + return(FALSE); + } + cidinit = 1; + } + + /* if the cidfontname is null, then use font already loaded */ + + /* if not the same font name */ + if (cidinit || (cidfontname && strcmp(cidfontname,CurCIDFontName) != 0) || + (cmapfile && strcmp(cmapfile,CurCMapName) != 0)) { + /* restore the virtual memory and eliminate old font, read new one */ + rcode = readCIDFont(cidfontname, cmapfile); + if (rcode != 0 ) { + strcpy(CurCIDFontName, ""); /* no CIDFont loaded */ + strcpy(CurCMapName, ""); /* no CMap loaded */ + *mode = rcode; + return(FALSE); + } + } + return(TRUE); + +} + +/***================================================================***/ +/* CIDType1fontfcnA(mode) */ +/* */ +/* 1) initialize the font - global indicates it has been done */ +/* 2) load the font */ +/***================================================================***/ +Bool +CIDType1fontfcnA(int *mode) +{ + int rcode; + + if (!(initCIDType1Font())) { + /* we are really out of memory */ + *mode = SCAN_OUT_OF_MEMORY; + return(FALSE); + } + + if ((rcode = readCIDType1Font()) != 0) { + strcpy(CurFontName, ""); /* no font loaded */ + *mode = rcode; + return(FALSE); + } + return(TRUE); + +} +#endif + /***================================================================***/ /* fontfcnA(env, mode) */ /* */ @@ -186,15 +462,18 @@ int *mode; /* 1) initialize the font - global indicates it has been done */ /* 2) load the font */ /***================================================================***/ -Bool fontfcnA(env,mode) -char *env; -int *mode; +Bool +fontfcnA(char *env, int *mode) { int rc; /* Has the FontP initialized? If not, then */ /* Initialize */ +#ifdef BUILDCID + if (FontP == NULL || strcmp(CurFontName, "") == 0) { +#else if (FontP == NULL) { +#endif InitImager(); if (!(initFont(VM_SIZE))) { /* we are really out of memory */ @@ -218,6 +497,101 @@ int *mode; return(TRUE); } + +#ifdef BUILDCID +/***================================================================***/ +/* CIDQueryFontLib(cidfontname,cmapfile,infoName,infoValue,rcodeP) */ +/* */ +/* cidfontname is a pointer to a string that contains the fontname. */ +/* */ +/* 1) initialize the font - global indicates it has been done */ +/* 2) load the font */ +/* 3) use the font to call getInfo for that value. */ +/***================================================================***/ + +void +CIDQueryFontLib(char *cidfontname, char *cmapfile, char *infoName, + pointer infoValue, /* parameter returned here */ + int *rcodeP) +{ + int rc,N,i,cidinit; + psdict *dictP; + psobj nameObj; + psobj *valueP; + + /* Has the CIDFontP initialized? If not, then */ + /* Initialize */ + cidinit = 0; + if (CIDFontP == NULL || strcmp(CurCIDFontName, "") == 0) { + InitImager(); + if (!(initCIDFont(VM_SIZE))) { + *rcodeP = 1; + return; + } + cidinit = 1; + } + /* if the file name is null, then use font already loaded */ + /* if the not same font name, reset and load next font */ + if (cidinit || (cidfontname && strcmp(cidfontname,CurCIDFontName) != 0) || + (cmapfile && strcmp(cmapfile,CurCMapName) != 0)) { + /* restore the virtual memory and eliminate old font */ + rc = readCIDFont(cidfontname, cmapfile); + if (rc != 0 ) { + strcpy(CurCIDFontName, ""); /* no font loaded */ + strcpy(CurCMapName, ""); /* no font loaded */ + *rcodeP = 1; + return; + } + } + dictP = CIDFontP->CIDfontInfoP; + objFormatName(&nameObj,strlen(infoName),infoName); + N = SearchDictName(dictP,&nameObj); + /* if found */ + if ( N > 0 ) { + *rcodeP = 0; + switch (dictP[N].value.type) { + case OBJ_ARRAY: + valueP = dictP[N].value.data.arrayP; + /* Just double check valueP. H.J. */ + if (valueP == NULL) break; + if (strcmp(infoName,"FontMatrix") == 0) { + /* 6 elments, return them as floats */ + for (i=0;i<6;i++) { + if (valueP->type == OBJ_INTEGER ) + ((float *)infoValue)[i] = valueP->data.integer; + else + ((float *)infoValue)[i] = valueP->data.real; + valueP++; + } + } + if (strcmp(infoName,"FontBBox") == 0) { + /* 4 elments for Bounding Box. all integers */ + for (i=0;i<4;i++) { + ((int *)infoValue)[i] = valueP->data.integer; + valueP++; + } + break; + case OBJ_INTEGER: + case OBJ_BOOLEAN: + *((int *)infoValue) = dictP[N].value.data.integer; + break; + case OBJ_REAL: + *((float *)infoValue) = dictP[N].value.data.real; + break; + case OBJ_NAME: + case OBJ_STRING: + *((char **)infoValue) = dictP[N].value.data.valueP; + break; + default: + *rcodeP = 1; + break; + } + } + } + else *rcodeP = 1; +} +#endif + /***================================================================***/ /* QueryFontLib(env, infoName,infoValue,rcodeP) */ /* */ @@ -228,11 +602,10 @@ int *mode; /* 3) use the font to call getInfo for that value. */ /***================================================================***/ -void QueryFontLib(env,infoName,infoValue,rcodeP) -char *env; -char *infoName; -pointer infoValue; /* parameter returned here */ -int *rcodeP; +void +QueryFontLib(char *env, char *infoName, + pointer infoValue, /* parameter returned here */ + int *rcodeP) { int rc,N,i; psdict *dictP; @@ -268,8 +641,8 @@ int *rcodeP; switch (dictP[N].value.type) { case OBJ_ARRAY: valueP = dictP[N].value.data.arrayP; - /* don't dereference a NULL pointer, in the case of a bad font file */ - if (valueP == NULL) break; + /* Just double check valueP. H.J. */ + if (valueP == NULL) break; if (strcmp(infoName,"FontMatrix") == 0) { /* 6 elments, return them as floats */ for (i=0;i<6;i++) { @@ -306,3 +679,24 @@ int *rcodeP; } else *rcodeP = 1; } + +#ifdef BUILDCID +struct xobject * +CIDfontfcnC(struct XYspace *S, psobj *theStringP, + psobj *SubrsArrayP, struct blues_struct *BluesP, + int *lenP, int *mode) +{ + struct xobject *charpath; /* the path for this character */ + + charpath = (struct xobject *)CIDChar((char *)FontP,S,theStringP, + SubrsArrayP,NULL,BluesP,mode); + /* if Type1Char reported an error, then return */ + if ( *mode == FF_PARSE_ERROR) return(NULL); + /* fill with winding rule unless path was requested */ + if (*mode != FF_PATH) { + charpath = (struct xobject *)Interior((struct segment *)charpath, + WINDINGRULE+CONTINUITY); + } + return(charpath); +} +#endif diff --git a/src/Type1/fontfcn.h b/src/Type1/fontfcn.h index cbf23a1..9383e42 100644 --- a/src/Type1/fontfcn.h +++ b/src/Type1/fontfcn.h @@ -27,6 +27,53 @@ * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS * SOFTWARE. */ +/* Copyright (c) 1994-1999 Silicon Graphics, Inc. All Rights Reserved. + * + * The contents of this file are subject to the CID Font Code Public Licence + * Version 1.0 (the "License"). You may not use this file except in compliance + * with the Licence. You may obtain a copy of the License at Silicon Graphics, + * Inc., attn: Legal Services, 2011 N. Shoreline Blvd., Mountain View, CA + * 94043 or at http://www.sgi.com/software/opensource/cid/license.html. + * + * Software distributed under the License is distributed on an "AS IS" basis. + * ALL WARRANTIES ARE DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED + * WARRANTIES OF MERCHANTABILITY, OF FITNESS FOR A PARTICULAR PURPOSE OR OF + * NON-INFRINGEMENT. See the License for the specific language governing + * rights and limitations under the License. + * + * The Original Software is CID font code that was developed by Silicon + * Graphics, Inc. + */ +/* $XFree86: xc/lib/font/Type1/fontfcn.h,v 1.5 2001/01/17 19:43:22 dawes Exp $ */ + + +#ifdef BUILDCID +/* Definition of a PostScript CIDFont resource */ +typedef struct cid_font { + char *vm_start; + int spacerangecnt; + int notdefrangecnt; + int cidrangecnt; + spacerange *spacerangeP; + cidrange *notdefrangeP; + cidrange *cidrangeP; + int binarydata; /* 1=binary data, 0=hex data */ + long bytecnt; + psobj CIDFontFileName; + psdict *CIDfontInfoP; +} cidfont; + +/* Definition of a PostScript CMap resource */ +typedef struct cmap_res { + unsigned short firstCol; + unsigned short lastCol; + unsigned short firstRow; + unsigned short lastRow; + psobj CMapFileName; + psdict *CMapInfoP; +} cmapres; +#endif + /* Definition of a PostScript FONT */ typedef struct ps_font { char *vm_start; @@ -40,10 +87,13 @@ struct blues_struct *BluesP; /***================================================================***/ /* Routines in scan_font */ /***================================================================***/ - -extern boolean Init_StdEnc(); -extern int scan_font(); -extern int GetFontInfo(); + +extern boolean Init_BuiltInEncoding ( void ); +#ifdef BUILDCID +extern int scan_cidfont ( cidfont *CIDFontP, cmapres *CMapP ); +extern int scan_cidtype1font ( psfont *FontP ); +#endif +extern int scan_font ( psfont *FontP ); /***================================================================***/ /* Return codes from scan_font */ /***================================================================***/ @@ -55,7 +105,43 @@ extern int GetFontInfo(); #define SCAN_TRUE -5 #define SCAN_FALSE -6 #define SCAN_END -7 - + +#ifdef BUILDCID +/***================================================================***/ +/* Name of CID FontInfo fields */ +/***================================================================***/ +#define CIDCOUNT 1 +#define CIDFONTNAME 2 +#define CIDFONTTYPE 3 +#define CIDVERSION 4 +#define CIDREGISTRY 5 +#define CIDORDERING 6 +#define CIDSUPPLEMENT 7 +#define CIDMAPOFFSET 8 +#define CIDFDARRAY 9 +#define CIDFDBYTES 10 +#define CIDFONTBBOX 11 +#define CIDFULLNAME 12 +#define CIDFAMILYNAME 13 +#define CIDWEIGHT 14 +#define CIDNOTICE 15 +#define CIDGDBYTES 16 +#define CIDUIDBASE 17 +#define CIDXUID 18 + +/***================================================================***/ +/* Name of CMapInfo fields */ +/***================================================================***/ +#define CMAPREGISTRY 1 +#define CMAPORDERING 2 +#define CMAPSUPPLEMENT 3 +#define CMAPNAME 4 +#define CMAPVERSION 5 +#define CMAPTYPE 6 +#define CMAPWMODE 7 +#define CMAPCIDCOUNT 8 +#endif + /***================================================================***/ /* Name of FontInfo fields */ /***================================================================***/ @@ -96,3 +182,60 @@ extern int GetFontInfo(); #define LENIV 14 #define RNDSTEMUP 15 #define EXPANSIONFACTOR 16 + +#ifdef BUILDCID +/***================================================================***/ +/* Name of CID Type 1 Private values */ +/***================================================================***/ +#define CIDT1MINFEATURE 1 +#define CIDT1LENIV 2 +#define CIDT1LANGGROUP 3 +#define CIDT1BLUEVALUES 4 +#define CIDT1OTHERBLUES 5 +#define CIDT1BLUESCALE 6 +#define CIDT1BLUEFUZZ 7 +#define CIDT1BLUESHIFT 8 +#define CIDT1FAMBLUES 9 +#define CIDT1FAMOTHERBLUES 10 +#define CIDT1STDHW 11 +#define CIDT1STDVW 12 +#define CIDT1STEMSNAPH 13 +#define CIDT1STEMSNAPV 14 +#define CIDT1SUBMAPOFF 15 +#define CIDT1SDBYTES 16 +#define CIDT1SUBRCNT 17 +#define CIDT1FORCEBOLD 18 +#define CIDT1RNDSTEMUP 19 +#define CIDT1EXPFACTOR 20 + +#define CID_BITMAP_UNDEFINED 0 +extern int SearchDictName ( psdict *dictP, psobj *keyP ); +#ifdef BUILDCID +extern boolean initCIDType1Font ( void ); +#endif +extern boolean initFont ( int cnt ); +#ifdef BUILDCID +extern int readCIDFont ( char *cidfontname, char *cmapfile ); +extern int readCIDType1Font ( void ); +#endif +extern int readFont ( char *env ); +extern struct xobject *fontfcnB ( struct XYspace *S, unsigned char *code, + int *lenP, int *mode ); +#ifdef BUILDCID +extern Bool CIDfontfcnA ( char *cidfontname, char *cmapfile, int *mode ); +extern Bool CIDType1fontfcnA ( int *mode ); +#endif +extern Bool fontfcnA ( char *env, int *mode ); +#ifdef BUILDCID +extern void CIDQueryFontLib ( char *cidfontname, char *cmapfile, + char *infoName, pointer infoValue, int *rcodeP ); +#endif +extern void QueryFontLib ( char *env, char *infoName, pointer infoValue, + int *rcodeP ); +#ifdef BUILDCID +extern struct xobject *CIDfontfcnC ( struct XYspace *S, psobj *theStringP, + psobj *SubrsArrayP, + struct blues_struct *BluesP, int *lenP, + int *mode ); +#endif +#endif diff --git a/src/Type1/hints.c b/src/Type1/hints.c index c3db5a4..5150647 100644 --- a/src/Type1/hints.c +++ b/src/Type1/hints.c @@ -26,6 +26,8 @@ * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF * THIS SOFTWARE. */ +/* $XFree86: xc/lib/font/Type1/hints.c,v 1.7 2002/02/18 20:51:57 herrb Exp $ */ + /* HINTS CWEB V0006 ******** */ /* :h1.HINTS Module - Processing Rasterization Hints @@ -39,12 +41,13 @@ W. Pryor, Jr. The included files are: */ +#include "os.h" #include "objects.h" #include "spaces.h" #include "paths.h" #include "regions.h" #include "hints.h" - + /* :h3.Functions Provided to the TYPE1IMAGER User @@ -81,7 +84,8 @@ static struct { #define FPFLOOR(fp) TOFRACTPEL((fp) >> FRACTBITS) #define FPROUND(fp) FPFLOOR((fp) + FPHALF) -void InitHints() +void +InitHints(void) { int i; @@ -96,8 +100,8 @@ void InitHints() :h3.CloseHints(hintP) - Reverse hints that are still open */ -void CloseHints(hintP) - struct fractpoint *hintP; +void +CloseHints(struct fractpoint *hintP) { int i; @@ -120,10 +124,10 @@ void CloseHints(hintP) :h3.ComputeHint(hP, currX, currY, hintP) - Compute the value of a hint */ -static void ComputeHint(hP, currX, currY, hintP) - struct hintsegment *hP; - fractpel currX, currY; - struct fractpoint *hintP; +static void +ComputeHint(struct hintsegment *hP, + fractpel currX, fractpel currY, + struct fractpoint *hintP) { fractpel currRef, currWidth; int idealWidth; @@ -166,7 +170,7 @@ multiple of 90 degrees. } else /* error */ { - abort("ComputeHint: invalid orientation"); + Abort("ComputeHint: invalid orientation"); } IfTrace4((HintDebug > 1), @@ -200,7 +204,7 @@ multiple of 90 degrees. } else /* error */ { - abort("ComputeHint: invalid hinttype"); + Abort("ComputeHint: invalid hinttype"); } IfTrace1((HintDebug > 1)," hintValue=%p", hintValue); @@ -217,7 +221,7 @@ multiple of 90 degrees. } else /* error */ { - abort("ComputeHint: invalid orientation"); + Abort("ComputeHint: invalid orientation"); } } @@ -225,10 +229,10 @@ multiple of 90 degrees. :h3.ProcessHint(hP, currX, currY, hintP) - Process a rasterization hint */ -void ProcessHint(hP, currX, currY, hintP) - struct hintsegment *hP; - fractpel currX, currY; - struct fractpoint *hintP; +void +ProcessHint(struct hintsegment *hP, + fractpel currX, fractpel currY, + struct fractpoint *hintP) { struct fractpoint thisHint; @@ -266,7 +270,7 @@ void ProcessHint(hP, currX, currY, hintP) } else /* error */ { - abort("ProcessHint: invalid label"); + Abort("ProcessHint: invalid label"); } } else if (hP->adjusttype == 'r') /* Reverse */ @@ -282,18 +286,18 @@ void ProcessHint(hP, currX, currY, hintP) } else /* error */ { - abort("ProcessHint: label is not in use"); + Abort("ProcessHint: label is not in use"); } } else /* error */ { - abort("ProcessHint: invalid label"); + Abort("ProcessHint: invalid label"); } } else /* error */ { - abort("ProcessHint: invalid adjusttype"); + Abort("ProcessHint: invalid adjusttype"); } IfTrace3((HintDebug > 1)," label=%d, thisHint=(%p,%p)\n", hP->label, thisHint.x, thisHint.y); @@ -362,9 +366,9 @@ off of the edge's range; XofY() could be replace by FindXofY() to call ourselves recursively if this were not true. */ -static pel SearchXofY(edge, y) - register struct edgelist *edge; /* represents edge */ - register pel y; /* 'y' value to find edge for */ +static pel +SearchXofY(register struct edgelist *edge, /* represents edge */ + register pel y) /* 'y' value to find edge for */ { register struct edgelist *e; /* loop variable */ @@ -385,7 +389,7 @@ static pel SearchXofY(edge, y) else return(XofY(edge, y)); - abort("bad subpath chain"); + Abort("bad subpath chain"); /*NOTREACHED*/ } /* @@ -413,9 +417,10 @@ are at the top and the first edge is going up. #define BLACKBELOW +1 #define NONE 0 -static int ImpliedHorizontalLine(e1, e2, y) - register struct edgelist *e1,*e2; /* two edges to check */ - register int y; /* y where they might be connected */ +static int +ImpliedHorizontalLine(struct edgelist *e1, /* two edges to check */ + struct edgelist *e2, + int y) /* y where they might be connected */ { register struct edgelist *e3,*e4; @@ -466,7 +471,7 @@ Now we have everything to return the answer: else if (ISBOTTOM(e1->flag) && y == e1->ymax) return(!ISDOWN(e2->flag)); else - abort("ImpliedHorizontalLine: why ask?"); + Abort("ImpliedHorizontalLine: why ask?"); /*NOTREACHED*/ } @@ -483,14 +488,14 @@ routine finds and fixes false breaks. Also, this routine sets the ISTOP and ISBOTTOM flags in the edge lists. */ -static void FixSubPaths(R) - register struct region *R; /* anchor of region */ +static void +FixSubPaths(struct region *R) /* anchor of region */ { register struct edgelist *e; /* fast loop variable */ register struct edgelist *edge; /* current edge in region */ register struct edgelist *next; /* next in subpath after 'edge' */ register struct edgelist *break1; /* first break after 'next' */ - register struct edgelist *break2; /* last break before 'edge' */ + register struct edgelist *break2 = NULL; /* last break before 'edge' */ register struct edgelist *prev; /* previous edge for fixing links */ int left = TRUE; @@ -505,7 +510,7 @@ static void FixSubPaths(R) if (!ISBREAK(edge, next)) continue; if (edge->ymax < next->ymin) - abort("disjoint subpath?"); + Abort("disjoint subpath?"); /* 'edge' now contains an edgelist at the bottom of an edge, and 'next' contains the next subsequent edgelist in the subpath, which must be at @@ -566,7 +571,7 @@ as 'next': break1->subpath = break2->subpath; if (ISBREAK(break1, break1->subpath)) - abort("unable to fix subpath break?"); + Abort("unable to fix subpath break?"); break2->subpath = next; @@ -626,10 +631,10 @@ get all the way to the outside without resolving ambiguity. A debug tool. */ -static struct edgelist *before(); /* subroutine of DumpSubPaths */ +static struct edgelist *before(struct edgelist *e); /* subroutine of DumpSubPaths */ -static void DumpSubPaths(anchor) - struct edgelist *anchor; +static void +DumpSubPaths(struct edgelist *anchor) { register struct edgelist *edge,*e,*e2; @@ -672,8 +677,8 @@ static void DumpSubPaths(anchor) } } -static struct edgelist *before(e) - struct edgelist *e; +static struct edgelist * +before(struct edgelist *e) { struct edgelist *r; for (r = e->subpath; r->subpath != e; r = r->subpath) { ; } @@ -705,10 +710,10 @@ new x might exceed the region's bounds, updating those are the responsibility of the caller. */ -static void writeXofY(e, y, x) - struct edgelist *e; /* relevant edgelist */ - int y; /* y value */ - int x; /* new x value */ +static void +writeXofY(struct edgelist *e,/* relevant edgelist */ + int y, /* y value */ + int x) /* new x value */ { if (e->xmin > x) e->xmin = x; if (e->xmax < x) e->xmax = x; @@ -739,12 +744,12 @@ points (collapses) the white run as necessary if it is not. The goal is to collapse the white run as little as possible. */ -static void CollapseWhiteRun(anchor, yblack, left, right, ywhite) - struct edgelist *anchor; /* anchor of edge list */ - pel yblack; /* y of (hopefully) black run above or below */ - struct edgelist *left; /* edgelist at left of WHITE run */ - struct edgelist *right; /* edgelist at right of WHITE run */ - pel ywhite; /* y location of white run */ +static void +CollapseWhiteRun(struct edgelist *anchor, /* anchor of edge list */ + pel yblack, /* y of (hopefully) black run above or below */ + struct edgelist *left, /* edgelist at left of WHITE run */ + struct edgelist *right, /* edgelist at right of WHITE run */ + pel ywhite) /* y location of white run */ { struct edgelist *edge; struct edgelist *swathstart = anchor; @@ -810,8 +815,8 @@ This is the externally visible routine called from the REGIONS module when the +CONTINUITY flag is on the Interior() fill rule. */ -void ApplyContinuity(R) -struct region *R; +void +ApplyContinuity(struct region *R) { struct edgelist *left; struct edgelist *right; diff --git a/src/Type1/hints.h b/src/Type1/hints.h index 79ef326..d5bb829 100644 --- a/src/Type1/hints.h +++ b/src/Type1/hints.h @@ -26,17 +26,23 @@ * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF * THIS SOFTWARE. */ +/* $XFree86: xc/lib/font/Type1/hints.h,v 1.4 2001/01/17 19:43:22 dawes Exp $ */ + /*SHARED*/ -#define InitHints() t1_InitHints() -void t1_InitHints(); /* Initialize hint data structure */ +#define InitHints t1_InitHints +extern void t1_InitHints ( void ); /* Initialize hint data structure */ #define CloseHints(hintP) t1_CloseHints(hintP) -void t1_CloseHints(); /* Reverse hints that are still open */ +/* Reverse hints that are still open */ +extern void t1_CloseHints ( struct fractpoint *hintP ); #define ProcessHint(hP, currX, currY, hintP) t1_ProcessHint(hP, currX, currY, hintP) -void t1_ProcessHint(); /* Process a rasterization hint */ - +/* Process a rasterization hint */ +extern void t1_ProcessHint ( struct hintsegment *hP, fractpel currX, fractpel currY, struct fractpoint *hintP ); + #define ApplyContinuity(R) t1_ApplyContinuity(R) -void t1_ApplyContinuity(); /* fix false connection breaks in a region */ +/* fix false connection breaks in a region */ +extern void t1_ApplyContinuity ( struct region *R ); + /*END SHARED*/ diff --git a/src/Type1/lines.c b/src/Type1/lines.c index 3afcfc1..dec3f08 100644 --- a/src/Type1/lines.c +++ b/src/Type1/lines.c @@ -26,6 +26,8 @@ * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF * THIS SOFTWARE. */ +/* $XFree86: xc/lib/font/Type1/lines.c,v 1.4 2001/01/17 19:43:22 dawes Exp $ */ + /* LINES CWEB V0003 ******** */ /* :h1.LINES Module - Rasterizing Lines @@ -40,6 +42,7 @@ The included files are: #include "objects.h" #include "spaces.h" +#include "paths.h" #include "regions.h" #include "lines.h" diff --git a/src/Type1/lines.h b/src/Type1/lines.h index 8e2cc74..c0d7392 100644 --- a/src/Type1/lines.h +++ b/src/Type1/lines.h @@ -26,12 +26,14 @@ * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF * THIS SOFTWARE. */ +/* $XFree86: xc/lib/font/Type1/lines.h,v 1.4 2001/01/17 19:43:22 dawes Exp $ */ + /*SHARED*/ #define StepLine(R,x1,y1,x2,y2) t1_StepLine(R,x1,y1,x2,y2) #define Bresenham(e,x1,y1,x2,y2) t1_Bresenham(e,x1,y1,x2,y2) -void t1_StepLine(); /* check for special conditions, call Bresenham */ -void t1_Bresenham(); /* produce run ends for lines */ +extern void t1_StepLine ( struct region *R, fractpel x1, fractpel y1, fractpel x2, fractpel y2 ); +extern void t1_Bresenham ( pel *edgeP, fractpel x1, fractpel y1, fractpel x2, fractpel y2 ); /*END SHARED*/ diff --git a/src/Type1/objects.c b/src/Type1/objects.c index 438e859..57168b4 100644 --- a/src/Type1/objects.c +++ b/src/Type1/objects.c @@ -26,6 +26,7 @@ * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF * THIS SOFTWARE. */ +/* $XFree86: xc/lib/font/Type1/objects.c,v 1.10 2002/02/18 20:51:57 herrb Exp $ */ /* OBJECTS CWEB V0025 ******** */ /* :h1.OBJECTS Module - TYPE1IMAGER Objects Common Routines @@ -53,8 +54,17 @@ system it is a pretty safe bet that these are external entry points and you do do not need to include these header files. */ +#ifndef FONTMODULE #include <string.h> #include <ctype.h> +#include <stdarg.h> +#include "os.h" +#else +#include "Xdefs.h" /* Bool declaration */ +#include "Xmd.h" /* INT32 declaration */ +#include "os.h" +#include "xf86_ansic.h" +#endif /* override incorrect system functions; for example you might define @@ -72,7 +82,9 @@ a macro for "strcpy" that diverts it to "my_strcpy". #include "pictures.h" #include "strokes.h" #include "cluts.h" -static char *TypeFmt(); + + +static char *TypeFmt(int type); /* :h3.The "pointer" Macro - Define a Generic Pointer @@ -280,13 +292,12 @@ set to 1. So, a nun-NULL template must also have a "references" field. PNM 3-26-91 */ -struct xobject *t1_Allocate(size, template, extra) /* non-ANSI; type checking was too strict */ - register int size; /* number of bytes to allocate & initialize */ - register struct xobject *template; /* example structure to allocate */ - register int extra; /* any extra uninitialized bytes needed contiguously */ +struct xobject * +t1_Allocate(int size, /* number of bytes to allocate & initialize */ + pointer ptr, /* example structure to allocate */ + int extra) /* any extra uninitialized bytes needed contiguously */ { - extern char *xiMalloc(); /* standard C routine */ - + register struct xobject *template = (struct xobject *)ptr; register struct xobject *r; /* @@ -295,14 +306,14 @@ struct xobject *t1_Allocate(size, template, extra) /* non-ANSI; type checking w size = (size + sizeof(long) - 1) & -(int)sizeof(long); extra = (extra + sizeof(long) - 1) & -(int)sizeof(long); if (size + extra <= 0) - abort("Non-positive allocate?"); + Abort("Non-positive allocate?"); r = (struct xobject *) xiMalloc(size + extra); while (r == NULL) { if (!GimeSpace()) { IfTrace1(TRUE, "malloc attempted %d bytes.\n", size + extra); - abort("We have REALLY run out of memory"); + Abort("We have REALLY run out of memory"); } r = (struct xobject *) xiMalloc(size + extra); } @@ -349,11 +360,13 @@ In either case, the object must not be the NULL pointer. This preserves portability, as the C system xiFree() will not always accept NULL. */ -void Free(obj) /* non-ANSI to avoid overly strict type checking */ - register struct xobject *obj; /* structure to free */ +void +Free(pointer objPtr) { + struct xobject *obj = (struct xobject *)objPtr; /* structure to free */ + if (obj->type == INVALIDTYPE) - abort("Free of already freed object?"); + Abort("Free of already freed object?"); obj->type = INVALIDTYPE; if (MemoryDebug > 1) { @@ -362,7 +375,7 @@ void Free(obj) /* non-ANSI to avoid overly strict type checking */ IfTrace4(TRUE,"Freeing at %x: %x %x %x\n", L, L[-1], L[0], L[1]); } - xiFree(obj); + xiFree((long *)obj); } /* @@ -389,9 +402,11 @@ done is to change one of the old temporary handles to a permanent one. 3-26-91 PNM */ -struct xobject *t1_Permanent(obj) /* non-ANSI to avoid overly strict type checking */ - register struct xobject *obj; /* object to be made permanent */ +struct xobject * +t1_Permanent(pointer objPtr) { + struct xobject *obj = (struct xobject *)objPtr; /* object to be made permanent */ + IfTrace1((MustTraceCalls),"Permanent(%z)\n", obj); if ( (obj != NULL) && ( !(ISPERMANENT(obj->flag)) ) ) @@ -415,6 +430,7 @@ struct xobject *t1_Permanent(obj) /* non-ANSI to avoid overly strict type checki return(obj); } +#ifdef notused /* :h3.Temporary() - Undoes the Effect of "Permanent()" @@ -433,9 +449,11 @@ lost a permanent handle and gained a temporary one. PNM 3-2-6-91 */ -struct xobject *xiTemporary(obj) /* non-ANSI to avoid overly strict type checking */ - register struct xobject *obj; /* object to be made permanent */ +struct xobject * +xiTemporary(pointer objPtr) { + register struct xobject *obj + = (struct xobject *)objPtr; /* object to be made permanent */ IfTrace1((MustTraceCalls),"Temporary(%z)\n", obj); if (obj != NULL) { @@ -467,7 +485,8 @@ struct xobject *xiTemporary(obj) /* non-ANSI to avoid overly strict type checkin } return(obj); } - +#endif /* notused */ + /* :h3.Dup() - Duplicate an Object @@ -478,9 +497,11 @@ Note that Dup() retains the state of the permanent flag. */ -struct xobject *t1_Dup(obj) /* non-ANSI avoids overly strict type checking */ - register struct xobject *obj; /* object to be duplicated */ +struct xobject * +t1_Dup(pointer objPtr) { + register struct xobject *obj + = (struct xobject *)objPtr; /* object to be duplicated */ register char oldflag; /* copy of original object's flag byte */ IfTrace1((MustTraceCalls),"Dup(%z)\n", obj); @@ -523,22 +544,28 @@ let each module provide us a routine (or macro) that duplicates the objects it knows about. */ -struct xobject *t1_Copy(obj) - register struct xobject *obj; /* object to be Copy'ed */ +struct xobject * +t1_Copy(pointer objPtr) { + register struct xobject *obj + = (struct xobject *)objPtr; /* object to be Copy'ed */ if (obj == NULL) return(NULL); if (ISPATHTYPE(obj->type)) - obj = (struct xobject *) CopyPath(obj); + obj = (struct xobject *) CopyPath((struct segment *)obj); else switch (obj->type) { case SPACETYPE: - obj = (struct xobject *) CopySpace(obj); break; + obj = (struct xobject *) + CopySpace((struct XYspace *)obj); + break; case FONTTYPE: obj = (struct xobject *) CopyFont(obj); break; case REGIONTYPE: - obj = (struct xobject *) CopyRegion(obj); break; + obj = (struct xobject *) + CopyRegion((struct region *)obj); + break; case PICTURETYPE: obj = (struct xobject *) CopyPicture(obj); break; case LINESTYLETYPE: @@ -560,9 +587,11 @@ struct xobject *t1_Copy(obj) This can get complicated. Just like with Copy(), we let the experts handle it. */ -struct xobject *Destroy(obj) /* non-ANSI avoids overly strict type checking */ - register struct xobject *obj; /* object to be destroyed */ +struct xobject * +Destroy(pointer objPtr) { + register struct xobject *obj + = (struct xobject *)objPtr; /* object to be destroyed */ IfTrace1((MustTraceCalls),"Destroy(%z)\n", obj); if (obj == NULL) @@ -572,11 +601,11 @@ struct xobject *Destroy(obj) /* non-ANSI avoids overly strict type checking */ return(NULL); } if (ISPATHTYPE(obj->type)) - KillPath(obj); + KillPath((struct segment *)obj); else { switch (obj->type) { case REGIONTYPE: - KillRegion(obj); + KillRegion((struct region *)obj); break; case SPACETYPE: KillSpace(obj); @@ -717,9 +746,11 @@ because permanent objects, by definition, are persistent. 3-2-6-91 PNM :eol. */ -struct xobject *t1_Unique(obj) - struct xobject *obj; +struct xobject * +t1_Unique(pointer objPtr) { + struct xobject *obj = (struct xobject *)objPtr; + /* if the original object is not already unique, make a unique copy...Note also that if the object was not permanent, we must consume the old handle! 3-26-91 PNM @@ -763,16 +794,16 @@ static char *ErrorMessage = NULL; We provide a controlled way for the TYPE1IMAGER user to set and reset our debugging and tracing: */ -void Pragmatics(username, value) - char *username; /* name of the flag */ - int value; /* value to set it to */ +void +Pragmatics(char *username, /* name of the flag */ + int value) /* value to set it to */ { register char *p; /* temporary loop variable */ #define NAMESIZE 40 char name[NAMESIZE]; /* buffer to store my copy of 'username' */ if (strlen(username) >= (unsigned)NAMESIZE) - abort("Pragmatics name too large"); + Abort("Pragmatics name too large"); strcpy(name, username); for (p = name; *p != '\0'; p++) *p = toupper(*p); @@ -892,39 +923,19 @@ if it is already known that the object is temporary, it is faster to just kill it rather than consume it, for example, KillSpace(). */ -void Consume(n, obj1, obj2, obj3) /* non-ANSI avoids overly strict type checking */ - int n; - struct xobject *obj1,*obj2,*obj3; +void +Consume(int n, ...) { - switch(n) { - - case 0: - return; - - case 1: - if (obj1 != NULL && !ISPERMANENT(obj1->flag)) - Destroy(obj1); - return; - - case 2: - if (obj1 != NULL && !ISPERMANENT(obj1->flag)) - Destroy(obj1); - if (obj2 != NULL && !ISPERMANENT(obj2->flag)) - Destroy(obj2); - return; - - case 3: - if (obj1 != NULL && !ISPERMANENT(obj1->flag)) - Destroy(obj1); - if (obj2 != NULL && !ISPERMANENT(obj2->flag)) - Destroy(obj2); - if (obj3 != NULL && !ISPERMANENT(obj3->flag)) - Destroy(obj3); - return; - - default: - abort("Consume: too many objects"); - } + struct xobject *obj; + va_list ap; + + va_start(ap, n); + + while (n-- > 0) { + obj = va_arg(ap, struct xobject *); + if (obj != NULL && !ISPERMANENT(obj->flag)) + Destroy(obj); + } } /* :h4.ObjectPostMortem() - Prints as Much as We Can About a Bad Object @@ -934,10 +945,8 @@ This is a subroutine of TypeErr() and ArgErr(). /*ARGSUSED*/ static void -ObjectPostMortem(obj) /* non-ANSI avoids overly strict type checking */ - register struct xobject *obj; +ObjectPostMortem(struct xobject *obj) { - extern struct XYspace *USER; Pragmatics("Debug", 10); IfTrace2(TRUE,"Bad object is of %s type %z\n", TypeFmt(obj->type), obj); @@ -951,12 +960,14 @@ ObjectPostMortem(obj) /* non-ANSI avoids overly strict type checking */ :h3.TypeErr() - Handles "Invalid Object Type" Errors */ -struct xobject *TypeErr(name, obj, expect, ret) /* non-ANSI avoids overly strict type checking */ - char *name; /* Name of routine (for error message) */ - struct xobject *obj; /* Object in error */ - int expect; /* type expected */ - struct xobject *ret; /* object to return to caller */ +struct xobject * +TypeErr(char *name, /* Name of routine (for error message) */ + pointer objPtr, /* Object in error */ + int expect, /* type expected */ + pointer retPtr) /* object to return to caller */ { + struct xobject *obj = (struct xobject *)objPtr; + struct xobject *ret = (struct xobject *)retPtr; /* * This buffer must be large enough to hold 'name' plus * two of the largest strings that can be returned by TypeFmt. @@ -975,7 +986,7 @@ struct xobject *TypeErr(name, obj, expect, ret) /* non-ANSI avoids overly strict ObjectPostMortem(obj); if (MustCrash) - abort("Terminating because of CrashOnUserError..."); + Abort("Terminating because of CrashOnUserError..."); else ErrorMessage = typemsg; @@ -991,8 +1002,8 @@ struct xobject *TypeErr(name, obj, expect, ret) /* non-ANSI avoids overly strict This is a subroutine of TypeErr(). */ -static char *TypeFmt(type) - int type; /* type field */ +static char * +TypeFmt(int type) /* type field */ { char *r; @@ -1039,25 +1050,28 @@ is returned to the caller in case MustCrash is FALSE and ArgErr returns to its caller. */ -struct xobject *ArgErr(string, obj, ret) /* non-ANSI avoids overly strict type checking */ - char *string; /* description of error */ - struct xobject *obj; /* object, if any, that was in error */ - struct xobject *ret; /* object returned to caller or NULL */ +struct xobject * +ArgErr(char *string, /* description of error */ + pointer objPtr, /* object, if any, that was in error */ + pointer retPtr) /* object returned to caller or NULL */ { + struct xobject *obj = (struct xobject *)objPtr; + struct xobject *ret = (struct xobject *)retPtr; + if (MustCrash) LineIOTrace = TRUE; IfTrace1(TRUE,"ARGUMENT ERROR-- %s.\n", string); if (obj != NULL) ObjectPostMortem(obj); if (MustCrash) - abort("Terminating because of CrashOnUserError..."); + Abort("Terminating because of CrashOnUserError..."); else ErrorMessage = string; return(ret); } /* -:h3.abort() - Crash Due to Error +:h3.Abort() - Crash Due to Error Defined in objects.h to be FatalError(), the server's abort routine. */ @@ -1068,7 +1082,8 @@ Defined in objects.h to be FatalError(), the server's abort routine. :h4.ErrorMsg() - Return the User an Error Message */ -char *ErrorMsg() +char * +ErrorMsg(void) { register char *r; @@ -1087,7 +1102,8 @@ anyway.) Note that TYPE1IMAGER makes no assumptions about the size of an :i1/portability assumptions/ */ -void InitImager() +void +InitImager(void) { /* Check to see if we have been using our own malloc. If so,*/ @@ -1096,7 +1112,7 @@ void InitImager() /* if (sizeof(short) != 2 || sizeof(INT32) != 4) - abort("Fundamental TYPE1IMAGER assumptions invalid in this port"); + Abort("Fundamental TYPE1IMAGER assumptions invalid in this port"); */ InitSpaces(); InitFonts(); @@ -1112,14 +1128,18 @@ In some environments, constants and/or exception handling need to be This only makes sense in a server environment; true TYPE1IMAGER needs do nothing. */ -void TermImager() +void +TermImager(void) { return; } +#ifdef notused /* :h4.reportusage() - A Stub to Get a Clean Link with Portable PMP */ -void reportusage() +void +reportusage(void) { return; } +#endif diff --git a/src/Type1/objects.h b/src/Type1/objects.h index 30a9773..984ccbd 100644 --- a/src/Type1/objects.h +++ b/src/Type1/objects.h @@ -26,49 +26,119 @@ * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF * THIS SOFTWARE. */ +/* Copyright (c) 1994-1999 Silicon Graphics, Inc. All Rights Reserved. + * + * The contents of this file are subject to the CID Font Code Public Licence + * Version 1.0 (the "License"). You may not use this file except in compliance + * with the Licence. You may obtain a copy of the License at Silicon Graphics, + * Inc., attn: Legal Services, 2011 N. Shoreline Blvd., Mountain View, CA + * 94043 or at http://www.sgi.com/software/opensource/cid/license.html. + * + * Software distributed under the License is distributed on an "AS IS" basis. + * ALL WARRANTIES ARE DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED + * WARRANTIES OF MERCHANTABILITY, OF FITNESS FOR A PARTICULAR PURPOSE OR OF + * NON-INFRINGEMENT. See the License for the specific language governing + * rights and limitations under the License. + * + * The Original Software is CID font code that was developed by Silicon + * Graphics, Inc. + */ +/* $XFree86: xc/lib/font/Type1/objects.h,v 1.14 2002/12/24 17:42:59 tsi Exp $ */ /*SHARED*/ /*END SHARED*/ +#include <Xdefs.h> +#include <Xfuncproto.h> +#ifndef FONTMODULE +#include <stdlib.h> +#endif /*SHARED*/ #define Permanent(obj) t1_Permanent(obj) +#ifdef notused #define Temporary(obj) t1_Temporary(obj) +#endif #define Destroy(obj) t1_Destroy(obj) #define Dup(obj) t1_Dup(obj) -#define InitImager() t1_InitImager() -#define TermImager() t1_TermImager() +#define InitImager t1_InitImager +#define TermImager t1_TermImager #define Pragmatics(f,v) t1_Pragmatics(f,v) -#define ErrorMsg() t1_ErrorMsg() +#define ErrorMsg t1_ErrorMsg -struct xobject *t1_Permanent(); /* make an object permanent */ -struct xobject *t1_Temporary(); /* make an object temporary */ -struct xobject *t1_Destroy(); /* destroy an object */ -struct xobject *t1_Dup(); /* duplicate an object */ -void t1_InitImager(); /* initialize TYPE1IMAGER */ -void t1_TermImager(); /* terminate TYPE1IMAGER */ -void t1_Pragmatics(); /* set debug flags, etc. */ -char *t1_ErrorMsg(); /* return last TYPE1IMAGER error message */ +/* make an object permanent */ +extern struct xobject *t1_Permanent ( pointer obj ); + +#ifdef notused +/* make an object temporary */ +extern struct xobject *t1_Temporary( pointer obj ); +#endif + +/* destroy an object */ +extern struct xobject *t1_Destroy ( pointer obj ); + +/* duplicate an object */ +extern struct xobject *t1_Dup ( pointer obj ); + + +extern void t1_InitImager ( void ); /* initialize TYPE1IMAGER */ +extern void t1_TermImager ( void ); /* terminate TYPE1IMAGER */ +/* set debug flags, etc. */ +extern void t1_Pragmatics ( char *username, int value ); + +/* return last TYPE1IMAGER error message */ +extern char *t1_ErrorMsg ( void ); /*END SHARED*/ /*SHARED*/ - -#define abort(line) FatalError(line) +extern void xiFree ( long *addr ); +extern char *xiMalloc ( unsigned Size ); +extern void addmemory ( long *addr, long size ); +extern void delmemory ( void ); + +#ifndef OS_H +extern void FatalError(const char *f, ...) +#if defined(__GNUC__) && \ + ((__GNUC__ > 2) || ((__GNUC__ == 2) && (__GNUC_MINOR__ > 4))) +__attribute((noreturn)) +#endif +; + +extern void ErrorF(const char *f, ...); +#endif + +#define Abort(line) FatalError(line) #define Allocate(n,t,s) t1_Allocate(n,t,s) #define Free(obj) t1_Free(obj) -#define NonObjectFree(a) xiFree(a) +#define NonObjectFree(a) xiFree((long *)(a)) #define Consume t1_Consume #define ArgErr(s,o,r) t1_ArgErr(s,o,r) #define TypeErr(n,o,e,r) t1_TypeErr(n,o,e,r) #define Copy(obj) t1_Copy(obj) #define Unique(obj) t1_Unique(obj) -struct xobject *t1_Allocate(); /* allocate memory */ -void t1_Free(); /* free memory */ -struct xobject *t1_Unique(); /* make a unique temporary copy of an object */ -struct xobject *t1_ArgErr(); /* handle argument errors */ -struct xobject *t1_TypeErr(); /* handle 'bad type' argument errors */ -void t1_Consume(); /* consume a variable number of arguments */ -struct xobject *t1_Copy(); /* make a new copy, not reference bump PNM */ +/* allocate memory */ +extern struct xobject *t1_Allocate( int size, pointer template, + int extra ); + +/* free memory */ +extern void t1_Free ( pointer obj ); + +/* make a unique temporary copy of an object */ +extern struct xobject *t1_Unique ( pointer obj ); + +/* handle argument errors */ +extern struct xobject *t1_ArgErr ( char *string, pointer obj, pointer ret ); + +/* handle 'bad type' argument errors */ +extern struct xobject *t1_TypeErr ( char *name, pointer obj, + int expect, pointer ret ); + +/* consume a variable number of arguments */ +extern void t1_Consume ( int n, ... ); + +/* make a new copy, not reference bump PNM */ +extern struct xobject *t1_Copy ( pointer obj ); + /*END SHARED*/ /*SHARED*/ @@ -82,7 +152,7 @@ struct xobject *t1_Copy(); /* make a new copy, not reference bump PNM */ #endif #ifndef NULL -#define NULL 0 +#include <stddef.h> /* The NULL pointer is system specific. (Most systems, however, use 0.) TYPE1IMAGER could have its own NULL, independent of the rest of the system, @@ -223,9 +293,10 @@ struct xobject { #define IfTrace5(condition,model,arg0,arg1,arg2,arg3,arg4) #define IfTrace6(condition,model,arg0,arg1,arg2,arg3,arg4,arg5) - +#if 0 void Trace0(); char *Trace1(),*Trace2(),*Trace3(),*Trace4(),*Trace5(),*Trace6(); +#endif #ifdef GLOBALS @@ -240,7 +311,11 @@ char *Trace1(),*Trace2(),*Trace3(),*Trace4(),*Trace5(),*Trace6(); extern char MustCheckArgs INITIALIZED(TRUE); extern char MustTraceCalls INITIALIZED(FALSE); +#ifdef BUILDCID +extern char MustCrash INITIALIZED(FALSE); +#else extern char MustCrash INITIALIZED(TRUE); +#endif extern char InternalTrace INITIALIZED(TRUE); extern char LineIOTrace INITIALIZED(TRUE); @@ -281,11 +356,7 @@ We define other routines formatting parameters #define DumpEdges(e) t1_DumpEdges(e) #define FormatFP(s,p) t1_FormatFP(s,p) -void t1_DumpArea(); /* dump a region structure */ -void t1_DumpText(); /* dump a textpath structure */ -void t1_DumpPath(); /* dump a path list */ -void t1_DumpSpace(); /* dump a coordinate space structure */ -void t1_DumpEdges(); /* dump a region's edge list */ -void t1_FormatFP(); /* dump a format a "fractpel" coordinate */ +/* dump a textpath structure */ +extern void t1_DumpText(void); /*END SHARED*/ diff --git a/src/Type1/paths.c b/src/Type1/paths.c index 35c3e41..6291d68 100644 --- a/src/Type1/paths.c +++ b/src/Type1/paths.c @@ -26,6 +26,8 @@ * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF * THIS SOFTWARE. */ +/* $XFree86: xc/lib/font/Type1/paths.c,v 1.7 2002/02/18 20:51:57 herrb Exp $ */ + /* PATHS CWEB V0021 ******** */ /* :h1 id=paths.PATHS Module - Path Operator Handler @@ -42,6 +44,7 @@ The included files are: */ /* after the system includes (dsr) */ +#include "os.h" #include "objects.h" #include "spaces.h" #include "paths.h" @@ -51,6 +54,7 @@ The included files are: #include "strokes.h" /* understands how to coerce stroke paths */ #include "trig.h" + /* :h3.Routines Available to the TYPE1IMAGER User @@ -112,10 +116,10 @@ text, which has some auxilliary things involved. We don't feel competent to duplicate text in this module, so we call someone who knows how (in the FONTS module). */ -struct segment *CopyPath(p0) - register struct segment *p0; /* path to duplicate */ +struct segment * +CopyPath(struct segment *p0) /* path to duplicate */ { - register struct segment *p,*n,*last,*anchor; + register struct segment *p,*n = NULL,*last = NULL,*anchor; for (p = p0, anchor = NULL; p != NULL; p = p->link) { @@ -150,8 +154,8 @@ At this point we have a chain of newly allocated segments hanging off Destroying a path is simply a matter of freeing each segment in the linked list. Again, we let the experts handle text. */ -void KillPath(p) - register struct segment *p; /* path to destroy */ +void +KillPath(struct segment *p) /* path to destroy */ { register struct segment *linkp; /* temp register holding next segment*/ @@ -194,15 +198,15 @@ This template is used as a generic segment structure for Allocate: /* added reference field 1 to temporary template below 3-26-91 PNM */ static struct segment movetemplate = { MOVETYPE, 0, 1, sizeof(struct segment), 0, - NULL, NULL, 0, 0 }; + NULL, NULL, {0, 0} }; /* :h3.Loc() - Create an "Invisible Line" Between (0,0) and a Point */ -struct segment *t1_Loc(S, x, y) - register struct XYspace *S; /* coordinate space to interpret X,Y */ - double x,y; /* destination point */ +struct segment * +t1_Loc(struct XYspace *S, /* coordinate space to interpret X,Y */ + double x, double y) /* destination point */ { register struct segment *r; @@ -222,9 +226,9 @@ struct segment *t1_Loc(S, x, y) :h3.ILoc() - Loc() With Integer Arguments */ -struct segment *ILoc(S, x, y) - register struct XYspace *S; /* coordinate space to interpret X,Y */ - register int x,y; /* destination point */ +struct segment * +ILoc(struct XYspace *S, /* coordinate space to interpret X,Y */ + int x, int y) /* destination point */ { register struct segment *r; @@ -250,9 +254,8 @@ The symmetrical function AddLoc() is totally redundent with Join(), so it is not provided. */ -struct segment *SubLoc(p1, p2) - register struct segment *p1; - register struct segment *p2; +struct segment * +SubLoc(struct segment *p1, struct segment *p2) { IfTrace2((MustTraceCalls),"SubLoc(%z, %z)\n", p1, p2); @@ -277,9 +280,9 @@ conversion is unnecessary. PathSegment() is an internal routine provided to the rest of TYPE1IMAGER for handling these cases. */ -struct segment *t1_PathSegment(type, x, y) - int type; /* LINETYPE or MOVETYPE */ - fractpel x,y; /* where to go to, if known */ +struct segment * +t1_PathSegment(int type, /* LINETYPE or MOVETYPE */ + fractpel x, fractpel y) /* where to go to, if known */ { register struct segment *r; /* newly created segment */ @@ -295,8 +298,8 @@ struct segment *t1_PathSegment(type, x, y) This involves just creating and filling out a segment structure: */ -struct segment *Line(P) - register struct segment *P; /* relevant coordinate space */ +struct segment * +Line(struct segment *P) /* relevant coordinate space */ { IfTrace1((MustTraceCalls),"..Line(%z)\n", P); @@ -330,10 +333,10 @@ inversely related to the length |CD|. Point A is always point (0,0). This is just a simple matter of filling out a 'beziersegment' structure: */ -struct beziersegment *Bezier(B, C, D) - register struct segment *B; /* second control point */ - register struct segment *C; /* third control point */ - register struct segment *D; /* fourth control point (ending point) */ +struct beziersegment * +Bezier(struct segment *B, /* second control point */ + struct segment *C, /* third control point */ + struct segment *D) /* fourth control point (ending point) */ { /* added reference field of 1 to temporary template below 3-26-91 PNM */ static struct beziersegment template = @@ -371,15 +374,10 @@ This is temporary code while we experiment with hints. */ /*SHARED LINE(S) ORIGINATED HERE*/ -struct hintsegment *Hint(S, ref, width, orientation, hinttype, adjusttype, direction, label) - struct XYspace *S; - float ref; - float width; - char orientation; - char hinttype; - char adjusttype; - char direction; - int label; +struct hintsegment * +Hint(struct XYspace *S, float ref, float width, + char orientation, char hinttype, char adjusttype, char direction, + int label) { /* added reference field of 1 to hintsegment template below 3-26-91 PNM */ static struct hintsegment template = { HINTTYPE, 0, 1, sizeof(struct hintsegment), 0, @@ -446,8 +444,8 @@ types other than paths, and also check for certain path consistency rules. */ -struct segment *Join(p1, p2) - register struct segment *p1,*p2; +struct segment * +Join(struct segment *p1, struct segment *p2) { IfTrace2((MustTraceCalls && PathDebug > 1),"..Join(%z, %z)\n", p1, p2); IfTrace2((MustTraceCalls && PathDebug <=1),"..Join(%x, %x)\n", p1, p2); @@ -570,11 +568,11 @@ This internal function is quicker than a full-fledged join because it can do much less checking. */ -struct segment *t1_JoinSegment(before, type, x, y, after) - register struct segment *before; /* path to join before new segment */ - int type; /* type of new segment (MOVETYPE or LINETYPE) */ - fractpel x,y; /* x,y of new segment */ - register struct segment *after; /* path to join after new segment */ +struct segment * +t1_JoinSegment(struct segment *before, /* path to join before new segment */ + int type, /* type of new segment (MOVETYPE or LINETYPE) */ + fractpel x, fractpel y, /* x,y of new segment */ + struct segment *after) /* path to join after new segment */ { register struct segment *r; /* returned path built here */ @@ -596,14 +594,14 @@ struct segment *t1_JoinSegment(before, type, x, y, after) */ -struct segment *t1_ClosePath(p0,lastonly) - register struct segment *p0; /* path to close */ - register int lastonly; /* flag deciding to close all subpaths or... */ +struct segment * +t1_ClosePath(struct segment *p0, /* path to close */ + int lastonly) /* flag deciding to close all subpaths or... */ { - register struct segment *p,*last,*start; /* used in looping through path */ + register struct segment *p,*last = NULL,*start; /* used in looping through path */ register fractpel x,y; /* current position in path */ - register fractpel firstx,firsty; /* start position of sub path */ - register struct segment *lastnonhint; /* last non-hint segment in path */ + register fractpel firstx = 0,firsty = 0; /* start position of sub path */ + register struct segment *lastnonhint = NULL; /* last non-hint segment in path */ IfTrace1((MustTraceCalls),"ClosePath(%z)\n", p0); if (p0 != NULL && p0->type == TEXTTYPE) @@ -689,18 +687,22 @@ etc. We need three subroutines: */ -static struct segment *SplitPath(); /* break a path at any point */ -static struct segment *DropSubPath(); /* breaks a path after first sub-path */ -static struct segment *ReverseSubPath(); /* reverses a single sub-path */ - +/* break a path at any point */ +static struct segment *SplitPath ( struct segment *anchor, + struct segment *before ); +/* breaks a path after first sub-path */ +static struct segment *DropSubPath ( struct segment *p0 ); +/* reverses a single sub-path */ +static struct segment *ReverseSubPath ( struct segment *p ); + /* :h3.Reverse() - User Operator to Reverse a Path This operator reverses the entire path. */ -struct segment *Reverse(p) - register struct segment *p; /* full path to reverse */ +struct segment * +Reverse(struct segment *p) /* full path to reverse */ { register struct segment *r; /* output path built here */ register struct segment *nextp; /* contains next sub-path */ @@ -733,8 +735,8 @@ struct segment *Reverse(p) :h4.ReverseSubPath() - Subroutine to Reverse a Single Sub-Path */ -static struct segment *ReverseSubPath(p) - register struct segment *p; /* input path */ +static struct segment * +ReverseSubPath(struct segment *p) /* input path */ { register struct segment *r; /* reversed path will be created here */ register struct segment *nextp; /* temporary variable used in loop */ @@ -790,7 +792,7 @@ So, we add "dest" instead of subtracting it: break; default: - abort("Reverse: bad path segment"); + Abort("Reverse: bad path segment"); } /* We need to reverse the order of segments too, so we break this segment @@ -821,8 +823,8 @@ breaks the input path after the first sub-path so that a pointer to the original path now contains the first sub-path only. */ -static struct segment *DropSubPath(p0) - register struct segment *p0; /* original path */ +static struct segment * +DropSubPath(struct segment *p0) /* original path */ { register struct segment *p; /* returned remainder here */ @@ -834,9 +836,8 @@ static struct segment *DropSubPath(p0) return(SplitPath(p0, p)); } -static struct segment *SplitPath(anchor, before) - register struct segment *anchor; - register struct segment *before; +static struct segment * +SplitPath(struct segment *anchor, struct segment *before) { register struct segment *r; @@ -852,15 +853,14 @@ static struct segment *SplitPath(anchor, before) } static void -UnClose(p0) - register struct segment *p0; +UnClose(struct segment *p0) { register struct segment *p; for (p=p0; p->link->link != NULL; p=p->link) { ; } if (!LASTCLOSED(p->link->flag)) - abort("UnClose: no LASTCLOSED"); + Abort("UnClose: no LASTCLOSED"); Free(SplitPath(p0, p)); p0->flag &= ~ISCLOSED(ON); @@ -874,8 +874,8 @@ This user operator reverses the sub-paths in a path, but leaves the already established. */ -struct segment *ReverseSubPaths(p) - register struct segment *p; /* input path */ +struct segment * +ReverseSubPaths(struct segment *p) /* input path */ { register struct segment *r; /* reversed path will be created here */ register struct segment *nextp; /* temporary variable used in loop */ @@ -951,9 +951,9 @@ The transform is described as a "space", that way we can use our old friend the "iconvert" function, which should be very efficient. */ -struct segment *PathTransform(p0, S) - register struct segment *p0; /* path to transform */ - register struct XYspace *S; /* pseudo space to transform in */ +struct segment * +PathTransform(struct segment *p0, /* path to transform */ + struct XYspace *S) /* pseudo space to transform in */ { register struct segment *p; /* to loop through path with */ register fractpel newx,newy; /* current transformed position in path */ @@ -1025,7 +1025,7 @@ struct segment *PathTransform(p0, S) default: IfTrace1(TRUE,"path = %z\n", p); - abort("PathTransform: invalid segment"); + Abort("PathTransform: invalid segment"); } oldx += savex; oldy += savey; @@ -1039,9 +1039,9 @@ struct segment *PathTransform(p0, S) :h3.PathDelta() - Return a Path's Ending Point */ -void PathDelta(p, pt) - register struct segment *p; /* input path */ - register struct fractpoint *pt; /* pointer to x,y to set */ +void +PathDelta(struct segment *p, /* input path */ + struct fractpoint *pt) /* pointer to x,y to set */ { struct fractpoint mypoint; /* I pass this to TextDelta */ register fractpel x,y; /* working variables for path current point */ @@ -1067,8 +1067,8 @@ This function is called by image code, when we know the size of the image in pels, and need to get a bounding box path that surrounds it. The starting/ending handle is in the lower right hand corner. */ -struct segment *BoundingBox(h, w) - register pel h,w; /* size of box */ +struct segment * +BoundingBox(pel h, pel w) /* size of box */ { register struct segment *path; @@ -1086,10 +1086,10 @@ struct segment *BoundingBox(h, w) :h3.QueryLoc() - Return the X,Y of a Locition */ -void QueryLoc(P, S, xP, yP) - register struct segment *P; /* location to query, not consumed */ - register struct XYspace *S; /* XY space to return coordinates in */ - register double *xP,*yP; /* coordinates returned here */ +void +QueryLoc(struct segment *P, /* location to query, not consumed */ + struct XYspace *S, /* XY space to return coordinates in */ + double *xP, double *yP) /* coordinates returned here */ { IfTrace4((MustTraceCalls),"QueryLoc(P=%z, S=%z, (%x, %x))\n", P, S, xP, yP); @@ -1114,13 +1114,13 @@ a move segment, for example, he only needs to pass pointers to return one control point. */ -void QueryPath(path, typeP, Bp, Cp, Dp, fP) - register struct segment *path; /* path to check */ - register int *typeP; /* return the type of path here */ - register struct segment **Bp; /* return location of first point */ - register struct segment **Cp; /* return location of second point */ - register struct segment **Dp; /* return location of third point */ - register double *fP; /* return Conic sharpness */ +void +QueryPath(struct segment *path, /* path to check */ + int *typeP, /* return the type of path here */ + struct segment **Bp, /* return location of first point */ + struct segment **Cp, /* return location of second point */ + struct segment **Dp, /* return location of third point */ + double *fP) /* return Conic sharpness */ { register int coerced = FALSE; /* did I coerce a text path? */ @@ -1177,7 +1177,7 @@ void QueryPath(path, typeP, Bp, Cp, Dp, fP) break; default: - abort("QueryPath: unknown segment"); + Abort("QueryPath: unknown segment"); } if (coerced) KillPath(path); @@ -1188,11 +1188,13 @@ void QueryPath(path, typeP, Bp, Cp, Dp, fP) Returns the bounding box by setting the user's variables. */ -void QueryBounds(p0, S, xminP, yminP, xmaxP, ymaxP) - register struct segment *p0; /* object to check for bound */ - struct XYspace *S; /* coordinate space of returned values */ - double *xminP,*yminP; /* lower left hand corner (set by routine) */ - double *xmaxP,*ymaxP; /* upper right hand corner (set by routine) */ +void +QueryBounds(struct segment *p0, /* object to check for bound */ + struct XYspace *S, /* coordinate space of returned values */ + double *xminP, /* lower left hand corner (set by routine) */ + double *yminP, + double *xmaxP, /* upper right hand corner (set by routine) */ + double *ymaxP) { register struct segment *path; /* loop variable for path segments */ register fractpel lastx,lasty; /* loop variables: previous endingpoint */ @@ -1219,7 +1221,7 @@ void QueryBounds(p0, S, xminP, yminP, xmaxP, ymaxP) p0 = (struct segment *) DoStroke(Dup(p0)); /* no break here, we have a region in p0 */ case REGIONTYPE: - p0 = RegionBounds(p0); + p0 = RegionBounds((struct region *)p0); break; case PICTURETYPE: @@ -1317,7 +1319,7 @@ void QueryBounds(p0, S, xminP, yminP, xmaxP, ymaxP) case HINTTYPE: break; default: - abort("QueryBounds: unknown type"); + Abort("QueryBounds: unknown type"); } if (x < min.x) min.x = x; @@ -1356,9 +1358,8 @@ done: /* :h3.BoxPath() */ -struct segment *BoxPath(S, h, w) - struct XYspace *S; - int h,w; +struct segment * +BoxPath(struct XYspace *S, int h, int w) { struct segment *path; @@ -1375,8 +1376,8 @@ shorter. It can be used in conjunction with QueryPath(), for example, to ask about an entire path. */ -struct segment *DropSegment(path) - register struct segment *path; +struct segment * +DropSegment(struct segment *path) { IfTrace1((MustTraceCalls),"DropSegment(%z)\n", path); if (path != NULL && path->type == STROKEPATHTYPE) @@ -1397,8 +1398,8 @@ This routine takes the path and returns a new path consists of the first segment only. */ -struct segment *HeadSegment(path) - register struct segment *path; /* input path */ +struct segment * +HeadSegment(struct segment *path) /* input path */ { IfTrace1((MustTraceCalls),"HeadSegment(%z)\n", path); if (path == NULL) @@ -1423,8 +1424,8 @@ struct segment *HeadSegment(path) :h3.DumpPath() - Display a Path on the Trace File */ -void DumpPath(p) - register struct segment *p; +void +DumpPath(struct segment *p) { register fractpel x,y; register fractpel lastx,lasty; @@ -1466,8 +1467,6 @@ void DumpPath(p) case BEZIERTYPE: { - register struct beziersegment *bp = (struct beziersegment *) p; - IfTrace4(TRUE,". bezier to (%p,%p), B=(%p,%p)", x + lastx, y + lasty, bp->B.x + lastx, bp->B.y + lasty); @@ -1478,8 +1477,6 @@ void DumpPath(p) case HINTTYPE: { - register struct hintsegment *hp = (struct hintsegment *) p; - IfTrace4(TRUE,". hint ref=(%p,%p), width=(%p,%p)", hp->ref.x + lastx, hp->ref.y + lasty, hp->width.x, hp->width.y); @@ -1491,7 +1488,9 @@ void DumpPath(p) break; case TEXTTYPE: +#ifdef notyet DumpText(p); +#endif break; default: diff --git a/src/Type1/paths.h b/src/Type1/paths.h index e52a760..3f1b389 100644 --- a/src/Type1/paths.h +++ b/src/Type1/paths.h @@ -26,6 +26,8 @@ * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF * THIS SOFTWARE. */ +/* $XFree86: xc/lib/font/Type1/paths.h,v 1.4 2001/01/17 19:43:22 dawes Exp $ */ + /*SHARED*/ #define Loc(S,x,y) t1_Loc(S,(double)x,(double)y) @@ -50,26 +52,53 @@ #define QueryPath(p,t,B,C,D,r) t1_QueryPath(p,t,B,C,D,r) #define QueryBounds(p,S,x1,y1,x2,y2) t1_QueryBounds(p,S,x1,y1,x2,y2) - -struct segment *t1_Loc(); /* create a location object (or "move" segment) */ -struct segment *t1_ILoc(); /* integer argument version of same */ -struct segment *t1_Line(); /* straight line path segment */ -struct segment *t1_Join(); /* join two paths or regions together */ -struct segment *t1_ClosePath(); /* close a path or path set */ + +/* create a location object (or "move" segment) */ +extern struct segment *t1_Loc ( struct XYspace *S, double x, double y ); +/* integer argument version of same */ +extern struct segment *t1_ILoc ( struct XYspace *S, int x, int y ); +/* straight line path segment */ +extern struct segment *t1_Line ( struct segment *P ); +/* join two paths or regions together */ +extern struct segment *t1_Join ( struct segment *p1, struct segment *p2 ); +/* close a path or path set */ +extern struct segment *t1_ClosePath ( struct segment *p0, int lastonly ); +#if 0 struct conicsegment *t1_Conic(); /* conic curve path segment */ + struct conicsegment *t1_RoundConic(); /* ditto, specified another way */ struct conicsegment *t1_ArcP3(); /* circular path segment with three points */ struct conicsegment *t1_ArcCA(); /* ditto, with center point and angle */ -struct beziersegment *t1_Bezier(); /* Bezier third order curve path segment */ -struct hintsegment *t1_Hint(); /* produce a font 'hint' path segment */ -struct segment *t1_Reverse(); /* reverse the complete order of paths */ -struct segment *t1_ReverseSubPaths(); /* reverse only sub-paths; moves unchanged */ -struct segment *t1_SubLoc(); /* subtract two location objects */ -struct segment *t1_DropSegment(); /* Drop the first segment in a path */ -struct segment *t1_HeadSegment(); /* return the first segment in a path */ -void t1_QueryLoc(); /* Query location; return its (x,y) */ -void t1_QueryPath(); /* Query segment at head of a path */ -void t1_QueryBounds(); /* Query the bounding box of a path */ +#endif +/* Bezier third order curve path segment */ +extern struct beziersegment *t1_Bezier ( struct segment *B, struct segment *C, + struct segment *D ); +/* produce a font 'hint' path segment */ +extern struct hintsegment *t1_Hint ( struct XYspace *S, float ref, float width, + char orientation, char hinttype, + char adjusttype, char direction, + int label ); +/* reverse the complete order of paths */ +extern struct segment *t1_Reverse ( struct segment *p ); +/* reverse only sub-paths; moves unchanged */ +extern struct segment *t1_ReverseSubPaths ( struct segment *p ); +/* subtract two location objects */ +extern struct segment *t1_SubLoc ( struct segment *p1, struct segment *p2 ); +/* Drop the first segment in a path */ +extern struct segment *t1_DropSegment ( struct segment *path ); +/* return the first segment in a path */ +extern struct segment *t1_HeadSegment ( struct segment *path ); +/* Query location; return its (x,y) */ +extern void t1_QueryLoc ( struct segment *P, struct XYspace *S, double *xP, + double *yP ); +/* Query segment at head of a path */ +extern void t1_QueryPath ( struct segment *path, int *typeP, + struct segment **Bp, struct segment **Cp, + struct segment **Dp, double *fP ); +/* Query the bounding box of a path */ +extern void t1_QueryBounds ( struct segment *p0, struct XYspace *S, + double *xminP, double *yminP, + double *xmaxP, double *ymaxP ); /*END SHARED*/ /*SHARED*/ @@ -83,15 +112,26 @@ void t1_QueryBounds(); /* Query the bounding box of a path */ #define JoinSegment(b,t,x,y,a) t1_JoinSegment(b,t,(fractpel)x,(fractpel)y,a) #define Hypoteneuse(dx,dy) t1_Hypoteneuse(dx,dy) #define BoxPath(S,h,w) t1_BoxPath(S,h,w) - -struct segment *t1_CopyPath(); /* duplicate a path */ -void t1_KillPath(); /* destroy a path */ -struct segment *t1_PathXform(); /* transform a path arbitrarily */ -void t1_PathDelta(); /* calculate the ending point of a path */ -struct segment *t1_PathSegment(); /* produce a MOVE or LINE segment */ -struct segment *t1_JoinSegment(); /* join a MOVE or LINE segment to a path */ + +/* duplicate a path */ +extern struct segment *t1_CopyPath ( struct segment *p0 ); +/* destroy a path */ +extern void t1_KillPath ( struct segment *p ); +/* transform a path arbitrarily */ +extern struct segment *t1_PathXform ( struct segment *p0, struct XYspace *S ); +/* calculate the ending point of a path */ +extern void t1_PathDelta ( struct segment *p, struct fractpoint *pt ); +/* */ +extern struct segment *t1_BoundingBox ( pel h, pel w ); +/* produce a MOVE or LINE segment */ +extern struct segment *t1_PathSegment ( int type, fractpel x, fractpel y ); +/* join a MOVE or LINE segment to a path */ +extern struct segment *t1_JoinSegment ( struct segment *before, int type, fractpel x, fractpel y, struct segment *after ); +#if 0 double t1_Hypoteneuse(); /* returns the length of a line */ -struct segment *t1_BoxPath(); /* returns a rectangular path */ +#endif +/* returns a rectangular path */ +extern struct segment *t1_BoxPath ( struct XYspace *S, int h, int w ); /*END SHARED*/ /*SHARED*/ @@ -195,3 +235,5 @@ is also used by the STROKES module.) p2->last = NULL; } /* only first segment has non-NULL "last" */ /*END SHARED*/ +/* dump a path list */ +extern void t1_DumpPath ( struct segment *p ); diff --git a/src/Type1/pictures.h b/src/Type1/pictures.h index 6a14292..aa02ce5 100644 --- a/src/Type1/pictures.h +++ b/src/Type1/pictures.h @@ -27,6 +27,8 @@ * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS * SOFTWARE. */ +/* $XFree86: xc/lib/font/Type1/pictures.h,v 1.4 2001/01/17 19:43:23 dawes Exp $ */ + /* STUB */ #define CopyPicture(p) p @@ -44,5 +46,5 @@ struct picture { #define Phantom(o) t1_Phantom(o) #define Snap(o) t1_Snap(o) -struct segment *t1_Phantom(); -struct segment *t1_Snap(); +extern struct segment *t1_Phantom ( struct segment *p ); +extern struct segment *t1_Snap ( struct segment *p ); diff --git a/src/Type1/regions.c b/src/Type1/regions.c index 2824887..724d3f5 100644 --- a/src/Type1/regions.c +++ b/src/Type1/regions.c @@ -26,6 +26,7 @@ * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF * THIS SOFTWARE. */ +/* $XFree86: xc/lib/font/Type1/regions.c,v 3.8 2002/02/18 20:51:57 herrb Exp $ */ /* REGIONS CWEB V0023 LOTS */ /* :h1 id=regions.REGIONS Module - Regions Operator Handler @@ -40,26 +41,31 @@ This module is responsible for creating and manipulating regions. The included files are: */ +#include "os.h" #include "objects.h" #include "spaces.h" -#include "regions.h" #include "paths.h" +#include "regions.h" #include "curves.h" #include "lines.h" #include "pictures.h" #include "fonts.h" #include "hints.h" #include "strokes.h" /* to pick up 'DoStroke' */ -static void newfilledge(); -static struct edgelist *splitedge(); -static void vertjoin(); -static int touches(); -static int crosses(); -static void edgemin(); -static void edgemax(); -static struct edgelist *NewEdge(); -static struct edgelist *swathxsort(); /* 'SortSwath' function */ - + + +static void newfilledge ( struct region *R, fractpel xmin, fractpel xmax, + fractpel ymin, fractpel ymax, int isdown ); +static struct edgelist *splitedge ( struct edgelist *list, pel y ); +static void vertjoin ( struct edgelist *top, struct edgelist *bottom ); +static int touches ( int h, pel *left, pel *right ); +static int crosses ( int h, pel *left, pel *right ); +static void edgemin ( int h, pel *e1, pel *e2 ); +static void edgemax ( int h, pel *e1, pel *e2 ); +static struct edgelist *NewEdge ( pel xmin, pel xmax, pel ymin, pel ymax, + pel *xvalues, int isdown ); +static struct edgelist *swathxsort ( struct edgelist *before0, + struct edgelist *edge ); /* :h3.Functions Provided to the TYPE1IMAGER User @@ -128,19 +134,19 @@ set. The flag is used to optimize some paths. /*SHARED LINE(S) ORIGINATED HERE*/ /* -:h4."INFINITY" - A Constant Region Structure of Infinite Extent +:h4."TT_INFINITY" - A Constant Region Structure of Infinite Extent Infinity is the complement of a null area: Note - removed the refcount = 1 init, replaced with references = 2 3-26-91 PNM */ -static struct region infinity = { REGIONTYPE, +static struct region _infinity = { REGIONTYPE, ISCOMPLEMENT(ON)+ISINFINITE(ON)+ISPERMANENT(ON)+ISIMMORTAL(ON), 2, - 0, 0, 0, 0, + {0, 0}, {0, 0}, 0, 0, 0, 0, NULL, NULL, 0, 0, 0, 0, 0, NULL, NULL, NULL, 0, NULL, NULL }; -struct region *INFINITY = &infinity; +struct region *TT_INFINITY = &_infinity; /* :h4."EmptyRegion" - A Region Structure with Zero Area @@ -153,7 +159,7 @@ Note - replaced refcount = 1 init with references = 2 3-26-91 PNM /*SHARED LINE(S) ORIGINATED HERE*/ struct region EmptyRegion = { REGIONTYPE, ISPERMANENT(ON)+ISIMMORTAL(ON), 2, - 0, 0, 0, 0, + {0, 0}, {0, 0}, MAXPEL, MAXPEL, MINPEL, MINPEL, NULL, NULL, 0, 0, 0, 0, 0, NULL, NULL, @@ -221,14 +227,14 @@ associated (thresholded) picture. Note - added conditional return based on references 3-26-91 PNM */ -void KillRegion(area) - register struct region *area; /* area to free */ +void +KillRegion(struct region *area) /* area to free */ { register struct edgelist *p; /* loop variable */ register struct edgelist *next; /* loop variable */ if (area->references < 0) - abort("KillRegion: negative reference count"); + Abort("KillRegion: negative reference count"); if ( (--(area->references) > 1) || ( (area->references == 1) && !ISPERMANENT(area->flag) ) ) return; @@ -244,11 +250,11 @@ void KillRegion(area) /* :h3.CopyRegion() - Makes a Copy of a Region */ -struct region *CopyRegion(area) - register struct region *area; /* region to duplicate */ +struct region * +CopyRegion(struct region *area) /* region to duplicate */ { register struct region *r; /* output region built here */ - register struct edgelist *last; /* loop variable */ + register struct edgelist *last = NULL; /* loop variable */ register struct edgelist *p,*newp; /* loop variables */ r = (struct region *)Allocate(sizeof(struct region), area, 0); @@ -278,11 +284,11 @@ edgelist structure to free all memory associated with it. Damn clever, huh? */ -static struct edgelist *NewEdge(xmin, xmax, ymin, ymax, xvalues, isdown) - pel xmin,xmax; /* X extent of edge */ - pel ymin,ymax; /* Y extent of edge */ - pel *xvalues; /* list of X values for entire edge */ - int isdown; /* flag: TRUE means edge progresses downward */ +static struct edgelist * +NewEdge(pel xmin, pel xmax, /* X extent of edge */ + pel ymin, pel ymax, /* Y extent of edge */ + pel *xvalues, /* list of X values for entire edge */ + int isdown) /* flag: TRUE means edge progresses downward */ { static struct edgelist template = { EDGETYPE, 0, 1, NULL, NULL, @@ -294,7 +300,7 @@ static struct edgelist *NewEdge(xmin, xmax, ymin, ymax, xvalues, isdown) IfTrace2((RegionDebug),"....new edge: ymin=%d, ymax=%d ", (long)ymin, (long) ymax); if (ymin >= ymax) - abort("newedge: height not positive"); + Abort("newedge: height not positive"); /* We are going to copy the xvalues into a newly allocated area. It helps performance if the values are all "long" aligned. We can test @@ -302,7 +308,7 @@ if the xvalues are long aligned by ANDing the address with the (sizeof(long) - 1)--if non zero, the xvalues are not aligned well. We set 'iy' to the ymin value that would give us good alignment: */ - iy = ymin - (((int) xvalues) & (sizeof(long) - 1)) / sizeof(pel); + iy = ymin - (((unsigned long)xvalues) & (sizeof(long)-1)) / sizeof(pel); r = (struct edgelist *)Allocate(sizeof(struct edgelist), &template, (ymax - iy) * sizeof(pel)); @@ -347,9 +353,8 @@ of the list and set ymin=ymax. */ static void -discard(left, right) - register struct edgelist *left,*right; /* all edges between here exclusive */ - /* should be discarded */ +discard(struct edgelist *left, /* all edges between here exclusive */ + struct edgelist *right) /* should be discarded */ { register struct edgelist *beg,*end,*p; @@ -361,7 +366,7 @@ discard(left, right) for (p = beg; p != right; p = p->link) { if (p->link == NULL && right != NULL) - abort("discard(): ran off end"); + Abort("discard(): ran off end"); IfTrace1((RegionDebug > 0),"discarding %x\n", p); p->ymin = p->ymax = 32767; end = p; @@ -389,10 +394,9 @@ discard the second one. Everything should balance; we should discard an even number of edges; of course, we abort if we don't. */ static void -Unwind(area) - register struct edgelist *area; /* input area modified in place */ +Unwind(struct edgelist *area) /* input area modified in place */ { - register struct edgelist *last,*next; /* struct before and after current one */ + register struct edgelist *last = NULL,*next; /* struct before and after current one */ register int y; /* ymin of current swath */ register int count,newcount; /* winding count registers */ @@ -422,7 +426,7 @@ Unwind(area) } while (area != NULL && area->ymin == y); if (count != 0) - abort("Unwind: uneven edges"); + Abort("Unwind: uneven edges"); } } /* @@ -453,9 +457,9 @@ region, we allow the same ChangeDirection logic to be used by stroking. /*SHARED LINE(S) ORIGINATED HERE*/ -struct region *Interior(p, fillrule) - register struct segment *p; /* take interior of this path */ - register int fillrule; /* rule to follow if path crosses itself */ +struct region * +Interior(struct segment *p, /* take interior of this path */ + int fillrule) /* rule to follow if path crosses itself */ { register fractpel x,y; /* keeps ending point of path segment */ fractpel lastx,lasty; /* previous x,y from path segment before */ @@ -488,11 +492,12 @@ user asked, >1: do it regardless). /* if (fillrule != EVENODDRULE) else */ return((struct region *)UniquePath(p)); - if (p->type == STROKEPATHTYPE) + if (p->type == STROKEPATHTYPE) { if (fillrule == WINDINGRULE) return((struct region *)DoStroke(p)); else p = CoercePath(p); + } R = (struct region *)Allocate(sizeof(struct region), &EmptyRegion, 0); @@ -575,7 +580,8 @@ segment (or NULL), and each hint segment will be freed if necessary. while ((nextP != NULL) && (nextP->type == HINTTYPE)) { if (ProcessHints) - ProcessHint(nextP, x + hint.x, y + hint.y, &hint); + ProcessHint((struct hintsegment *)nextP, + x + hint.x, y + hint.y, &hint); { register struct segment *saveP = nextP; @@ -645,7 +651,7 @@ MOVETYPE at the end of the path, if it isn't closed: break; default: - abort("Interior: path type error"); + Abort("Interior: path type error"); } /* We're done with this segment. Advance to the next path segment in @@ -693,11 +699,11 @@ emerging edgelist at 'anchor' by calling whatever "newedgefcn" is appropriate. */ -void ChangeDirection(type, R, x, y, dy) - int type; /* CD_FIRST, CD_CONTINUE, or CD_LAST */ - register struct region *R; /* region in which we are changing direction */ - fractpel x,y; /* current beginning x,y */ - fractpel dy; /* direction and magnitude of change in y */ +void +ChangeDirection(int type, /* CD_FIRST, CD_CONTINUE, or CD_LAST */ + struct region *R, /* region in which we are changing direction */ + fractpel x, fractpel y, /* current beginning x,y */ + fractpel dy) /* direction and magnitude of change in y */ { register fractpel ymin,ymax; /* minimum and maximum Y since last call */ register fractpel x_at_ymin,x_at_ymax; /* their respective X's */ @@ -724,11 +730,11 @@ void ChangeDirection(type, R, x, y, dy) } if (ymax < ymin) - abort("negative sized edge?"); + Abort("negative sized edge?"); (*R->newedgefcn)(R, R->edgexmin, R->edgexmax, ymin, ymax, - R->lastdy > 0, x_at_ymin, x_at_ymax); + R->lastdy > 0); } @@ -779,11 +785,11 @@ This function also has to keep the bounding box of the region up to date. */ -static void newfilledge(R, xmin, xmax, ymin, ymax, isdown) - register struct region *R; /* region being built */ - fractpel xmin,xmax; /* X range of this edge */ - fractpel ymin,ymax; /* Y range of this edge */ - int isdown; /* flag: TRUE means edge goes down, else up */ +static void +newfilledge(struct region *R, /* region being built */ + fractpel xmin, fractpel xmax, /* X range of this edge */ + fractpel ymin, fractpel ymax, /* Y range of this edge */ + int isdown) /* flag: TRUE means edge goes down, else up */ { register pel pelxmin,pelymin,pelxmax,pelymax; /* pel versions of bounds */ @@ -836,10 +842,10 @@ exactly where the bottom part belongs. #define TOP(e) ((e)->ymin) /* the top of an edge (for readability */ #define BOTTOM(e) ((e)->ymax) /* the bottom of an edge (for readability */ -struct edgelist *SortSwath(anchor, edge, swathfcn) - struct edgelist *anchor; /* list being built */ - register struct edgelist *edge; /* incoming edge or pair of edges */ - struct edgelist *(*swathfcn)(); /* horizontal sorter */ +struct edgelist * +SortSwath(struct edgelist *anchor, /* list being built */ + struct edgelist *edge, /* incoming edge or pair of edges */ + SwathFunc swathfcn) /* horizontal sorter */ { register struct edgelist *before,*after; struct edgelist base; @@ -951,12 +957,12 @@ is guaranteed not to change the address of the old swath while splitting it. */ -static struct edgelist *splitedge(list, y) - struct edgelist *list; /* area to split */ - register pel y; /* Y value to split list at */ +static struct edgelist * +splitedge(struct edgelist *list, /* area to split */ + pel y) /* Y value to split list at */ { register struct edgelist *new; /* anchor for newly built list */ - register struct edgelist *last; /* end of newly built list */ + register struct edgelist *last = NULL; /* end of newly built list */ register struct edgelist *r; /* temp pointer to new structure */ register struct edgelist *lastlist; /* temp pointer to last 'list' value */ @@ -968,9 +974,9 @@ static struct edgelist *splitedge(list, y) if (y < list->ymin) break; if (y >= list->ymax) - abort("splitedge: above top of list"); + Abort("splitedge: above top of list"); if (y == list->ymin) - abort("splitedge: would be null"); + Abort("splitedge: would be null"); r = (struct edgelist *)Allocate(sizeof(struct edgelist), list, 0); /* @@ -1010,7 +1016,7 @@ list at 'lastlist', and add the broken off part to the end of 'new'. Then, we return the caller a pointer to 'new': */ if (new == NULL) - abort("null splitedge"); + Abort("null splitedge"); lastlist->link = NULL; last->link = list; IfTrace1((RegionDebug > 1),"yields %x\n", new); @@ -1027,7 +1033,7 @@ static void vertjoin(top, bottom) register struct edgelist *bottom; /* bottommost region */ { if (BOTTOM(top) > TOP(bottom)) - abort("vertjoin not disjoint"); + Abort("vertjoin not disjoint"); for (; top->link != NULL; top=top->link) { ; } @@ -1045,13 +1051,13 @@ all swath functions, this function returns a pointer to the edge BEFORE the given edge in the sort. */ -static struct edgelist *swathxsort(before0, edge) - register struct edgelist *before0; /* edge before this swath */ - register struct edgelist *edge; /* input edge */ +static struct edgelist * +swathxsort(struct edgelist *before0, /* edge before this swath */ + struct edgelist *edge) /* input edge */ { register struct edgelist *before; register struct edgelist *after; - register pel y; + register pel y = 0; before = before0; after = before->link; @@ -1121,9 +1127,9 @@ fun comes in they overlap the existing edges. Then some edges will disappear. */ -struct edgelist *SwathUnion(before0, edge) - register struct edgelist *before0; /* edge before the swath */ - register struct edgelist *edge; /* list of two edges to be unioned */ +struct edgelist * +SwathUnion(struct edgelist *before0, /* edge before the swath */ + struct edgelist *edge) /* list of two edges to be unioned */ { register int h; /* saves height of edge */ register struct edgelist *rightedge; /* saves right edge of 'edge' */ @@ -1135,7 +1141,7 @@ struct edgelist *SwathUnion(before0, edge) h0 = h = edge->ymax - edge->ymin; if (h <= 0) - abort("SwathUnion: 0 height swath?"); + Abort("SwathUnion: 0 height swath?"); before = before0; after = before->link; @@ -1271,6 +1277,7 @@ were overlapped and have been combined with the new incoming 'edge': } return(before); } +#ifdef notused /* :h3.swathrightmost() - Simply Sorts New Edge to Rightmost of Swath @@ -1278,9 +1285,9 @@ Like all swath functions, this function returns a pointer to the edge BEFORE the given edge in the sort. */ -static struct edgelist *swathrightmost(before, edge) - register struct edgelist *before; /* edge before this swath */ - register struct edgelist *edge; /* input edge */ +static struct edgelist * +swathrightmost(struct edgelist *before, /* edge before this swath */ + struct edgelist *edge) /* input edge */ { register struct edgelist *after; @@ -1294,6 +1301,7 @@ static struct edgelist *swathrightmost(before, edge) return(before); } +#endif /* :h3.touches() - Returns the Remaining Height When Two Edges Touch @@ -1301,9 +1309,8 @@ So, it will return 0 if they never touch. Allows incredibly(?) mnemonic if (touches(...)) construct. */ -static int touches(h, left, right) - register int h; - register pel *left,*right; +static int +touches(int h, pel *left, pel *right) { for (; h > 0; h--) if (*left++ >= *right++) @@ -1316,9 +1323,8 @@ static int touches(h, left, right) So, it will return 0 if they never cross. */ -static int crosses(h, left, right) - register int h; - register pel *left,*right; +static int +crosses(int h, pel *left, pel *right) { for (; h > 0; h--) if (*left++ > *right++) @@ -1329,10 +1335,8 @@ static int crosses(h, left, right) :h3.cedgemin() - Stores the Mininum of an Edge and an X Value */ -static void cedgemin(h, e1, x) - register int h; - register pel *e1; - register pel x; +static void +cedgemin(int h, pel *e1, pel x) { for (; --h >= 0; e1++) if (*e1 > x) @@ -1342,10 +1346,8 @@ static void cedgemin(h, e1, x) :h3.cedgemax() - Stores the Maximum of an Edge and an X Value */ -static void cedgemax(h, e1, x) - register int h; - register pel *e1; - register pel x; +static void +cedgemax(int h, pel *e1, pel x) { for (; --h >= 0; e1++) if (*e1 < x) @@ -1355,9 +1357,8 @@ static void cedgemax(h, e1, x) :h3.edgemin() - Stores the Mininum of Two Edges in First Edge */ -static void edgemin(h, e1, e2) - register int h; - register pel *e1,*e2; +static void +edgemin(int h, pel *e1, pel *e2) { for (; --h >= 0; e1++,e2++) if (*e1 > *e2) @@ -1367,9 +1368,8 @@ static void edgemin(h, e1, e2) :h3.edgemax() - Stores the Maximum of Two Edges in First Edge */ -static void edgemax(h, e1, e2) - register int h; - register pel *e1,*e2; +static void +edgemax(int h, pel *e1, pel *e2) { for (; --h >= 0; e1++,e2++) if (*e1 < *e2) @@ -1387,9 +1387,8 @@ region. */ void -MoveEdges(R, dx, dy) - register struct region *R; /* region to modify */ - register fractpel dx,dy; /* delta X and Y to move edge list by */ +MoveEdges(struct region *R, /* region to modify */ + fractpel dx, fractpel dy) /* delta X and Y to move edge list by */ { register struct edgelist *edge; /* for looping through edges */ @@ -1436,8 +1435,8 @@ From now on we will deal with dx and dy as integer pel values: It is an open question whether it pays in general to do this. */ -void UnJumble(region) - struct region *region; /* region to sort */ +void +UnJumble(struct region *region) /* region to sort */ { register struct edgelist *anchor; /* new lists built here */ register struct edgelist *edge; /* edge pointer for loop */ @@ -1447,7 +1446,7 @@ void UnJumble(region) for (edge=region->anchor; VALIDEDGE(edge); edge=next) { if (edge->link == NULL) - abort("UnJumble: unpaired edge?"); + Abort("UnJumble: unpaired edge?"); next = edge->link->link; edge->link->link = NULL; anchor = SortSwath(anchor, edge, t1_SwathUnion); @@ -1462,10 +1461,9 @@ void UnJumble(region) /* */ - +#ifdef notused static void -OptimizeRegion(R) - struct region *R; /* region to optimize */ +OptimizeRegion(struct region *R) /* region to optimize */ { register pel *xP; /* pel pointer for inner loop */ register int x; /* holds X value */ @@ -1486,15 +1484,16 @@ OptimizeRegion(R) if (xmin != xmax || (xmin != R->xmin && xmax != R->xmax)) R->flag &= ~ISRECTANGULAR(ON); if (xmin < e->xmin || xmax > e->xmax) - abort("Tighten: existing edge bound was bad"); + Abort("Tighten: existing edge bound was bad"); if (xmin < R->xmin || xmax > R->xmax) - abort("Tighten: existing region bound was bad"); + Abort("Tighten: existing region bound was bad"); e->xmin = xmin; e->xmax = xmax; } R->flag |= ISOPTIMIZED(ON); } - +#endif + /* :h2.Miscelaneous Routines @@ -1506,10 +1505,10 @@ it gets a shorter 'dy'. */ /*ARGSUSED*/ -void MoreWorkArea(R, x1, y1, x2, y2) - struct region *R; /* region we are generating */ - fractpel x1,y1; /* starting point of line */ - fractpel x2,y2; /* ending point of line */ +void +MoreWorkArea(struct region *R, /* region we are generating */ + fractpel x1, fractpel y1, /* starting point of line */ + fractpel x2, fractpel y2) /* ending point of line */ { register int idy; /* integer dy of line */ @@ -1538,10 +1537,10 @@ clipping box is specified in REGION coordinates, that is, in coordinates relative to the region (0,0) point */ -struct region *BoxClip(R, xmin, ymin, xmax, ymax) - register struct region *R; /* region to clip */ - register pel xmin,ymin; /* upper left hand corner of rectangle */ - register pel xmax,ymax; /* lower right hand corner */ +struct region * +BoxClip(struct region *R, /* region to clip */ + pel xmin, pel ymin, /* upper left hand corner of rectangle */ + pel xmax, pel ymax) /* lower right hand corner */ { struct edgelist anchor; /* pretend edgelist to facilitate discards */ register struct edgelist *e,*laste; @@ -1618,8 +1617,8 @@ couldn't have it be consumed) and this would probably require unnecessary CopyRegions in most cases. */ -struct region *CoerceRegion(tp) - register struct textpath *tp; /* input TEXTTYPE */ +struct region * +CoerceRegion(struct textpath *tp) /* input TEXTTYPE */ { struct segment *path; /* temporary character path */ struct region *R; /* returned region */ @@ -1634,11 +1633,9 @@ struct region *CoerceRegion(tp) :h3.RegionBounds() - Returns Bounding Box of a Region */ -struct segment *RegionBounds(R) - register struct region *R; +struct segment * +RegionBounds(struct region *R) { - extern struct XYspace *IDENTITY; - register struct segment *path; /* returned path */ path = BoxPath(IDENTITY, R->ymax - R->ymin, R->xmax - R->xmin); @@ -1653,8 +1650,8 @@ struct segment *RegionBounds(R) :h3.DumpArea() - Display a Region */ -void DumpArea(area) - register struct region *area; +void +DumpArea(struct region *area) { IfTrace1(TRUE,"Dumping area %x,", area); IfTrace4(TRUE," X %d:%d Y %d:%d;", (long) area->xmin, @@ -1675,25 +1672,23 @@ void DumpArea(area) /*ARGSUSED*/ static void -edgecheck(edge, oldmin, oldmax) - struct edgelist *edge; - int oldmin,oldmax; +edgecheck(struct edgelist *edge, int oldmin, int oldmax) { if (edge->type != EDGETYPE) - abort("EDGE ERROR: non EDGETYPE in list"); + Abort("EDGE ERROR: non EDGETYPE in list"); /* The following check is not valid if the region is jumbled so I took it out: */ /* if (edge->ymin < oldmax && edge->ymin != oldmin) - abort("EDGE ERROR: overlapping swaths"); */ + Abort("EDGE ERROR: overlapping swaths"); */ } static pel RegionDebugYMin = MINPEL; static pel RegionDebugYMax = MAXPEL; -void DumpEdges(edges) - register struct edgelist *edges; +void +DumpEdges(struct edgelist *edges) { register struct edgelist *p,*p2; register pel ymin = MINPEL; diff --git a/src/Type1/regions.h b/src/Type1/regions.h index 3870cf4..9d27e76 100644 --- a/src/Type1/regions.h +++ b/src/Type1/regions.h @@ -26,6 +26,7 @@ * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF * THIS SOFTWARE. */ +/* $XFree86: xc/lib/font/Type1/regions.h,v 1.8 2001/06/15 08:09:20 alanh Exp $ */ /*SHARED*/ #define Interior(p,rule) t1_Interior(p,rule) @@ -33,21 +34,27 @@ #define Intersect(a1,a2) t1_Intersect(a1,a2) #define Complement(area) t1_Complement(area) #define Overlap(a1,a2) t1_OverLap(a1,a2) - -struct region *t1_Interior(); /* returns the interior of a closed path */ + + +/* returns the interior of a closed path */ +extern struct region *t1_Interior ( struct segment *p, int fillrule ); +#if 0 struct region *t1_Union(); /* set union of paths or regions */ struct region *t1_Intersect(); /* set intersection of regions */ struct region *t1_Complement(); /* complement of a region */ int t1_Overlap(); /* returns a Boolean; TRUE if regions overlap */ - -#define INFINITY t1_Infinity +#endif + +#define TT_INFINITY t1_Infinity /*END SHARED*/ /*SHARED*/ #define ChangeDirection(type,R,x,y,dy) t1_ChangeDirection(type,R,x,y,dy) -void t1_ChangeDirection(); /* called when we change direction in Y */ +/* called when we change direction in Y */ +extern void t1_ChangeDirection ( int type, struct region *R, fractpel x, + fractpel y, fractpel dy ); #define CD_FIRST -1 /* enumeration of ChangeDirection type */ #define CD_CONTINUE 0 /* enumeration of ChangeDirection type */ #define CD_LAST 1 /* enumeration of ChangeDirection type */ @@ -63,17 +70,37 @@ void t1_ChangeDirection(); /* called when we change direction in Y */ #define MoveEdges(R,dx,dy) t1_MoveEdges(R,dx,dy) #define UnJumble(R) t1_UnJumble(R) -void t1_MoreWorkArea(); /* get longer edge list for stepping */ -struct region *t1_CopyRegion(); /* duplicate a region */ -void t1_KillRegion(); /* destroy a region */ -struct region *t1_BoxClip(); /* clip a region to a rectangle */ -struct edgelist *t1_SortSwath(); /* sort edges onto growing edge list */ -struct edgelist *t1_SwathUnion(); /* 'union' two edges into a swath */ -struct segment *t1_RegionBounds(); /* returns bounding box of a region */ -struct region *t1_CoerceRegion(); /* force text to become a true region */ -void t1_MoveEdges(); /* moves the edge values in a region */ -void t1_UnJumble(); /* sort the edges and reset the jumbled flag */ +typedef struct edgelist *(*SwathFunc)(struct edgelist *, struct edgelist *); + +/* get longer edge list for stepping */ +extern void t1_MoreWorkArea ( struct region *R, fractpel x1, fractpel y1, + fractpel x2, fractpel y2 ); +/* duplicate a region */ +extern struct region *t1_CopyRegion ( struct region *area ); +/* destroy a region */ +extern void t1_KillRegion ( struct region *area ); +/* clip a region to a rectangle */ +extern struct region *t1_BoxClip ( struct region *R, pel xmin, pel ymin, + pel xmax, pel ymax ); +/* sort edges onto growing edge list */ +extern struct edgelist *t1_SortSwath ( struct edgelist *anchor, + struct edgelist *edge, + SwathFunc swathfcn ); +/* 'union' two edges into a swath */ +extern struct edgelist *t1_SwathUnion ( struct edgelist *before0, + struct edgelist *edge ); +/* returns bounding box of a region */ +extern struct segment *t1_RegionBounds ( struct region *R ); +#ifdef notdef +/* force text to become a true region */ +struct region *t1_CoerceRegion(struct textpath *tp); +#endif +/* moves the edge values in a region */ +extern void t1_MoveEdges ( struct region *R, fractpel dx, fractpel dy ); +/* sort the edges and reset the jumbled flag */ +extern void t1_UnJumble ( struct region *region ); + /*END SHARED*/ /*SHARED*/ @@ -95,9 +122,11 @@ void t1_UnJumble(); /* sort the edges and reset the jumbled flag */ else if (x2 > R->edgexmax) R->edgexmax = x2; \ } +#ifndef FONTMODULE #ifndef __sxg__ #include <limits.h> #endif +#endif #ifdef SHRT_MIN #define MINPEL SHRT_MIN #else @@ -122,6 +151,9 @@ to be made unique for that reason (i.e., references > 1). /*END SHARED*/ /*SHARED*/ +typedef void (*NewEdgeFunc)(struct region *, + fractpel, fractpel, fractpel, fractpel, int); + struct region { XOBJ_COMMON /* xobject common data define 3-26-91 PNM */ /* type = REGIONTYPE */ @@ -144,7 +176,7 @@ scratchpad areas used while the region is being built: struct edgelist *lastedge,*firstedge; /* last and first edges in subpath */ pel *edge; /* pointer to array of X values for edge */ fractpel edgeYstop; /* Y value where 'edges' array ends */ - void (*newedgefcn)(); /* function to use when building a new edge */ + NewEdgeFunc newedgefcn; /* function to use when building a new edge */ struct strokeinfo *strokeinfo; /* scratchpad info during stroking only */ } ; /* @@ -211,3 +243,8 @@ Interior() rule enumerations: #define CONTINUITY 0x80 /* can be added to above rules; e.g. WINDINGRULE+CONTINUITY */ /*END SHARED*/ + +/* dump a region structure */ +extern void t1_DumpArea ( struct region *area ); +/* dump a region's edge list */ +extern void t1_DumpEdges ( struct edgelist *edges ); diff --git a/src/Type1/scanfont.c b/src/Type1/scanfont.c index 71dd687..b8aff94 100644 --- a/src/Type1/scanfont.c +++ b/src/Type1/scanfont.c @@ -1,4 +1,4 @@ -/* $Xorg: scanfont.c,v 1.4 2000/12/01 16:26:25 steve Exp $ */ +/* $Xorg: scanfont.c,v 1.3 2000/08/17 19:46:32 cpqbld Exp $ */ /* Copyright International Business Machines,Corp. 1991 * All Rights Reserved * @@ -28,15 +28,55 @@ * SOFTWARE. */ /* Author: Katherine A. Hitchcock IBM Almaden Research Laboratory */ - +/* Copyright (c) 1994-1999 Silicon Graphics, Inc. All Rights Reserved. + * + * The contents of this file are subject to the CID Font Code Public Licence + * Version 1.0 (the "License"). You may not use this file except in compliance + * with the Licence. You may obtain a copy of the License at Silicon Graphics, + * Inc., attn: Legal Services, 2011 N. Shoreline Blvd., Mountain View, CA + * 94043 or at http://www.sgi.com/software/opensource/cid/license.html. + * + * Software distributed under the License is distributed on an "AS IS" basis. + * ALL WARRANTIES ARE DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED + * WARRANTIES OF MERCHANTABILITY, OF FITNESS FOR A PARTICULAR PURPOSE OR OF + * NON-INFRINGEMENT. See the License for the specific language governing + * rights and limitations under the License. + * + * The Original Software is CID font code that was developed by Silicon + * Graphics, Inc. + */ +/* $XFree86: xc/lib/font/Type1/scanfont.c,v 1.15 2001/07/25 15:04:55 dawes Exp $ */ + +#ifndef FONTMODULE #include <string.h> +#else +#include "Xdefs.h" /* Bool declaration */ +#include "Xmd.h" /* INT32 declaration */ +#include "xf86_ansic.h" +#endif #include "t1stdio.h" #include "util.h" #include "token.h" +#ifdef BUILDCID +#include "range.h" +#endif +#include "objects.h" +#include "spaces.h" #include "fontfcn.h" #include "blues.h" - +#ifdef BUILDCID +#define CID_BUFSIZE 80 + +extern psfont *FDArrayP; +static spacerange *spacerangeP; +static cidrange *notdefrangeP; +static cidrange *cidrangeP; +extern int FDArrayIndex; +static boolean CIDWantFontInfo; +static boolean InFDArray; +static psobj inputFile1; +#endif static int rc; static boolean InPrivateDict; @@ -60,357 +100,358 @@ typedef struct /* Builtin Standard Encoding */ } EncodingTable; static EncodingTable StdEnc[] = { - 040 , "space", - 041 , "exclam", - 042 , "quotedbl", - 043 , "numbersign", - 044 , "dollar", - 045 , "percent", - 046 , "ampersand", - 047 , "quoteright", - 050 , "parenleft", - 051 , "parenright", - 052 , "asterisk", - 053 , "plus", - 054 , "comma", - 055 , "hyphen", - 056 , "period", - 057 , "slash", - 060 , "zero", - 061 , "one", - 062 , "two", - 063 , "three", - 064 , "four", - 065 , "five", - 066 , "six", - 067 , "seven", - 070 , "eight", - 071 , "nine", - 072 , "colon", - 073 , "semicolon", - 074 , "less", - 075 , "equal", - 076 , "greater", - 077 , "question", - 0100 , "at", - 0101 , "A", - 0102 , "B", - 0103 , "C", - 0104 , "D", - 0105 , "E", - 0106 , "F", - 0107 , "G", - 0110 , "H", - 0111 , "I", - 0112 , "J", - 0113 , "K", - 0114 , "L", - 0115 , "M", - 0116 , "N", - 0117 , "O", - 0120 , "P", - 0121 , "Q", - 0122 , "R", - 0123 , "S", - 0124 , "T", - 0125 , "U", - 0126 , "V", - 0127 , "W", - 0130 , "X", - 0131 , "Y", - 0132 , "Z", - 0133 , "bracketleft", - 0134 , "backslash", - 0135 , "bracketright", - 0136 , "asciicircum", - 0137 , "underscore", - 0140 , "quoteleft", - 0141 , "a", - 0142 , "b", - 0143 , "c", - 0144 , "d", - 0145 , "e", - 0146 , "f", - 0147 , "g", - 0150 , "h", - 0151 , "i", - 0152 , "j", - 0153 , "k", - 0154 , "l", - 0155 , "m", - 0156 , "n", - 0157 , "o", - 0160 , "p", - 0161 , "q", - 0162 , "r", - 0163 , "s", - 0164 , "t", - 0165 , "u", - 0166 , "v", - 0167 , "w", - 0170 , "x", - 0171 , "y", - 0172 , "z", - 0173 , "braceleft", - 0174 , "bar", - 0175 , "braceright", - 0176 , "asciitilde", - 0241 , "exclamdown", - 0242 , "cent", - 0243 , "sterling", - 0244 , "fraction", - 0245 , "yen", - 0246 , "florin", - 0247 , "section", - 0250 , "currency", - 0251 , "quotesingle", - 0252 , "quotedblleft", - 0253 , "guillemotleft", - 0254 , "guilsinglleft", - 0255 , "guilsinglright", - 0256 , "fi", - 0257 , "fl", - 0261 , "endash", - 0262 , "dagger", - 0263 , "daggerdbl", - 0264 , "periodcentered", - 0266 , "paragraph", - 0267 , "bullet", - 0270 , "quotesinglbase", - 0271 , "quotedblbase", - 0272 , "quotedblright", - 0273 , "guillemotright", - 0274 , "ellipsis", - 0275 , "perthousand", - 0277 , "questiondown", - 0301 , "grave", - 0302 , "acute", - 0303 , "circumflex", - 0304 , "tilde", - 0305 , "macron", - 0306 , "breve", - 0307 , "dotaccent", - 0310 , "dieresis", - 0312 , "ring", - 0313 , "cedilla", - 0315 , "hungarumlaut", - 0316 , "ogonek", - 0317 , "caron", - 0320 , "emdash", - 0341 , "AE", - 0343 , "ordfeminine", - 0350 , "Lslash", - 0351 , "Oslash", - 0352 , "OE", - 0353 , "ordmasculine", - 0361 , "ae", - 0365 , "dotlessi", - 0370 , "lslash", - 0371 , "oslash", - 0372 , "oe", - 0373 , "germandbls", - 0, 0 + { 040 , "space" }, + { 041 , "exclam" }, + { 042 , "quotedbl" }, + { 043 , "numbersign" }, + { 044 , "dollar" }, + { 045 , "percent" }, + { 046 , "ampersand" }, + { 047 , "quoteright" }, + { 050 , "parenleft" }, + { 051 , "parenright" }, + { 052 , "asterisk" }, + { 053 , "plus" }, + { 054 , "comma" }, + { 055 , "hyphen" }, + { 056 , "period" }, + { 057 , "slash" }, + { 060 , "zero" }, + { 061 , "one" }, + { 062 , "two" }, + { 063 , "three" }, + { 064 , "four" }, + { 065 , "five" }, + { 066 , "six" }, + { 067 , "seven" }, + { 070 , "eight" }, + { 071 , "nine" }, + { 072 , "colon" }, + { 073 , "semicolon" }, + { 074 , "less" }, + { 075 , "equal" }, + { 076 , "greater" }, + { 077 , "question" }, + { 0100 , "at" }, + { 0101 , "A" }, + { 0102 , "B" }, + { 0103 , "C" }, + { 0104 , "D" }, + { 0105 , "E" }, + { 0106 , "F" }, + { 0107 , "G" }, + { 0110 , "H" }, + { 0111 , "I" }, + { 0112 , "J" }, + { 0113 , "K" }, + { 0114 , "L" }, + { 0115 , "M" }, + { 0116 , "N" }, + { 0117 , "O" }, + { 0120 , "P" }, + { 0121 , "Q" }, + { 0122 , "R" }, + { 0123 , "S" }, + { 0124 , "T" }, + { 0125 , "U" }, + { 0126 , "V" }, + { 0127 , "W" }, + { 0130 , "X" }, + { 0131 , "Y" }, + { 0132 , "Z" }, + { 0133 , "bracketleft" }, + { 0134 , "backslash" }, + { 0135 , "bracketright" }, + { 0136 , "asciicircum" }, + { 0137 , "underscore" }, + { 0140 , "quoteleft" }, + { 0141 , "a" }, + { 0142 , "b" }, + { 0143 , "c" }, + { 0144 , "d" }, + { 0145 , "e" }, + { 0146 , "f" }, + { 0147 , "g" }, + { 0150 , "h" }, + { 0151 , "i" }, + { 0152 , "j" }, + { 0153 , "k" }, + { 0154 , "l" }, + { 0155 , "m" }, + { 0156 , "n" }, + { 0157 , "o" }, + { 0160 , "p" }, + { 0161 , "q" }, + { 0162 , "r" }, + { 0163 , "s" }, + { 0164 , "t" }, + { 0165 , "u" }, + { 0166 , "v" }, + { 0167 , "w" }, + { 0170 , "x" }, + { 0171 , "y" }, + { 0172 , "z" }, + { 0173 , "braceleft" }, + { 0174 , "bar" }, + { 0175 , "braceright" }, + { 0176 , "asciitilde" }, + { 0241 , "exclamdown" }, + { 0242 , "cent" }, + { 0243 , "sterling" }, + { 0244 , "fraction" }, + { 0245 , "yen" }, + { 0246 , "florin" }, + { 0247 , "section" }, + { 0250 , "currency" }, + { 0251 , "quotesingle" }, + { 0252 , "quotedblleft" }, + { 0253 , "guillemotleft" }, + { 0254 , "guilsinglleft" }, + { 0255 , "guilsinglright" }, + { 0256 , "fi" }, + { 0257 , "fl" }, + { 0261 , "endash" }, + { 0262 , "dagger" }, + { 0263 , "daggerdbl" }, + { 0264 , "periodcentered" }, + { 0266 , "paragraph" }, + { 0267 , "bullet" }, + { 0270 , "quotesinglbase" }, + { 0271 , "quotedblbase" }, + { 0272 , "quotedblright" }, + { 0273 , "guillemotright" }, + { 0274 , "ellipsis" }, + { 0275 , "perthousand" }, + { 0277 , "questiondown" }, + { 0301 , "grave" }, + { 0302 , "acute" }, + { 0303 , "circumflex" }, + { 0304 , "tilde" }, + { 0305 , "macron" }, + { 0306 , "breve" }, + { 0307 , "dotaccent" }, + { 0310 , "dieresis" }, + { 0312 , "ring" }, + { 0313 , "cedilla" }, + { 0315 , "hungarumlaut" }, + { 0316 , "ogonek" }, + { 0317 , "caron" }, + { 0320 , "emdash" }, + { 0341 , "AE" }, + { 0343 , "ordfeminine" }, + { 0350 , "Lslash" }, + { 0351 , "Oslash" }, + { 0352 , "OE" }, + { 0353 , "ordmasculine" }, + { 0361 , "ae" }, + { 0365 , "dotlessi" }, + { 0370 , "lslash" }, + { 0371 , "oslash" }, + { 0372 , "oe" }, + { 0373 , "germandbls" }, + { 0, 0 } }; static EncodingTable ISO8859Enc[] = { - 32, "space", - 33, "exclam", - 34, "quotedbl", - 35, "numbersign", - 36, "dollar", - 37, "percent", - 38, "ampersand", - 39, "quoteright", - 40, "parenleft", - 41, "parenright", - 42, "asterisk", - 43, "plus", - 44, "comma", - 45, "minus", - 46, "period", - 47, "slash", - 48, "zero", - 49, "one", - 50, "two", - 51, "three", - 52, "four", - 53, "five", - 54, "six", - 55, "seven", - 56, "eight", - 57, "nine", - 58, "colon", - 59, "semicolon", - 60, "less", - 61, "equal", - 62, "greater", - 63, "question", - 64, "at", - 65, "A", - 66, "B", - 67, "C", - 68, "D", - 69, "E", - 70, "F", - 71, "G", - 72, "H", - 73, "I", - 74, "J", - 75, "K", - 76, "L", - 77, "M", - 78, "N", - 79, "O", - 80, "P", - 81, "Q", - 82, "R", - 83, "S", - 84, "T", - 85, "U", - 86, "V", - 87, "W", - 88, "X", - 89, "Y", - 90, "Z", - 91, "bracketleft", - 92, "backslash", - 93, "bracketright", - 94, "asciicircum", - 95, "underscore", - 96, "quoteleft", - 97, "a", - 98, "b", - 99, "c", - 100, "d", - 101, "e", - 102, "f", - 103, "g", - 104, "h", - 105, "i", - 106, "j", - 107, "k", - 108, "l", - 109, "m", - 110, "n", - 111, "o", - 112, "p", - 113, "q", - 114, "r", - 115, "s", - 116, "t", - 117, "u", - 118, "v", - 119, "w", - 120, "x", - 121, "y", - 122, "z", - 123, "braceleft", - 124, "bar", - 125, "braceright", - 126, "asciitilde", - 161, "exclamdown", - 162, "cent", - 163, "sterling", - 164, "currency", - 165, "yen", - 166, "brokenbar", - 167, "section", - 168, "dieresis", - 169, "copyright", - 170, "ordfeminine", - 171, "guillemotleft", - 172, "logicalnot", - 173, "hyphen", - 174, "registered", - 175, "macron", - 176, "degree", - 177, "plusminus", - 178, "twosuperior", - 179, "threesuperior", - 180, "acute", - 181, "mu", - 182, "paragraph", - 183, "periodcentered", - 184, "cedilla", - 185, "onesuperior", - 186, "ordmasculine", - 187, "guillemotright", - 188, "onequarter", - 189, "onehalf", - 190, "threequarters", - 191, "questiondown", - 192, "Agrave", - 193, "Aacute", - 194, "Acircumflex", - 195, "Atilde", - 196, "Adieresis", - 197, "Aring", - 198, "AE", - 199, "Ccedilla", - 200, "Egrave", - 201, "Eacute", - 202, "Ecircumflex", - 203, "Edieresis", - 204, "Igrave", - 205, "Iacute", - 206, "Icircumflex", - 207, "Idieresis", - 208, "Eth", - 209, "Ntilde", - 210, "Ograve", - 211, "Oacute", - 212, "Ocircumflex", - 213, "Otilde", - 214, "Odieresis", - 215, "multiply", - 216, "Oslash", - 217, "Ugrave", - 218, "Uacute", - 219, "Ucircumflex", - 220, "Udieresis", - 221, "Yacute", - 222, "Thorn", - 223, "germandbls", - 224, "agrave", - 225, "aacute", - 226, "acircumflex", - 227, "atilde", - 228, "adieresis", - 229, "aring", - 230, "ae", - 231, "ccedilla", - 232, "egrave", - 233, "eacute", - 234, "ecircumflex", - 235, "edieresis", - 236, "igrave", - 237, "iacute", - 238, "icircumflex", - 239, "idieresis", - 240, "eth", - 241, "ntilde", - 242, "ograve", - 243, "oacute", - 244, "ocircumflex", - 245, "otilde", - 246, "odieresis", - 247, "divide", - 248, "oslash", - 249, "ugrave", - 250, "uacute", - 251, "ucircumflex", - 252, "udieresis", - 253, "yacute", - 254, "thorn", - 255, "ydieresis", - 0, 0 + { 32, "space" }, + { 33, "exclam" }, + { 34, "quotedbl" }, + { 35, "numbersign" }, + { 36, "dollar" }, + { 37, "percent" }, + { 38, "ampersand" }, + { 39, "quoteright" }, + { 40, "parenleft" }, + { 41, "parenright" }, + { 42, "asterisk" }, + { 43, "plus" }, + { 44, "comma" }, + { 45, "minus" }, + { 46, "period" }, + { 47, "slash" }, + { 48, "zero" }, + { 49, "one" }, + { 50, "two" }, + { 51, "three" }, + { 52, "four" }, + { 53, "five" }, + { 54, "six" }, + { 55, "seven" }, + { 56, "eight" }, + { 57, "nine" }, + { 58, "colon" }, + { 59, "semicolon" }, + { 60, "less" }, + { 61, "equal" }, + { 62, "greater" }, + { 63, "question" }, + { 64, "at" }, + { 65, "A" }, + { 66, "B" }, + { 67, "C" }, + { 68, "D" }, + { 69, "E" }, + { 70, "F" }, + { 71, "G" }, + { 72, "H" }, + { 73, "I" }, + { 74, "J" }, + { 75, "K" }, + { 76, "L" }, + { 77, "M" }, + { 78, "N" }, + { 79, "O" }, + { 80, "P" }, + { 81, "Q" }, + { 82, "R" }, + { 83, "S" }, + { 84, "T" }, + { 85, "U" }, + { 86, "V" }, + { 87, "W" }, + { 88, "X" }, + { 89, "Y" }, + { 90, "Z" }, + { 91, "bracketleft" }, + { 92, "backslash" }, + { 93, "bracketright" }, + { 94, "asciicircum" }, + { 95, "underscore" }, + { 96, "quoteleft" }, + { 97, "a" }, + { 98, "b" }, + { 99, "c" }, + { 100, "d" }, + { 101, "e" }, + { 102, "f" }, + { 103, "g" }, + { 104, "h" }, + { 105, "i" }, + { 106, "j" }, + { 107, "k" }, + { 108, "l" }, + { 109, "m" }, + { 110, "n" }, + { 111, "o" }, + { 112, "p" }, + { 113, "q" }, + { 114, "r" }, + { 115, "s" }, + { 116, "t" }, + { 117, "u" }, + { 118, "v" }, + { 119, "w" }, + { 120, "x" }, + { 121, "y" }, + { 122, "z" }, + { 123, "braceleft" }, + { 124, "bar" }, + { 125, "braceright" }, + { 126, "asciitilde" }, + { 160, "space" }, + { 161, "exclamdown" }, + { 162, "cent" }, + { 163, "sterling" }, + { 164, "currency" }, + { 165, "yen" }, + { 166, "brokenbar" }, + { 167, "section" }, + { 168, "dieresis" }, + { 169, "copyright" }, + { 170, "ordfeminine" }, + { 171, "guillemotleft" }, + { 172, "logicalnot" }, + { 173, "hyphen" }, + { 174, "registered" }, + { 175, "macron" }, + { 176, "degree" }, + { 177, "plusminus" }, + { 178, "twosuperior" }, + { 179, "threesuperior" }, + { 180, "acute" }, + { 181, "mu" }, + { 182, "paragraph" }, + { 183, "periodcentered" }, + { 184, "cedilla" }, + { 185, "onesuperior" }, + { 186, "ordmasculine" }, + { 187, "guillemotright" }, + { 188, "onequarter" }, + { 189, "onehalf" }, + { 190, "threequarters" }, + { 191, "questiondown" }, + { 192, "Agrave" }, + { 193, "Aacute" }, + { 194, "Acircumflex" }, + { 195, "Atilde" }, + { 196, "Adieresis" }, + { 197, "Aring" }, + { 198, "AE" }, + { 199, "Ccedilla" }, + { 200, "Egrave" }, + { 201, "Eacute" }, + { 202, "Ecircumflex" }, + { 203, "Edieresis" }, + { 204, "Igrave" }, + { 205, "Iacute" }, + { 206, "Icircumflex" }, + { 207, "Idieresis" }, + { 208, "Eth" }, + { 209, "Ntilde" }, + { 210, "Ograve" }, + { 211, "Oacute" }, + { 212, "Ocircumflex" }, + { 213, "Otilde" }, + { 214, "Odieresis" }, + { 215, "multiply" }, + { 216, "Oslash" }, + { 217, "Ugrave" }, + { 218, "Uacute" }, + { 219, "Ucircumflex" }, + { 220, "Udieresis" }, + { 221, "Yacute" }, + { 222, "Thorn" }, + { 223, "germandbls" }, + { 224, "agrave" }, + { 225, "aacute" }, + { 226, "acircumflex" }, + { 227, "atilde" }, + { 228, "adieresis" }, + { 229, "aring" }, + { 230, "ae" }, + { 231, "ccedilla" }, + { 232, "egrave" }, + { 233, "eacute" }, + { 234, "ecircumflex" }, + { 235, "edieresis" }, + { 236, "igrave" }, + { 237, "iacute" }, + { 238, "icircumflex" }, + { 239, "idieresis" }, + { 240, "eth" }, + { 241, "ntilde" }, + { 242, "ograve" }, + { 243, "oacute" }, + { 244, "ocircumflex" }, + { 245, "otilde" }, + { 246, "odieresis" }, + { 247, "divide" }, + { 248, "oslash" }, + { 249, "ugrave" }, + { 250, "uacute" }, + { 251, "ucircumflex" }, + { 252, "udieresis" }, + { 253, "yacute" }, + { 254, "thorn" }, + { 255, "ydieresis" }, + { 0, 0 } }; static psobj *StdEncArrayP = NULL; psobj *ISOLatin1EncArrayP = NULL; -static psobj *MakeEncodingArrayP(encodingTable) - EncodingTable *encodingTable; +static psobj * +MakeEncodingArrayP(EncodingTable *encodingTable) { int i; psobj *encodingArrayP; @@ -433,7 +474,8 @@ static psobj *MakeEncodingArrayP(encodingTable) return(encodingArrayP); } -boolean Init_BuiltInEncoding() +boolean +Init_BuiltInEncoding(void) { StdEncArrayP = MakeEncodingArrayP(StdEnc); ISOLatin1EncArrayP = MakeEncodingArrayP(ISO8859Enc); @@ -442,8 +484,8 @@ boolean Init_BuiltInEncoding() /********************************************************************/ /***================================================================***/ -static int getNextValue(valueType) - int valueType; +static int +getNextValue(int valueType) { scan_token(inputP); if (tokenType != valueType) { @@ -455,7 +497,8 @@ static int getNextValue(valueType) /***================================================================***/ /* This routine will set the global rc if there is an error */ /***================================================================***/ -static int getInt() +static int +getInt(void) { scan_token(inputP); if (tokenType != TOKEN_INTEGER) { @@ -472,23 +515,16 @@ static int getInt() * See Sec 10.3 of ``Adobe Type 1 Font Format'' v1.1, * for parsing Encoding. */ -static int getEncoding(arrayP) - psobj *arrayP; +static int +getEncoding(psobj *arrayP) { - scan_token(inputP); - if ((tokenType == TOKEN_NAME) - && - (((tokenLength==16) && (!strncmp(tokenStartP,"StandardEncoding",16))) || - (((tokenLength==17) && (!strncmp(tokenStartP,"ISOLatin1Encoding",17)))))) + if ((tokenType == TOKEN_NAME && (tokenLength==16 || tokenLength==17))) { - /* Adobe Standard Encoding */ - - if (tokenLength == 16) - arrayP->data.valueP = (char *) StdEncArrayP; - else - arrayP->data.valueP = (char *) ISOLatin1EncArrayP; - + if((tokenLength==16) && (!strncmp(tokenStartP,"StandardEncoding",16))) + arrayP->data.valueP = (char *) StdEncArrayP; + else + arrayP->data.valueP = (char *) ISOLatin1EncArrayP; arrayP->len = 256; return(SCAN_OK); } @@ -586,45 +622,92 @@ static int getEncoding(arrayP) return (SCAN_ERROR); } /***================================================================***/ -static int getArray(arrayP) - psobj *arrayP; +#ifdef BUILDCID +static int +getFDArray(psobj *arrayP) +{ + int rc; + + /* get the number of items in the FDArray */ + scan_token(inputP); + if (tokenType == TOKEN_INTEGER) { + /* an FD array must contain at least one element */ + if (tokenValue.integer <= 0) + return(SCAN_ERROR); + arrayP->len = tokenValue.integer; + } else + return(SCAN_ERROR); + + /* get the token "array" */ + scan_token(inputP); + if (tokenType != TOKEN_NAME || strncmp(tokenStartP, "array", 5) != 0) + return(SCAN_ERROR); + + /* format the array in memory, save pointer to the beginning */ + arrayP->data.valueP = tokenStartP; + + /* allocate FDArray */ + FDArrayP = (psfont *)vm_alloc(arrayP->len*(sizeof(psfont))); + if (!(FDArrayP)) return(SCAN_OUT_OF_MEMORY); + + /* get a specified number of font dictionaries */ + for (FDArrayIndex = 0; FDArrayIndex < arrayP->len; FDArrayIndex++) { + /* get "dup" */ + scan_token(inputP); + if (tokenType != TOKEN_NAME || strncmp(tokenStartP, "dup", 3) != 0) + return(SCAN_ERROR); + /* get an integer digit */ + scan_token(inputP); + if (tokenType != TOKEN_INTEGER) + return(SCAN_ERROR); + + /* read a CID version of a Type 1 font */ + if (!CIDType1fontfcnA(&rc)) + return(rc); + + /* get "put" */ + scan_token(inputP); + if (tokenType != TOKEN_NAME || strncmp(tokenStartP, "put", 3) != 0) + return(SCAN_ERROR); + } + return(SCAN_OK); +} +#endif + +static int +getArray(psobj *arrayP) { int N; /* count the items in the array */ psobj *objP; - int scanning; - char *tmp; /* If some font file has /foo/foo, - * e.g. ftp://ftp.cdrom.com/pub/os2/fonts/future.zip - * we will treat it as /foo. - */ - if (!(tmp = strdup(tokenStartP))) - return(SCAN_OUT_OF_MEMORY); - - scanning = 1; - while (scanning == 1) { + /* That is totally a kludge. If some stupid font file has + * /foo/foo # ftp://ftp.cdrom.com/pub/os2/fonts/future.zip + * we will treat it as /foo. + * H.J. */ + char tmp [1024]; + + strncpy (tmp, tokenStartP, sizeof (tmp)); + tmp [sizeof (tmp) - 1] = '\0'; + +restart: scan_token(inputP); switch (tokenType) { - case TOKEN_LEFT_BRACE: - case TOKEN_LEFT_BRACKET: - scanning = 0; - break; - - case TOKEN_LITERAL_NAME: - tokenStartP[tokenLength] = '\0'; - if (strcmp (tokenStartP, tmp) == 0) { - /* Ok, if we see /foo/foo, let's go back to the top of the loop, - * otherwise drop out of the loop. */ - continue; - } + case TOKEN_LEFT_BRACE: + case TOKEN_LEFT_BRACKET: + break; - default: - free(tmp); - return(SCAN_ERROR); - } - } - free(tmp); + case TOKEN_LITERAL_NAME: + tokenStartP[tokenLength] = '\0'; + if (strcmp (tokenStartP, tmp) == 0) + { + /* Ok, We see /foo/foo. Let's restart. */ + goto restart; + } + default: + return(SCAN_ERROR); + } /* format the array in memory, save pointer to the beginning */ arrayP->data.valueP = tokenStartP; /* loop, picking up next object, until right BRACE or BRACKET */ @@ -655,8 +738,8 @@ static int getArray(arrayP) /* NOTREACHED*/ } /***================================================================***/ -static int getName(nameP) - char *nameP; +static int +getName(char *nameP) { do { scan_token(inputP); @@ -670,8 +753,8 @@ static int getName(nameP) return(SCAN_OK); } /***================================================================***/ -static int getNbytes(N) - int N; +static int +getNbytes(int N) { int I; @@ -693,8 +776,8 @@ static int getNbytes(N) /* It means that the CharStrings does not have as many characters */ /* as the dictionary said it would and that is ok. */ /***================================================================***/ -static int getLiteralName(nameObjP) - psobj *nameObjP; +static int +getLiteralName(psobj *nameObjP) { do { scan_token(inputP); @@ -722,8 +805,8 @@ static int getLiteralName(nameObjP) */ /***================================================================***/ -static int BuildSubrs(FontP) - psfont *FontP; +static int +BuildSubrs(psfont *FontP) { int N; /* number of values in Subrs */ int I; /* index into Subrs */ @@ -797,8 +880,8 @@ static int BuildSubrs(FontP) */ /***================================================================***/ -static int BuildCharStrings(FontP) - psfont *FontP; +static int +BuildCharStrings(psfont *FontP) { int N; /* number of values in CharStrings */ int i; /* loop thru Subrs */ @@ -852,13 +935,104 @@ static int BuildCharStrings(FontP) } /***================================================================***/ +#ifdef BUILDCID +/***================================================================***/ +/* + * BuildCIDFontInfo Dictionary + */ +/***================================================================***/ +static int +BuildCIDFontInfo(cidfont *CIDfontP) +{ + psdict *dictP; + + /* allocate the private dictionary (max number of entries + 1) */ + dictP = (psdict *)vm_alloc(20*sizeof(psdict)); + if (!(dictP)) return(SCAN_OUT_OF_MEMORY); + + CIDfontP->CIDfontInfoP = dictP; + CIDfontP->CIDfontInfoP[0].key.len = 18; /* number of actual entries */ + objFormatName(&(dictP[CIDCOUNT].key),8,"CIDCount"); + objFormatInteger(&(dictP[CIDCOUNT].value),-1); + objFormatName(&(dictP[CIDFONTNAME].key),11,"CIDFontName"); + objFormatName(&(dictP[CIDFONTNAME].value),0,NULL); + objFormatName(&(dictP[CIDFONTTYPE].key),11,"CIDFontType"); + objFormatInteger(&(dictP[CIDFONTTYPE].value),-1); + objFormatName(&(dictP[CIDVERSION].key),14,"CIDFontVersion"); + objFormatInteger(&(dictP[CIDVERSION].value),-1); + objFormatName(&(dictP[CIDREGISTRY].key),8,"Registry"); + objFormatString(&(dictP[CIDREGISTRY].value),0,NULL); + objFormatName(&(dictP[CIDORDERING].key),8,"Ordering"); + objFormatString(&(dictP[CIDORDERING].value),0,NULL); + objFormatName(&(dictP[CIDSUPPLEMENT].key),10,"Supplement"); + objFormatInteger(&(dictP[CIDSUPPLEMENT].value),-1); + objFormatName(&(dictP[CIDMAPOFFSET].key),12,"CIDMapOffset"); + objFormatInteger(&(dictP[CIDMAPOFFSET].value),-1); + objFormatName(&(dictP[CIDFDARRAY].key),7,"FDArray"); + objFormatArray(&(dictP[CIDFDARRAY].value),0,NULL); + objFormatName(&(dictP[CIDFDBYTES].key),7,"FDBytes"); + objFormatInteger(&(dictP[CIDFDBYTES].value),-1); + objFormatName(&(dictP[CIDFONTBBOX].key),8,"FontBBox"); + objFormatArray(&(dictP[CIDFONTBBOX].value),0,NULL); + objFormatName(&(dictP[CIDFULLNAME].key),8,"FullName"); + objFormatString(&(dictP[CIDFULLNAME].value),0,NULL); + objFormatName(&(dictP[CIDFAMILYNAME].key),10,"FamilyName"); + objFormatString(&(dictP[CIDFAMILYNAME].value),0,NULL); + objFormatName(&(dictP[CIDWEIGHT].key),6,"Weight"); + objFormatString(&(dictP[CIDWEIGHT].value),0,NULL); + objFormatName(&(dictP[CIDNOTICE].key),6,"Notice"); + objFormatString(&(dictP[CIDNOTICE].value),0,NULL); + objFormatName(&(dictP[CIDGDBYTES].key),7,"GDBytes"); + objFormatInteger(&(dictP[CIDGDBYTES].value),-1); + objFormatName(&(dictP[CIDUIDBASE].key),7,"UIDBase"); + objFormatInteger(&(dictP[CIDUIDBASE].value),0); + objFormatName(&(dictP[CIDXUID].key),4,"XUID"); + objFormatInteger(&(dictP[CIDXUID].value),0); + return(SCAN_OK); +} +/***================================================================***/ +/* + * BuildCMapInfo Dictionary + */ +/***================================================================***/ +static int +BuildCMapInfo(cmapres *CMapP) +{ + psdict *dictP; + + /* allocate the private dictionary (max number of entries + 1) */ + dictP = (psdict *)vm_alloc(20*sizeof(psdict)); + if (!(dictP)) return(SCAN_OUT_OF_MEMORY); + + CMapP->CMapInfoP = dictP; + CMapP->CMapInfoP[0].key.len = 8; /* number of actual entries */ + objFormatName(&(dictP[CMAPREGISTRY].key),8,"Registry"); + objFormatString(&(dictP[CMAPREGISTRY].value),0,NULL); + objFormatName(&(dictP[CMAPORDERING].key),8,"Ordering"); + objFormatString(&(dictP[CMAPORDERING].value),0,NULL); + objFormatName(&(dictP[CMAPSUPPLEMENT].key),10,"Supplement"); + objFormatInteger(&(dictP[CMAPSUPPLEMENT].value),-1); + objFormatName(&(dictP[CMAPNAME].key),8,"CMapName"); + objFormatString(&(dictP[CMAPNAME].value),0,NULL); + objFormatName(&(dictP[CMAPVERSION].key),11,"CMapVersion"); + objFormatInteger(&(dictP[CMAPVERSION].value),-1); + objFormatName(&(dictP[CMAPTYPE].key),8,"CMapType"); + objFormatInteger(&(dictP[CMAPTYPE].value),-1); + objFormatName(&(dictP[CMAPWMODE].key),5,"WMode"); + objFormatInteger(&(dictP[CMAPWMODE].value),-1); + objFormatName(&(dictP[CMAPCIDCOUNT].key),8,"CIDCount"); + objFormatInteger(&(dictP[CMAPCIDCOUNT].value),-1); + return(SCAN_OK); +} +#endif + /***================================================================***/ /* * BuildFontInfo Dictionary */ /***================================================================***/ -static int BuildFontInfo(fontP) - psfont *fontP; +static int +BuildFontInfo(psfont *fontP) { psdict *dictP; @@ -904,13 +1078,77 @@ static int BuildFontInfo(fontP) objFormatReal(&(dictP[UNDERLINETHICKNESS].value),0.0); return(SCAN_OK); } +#ifdef BUILDCID +/***================================================================***/ +/* + * BuildCIDType1Private Dictionary + */ +/***================================================================***/ +static int +BuildCIDType1Private(psfont *fontP) +{ + psdict *Private; + + /* allocate the private dictionary */ + Private = (psdict *)vm_alloc(21*sizeof(psdict)); + + if (!(Private)) return(SCAN_OUT_OF_MEMORY); + + fontP->Private = Private; + fontP->Private[0].key.len = 20; /* number of actual entries */ + + objFormatName(&(Private[CIDT1MINFEATURE].key),10,"MinFeature"); + objFormatArray(&(Private[CIDT1MINFEATURE].value),0,NULL); + objFormatName(&(Private[CIDT1LENIV].key),5,"lenIV"); + objFormatInteger(&(Private[CIDT1LENIV].value),DEFAULTLENIV); + objFormatName(&(Private[CIDT1LANGGROUP].key),13,"LanguageGroup"); + objFormatInteger(&(Private[CIDT1LANGGROUP].value),DEFAULTLANGUAGEGROUP); + objFormatName(&(Private[CIDT1BLUEVALUES].key),10,"BlueValues"); + objFormatArray(&(Private[CIDT1BLUEVALUES].value),0,NULL); + objFormatName(&(Private[CIDT1OTHERBLUES].key),10,"OtherBlues"); + objFormatArray(&(Private[CIDT1OTHERBLUES].value),0,NULL); + objFormatName(&(Private[CIDT1BLUESCALE].key),9,"BlueScale"); + objFormatReal(&(Private[CIDT1BLUESCALE].value),DEFAULTBLUESCALE); + objFormatName(&(Private[CIDT1BLUEFUZZ].key),8,"BlueFuzz"); + objFormatInteger(&(Private[CIDT1BLUEFUZZ].value),DEFAULTBLUEFUZZ); + objFormatName(&(Private[CIDT1BLUESHIFT].key),9,"BlueShift"); + objFormatInteger(&(Private[CIDT1BLUESHIFT].value),DEFAULTBLUESHIFT); + objFormatName(&(Private[CIDT1FAMBLUES].key),11,"FamilyBlues"); + objFormatArray(&(Private[CIDT1FAMBLUES].value),0,NULL); + objFormatName(&(Private[CIDT1FAMOTHERBLUES].key),16,"FamilyOtherBlues"); + objFormatArray(&(Private[CIDT1FAMOTHERBLUES].value),0,NULL); + objFormatName(&(Private[CIDT1STDHW].key),5,"StdHW"); + objFormatArray(&(Private[CIDT1STDHW].value),0,NULL); + objFormatName(&(Private[CIDT1STDVW].key),5,"StdVW"); + objFormatArray(&(Private[CIDT1STDVW].value),0,NULL); + objFormatName(&(Private[CIDT1STEMSNAPH].key),9,"StemSnapH"); + objFormatArray(&(Private[CIDT1STEMSNAPH].value),0,NULL); + objFormatName(&(Private[CIDT1STEMSNAPV].key),9,"StemSnapV"); + objFormatArray(&(Private[CIDT1STEMSNAPV].value),0,NULL); + /* skip password */ + objFormatName(&(Private[CIDT1SUBMAPOFF].key),13,"SubrMapOffset"); + objFormatInteger(&(Private[CIDT1SUBMAPOFF].value),0); + objFormatName(&(Private[CIDT1SDBYTES].key),7,"SDBytes"); + objFormatInteger(&(Private[CIDT1SDBYTES].value),0); + objFormatName(&(Private[CIDT1SUBRCNT].key),9,"SubrCount"); + objFormatInteger(&(Private[CIDT1SUBRCNT].value),0); + objFormatName(&(Private[CIDT1FORCEBOLD].key),9,"ForceBold"); + objFormatBoolean(&(Private[CIDT1FORCEBOLD].value),DEFAULTFORCEBOLD); + objFormatName(&(Private[CIDT1RNDSTEMUP].key),9,"RndStemUp"); + objFormatBoolean(&(Private[CIDT1RNDSTEMUP].value),DEFAULTRNDSTEMUP); + objFormatName(&(Private[CIDT1EXPFACTOR].key),15,"ExpansionFactor"); + objFormatReal(&(Private[CIDT1EXPFACTOR].value), + DEFAULTEXPANSIONFACTOR); + return(SCAN_OK); +} +#endif /***================================================================***/ /* * BuildPrivate Dictionary */ /***================================================================***/ -static int BuildPrivate(fontP) - psfont *fontP; +static int +BuildPrivate(psfont *fontP) { psdict *Private; @@ -968,8 +1206,8 @@ static int BuildPrivate(fontP) /* */ /* */ /**********************************************************************/ -static int GetType1Blues(fontP) - psfont *fontP; +static int +GetType1Blues(psfont *fontP) { psdict *PrivateDictP; /* the Private dict relating to hints */ struct blues_struct *blues; /* ptr for the blues struct we will allocate */ @@ -1238,9 +1476,8 @@ static int GetType1Blues(fontP) /* */ /* Returns a psobj (string) */ /**********************************************************************/ -psobj *GetType1CharString(fontP, code) -psfont *fontP; -unsigned char code; +psobj * +GetType1CharString(psfont *fontP, unsigned char code) { int N; /* the 'Nth' entry in the CharStrings */ psobj *charnameP; /* points to psobj that is name of character*/ @@ -1282,8 +1519,8 @@ unsigned char code; */ /***================================================================***/ -static int FindDictValue(dictP) - psdict *dictP; +static int +FindDictValue(psdict *dictP) { psobj LitName; int N; @@ -1303,7 +1540,14 @@ static int FindDictValue(dictP) if ( V != SCAN_OK ) return(V); break; case OBJ_ARRAY: +#ifdef BUILDCID + if (0 == strncmp(tokenStartP,"FDArray",7)) + V = getFDArray(&(dictP[N].value)); + else + V = getArray(&(dictP[N].value)); +#else V = getArray(&(dictP[N].value)); +#endif if ( V != SCAN_OK ) return(V); break; case OBJ_INTEGER: @@ -1359,15 +1603,605 @@ static int FindDictValue(dictP) } /***================================================================***/ - + +#ifdef BUILDCID +/* + * ------------------------------------------------------------------- + * Scan the next token and convert it into an object + * Result is placed on the Operand Stack as next object + * ------------------------------------------------------------------- + */ +int +scan_cidfont(cidfont *CIDFontP, cmapres *CMapP) +{ + char filename[CID_PATH_MAX]; + char cmapfile[CID_PATH_MAX]; + char buf[CID_BUFSIZE]; + char filetype[3]; + FILE *fileP; + FILE *fileP1; + char *nameP; + char *p; + int namelen; + int i, j; + int cread, rangecnt; + unsigned int char_row, char_col; + + InFDArray = FALSE; + + filetype[0] = 'r'; + filetype[1] = 'b'; + filetype[2] = '\0'; + + /* copy the filename and remove leading or trailing blanks */ + /* point to name and search for leading blanks */ + nameP= CIDFontP->CIDFontFileName.data.nameP; + namelen = CIDFontP->CIDFontFileName.len; + while (nameP[0] == ' ') { + nameP++; + namelen--; + } + /* now remove any trailing blanks */ + while ((namelen>0) && ( nameP[namelen-1] == ' ')) { + namelen--; + } + strncpy(filename,nameP,namelen); + filename[namelen] = '\0'; + /* file name is now constructed */ + inputFile.data.fileP = NULL; + filterFile.data.fileP = NULL; + + /* check whether a CIDFont file */ + if ((fileP = fopen(filename,filetype))) { + cread = fread(buf, 1, CID_BUFSIZE, fileP); + fclose(fileP); + if (cread > 17) { + if (strncmp(buf, "%!", 2) || + (p = strstr(buf, "Resource-CIDFont")) == NULL) + return(SCAN_FILE_OPEN_ERROR); + } else + return(SCAN_FILE_OPEN_ERROR); + } else + return(SCAN_FILE_OPEN_ERROR); + + /* copy the CMap file name and remove leading or trailing blanks */ + /* point to name and search for leading blanks */ + nameP = CMapP->CMapFileName.data.nameP; + namelen = CMapP->CMapFileName.len; + while (nameP[0] == ' ') { + nameP++; + namelen--; + } + /* now remove any trailing blanks */ + while ((namelen>0) && ( nameP[namelen-1] == ' ')) { + namelen--; + } + strncpy(cmapfile,nameP,namelen); + cmapfile[namelen] = '\0'; + /* CMap file name is now constructed */ + inputFile1.data.fileP = NULL; + + /* check whether a CMap file */ + if ((fileP1 = fopen(cmapfile,filetype))) { + cread = fread(buf, 1, CID_BUFSIZE, fileP1); + fclose(fileP1); + if (cread > 17) { + if (strncmp(buf, "%!", 2) || + (p = strstr(buf, "Resource-CMap")) == NULL) + return(SCAN_FILE_OPEN_ERROR); + } else + return(SCAN_FILE_OPEN_ERROR); + } else + return(SCAN_FILE_OPEN_ERROR); + + /* read the specified CMap file */ + inputP = &inputFile1; + + if (!(fileP1 = fopen(cmapfile,filetype))) + return(SCAN_FILE_OPEN_ERROR); + + objFormatFile(inputP,fileP1); + + if ((rc = BuildCMapInfo(CMapP)) != 0) + return(rc); + + /* Assume everything will be OK */ + rc = 0; + rangecnt = 0; + + do { + /* Scan the next token */ + scan_token(inputP); + if (tokenType == TOKEN_INTEGER) + rangecnt = tokenValue.integer; + + /* ==> tokenLength, tokenTooLong, tokenType, and */ + /* tokenValue are now set */ + + switch (tokenType) { + case TOKEN_EOF: + case TOKEN_NONE: + case TOKEN_INVALID: + /* in this case we are done */ + if (tokenTooLong) return(SCAN_OUT_OF_MEMORY); + rc = SCAN_ERROR; + break; + case TOKEN_LITERAL_NAME: + /* Look up the name */ + tokenStartP[tokenLength] = '\0'; + + rc = FindDictValue(CMapP->CMapInfoP); + /* we are not going to report errors */ + rc = SCAN_OK; + break; + case TOKEN_NAME: + if (0 == strncmp(tokenStartP,"begincodespacerange",19)) { + CIDFontP->spacerangecnt++; + spacerangeP = (spacerange *)vm_alloc(sizeof(spacerange)); + if (!spacerangeP) { + rc = SCAN_OUT_OF_MEMORY; + break; + } + spacerangeP->next = NULL; + spacerangeP->rangecnt = rangecnt; + spacerangeP->spacecode = + (spacerangecode *)vm_alloc(rangecnt*sizeof(spacerangecode)); + if (!spacerangeP->spacecode) { + rc = SCAN_OUT_OF_MEMORY; + break; + } + for (i = 0; i < rangecnt; i++) { + scan_token(inputP); + if (tokenType != TOKEN_HEX_STRING) { + rc = SCAN_ERROR; + break; + } + spacerangeP->spacecode[i].srcCodeLo = 0; + for (j = 0; j < tokenLength; j++) + spacerangeP->spacecode[i].srcCodeLo += + (unsigned char)tokenStartP[j] << (8 * (tokenLength - 1 - j)); + + scan_token(inputP); + if (tokenType != TOKEN_HEX_STRING) { + rc = SCAN_ERROR; + break; + } + spacerangeP->spacecode[i].srcCodeHi = 0; + for (j = 0; j < tokenLength; j++) + spacerangeP->spacecode[i].srcCodeHi += + (unsigned char)tokenStartP[j] << (8 * (tokenLength - 1 - j)); + } + + if (CIDFontP->spacerangeP) { + if (CIDFontP->spacerangeP->next == NULL) + CIDFontP->spacerangeP->next = spacerangeP; + else { + spacerangeP->next = CIDFontP->spacerangeP->next; + CIDFontP->spacerangeP->next = spacerangeP; + } + } else + CIDFontP->spacerangeP = spacerangeP; + + /* read "endcodespacerange" */ + scan_token(inputP); + if (tokenType != TOKEN_NAME || (tokenType == TOKEN_NAME && + (strncmp(tokenStartP,"endcodespacerange",17) != 0))) { + rc = SCAN_ERROR; + break; + } + } + if (0 == strncmp(tokenStartP,"begincidrange",13)) { + CIDFontP->cidrangecnt++; + cidrangeP = (cidrange *)vm_alloc(sizeof(cidrange)); + if (!cidrangeP) { + rc = SCAN_OUT_OF_MEMORY; + break; + } + cidrangeP->next = NULL; + cidrangeP->rangecnt = rangecnt; + cidrangeP->range = + (cidrangecode *)vm_alloc(rangecnt*sizeof(cidrangecode)); + if (!cidrangeP->range) { + rc = SCAN_OUT_OF_MEMORY; + break; + } + for (i = 0; i < rangecnt; i++) { + scan_token(inputP); + if (tokenType != TOKEN_HEX_STRING) { + rc = SCAN_ERROR; + break; + } + cidrangeP->range[i].srcCodeLo = 0; + for (j = 0; j < tokenLength; j++) + cidrangeP->range[i].srcCodeLo += + (unsigned char)tokenStartP[j] << (8 * (tokenLength - 1 - j)); + char_row = (cidrangeP->range[i].srcCodeLo >> 8) & 0xff; + char_col = cidrangeP->range[i].srcCodeLo & 0xff; + if (char_row < CMapP->firstRow) + CMapP->firstRow = char_row; + if (char_row > CMapP->lastRow) + CMapP->lastRow = char_row; + if (char_col < CMapP->firstCol) + CMapP->firstCol = char_col; + if (char_col > CMapP->lastCol) + CMapP->lastCol = char_col; + scan_token(inputP); + if (tokenType != TOKEN_HEX_STRING) { + rc = SCAN_ERROR; + break; + } + cidrangeP->range[i].srcCodeHi = 0; + for (j = 0; j < tokenLength; j++) + cidrangeP->range[i].srcCodeHi += + (unsigned char)tokenStartP[j] << (8 * (tokenLength - 1 - j)); + char_row = (cidrangeP->range[i].srcCodeHi >> 8) & 0xff; + char_col = cidrangeP->range[i].srcCodeHi & 0xff; + if (char_row < CMapP->firstRow) + CMapP->firstRow = char_row; + if (char_row > CMapP->lastRow) + CMapP->lastRow = char_row; + if (char_col < CMapP->firstCol) + CMapP->firstCol = char_col; + if (char_col > CMapP->lastCol) + CMapP->lastCol = char_col; + scan_token(inputP); + if (tokenType != TOKEN_INTEGER) { + rc = SCAN_ERROR; + break; + } + cidrangeP->range[i].dstCIDLo = tokenValue.integer; + } + + if (CIDFontP->cidrangeP) { + if (CIDFontP->cidrangeP->next == NULL) + CIDFontP->cidrangeP->next = cidrangeP; + else { + cidrangeP->next = CIDFontP->cidrangeP->next; + CIDFontP->cidrangeP->next = cidrangeP; + } + } else + CIDFontP->cidrangeP = cidrangeP; + + /* read "endcidrange" */ + scan_token(inputP); + if (tokenType != TOKEN_NAME || (tokenType == TOKEN_NAME && + (strncmp(tokenStartP,"endcidrange",11) != 0))) { + rc = SCAN_ERROR; + break; + } + } + + if (0 == strncmp(tokenStartP,"beginnotdefrange",16)) { + CIDFontP->notdefrangecnt++; + notdefrangeP = (cidrange *)vm_alloc(sizeof(cidrange)); + if (!notdefrangeP) { + rc = SCAN_OUT_OF_MEMORY; + break; + } + notdefrangeP->next = 0; + notdefrangeP->rangecnt = rangecnt; + notdefrangeP->range = + (cidrangecode *)vm_alloc(rangecnt*sizeof(cidrangecode)); + if (!notdefrangeP->range) { + rc = SCAN_OUT_OF_MEMORY; + break; + } + for (i = 0; i < rangecnt; i++) { + scan_token(inputP); + if (tokenType != TOKEN_HEX_STRING) { + rc = SCAN_ERROR; + break; + } + notdefrangeP->range[i].srcCodeLo = 0; + for (j = 0; j < tokenLength; j++) + notdefrangeP->range[i].srcCodeLo = (int)(tokenStartP[j] << + (8 * (tokenLength - 1 - j))); + scan_token(inputP); + if (tokenType != TOKEN_HEX_STRING) { + rc = SCAN_ERROR; + break; + } + notdefrangeP->range[i].srcCodeHi = 0; + for (j = 0; j < tokenLength; j++) + notdefrangeP->range[i].srcCodeHi = (int)(tokenStartP[j] << + (8 * (tokenLength - 1 - j))); + scan_token(inputP); + if (tokenType != TOKEN_INTEGER) { + rc = SCAN_ERROR; + break; + } + notdefrangeP->range[i].dstCIDLo = tokenValue.integer; + } + if (CIDFontP->notdefrangeP) { + if (CIDFontP->notdefrangeP->next == NULL) + CIDFontP->notdefrangeP->next = notdefrangeP; + else { + notdefrangeP->next = CIDFontP->notdefrangeP->next; + CIDFontP->notdefrangeP->next = notdefrangeP; + } + } else + CIDFontP->notdefrangeP = notdefrangeP; + + /* read "endnotdefrange" */ + scan_token(inputP); + if (tokenType != TOKEN_NAME || (tokenType == TOKEN_NAME && + (strncmp(tokenStartP,"endnotdefrange",14) != 0))) { + rc = SCAN_ERROR; + break; + } + } + + if (0 == strncmp(tokenStartP,"endcmap",7)) { + if (CMapP->CMapInfoP[CMAPREGISTRY].value.data.valueP == NULL || + CMapP->CMapInfoP[CMAPORDERING].value.data.valueP == NULL || + CMapP->CMapInfoP[CMAPSUPPLEMENT].value.data.integer == -1) { + rc = SCAN_ERROR; + break; + } else { + rc = SCAN_FILE_EOF; + break; + } + } + break; + } + } + while (rc == 0); + fclose(inputP->data.fileP); + if (tokenTooLong) + rc = SCAN_OUT_OF_MEMORY; + if (rc == SCAN_OUT_OF_MEMORY) return(rc); + + /* open the specified CIDFont file */ + if (!(fileP = fopen(filename,filetype))) + return(SCAN_FILE_OPEN_ERROR); + + inputP = &inputFile; + objFormatFile(inputP,fileP); + CIDWantFontInfo = TRUE; + TwoSubrs = FALSE; + rc = BuildCIDFontInfo(CIDFontP); + if (rc != 0) return(rc); + + /* Assume everything will be OK */ + rc = 0; + + /* Loop until complete font is read */ + do { + /* Scan the next token */ + scan_token(inputP); + + /* ==> tokenLength, tokenTooLong, tokenType, and tokenValue are */ + /* now set */ + + switch (tokenType) { + case TOKEN_EOF: + case TOKEN_NONE: + case TOKEN_INVALID: + /* in this case we are done */ + if (tokenTooLong) return(SCAN_OUT_OF_MEMORY); + rc = SCAN_ERROR; + break; + case TOKEN_LITERAL_NAME: + /* Look up the name */ + tokenStartP[tokenLength] = '\0'; + if (0 == strncmp(tokenStartP,"FDArray",7)) + InFDArray = TRUE; + + if (CIDWantFontInfo) { + rc = FindDictValue(CIDFontP->CIDfontInfoP); + /* we are not going to report errors */ + rc = SCAN_OK; + break; + } + break; + case TOKEN_STRING: + tokenStartP[tokenLength] = '\0'; + if (0 == strncmp(tokenStartP,"Binary",6)) { + CIDFontP->binarydata = 1; + scan_token(inputP); + if (tokenType == TOKEN_INTEGER) + CIDFontP->bytecnt = tokenValue.integer; + else { + rc = SCAN_ERROR; + break; + } + } else if (0 == strncmp(tokenStartP,"Hex",3)) { + /* not yet supported */ + rc = SCAN_ERROR; + break; +#if 0 + /* uncomment when the hex format is supported */ + CIDFontP->binarydata = 0; + scan_token(inputP); + if (tokenType == TOKEN_INTEGER) + CIDFontP->bytecnt = tokenValue.integer; + else { + rc = SCAN_ERROR; + break; + } +#endif + } + break; + case TOKEN_NAME: + /* end of PostScript and beginning of data */ + if (0 == strncmp(tokenStartP,"StartData",9)) { + /* every CIDFont must have an FDArray */ + /* check whether other required dictionary entries were found */ + if (CIDFontP->CIDfontInfoP[CIDFDARRAY].value.data.arrayP == NULL || + CIDFontP->CIDfontInfoP[CIDFONTNAME].value.data.nameP == NULL || + CIDFontP->CIDfontInfoP[CIDFONTTYPE].value.data.integer == -1 || + CIDFontP->CIDfontInfoP[CIDVERSION].value.data.integer == -1 || + CIDFontP->CIDfontInfoP[CIDREGISTRY].value.data.valueP == NULL || + CIDFontP->CIDfontInfoP[CIDORDERING].value.data.valueP == NULL || + CIDFontP->CIDfontInfoP[CIDSUPPLEMENT].value.data.integer == -1 || + CIDFontP->CIDfontInfoP[CIDFONTBBOX].value.data.arrayP == NULL || + CIDFontP->CIDfontInfoP[CIDMAPOFFSET].value.data.integer == -1 || + CIDFontP->CIDfontInfoP[CIDFDBYTES].value.data.integer == -1 || + CIDFontP->CIDfontInfoP[CIDGDBYTES].value.data.integer == -1 || + CIDFontP->CIDfontInfoP[CIDCOUNT].value.data.integer == -1) { + rc = SCAN_ERROR; + break; + } else { + /* do Registry and Ordering entries match? */ + if (strcmp(CIDFontP->CIDfontInfoP[CIDREGISTRY].value.data.valueP, + CMapP->CMapInfoP[CMAPREGISTRY].value.data.valueP) != 0 || + strcmp(CIDFontP->CIDfontInfoP[CIDORDERING].value.data.valueP, + CMapP->CMapInfoP[CMAPORDERING].value.data.valueP) != 0) { + rc = SCAN_ERROR; + break; + } else { + fclose(inputP->data.fileP); + return(SCAN_OK); + } + } + } + break; + } + + } + while (rc ==0); + fclose(inputP->data.fileP); + if (tokenTooLong) return(SCAN_OUT_OF_MEMORY); + return(rc); +} + +/* + * ------------------------------------------------------------------- + * Scan the next token and convert it into an object + * Result is placed on the Operand Stack as next object + * ------------------------------------------------------------------- + */ +int +scan_cidtype1font(psfont *FontP) +{ + int i; + int begincnt = 0; /* counter for the number of unpaired begin operators */ + int currentfilefound = 0; + + WantFontInfo = TRUE; + InPrivateDict = FALSE; + TwoSubrs = FALSE; + rc = BuildFontInfo(FontP); + if (rc != 0) return(rc); + + /* Assume everything will be OK */ + rc = 0; + filterFile.data.fileP = NULL; + + /* Loop until complete font is read */ + do { + /* Scan the next token */ + scan_token(inputP); + + /* ==> tokenLength, tokenTooLong, tokenType, and tokenValue are */ + /* now set */ + + switch (tokenType) { + case TOKEN_EOF: + case TOKEN_NONE: + case TOKEN_INVALID: + /* in this case we are done */ + if (tokenTooLong) return(SCAN_OUT_OF_MEMORY); + rc = SCAN_ERROR; + break; + case TOKEN_LITERAL_NAME: + /* Look up the name */ + tokenStartP[tokenLength] = '\0'; + if (InPrivateDict ) { + rc = FindDictValue(FontP->Private); + /* we are not going to report errors */ + /* Sometimes the font file may test a value such as */ + /* testing to see if the font is alreadly loaded with */ + /* same UniqueID. We would faile on /UniqueID get */ + /* because we are expecting a int to follow UniqueID*/ + /* If the correct object type does not follow a Name*/ + /* then we will skip over it without reporting error*/ + rc = SCAN_OK; + break; + } /* end of reading Private dictionary */ + else + if (0 == strncmp(tokenStartP,"Private",7) ) { + InPrivateDict = TRUE; + rc = BuildCIDType1Private(FontP); + break; + } + else + if (WantFontInfo) { + rc = FindDictValue(FontP->fontInfoP); + /* we are not going to report errors */ + rc = SCAN_OK; + break; + } + break; + case TOKEN_NAME: + if (0 == strncmp(tokenStartP,"currentfile",11)) { + currentfilefound = 1; + break; + } else if (0 == strncmp(tokenStartP,"eexec",5)) { + if (currentfilefound == 1) { + currentfilefound = 0; + filterFile.data.fileP = CIDeexec(inputP->data.fileP); + if (filterFile.data.fileP == NULL) { + fclose(inputFile.data.fileP); + return(SCAN_FILE_OPEN_ERROR); + } + inputP = &filterFile; + } else { + rc = SCAN_ERROR; + break; + } + } else if (0 == strncmp(tokenStartP,"begin",5)) { + begincnt++; + currentfilefound = 0; + } else if (0 == strncmp(tokenStartP,"end",3)) { + currentfilefound = 0; + begincnt--; + if (begincnt == 0) { + if (filterFile.data.fileP != NULL) { + scan_token(inputP); /* get 'currentfile' */ + scan_token(inputP); /* get 'closefile' */ + inputP = &inputFile; + resetDecrypt(); + inputP->data.fileP->b_cnt = + F_BUFSIZ - (inputP->data.fileP->b_ptr - + inputP->data.fileP->b_base); + if (inputP->data.fileP->b_cnt > 0) { + for (i = 0; i < inputP->data.fileP->b_cnt; i++) + if (*(inputP->data.fileP->b_ptr + i) == '%') + break; + if (i < inputP->data.fileP->b_cnt) { + inputP->data.fileP->b_cnt -= i; + inputP->data.fileP->b_ptr += i; + } else + inputP->data.fileP->b_cnt = 0; + } + } + rc = SCAN_OK; + return(rc); + } + if (begincnt < 0) { + rc = SCAN_ERROR; + break; + } + } + break; + } + + } + while (rc == 0); + if (tokenTooLong) return(SCAN_OUT_OF_MEMORY); + return(rc); +} +#endif + /* * ------------------------------------------------------------------- * Scan the next token and convert it into an object * Result is placed on the Operand Stack as next object * ------------------------------------------------------------------- */ -int scan_font(FontP) - psfont *FontP; +int +scan_font(psfont *FontP) { @@ -1403,7 +2237,7 @@ int scan_font(FontP) filterFile.data.fileP = NULL; inputP = &inputFile; - if (fileP = T1Open(filename,filetype)) { + if ((fileP = T1Open(filename,filetype))) { /* get the first byte of file */ V = _XT1getc(fileP); /* if file starts with x'80' then skip next 5 bytes */ diff --git a/src/Type1/spaces.c b/src/Type1/spaces.c index 8b28d37..8eb4b52 100644 --- a/src/Type1/spaces.c +++ b/src/Type1/spaces.c @@ -26,6 +26,7 @@ * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF * THIS SOFTWARE. */ +/* $XFree86: xc/lib/font/Type1/spaces.c,v 3.10 2002/02/18 20:51:57 herrb Exp $ */ /* SPACES CWEB V0021 ******** */ /* :h1 id=spaces.SPACES Module - Handles Coordinate Spaces @@ -37,6 +38,16 @@ This module is responsible for handling the TYPE1IMAGER "XYspace" object. :h3.Include Files */ + +#ifdef FONTMODULE +#include "Xdefs.h" /* Bool declaration ??? */ +#include "Xmd.h" /* INT32 declaration ??? */ +#include "os.h" +#include "xf86_ansic.h" +#else +#include "X11/Xos.h" +#include "os.h" +#endif #include "objects.h" #include "spaces.h" #include "paths.h" @@ -45,8 +56,12 @@ This module is responsible for handling the TYPE1IMAGER "XYspace" object. #include "arith.h" #include "trig.h" -static void FindFfcn(); -static void FindIfcn(); +static void FindFfcn ( double cx, double cy, + convertFunc *fcnP ); +static void FindIfcn ( double cx, double cy, + fractpel *icxP, fractpel *icyP, + iconvertFunc *fcnP ); + /* :h3.Entry Points Provided to the TYPE1IMAGER User */ @@ -121,8 +136,8 @@ The XYspace structure represents the XYspace object. static unsigned int SpaceID = 1; -struct XYspace *CopySpace(S) - register struct XYspace *S; +struct XYspace * +CopySpace(struct XYspace *S) { S = (struct XYspace *)Allocate(sizeof(struct XYspace), S, 0); S->ID = NEXTID; @@ -166,9 +181,9 @@ static struct XYspace identity = { SPACETYPE, ISPERMANENT(ON) + ISIMMORTAL(ON) NULL, NULL, NULL, NULL, NULL, NULL, INVALIDID + 1, 0, - FRACTFLOAT, 0.0, 0.0, FRACTFLOAT, - 1.0/FRACTFLOAT, 0.0, 0.0, 1.0/FRACTFLOAT, - 0, 0, 0, 0 }; + {{{FRACTFLOAT, 0.0}, {0.0, FRACTFLOAT}}, + {{1.0/FRACTFLOAT, 0.0}, {0.0, 1.0/FRACTFLOAT}}}, + {{0, 0}, {0, 0}}}; struct XYspace *IDENTITY = &identity; /* @@ -182,12 +197,6 @@ static struct doublematrix contexts[MAXCONTEXTS]; static int nextcontext = 1; /*SHARED LINE(S) ORIGINATED HERE*/ - -#ifdef __STDC__ -#define pointer void * -#else -#define pointer char * -#endif /* :h3.FindDeviceContext() - Find the Context Given a Device @@ -197,8 +206,8 @@ transformation matrix in the context array. If it cannot find it, it will allocate a new array entry and fill it out. */ -static int FindDeviceContext(device) - pointer device; /* device token */ +static int +FindDeviceContext(pointer device) /* device token */ { double M[2][2]; /* temporary matrix */ float Xres,Yres; /* device resolution */ @@ -206,7 +215,7 @@ static int FindDeviceContext(device) int rc = -1; /* return code for QueryDeviceState */ if (rc != 0) /* we only bother with this check once */ - abort("Context: QueryDeviceState didn't work"); + Abort("Context: QueryDeviceState didn't work"); M[0][0] = M[1][0] = M[0][1] = M[1][1] = 0.0; @@ -224,7 +233,7 @@ static int FindDeviceContext(device) M[1][0] = -Yres; M[0][1] = -Xres; break; default: - abort("QueryDeviceState returned invalid orientation"); + Abort("QueryDeviceState returned invalid orientation"); } return(FindContext(M)); } @@ -237,8 +246,8 @@ the context array. If it cannot find it, it will allocate a new array entry and fill it out. */ -int FindContext(M) - double M[2][2]; /* array to search for */ +int +FindContext(double M[2][2]) /* array to search for */ { register int i; /* loop variable for search */ for (i=0; i < nextcontext; i++) @@ -248,7 +257,7 @@ int FindContext(M) if (i >= nextcontext) { if (i >= MAXCONTEXTS) - abort("Context: out of them"); + Abort("Context: out of them"); LONGCOPY(contexts[i].normal, M, sizeof(contexts[i].normal)); MatrixInvert(M, contexts[i].inverse); nextcontext++; @@ -265,9 +274,9 @@ array index, then transforming IDENTITY space to create an appropriate cooridnate space. */ -struct XYspace *Context(device, units) - pointer device; /* device token */ - double units; /* multiples of one inch */ +struct XYspace * +Context(pointer device, /* device token */ + double units) /* multiples of one inch */ { double M[2][2]; /* device transformation matrix */ register int n; /* will hold device context number */ @@ -308,11 +317,11 @@ So this subroutine, given an :f/M/and an object, finds the :f/D/ for that object and modifies :f/M/ so it is :f/D sup <-1> times M times D/. */ -static void ConsiderContext(obj, M) - register struct xobject *obj; /* object to be transformed */ - register double M[2][2]; /* matrix (may be changed) */ +static void +ConsiderContext(struct xobject *obj, /* object to be transformed */ + double M[2][2]) /* matrix (may be changed) */ { - register int context; /* index in contexts array */ + register int context = 0; /* index in contexts array */ if (obj == NULL) return; @@ -360,19 +369,19 @@ These secondary routines come in many flavors to handle different special cases as quickly as possible. */ -static void FXYConvert(pt, S, x, y) - register struct fractpoint *pt; /* point to set */ - register struct XYspace *S; /* relevant coordinate space */ - register double x,y; /* user's coordinates of point */ +static void +FXYConvert(struct fractpoint *pt, /* point to set */ + struct XYspace *S, /* relevant coordinate space */ + double x, double y) /* user's coordinates of point */ { pt->x = (*S->xconvert)(S->tofract.normal[0][0], S->tofract.normal[1][0], x, y); pt->y = (*S->yconvert)(S->tofract.normal[0][1], S->tofract.normal[1][1], x, y); } -static void IXYConvert(pt, S, x, y) - register struct fractpoint *pt; /* point to set */ - register struct XYspace *S; /* relevant coordinate space */ - register long x,y; /* user's coordinates of point */ +static void +IXYConvert(struct fractpoint *pt, /* point to set */ + struct XYspace *S, /* relevant coordinate space */ + long x, long y) /* user's coordinates of point */ { pt->x = (*S->ixconvert)(S->itofract[0][0], S->itofract[1][0], x, y); pt->y = (*S->iyconvert)(S->itofract[0][1], S->itofract[1][1], x, y); @@ -385,10 +394,10 @@ precision in the answer with fixed point arithmetic. So, we force the integers to floats, and do the arithmetic all with floats: */ -static void ForceFloat(pt, S, x, y) - register struct fractpoint *pt; /* point to set */ - register struct XYspace *S; /* relevant coordinate space */ - register long x,y; /* user's coordinates of point */ +static void +ForceFloat(struct fractpoint *pt, /* point to set */ + struct XYspace *S, /* relevant coordinate space */ + long x, long y) /* user's coordinates of point */ { (*S->convert)(pt, S, (double) x, (double) y); } @@ -402,9 +411,9 @@ FXonly() and FYonly() are special cases when one of the coefficients is 0.0. */ -static fractpel FXYboth(cx, cy, x, y) - register double cx,cy; /* x and y coefficients */ - register double x,y; /* user x,y */ +static fractpel +FXYboth(double cx, double cy, /* x and y coefficients */ + double x, double y) /* user x,y */ { register double r; /* temporary float */ @@ -413,9 +422,9 @@ static fractpel FXYboth(cx, cy, x, y) } /*ARGSUSED*/ -static fractpel FXonly(cx, cy, x, y) - register double cx,cy; /* x and y coefficients */ - register double x,y; /* user x,y */ +static fractpel +FXonly(double cx, double cy, /* x and y coefficients */ + double x, double y) /* user x,y */ { register double r; /* temporary float */ @@ -424,9 +433,9 @@ static fractpel FXonly(cx, cy, x, y) } /*ARGSUSED*/ -static fractpel FYonly(cx, cy, x, y) - register double cx,cy; /* x and y coefficients */ - register double x,y; /* user x,y */ +static fractpel +FYonly(double cx, double cy, /* x and y coefficients */ + double x, double y) /* user x,y */ { register double r; /* temporary float */ @@ -444,25 +453,25 @@ IXYboth() is the general purpose routine; IXonly() and IYonly() are special cases when one of the coefficients is 0. */ -static fractpel IXYboth(cx, cy, x, y) - register fractpel cx,cy; /* x and y coefficients */ - register long x,y; /* user x,y */ +static fractpel +IXYboth(fractpel cx, fractpel cy, /* x and y coefficients */ + long x, long y) /* user x,y */ { return(x * cx + y * cy); } /*ARGSUSED*/ -static fractpel IXonly(cx, cy, x, y) - register fractpel cx,cy; /* x and y coefficients */ - register long x,y; /* user x,y */ +static fractpel +IXonly(fractpel cx, fractpel cy, /* x and y coefficients */ + long x, long y) /* user x,y */ { return(x * cx); } /*ARGSUSED*/ -static fractpel IYonly(cx, cy, x, y) - register fractpel cx,cy; /* x and y coefficients */ - register long x,y; /* user x,y */ +static fractpel +IYonly(fractpel cx, fractpel cy, /* x and y coefficients */ + long x, long y) /* user x,y */ { return(y * cy); } @@ -485,25 +494,25 @@ Note that it is perfectly possible for us to calculate X with the on how the functions in the XYspace structure are filled out. */ -static fractpel FPXYboth(cx, cy, x, y) - register fractpel cx,cy; /* x and y coefficients */ - register long x,y; /* user x,y */ +static fractpel +FPXYboth(fractpel cx, fractpel cy, /* x and y coefficients */ + long x, long y) /* user x,y */ { return( FPmult(x, cx) + FPmult(y, cy) ); } /*ARGSUSED*/ -static fractpel FPXonly(cx, cy, x, y) - register fractpel cx,cy; /* x and y coefficients */ - register long x,y; /* user x,y */ +static fractpel +FPXonly(fractpel cx, fractpel cy, /* x and y coefficients */ + long x, long y) /* user x,y */ { return( FPmult(x, cx) ); } /*ARGSUSED*/ -static fractpel FPYonly(cx, cy, x, y) - register fractpel cx,cy; /* x and y coefficients */ - register long x,y; /* user x,y */ +static fractpel +FPYonly(fractpel cx, fractpel cy, /* x and y coefficients */ + long x, long y) /* user x,y */ { return( FPmult(y, cy) ); } @@ -518,8 +527,8 @@ in an XYspace structure, and also fills the "helper" functions that actually do the work. */ -static void FillOutFcns(S) - register struct XYspace *S; /* functions will be set in this structure */ +static void +FillOutFcns(struct XYspace *S) /* functions will be set in this structure */ { S->convert = FXYConvert; S->iconvert = IXYConvert; @@ -542,9 +551,9 @@ This function tests for the special case of one of the coefficients being zero: */ -static void FindFfcn(cx, cy, fcnP) - register double cx,cy; /* x and y coefficients */ - register fractpel (**fcnP)(); /* pointer to function to set */ +static void +FindFfcn(double cx, double cy, /* x and y coefficients */ + convertFunc *fcnP) /* pointer to function to set */ { if (cx == 0.0) *fcnP = FYonly; @@ -565,10 +574,10 @@ we store a NULL indicating that this we should do the conversion in floating point. */ -static void FindIfcn(cx, cy, icxP, icyP, fcnP) - register double cx,cy; /* x and y coefficients */ - register fractpel *icxP,*icyP; /* fixed point coefficients to set */ - register fractpel (**fcnP)(); /* pointer to function to set */ +static void +FindIfcn(double cx, double cy, /* x and y coefficients */ + fractpel *icxP, fractpel *icyP, /* fixed point coefficients to set */ + iconvertFunc *fcnP) /* pointer to function to set */ { register fractpel imax; /* maximum of cx and cy */ @@ -635,10 +644,10 @@ zero determinants, so by convention, we mark the matrix is invalid by marking both X terms zero. */ -void UnConvert(S, pt, xp, yp) - register struct XYspace *S; /* relevant coordinate space */ - register struct fractpoint *pt; /* device coordinates */ - double *xp,*yp; /* where to store resulting x,y */ +void +UnConvert(struct XYspace *S, /* relevant coordinate space */ + struct fractpoint *pt, /* device coordinates */ + double *xp, double *yp) /* where to store resulting x,y */ { double x,y; @@ -668,9 +677,9 @@ get the same result if we did S, then R, then T on the space and mapping an unmodified font through that space. */ -struct xobject *t1_Xform(obj, M) - register struct xobject *obj; /* object to transform */ - register double M[2][2]; /* transformation matrix */ +struct xobject * +t1_Xform(struct xobject *obj, /* object to transform */ + double M[2][2]) /* transformation matrix */ { if (obj == NULL) return(NULL); @@ -703,7 +712,8 @@ transformation matrix and keep the handles up to date. if (ISPATHTYPE(obj->type)) { struct XYspace pseudo; /* local temporary space */ PseudoSpace(&pseudo, M); - return((struct xobject *) PathTransform(obj, &pseudo)); + return((struct xobject *) PathTransform((struct segment *)obj, + &pseudo)); } @@ -734,9 +744,10 @@ transformation matrix and keep the handles up to date. This is the external user's entry point. */ -struct xobject *t1_Transform(obj, cxx, cyx, cxy, cyy) - struct xobject *obj; - double cxx,cyx,cxy,cyy; /* 2x2 transform matrix elements in row order */ +struct xobject * +t1_Transform(struct xobject *obj, + double cxx, double cyx, /* 2x2 transform matrix elements */ + double cxy, double cyy) /* in row order */ { double M[2][2]; @@ -756,9 +767,9 @@ struct xobject *t1_Transform(obj, cxx, cyx, cxy, cyy) This is a user operator. */ -struct xobject *t1_Scale(obj, sx, sy) - struct xobject *obj; /* object to scale */ - double sx,sy; /* scale factors in x and y */ +struct xobject * +t1_Scale(struct xobject *obj, /* object to scale */ + double sx, double sy) /* scale factors in x and y */ { double M[2][2]; IfTrace3((MustTraceCalls),"Scale(%z, %f, %f)\n", obj, &sx, &sy); @@ -777,9 +788,9 @@ and accuracy within the DegreeSin() and DegreeCos() routines themselves. */ #ifdef notdef -struct xobject *xiRotate(obj, degrees) - struct xobject *obj; /* object to be transformed */ - double degrees; /* degrees of COUNTER-clockwise rotation */ +struct xobject * +xiRotate(struct xobject *obj, /* object to be transformed */ + double degrees) /* degrees of COUNTER-clockwise rotation */ { double M[2][2]; @@ -804,9 +815,9 @@ subroutine takes the arbitrary matrix and builds a coordinate space, with all its nifty function pointers. */ -void PseudoSpace(S, M) - struct XYspace *S; /* coordinate space structure to fill out */ - double M[2][2]; /* matrix that will become 'tofract.normal' */ +void +PseudoSpace(struct XYspace *S, /* coordinate space structure to fill out */ + double M[2][2]) /* matrix that will become 'tofract.normal' */ { S->type = SPACETYPE; S->flag = ISPERMANENT(ON) + ISIMMORTAL(ON); @@ -849,9 +860,9 @@ To remind myself, matrix multiplication goes rows of A times columns of B. The output matrix may be the same as one of the input matrices. */ -void MatrixMultiply(A, B, C) - register double A[2][2],B[2][2]; /* input matrices */ - register double C[2][2]; /* output matrix */ +void +MatrixMultiply(double A[2][2], double B[2][2], /* input matrices */ + double C[2][2]) /* output matrix */ { register double txx,txy,tyx,tyy; @@ -871,9 +882,9 @@ void MatrixMultiply(A, B, C) My reference for matrix inversion was :hp1/Elementary Linear Algebra/ by Paul C. Shields, Worth Publishers, Inc., 1968. */ -void MatrixInvert(M, Mprime) - double M[2][2]; /* input matrix */ - double Mprime[2][2]; /* output inverted matrix */ +void +MatrixInvert(double M[2][2], /* input matrix */ + double Mprime[2][2]) /* output inverted matrix */ { register double D; /* determinant of matrix M */ register double txx,txy,tyx,tyy; @@ -885,7 +896,7 @@ void MatrixInvert(M, Mprime) D = M[1][1] * M[0][0] - M[1][0] * M[0][1]; if (D == 0.0) - abort("MatrixInvert: can't"); + Abort("MatrixInvert: can't"); Mprime[0][0] = tyy / D; Mprime[1][0] = -txy / D; @@ -904,7 +915,8 @@ maps 72nds of an inch to pels on the default device. struct XYspace *USER = &identity; -void InitSpaces() +void +InitSpaces(void) { IDENTITY->type = SPACETYPE; FillOutFcns(IDENTITY); @@ -930,9 +942,10 @@ must be taken out before we return the matrix to the user. Fortunately, this is simple: just multiply by the inverse of IDENTITY! */ -void QuerySpace(S, cxxP, cyxP, cxyP, cyyP) - register struct XYspace *S; /* space asked about */ - register double *cxxP,*cyxP,*cxyP,*cyyP; /* where to put answer */ +void +QuerySpace(struct XYspace *S, /* space asked about */ + double *cxxP, double *cyxP, /* where to put answer */ + double *cxyP, double *cyyP) { double M[2][2]; /* temp matrix to build user's answer */ @@ -959,9 +972,9 @@ We make sure we have N (FRACTBITS/4) digits past the decimal point. */ #define FRACTMASK ((1<<FRACTBITS)-1) /* mask for fractional part */ -void FormatFP(string, fpel) - register char *string; /* output string */ - register fractpel fpel; /* fractional pel input */ +void +FormatFP(char *string, /* output string */ + fractpel fpel) /* fractional pel input */ { char temp[8]; register char *s; @@ -974,18 +987,18 @@ void FormatFP(string, fpel) else sign = ""; - sprintf(temp, "000%x", fpel & FRACTMASK); + sprintf(temp, "000%lx", fpel & FRACTMASK); s = temp + strlen(temp) - (FRACTBITS/4); - sprintf(string, "%s%d.%sx", sign, fpel >> FRACTBITS, s); + sprintf(string, "%s%d.%sx", sign, (int)(fpel >> FRACTBITS), s); } /* :h3.DumpSpace() - Display a Coordinate Space */ /*ARGSUSED*/ -void DumpSpace(S) - register struct XYspace *S; +void +DumpSpace(struct XYspace *S) { IfTrace4(TRUE,"--Coordinate space at %x,ID=%d,convert=%x,iconvert=%x\n", S, S->ID, S->convert, S->iconvert); diff --git a/src/Type1/spaces.h b/src/Type1/spaces.h index 21eee17..efbcecb 100644 --- a/src/Type1/spaces.h +++ b/src/Type1/spaces.h @@ -26,6 +26,8 @@ * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF * THIS SOFTWARE. */ +/* $XFree86: xc/lib/font/Type1/spaces.h,v 3.4 2001/01/17 19:43:23 dawes Exp $ */ + /*SHARED*/ #define USER t1_User @@ -37,35 +39,26 @@ #define Scale(o,sx,sy) t1_Scale(o,sx,sy) #define QuerySpace(S,f1,f2,f3,f4) t1_QuerySpace(S,f1,f2,f3,f4) #define Warp(s1,o,s2) t1_Warp(s1,o,s2) - -struct XYspace *t1_Context(); /* creates a coordinate space for a device */ -struct xobject *t1_Transform(); /* transform an object */ + +/* IDENTITY space */ +extern struct XYspace *IDENTITY; + +/* creates a coordinate space for a device */ +extern struct XYspace *Context(pointer device, double units); +/* transform an object */ +extern struct xobject *t1_Transform ( struct xobject *obj, double cxx, + double cyx, double cxy, double cyy ); +#if 0 struct xobject *t1_Rotate(); /* rotate an object */ -struct xobject *t1_Scale(); /* scale an object */ +#endif +/* scale an object */ +extern struct xobject *t1_Scale ( struct xobject *obj, double sx, double sy ); +#if 0 struct xobject *t1_Warp(); /* transform like delta of two spaces */ -void t1_QuerySpace(); /* returns coordinate space matrix */ - -/*END SHARED*/ -/*SHARED*/ - -#define DeviceResolution t1_DeviceResolution -#define InitSpaces() t1_InitSpaces() -#define CopySpace(s) t1_CopySpace(s) -#define Xform(o,M) t1_Xform(o,M) -#define UnConvert(S,pt,xp,yp) t1_UnConvert(S,pt,xp,yp) -#define MatrixMultiply(A,B,C) t1_MMultiply(A,B,C) -#define MatrixInvert(A,B) t1_MInvert(A,B) -#define PseudoSpace(S,M) t1_PseudoSpace(S,M) -#define FindContext(M) t1_FindContext(M) - -void t1_InitSpaces(); /* initialize pre-defined coordinate spaces */ -struct XYspace *t1_CopySpace(); /* duplicate a coordinate space */ -struct xobject *t1_Xform(); /* transform object by matrix */ -void t1_UnConvert(); /* return user coordinates from device coordinates */ -void t1_MMultiply(); /* multiply two matrices */ -void t1_MInvert(); /* invert a matrix */ -void t1_PseudoSpace(); /* force a coordinate space from a matrix */ -int t1_FindContext(); /* return the "context" represented by a matrix */ +#endif +/* returns coordinate space matrix */ +extern void t1_QuerySpace ( struct XYspace *S, double *cxxP, double *cyxP, + double *cxyP, double *cyyP ); /*END SHARED*/ /*SHARED*/ @@ -108,15 +101,24 @@ struct doublematrix { /*END SHARED*/ /*SHARED*/ +struct fractpoint { + fractpel x,y; +} ; + +/*SHARED*/ + +typedef fractpel (*convertFunc)(double, double, double, double); +typedef fractpel (*iconvertFunc)(fractpel, fractpel, long, long); + struct XYspace { XOBJ_COMMON /* xobject common data define 3-26-91 PNM */ /* type = SPACETYPE */ - void (*convert)(); /* calculate "fractpoint" X,Y from float X,Y */ - void (*iconvert)(); /* calculate "fractpoint" X,Y from int X,Y */ - fractpel (*xconvert)(); /* subroutine of convert */ - fractpel (*yconvert)(); /* subroutine of convert */ - fractpel (*ixconvert)(); /* subroutine of iconvert */ - fractpel (*iyconvert)(); /* subroutine of iconvert */ + void (*convert)(struct fractpoint *, struct XYspace *, double, double); /* calculate "fractpoint" X,Y from float X,Y */ + void (*iconvert)(struct fractpoint *, struct XYspace *, long, long); /* calculate "fractpoint" X,Y from int X,Y */ + convertFunc xconvert; /* subroutine of convert */ + convertFunc yconvert; /* subroutine of convert */ + iconvertFunc ixconvert; /* subroutine of iconvert */ + iconvertFunc iyconvert; /* subroutine of iconvert */ int ID; /* unique identifier (used in font caching) */ unsigned char context; /* device context of coordinate space */ struct doublematrix tofract; /* xform to get to fractional pels */ @@ -126,15 +128,45 @@ struct XYspace { #define INVALIDID 0 /* no valid space will have this ID */ /*END SHARED*/ +/*END SHARED*/ /*SHARED*/ -struct fractpoint { - fractpel x,y; -} ; +#define DeviceResolution t1_DeviceResolution +#define InitSpaces t1_InitSpaces +#define CopySpace(s) t1_CopySpace(s) +#define Xform(o,M) t1_Xform(o,M) +#define UnConvert(S,pt,xp,yp) t1_UnConvert(S,pt,xp,yp) +#define MatrixMultiply(A,B,C) t1_MMultiply(A,B,C) +#define MatrixInvert(A,B) t1_MInvert(A,B) +#define PseudoSpace(S,M) t1_PseudoSpace(S,M) +#define FindContext(M) t1_FindContext(M) +/* initialize pre-defined coordinate spaces */ +extern void t1_InitSpaces ( void ); +/* duplicate a coordinate space */ +extern struct XYspace *t1_CopySpace ( struct XYspace *S ); +/* transform object by matrix */ +extern struct xobject *t1_Xform ( struct xobject *obj, double M[2][2] ); +/* return user coordinates from device coordinates */ +extern void t1_UnConvert ( struct XYspace *S, struct fractpoint *pt, + double *xp, double *yp ); +/* multiply two matrices */ +extern void t1_MMultiply ( double A[2][2], double B[2][2], double C[2][2] ); +/* invert a matrix */ +extern void t1_MInvert ( double M[2][2], double Mprime[2][2] ); +/* force a coordinate space from a matrix */ +extern void t1_PseudoSpace ( struct XYspace *S, double M[2][2] ); +/* return the "context" represented by a matrix */ +int t1_FindContext(double M[2][2]); + /*END SHARED*/ /*SHARED*/ #define NULLCONTEXT 0 /*END SHARED*/ + +/* dump a coordinate space structure */ +extern void t1_DumpSpace ( struct XYspace *S ); +/* dump a format a "fractpel" coordinate */ +extern void t1_FormatFP ( char *string, fractpel fpel ); diff --git a/src/Type1/t1funcs.c b/src/Type1/t1funcs.c index ef113db..20b7b66 100644 --- a/src/Type1/t1funcs.c +++ b/src/Type1/t1funcs.c @@ -54,6 +54,24 @@ * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ +/* Copyright (c) 1994-1999 Silicon Graphics, Inc. All Rights Reserved. + * + * The contents of this file are subject to the CID Font Code Public Licence + * Version 1.0 (the "License"). You may not use this file except in compliance + * with the Licence. You may obtain a copy of the License at Silicon Graphics, + * Inc., attn: Legal Services, 2011 N. Shoreline Blvd., Mountain View, CA + * 94043 or at http://www.sgi.com/software/opensource/cid/license.html. + * + * Software distributed under the License is distributed on an "AS IS" basis. + * ALL WARRANTIES ARE DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED + * WARRANTIES OF MERCHANTABILITY, OF FITNESS FOR A PARTICULAR PURPOSE OR OF + * NON-INFRINGEMENT. See the License for the specific language governing + * rights and limitations under the License. + * + * The Original Software is CID font code that was developed by Silicon + * Graphics, Inc. + */ +/* $XFree86: xc/lib/font/Type1/t1funcs.c,v 3.30 2002/12/09 17:29:59 dawes Exp $ */ /* @@ -82,8 +100,14 @@ other dealings in this Software without prior written authorization from The Open Group. */ - + +#ifndef FONTMODULE #include <string.h> +#ifdef BUILDCID +#include <stdlib.h> +#include <sys/types.h> +#include <dirent.h> +#endif #ifdef _XOPEN_SOURCE #include <math.h> #else @@ -92,54 +116,386 @@ from The Open Group. #undef _XOPEN_SOURCE #endif #include "X11/Xfuncs.h" +#ifdef USE_MMAP +#include <sys/types.h> +#include <sys/mman.h> +#endif +#else +#include "Xmd.h" +#include "Xdefs.h" +#include "xf86_ansic.h" +#endif + +#include "os.h" #include "fntfilst.h" +#include "fontutil.h" #include "FSproto.h" -#include "t1intf.h" +#include "fontenc.h" +#include "t1unicode.h" +#ifdef BUILDCID +#include "range.h" +#endif + #include "objects.h" #include "spaces.h" +#include "paths.h" #include "regions.h" #include "t1stdio.h" #include "util.h" #include "fontfcn.h" - -int Type1OpenScalable (); -static int Type1GetGlyphs(); -void Type1CloseFont(); -extern int Type1GetInfoScalable (); - -static int Type1GetMetrics (); +#include "t1intf.h" + + +static int Type1GetGlyphs ( FontPtr pFont, unsigned long count, + unsigned char *chars, FontEncoding charEncoding, + unsigned long *glyphCount, CharInfoPtr *glyphs ); + +#ifdef BUILDCID +#define CMapDir "/CMap/" +#define CFMDir "/CFM/" +#define CIDFontDir "/CIDFont/" +#endif + +static int Type1GetMetrics ( FontPtr pFont, unsigned long count, + unsigned char *chars, + FontEncoding charEncoding, + unsigned long *glyphCount, + xCharInfo **glyphs ); + #define minchar(p) ((p).min_char_low + ((p).min_char_high << 8)) #define maxchar(p) ((p).max_char_low + ((p).max_char_high << 8)) -static void fillrun(); - +static void fillrun ( char *p, pel x0, pel x1, int bit ); extern psfont *FontP; extern psobj *ISOLatin1EncArrayP; -extern unsigned long *Xalloc(); -static void fill(); +#ifdef BUILDCID +extern char CurCIDFontName[]; +extern char CurCMapName[]; + +static CharInfoPtr CIDGetGlyph ( FontPtr pFont, unsigned int charcode, + CharInfoPtr pci ); + +extern cidfont *CIDFontP; +extern cmapres *CMapP; +#endif + +static void fill ( char *dest, int h, int w, struct region *area, int byte, + int bit, int wordsize ); + +#ifdef BUILDCID +int +CIDOpenScalable (FontPathElementPtr fpe, + FontPtr *ppFont, + int flags, + FontEntryPtr entry, + char *fileName, + FontScalablePtr vals, + fsBitmapFormat format, + fsBitmapFormatMask fmask, + FontPtr non_cachable_font) /* We don't do licensing */ +{ + FontPtr pFont; + int bit, + byte, + glyph, + scan, + image; + int pad,wordsize; /* scan & image in bits */ + long *pool; /* memory pool for ximager objects */ + int size; /* for memory size calculations */ + struct XYspace *S; /* coordinate space for character */ + register int i; + int nchars, len, rc; + cidglyphs *cid; + char *p; + double t1 = .001, t2 = 0.0, t3 = 0.0, t4 = .001; + double sxmult; + char CIDFontName[CID_NAME_MAX]; + char CMapName[CID_NAME_MAX]; + char cidfontname[CID_PATH_MAX]; + char cmapname[CID_PATH_MAX]; + char *path; + char cidfontpath[CID_PATH_MAX]; + char cmappath[CID_PATH_MAX]; +#if defined(HAVE_CFM) || defined(CID_ALL_CHARS) + char cfmdir[CID_PATH_MAX]; + char cfmfilename[CID_NAME_MAX]; +#endif +#if defined(CID_ALL_CHARS) + char *cf; +#endif + long sAscent, sDescent; + + /* check the font name */ + len = strlen(fileName); + if (len <= 0 || len > CID_NAME_MAX - 1) + return BadFontName; + +#if defined(HAVE_CFM) || defined(CID_ALL_CHARS) + strcpy(cfmdir, fileName); + p = strrchr(cfmdir, '/'); + if (p) *p = '\0'; +#endif + + path = fileName; + if (!(fileName = strrchr(fileName, '/'))) + return BadFontName; + + len = fileName - path; + strncpy(cidfontpath, path, len); + cidfontpath[len] = '\0'; + strcpy(cmappath, cidfontpath); + strcat(cmappath, CMapDir); +#ifdef HAVE_CFM + strcpy(cfmdir, cidfontpath); + strcat(cfmdir, CFMDir); +#endif + strcat(cidfontpath, CIDFontDir); + + fileName++; + + /* extract the CIDFontName and CMapName from the font name */ + /* check for <CIDFontName>--<CMapName> */ + if ((p = strstr(fileName, "--"))) { + if (p == fileName) + return BadFontName; + else { + strcpy(CIDFontName, fileName); + CIDFontName[p - fileName] = '\0'; + p += 2; + i = 0; + while (*p && *p != '.') + CMapName[i++] = *p++; + CMapName[i] = '\0'; + if ((len = strlen(CMapName)) <= 0) + return BadFontName; + } + } else + return BadFontName; + + /* The CMap files whose names end with -V are not yet supported */ + len = strlen(CMapName); + if ((len >= 2 && CMapName[len - 2] == '-' && CMapName[len - 1] == 'V') || + (len == 1 && CMapName[len - 1] == 'V')) + return BadFontName; + + /* Reject ridiculously small font sizes that will blow up the math */ + if (hypot(vals->pixel_matrix[0], vals->pixel_matrix[1]) < 1.0 || + hypot(vals->pixel_matrix[2], vals->pixel_matrix[3]) < 1.0) + return BadFontName; + +#ifdef CID_ALL_CHARS + if ((cf = getenv("CFMDIR")) == NULL) + strcat(cfmdir, CFMDir); + else { + strcpy(cfmdir, cf); + strcat(cfmdir, "/"); + } +#endif + +#if defined(HAVE_CFM) || defined(CID_ALL_CHARS) + strcpy(cfmfilename, cfmdir); + strcat(cfmfilename, CIDFontName); + strcat(cfmfilename, "--"); + strcat(cfmfilename, CMapName); + strcat(cfmfilename, ".cfm"); +#endif + + /* create a full-path name for a CIDFont file */ + if (strlen(cidfontpath) + strlen(CIDFontName) + 2 > + CID_PATH_MAX) + return BadFontName; + strcpy(cidfontname, cidfontpath); + strcat(cidfontname, CIDFontName); + + /* create a full-path name for a CMap file */ + if (strlen(cmappath) + strlen(CMapName) + 2 > CID_PATH_MAX) + return BadFontName; + strcpy(cmapname, cmappath); + strcat(cmapname, CMapName); + + /* set up default values */ + FontDefaultFormat(&bit, &byte, &glyph, &scan); + /* get any changes made from above */ + rc = CheckFSFormat(format, fmask, &bit, &byte, &scan, &glyph, &image); + if (rc != Successful) + return rc; + + pad = glyph * 8; + wordsize = scan * 8; + +#define PAD(bits, pad) (((bits)+(pad)-1)&-(pad)) + + if (!(pFont = CreateFontRec())) + return AllocError; + + cid = (cidglyphs *)xalloc(sizeof(cidglyphs)); + if (cid == NULL) { + DestroyFontRec(pFont); + return AllocError; + } + bzero(cid, sizeof(cidglyphs)); + + /* heuristic for "maximum" size of pool we'll need: */ + size = 200000 + 600 * + (int)hypot(vals->pixel_matrix[2], vals->pixel_matrix[3]) + * sizeof(short); + if (size < 0 || NULL == (pool = (long *) xalloc(size))) { + xfree(cid); + DestroyFontRec(pFont); + return AllocError; + } + + addmemory(pool, size); + + /* load font if not already loaded */ + if (!CIDfontfcnA(cidfontname, cmapname, &rc)) { + FontP = NULL; + delmemory(); + xfree(pool); + xfree(cid); + DestroyFontRec(pFont); + return Type1ReturnCodeToXReturnCode(rc); + } + + FontP = NULL; + + S = (struct XYspace *) t1_Transform((struct xobject *)IDENTITY, + t1, t2, t3, t4); + + S = (struct XYspace *) Permanent(t1_Transform((struct xobject *)S, + vals->pixel_matrix[0], + -vals->pixel_matrix[1], + vals->pixel_matrix[2], + -vals->pixel_matrix[3])); + + /* multiplier for computation of raw values */ + sxmult = hypot(vals->pixel_matrix[0], vals->pixel_matrix[1]); + if (sxmult > EPS) sxmult = 1000.0 / sxmult; + + pFont->info.firstRow = CMapP->firstRow; + pFont->info.firstCol = CMapP->firstCol; + pFont->info.lastRow = CMapP->lastRow; + pFont->info.lastCol = CMapP->lastCol; + + nchars = (pFont->info.lastRow - pFont->info.firstRow + 1) * + (pFont->info.lastCol - pFont->info.firstCol + 1); + + delmemory(); + xfree(pool); + + if (pFont->info.firstCol > pFont->info.lastCol) + { + xfree(cid); + DestroyFontRec(pFont); + return BadFontName; + } + + cid->glyphs = (CharInfoRec **)xalloc(nchars*sizeof(CharInfoRec *)); + if (cid->glyphs == NULL) { + xfree(cid); + DestroyFontRec(pFont); + return AllocError; + } + bzero(cid->glyphs, nchars*sizeof(CharInfoRec *)); + + pFont->info.defaultCh = 0; + pFont->format = format; + + pFont->bit = bit; + pFont->byte = byte; + pFont->glyph = glyph; + pFont->scan = scan; + + pFont->get_metrics = CIDGetMetrics; + pFont->get_glyphs = CIDGetGlyphs; + pFont->unload_font = CIDCloseFont; + pFont->unload_glyphs = NULL; + pFont->refcnt = 0; + + len = strlen(cidfontname); + cid->CIDFontName = (char *)xalloc(len + 1); + if (cid->CIDFontName == NULL) { + xfree(cid->glyphs); + xfree(cid); + DestroyFontRec(pFont); + return AllocError; + } + strcpy(cid->CIDFontName, cidfontname); + + len = strlen(cmapname); + cid->CMapName = (char *)xalloc(len + 1); + if (cid->CMapName == NULL) { + xfree(cid->CIDFontName); + xfree(cid->glyphs); + xfree(cid); + DestroyFontRec(pFont); + return AllocError; + } + strcpy(cid->CMapName, cmapname); + + cid->pixel_matrix[0] = vals->pixel_matrix[0]; + cid->pixel_matrix[1] = vals->pixel_matrix[1]; + cid->pixel_matrix[2] = vals->pixel_matrix[2]; + cid->pixel_matrix[3] = vals->pixel_matrix[3]; + + pFont->fontPrivate = (unsigned char *)cid; + + pFont->info.fontAscent = + (CIDFontP->CIDfontInfoP[CIDFONTBBOX].value.data.arrayP[3].data.integer * + vals->pixel_matrix[3] + + (CIDFontP->CIDfontInfoP[CIDFONTBBOX].value.data.arrayP[3].data.integer > + 0 ? 500 : -500)) / 1000; + + pFont->info.fontDescent = + -(int)((double)CIDFontP->CIDfontInfoP[CIDFONTBBOX].value.data.arrayP[1].data.integer + * vals->pixel_matrix[3] + + (CIDFontP->CIDfontInfoP[CIDFONTBBOX].value.data.arrayP[1].data.integer > + 0 ? 500 : -500)) / 1000; + + /* Adobe does not put isFixedPitch entries in CID-keyed fonts. */ + /* CID-keyed are not constant-width fonts. */ + pFont->info.constantWidth = 0; + + sAscent = CIDFontP->CIDfontInfoP[CIDFONTBBOX].value.data.arrayP[3].data.integer; + sDescent = -CIDFontP->CIDfontInfoP[CIDFONTBBOX].value.data.arrayP[1].data.integer; + + if (strncmp(entry->name.name, "-bogus", 6)) { +#ifdef CID_ALL_CHARS + ComputeBoundsAllChars(pFont, cfmfilename, sxmult); +#else +#ifdef HAVE_CFM + CIDFillFontInfo(pFont, vals, cidfontname, entry->name.name, cmapname, + cfmfilename, sAscent, sDescent, sxmult); +#else + CIDFillFontInfo(pFont, vals, cidfontname, entry->name.name, cmapname, + sAscent, sDescent, sxmult); +#endif /* HAVE_CFM */ +#endif /* CID_ALL_CHARS */ + } + + *ppFont = pFont; + + return Successful; +} +#endif /*ARGSUSED*/ -int Type1OpenScalable (fpe, ppFont, flags, entry, fileName, vals, format, - fmask, non_cachable_font) - FontPathElementPtr fpe; - FontPtr *ppFont; - int flags; - FontEntryPtr entry; - char *fileName; - FontScalablePtr vals; - fsBitmapFormat format; - fsBitmapFormatMask fmask; - FontPtr non_cachable_font; /* We don't do licensing */ +int +Type1OpenScalable (FontPathElementPtr fpe, + FontPtr *ppFont, + int flags, + FontEntryPtr entry, + char *fileName, + FontScalablePtr vals, + fsBitmapFormat format, + fsBitmapFormatMask fmask, + FontPtr non_cachable_font) /* We don't do licensing */ { - extern struct XYspace *IDENTITY; - extern Bool fontfcnA(); - extern struct region *fontfcnB(); - - FontPtr pFont; int bit, byte, @@ -147,7 +503,7 @@ int Type1OpenScalable (fpe, ppFont, flags, entry, fileName, vals, format, scan, image; int pad,wordsize; /* scan & image in bits */ - unsigned long *pool; /* memory pool for ximager objects */ + long *pool; /* memory pool for ximager objects */ int size; /* for memory size calculations */ struct XYspace *S; /* coordinate space for character */ struct region *area; @@ -156,7 +512,8 @@ int Type1OpenScalable (fpe, ppFont, flags, entry, fileName, vals, format, int len, rc, count = 0; struct type1font *type1; char *p; - psobj *fontencoding = NULL; + FontMapPtr mapping = NULL; + int no_mapping; psobj *fontmatrix; long x0, total_width = 0, total_raw_width = 0; double x1, y1, t1 = .001, t2 = 0.0, t3 = 0.0, t4 = .001; @@ -179,24 +536,28 @@ int Type1OpenScalable (fpe, ppFont, flags, entry, fileName, vals, format, #define PAD(bits, pad) (((bits)+(pad)-1)&-(pad)) - pFont = (FontPtr) xalloc(sizeof(FontRec)); + pFont = CreateFontRec(); if (pFont == NULL) return AllocError; - + type1 = (struct type1font *)xalloc(sizeof(struct type1font)); if (type1 == NULL) { - xfree(pFont); + DestroyFontRec(pFont); return AllocError; } bzero(type1, sizeof(struct type1font)); /* heuristic for "maximum" size of pool we'll need: */ - size = 200000 + 120 * +#ifdef BUILDCID + size = 400000 + 600 * +#else + size = 200000 + 600 * +#endif (int)hypot(vals->pixel_matrix[2], vals->pixel_matrix[3]) * sizeof(short); - if (size < 0 || NULL == (pool = (unsigned long *) xalloc(size))) { + if (size < 0 || NULL == (pool = (long *) xalloc(size))) { xfree(type1); - xfree(pFont); + DestroyFontRec(pFont); return AllocError; } @@ -209,7 +570,7 @@ int Type1OpenScalable (fpe, ppFont, flags, entry, fileName, vals, format, if (!fontfcnA(fileName, &rc)) { delmemory(); xfree(type1); - xfree(pFont); + DestroyFontRec(pFont); xfree(pool); return Type1ReturnCodeToXReturnCode(rc); } @@ -229,61 +590,103 @@ int Type1OpenScalable (fpe, ppFont, flags, entry, fileName, vals, format, assign(3, t4, .001); } - S = (struct XYspace *) t1_Transform(IDENTITY, t1, t2, t3, t4); + S = (struct XYspace *) t1_Transform((struct xobject *)IDENTITY, + t1, t2, t3, t4); - S = (struct XYspace *) Permanent(t1_Transform(S, vals->pixel_matrix[0], - -vals->pixel_matrix[1], - vals->pixel_matrix[2], - -vals->pixel_matrix[3])); + S = (struct XYspace *) Permanent(t1_Transform((struct xobject *)S, + vals->pixel_matrix[0], + -vals->pixel_matrix[1], + vals->pixel_matrix[2], + -vals->pixel_matrix[3])); /* multiplier for computation of raw values */ sxmult = hypot(vals->pixel_matrix[0], vals->pixel_matrix[1]); if (sxmult > EPS) sxmult = 1000.0 / sxmult; - p = entry->name.name + entry->name.length - 19; - if (entry->name.ndashes == 14 && - p >= entry->name.name && - !strcmp (p, "-adobe-fontspecific")) - { - fontencoding = FontP->fontInfoP[ENCODING].value.data.arrayP; + no_mapping=0; + p = FontEncFromXLFD(entry->name.name, entry->name.length); + + if(p==0) { /* XLFD does not specify an encoding */ + mapping=0; + no_mapping=2; /* ISO 8859-1 */ } - if (!fontencoding) - fontencoding = ISOLatin1EncArrayP; + if(!strcmp(p, "adobe-fontspecific")) { + mapping=0; + no_mapping=1; /* font's native encoding vector */ + } + + if(!no_mapping) { + mapping = FontEncMapFind(p, + FONT_ENCODING_POSTSCRIPT, -1, -1, + fileName); + if(!mapping) + mapping = FontEncMapFind(p, + FONT_ENCODING_UNICODE, -1, -1, + fileName); + if(!mapping) + no_mapping=2; + else + no_mapping=0; + } pFont->info.firstCol = 255; - pFont->info.lastCol = FIRSTCOL; + pFont->info.lastCol = 0; - for (i=0; i < 256-FIRSTCOL; i++) { + for (i=0; i < 256; i++) { long h,w; long paddedW; int j; char *codename; - codename = fontencoding[i + FIRSTCOL].data.valueP; - len = fontencoding[i + FIRSTCOL].len; - if (len == 7 && strcmp(codename,".notdef")==0) - continue; - + if(no_mapping == 1) { + codename = FontP->fontInfoP[ENCODING]. + value.data.arrayP[i].data.valueP; + len = FontP->fontInfoP[ENCODING]. + value.data.arrayP[i].len; + } else if(no_mapping) { + codename = unicodetoPSname(i); + len = codename ? strlen(codename) : 0; + } else { + if(mapping->type == FONT_ENCODING_UNICODE) { + codename = unicodetoPSname(FontEncRecode(i, mapping)); + } else + codename = FontEncName(i, mapping); + len=codename?strlen(codename):0; + } + + /* Avoid multiply rasterising the undefined glyph */ + if(len==7 && !strncmp(codename, ".notdef", 7)) { + len=0; + codename=0; + } + + /* But do rasterise it at least once */ + if(len==0) { + if(i==0) { + codename=".notdef"; + len=7; + } else + continue; + } + /* See if this character is in the list of ranges specified in the XLFD name */ - for (j = 0; j < vals->nranges; j++) - if (i + FIRSTCOL >= minchar(vals->ranges[j]) && - i + FIRSTCOL <= maxchar(vals->ranges[j])) - break; + if(i!=0) { + for (j = 0; j < vals->nranges; j++) + if (i >= minchar(vals->ranges[j]) && + i <= maxchar(vals->ranges[j])) + break; - /* If not, don't realize it. */ - if (vals->nranges && j == vals->nranges) - continue; - - if (pFont->info.firstCol > i + FIRSTCOL) - pFont->info.firstCol = i + FIRSTCOL; - if (pFont->info.lastCol < i + FIRSTCOL) - pFont->info.lastCol = i + FIRSTCOL; + /* If not, don't realize it. */ + if (vals->nranges && j == vals->nranges) + continue; + } rc = 0; - area = fontfcnB(S, codename, &len, &rc); + area = (struct region *)fontfcnB(S, (unsigned char *)codename, + &len, &rc); if (rc < 0) { rc = Type1ReturnCodeToXReturnCode(rc); break; @@ -294,6 +697,11 @@ int Type1OpenScalable (fpe, ppFont, flags, entry, fileName, vals, format, if (area == NULL) continue; + if (pFont->info.firstCol > i) + pFont->info.firstCol = i; + if (pFont->info.lastCol < i) + pFont->info.lastCol = i; + h = area->ymax - area->ymin; w = area->xmax - area->xmin; paddedW = PAD(w, pad); @@ -356,16 +764,16 @@ int Type1OpenScalable (fpe, ppFont, flags, entry, fileName, vals, format, if (pFont->info.firstCol > pFont->info.lastCol) { xfree(type1); - xfree(pFont); + DestroyFontRec(pFont); return BadFontName; } - if (i != 256 - FIRSTCOL) { + if (i != 256) { for (i--; i >= 0; i--) if (glyphs[i].bits != NULL) xfree(glyphs[i].bits); xfree(type1); - xfree(pFont); + DestroyFontRec(pFont); return rc; } type1->pDefault = NULL; @@ -385,8 +793,6 @@ int Type1OpenScalable (fpe, ppFont, flags, entry, fileName, vals, format, pFont->unload_font = Type1CloseFont; pFont->unload_glyphs = NULL; pFont->refcnt = 0; - pFont->maxPrivate = -1; - pFont->devPrivates = 0; pFont->fontPrivate = (unsigned char *) type1; @@ -408,15 +814,283 @@ int Type1OpenScalable (fpe, ppFont, flags, entry, fileName, vals, format, *ppFont = pFont; return Successful; } + +#ifdef BUILDCID +unsigned int +getCID(FontPtr pFont, unsigned int charcode) +{ + unsigned int cidcode = 0; + Bool charvalid = FALSE; + cidglyphs *cid; + int i, j; + unsigned int char_row, char_col, rangelo_row, rangelo_col, k; + unsigned int rangehi_row, rangehi_col; + spacerange *spacerangeP; + cidrange *notdefrangeP, *cidrangeP; + + cid = (cidglyphs *)pFont->fontPrivate; + + if (cid == NULL) + return cidcode; + + char_row = (charcode >> 8) & 0xff; + char_col = charcode & 0xff; + + spacerangeP = CIDFontP->spacerangeP; + for (i = 0; i < CIDFontP->spacerangecnt; i++) { + for (j = 0; j < spacerangeP->rangecnt; j++) { + rangelo_row = + (spacerangeP->spacecode[j].srcCodeLo >> 8) & 0xff; + rangelo_col = spacerangeP->spacecode[j].srcCodeLo & 0xff; + rangehi_row = + (spacerangeP->spacecode[j].srcCodeHi >> 8) & 0xff; + rangehi_col = spacerangeP->spacecode[j].srcCodeHi & 0xff; + if (char_row >= rangelo_row && char_row <= rangehi_row && + char_col >= rangelo_col && char_col <= rangehi_col) { + charvalid = TRUE; + break; + } + } + if (charvalid) break; + spacerangeP = spacerangeP->next; + } + + if (charvalid) { + charvalid = FALSE; + cidrangeP = CIDFontP->cidrangeP; + for (i = 0; i < CIDFontP->cidrangecnt; i++) { + for (j = 0; j < cidrangeP->rangecnt; j++) { + rangelo_row = + (cidrangeP->range[j].srcCodeLo >> 8) & 0xff; + rangelo_col = cidrangeP->range[j].srcCodeLo & 0xff; + rangehi_row = + (cidrangeP->range[j].srcCodeHi >> 8) & 0xff; + rangehi_col = cidrangeP->range[j].srcCodeHi & 0xff; + if (char_row >= rangelo_row && char_row <= rangehi_row && + char_col >= rangelo_col && char_col <= rangehi_col) { + charvalid = TRUE; + for (k = cidrangeP->range[j].srcCodeLo; + k <= cidrangeP->range[j].srcCodeHi; k++) { + if (k == charcode) + cidcode = cidrangeP->range[j].dstCIDLo + k - + cidrangeP->range[j].srcCodeLo; + } + break; + } + } + if (charvalid) break; + cidrangeP = cidrangeP->next; + } + } + + if (charvalid) { + charvalid = FALSE; + notdefrangeP = CIDFontP->notdefrangeP; + for (i = 0; i < CIDFontP->notdefrangecnt; i++) { + for (j = 0; j < notdefrangeP->rangecnt; j++) { + rangelo_row = + (notdefrangeP->range[j].srcCodeLo >> 8) & 0xff; + rangelo_col = notdefrangeP->range[j].srcCodeLo & 0xff; + rangehi_row = + (notdefrangeP->range[j].srcCodeHi >> 8) & 0xff; + rangehi_col = notdefrangeP->range[j].srcCodeHi & 0xff; + if (char_row >= rangelo_row && char_row <= rangehi_row && + char_col >= rangelo_col && char_col <= rangehi_col) { + charvalid = TRUE; + for (k = notdefrangeP->range[j].srcCodeLo; + k <= notdefrangeP->range[j].srcCodeHi; k++) { + if (k == charcode) + /* the whole range is mapped to a single CID code */ + cidcode = notdefrangeP->range[j].dstCIDLo; + } + break; + } + } + if (charvalid) break; + notdefrangeP = notdefrangeP->next; + } + } + + /* If you specify a CMap that has more CIDs than a specified CIDFont, */ + /* the program could go beyond the number of entries in CIDMap. Make */ + /* sure that that does not happen. */ + if (cidcode < CIDFontP->CIDfontInfoP[CIDCOUNT].value.data.integer) + return cidcode; + else + return 0; +} + +static CharInfoPtr +CIDGetGlyph(FontPtr pFont, unsigned int charcode, CharInfoPtr pci) +{ + int rc; + CharInfoPtr cp = NULL; + unsigned int cidcode; + + /* character code -> CID */ + cidcode = getCID(pFont, charcode); + + cp = CIDGetGlyphInfo(pFont, cidcode, pci, &rc); + + if (rc != Successful && cidcode) { + cidcode = 0; + cp = CIDGetGlyphInfo(pFont, cidcode, pci, &rc); + } + + return cp; +} + +int +CIDGetGlyphs(FontPtr pFont, + unsigned long count, + unsigned char *chars, + FontEncoding charEncoding, + unsigned long *glyphCount, /* RETURN */ + CharInfoPtr *glyphs) /* RETURN */ +{ + unsigned int firstRow, numRows, code, char_row, char_col; + CharInfoPtr *glyphsBase; + register unsigned int c; + CharInfoPtr pci; + CharInfoPtr pDefault; + cidglyphs *cid; + register int firstCol; + int rc = 0; + int cid_valid = 0; + + cid = (cidglyphs *)pFont->fontPrivate; + + FontP = NULL; + + firstCol = pFont->info.firstCol; + pDefault = cid->pDefault; + glyphsBase = glyphs; + + switch (charEncoding) { + +#define EXIST(pci) \ + ((pci)->metrics.attributes || \ + (pci)->metrics.ascent != -(pci)->metrics.descent || \ + (pci)->metrics.leftSideBearing != (pci)->metrics.rightSideBearing) + + case Linear8Bit: + case TwoD8Bit: + if (pFont->info.firstRow > 0) + break; + while (count--) { + c = (*chars++); + if (c >= firstCol && c <= pFont->info.lastCol) { + code = c - firstCol; + if (!(pci = (CharInfoRec *)cid->glyphs[code]) || + ((long)pci->bits == CID_BITMAP_UNDEFINED)) { + /* load font if not already loaded */ + if(!cid_valid) { + if(!CIDfontfcnA(cid->CIDFontName, cid->CMapName, &rc)) { FontP = NULL; + return Type1ReturnCodeToXReturnCode(rc); + } + cid_valid = 1; + } + pci = CIDGetGlyph(pFont, c, pci); + } + if (pci && EXIST(pci)) { + *glyphs++ = pci; + cid->glyphs[code] = pci; + } else if (pDefault) { + *glyphs++ = pDefault; + cid->glyphs[code] = pDefault; + } + } else if (pDefault) + *glyphs++ = pDefault; + } + break; + case Linear16Bit: + while (count--) { + char_row = *chars++; + char_col = *chars++; + c = char_row << 8; + c = (c | char_col); + if (pFont->info.firstRow <= char_row && char_row <= + pFont->info.lastRow && pFont->info.firstCol <= char_col && + char_col <= pFont->info.lastCol) { + code = pFont->info.lastCol - pFont->info.firstCol + 1; + char_row = char_row - pFont->info.firstRow; + char_col = char_col - pFont->info.firstCol; + code = char_row * code + char_col; + if (!(pci = (CharInfoRec *)cid->glyphs[code]) || + ((long)pci->bits == CID_BITMAP_UNDEFINED)) { + /* load font if not already loaded */ + if(!cid_valid) { + if(!CIDfontfcnA(cid->CIDFontName, cid->CMapName, &rc)) { FontP = NULL; + return Type1ReturnCodeToXReturnCode(rc); + } + cid_valid = 1; + } + pci = CIDGetGlyph(pFont, c, pci); + } + if (pci && EXIST(pci)) { + *glyphs++ = pci; + cid->glyphs[code] = pci; + } else if (pDefault) { + *glyphs++ = pDefault; + cid->glyphs[code] = pDefault; + } + } else if (pDefault) + *glyphs++ = pDefault; + } + break; + + case TwoD16Bit: + firstRow = pFont->info.firstRow; + numRows = pFont->info.lastRow - firstRow + 1; + while (count--) { + char_row = (*chars++); + char_col = (*chars++); + c = char_row << 8; + c = (c | char_col); + if (pFont->info.firstRow <= char_row && char_row <= + pFont->info.lastRow && pFont->info.firstCol <= char_col && + char_col <= pFont->info.lastCol) { + code = pFont->info.lastCol - pFont->info.firstCol + 1; + char_row = char_row - pFont->info.firstRow; + char_col = char_col - pFont->info.firstCol; + code = char_row * code + char_col; + if (!(pci = (CharInfoRec *)cid->glyphs[code]) || + ((long)pci->bits == CID_BITMAP_UNDEFINED)) { + /* load font if not already loaded */ + if(!cid_valid) { + if(!CIDfontfcnA(cid->CIDFontName, cid->CMapName, &rc)) { FontP = NULL; + return Type1ReturnCodeToXReturnCode(rc); + } + cid_valid = 1; + } + pci = CIDGetGlyph(pFont, c, pci); + } + if (pci && EXIST(pci)) { + *glyphs++ = pci; + cid->glyphs[code] = pci; + } else if (pDefault) { + *glyphs++ = pDefault; + cid->glyphs[code] = pDefault; + } + } else if (pDefault) + *glyphs++ = pDefault; + } + break; + } + *glyphCount = glyphs - glyphsBase; + return Successful; + +#undef EXIST +} +#endif static int -Type1GetGlyphs(pFont, count, chars, charEncoding, glyphCount, glyphs) - FontPtr pFont; - unsigned long count; - register unsigned char *chars; - FontEncoding charEncoding; - unsigned long *glyphCount; /* RETURN */ - CharInfoPtr *glyphs; /* RETURN */ +Type1GetGlyphs(FontPtr pFont, + unsigned long count, + unsigned char *chars, + FontEncoding charEncoding, + unsigned long *glyphCount, /* RETURN */ + CharInfoPtr *glyphs) /* RETURN */ { unsigned int firstRow; unsigned int numRows; @@ -447,7 +1121,7 @@ Type1GetGlyphs(pFont, count, chars, charEncoding, glyphCount, glyphs) while (count--) { c = (*chars++); if (c >= firstCol && - (pci = &type1Font->glyphs[c-FIRSTCOL]) && + (pci = &type1Font->glyphs[c]) && EXIST(pci)) *glyphs++ = pci; else if (pDefault) @@ -459,7 +1133,7 @@ Type1GetGlyphs(pFont, count, chars, charEncoding, glyphCount, glyphs) c = *chars++ << 8; c = (c | *chars++); if (c < 256 && c >= firstCol && - (pci = &type1Font->glyphs[c-FIRSTCOL]) && + (pci = &type1Font->glyphs[c]) && EXIST(pci)) *glyphs++ = pci; else if (pDefault) @@ -474,7 +1148,7 @@ Type1GetGlyphs(pFont, count, chars, charEncoding, glyphCount, glyphs) r = (*chars++) - firstRow; c = (*chars++); if (r < numRows && c < 256 && c >= firstCol && - (pci = &type1Font->glyphs[(r << 8) + c - FIRSTCOL]) && + (pci = &type1Font->glyphs[(r << 8) + c]) && EXIST(pci)) *glyphs++ = pci; else if (pDefault) @@ -487,15 +1161,67 @@ Type1GetGlyphs(pFont, count, chars, charEncoding, glyphCount, glyphs) #undef EXIST } - + +#ifdef BUILDCID +static CharInfoRec nonExistantChar; + +int +CIDGetMetrics(FontPtr pFont, + unsigned long count, + unsigned char *chars, + FontEncoding charEncoding, + unsigned long *glyphCount, /* RETURN */ + xCharInfo **glyphs) /* RETURN */ +{ + int ret; + cidglyphs *cid; + CharInfoPtr oldDefault; + char cidafmname[CID_PATH_MAX]; + char CIDFontName[CID_NAME_MAX]; + char *ptr; + + cid = (cidglyphs *)pFont->fontPrivate; + + strcpy(cidafmname, cid->CIDFontName); + if (!(ptr = strrchr(cidafmname, '/'))) + return BadFontName; + + *ptr = '\0'; + + strcpy(CIDFontName, ptr + 1); + + if (!(ptr = strrchr(cidafmname, '/'))) + return BadFontName; + + *ptr = '\0'; + + strcat(cidafmname, "/AFM/"); + strcat(cidafmname, CIDFontName); + + strcat(cidafmname, ".afm"); + + oldDefault = cid->pDefault; + cid->pDefault = &nonExistantChar; + + ret = CIDGetAFM(pFont, count, chars, charEncoding, glyphCount, (CharInfoPtr +*)glyphs, cidafmname); + if (ret != Successful) + ret = CIDGetGlyphs(pFont, count, chars, charEncoding, glyphCount, + (CharInfoPtr *)glyphs); + + *ptr = 0; + cid->pDefault = oldDefault; + return ret; +} +#endif + static int -Type1GetMetrics(pFont, count, chars, charEncoding, glyphCount, glyphs) - FontPtr pFont; - unsigned long count; - register unsigned char *chars; - FontEncoding charEncoding; - unsigned long *glyphCount; /* RETURN */ - xCharInfo **glyphs; /* RETURN */ +Type1GetMetrics(FontPtr pFont, + unsigned long count, + unsigned char *chars, + FontEncoding charEncoding, + unsigned long *glyphCount, /* RETURN */ + xCharInfo **glyphs) /* RETURN */ { static CharInfoRec nonExistantChar; @@ -510,15 +1236,75 @@ Type1GetMetrics(pFont, count, chars, charEncoding, glyphCount, glyphs) type1Font->pDefault = oldDefault; return ret; } - -void Type1CloseFont(pFont) - FontPtr pFont; + +#ifdef BUILDCID +void +CIDCloseFont(FontPtr pFont) +{ + register int i; + cidglyphs *cid; + int nchars; + + if (pFont) { + + cid = (cidglyphs *)pFont->fontPrivate; + + if (cid) { + + if (cid->CIDFontName && !strcmp(cid->CIDFontName, CurCIDFontName) + && cid->CMapName && !strcmp(cid->CMapName, CurCMapName)){ + strcpy(CurCIDFontName, ""); /* initialize to none */ + strcpy(CurCMapName, ""); /* initialize to none */ + } + + if (cid->CIDFontName) + xfree(cid->CIDFontName); + + if (cid->CMapName) + xfree(cid->CMapName); + + nchars = (pFont->info.lastRow - pFont->info.firstRow + 1) * + (pFont->info.lastCol - pFont->info.firstCol + 1); + + for (i = 0; i < nchars; i++) { + if (cid->glyphs[i] && (cid->glyphs[i] != &nonExistantChar)) { + if (cid->glyphs[i]->bits) + xfree(cid->glyphs[i]->bits); + xfree(cid->glyphs[i]); + } + } + + if (cid->glyphs) + xfree(cid->glyphs); + + if (cid->AFMinfo) + xfree(cid->AFMinfo); +#ifdef USE_MMAP + if (cid->CIDdata) + munmap(cid->CIDdata, cid->CIDsize); +#endif + xfree(cid); + } + + if (pFont->info.props) + xfree(pFont->info.props); + + if (pFont->info.isStringProp) + xfree(pFont->info.isStringProp); + + DestroyFontRec(pFont); + } +} +#endif + +void +Type1CloseFont(FontPtr pFont) { register int i; struct type1font *type1; type1 = (struct type1font *) pFont->fontPrivate; - for (i=0; i < 256 - FIRSTCOL; i++) + for (i=0; i < 256; i++) if (type1->glyphs[i].bits != NULL) xfree(type1->glyphs[i].bits); xfree(type1); @@ -529,20 +1315,15 @@ void Type1CloseFont(pFont) if (pFont->info.isStringProp) xfree(pFont->info.isStringProp); - if (pFont->devPrivates) - xfree(pFont->devPrivates); - - xfree(pFont); + DestroyFontRec(pFont); } - - - -static void fill(dest, h, w, area, byte, bit, wordsize) - register char *dest; /* destination bitmap */ - int h,w; /* dimensions of 'dest', w padded */ - register struct region *area; /* region to write to 'dest' */ - int byte,bit; /* flags; LSBFirst or MSBFirst */ - int wordsize; /* number of bits per word for LSB/MSB purposes */ + +static void +fill(char *dest, /* destination bitmap */ + int h, int w, /* dimensions of 'dest', w padded */ + struct region *area, /* region to write to 'dest' */ + int byte, int bit, /* flags; LSBFirst or MSBFirst */ + int wordsize) /* number of bits per word for LSB/MSB purposes */ { register struct edgelist *edge; /* for looping through edges */ register char *p; /* current scan line in 'dest' */ @@ -609,7 +1390,7 @@ it: break; } default: - abort("xiFill: unknown format"); + Abort("xiFill: unknown format"); } } @@ -617,10 +1398,10 @@ it: #define ALLONES 0xFF -static void fillrun(p, x0, x1, bit) - register char *p; /* address of this scan line */ - pel x0,x1; /* left and right X */ - int bit; /* format: LSBFirst or MSBFirst */ +static void +fillrun(char *p, /* address of this scan line */ + pel x0, pel x1, /* left and right X */ + int bit) /* format: LSBFirst or MSBFirst */ { register int startmask,endmask; /* bits to set in first and last char*/ register int middle; /* number of chars between start and end + 1 */ @@ -643,33 +1424,61 @@ static void fillrun(p, x0, x1, bit) else { *p++ |= startmask; while (--middle > 0) - *p++ = ALLONES; + *p++ = (char)ALLONES; *p |= endmask; } } #define CAPABILITIES (CAP_MATRIX | CAP_CHARSUBSETTING) + +#ifdef BUILDCID +FontRendererRec CIDRendererInfo[] = { + { ".cid", 4, NULL, CIDOpenScalable, + NULL, CIDGetInfoScalable, 0, CAPABILITIES } +}; +#endif +#ifdef BUILDCID +FontRendererRec Type1RendererInfo[] = { +#else static FontRendererRec renderers[] = { - { ".pfa", 4, (int (*)()) 0, Type1OpenScalable, - (int (*)()) 0, Type1GetInfoScalable, 0, CAPABILITIES }, - { ".pfb", 4, (int (*)()) 0, Type1OpenScalable, - (int (*)()) 0, Type1GetInfoScalable, 0, CAPABILITIES } +#endif + { ".pfa", 4, NULL, Type1OpenScalable, + NULL, Type1GetInfoScalable, 0, CAPABILITIES }, + { ".pfb", 4, NULL, Type1OpenScalable, + NULL, Type1GetInfoScalable, 0, CAPABILITIES } }; - +#ifdef BUILDCID +void +CIDRegisterFontFileFunctions(void) +{ + int i; + + Type1InitStdProps(); + for (i=0; i < sizeof(CIDRendererInfo) / sizeof(FontRendererRec); i++) + FontFileRegisterRenderer(&CIDRendererInfo[i]); +} +#endif + void -Type1RegisterFontFileFunctions() +Type1RegisterFontFileFunctions(void) { int i; +#ifdef BUILDCID + Type1InitStdProps(); + for (i=0; i < sizeof(Type1RendererInfo) / sizeof(FontRendererRec); i++) + FontFilePriorityRegisterRenderer(&Type1RendererInfo[i], -10); +#else T1InitStdProps(); for (i=0; i < sizeof(renderers) / sizeof(FontRendererRec); i++) - FontFileRegisterRenderer(&renderers[i]); + FontFilePriorityRegisterRenderer(&renderers[i], -10); +#endif } -int Type1ReturnCodeToXReturnCode(rc) - int rc; +int +Type1ReturnCodeToXReturnCode(int rc) { switch(rc) { case SCAN_OK: @@ -688,7 +1497,165 @@ int Type1ReturnCodeToXReturnCode(rc) /* fall through */ default: /* this should not happen */ +#ifdef BUILDCID + ErrorF("Font return code cannot be converted to X return code: %d\n", rc); +#else ErrorF("Type1 return code not convertable to X return code: %d\n", rc); +#endif return rc; } } + +#ifdef BUILDCID +CharInfoPtr +CIDRenderGlyph(FontPtr pFont, psobj *charstringP, psobj *subarrayP, + struct blues_struct *bluesP, CharInfoPtr pci, int *mode) +{ + int bit, + byte, + glyph, + scan, + image; + int pad,wordsize; /* scan & image in bits */ + long *pool; /* memory pool for ximager objects */ + int size; /* for memory size calculations */ + struct XYspace *S; /* coordinate space for character */ + struct region *area; + CharInfoRec *glyphs; + int len, rc; + long x0; + double x1, y1, t1 = .001, t2 = 0.0, t3 = 0.0, t4 = .001; + double sxmult; + long h,w; + long paddedW; + cidglyphs *cid; + fsBitmapFormat format = 0; + fsBitmapFormatMask fmask = 0; + + cid = (cidglyphs *)pFont->fontPrivate; + + /* set up default values */ + FontDefaultFormat(&bit, &byte, &glyph, &scan); + /* get any changes made from above */ + rc = CheckFSFormat(format, fmask, &bit, &byte, &scan, &glyph, &image); + if (rc != Successful) { + *mode = rc; + return(NULL); + } + + pad = glyph * 8; + wordsize = scan * 8; + +#define PAD(bits, pad) (((bits)+(pad)-1)&-(pad)) + + /* heuristic for "maximum" size of pool we'll need: */ + size = 200000 + 600 * + (int)hypot(cid->pixel_matrix[2], cid->pixel_matrix[3]) + * sizeof(short); + if (size < 0 || NULL == (pool = (long *) xalloc(size))) { + *mode = AllocError; + return(NULL); + } + + addmemory(pool, size); + + if (pci && (long)pci->bits == CID_BITMAP_UNDEFINED) + glyphs = pci; + else { + if (!(glyphs = (CharInfoRec *)xalloc(sizeof(CharInfoRec)))) { + delmemory(); + xfree(pool); + *mode = AllocError; + return(NULL); + } + bzero(glyphs, sizeof(CharInfoRec)); + } + + S = (struct XYspace *) t1_Transform((struct xobject *)IDENTITY, + t1, t2, t3, t4); + + S = (struct XYspace *) Permanent(t1_Transform((struct xobject *)S, + cid->pixel_matrix[0], + -cid->pixel_matrix[1], + cid->pixel_matrix[2], + -cid->pixel_matrix[3])); + + /* multiplier for computation of raw values */ + sxmult = hypot(cid->pixel_matrix[0], cid->pixel_matrix[1]); + if (sxmult > EPS) sxmult = 1000.0 / sxmult; + + rc = 0; + area = (struct region *)CIDfontfcnC(S, charstringP, subarrayP, bluesP, + &len, &rc); + if (rc < 0 || area == NULL) { + delmemory(); + xfree(pool); + if (pci != glyphs) xfree(glyphs); + *mode = Type1ReturnCodeToXReturnCode(rc); + return(NULL); + } + + h = area->ymax - area->ymin; + w = area->xmax - area->xmin; + paddedW = PAD(w, pad); + + if (h > 0 && w > 0) { + size = h * paddedW / 8; + glyphs[0].bits = (char *)xalloc(size); + if (glyphs[0].bits == NULL) { + Destroy(area); + delmemory(); + xfree(pool); + if (pci != glyphs) xfree(glyphs); + *mode = AllocError; + return(NULL); + } + bzero(glyphs[0].bits, size); + } + else { + size = 0; + h = w = 0; + area->xmin = area->xmax = 0; + area->ymax = area->ymax = 0; + glyphs[0].bits = NULL; + } + + glyphs[0].metrics.leftSideBearing = area->xmin; + x1 = (double)(x0 = area->ending.x - area->origin.x); + y1 = (double)(area->ending.y - area->origin.y); + glyphs[0].metrics.characterWidth = + (x0 + (x0 > 0 ? FPHALF : -FPHALF)) / (1 << FRACTBITS); + if (!glyphs[0].metrics.characterWidth && size == 0) + { + /* Zero size and zero extents: presumably caused by + the choice of transformation. Let's create a + small bitmap so we're not mistaken for an undefined + character. */ + h = w = 1; + size = paddedW = PAD(w, pad); + glyphs[0].bits = (char *)xalloc(size); + if (glyphs[0].bits == NULL) { + Destroy(area); + delmemory(); + xfree(pool); + if (pci != glyphs) xfree(glyphs); + *mode = AllocError; + return(NULL); + } + bzero(glyphs[0].bits, size); + } + glyphs[0].metrics.attributes = + NEARESTPEL((long)(hypot(x1, y1) * sxmult)); + glyphs[0].metrics.rightSideBearing = w + area->xmin; + glyphs[0].metrics.descent = area->ymax - NEARESTPEL(area->origin.y); + glyphs[0].metrics.ascent = h - glyphs[0].metrics.descent; + + if (h > 0 && w > 0) + fill(glyphs[0].bits, h, paddedW, area, byte, bit, wordsize); + Destroy(area); + delmemory(); + xfree(pool); + *mode = Successful; + return(glyphs); +} +#endif diff --git a/src/Type1/t1imager.h b/src/Type1/t1imager.h index 472b36f..7d72495 100644 --- a/src/Type1/t1imager.h +++ b/src/Type1/t1imager.h @@ -27,41 +27,22 @@ * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS * SOFTWARE. */ +/* $XFree86: xc/lib/font/Type1/t1imager.h,v 1.5 2001/07/25 15:04:55 dawes Exp $ */ -#include "fontmisc.h" - -typedef pointer xobject; -typedef pointer location; -typedef pointer path; -typedef pointer region; -typedef pointer XYspace; - -#ifndef NOEXTERNS -/* -The following are the user entry locations to TYPE1IMAGER -*/ -extern path t1_Bezier(); -extern path t1_ClosePath(); -extern xobject t1_Destroy(); -extern xobject t1_Dup(); -extern char *t1_ErrorMsg(); -extern void t1_InitImager(); -extern region t1_Interior(); -extern location t1_ILoc(); -extern xobject t1_Join(); -extern path t1_Line(); -extern xobject t1_Permanent(); -extern path t1_Phantom(); -extern location t1_Loc(); -extern xobject t1_Scale(); -extern xobject t1_Snap(); -extern location t1_SubLoc(); -extern xobject t1_Temporary(); - -#endif + +#include "objects.h" +#include "spaces.h" +#include "paths.h" +#include "regions.h" + +typedef struct xobject *xobject; +typedef struct segment *path; +typedef struct region *region; +typedef struct XYspace *XYspace; + #ifndef NULL -#define NULL 0 +#include <stddef.h> #endif #ifndef TRUE @@ -71,57 +52,13 @@ extern xobject t1_Temporary(); #ifndef FALSE #define FALSE 0 #endif - -/* -Here are some TYPE1IMAGER functions that are defined in terms of others: -*/ - -#define t1_AddLoc(p1,p2) t1_Join(p1,p2) - -#ifndef NONAMES -/* -Define the simple form of all the subroutine names: -*/ -#define AddLoc(p1,p2) t1_AddLoc(p1,p2) -#define Bezier(B,C,D) t1_Bezier(B,C,D) -#define ClosePath(p) t1_ClosePath(p,0) -#define Complement(area) t1_Complement(area) -#define Destroy(o) t1_Destroy(o) -#define Dup(o) t1_Dup(o) -#define ErrorMsg() t1_ErrorMsg() -#define HeadSegment(p) t1_HeadSegment(p) -#define InitImager() t1_InitImager() -#define Interior(p,rule) t1_Interior(p,rule) -#define ILoc(S,x,y) t1_ILoc(S,x,y) -#define Join(p1,p2) t1_Join(p1,p2) -#define Line(P) t1_Line(P) -#define Permanent(o) t1_Permanent(o) -#define Phantom(o) t1_Phantom(o) -#define Loc(S,x,y) t1_Loc(S,(double)x,(double)y) -#define Scale(o,sx,sy) t1_Scale(o,(double)sx,(double)sy) -#define Snap(o) t1_Snap(o) -#define SubLoc(a,b) t1_SubLoc(a,b) -#define Temporary(o) t1_Temporary(o) -#define TermImager() t1_TermImager() -#define Transform(o,cxx,cyx,cxy,cyy) t1_Transform(o,(double)cxx,(double)cyx,\ - (double)cxy,(double)cyy) - -#endif - + + #define WINDINGRULE -2 #define EVENODDRULE -3 #define CONTINUITY 0x80 /* can be added to above rules; e.g. WINDINGRULE+CONTINUITY */ -/* -Stroke() line style constants: -*/ - -/* -Coordinate space constants: -*/ -#define IDENTITY t1_Identity -extern XYspace *IDENTITY; /* Generic null object definition: @@ -145,4 +82,3 @@ extern region *INFINITY; #define FF_PARSE_ERROR 5 #define FF_PATH 1 -extern pointer xiStub(); diff --git a/src/Type1/t1info.c b/src/Type1/t1info.c index dff6257..0ee137f 100644 --- a/src/Type1/t1info.c +++ b/src/Type1/t1info.c @@ -82,13 +82,66 @@ other dealings in this Software without prior written authorization from The Open Group. */ +/* Copyright (c) 1994-1999 Silicon Graphics, Inc. All Rights Reserved. + * + * The contents of this file are subject to the CID Font Code Public Licence + * Version 1.0 (the "License"). You may not use this file except in compliance + * with the Licence. You may obtain a copy of the License at Silicon Graphics, + * Inc., attn: Legal Services, 2011 N. Shoreline Blvd., Mountain View, CA + * 94043 or at http://www.sgi.com/software/opensource/cid/license.html. + * + * Software distributed under the License is distributed on an "AS IS" basis. + * ALL WARRANTIES ARE DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED + * WARRANTIES OF MERCHANTABILITY, OF FITNESS FOR A PARTICULAR PURPOSE OR OF + * NON-INFRINGEMENT. See the License for the specific language governing + * rights and limitations under the License. + * + * The Original Software is CID font code that was developed by Silicon + * Graphics, Inc. + */ +/* $XFree86: xc/lib/font/Type1/t1info.c,v 1.18 2002/09/10 16:14:33 tsi Exp $ */ -#include <stdio.h> #include "fntfilst.h" +#include "fontutil.h" +#ifndef FONTMODULE +#include <stdio.h> +#ifndef BUILDCID +#include <math.h> +#endif +#else +#include "xf86_ansic.h" +#endif #include "FSproto.h" -#include "t1intf.h" + +#ifdef BUILDCID +#ifndef FONTMODULE +#ifdef _XOPEN_SOURCE #include <math.h> - +#else +#define _XOPEN_SOURCE +#include <math.h> +#undef _XOPEN_SOURCE +#endif +#endif +#include "objects.h" +#include "spaces.h" +#include "range.h" +#endif + +#ifdef BUILDCID +#include "util.h" +#include "fontfcn.h" + +#if defined(HAVE_CFM) || defined(CID_ALL_CHARS) +#ifndef DEFAULT_CFM_DIR +#define DEFAULT_CFM_DIR "./" +#endif +char cfmDefaultDir[] = DEFAULT_CFM_DIR; +#define CFMMAGIC 0x91239123 +#endif +#endif +#include "t1intf.h" + #define DECIPOINTSPERINCH 722.7 #define DEFAULTRES 75 #define DEFAULTPOINTSIZE 120 @@ -97,7 +150,22 @@ enum scaleType { atom, truncate_atom, pixel_size, point_size, resolution_x, resolution_y, average_width }; - + +#ifdef BUILDCID +extern cidfont *CIDFontP; +static int stdpropsinit = 0; + +typedef struct cfm_rec { + xCharInfo maxbounds; + xCharInfo minbounds; + xCharInfo ink_maxbounds; + xCharInfo ink_minbounds; + INT32 totalrw; + INT16 maxo; + INT16 alle; +} cfmrec; +#endif + typedef struct _fontProp { char *name; long atom; @@ -131,7 +199,9 @@ static fontProp extraProps[] = { { "RAW_ASCENT", 0, }, { "RAW_DESCENT", 0, }, { "RAW_AVERAGE_WIDTH", 0, }, - { "FACE_NAME", 0, } + { "FACE_NAME", 0, }, + { "FONT_TYPE", 0, }, + { "RASTERIZER_NAME", 0, } }; /* this is a bit kludgy */ @@ -143,6 +213,8 @@ static fontProp extraProps[] = { #define RAWDESCENTPROP 5 #define RAWWIDTHPROP 6 #define FACE_NAMEPROP 7 +#define FONT_TYPEPROP 8 +#define RASTERIZER_NAMEPROP 9 #define NNAMEPROPS (sizeof(fontNamePropTable) / sizeof(fontProp)) #define NEXTRAPROPS (sizeof(extraProps) / sizeof(fontProp)) @@ -151,9 +223,7 @@ static fontProp extraProps[] = { /*ARGSUSED*/ static void -FillHeader(pInfo, Vals) - FontInfoPtr pInfo; - FontScalablePtr Vals; +FillHeader(FontInfoPtr pInfo, FontScalablePtr Vals) { /* OpenScalable in T1FUNCS sets the following: pInfo->firstCol, @@ -175,10 +245,7 @@ FillHeader(pInfo, Vals) } static void -adjust_min_max(minc, maxc, tmp) - xCharInfo *minc, - *maxc, - *tmp; +adjust_min_max(xCharInfo *minc, xCharInfo *maxc, xCharInfo *tmp) { #define MINMAX(field,ci) \ if (minc->field > (ci)->field) \ @@ -203,10 +270,7 @@ adjust_min_max(minc, maxc, tmp) } static void -ComputeBounds(pInfo, pChars, Vals) - FontInfoPtr pInfo; - CharInfoPtr pChars; - FontScalablePtr Vals; +ComputeBounds(FontInfoPtr pInfo, CharInfoPtr pChars, FontScalablePtr Vals) { int i; xCharInfo minchar, maxchar; @@ -224,7 +288,7 @@ ComputeBounds(pInfo, pChars, Vals) maxlap = -32767; totchars = pInfo->lastCol - pInfo->firstCol + 1; - pChars += pInfo->firstCol - FIRSTCOL; + pChars += pInfo->firstCol; pInfo->allExist = 1; for (i = 0; i < totchars; i++,pChars++) { xCharInfo *pmetrics = &pChars->metrics; @@ -262,14 +326,252 @@ ComputeBounds(pInfo, pChars, Vals) */ FontComputeInfoAccelerators (pInfo); } - + +#ifdef BUILDCID +#ifdef CID_ALL_CHARS +void +ComputeBoundsAllChars(FontPtr pFont, char *cfmfilename, double sxmult) +{ + FILE *cfm; + CARD32 magic; + int count = 0; + int maxlap, overlap, i, j, k, ret; + xCharInfo minchar, maxchar; + cidrange *cidrangeP; + unsigned char ccode[2]; + unsigned long ccount; + xCharInfo *pmetrics; + long total_raw_width = 0, total_width = 0; + char cfmd[CID_PATH_MAX]; + cfmrec *cfmp; + char *p; + + if (!(cfm = fopen(cfmfilename, "w"))) { + fprintf(stderr, + "Unable to open the file %s. You are probably not logged in as root.\n", + cfmfilename); + p = strrchr(cfmfilename, '/'); + if (p == NULL) exit(1); + strcpy(cfmd, cfmDefaultDir); + strcat(cfmd, p + 1); + if (!(cfm = fopen(cfmd, "w"))) { + fprintf(stderr, + "Switching to current directory. Unable to open the file %s.\n", + cfmd); + exit(1); + } + } + + if ((cfmp = (cfmrec *)xalloc(sizeof(cfmrec))) == NULL) { + fprintf(stderr, "Unable to allocate memory."); + exit(1); + } + bzero(cfmp, sizeof(cfmrec)); + + minchar.ascent = minchar.descent = + minchar.leftSideBearing = minchar.rightSideBearing = + minchar.characterWidth = minchar.attributes = 32767; + maxchar.ascent = maxchar.descent = + maxchar.leftSideBearing = maxchar.rightSideBearing = + maxchar.characterWidth = maxchar.attributes = -32767; + + maxlap = -32767; + cfmp->alle = 1; + cidrangeP = CIDFontP->cidrangeP; + + /* go through all character codes specified in a given CMap */ + for (i = 0; i < CIDFontP->cidrangecnt; i++) { + for (j = 0; j < cidrangeP->rangecnt; j++) { + for (k = cidrangeP->range[j].srcCodeLo; + k <= cidrangeP->range[j].srcCodeHi; k++) { + ccode[0] = (k >> 8) & 0xff; + ccode[1] = k & 0xff; + ret = CIDGetMetrics(pFont, 1, ccode, 2, &ccount, &pmetrics); + if (ret != Successful || (ret == Successful && pmetrics == NULL)) + continue; + total_width += pmetrics->attributes; + total_raw_width += abs((int)(INT16)pmetrics->attributes); + if (pmetrics->attributes || + pmetrics->ascent != -pmetrics->descent || + pmetrics->leftSideBearing != pmetrics->rightSideBearing) { + count++; + adjust_min_max(&minchar, &maxchar, pmetrics); + overlap = pmetrics->rightSideBearing - pmetrics->characterWidth; + if (overlap > maxlap) maxlap = overlap; + } + else cfmp->alle = 0; + } + } + } + + if (count) + { + total_raw_width = (total_raw_width * 10 + count / 2) / count; + if (total_width < 0) + { + /* Predominant direction is R->L */ + total_raw_width = -total_raw_width; + } + } + + cfmp->totalrw = (INT32)total_raw_width; + + cfmp->maxbounds.leftSideBearing = + floor((double)maxchar.leftSideBearing * sxmult + 0.5); + cfmp->maxbounds.rightSideBearing = + floor((double)maxchar.rightSideBearing * sxmult + 0.5); + cfmp->maxbounds.characterWidth = + floor((double)maxchar.characterWidth * sxmult + 0.5); + cfmp->maxbounds.ascent = + floor((double)maxchar.ascent * sxmult + 0.5); + cfmp->maxbounds.descent = + floor((double)maxchar.descent * sxmult); + cfmp->maxbounds.attributes = maxchar.attributes; + + cfmp->minbounds.leftSideBearing = + floor((double)minchar.leftSideBearing * sxmult + 0.5); + cfmp->minbounds.rightSideBearing = + floor((double)minchar.rightSideBearing * sxmult + 0.5); + cfmp->minbounds.characterWidth = + floor((double)minchar.characterWidth * sxmult + 0.5); + cfmp->minbounds.ascent = + floor((double)minchar.ascent * sxmult + 0.5); + cfmp->minbounds.descent = + floor((double)minchar.descent * sxmult + 0.5); + cfmp->minbounds.attributes = minchar.attributes; + + cfmp->ink_maxbounds.leftSideBearing = + floor((double)maxchar.leftSideBearing * sxmult + 0.5); + cfmp->ink_maxbounds.rightSideBearing = + floor((double)maxchar.rightSideBearing * sxmult + 0.5); + cfmp->ink_maxbounds.characterWidth = + floor((double)maxchar.characterWidth * sxmult + 0.5); + cfmp->ink_maxbounds.ascent = + floor((double)maxchar.ascent * sxmult + 0.5); + cfmp->ink_maxbounds.descent = + floor((double)maxchar.descent * sxmult + 0.5); + cfmp->ink_maxbounds.attributes = maxchar.attributes; + + cfmp->ink_minbounds.leftSideBearing = + floor((double)minchar.leftSideBearing * sxmult + 0.5); + cfmp->ink_minbounds.rightSideBearing = + floor((double)minchar.rightSideBearing * sxmult + 0.5); + cfmp->ink_minbounds.characterWidth = + floor((double)minchar.characterWidth * sxmult + 0.5); + cfmp->ink_minbounds.ascent = + floor((double)minchar.ascent * sxmult + 0.5); + cfmp->ink_minbounds.descent = + floor((double)minchar.descent * sxmult + 0.5); + cfmp->ink_minbounds.attributes = minchar.attributes; + + cfmp->maxo = (INT32)(maxlap + -(minchar.leftSideBearing)); + + magic = CFMMAGIC; + fwrite(&magic, sizeof(CARD32), 1, cfm); + fwrite(cfmp, sizeof(cfmrec), 1, cfm); + xfree(cfmp); + fclose(cfm); +} +#else +static long +ComputeBoundsAll(FontPtr pFont) +{ + int count = 0; + int maxlap, overlap, i, j, k, ret; + xCharInfo minchar, maxchar; + cidrange *cidrangeP; + unsigned char ccode[2]; + unsigned long ccount; + xCharInfo *pmetrics; + CharInfoRec *cinfo[1]; + long total_raw_width = 0, total_width = 0; + FontInfoPtr pInfo = &(pFont->info); + + minchar.ascent = minchar.descent = + minchar.leftSideBearing = minchar.rightSideBearing = + minchar.characterWidth = minchar.attributes = 32767; + maxchar.ascent = maxchar.descent = + maxchar.leftSideBearing = maxchar.rightSideBearing = + maxchar.characterWidth = maxchar.attributes = -32767; + + maxlap = -32767; + pInfo->allExist = 1; + cidrangeP = CIDFontP->cidrangeP; + + /* go through all character codes specified in a given CMap */ + for (i = 0; i < CIDFontP->cidrangecnt; i++) { + for (j = 0; j < cidrangeP->rangecnt; j++) { + for (k = cidrangeP->range[j].srcCodeLo; + k <= cidrangeP->range[j].srcCodeHi; k++) { + ccode[0] = (k >> 8) & 0xff; + ccode[1] = k & 0xff; + ret = CIDGetMetrics(pFont, 1, ccode, 2, &ccount, (xCharInfo **)cinfo); + if (ret != Successful || cinfo == NULL) + continue; + pmetrics = &cinfo[0]->metrics; + total_width += pmetrics->attributes; + total_raw_width += abs((int)(INT16)pmetrics->attributes); + if (pmetrics->attributes || + pmetrics->ascent != -pmetrics->descent || + pmetrics->leftSideBearing != pmetrics->rightSideBearing) { + count++; + adjust_min_max(&minchar, &maxchar, pmetrics); + overlap = pmetrics->rightSideBearing - pmetrics->characterWidth; + if (overlap > maxlap) maxlap = overlap; + } + else pInfo->allExist = 0; + } + } + } + + if (count) + { + total_raw_width = (total_raw_width * 10 + count / 2) / count; + if (total_width < 0) + { + /* Predominant direction is R->L */ + total_raw_width = -total_raw_width; + } + } + + pInfo->maxbounds.leftSideBearing = maxchar.leftSideBearing; + pInfo->maxbounds.rightSideBearing = maxchar.rightSideBearing; + pInfo->maxbounds.characterWidth = maxchar.characterWidth; + pInfo->maxbounds.ascent = maxchar.ascent; + pInfo->maxbounds.descent = maxchar.descent; + pInfo->maxbounds.attributes = maxchar.attributes; + + pInfo->minbounds.leftSideBearing = minchar.leftSideBearing; + pInfo->minbounds.rightSideBearing = minchar.rightSideBearing; + pInfo->minbounds.characterWidth = minchar.characterWidth; + pInfo->minbounds.ascent = minchar.ascent; + pInfo->minbounds.descent = minchar.descent; + pInfo->minbounds.attributes = minchar.attributes; + + pInfo->ink_maxbounds.leftSideBearing = maxchar.leftSideBearing; + pInfo->ink_maxbounds.rightSideBearing = maxchar.rightSideBearing; + pInfo->ink_maxbounds.characterWidth = maxchar.characterWidth; + pInfo->ink_maxbounds.ascent = maxchar.ascent; + pInfo->ink_maxbounds.descent = maxchar.descent; + pInfo->ink_maxbounds.attributes = maxchar.attributes; + + pInfo->ink_minbounds.leftSideBearing = minchar.leftSideBearing; + pInfo->ink_minbounds.rightSideBearing = minchar.rightSideBearing; + pInfo->ink_minbounds.characterWidth = minchar.characterWidth; + pInfo->ink_minbounds.ascent = minchar.ascent; + pInfo->ink_minbounds.descent = minchar.descent; + pInfo->ink_minbounds.attributes = minchar.attributes; + + pInfo->maxOverlap = maxlap + -(minchar.leftSideBearing); + + return total_raw_width; +} +#endif +#endif + static void -ComputeProps(pInfo, Vals, Filename, sAscent, sDescent) - FontInfoPtr pInfo; - FontScalablePtr Vals; - char *Filename; - long *sAscent; - long *sDescent; +ComputeProps(FontInfoPtr pInfo, FontScalablePtr Vals, char *Filename, + long *sAscent, long *sDescent) { int infoint; int infoBBox[4]; @@ -291,27 +593,163 @@ ComputeProps(pInfo, Vals, Filename, sAscent, sDescent) *sDescent = -infoBBox[1]; } } + +#ifdef BUILDCID +#ifndef CID_ALL_CHARS +static void +CIDComputeStdProps(FontInfoPtr pInfo, FontScalablePtr Vals, + char *Filename, char *Cmapname, char *Fontname, + long sAscent, long sDescent, long sWidth) +{ + FontPropPtr pp; + int i, + nprops; + fontProp *fpt; + char *is_str; + char *ptr1 = NULL, + *ptr2; + char *ptr3; + char *infostrP; + int rc; + char scaledName[CID_PATH_MAX]; + + strcpy (scaledName, Fontname); + /* Fill in our copy of the fontname from the Vals structure */ + FontParseXLFDName (scaledName, Vals, FONT_XLFD_REPLACE_VALUE); + + /* This form of the properties is used by the X-client; the X-server + doesn't care what they are. */ + nprops = pInfo->nprops = NPROPS; + pInfo->isStringProp = (char *) xalloc(sizeof(char) * nprops); + pInfo->props = (FontPropPtr) xalloc(sizeof(FontPropRec) * nprops); + if (!pInfo->isStringProp || !pInfo->props) { + xfree(pInfo->isStringProp); + pInfo->isStringProp = (char *) 0; + xfree(pInfo->props); + pInfo->props = (FontPropPtr) 0; + pInfo->nprops = 0; + return; + } + bzero(pInfo->isStringProp, (sizeof(char) * nprops)); + + ptr2 = scaledName; + for (i = NNAMEPROPS, pp = pInfo->props, fpt = fontNamePropTable, is_str = pInfo->isStringProp; + i; + i--, pp++, fpt++, is_str++) { + + if (*ptr2) + { + ptr1 = ptr2 + 1; + if (!(ptr2 = strchr(ptr1, '-'))) ptr2 = strchr(ptr1, '\0'); + } + + pp->name = fpt->atom; + switch (fpt->type) { + case atom: /* Just copy info from scaledName */ + *is_str = TRUE; + pp->value = MakeAtom(ptr1, ptr2 - ptr1, TRUE); + break; + case truncate_atom: + *is_str = TRUE; + for (ptr3 = ptr1; *ptr3; ptr3++) + if (*ptr3 == '[') + break; + pp->value = MakeAtom(ptr1, ptr3 - ptr1, TRUE); + break; + case pixel_size: + pp->value = (int)(fabs(Vals->pixel_matrix[3]) + .5); + break; + case point_size: + pp->value = (int)(fabs(Vals->point_matrix[3]) * 10.0 + .5); + break; + case resolution_x: + pp->value = Vals->x; + break; + case resolution_y: + pp->value = Vals->y; + break; + case average_width: + pp->value = Vals->width; + break; + } + } + + for (i = 0, fpt = extraProps; + i < NEXTRAPROPS; + i++, is_str++, pp++, fpt++) { + pp->name = fpt->atom; + switch (i) { + case FONTPROP: + *is_str = TRUE; + pp->value = MakeAtom(scaledName, strlen(scaledName), TRUE); + break; + case COPYRIGHTPROP: + *is_str = TRUE; + CIDQueryFontLib(Filename, Cmapname, "Notice", &infostrP, &rc); + if (rc || !infostrP) { + infostrP = "Copyright Notice not available"; + } + pp->value = MakeAtom(infostrP, strlen(infostrP), TRUE); + break; + case FACE_NAMEPROP: + *is_str = TRUE; + CIDQueryFontLib(Filename, Cmapname, "CIDFontName", &infostrP, &rc); + if (rc || !infostrP) { + infostrP = "(unknown)"; + } + pp->value = MakeAtom(infostrP, strlen(infostrP), TRUE); + break; + case FONT_TYPEPROP: + *is_str = TRUE; + infostrP = "CIDFont"; + pp->value = MakeAtom(infostrP, strlen(infostrP), TRUE); + break; + case RASTERIZER_NAMEPROP: + *is_str = TRUE; + infostrP = "X Consortium Type 1 Rasterizer"; + pp->value = MakeAtom(infostrP, strlen(infostrP), TRUE); + break; + case RAWPIXELPROP: + *is_str = FALSE; + pp->value = 1000; + break; + case RAWPOINTPROP: + *is_str = FALSE; + pp->value = (long)(72270.0 / (double)Vals->y + .5); + break; + case RAWASCENTPROP: + *is_str = FALSE; + pp->value = sAscent; + break; + case RAWDESCENTPROP: + *is_str = FALSE; + pp->value = sDescent; + break; + case RAWWIDTHPROP: + *is_str = FALSE; + pp->value = sWidth; + break; + } + } +} +#endif +#endif static void -ComputeStdProps(pInfo, Vals, Filename, Fontname, sAscent, sDescent, sWidth) - FontInfoPtr pInfo; - FontScalablePtr Vals; - char *Filename; - char *Fontname; - long sAscent; - long sDescent; - long sWidth; +ComputeStdProps(FontInfoPtr pInfo, FontScalablePtr Vals, + char *Filename, char *Fontname, + long sAscent, long sDescent, long sWidth) { FontPropPtr pp; int i, nprops; fontProp *fpt; char *is_str; - char *ptr1, + char *ptr1 = NULL, *ptr2; char *ptr3; char *infostrP; - long rc; + int rc; char scaledName[MAXFONTNAMELEN]; strcpy (scaledName, Fontname); @@ -399,6 +837,16 @@ ComputeStdProps(pInfo, Vals, Filename, Fontname, sAscent, sDescent, sWidth) } pp->value = MakeAtom(infostrP, strlen(infostrP), TRUE); break; + case FONT_TYPEPROP: + *is_str = TRUE; + infostrP = "Type 1"; + pp->value = MakeAtom(infostrP, strlen(infostrP), TRUE); + break; + case RASTERIZER_NAMEPROP: + *is_str = TRUE; + infostrP = "X Consortium Type 1 Rasterizer"; + pp->value = MakeAtom(infostrP, strlen(infostrP), TRUE); + break; case RAWPIXELPROP: *is_str = FALSE; pp->value = 1000; @@ -422,16 +870,46 @@ ComputeStdProps(pInfo, Vals, Filename, Fontname, sAscent, sDescent, sWidth) } } } - + +#ifdef BUILDCID /*ARGSUSED*/ int -Type1GetInfoScalable(fpe, pInfo, entry, fontName, fileName, Vals) - FontPathElementPtr fpe; - FontInfoPtr pInfo; - FontEntryPtr entry; - FontNamePtr fontName; - char *fileName; - FontScalablePtr Vals; +CIDGetInfoScalable(FontPathElementPtr fpe, + FontInfoPtr pInfo, + FontEntryPtr entry, + FontNamePtr fontName, + char *fileName, + FontScalablePtr Vals) +{ + FontPtr pfont; + int flags = 0; + long format = 0; /* It doesn't matter what format for just info */ + long fmask = 0; + int ret; + + ret = CIDOpenScalable(fpe, &pfont, flags, entry, fileName, Vals, + format, fmask, NULL); + if (ret != Successful) + return ret; + *pInfo = pfont->info; + + /* XXX - Set pointers in pfont->info to NULL so they are not freed. */ + pfont->info.props = NULL; + pfont->info.isStringProp = NULL; + + CIDCloseFont(pfont); + return Successful; +} +#endif + +/*ARGSUSED*/ +int +Type1GetInfoScalable(FontPathElementPtr fpe, + FontInfoPtr pInfo, + FontEntryPtr entry, + FontNamePtr fontName, + char *fileName, + FontScalablePtr Vals) { FontPtr pfont; int flags = 0; @@ -439,7 +917,8 @@ Type1GetInfoScalable(fpe, pInfo, entry, fontName, fileName, Vals) long fmask = 0; int ret; - ret = Type1OpenScalable(fpe, &pfont, flags, entry, fileName, Vals, format, fmask); + ret = Type1OpenScalable(fpe, &pfont, flags, entry, fileName, Vals, + format, fmask , NULL); if (ret != Successful) return ret; *pInfo = pfont->info; @@ -451,14 +930,120 @@ Type1GetInfoScalable(fpe, pInfo, entry, fontName, fileName, Vals) Type1CloseFont(pfont); return Successful; } - + +#ifdef BUILDCID +#ifndef CID_ALL_CHARS +void +CIDFillFontInfo(FontPtr pFont, FontScalablePtr Vals, + char *Filename, char *Fontname, char *Cmapname, +#ifdef HAVE_CFM + char *cfmfilename, +#endif + long sAscent, long sDescent, double sxmult) +{ +#ifdef HAVE_CFM + FILE *cfm; + cfmrec *cfmp; + int gotcfm = 0; + CARD32 magic; +#endif + long sWidth = 0; + FontInfoPtr pInfo = &pFont->info; + + FillHeader(pInfo, Vals); + +#ifdef HAVE_CFM + if ((cfm = fopen(cfmfilename,"r"))) { + fread(&magic,sizeof(CARD32),1,cfm); + if(magic == CFMMAGIC) { + if ((cfmp = (cfmrec *)xalloc(sizeof(cfmrec))) != NULL) { + fread(cfmp,sizeof(cfmrec),1,cfm); + sWidth = (long)cfmp->totalrw; + pInfo->allExist = cfmp->alle; + if (sxmult != 0) { + pInfo->maxbounds.leftSideBearing = + floor((double)cfmp->maxbounds.leftSideBearing / + sxmult + 0.5); + pInfo->maxbounds.rightSideBearing = + floor((double)cfmp->maxbounds.rightSideBearing / + sxmult + 0.5); + pInfo->maxbounds.characterWidth = + floor((double)cfmp->maxbounds.characterWidth / + sxmult + 0.5); + pInfo->maxbounds.ascent = + floor((double)cfmp->maxbounds.ascent / + sxmult + 0.5); + pInfo->maxbounds.descent = + floor((double)cfmp->maxbounds.descent / + sxmult + 0.5); + pInfo->maxbounds.attributes = + cfmp->maxbounds.attributes; + + pInfo->minbounds.leftSideBearing = + cfmp->minbounds.leftSideBearing / sxmult; + pInfo->minbounds.rightSideBearing = + cfmp->minbounds.rightSideBearing / sxmult; + pInfo->minbounds.characterWidth = + cfmp->minbounds.characterWidth / sxmult; + pInfo->minbounds.ascent = + cfmp->minbounds.ascent / sxmult; + pInfo->minbounds.descent = + cfmp->minbounds.descent / sxmult; + pInfo->minbounds.attributes = cfmp->minbounds.attributes; + + pInfo->ink_maxbounds.leftSideBearing = + cfmp->ink_maxbounds.leftSideBearing / sxmult; + pInfo->ink_maxbounds.rightSideBearing = + cfmp->ink_maxbounds.rightSideBearing / sxmult; + pInfo->ink_maxbounds.characterWidth = + cfmp->ink_maxbounds.characterWidth / sxmult; + pInfo->ink_maxbounds.ascent = + cfmp->ink_maxbounds.ascent / sxmult; + pInfo->ink_maxbounds.descent = + cfmp->ink_maxbounds.descent / sxmult; + pInfo->ink_maxbounds.attributes = + cfmp->ink_maxbounds.attributes; + + pInfo->ink_minbounds.leftSideBearing = + cfmp->ink_minbounds.leftSideBearing / sxmult; + pInfo->ink_minbounds.rightSideBearing = + cfmp->ink_minbounds.rightSideBearing / sxmult; + pInfo->ink_minbounds.characterWidth = + cfmp->ink_minbounds.characterWidth / sxmult; + pInfo->ink_minbounds.ascent = + cfmp->ink_minbounds.ascent / sxmult; + pInfo->ink_minbounds.descent = + cfmp->ink_minbounds.descent / sxmult; + pInfo->ink_minbounds.attributes = + cfmp->ink_minbounds.attributes; + pInfo->ink_minbounds.attributes = + cfmp->ink_minbounds.attributes; + + pInfo->maxOverlap = (short)cfmp->maxo; + + gotcfm = 1; + } + xfree(cfmp); + } + } + fclose(cfm); + } + + if (!gotcfm) +#endif + sWidth = ComputeBoundsAll(pFont); + + FontComputeInfoAccelerators(pInfo); + + CIDComputeStdProps(pInfo, Vals, Filename, Cmapname, Fontname, sAscent, + sDescent, sWidth); +} +#endif /* CID_ALL_CHARS */ +#endif /* BUILDCID */ + void -T1FillFontInfo(pFont, Vals, Filename, Fontname, sWidth) - FontPtr pFont; - FontScalablePtr Vals; - char *Filename; - char *Fontname; - long sWidth; +T1FillFontInfo(FontPtr pFont, FontScalablePtr Vals, + char *Filename, char *Fontname, long sWidth) { FontInfoPtr pInfo = &pFont->info; struct type1font *p = (struct type1font *)pFont->fontPrivate; @@ -474,15 +1059,31 @@ T1FillFontInfo(pFont, Vals, Filename, Fontname, sWidth) /* Called once, at renderer registration time */ void -T1InitStdProps() +#ifdef BUILDCID +Type1InitStdProps(void) +#else +T1InitStdProps(void) +#endif { int i; fontProp *t; +#ifdef BUILDCID + if (!stdpropsinit) { + stdpropsinit = 1; + i = sizeof(fontNamePropTable) / sizeof(fontProp); + for (t = fontNamePropTable; i; i--, t++) + t->atom = MakeAtom(t->name, (unsigned) strlen(t->name), TRUE); + i = sizeof(extraProps) / sizeof(fontProp); + for (t = extraProps; i; i--, t++) + t->atom = MakeAtom(t->name, (unsigned) strlen(t->name), TRUE); + } +#else i = sizeof(fontNamePropTable) / sizeof(fontProp); for (t = fontNamePropTable; i; i--, t++) t->atom = MakeAtom(t->name, (unsigned) strlen(t->name), TRUE); i = sizeof(extraProps) / sizeof(fontProp); for (t = extraProps; i; i--, t++) t->atom = MakeAtom(t->name, (unsigned) strlen(t->name), TRUE); +#endif } diff --git a/src/Type1/t1intf.h b/src/Type1/t1intf.h index 52cedb7..c1e0e44 100644 --- a/src/Type1/t1intf.h +++ b/src/Type1/t1intf.h @@ -27,10 +27,113 @@ * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS * SOFTWARE. */ - -#define FIRSTCOL 32 +/* Copyright (c) 1994-1999 Silicon Graphics, Inc. All Rights Reserved. + * + * The contents of this file are subject to the CID Font Code Public Licence + * Version 1.0 (the "License"). You may not use this file except in compliance + * with the Licence. You may obtain a copy of the License at Silicon Graphics, + * Inc., attn: Legal Services, 2011 N. Shoreline Blvd., Mountain View, CA + * 94043 or at http://www.sgi.com/software/opensource/cid/license.html. + * + * Software distributed under the License is distributed on an "AS IS" basis. + * ALL WARRANTIES ARE DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED + * WARRANTIES OF MERCHANTABILITY, OF FITNESS FOR A PARTICULAR PURPOSE OR OF + * NON-INFRINGEMENT. See the License for the specific language governing + * rights and limitations under the License. + * + * The Original Software is CID font code that was developed by Silicon + * Graphics, Inc. + */ +/* $XFree86: xc/lib/font/Type1/t1intf.h,v 1.7 2001/07/25 15:04:55 dawes Exp $ */ + +#ifdef BUILDCID +#include "AFM.h" +#endif struct type1font { CharInfoPtr pDefault; - CharInfoRec glyphs[256-FIRSTCOL]; + CharInfoRec glyphs[256]; }; + +#ifdef BUILDCID +typedef struct cid_glyphs { + char *CIDFontName; + char *CMapName; + long dataoffset; + double pixel_matrix[4]; + CharInfoPtr pDefault; + CharInfoRec **glyphs; + FontInfo *AFMinfo; +#ifdef USE_MMAP + unsigned char *CIDdata; + long CIDsize; +#endif +} cidglyphs; +#endif + +/* + * Function prototypes + */ +/* t1funcs.c */ +#ifdef BUILDCID +extern int CIDOpenScalable ( FontPathElementPtr fpe, FontPtr *ppFont, + int flags, FontEntryPtr entry, char *fileName, + FontScalablePtr vals, fsBitmapFormat format, + fsBitmapFormatMask fmask, + FontPtr non_cachable_font ); +#endif +extern int Type1OpenScalable ( FontPathElementPtr fpe, FontPtr *ppFont, + int flags, FontEntryPtr entry, char *fileName, + FontScalablePtr vals, fsBitmapFormat format, + fsBitmapFormatMask fmask, + FontPtr non_cachable_font ); +#ifdef BUILDCID +extern unsigned int getCID ( FontPtr pFont, unsigned int charcode ); +extern int CIDGetGlyphs ( FontPtr pFont, unsigned long count, + unsigned char *chars, FontEncoding charEncoding, + unsigned long *glyphCount, CharInfoPtr *glyphs ); +extern int CIDGetMetrics ( FontPtr pFont, unsigned long count, + unsigned char *chars, FontEncoding charEncoding, + unsigned long *glyphCount, xCharInfo **glyphs ); +extern void CIDCloseFont ( FontPtr pFont ); +#endif +extern void Type1CloseFont ( FontPtr pFont ); +extern int Type1ReturnCodeToXReturnCode ( int rc ); +#ifdef BUILDCID +extern CharInfoPtr CIDRenderGlyph ( FontPtr pFont, psobj *charstringP, + psobj *subarrayP, + struct blues_struct *bluesP, + CharInfoPtr pci, int *mode ); +#endif + +/* t1info.c */ +#ifdef CID_ALL_CHARS +extern void ComputeBoundsAllChars ( FontPtr pFont, char *cfmfilename, double sxmult ); +#endif +#ifdef BUILDCID +extern int CIDGetInfoScalable ( FontPathElementPtr fpe, FontInfoPtr pInfo, + FontEntryPtr entry, FontNamePtr fontName, + char *fileName, FontScalablePtr Vals ); +#endif +extern int Type1GetInfoScalable ( FontPathElementPtr fpe, FontInfoPtr pInfo, + FontEntryPtr entry, FontNamePtr fontName, + char *fileName, FontScalablePtr Vals ); +#ifdef BUILDCID +extern void CIDFillFontInfo ( FontPtr pFont, FontScalablePtr Vals, + char *Filename, char *Fontname, char *Cmapname, +#ifdef HAVE_CFM + char *cfmfilename, +#endif + long sAscent, long sDescent, double sxmult ); +#endif +extern void T1FillFontInfo ( FontPtr pFont, FontScalablePtr Vals, + char *Filename, char *Fontname, long sWidth ); +extern void Type1InitStdProps ( void ); + +/* cidchar.c */ +extern CharInfoPtr CIDGetGlyphInfo ( FontPtr pFont, unsigned int cidcode, + CharInfoPtr pci, int *rc ); +extern int CIDGetAFM ( FontPtr pFont, unsigned long count, + unsigned char *chars, FontEncoding charEncoding, + unsigned long *glyphCount, CharInfoPtr *glyphs, + char *cidafmfile ); diff --git a/src/Type1/t1io.c b/src/Type1/t1io.c index cd5b77a..d5ce774 100644 --- a/src/Type1/t1io.c +++ b/src/Type1/t1io.c @@ -28,21 +28,47 @@ * SOFTWARE. * Author: Carol H. Thompson IBM Almaden Research Center */ +/* Copyright (c) 1994-1999 Silicon Graphics, Inc. All Rights Reserved. + * + * The contents of this file are subject to the CID Font Code Public Licence + * Version 1.0 (the "License"). You may not use this file except in compliance + * with the Licence. You may obtain a copy of the License at Silicon Graphics, + * Inc., attn: Legal Services, 2011 N. Shoreline Blvd., Mountain View, CA + * 94043 or at http://www.sgi.com/software/opensource/cid/license.html. + * + * Software distributed under the License is distributed on an "AS IS" basis. + * ALL WARRANTIES ARE DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED + * WARRANTIES OF MERCHANTABILITY, OF FITNESS FOR A PARTICULAR PURPOSE OR OF + * NON-INFRINGEMENT. See the License for the specific language governing + * rights and limitations under the License. + * + * The Original Software is CID font code that was developed by Silicon + * Graphics, Inc. + */ +/* $XFree86: xc/lib/font/Type1/t1io.c,v 3.9 2001/08/27 19:49:54 dawes Exp $ */ /******************************************************************* * I/O package for Type 1 font reading ********************************************************************/ - + #ifndef STATIC #define STATIC static #endif +#ifndef FONTMODULE #include <fcntl.h> +#include <unistd.h> +#else +#include "Xdefs.h" /* Bool declaration */ +#include "Xmd.h" /* INT32 declaration */ +#include "xf86_ansic.h" +#endif #include "t1stdio.h" #include "t1hdigit.h" #ifdef WIN32 #include <X11/Xw32defs.h> #endif - +#include "Xdefs.h" + /* Constants and variables used in the decryption */ #define c1 ((unsigned short)52845) #define c2 ((unsigned short)22719) @@ -56,16 +82,22 @@ STATIC F_FILE TheFile; STATIC unsigned char TheBuffer[F_BUFSIZ]; /* Our routines */ -F_FILE *T1Open(), *T1Eexec(); -int T1Close(); -int T1Read(), T1Getc(), T1Ungetc(); -STATIC int T1Decrypt(), T1Fill(); +static int T1Decrypt ( unsigned char *p, int len ); +static int T1Fill ( F_FILE *f ); + +#ifdef BUILDCID +void +resetDecrypt(void) +{ + Decrypt = 0; +} +#endif /* -------------------------------------------------------------- */ /*ARGSUSED*/ -F_FILE *T1Open(fn, mode) - char *fn; /* Pointer to filename */ - char *mode; /* Pointer to open mode string */ +F_FILE * +T1Open(char *fn, /* Pointer to filename */ + char *mode) /* Pointer to open mode string */ { F_FILE *of = &TheFile; int oflags = O_RDONLY; /* We know we are only reading */ @@ -75,7 +107,7 @@ F_FILE *T1Open(fn, mode) #ifdef O_BINARY /* VMS or DOS */ oflags |= O_BINARY; #endif - of->fd = open(fn, oflags); + of->fd = open(fn, oflags, 0); if (of->fd < 0) return NULL; @@ -91,8 +123,8 @@ F_FILE *T1Open(fn, mode) } /* end Open */ /* -------------------------------------------------------------- */ -int T1Getc(f) /* Read one character */ - F_FILE *f; /* Stream descriptor */ +int /* Read one character */ +T1Getc(F_FILE *f) /* Stream descriptor */ { if (f->b_base == NULL) return EOF; /* already closed */ @@ -111,9 +143,9 @@ int T1Getc(f) /* Read one character */ } /* end Getc */ /* -------------------------------------------------------------- */ -int T1Ungetc(c, f) /* Put back one character */ - int c; - F_FILE *f; /* Stream descriptor */ +int /* Put back one character */ +T1Ungetc(int c, + F_FILE *f) /* Stream descriptor */ { if (c != EOF) { f->ungotc = c; @@ -124,11 +156,11 @@ int T1Ungetc(c, f) /* Put back one character */ } /* end Ungetc */ /* -------------------------------------------------------------- */ -int T1Read(buffP, size, n, f) /* Read n items into caller's buffer */ - char *buffP; /* Buffer to be filled */ - int size; /* Size of each item */ - int n; /* Number of items to read */ - F_FILE *f; /* Stream descriptor */ +int /* Read n items into caller's buffer */ +T1Read(char *buffP, /* Buffer to be filled */ + int size, /* Size of each item */ + int n, /* Number of items to read */ + F_FILE *f) /* Stream descriptor */ { int bytelen, cnt, i; F_char *p = (F_char *)buffP; @@ -162,23 +194,66 @@ int T1Read(buffP, size, n, f) /* Read n items into caller's buffer */ } /* end Read */ /* -------------------------------------------------------------- */ -int T1Close(f) /* Close the file */ - F_FILE *f; /* Stream descriptor */ +int /* Close the file */ +T1Close(F_FILE *f) /* Stream descriptor */ { if (f->b_base == NULL) return 0; /* already closed */ f->b_base = NULL; /* no valid stream */ return close(f->fd); } /* end Close */ -#ifdef __STDC__ -#define pointer void * -#else -#define pointer char * -#endif /* -------------------------------------------------------------- */ -F_FILE *T1eexec(f) /* Initialization */ - F_FILE *f; /* Stream descriptor */ +F_FILE * /* Initialization */ +T1eexec(F_FILE *f) /* Stream descriptor */ +{ + int i, c; + int H; + unsigned char *p; + unsigned char randomP[8]; + + r = 55665; /* initial key */ + asc = 1; /* indicate ASCII form */ + + /* Consume the 4 random bytes, determining if we are also to + ASCIIDecodeHex as we process our input. (See pages 63-64 + of the Adobe Type 1 Font Format book.) */ + + /* Skip over any initial white space chars */ + while (HighHexP[c=_XT1getc(f)] == HWHITE_SPACE) ; + + /* If ASCII, the next 7 chars are guaranteed consecutive */ + randomP[0] = c; /* store first non white space char */ + T1Read((pointer)(randomP+1), 1, 3, f); /* read 3 more, for a total of 4 */ + /* store first four chars */ + for (i=0,p=randomP; i<4; i++) { /* Check 4 valid ASCIIEncode chars */ + if (HighHexP[*p++] > LAST_HDIGIT) { /* non-ASCII byte */ + asc = 0; + break; + } + } + if (asc) { /* ASCII form, convert first eight bytes to binary */ + T1Read((pointer)(randomP+4), 1, 4, f); /* Need four more */ + for (i=0,p=randomP; i<4; i++) { /* Convert */ + H = HighHexP[*p++]; + randomP[i] = H | LowHexP[*p++]; + } + } + + /* Adjust our key */ + for (i=0,p=randomP; i<4; i++) { + r = (*p++ + r) * c1 + c2; + } + + /* Decrypt the remaining buffered bytes */ + f->b_cnt = T1Decrypt(f->b_ptr, f->b_cnt); + Decrypt = 1; + return (T1Feof(f))?NULL:f; +} /* end eexec */ + +#ifdef BUILDCID +F_FILE * /* Initialization */ +CIDeexec(F_FILE *f) /* Stream descriptor */ { int i, c; int H; @@ -218,19 +293,31 @@ F_FILE *T1eexec(f) /* Initialization */ r = (*p++ + r) * c1 + c2; } - /* Decrypt the remaining buffered bytes */ - f->b_cnt = T1Decrypt(f->b_ptr, f->b_cnt); + /* Decrypt up to, but not including, the first '%' sign */ + if (f->b_cnt > 0) { + for (i = 0; i < f->b_cnt; i++) + if (*(f->b_ptr + i) == '%') + break; + + if (i < f->b_cnt) { + if (i == 0) + f->b_cnt = 0; + else + f->b_cnt = T1Decrypt(f->b_ptr, i); + } else + f->b_cnt = T1Decrypt(f->b_ptr, f->b_cnt); + } Decrypt = 1; return (T1Feof(f))?NULL:f; } /* end eexec */ - +#endif + /* -------------------------------------------------------------- */ -STATIC int T1Decrypt(p, len) - unsigned char *p; - int len; +STATIC int +T1Decrypt(unsigned char *p, int len) { int n; - int H, L; + int H = 0, L; unsigned char *inp = p; unsigned char *tblP; @@ -272,11 +359,11 @@ STATIC int T1Decrypt(p, len) } /* end Decrypt */ /* -------------------------------------------------------------- */ -STATIC int T1Fill(f) /* Refill stream buffer */ - F_FILE *f; /* Stream descriptor */ +STATIC int /* Refill stream buffer */ +T1Fill(F_FILE *f) /* Stream descriptor */ { int rc; - + rc = read(f->fd, f->b_base, F_BUFSIZ); /* propagate any error or eof to current file */ if (rc <= 0) { diff --git a/src/Type1/t1malloc.c b/src/Type1/t1malloc.c index 5028c8c..08a3a8b 100644 --- a/src/Type1/t1malloc.c +++ b/src/Type1/t1malloc.c @@ -26,6 +26,7 @@ * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF * THIS SOFTWARE. */ +/* $XFree86: xc/lib/font/Type1/t1malloc.c,v 1.11 2002/02/18 20:51:57 herrb Exp $ */ /* MALLOC CWEB V0004 LOTS */ /* :h1.MALLOC - Fast Memory Allocation @@ -37,12 +38,16 @@ routines (malloc/free). */ -#include "objects.h" /* get #define for abort() */ +#ifdef FONTMODULE +#include "Xdefs.h" /* Bool declaration */ +#include "Xmd.h" /* INT32 declaration */ +#include "os.h" +#include "xf86_ansic.h" +#else +#include "os.h" +#endif +#include "objects.h" /* get #define for Abort() */ -static void combine(); -static void freeuncombinable(); -static void unhook(); -static void dumpchain(); /* :h3.Define NULL @@ -54,7 +59,7 @@ popular (in terms of reducing compiler complaints), however, if your compiler is unhappy about it, you can redefine it on the command line: */ #ifndef NULL -#define NULL 0 +#include <stddef.h> #endif /* Of course, NULL is important because xiMalloc() is defined to return @@ -165,6 +170,18 @@ asked for. long AvailableWords = 0; /* number of words available in memory */ char mallocdebug = 0; /* a flag that enables some chatty printf's */ + +/* +:h3.Prototypes of static functions +*/ + +static void combine ( void ); +static void freeuncombinable ( long *addr, long size ); +static void unhook ( struct freeblock *p ); +static void dumpchain ( void ); +#ifdef notused +static void reportarea ( long *area ); +#endif /* :h3.whocalledme() - Debug for Memory Leaks @@ -178,9 +195,9 @@ We use it to see who is malloc-ing memory without free-ing it. #if DEBUGWORDS -static whocalledme(addr, stack) - long *addr; /* address of memory block */ - long *stack; /* address of malloc's parameter on stack */ +static void +whocalledme(long *addr, /* address of memory block */ + long *stack) /* address of malloc's parameter on stack */ { register long size; /* size of memory block */ register int i; /* loop index */ @@ -206,8 +223,8 @@ The actual beginning of the block is one 'long' before the address we gave to the user. The block begins and ends with '-size' in words. */ -void xiFree(addr) - register long *addr; /* user's memory to be returned */ +void +xiFree(long *addr) /* user's memory to be returned */ { register long size; /* amount of memory in this block */ register struct freeblock *p; /* identical to 'addr' */ @@ -223,9 +240,9 @@ Make sure this address looks OK; 'size' must be less than zero (meaning the block is allocated) and should be repeated at the end of the block. */ if (size >= 0) - abort("free: bad size"); + Abort("free: bad size"); if (addr[-1 - size] != size) - abort("free: mismatched size"); + Abort("free: mismatched size"); /* Now make this a 'freeblock' structure and tack it on the FRONT of the free list (where uncombined blocks go): @@ -264,7 +281,7 @@ In any event, that block will be moved to the end of the list (after */ static void -combine() +combine(void) { register struct freeblock *p; /* block we will try to combine */ register long *addr; /* identical to 'p' for 'long' access */ @@ -273,12 +290,12 @@ combine() p = firstcombined->back; if (p == &firstfree) - abort("why are we combining?"); + Abort("why are we combining?"); addr = (long *) p; size = - p->size; if (--uncombined < 0) - abort("too many combine()s"); + Abort("too many combine()s"); if (addr[-1] < 0 && addr[size] < 0) { /* @@ -302,8 +319,8 @@ First we attempt to combine this with the block immediately above: *addr = COMBINED; /* might help debug */ addr -= size2; if (addr[0] != size2) - abort("bad block above"); - unhook(addr); + Abort("bad block above"); + unhook((struct freeblock *)addr); size += size2; } /* @@ -317,7 +334,7 @@ below: if (size2 > 0) { /* i.e., block below is free */ p->size = COMBINED; if (size2 != ((long *) p)[size2 - 1]) - abort("bad block below"); + Abort("bad block below"); unhook(p); size += size2; } @@ -337,9 +354,8 @@ no neighbors. */ static void -freeuncombinable(addr, size) - register long *addr; /* address of the block to be freed */ - register long size; /* size of block in words */ +freeuncombinable(long *addr, /* address of the block to be freed */ + long size) /* size of block in words */ { register struct freeblock *p; /* a convenient synonym for 'addr' */ @@ -372,8 +388,7 @@ have to worry about the end cases.) */ static void -unhook(p) - register struct freeblock *p; /* block to unhook */ +unhook(struct freeblock *p) /* block to unhook */ { p->back->fore = p->fore; p->fore->back = p->back; @@ -394,10 +409,10 @@ cache. #ifdef TYPE1IMAGER -static char *malloc_local(); +static char *malloc_local(unsigned size); -char *xiMalloc(size) - register unsigned size; +char * +xiMalloc(unsigned size) { char *memaddr; @@ -418,11 +433,12 @@ memory, and it is also compatible with the definition of a "size_t" in most systems. */ #ifdef TYPE1IMAGER -static char *malloc_local(Size) +static char * +malloc_local(unsigned Size) /* number of bytes the user requested */ #else -char *xiMalloc(Size) +char * +xiMalloc(unsigned Size) #endif - unsigned Size; /* number of bytes the user requested */ { register long size = (long)Size; /* a working register for size */ register struct freeblock *p; /* tentative block to be returned */ @@ -454,7 +470,7 @@ only to be "unhook"ed: unhook(p); uncombined--; if (mallocdebug) { - printf("fast xiMalloc(%d) = %p, ", size, p); + printf("fast xiMalloc(%ld) = %p, ", size, p); dumpchain(); } AvailableWords += size; /* decreases AvailableWords */ @@ -511,7 +527,7 @@ flag that this block is allocated: area[size - 1] = area[0] = - size; if (mallocdebug) { - printf("slow xiMalloc(%d) @ %08x, ", size, area); + printf("slow xiMalloc(%ld) @ %p, ", size, area); dumpchain(); } whocalledme(area, &Size); @@ -548,9 +564,9 @@ boundary. static long *freearea[MAXAREAS] = { NULL }; /* so we can report later */ -void addmemory(addr, size) - register long *addr; /* beginning of free area */ - register long size; /* number of bytes of free area */ +void +addmemory(long *addr, /* beginning of free area */ + long size) /* number of bytes of free area */ { register int i; /* loop index variable */ register long *aaddr; /* aligned beginning of free area */ @@ -571,7 +587,7 @@ We'll record where the area was that was given to us for later reports: for (i=0; i < MAXAREAS; i++) if (freearea[i] == NULL) break; if (i >= MAXAREAS) - abort("too many addmemory()s"); + Abort("too many addmemory()s"); aaddr = (long *) ( ((long) addr + sizeof(double) - 1) & - (long)sizeof(double) ); size -= (char *) aaddr - (char *) addr; freearea[i] = aaddr; @@ -595,7 +611,8 @@ free list: /* :h3.delmemory() - Delete Memory Pool */ -void delmemory() +void +delmemory(void) { register int i; @@ -615,7 +632,7 @@ void delmemory() */ static void -dumpchain() +dumpchain(void) { register struct freeblock *p; /* current free block */ register long size; /* size of block */ @@ -627,36 +644,36 @@ dumpchain() for (p = firstfree.fore, i=uncombined; p != firstcombined; p = p->fore) { if (--i < 0) - abort("too many uncombined areas"); + Abort("too many uncombined areas"); size = p->size; printf(". . . area @ %p, size = %ld\n", p, -size); if (size >= 0 || size != ((int *) p)[-1 - size]) - abort("dumpchain: bad size"); + Abort("dumpchain: bad size"); if (p->back != back) - abort("dumpchain: bad back"); + Abort("dumpchain: bad back"); back = p; } printf("DUMPING COMBINED FREE LIST:\n"); for (; p != &lastfree; p = p->fore) { size = p->size; - printf(". . . area @ %p, size = %d\n", p, size); + printf(". . . area @ %p, size = %ld\n", p, size); if (size <= 0 || size != ((int *) p)[size - 1]) - abort("dumpchain: bad size"); + Abort("dumpchain: bad size"); if (p->back != back) - abort("dumpchain: bad back"); + Abort("dumpchain: bad back"); back = p; } if (back != lastfree.back) - abort("dumpchain: bad lastfree"); + Abort("dumpchain: bad lastfree"); } +#ifdef notused /* :h3.reportarea() - Display a Contiguous Set of Memory Blocks */ static void -reportarea(area) - register long *area; /* start of blocks (from addmemory) */ +reportarea(long *area) /* start of blocks (from addmemory) */ { register long size; /* size of current block */ register long wholesize; /* size of original area */ @@ -673,7 +690,7 @@ reportarea(area) register int i,j; size = -size; - printf("Allocated %5d bytes at %08x, first words=%08x %08x\n", + printf("Allocated %5ld bytes at %p, first words=%08lx %08lx\n", size * sizeof(long), area + 1, area[1], area[2]); #if DEBUGWORDS printf(" ...Last operator: %s\n", @@ -682,29 +699,29 @@ reportarea(area) for (i = size - DEBUGWORDS; i < size - 2; i += 8) { printf(" ..."); for (j=0; j<8; j++) - printf(" %08x", area[i+j]); + printf(" %08lx", area[i+j]); printf("\n"); } } else { - printf("Free %d bytes at %x\n", size * sizeof(long), + printf("Free %ld bytes at %p\n", size * sizeof(long), area); if (size == 0) - abort("zero sized memory block"); + Abort("zero sized memory block"); for (p = firstfree.fore; p != NULL; p = p->fore) if ((long *) p == area) break; if ((long *) p != area) - abort("not found on forward chain"); + Abort("not found on forward chain"); for (p = lastfree.back; p != NULL; p = p->back) if ((long *) p == area) break; if ((long *) p != area) - abort("not found on backward chain"); + Abort("not found on backward chain"); } if (area[0] != area[size - 1]) - abort("unmatched check sizes"); + Abort("unmatched check sizes"); area += size; wholesize -= size; } @@ -714,7 +731,8 @@ reportarea(area) :h3.MemReport() - Display All of Memory */ -void MemReport() +void +MemReport(void) { register int i; @@ -728,8 +746,10 @@ void MemReport() :h3.MemBytesAvail - Display Number of Bytes Now Available */ -void MemBytesAvail() +void +MemBytesAvail(void) { - printf("There are now %d bytes available\n", AvailableWords * + printf("There are now %ld bytes available\n", AvailableWords * sizeof(long) ); } +#endif diff --git a/src/Type1/t1snap.c b/src/Type1/t1snap.c index fd26e36..90c396b 100644 --- a/src/Type1/t1snap.c +++ b/src/Type1/t1snap.c @@ -27,10 +27,13 @@ * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS * SOFTWARE. */ +/* $XFree86: xc/lib/font/Type1/t1snap.c,v 1.4 2001/01/17 19:43:24 dawes Exp $ */ + #include "objects.h" #include "spaces.h" #include "paths.h" +#include "pictures.h" /* :h2.Handle Functions @@ -40,15 +43,15 @@ This is a user operator. Its new name is QueryHandle. */ -struct segment *t1_Phantom(obj) - register struct xobject *obj; /* object to take the Phantom of */ +struct segment * +t1_Phantom(struct segment *p) /* object to take the Phantom of */ { struct fractpoint pt; /* handle size will built here */ - if (obj == NULL) + if (p == NULL) pt.x = pt.y = 0; else - PathDelta(obj, &pt); + PathDelta(p, &pt); return(PathSegment(MOVETYPE, pt.x, pt.y)); } @@ -59,8 +62,8 @@ struct segment *t1_Phantom(obj) This is a user operator. */ -struct xobject *t1_Snap(p) - register struct segment *p; /* path to snap */ +struct segment * +t1_Snap(struct segment *p) /* path to snap */ { struct fractpoint pt; /* for finding length of path */ @@ -75,5 +78,5 @@ struct xobject *t1_Snap(p) } else p = JoinSegment(p, MOVETYPE, -pt.x, -pt.y, NULL); - return((struct xobject *)p); + return(p); } diff --git a/src/Type1/t1stdio.h b/src/Type1/t1stdio.h index b18ac5c..d4e71e8 100644 --- a/src/Type1/t1stdio.h +++ b/src/Type1/t1stdio.h @@ -27,7 +27,11 @@ * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS * SOFTWARE. */ +/* $XFree86: xc/lib/font/Type1/t1stdio.h,v 1.10 2001/07/25 15:04:55 dawes Exp $ */ /* T1IO FILE structure and related stuff */ +#ifdef XFree86LOADER +#undef FILE +#endif #define FILE F_FILE typedef unsigned char F_char; @@ -49,11 +53,12 @@ typedef struct F_FILE { #define FIOERROR (0x40) #ifndef NULL -#define NULL 0 /* null pointer */ +#include <stddef.h> #endif + #define EOF (-1) /* end of file */ #define F_BUFSIZ (512) - + #define _XT1getc(f) \ ( \ ( ((f)->b_cnt > 0) && ((f)->flags == 0) ) ? \ @@ -63,6 +68,30 @@ typedef struct F_FILE { #define T1Feof(f) (((f)->flags & FIOEOF) && ((f)->b_cnt==0)) -extern FILE *T1Open(), *T1eexec(); -extern int T1Close(), T1Ungetc(), T1Read(); - +#ifdef BUILDCID +extern F_FILE *CIDeexec ( FILE *f ); +#endif + +extern FILE *T1Open ( char *fn, char *mode ); +extern int T1Getc ( FILE *f ); +extern int T1Ungetc ( int c, FILE *f ); +extern int T1Read ( char *buffP, int size, int n, FILE *f ); +extern int T1Close ( FILE *f ); +extern FILE *T1eexec ( FILE *f ); +extern void resetDecrypt ( void ); + +#undef fclose +#undef fopen +#undef ungetc +#undef fgetc +#undef fread +#undef feof +#undef ferror +#define fclose(f) T1Close(f) +#define fopen(name,mode) T1Open(name,mode) +#define ungetc(c,f) T1Ungetc(c,f) +#define fgetc(f) T1Getc(f) + +#define fread(bufP,size,n,f) T1Read(bufP,size,n,f) +#define feof(f) (((f)->flags & FIOEOF) && ((f)->b_cnt==0)) +#define ferror(f) (((f)->flags & FIOERROR)?(f)->error:0) diff --git a/src/Type1/t1stub.c b/src/Type1/t1stub.c index 82be9b3..cfe6ea9 100644 --- a/src/Type1/t1stub.c +++ b/src/Type1/t1stub.c @@ -27,16 +27,28 @@ * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS * SOFTWARE. */ +/* $XFree86: xc/lib/font/Type1/t1stub.c,v 1.9 2002/02/18 20:51:57 herrb Exp $ */ -#include "objects.h" /* get #define for abort() */ - -xiStub() +#ifdef FONTMODULE +#include "Xdefs.h" /* Bool declaration */ +#include "Xmd.h" /* INT32 declaration */ +#include "os.h" +#include "xf86_ansic.h" +#else +#include <stdio.h> +#include "os.h" +#endif +#include "objects.h" /* get #define for Abort() */ + +static void +xiStub(void) { printf("xiStub called\n"); - abort("xiStub called"); + Abort("xiStub called"); } -void t1_DumpText() +void +t1_DumpText(void) { xiStub(); } diff --git a/src/Type1/token.c b/src/Type1/token.c index 054e1ea..ef28990 100644 --- a/src/Type1/token.c +++ b/src/Type1/token.c @@ -27,6 +27,7 @@ * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS * SOFTWARE. */ +/* $XFree86: xc/lib/font/Type1/token.c,v 1.5 2001/01/17 19:43:24 dawes Exp $ */ /* Authors: Sig Nin & Carol Thompson IBM Almaden Research Laboratory */ #include "t1stdio.h" #include "util.h" @@ -97,8 +98,8 @@ static double Exp10T[128] = { 1e56, 1e57, 1e58, 1e59, 1e60, 1e61, 1e62, 1e63 }; -static double P10(exponent) - long exponent; +static double +P10(long exponent) { double value, power; @@ -201,15 +202,15 @@ isWHITE_SPACE(ch)\ #define DONE (256) /* Get the next input character */ -static int next_char(ch) - int ch; +static int +next_char(int ch) { return(next_ch()); } /* Add character to token */ -static int add_char(ch) - int ch; +static int +add_char(int ch) { save_ch(ch); return(next_ch()); @@ -221,8 +222,8 @@ static int add_char(ch) */ /* Skip white space */ -static int skip_space(ch) - int ch; +static int +skip_space(int ch) { do { ch = next_ch(); @@ -231,8 +232,8 @@ static int skip_space(ch) } /* Skip comments */ -static int skip_comment(ch) - int ch; +static int +skip_comment(int ch) { do { ch = next_ch(); @@ -259,23 +260,23 @@ static long r_base; static long r_value; static long r_scale; -static int add_sign(ch) - int ch; +static int +add_sign(int ch) { m_sign = ch; save_unsafe_ch(ch); return(next_ch()); } -static int add_1st_digits(ch) - int ch; +static int +add_1st_digits(int ch) { m_sign = '+'; return(add_digits(ch)); } -static int add_digits(ch) - int ch; +static int +add_digits(int ch) { long value, p_value, scale; int digit; @@ -366,15 +367,15 @@ static int add_digits(ch) return(ch); } -static int add_1st_decpt(ch) - int ch; +static int +add_1st_decpt(int ch) { m_sign = '+'; return(add_decpt(ch)); } -static int add_decpt(ch) - int ch; +static int +add_decpt(int ch) { /* On entry, expect m_sign to be set to '+' or '-' */ m_value = 0; @@ -383,8 +384,8 @@ static int add_decpt(ch) return(next_ch()); } -static int add_fraction(ch) - int ch; +static int +add_fraction(int ch) { long value, scale; int digit; @@ -480,16 +481,16 @@ static int add_fraction(ch) return(ch); } -static int add_e_sign(ch) - int ch; +static int +add_e_sign(int ch) { e_sign = ch; save_ch(ch); return(next_ch()); } -static int add_exponent(ch) - int ch; +static int +add_exponent(int ch) { long value, p_value; long scale = 0; @@ -558,8 +559,8 @@ static int add_exponent(ch) return(ch); } -static int add_radix(ch) - int ch; +static int +add_radix(int ch) { if (2 <= m_value && m_value <= 36 && m_scale == 0) { r_base = m_value; @@ -572,8 +573,8 @@ static int add_radix(ch) } } -static int add_r_digits(ch) - int ch; +static int +add_r_digits(int ch) { unsigned long value; long radix, scale; @@ -654,8 +655,8 @@ static int add_r_digits(ch) */ /* Done: Radix Number */ -static int RADIX_NUMBER(ch) - int ch; +static int +RADIX_NUMBER(int ch) { back_ch_not_white(ch); if (r_scale == 0) { @@ -669,8 +670,8 @@ static int RADIX_NUMBER(ch) } /* Done: Integer */ -static int INTEGER(ch) - int ch; +static int +INTEGER(int ch) { back_ch_not_white(ch); if (m_scale == 0) { @@ -685,8 +686,8 @@ static int INTEGER(ch) } /* Done: Real */ -static int REAL(ch) - int ch; +static int +REAL(int ch) { double temp; @@ -722,8 +723,8 @@ static int REAL(ch) */ /* Done: Hex String */ -static int HEX_STRING(ch) - int ch; +static int +HEX_STRING(int ch) { int value; @@ -795,8 +796,8 @@ static int HEX_STRING(ch) * "\\", "\(", and "\)", simply store the second * character. */ -static void save_digraph(ch) - int ch; +static void +save_digraph(int ch) { int value; @@ -858,8 +859,8 @@ static void save_digraph(ch) } /* Done: String */ -static int STRING(ch) - int ch; +static int +STRING(int ch) { int nest_level = 1; @@ -925,8 +926,8 @@ static int STRING(ch) * start out looking like something else). */ -static int AAH_NAME(ch) - int ch; +static int +AAH_NAME(int ch) { do { save_ch(ch); @@ -939,8 +940,8 @@ static int AAH_NAME(ch) } /* Done: Name */ -static int NAME(ch) - int ch; +static int +NAME(int ch) { save_unsafe_ch(ch); ch = next_ch(); @@ -979,8 +980,8 @@ static int NAME(ch) } /* Done: Literal Name */ -static int LITERAL_NAME(ch) - int ch; +static int +LITERAL_NAME(int ch) { if (isNAME(ch)) { save_unsafe_ch(ch); @@ -1017,8 +1018,8 @@ static int LITERAL_NAME(ch) } /* Done: immediate Name */ -static int IMMED_NAME(ch) - int ch; +static int +IMMED_NAME(int ch) { ch = next_ch(); if (isNAME(ch)) { @@ -1056,8 +1057,8 @@ static int IMMED_NAME(ch) } /* Done: Name found while looking for something else */ -static int OOPS_NAME(ch) - int ch; +static int +OOPS_NAME(int ch) { back_ch_not_white(ch); tokenType = TOKEN_NAME; @@ -1070,40 +1071,40 @@ static int OOPS_NAME(ch) */ /* Done: Unmatched Right Angle-Bracket */ -static int RIGHT_ANGLE(ch) - int ch; +static int +RIGHT_ANGLE(int ch) { tokenType = TOKEN_RIGHT_ANGLE; return(DONE); } /* Done: Unmatched Right Parenthesis */ -static int RIGHT_PAREN(ch) - int ch; +static int +RIGHT_PAREN(int ch) { tokenType = TOKEN_RIGHT_PAREN; return(DONE); } /* Done: Left Brace */ -static int LEFT_BRACE(ch) - int ch; +static int +LEFT_BRACE(int ch) { tokenType = TOKEN_LEFT_BRACE; return(DONE); } /* Done: Right Brace */ -static int RIGHT_BRACE(ch) - int ch; +static int +RIGHT_BRACE(int ch) { tokenType = TOKEN_RIGHT_BRACE; return(DONE); } /* Done: Left Bracket */ -static int LEFT_BRACKET(ch) - int ch; +static int +LEFT_BRACKET(int ch) { save_unsafe_ch(ch); tokenType = TOKEN_LEFT_BRACKET; @@ -1111,8 +1112,8 @@ static int LEFT_BRACKET(ch) } /* Done: Right Bracket */ -static int RIGHT_BRACKET(ch) - int ch; +static int +RIGHT_BRACKET(int ch) { save_unsafe_ch(ch); tokenType = TOKEN_RIGHT_BRACKET; @@ -1120,16 +1121,16 @@ static int RIGHT_BRACKET(ch) } /* Done: Break */ -static int BREAK_SIGNAL(ch) - int ch; +static int +BREAK_SIGNAL(int ch) { tokenType = TOKEN_BREAK; return(DONE); } /* Done: No Token Found */ -static int NO_TOKEN(ch) - int ch; +static int +NO_TOKEN(int ch) { tokenType = TOKEN_EOF; return(DONE); @@ -1159,13 +1160,13 @@ static int NO_TOKEN(ch) * * ------------------------------------------------------------------- */ -void scan_token(inputP) - psobj *inputP; +void +scan_token(psobj *inputP) { int ch; unsigned char *stateP = s0; unsigned char entry; - int (*actionP)(); + int (*actionP)(int); /* Define input source */ inputFileP = inputP->data.fileP; diff --git a/src/Type1/token.h b/src/Type1/token.h index 2dfe3fa..caa2ca2 100644 --- a/src/Type1/token.h +++ b/src/Type1/token.h @@ -27,6 +27,8 @@ * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS * SOFTWARE. */ +/* $XFree86: xc/lib/font/Type1/token.h,v 1.4 2001/01/17 19:43:24 dawes Exp $ */ + #ifndef TOKEN_H #define TOKEN_H @@ -56,7 +58,7 @@ #define TOKEN_IMMED_NAME (16) /* Token routines */ -extern void scan_token(); +extern void scan_token( psobj *inputP ); /* * ------------------------------------------------------------------------- diff --git a/src/Type1/tokst.h b/src/Type1/tokst.h index de3f0ec..61f1ff9 100644 --- a/src/Type1/tokst.h +++ b/src/Type1/tokst.h @@ -27,6 +27,8 @@ * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS * SOFTWARE. */ +/* $XFree86: xc/lib/font/Type1/tokst.h,v 1.4 2001/01/17 19:43:24 dawes Exp $ */ + /* -------------------------------------- */ /* --- MACHINE GENERATED, DO NOT EDIT --- */ /* -------------------------------------- */ @@ -291,41 +293,41 @@ static unsigned char si11[258] = { 0x53,0x54, * state. There are several entries for each state. * */ -static int AAH_NAME(); -static int BREAK_SIGNAL(); -static int HEX_STRING(); -static int IMMED_NAME(); -static int INTEGER(); -static int LEFT_BRACE(); -static int LEFT_BRACKET(); -static int LITERAL_NAME(); -static int NAME(); -static int NO_TOKEN(); -static int OOPS_NAME(); -static int RADIX_NUMBER(); -static int REAL(); -static int RIGHT_ANGLE(); -static int RIGHT_BRACE(); -static int RIGHT_BRACKET(); -static int RIGHT_PAREN(); -static int STRING(); -static int add_1st_decpt(); -static int add_1st_digits(); -static int add_char(); -static int add_decpt(); -static int add_digits(); -static int add_e_sign(); -static int add_exponent(); -static int add_fraction(); -static int add_r_digits(); -static int add_radix(); -static int add_sign(); -static int next_char(); -static int skip_comment(); -static int skip_space(); +static int AAH_NAME ( int ch ); +static int BREAK_SIGNAL ( int ch ); +static int HEX_STRING ( int ch ); +static int IMMED_NAME ( int ch ); +static int INTEGER ( int ch ); +static int LEFT_BRACE ( int ch ); +static int LEFT_BRACKET ( int ch ); +static int LITERAL_NAME ( int ch ); +static int NAME ( int ch ); +static int NO_TOKEN ( int ch ); +static int OOPS_NAME ( int ch ); +static int RADIX_NUMBER ( int ch ); +static int REAL ( int ch ); +static int RIGHT_ANGLE ( int ch ); +static int RIGHT_BRACE ( int ch ); +static int RIGHT_BRACKET ( int ch ); +static int RIGHT_PAREN ( int ch ); +static int STRING ( int ch ); +static int add_1st_decpt ( int ch ); +static int add_1st_digits ( int ch ); +static int add_char ( int ch ); +static int add_decpt ( int ch ); +static int add_digits ( int ch ); +static int add_exponent ( int ch ); +static int add_e_sign ( int ch ); +static int add_fraction ( int ch ); +static int add_radix ( int ch ); +static int add_r_digits ( int ch ); +static int add_sign ( int ch ); +static int next_char ( int ch ); +static int skip_comment ( int ch ); +static int skip_space ( int ch ); static struct cat { - int (*actionRoutineP)(); + int (*actionRoutineP)(int); unsigned char *nextStateP; } classActionTable[] = { diff --git a/src/Type1/trig.h b/src/Type1/trig.h index c742f96..f442a61 100644 --- a/src/Type1/trig.h +++ b/src/Type1/trig.h @@ -28,6 +28,12 @@ * SOFTWARE. */ /*SHARED*/ + +/* $XFree86: xc/lib/font/Type1/trig.h,v 1.3 2001/01/17 19:43:24 dawes Exp $ */ + +#undef DegreeCos +#undef DegreeSin +#undef sqrt #define DegreeCos(d) xiStub() #define DegreeSin(d) xiStub() diff --git a/src/Type1/type1.c b/src/Type1/type1.c index f1b11c0..5b83dd0 100644 --- a/src/Type1/type1.c +++ b/src/Type1/type1.c @@ -28,6 +28,24 @@ * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ +/* Copyright (c) 1994-1999 Silicon Graphics, Inc. All Rights Reserved. + * + * The contents of this file are subject to the CID Font Code Public Licence + * Version 1.0 (the "License"). You may not use this file except in compliance + * with the Licence. You may obtain a copy of the License at Silicon Graphics, + * Inc., attn: Legal Services, 2011 N. Shoreline Blvd., Mountain View, CA + * 94043 or at http://www.sgi.com/software/opensource/cid/license.html. + * + * Software distributed under the License is distributed on an "AS IS" basis. + * ALL WARRANTIES ARE DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED + * WARRANTIES OF MERCHANTABILITY, OF FITNESS FOR A PARTICULAR PURPOSE OR OF + * NON-INFRINGEMENT. See the License for the specific language governing + * rights and limitations under the License. + * + * The Original Software is CID font code that was developed by Silicon + * Graphics, Inc. + */ +/* $XFree86: xc/lib/font/Type1/type1.c,v 1.9 2001/01/17 19:43:24 dawes Exp $ */ /*********************************************************************/ /* */ @@ -46,16 +64,24 @@ /******************/ /* Include Files: */ /******************/ +#ifndef FONTMODULE #include <stdio.h> /* a system-dependent include, usually */ - +#include <math.h> +#else +#include "Xdefs.h" +#include "Xmd.h" +#include "xf86_ansic.h" +#endif #include "objects.h" #include "spaces.h" #include "paths.h" #include "fonts.h" /* understands about TEXTTYPEs */ #include "pictures.h" /* understands about handles */ +#include "range.h" typedef struct xobject xobject; #include "util.h" /* PostScript objects */ +#include "fontfcn.h" #include "blues.h" /* Blues structure for font-level hints */ /**********************************/ @@ -66,7 +92,11 @@ typedef struct xobject xobject; #define MAXPSFAKESTACK 32 /* Max depth of fake PostScript stack (local) */ #define MAXSTRLEN 512 /* Max length of a Type 1 string (local) */ #define MAXLABEL 256 /* Maximum number of new hints */ +#ifdef BUILDCID +#define MAXSTEMS 500 /* Maximum number of VSTEM and HSTEM hints */ +#else #define MAXSTEMS 128 /* Maximum number of VSTEM and HSTEM hints */ +#endif #define EPS 0.001 /* Small number for comparisons */ /************************************/ @@ -106,14 +136,12 @@ typedef struct xobject xobject; /*****************/ /* Useful macros */ /*****************/ -static double tmpx; /* Store macro argument in tmpx to avoid re-evaluation */ -static long tmpi; /* Store converted value in tmpi to avoid re-evaluation */ -#define FABS(x) (((tmpx = (x)) < 0.0) ? -tmpx : tmpx) +#define FABS(x) fabs(x) -#define CEIL(x) (((tmpi = (long) (tmpx = (x))) < (x)) ? ++tmpi : tmpi) +#define CEIL(x) ceil(x) -#define FLOOR(x) (((tmpi = (long) (tmpx = (x))) > (x)) ? --tmpi : tmpi) +#define FLOOR(x) floor(x) #define ROUND(x) FLOOR((x) + 0.5) @@ -138,7 +166,14 @@ struct stem { /* representation of a STEM hint */ struct segment *rthint, *rtrevhint; /* right or top hint adjustment */ }; -extern struct XYspace *IDENTITY; +struct xobject *Type1Char(char *env, struct XYspace *S, + psobj *charstrP, psobj *subrsP, psobj *osubrsP, + struct blues_struct *bluesP, int *modeP); +#ifdef BUILDCID +struct xobject *CIDChar(char *env, struct XYspace *S, + psobj *charstrP, psobj *subrsP, psobj *osubrsP, + struct blues_struct *bluesP, int *modeP); +#endif static double escapementX, escapementY; static double sidebearingX, sidebearingY; @@ -158,24 +193,57 @@ static int *ModeP; /************************/ /* Forward declarations */ /************************/ -static double Div(); -static double PSFakePop(); -static void DoCommand(); -static void Escape(); -static void HStem(); -static void VStem(); -static void RLineTo(); -static void RRCurveTo(); -static void DoClosePath(); -static void CallSubr(); -static void Return(); -static void EndChar(); -static void RMoveTo(); -static void DotSection(); -static void Seac(); -static void Sbw(); -static void CallOtherSubr(); -static void SetCurrentPoint(); +static struct segment *Applyhint ( struct segment *p, int stemnumber, + int half ); +static struct segment *Applyrevhint ( struct segment *p, int stemnumber, + int half ); +static void CallOtherSubr ( int othersubrno ); +static void CallSubr ( int subrno ); +static struct segment *CenterStem ( double edge1, double edge2 ); +static void ClearCallStack ( void ); +static void ClearPSFakeStack ( void ); +static void ClearStack ( void ); +static void ComputeAlignmentZones ( void ); +static void ComputeStem ( int stemno ); +static void Decode ( int Code ); +static unsigned char Decrypt ( unsigned char cipher ); +static double Div ( double num1, double num2 ); +static void DoClosePath ( void ); +static void DoCommand ( int Code ); +static int DoRead ( int *CodeP ); +static void DotSection ( void ); +static void EndChar ( void ); +static void Escape ( int Code ); +static struct segment *FindStems ( double x, double y, double dx, double dy ); +static void FinitStems ( void ); +static void FlxProc ( double c1x2, double c1y2, double c3x0, double c3y0, + double c3x1, double c3y1, double c3x2, double c3y2, + double c4x0, double c4y0, double c4x1, double c4y1, + double c4x2, double c4y2, double epY, double epX, + int idmin ); +static void FlxProc1 ( void ); +static void FlxProc2 ( void ); +static void HintReplace ( void ); +static void HStem ( double y, double dy ); +static void InitStems ( void ); +static void PopCall ( psobj **CurrStrPP, int *CurrIndexP, + unsigned short *CurrKeyP ); +static double PSFakePop ( void ); +static void PSFakePush ( double Num ); +static void Push ( double Num ); +static void PushCall ( psobj *CurrStrP, int CurrIndex, + unsigned short CurrKey ); +static void Return ( void ); +static void RLineTo ( double dx, double dy ); +static void RMoveTo ( double dx, double dy ); +static void RRCurveTo ( double dx1, double dy1, double dx2, double dy2, + double dx3, double dy3 ); +static void Sbw ( double sbx, double sby, double wx, double wy ); +static void Seac ( double asb, double adx, double ady, unsigned char bchar, + unsigned char achar ); +static void SetCurrentPoint ( double x, double y ); +static void StartDecrypt ( void ); +static void VStem ( double x, double dx ); /*****************************************/ /* statics for Flex procedures (FlxProc) */ @@ -197,7 +265,7 @@ static int numalignmentzones; /* total number of alignment zones */ /* Fill in the alignment zone structures. */ /******************************************/ static void -ComputeAlignmentZones() +ComputeAlignmentZones(void) { int i; double dummy, bluezonepixels, familyzonepixels; @@ -276,7 +344,7 @@ static double wsoffsetX, wsoffsetY; /* White space offset - for VSTEM3,HSTEM3 * static int wsset; /* Flag for whether we've set wsoffsetX,Y */ static void -InitStems() /* Initialize the STEM hint data structures */ +InitStems(void) /* Initialize the STEM hint data structures */ { InDotSection = FALSE; currstartstem = numstems = 0; @@ -284,7 +352,7 @@ InitStems() /* Initialize the STEM hint data structures */ } static void -FinitStems() /* Terminate the STEM hint data structures */ +FinitStems(void) /* Terminate the STEM hint data structures */ { int i; @@ -301,8 +369,7 @@ FinitStems() /* Terminate the STEM hint data structures */ /* inside the stem. */ /*******************************************************************/ static void -ComputeStem(stemno) - int stemno; +ComputeStem(int stemno) { int verticalondevice, idealwidth; double stemstart, stemwidth; @@ -450,10 +517,10 @@ ComputeStem(stemno) if (unitpixels < blues->BlueScale) suppressovershoot = TRUE; else - if (alignmentzones[i].topzone) + if (alignmentzones[i].topzone) { if (stemtop >= alignmentzones[i].bottomy + blues->BlueShift) enforceovershoot = TRUE; - else + } else if (stembottom <= alignmentzones[i].topy - blues->BlueShift) enforceovershoot = TRUE; @@ -492,20 +559,21 @@ ComputeStem(stemno) it falls at least one pixel beyond the flat position. */ if (enforceovershoot) - if (overshoot < onepixel) + if (overshoot < onepixel) { if (alignmentzones[i].topzone) stemshift += onepixel - overshoot; else stemshift -= onepixel - overshoot; - + } /* SUPPRESS overshoot by aligning the stem to the alignment zone's flat position. */ - if (suppressovershoot) + if (suppressovershoot) { if (alignmentzones[i].topzone) stemshift -= overshoot; else stemshift += overshoot; + } } /************************************************************/ @@ -569,9 +637,8 @@ ComputeStem(stemno) /* hint value or the right/top hint value depending on where the */ /* point lies in the stem. */ /*********************************************************************/ -static struct segment *Applyhint(p, stemnumber, half) -struct segment *p; -int stemnumber, half; +static struct segment * +Applyhint(struct segment *p, int stemnumber, int half) { if (half == LEFT || half == BOTTOM) return Join(p, stems[stemnumber].lbhint); /* left or bottom hint */ @@ -584,9 +651,8 @@ int stemnumber, half; /* hint value or the right/top hint value depending on where the */ /* point lies in the stem. */ /*********************************************************************/ -static struct segment *Applyrevhint(p, stemnumber, half) -struct segment *p; -int stemnumber, half; +static struct segment * +Applyrevhint(struct segment *p, int stemnumber, int half) { if (half == LEFT || half == BOTTOM) return Join(p, stems[stemnumber].lbrevhint); /* left or bottom hint */ @@ -602,8 +668,8 @@ int stemnumber, half; /* The actual hintvalue is returned as a location. */ /* Hints are ignored inside a DotSection. */ /***********************************************************************/ -static struct segment *FindStems(x, y, dx, dy) -double x, y, dx, dy; +static struct segment * +FindStems(double x, double y, double dx, double dy) { int i; int newvert, newhor; @@ -697,30 +763,26 @@ static double PSFakeStack[MAXPSFAKESTACK]; static int PSFakeTop; static void -ClearStack() +ClearStack(void) { Top = -1; } static void -Push(Num) - double Num; +Push(double Num) { if (++Top < MAXSTACK) Stack[Top] = Num; else Error0("Push: Stack full\n"); } static void -ClearCallStack() +ClearCallStack(void) { CallTop = -1; } static void -PushCall(CurrStrP, CurrIndex, CurrKey) - psobj *CurrStrP; - int CurrIndex; - unsigned short CurrKey; +PushCall(psobj *CurrStrP, int CurrIndex, unsigned short CurrKey) { if (++CallTop < MAXCALLSTACK) { CallStack[CallTop].currstrP = CurrStrP; /* save CharString pointer */ @@ -731,10 +793,7 @@ PushCall(CurrStrP, CurrIndex, CurrKey) } static void -PopCall(CurrStrPP, CurrIndexP, CurrKeyP) - psobj **CurrStrPP; - int *CurrIndexP; - unsigned short *CurrKeyP; +PopCall(psobj **CurrStrPP, int *CurrIndexP, unsigned short *CurrKeyP) { if (CallTop >= 0) { *CurrStrPP = CallStack[CallTop].currstrP; /* restore CharString pointer */ @@ -745,23 +804,22 @@ PopCall(CurrStrPP, CurrIndexP, CurrKeyP) } static void -ClearPSFakeStack() +ClearPSFakeStack(void) { PSFakeTop = -1; } /* PSFakePush: Pushes a number onto the fake PostScript stack */ static void -PSFakePush(Num) - double Num; +PSFakePush(double Num) { if (++PSFakeTop < MAXPSFAKESTACK) PSFakeStack[PSFakeTop] = Num; else Error0("PSFakePush: Stack full\n"); } /* PSFakePop: Removes a number from the top of the fake PostScript stack */ -static double -PSFakePop () +static double +PSFakePop (void) { if (PSFakeTop >= 0) return(PSFakeStack[PSFakeTop--]); else Error0Ret("PSFakePop : Stack empty\n", 0.0); @@ -771,9 +829,8 @@ PSFakePop () /***********************************************************************/ /* Center a stem on the pixel grid -- used by HStem3 and VStem3 */ /***********************************************************************/ -static struct segment *CenterStem(edge1, edge2) - double edge1; - double edge2; +static struct segment * +CenterStem(double edge1, double edge2) { int idealwidth, verticalondevice; double leftx, lefty, rightx, righty, center, width; @@ -842,8 +899,8 @@ static struct segment *CenterStem(edge1, edge2) static unsigned short r; /* Pseudo-random sequence of keys */ -static unsigned char Decrypt(cipher) -unsigned char cipher; +static unsigned char +Decrypt(unsigned char cipher) { unsigned char plain; @@ -853,8 +910,8 @@ unsigned char cipher; } /* Get the next byte from the codestring being interpreted */ -static int DoRead(CodeP) - int *CodeP; +static int +DoRead(int *CodeP) { if (strindex >= CharStringP->len) return(FALSE); /* end of string */ *CodeP = Decrypt((unsigned char) CharStringP->data.stringP[strindex++]); @@ -864,7 +921,8 @@ static int DoRead(CodeP) /* Strip blues->lenIV bytes from CharString and update encryption key */ /* (the lenIV entry in the Private dictionary specifies the number of */ /* random bytes at the beginning of each CharString; default is 4) */ -static void StartDecrypt() +static void +StartDecrypt(void) { int Code; @@ -875,8 +933,7 @@ static void StartDecrypt() } static void -Decode(Code) - int Code; +Decode(int Code) { int Code1, Code2, Code3, Code4; @@ -906,8 +963,7 @@ ended: Error0("Decode: Premature end of Type 1 CharString"); /* Interpret a command code */ static void -DoCommand(Code) - int Code; +DoCommand(int Code) { switch(Code) { case HSTEM: /* |- y dy HSTEM |- */ @@ -1025,8 +1081,7 @@ DoCommand(Code) } static void -Escape(Code) - int Code; +Escape(int Code) { int i, Num; struct segment *p; @@ -1094,7 +1149,14 @@ Escape(Code) if (Top < Num+1) Error0("DoCommand: Stack low\n"); for (i = 0; i < Num; i++) PSFakePush(Stack[Top - i - 2]); Top -= Num + 2; +#ifdef BUILDCID + if ((int)Stack[Top + Num + 2] > 3) + ClearPSFakeStack(); + else + CallOtherSubr((int)Stack[Top + Num + 2]); +#else CallOtherSubr((int)Stack[Top + Num + 2]); +#endif break; case POP: /* - POP number */ /* Removes a number from the top of the */ @@ -1121,8 +1183,7 @@ Escape(Code) /* between coordinates y and y + dy */ /* y is relative to the left sidebearing point */ static void -HStem(y, dy) - double y, dy; +HStem(double y, double dy) { IfTrace2((FontDebug), "Hstem %f %f\n", &y, &dy); if (ProcessHints) { @@ -1142,9 +1203,9 @@ HStem(y, dy) /* Declares the horizontal range of a vertical stem zone */ /* between coordinates x and x + dx */ /* x is relative to the left sidebearing point */ + static void -VStem(x, dx) - double x, dx; +VStem(double x, double dx) { IfTrace2((FontDebug), "Vstem %f %f\n", &x, &dx); if (ProcessHints) { @@ -1163,8 +1224,7 @@ VStem(x, dx) /* |- dx dy RLINETO |- */ /* Behaves like RLINETO in PostScript */ static void -RLineTo(dx, dy) - double dx, dy; +RLineTo(double dx, double dy) { struct segment *B; @@ -1187,8 +1247,8 @@ RLineTo(dx, dy) /* (dx1+dx2) (dy1+dy2) (dx1+dx2+dx3) */ /* (dy1+dy2+dy3) RCURVETO in PostScript */ static void -RRCurveTo(dx1, dy1, dx2, dy2, dx3, dy3) - double dx1, dy1, dx2, dy2, dx3, dy3; +RRCurveTo(double dx1, double dy1, double dx2, double dy2, + double dx3, double dy3) { struct segment *B, *C, *D; @@ -1211,17 +1271,17 @@ RRCurveTo(dx1, dy1, dx2, dy2, dx3, dy3) /* Since XIMAGER is not completely relative, */ /* we need to add up the delta values */ - C = Join(C, Dup(B)); - D = Join(D, Dup(C)); + C = Join(C, (struct segment *)Dup(B)); + D = Join(D, (struct segment *)Dup(C)); - path = Join(path, Bezier(B, C, D)); + path = Join(path, (struct segment *)Bezier(B, C, D)); } /* - CLOSEPATH |- */ /* Closes a subpath WITHOUT repositioning the */ /* current point */ static void -DoClosePath() +DoClosePath(void) { struct segment *CurrentPoint; @@ -1235,8 +1295,7 @@ DoClosePath() /* Calls a CharString subroutine with index */ /* subr# from the Subrs array */ static void -CallSubr(subrno) - int subrno; +CallSubr(int subrno) { IfTrace1((FontDebug), "CallSubr %d\n", subrno); if ((subrno < 0) || (subrno >= SubrsP->len)) @@ -1250,7 +1309,7 @@ CallSubr(subrno) /* Returns from a Subrs array CharString */ /* subroutine called with CALLSUBR */ static void -Return() +Return(void) { IfTrace0((FontDebug), "Return\n"); PopCall(&CharStringP, &strindex, &r); @@ -1265,7 +1324,7 @@ Return() /* or STROKE depending on the value of PaintType in the */ /* font dictionary */ static void -EndChar() +EndChar(void) { IfTrace0((FontDebug), "EndChar\n"); @@ -1283,8 +1342,7 @@ EndChar() /* |- dx dy RMOVETO |- */ /* Behaves like RMOVETO in PostScript */ static void -RMoveTo(dx,dy) - double dx,dy; +RMoveTo(double dx, double dy) { struct segment *B; @@ -1306,7 +1364,7 @@ RMoveTo(dx,dy) /* Brackets an outline section for the dots in */ /* letters such as "i", "j", and "!". */ static void -DotSection() +DotSection(void) { IfTrace0((FontDebug), "DotSection\n"); InDotSection = !InDotSection; @@ -1315,9 +1373,8 @@ DotSection() /* |- asb adx ady bchar achar SEAC |- */ /* Standard Encoding Accented Character. */ static void -Seac(asb, adx, ady, bchar, achar) - double asb, adx, ady; - unsigned char bchar, achar; +Seac(double asb, double adx, double ady, + unsigned char bchar, unsigned char achar) { int Code; struct segment *mypath; @@ -1337,7 +1394,7 @@ Seac(asb, adx, ady, bchar, achar) path = NULL; /* Go find the CharString for the accent's code via an upcall */ - CharStringP = GetType1CharString(Environment, achar); + CharStringP = GetType1CharString((psfont *)Environment, achar); StartDecrypt(); ClearStack(); @@ -1357,7 +1414,7 @@ Seac(asb, adx, ady, bchar, achar) accentoffsetX = accentoffsetY = 0; /* go find the CharString for the base char's code via an upcall */ - CharStringP = GetType1CharString(Environment, bchar); + CharStringP = GetType1CharString((psfont *)Environment, bchar); StartDecrypt(); ClearStack(); @@ -1380,8 +1437,7 @@ Seac(asb, adx, ady, bchar, achar) /* Set the left sidebearing point to (sbx,sby), */ /* set the character width vector to (wx,wy). */ static void -Sbw(sbx, sby, wx, wy) - double sbx, sby, wx, wy; +Sbw(double sbx, double sby, double wx, double wy) { IfTrace4((FontDebug), "SBW %f %f %f %f\n", &sbx, &sby, &wx, &wy); @@ -1398,8 +1454,8 @@ Sbw(sbx, sby, wx, wy) /* num1 num2 DIV quotient */ /* Behaves like DIV in the PostScript language */ -static double Div(num1, num2) - double num1, num2; +static double +Div(double num1, double num2) { IfTrace2((FontDebug), "Div %f %f\n", &num1, &num2); return(num1 / num2); @@ -1485,14 +1541,11 @@ static double Div(num1, num2) /* Calling sequence: 'idmin epX epY 3 0 callothersubr' */ /* Computes Flex values, and renders the Flex path, */ /* and returns (leaves) ending coordinates on stack */ -static void -FlxProc(c1x2, c1y2, c3x0, c3y0, c3x1, c3y1, c3x2, c3y2, - c4x0, c4y0, c4x1, c4y1, c4x2, c4y2, epY, epX, idmin) - double c1x2, c1y2; - double c3x0, c3y0, c3x1, c3y1, c3x2, c3y2; - double c4x0, c4y0, c4x1, c4y1, c4x2, c4y2; - double epX, epY; - int idmin; +static void +FlxProc(double c1x2, double c1y2, double c3x0, double c3y0, + double c3x1, double c3y1, double c3x2, double c3y2, + double c4x0, double c4y0, double c4x1, double c4y1, + double c4x2, double c4y2, double epY, double epX, int idmin) { double dmin; double c1x0, c1y0, c1x1, c1y1; @@ -1656,7 +1709,8 @@ FlxProc(c1x2, c1y2, c3x0, c3y0, c3x1, c3y1, c3x2, c3y2, /* FlxProc1() = OtherSubrs[1]; Part of Flex */ /* Calling sequence: '0 1 callothersubr' */ /* Saves and clears path, then restores currentpoint */ -static void FlxProc1() +static void +FlxProc1(void) { struct segment *CurrentPoint; @@ -1669,7 +1723,8 @@ static void FlxProc1() /* FlxProc2() = OtherSubrs[2]; Part of Flex */ /* Calling sequence: '0 2 callothersubr' */ /* Returns currentpoint on stack */ -static void FlxProc2() +static void +FlxProc2(void) { struct segment *CurrentPoint; double CurrentX, CurrentY; @@ -1686,7 +1741,8 @@ static void FlxProc2() /* HintReplace() = OtherSubrs[3]; Hint Replacement */ /* Calling sequence: 'subr# 1 3 callothersubr pop callsubr' */ /* Reinitializes stem hint structure */ -static void HintReplace() +static void +HintReplace(void) { /* Effectively retire the current stems, but keep them around for */ /* revhint use in case we are in a stem when we replace hints. */ @@ -1699,8 +1755,7 @@ static void HintReplace() /* Make calls on the PostScript interpreter (or call equivalent C code) */ /* NOTE: The n arguments have been pushed on the fake PostScript stack */ static void -CallOtherSubr(othersubrno) - int othersubrno; +CallOtherSubr(int othersubrno) { IfTrace1((FontDebug), "CallOtherSubr %d\n", othersubrno); @@ -1735,8 +1790,7 @@ CallOtherSubr(othersubrno) /* character space coordinates without per- */ /* forming a CharString MOVETO command */ static void -SetCurrentPoint(x, y) - double x, y; +SetCurrentPoint(double x, double y) { IfTrace2((FontDebug), "SetCurrentPoint %f %f\n", &x, &y); @@ -1746,14 +1800,11 @@ SetCurrentPoint(x, y) /* The Type1Char routine for use by PostScript. */ /************************************************/ -struct xobject *Type1Char(env, S, charstrP, subrsP, osubrsP, bluesP, modeP) - char *env; - struct XYspace *S; - psobj *charstrP; - psobj *subrsP; - psobj *osubrsP; - struct blues_struct *bluesP; /* FontID's ptr to the blues struct */ - int *modeP; +struct xobject * +Type1Char(char *env, struct XYspace *S, psobj *charstrP, psobj *subrsP, + psobj *osubrsP, + struct blues_struct *bluesP, /* FontID's ptr to the blues struct */ + int *modeP) { int Code; @@ -1804,7 +1855,66 @@ struct xobject *Type1Char(env, S, charstrP, subrsP, osubrsP, bluesP, modeP) path = NULL; /* Indicate that character could not be built */ } } - + return((struct xobject *) path); } - + +#ifdef BUILDCID +struct xobject * +CIDChar(char *env, struct XYspace *S, + psobj *charstrP, psobj *subrsP, psobj *osubrsP, + struct blues_struct *bluesP, /* FontID's ptr to the blues struct */ + int *modeP) +{ + int Code; + + path = NULL; + errflag = FALSE; + + /* Make parameters available to all CID routines */ + Environment = env; + CharSpace = S; /* used when creating path elements */ + CharStringP = charstrP; + SubrsP = subrsP; + OtherSubrsP = osubrsP; + ModeP = modeP; + + blues = bluesP; + + /* compute the alignment zones */ + ComputeAlignmentZones(); + + StartDecrypt(); + + ClearStack(); + ClearPSFakeStack(); + ClearCallStack(); + + InitStems(); + + currx = curry = 0; + escapementX = escapementY = 0; + sidebearingX = sidebearingY = 0; + accentoffsetX = accentoffsetY = 0; + wsoffsetX = wsoffsetY = 0; /* No shift to preserve whitspace. */ + wsset = 0; /* wsoffsetX,Y haven't been set yet. */ + + for (;;) { + if (!DoRead(&Code)) break; + Decode(Code); + if (errflag) break; + } + + FinitStems(); + + /* Clean up if an error has occurred */ + if (errflag) { + if (path != NULL) { + Destroy(path); /* Reclaim storage */ + path = NULL; /* Indicate that character could not be built */ + } + } + + return((struct xobject *) path); +} +#endif diff --git a/src/Type1/util.c b/src/Type1/util.c index aafe7c5..9bd8a83 100644 --- a/src/Type1/util.c +++ b/src/Type1/util.c @@ -27,11 +27,35 @@ * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS * SOFTWARE. */ +/* Copyright (c) 1994-1999 Silicon Graphics, Inc. All Rights Reserved. + * + * The contents of this file are subject to the CID Font Code Public Licence + * Version 1.0 (the "License"). You may not use this file except in compliance + * with the Licence. You may obtain a copy of the License at Silicon Graphics, + * Inc., attn: Legal Services, 2011 N. Shoreline Blvd., Mountain View, CA + * 94043 or at http://www.sgi.com/software/opensource/cid/license.html. + * + * Software distributed under the License is distributed on an "AS IS" basis. + * ALL WARRANTIES ARE DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED + * WARRANTIES OF MERCHANTABILITY, OF FITNESS FOR A PARTICULAR PURPOSE OR OF + * NON-INFRINGEMENT. See the License for the specific language governing + * rights and limitations under the License. + * + * The Original Software is CID font code that was developed by Silicon + * Graphics, Inc. + */ +/* $XFree86: xc/lib/font/Type1/util.c,v 1.6 2001/01/17 19:43:24 dawes Exp $ */ /* Author: Katherine A. Hitchcock IBM Almaden Research Laboratory */ +#ifndef FONTMODULE #include <stdio.h> +#else +#include "Xdefs.h" +#include "Xmd.h" +#include "xf86_ansic.h" +#endif #include "util.h" -#include "fontmisc.h" +#include "fontmisc.h" /* for xalloc/xfree */ static char *vm_base = NULL; /* Start of virtual memory area */ char *vm_next = NULL; /* Pointer to first free byte */ @@ -41,10 +65,18 @@ static char *vm_base = NULL; /* Start of virtual memory area */ /* * Initialize memory. */ -boolean vm_init(cnt) -int cnt; +boolean +vm_init(int cnt) { +#ifdef BUILDCID + if (vm_base == NULL || (vm_base != NULL && vm_size != cnt)) { + if (vm_base != NULL) xfree(vm_base); + vm_next = vm_base = (char *)xalloc (cnt); + } else + vm_next = vm_base; +#else vm_next = vm_base = (char *)xalloc (cnt); +#endif if (vm_base != NULL) { vm_free = cnt; @@ -56,8 +88,8 @@ int cnt; } -char *vm_alloc(bytes) - int bytes; +char * +vm_alloc(int bytes) { char *answer; @@ -79,9 +111,8 @@ char *vm_alloc(bytes) /* * Format an Integer object */ -void objFormatInteger(objP,value) - psobj *objP; - int value; +void +objFormatInteger(psobj *objP, int value) { if (objP != NULL) { objP->type = OBJ_INTEGER; @@ -93,9 +124,8 @@ void objFormatInteger(objP,value) /* * Format a Real object */ -void objFormatReal(objP,value) - psobj *objP; - float value; +void +objFormatReal(psobj *objP, float value) { if (objP != NULL) { objP->type = OBJ_REAL; @@ -107,9 +137,8 @@ void objFormatReal(objP,value) /* * Format a Boolean object */ -void objFormatBoolean(objP,value) - psobj *objP; - boolean value; +void +objFormatBoolean(psobj *objP, boolean value) { if (objP != NULL) { objP->type = OBJ_BOOLEAN; @@ -121,10 +150,8 @@ void objFormatBoolean(objP,value) /* * Format an Encoding object */ -void objFormatEncoding(objP,length,valueP) - psobj *objP; - int length; - psobj *valueP; +void +objFormatEncoding(psobj *objP, int length, psobj *valueP) { if (objP != NULL) { objP->type = OBJ_ENCODING; @@ -136,10 +163,8 @@ void objFormatEncoding(objP,length,valueP) /* * Format an Array object */ -void objFormatArray(objP,length,valueP) - psobj *objP; - int length; - psobj *valueP; +void +objFormatArray(psobj *objP, int length, psobj *valueP) { if (objP != NULL) { objP->type = OBJ_ARRAY; @@ -152,10 +177,8 @@ void objFormatArray(objP,length,valueP) /* * Format a String object */ -void objFormatString(objP,length,valueP) - psobj *objP; - int length; - char *valueP; +void +objFormatString(psobj *objP, int length, char *valueP) { if (objP != NULL) { objP->type = OBJ_STRING; @@ -167,10 +190,8 @@ void objFormatString(objP,length,valueP) /* * Format a Name object */ -void objFormatName(objP,length,valueP) - psobj *objP; - int length; - char *valueP; +void +objFormatName(psobj *objP, int length, char *valueP) { if (objP != NULL) { objP->type = OBJ_NAME; @@ -182,9 +203,8 @@ void objFormatName(objP,length,valueP) /* * Format a File object */ -void objFormatFile(objP,valueP) - psobj *objP; - FILE *valueP; +void +objFormatFile(psobj *objP, FILE *valueP) { if (objP != NULL) { objP->type = OBJ_FILE; diff --git a/src/Type1/util.h b/src/Type1/util.h index 20c14c4..7abc289 100644 --- a/src/Type1/util.h +++ b/src/Type1/util.h @@ -27,6 +27,25 @@ * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS * SOFTWARE. */ +/* Copyright (c) 1994-1999 Silicon Graphics, Inc. All Rights Reserved. + * + * The contents of this file are subject to the CID Font Code Public Licence + * Version 1.0 (the "License"). You may not use this file except in compliance + * with the Licence. You may obtain a copy of the License at Silicon Graphics, + * Inc., attn: Legal Services, 2011 N. Shoreline Blvd., Mountain View, CA + * 94043 or at http://www.sgi.com/software/opensource/cid/license.html. + * + * Software distributed under the License is distributed on an "AS IS" basis. + * ALL WARRANTIES ARE DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED + * WARRANTIES OF MERCHANTABILITY, OF FITNESS FOR A PARTICULAR PURPOSE OR OF + * NON-INFRINGEMENT. See the License for the specific language governing + * rights and limitations under the License. + * + * The Original Software is CID font code that was developed by Silicon + * Graphics, Inc. + */ +/* $XFree86: xc/lib/font/Type1/util.h,v 1.5 2001/01/17 19:43:24 dawes Exp $ */ + #ifndef UTIL_H #define UTIL_H @@ -61,7 +80,11 @@ typedef int boolean; /* this is the size of memory allocated for reading fonts */ +#ifdef BUILDCID +#define VM_SIZE (100*1024) +#else #define VM_SIZE (50*1024) +#endif /***================================================================***/ #ifndef MIN @@ -71,11 +94,13 @@ typedef int boolean; /***================================================================***/ /* Routines for managing virtual memory */ /***================================================================***/ -extern boolean vm_init(); + +extern boolean vm_init ( int cnt ); extern long vm_free; extern long vm_size; extern char *vm_next; -extern char *vm_alloc(); +extern char *vm_alloc ( int bytes ); + /***================================================================***/ /* Macros for managing virtual memory */ /***================================================================***/ @@ -173,10 +198,17 @@ typedef struct ps_dict { #define objPSetString(o) ((o)->type = OBJ_STRING) #define objPSetName(o) ((o)->type = OBJ_NAME) #define objPSetFile(o) ((o)->type = OBJ_FILE) - -/***================================================================***/ -/* Entry point for Type1Char to get entry from CharStrings */ -/***================================================================***/ -extern psobj *GetType1CharString(); - + +/***================================================================***/ +/* Prototypes of object formatting functions */ +/***================================================================***/ +extern void objFormatInteger ( psobj *objP, int value ); +extern void objFormatReal ( psobj *objP, float value ); +extern void objFormatBoolean ( psobj *objP, boolean value ); +extern void objFormatEncoding ( psobj *objP, int length, psobj *valueP ); +extern void objFormatArray ( psobj *objP, int length, psobj *valueP ); +extern void objFormatString ( psobj *objP, int length, char *valueP ); +extern void objFormatName ( psobj *objP, int length, char *valueP ); +extern void objFormatFile ( psobj *objP, FILE *valueP ); + #endif diff --git a/src/bitmap/bdfread.c b/src/bitmap/bdfread.c index d365d6f..67e4252 100644 --- a/src/bitmap/bdfread.c +++ b/src/bitmap/bdfread.c @@ -50,9 +50,13 @@ other dealings in this Software without prior written authorization from The Open Group. */ +/* $XFree86: xc/lib/font/bitmap/bdfread.c,v 1.12 2002/09/10 16:14:34 tsi Exp $ */ +#ifndef FONTMODULE #include <ctype.h> +#endif #include "fntfilst.h" +#include "fontutil.h" /* use bitmap structure */ #include "bitmap.h" #include "bdfint.h" @@ -61,22 +65,14 @@ from The Open Group. #define MAXENCODING 0xFFFF #define BDFLINELEN 1024 -extern int bitmapGetGlyphs(), bitmapGetMetrics(); -extern int bitmapGetBitmaps(), bitmapGetExtents(); -static Bool bdfPadToTerminal(); +static Bool bdfPadToTerminal(FontPtr pFont); extern int bdfFileLineNum; /***====================================================================***/ static Bool -bdfReadBitmap(pCI, file, bit, byte, glyph, scan, sizes) - CharInfoPtr pCI; - FontFilePtr file; - int bit, - byte, - glyph, - scan; - int sizes[GLYPHPADOPTIONS]; +bdfReadBitmap(CharInfoPtr pCI, FontFilePtr file, int bit, int byte, + int glyph, int scan, CARD32 *sizes) { int widthBits, widthBytes, @@ -90,7 +86,7 @@ bdfReadBitmap(pCI, file, bit, byte, glyph, scan, sizes) unsigned char *pInBits, *picture, *line = NULL; - char lineBuf[BDFLINELEN]; + unsigned char lineBuf[BDFLINELEN]; widthBits = GLYPHWIDTHPIXELS(pCI); height = GLYPHHEIGHTPIXELS(pCI); @@ -99,9 +95,9 @@ bdfReadBitmap(pCI, file, bit, byte, glyph, scan, sizes) if (widthBytes * height > 0) { picture = (unsigned char *) xalloc(widthBytes * height); if (!picture) { - bdfError("Couldn't allocate picture (%d*%d)\n", widthBytes, height); + bdfError("Couldn't allocate picture (%d*%d)\n", widthBytes, height); goto BAILOUT; - } + } } else picture = NULL; pCI->bits = (char *) picture; @@ -198,13 +194,11 @@ BAILOUT: /***====================================================================***/ static Bool -bdfSkipBitmap(file, height) - FontFilePtr file; - int height; +bdfSkipBitmap(FontFilePtr file, int height) { unsigned char *line; int i = 0; - char lineBuf[BDFLINELEN]; + unsigned char lineBuf[BDFLINELEN]; do { line = bdfGetLine(file, lineBuf, BDFLINELEN); @@ -221,16 +215,21 @@ bdfSkipBitmap(file, height) /***====================================================================***/ static void -bdfFreeFontBits(pFont) - FontPtr pFont; +bdfFreeFontBits(FontPtr pFont) { BitmapFontPtr bitmapFont; BitmapExtraPtr bitmapExtra; - int i; + int i, nencoding; bitmapFont = (BitmapFontPtr) pFont->fontPrivate; bitmapExtra = (BitmapExtraPtr) bitmapFont->bitmapExtra; xfree(bitmapFont->ink_metrics); + if(bitmapFont->encoding) { + nencoding = (pFont->info.lastCol - pFont->info.firstCol + 1) * + (pFont->info.lastRow - pFont->info.firstRow + 1); + for(i=0; i<NUM_SEGMENTS(nencoding); i++) + xfree(bitmapFont->encoding[i]); + } xfree(bitmapFont->encoding); for (i = 0; i < bitmapFont->num_chars; i++) xfree(bitmapFont->metrics[i].bits); @@ -247,14 +246,8 @@ bdfFreeFontBits(pFont) static Bool -bdfReadCharacters(file, pFont, pState, bit, byte, glyph, scan) - FontFilePtr file; - FontPtr pFont; - bdfFileState *pState; - int bit, - byte, - glyph, - scan; +bdfReadCharacters(FontFilePtr file, FontPtr pFont, bdfFileState *pState, + int bit, int byte, int glyph, int scan) { unsigned char *line; register CharInfoPtr ci; @@ -268,7 +261,7 @@ bdfReadCharacters(file, pFont, pState, bit, byte, glyph, scan) BitmapFontPtr bitmapFont; BitmapExtraPtr bitmapExtra; CARD32 *bitmapsSizes; - char lineBuf[BDFLINELEN]; + unsigned char lineBuf[BDFLINELEN]; int nencoding; bitmapFont = (BitmapFontPtr) pFont->fontPrivate; @@ -352,7 +345,7 @@ bdfReadCharacters(file, pFont, pState, bit, byte, glyph, scan) bdfError("bad 'ENCODING' in BDF file\n"); goto BAILOUT; } - if (enc < -1 || t == 2 && enc2 < -1) { + if (enc < -1 || (t == 2 && enc2 < -1)) { bdfError("bad ENCODING value"); goto BAILOUT; } @@ -435,7 +428,7 @@ bdfReadCharacters(file, pFont, pState, bit, byte, glyph, scan) (*p == ' ') || (*p == '\t'); p++) /* empty for loop */ ; - ci->metrics.attributes = bdfHexByte(p) << 8 + bdfHexByte(p + 2); + ci->metrics.attributes = (bdfHexByte(p) << 8) + bdfHexByte(p + 2); line = bdfGetLine(file, lineBuf, BDFLINELEN); } else ci->metrics.attributes = 0; @@ -489,11 +482,13 @@ bdfReadCharacters(file, pFont, pState, bit, byte, glyph, scan) nencoding = (pFont->info.lastRow - pFont->info.firstRow + 1) * (pFont->info.lastCol - pFont->info.firstCol + 1); - bitmapFont->encoding = (CharInfoPtr *) xalloc(nencoding * sizeof(CharInfoPtr)); + bitmapFont->encoding = + (CharInfoPtr **) xcalloc(NUM_SEGMENTS(nencoding), + sizeof(CharInfoPtr*)); if (!bitmapFont->encoding) { bdfError("Couldn't allocate ppCI (%d,%d)\n", - nencoding, - sizeof(CharInfoPtr)); + NUM_SEGMENTS(nencoding), + sizeof(CharInfoPtr*)); goto BAILOUT; } pFont->info.allExist = TRUE; @@ -503,19 +498,26 @@ bdfReadCharacters(file, pFont, pState, bit, byte, glyph, scan) char_row++) { if (bdfEncoding[char_row] == (CharInfoPtr *) NULL) { pFont->info.allExist = FALSE; - for (char_col = pFont->info.firstCol; - char_col <= pFont->info.lastCol; - char_col++) { - bitmapFont->encoding[i++] = NullCharInfo; - } + i += pFont->info.lastCol - pFont->info.firstCol + 1; } else { for (char_col = pFont->info.firstCol; char_col <= pFont->info.lastCol; char_col++) { if (!bdfEncoding[char_row][char_col]) pFont->info.allExist = FALSE; - bitmapFont->encoding[i++] = bdfEncoding[char_row][char_col]; - } + else { + if (!bitmapFont->encoding[SEGMENT_MAJOR(i)]) { + bitmapFont->encoding[SEGMENT_MAJOR(i)]= + (CharInfoPtr*)xcalloc(BITMAP_FONT_SEGMENT_SIZE, + sizeof(CharInfoPtr)); + if (!bitmapFont->encoding[SEGMENT_MAJOR(i)]) + goto BAILOUT; + } + ACCESSENCODINGL(bitmapFont->encoding,i) = + bdfEncoding[char_row][char_col]; + } + i++; + } } } for (i = 0; i < 256; i++) @@ -533,13 +535,11 @@ BAILOUT: /***====================================================================***/ static Bool -bdfReadHeader(file, pState) - FontFilePtr file; - bdfFileState *pState; +bdfReadHeader(FontFilePtr file, bdfFileState *pState) { unsigned char *line; char namebuf[BDFLINELEN]; - char lineBuf[BDFLINELEN]; + unsigned char lineBuf[BDFLINELEN]; line = bdfGetLine(file, lineBuf, BDFLINELEN); if (!line || sscanf((char *) line, "STARTFONT %s", namebuf) != 1 || @@ -578,10 +578,7 @@ bdfReadHeader(file, pState) /***====================================================================***/ static Bool -bdfReadProperties(file, pFont, pState) - FontFilePtr file; - FontPtr pFont; - bdfFileState *pState; +bdfReadProperties(FontFilePtr file, FontPtr pFont, bdfFileState *pState) { int nProps, props_left, nextProp; @@ -591,7 +588,7 @@ bdfReadProperties(file, pFont, pState) secondbuf[BDFLINELEN], thirdbuf[BDFLINELEN]; unsigned char *line; - char lineBuf[BDFLINELEN]; + unsigned char lineBuf[BDFLINELEN]; BitmapFontPtr bitmapFont = (BitmapFontPtr) pFont->fontPrivate; line = bdfGetLine(file, lineBuf, BDFLINELEN); @@ -605,6 +602,7 @@ bdfReadProperties(file, pFont, pState) } pFont->info.isStringProp = NULL; pFont->info.props = NULL; + pFont->info.nprops = 0; stringProps = (char *) xalloc((nProps + BDF_GENPROPS) * sizeof(char)); pFont->info.isStringProp = stringProps; @@ -647,7 +645,7 @@ bdfReadProperties(file, pFont, pState) if (secondbuf[0] == '"') { stringProps[nextProp] = TRUE; props[nextProp].value = - bdfGetPropertyValue(line + strlen(namebuf) + 1); + bdfGetPropertyValue((char *)line + strlen(namebuf) + 1); if (!props[nextProp].value) goto BAILOUT; break; @@ -668,7 +666,7 @@ bdfReadProperties(file, pFont, pState) if (secondbuf[0] == '"') { stringProps[nextProp] = TRUE; props[nextProp].value = - bdfGetPropertyValue(line + strlen(namebuf) + 1); + bdfGetPropertyValue((char *)line + strlen(namebuf) + 1); if (!props[nextProp].value) goto BAILOUT; break; @@ -776,22 +774,15 @@ BAILOUT: /***====================================================================***/ static void -bdfUnloadFont(pFont) - FontPtr pFont; +bdfUnloadFont(FontPtr pFont) { bdfFreeFontBits (pFont); - xfree (pFont->devPrivates); - xfree(pFont); + DestroyFontRec(pFont); } int -bdfReadFont(pFont, file, bit, byte, glyph, scan) - FontPtr pFont; - FontFilePtr file; - int bit, - byte, - glyph, - scan; +bdfReadFont(FontPtr pFont, FontFilePtr file, + int bit, int byte, int glyph, int scan) { bdfFileState state; xCharInfo *min, @@ -808,7 +799,7 @@ bdfReadFont(pFont, file, bit, byte, glyph, scan) bitmapFont = (BitmapFontPtr) xalloc(sizeof(BitmapFontRec)); if (!bitmapFont) { - bdfError("Couldn't allocate bitmapFontRec (%d)\n", sizeof(BitmapFontRec)); + bdfError("Couldn't allocate bitmapFontRec (%d)\n", sizeof(BitmapFontRec)); goto BAILOUT; } bzero((char *)bitmapFont, sizeof(BitmapFontRec)); @@ -822,7 +813,7 @@ bdfReadFont(pFont, file, bit, byte, glyph, scan) bitmapFont->bitmapExtra = (BitmapExtraPtr) xalloc(sizeof(BitmapExtraRec)); if (!bitmapFont->bitmapExtra) { - bdfError("Couldn't allocate bitmapExtra (%d)\n", sizeof(BitmapExtraRec)); + bdfError("Couldn't allocate bitmapExtra (%d)\n", sizeof(BitmapExtraRec)); goto BAILOUT; } bzero((char *)bitmapFont->bitmapExtra, sizeof(BitmapExtraRec)); @@ -846,7 +837,8 @@ bdfReadFont(pFont, file, bit, byte, glyph, scan) cols = pFont->info.lastCol - pFont->info.firstCol + 1; r = r - pFont->info.firstRow; c = c - pFont->info.firstCol; - bitmapFont->pDefault = bitmapFont->encoding[r * cols + c]; + bitmapFont->pDefault = ACCESSENCODING(bitmapFont->encoding, + r * cols + c); } } pFont->bit = bit; @@ -864,11 +856,11 @@ bdfReadFont(pFont, file, bit, byte, glyph, scan) if (bitmapFont->bitmapExtra) FontComputeInfoAccelerators(&bitmapFont->bitmapExtra->info); if (pFont->info.constantMetrics) { - if (!bitmapAddInkMetrics(pFont)) { - bdfError("Failed to add bitmap ink metrics\n"); - goto BAILOUT; - } - } + if (!bitmapAddInkMetrics(pFont)) { + bdfError("Failed to add bitmap ink metrics\n"); + goto BAILOUT; + } + } if (bitmapFont->bitmapExtra) bitmapFont->bitmapExtra->info.inkMetrics = pFont->info.inkMetrics; @@ -902,9 +894,7 @@ BAILOUT: } int -bdfReadFontInfo(pFontInfo, file) - FontInfoPtr pFontInfo; - FontFilePtr file; +bdfReadFontInfo(FontInfoPtr pFontInfo, FontFilePtr file) { FontRec font; int ret; @@ -923,8 +913,7 @@ bdfReadFontInfo(pFontInfo, file) } static Bool -bdfPadToTerminal(pFont) - FontPtr pFont; +bdfPadToTerminal(FontPtr pFont) { BitmapFontPtr bitmapFont; BitmapExtraPtr bitmapExtra; @@ -947,9 +936,9 @@ bdfPadToTerminal(pFont) for (i = 0; i < bitmapFont->num_chars; i++) { new.bits = (char *) xalloc(new_size); if (!new.bits) { - bdfError("Couldn't allocate bits (%d)\n", new_size); + bdfError("Couldn't allocate bits (%d)\n", new_size); return FALSE; - } + } FontCharReshape(pFont, &bitmapFont->metrics[i], &new); new.metrics.attributes = bitmapFont->metrics[i].metrics.attributes; xfree(bitmapFont->metrics[i].bits); diff --git a/src/bitmap/bdfutils.c b/src/bitmap/bdfutils.c index d7e5b4c..94a9ff6 100644 --- a/src/bitmap/bdfutils.c +++ b/src/bitmap/bdfutils.c @@ -49,43 +49,30 @@ other dealings in this Software without prior written authorization from The Open Group. */ +/* $XFree86: xc/lib/font/bitmap/bdfutils.c,v 1.10 2001/12/14 19:56:45 dawes Exp $ */ +#ifndef FONTMODULE #include <ctype.h> - #include <stdio.h> +#include <stdarg.h> +#endif + #include "fntfilst.h" #include "fontstruct.h" /* use bitmap structure */ #include "bitmap.h" #include "bdfint.h" -#if NeedVarargsPrototypes -#include <stdarg.h> -#else -#include <varargs.h> -#endif int bdfFileLineNum; /***====================================================================***/ -/* VARARGS1 */ void -#if NeedVarargsPrototypes bdfError(char* message, ...) -#else -bdfError (message, va_alist) - char* message; - va_dcl -#endif { va_list args; -#if NeedVarargsPrototypes va_start (args, message); -#else - va_start (args); -#endif - fprintf(stderr, "BDF Error on line %d: ", bdfFileLineNum); vfprintf(stderr, message, args); va_end (args); @@ -93,19 +80,15 @@ bdfError (message, va_alist) /***====================================================================***/ -/* VARARGS1 */ void -bdfWarning(message, a0, a1, a2, a3, a4, a5) - char *message; - pointer a0, - a1, - a2, - a3, - a4, - a5; +bdfWarning(char *message, ...) { + va_list args; + + va_start (args, message); fprintf(stderr, "BDF Warning on line %d: ", bdfFileLineNum); - fprintf(stderr, message, a0, a1, a2, a3, a4, a5); + vfprintf(stderr, message, args); + va_end (args); } /* @@ -114,10 +97,7 @@ bdfWarning(message, a0, a1, a2, a3, a4, a5) */ unsigned char * -bdfGetLine(file, buf, len) - FontFilePtr file; - unsigned char *buf; - int len; +bdfGetLine(FontFilePtr file, unsigned char *buf, int len) { int c; unsigned char *b; @@ -147,19 +127,17 @@ bdfGetLine(file, buf, len) /***====================================================================***/ Atom -bdfForceMakeAtom(str, size) - register char *str; - register int *size; +bdfForceMakeAtom(char *str, int *size) { register int len = strlen(str); - extern Atom MakeAtom(); + extern Atom MakeAtom(); /* Added this line to be consistent with X.org code */ Atom the_atom; if (size != NULL) *size += len + 1; the_atom = MakeAtom(str, len, TRUE); if (the_atom == None) - bdfError("Atom allocation failed\n"); + bdfError("Atom allocation failed\n"); return the_atom; } @@ -170,8 +148,7 @@ bdfForceMakeAtom(str, size) */ Atom -bdfGetPropertyValue(s) - char *s; +bdfGetPropertyValue(char *s) { register char *p, *pp; @@ -198,8 +175,8 @@ bdfGetPropertyValue(s) s++; pp = p = (char *) xalloc((unsigned) strlen(s) + 1); if (pp == NULL) { - bdfError("Couldn't allocate property value string (%d)\n", strlen(s) + 1); - return None; + bdfError("Couldn't allocate property value string (%d)\n", strlen(s) + 1); + return None; } while (*s) { if (*s == '"') { @@ -225,8 +202,7 @@ bdfGetPropertyValue(s) * return TRUE if string is a valid integer */ int -bdfIsInteger(str) - char *str; +bdfIsInteger(char *str) { char c; @@ -234,7 +210,7 @@ bdfIsInteger(str) if (!(isdigit(c) || c == '-' || c == '+')) return (FALSE); - while (c = *str++) + while ((c = *str++)) if (!isdigit(c)) return (FALSE); @@ -248,8 +224,7 @@ bdfIsInteger(str) */ unsigned char -bdfHexByte(s) - char *s; +bdfHexByte(unsigned char *s) { unsigned char b = 0; register char c; @@ -302,11 +277,8 @@ static char *SpecialAtoms[] = { }; Bool -bdfSpecialProperty(pFont, prop, isString, bdfState) - FontPtr pFont; - FontPropPtr prop; - char isString; - bdfFileState *bdfState; +bdfSpecialProperty(FontPtr pFont, FontPropPtr prop, + char isString, bdfFileState *bdfState) { char **special; char *name; diff --git a/src/bitmap/bitmap.c b/src/bitmap/bitmap.c index 39fd5dc..6fa7bfa 100644 --- a/src/bitmap/bitmap.c +++ b/src/bitmap/bitmap.c @@ -25,6 +25,7 @@ used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from The Open Group. */ +/* $XFree86: xc/lib/font/bitmap/bitmap.c,v 1.7 2001/12/14 19:56:45 dawes Exp $ */ /* * Author: Keith Packard, MIT X Consortium @@ -33,19 +34,11 @@ in this Software without prior written authorization from The Open Group. #include "fntfilst.h" #include "bitmap.h" -int bitmapGetGlyphs(), bitmapGetMetrics(); -int bitmapGetBitmaps(), bitmapGetExtents(); -void bitmapComputeFontBounds (); -void bitmapComputeFontInkBounds (); - int -bitmapGetGlyphs(pFont, count, chars, charEncoding, glyphCount, glyphs) - FontPtr pFont; - unsigned long count; - register unsigned char *chars; - FontEncoding charEncoding; - unsigned long *glyphCount; /* RETURN */ - CharInfoPtr *glyphs; /* RETURN */ +bitmapGetGlyphs(FontPtr pFont, unsigned long count, unsigned char *chars, + FontEncoding charEncoding, + unsigned long *glyphCount, /* RETURN */ + CharInfoPtr *glyphs) /* RETURN */ { BitmapFontPtr bitmapFont; unsigned int firstCol; @@ -56,7 +49,7 @@ bitmapGetGlyphs(pFont, count, chars, charEncoding, glyphCount, glyphs) register unsigned int c; register CharInfoPtr pci; unsigned int r; - CharInfoPtr *encoding; + CharInfoPtr **encoding; CharInfoPtr pDefault; bitmapFont = (BitmapFontPtr) pFont->fontPrivate; @@ -75,14 +68,14 @@ bitmapGetGlyphs(pFont, count, chars, charEncoding, glyphCount, glyphs) while (count--) { c = (*chars++) - firstCol; if (c < numCols) - *glyphs++ = encoding[c]; + *glyphs++ = ACCESSENCODING(encoding,c); else *glyphs++ = pDefault; } } else { while (count--) { c = (*chars++) - firstCol; - if (c < numCols && (pci = encoding[c])) + if (c < numCols && (pci = ACCESSENCODING(encoding,c))) *glyphs++ = pci; else if (pDefault) *glyphs++ = pDefault; @@ -95,7 +88,7 @@ bitmapGetGlyphs(pFont, count, chars, charEncoding, glyphCount, glyphs) c = *chars++ << 8; c = (c | *chars++) - firstCol; if (c < numCols) - *glyphs++ = encoding[c]; + *glyphs++ = ACCESSENCODING(encoding,c); else *glyphs++ = pDefault; } @@ -103,7 +96,7 @@ bitmapGetGlyphs(pFont, count, chars, charEncoding, glyphCount, glyphs) while (count--) { c = *chars++ << 8; c = (c | *chars++) - firstCol; - if (c < numCols && (pci = encoding[c])) + if (c < numCols && (pci = ACCESSENCODING(encoding,c))) *glyphs++ = pci; else if (pDefault) *glyphs++ = pDefault; @@ -118,7 +111,7 @@ bitmapGetGlyphs(pFont, count, chars, charEncoding, glyphCount, glyphs) r = (*chars++) - firstRow; c = (*chars++) - firstCol; if (r < numRows && c < numCols && - (pci = encoding[r * numCols + c])) + (pci = ACCESSENCODING(encoding, r * numCols + c))) *glyphs++ = pci; else if (pDefault) *glyphs++ = pDefault; @@ -132,13 +125,10 @@ bitmapGetGlyphs(pFont, count, chars, charEncoding, glyphCount, glyphs) static CharInfoRec nonExistantChar; int -bitmapGetMetrics(pFont, count, chars, charEncoding, glyphCount, glyphs) - FontPtr pFont; - unsigned long count; - register unsigned char *chars; - FontEncoding charEncoding; - unsigned long *glyphCount; /* RETURN */ - xCharInfo **glyphs; /* RETURN */ +bitmapGetMetrics(FontPtr pFont, unsigned long count, unsigned char *chars, + FontEncoding charEncoding, + unsigned long *glyphCount, /* RETURN */ + xCharInfo **glyphs) /* RETURN */ { int ret; xCharInfo *ink_metrics; diff --git a/src/bitmap/bitmapfunc.c b/src/bitmap/bitmapfunc.c index c52c7e8..da06e7d 100644 --- a/src/bitmap/bitmapfunc.c +++ b/src/bitmap/bitmapfunc.c @@ -26,54 +26,65 @@ in this Software without prior written authorization from The Open Group. */ +/* $XFree86: xc/lib/font/bitmap/bitmapfunc.c,v 3.18 2002/09/24 20:48:52 tsi Exp $ */ + /* * Author: Keith Packard, MIT X Consortium */ #include "fntfilst.h" #include "bitmap.h" +#include "fontutil.h" +#include "bdfint.h" +#include "pcf.h" +#include "snfstr.h" typedef struct _BitmapFileFunctions { - int (*ReadFont) ( /* pFont, file, bit, byte, glyph, scan */ ); - int (*ReadInfo) ( /* pFontInfo, file */ ); + int (*ReadFont) (FontPtr /* pFont */, FontFilePtr /* file */, + int /* bit */, int /* byte */, + int /* glyph */, int /* scan */); + int (*ReadInfo) ( FontInfoPtr /* pFontInfo */, + FontFilePtr /* file */ ); } BitmapFileFunctionsRec, *BitmapFileFunctionsPtr; -extern int pcfReadFont(), pcfReadFontInfo(); -extern int snfReadFont(), snfReadFontInfo(); -extern int bdfReadFont(), bdfReadFontInfo(); -extern int pmfReadFont(); -int BitmapOpenBitmap (); -extern int BitmapOpenScalable (); -int BitmapGetInfoBitmap (); -extern int BitmapGetInfoScalable (); -int BitmapGetRenderIndex (); /* - * these two arrays must be in the same order + * the readers[] and renderers[] arrays must be in the same order, + * and also in the same order as scale[] and find_scale[] in bitscale.c + * */ static BitmapFileFunctionsRec readers[] = { +#ifdef PCFFORMAT { pcfReadFont, pcfReadFontInfo} , { pcfReadFont, pcfReadFontInfo} , #ifdef X_GZIP_FONT_COMPRESSION { pcfReadFont, pcfReadFontInfo} , #endif - { snfReadFont, snfReadFontInfo} , - { snfReadFont, snfReadFontInfo} , +#endif +#ifdef SNFFORMAT + { snfReadFont, snfReadFontInfo}, + { snfReadFont, snfReadFontInfo}, #ifdef X_GZIP_FONT_COMPRESSION { snfReadFont, snfReadFontInfo} , #endif +#endif +#ifdef BDFFORMAT { bdfReadFont, bdfReadFontInfo} , { bdfReadFont, bdfReadFontInfo} , #ifdef X_GZIP_FONT_COMPRESSION { bdfReadFont, bdfReadFontInfo} , #endif +#endif +#ifdef PCFFORMAT { pmfReadFont, pcfReadFontInfo} , +#endif }; #define CAPABILITIES (CAP_MATRIX | CAP_CHARSUBSETTING) static FontRendererRec renderers[] = { +#ifdef PCFFORMAT { ".pcf", 4, BitmapOpenBitmap, BitmapOpenScalable, BitmapGetInfoBitmap, BitmapGetInfoScalable, 0, CAPABILITIES }, @@ -81,10 +92,13 @@ static FontRendererRec renderers[] = { BitmapGetInfoBitmap, BitmapGetInfoScalable, 0, CAPABILITIES }, #ifdef X_GZIP_FONT_COMPRESSION - { ".pcf.gz", 7, BitmapOpenBitmap, BitmapOpenScalable, + { ".pcf.gz", 7, + BitmapOpenBitmap, BitmapOpenScalable, BitmapGetInfoBitmap, BitmapGetInfoScalable, 0, CAPABILITIES }, #endif +#endif +#ifdef SNFFORMAT { ".snf", 4, BitmapOpenBitmap, BitmapOpenScalable, BitmapGetInfoBitmap, BitmapGetInfoScalable, 0, CAPABILITIES }, @@ -96,6 +110,8 @@ static FontRendererRec renderers[] = { BitmapGetInfoBitmap, BitmapGetInfoScalable, 0, CAPABILITIES }, #endif +#endif +#ifdef BDFFORMAT { ".bdf", 4, BitmapOpenBitmap, BitmapOpenScalable, BitmapGetInfoBitmap, BitmapGetInfoScalable, 0, CAPABILITIES }, @@ -107,21 +123,19 @@ static FontRendererRec renderers[] = { BitmapGetInfoBitmap, BitmapGetInfoScalable, 0, CAPABILITIES }, #endif +#endif +#ifdef PCFFORMAT { ".pmf", 4, BitmapOpenBitmap, BitmapOpenScalable, BitmapGetInfoBitmap, BitmapGetInfoScalable, 0, CAPABILITIES } +#endif }; -int BitmapOpenBitmap (fpe, ppFont, flags, entry, fileName, format, fmask, - non_cachable_font) - FontPathElementPtr fpe; - FontPtr *ppFont; - int flags; - FontEntryPtr entry; - char *fileName; - fsBitmapFormat format; - fsBitmapFormatMask fmask; - FontPtr non_cachable_font; /* We don't do licensing */ +int +BitmapOpenBitmap (FontPathElementPtr fpe, FontPtr *ppFont, int flags, + FontEntryPtr entry, char *fileName, + fsBitmapFormat format, fsBitmapFormatMask fmask, + FontPtr non_cachable_font) /* We don't do licensing */ { FontFilePtr file; FontPtr pFont; @@ -137,13 +151,12 @@ int BitmapOpenBitmap (fpe, ppFont, flags, entry, fileName, format, fmask, file = FontFileOpen (fileName); if (!file) return BadFontName; - pFont = (FontPtr) xalloc(sizeof(FontRec)); - if (!pFont) { - fprintf(stderr, "Error: Couldn't allocate pFont (%d)\n", sizeof(FontRec)); + if (!(pFont = CreateFontRec())) { + fprintf(stderr, "Error: Couldn't allocate pFont (%ld)\n", + (unsigned long)sizeof(FontRec)); FontFileClose (file); return AllocError; } - bzero((char *)pFont, sizeof(FontRec)); /* set up default values */ FontDefaultFormat(&bit, &byte, &glyph, &scan); /* get any changes made from above */ @@ -151,24 +164,21 @@ int BitmapOpenBitmap (fpe, ppFont, flags, entry, fileName, format, fmask, /* Fill in font record. Data format filled in by reader. */ pFont->refcnt = 0; - pFont->maxPrivate = -1; - pFont->devPrivates = (pointer *) 0; ret = (*readers[i].ReadFont) (pFont, file, bit, byte, glyph, scan); FontFileClose (file); - if (ret != Successful) + if (ret != Successful) { xfree(pFont); - else + } else { *ppFont = pFont; + } return ret; } -int BitmapGetInfoBitmap (fpe, pFontInfo, entry, fileName) - FontPathElementPtr fpe; - FontInfoPtr pFontInfo; - FontEntryPtr entry; - char *fileName; +int +BitmapGetInfoBitmap (FontPathElementPtr fpe, FontInfoPtr pFontInfo, + FontEntryPtr entry, char *fileName) { FontFilePtr file; int i; @@ -189,7 +199,8 @@ int BitmapGetInfoBitmap (fpe, pFontInfo, entry, fileName) #define numRenderers (sizeof renderers / sizeof renderers[0]) -void BitmapRegisterFontFileFunctions () +void +BitmapRegisterFontFileFunctions (void) { int i; @@ -202,8 +213,8 @@ void BitmapRegisterFontFileFunctions () * the font info reader, and the bitmap scaling routine. All users * of this routine must be kept in step with the renderer array. */ -int BitmapGetRenderIndex(renderer) - FontRendererPtr renderer; +int +BitmapGetRenderIndex(FontRendererPtr renderer) { return renderer - renderers; } diff --git a/src/bitmap/bitmaputil.c b/src/bitmap/bitmaputil.c index 337ae13..d061fcd 100644 --- a/src/bitmap/bitmaputil.c +++ b/src/bitmap/bitmaputil.c @@ -27,9 +27,11 @@ other dealings in this Software without prior written authorization from The Open Group. */ +/* $XFree86: xc/lib/font/bitmap/bitmaputil.c,v 1.11 2003/02/19 01:22:34 dawes Exp $ */ #include "fntfilst.h" #include "bitmap.h" +#include "bdfint.h" #ifndef MAXSHORT #define MAXSHORT 32767 @@ -51,8 +53,8 @@ MINSHORT, MINSHORT, MINSHORT, MINSHORT, MINSHORT, 0x0000}; maxbounds->field = (ci)->field; #define COMPUTE_MINMAX(ci) \ - if ((ci)->ascent != -(ci)->descent || \ - (ci)->leftSideBearing != (ci)->rightSideBearing || \ + if ((ci)->ascent || (ci)->descent || \ + (ci)->leftSideBearing || (ci)->rightSideBearing || \ (ci)->characterWidth) \ { \ MINMAX(ascent, (ci)); \ @@ -63,15 +65,13 @@ MINSHORT, MINSHORT, MINSHORT, MINSHORT, MINSHORT, 0x0000}; } void -bitmapComputeFontBounds(pFont) - FontPtr pFont; +bitmapComputeFontBounds(FontPtr pFont) { BitmapFontPtr bitmapFont = (BitmapFontPtr) pFont->fontPrivate; int nchars; int r, c; - CharInfoPtr ci, - *pci; + CharInfoPtr ci; int maxOverlap; int overlap; xCharInfo *minbounds, @@ -112,11 +112,11 @@ bitmapComputeFontBounds(pFont) maxbounds = &pFont->info.maxbounds; *minbounds = initMinMetrics; *maxbounds = initMaxMetrics; - pci = bitmapFont->encoding; + i = 0; maxOverlap = MINSHORT; for (r = pFont->info.firstRow; r <= pFont->info.lastRow; r++) { for (c = pFont->info.firstCol; c <= pFont->info.lastCol; c++) { - ci = *pci++; + ci = ACCESSENCODING(bitmapFont->encoding, i); if (ci) { COMPUTE_MINMAX(&ci->metrics); if (ci->metrics.characterWidth < 0) @@ -130,6 +130,7 @@ bitmapComputeFontBounds(pFont) if (maxOverlap < overlap) maxOverlap = overlap; } + i++; } } } @@ -141,15 +142,13 @@ bitmapComputeFontBounds(pFont) } void -bitmapComputeFontInkBounds(pFont) - FontPtr pFont; +bitmapComputeFontInkBounds(FontPtr pFont) { BitmapFontPtr bitmapFont = (BitmapFontPtr) pFont->fontPrivate; int nchars; int r, c; - CharInfoPtr *pci, - cit; + CharInfoPtr cit; xCharInfo *ci; int offset; xCharInfo *minbounds, @@ -184,10 +183,10 @@ bitmapComputeFontInkBounds(pFont) maxbounds = &pFont->info.ink_maxbounds; *minbounds = initMinMetrics; *maxbounds = initMaxMetrics; - pci = bitmapFont->encoding; + i=0; for (r = pFont->info.firstRow; r <= pFont->info.lastRow; r++) { for (c = pFont->info.firstCol; c <= pFont->info.lastCol; c++) { - cit = *pci++; + cit = ACCESSENCODING(bitmapFont->encoding, i); if (cit) { offset = cit - bitmapFont->metrics; ci = &bitmapFont->ink_metrics[offset]; @@ -195,6 +194,7 @@ bitmapComputeFontInkBounds(pFont) minbounds->attributes &= ci->attributes; maxbounds->attributes |= ci->attributes; } + i++; } } } @@ -202,8 +202,7 @@ bitmapComputeFontInkBounds(pFont) } Bool -bitmapAddInkMetrics(pFont) - FontPtr pFont; +bitmapAddInkMetrics(FontPtr pFont) { BitmapFontPtr bitmapFont; int i; @@ -211,7 +210,8 @@ bitmapAddInkMetrics(pFont) bitmapFont = (BitmapFontPtr) pFont->fontPrivate; bitmapFont->ink_metrics = (xCharInfo *) xalloc(bitmapFont->num_chars * sizeof(xCharInfo)); if (!bitmapFont->ink_metrics) { - fprintf(stderr, "Error: Couldn't allocate ink_metrics (%d*%d)\n", bitmapFont->num_chars, sizeof(xCharInfo)); + fprintf(stderr, "Error: Couldn't allocate ink_metrics (%d*%ld)\n", + bitmapFont->num_chars, (unsigned long)sizeof(xCharInfo)); return FALSE; } for (i = 0; i < bitmapFont->num_chars; i++) @@ -222,8 +222,7 @@ bitmapAddInkMetrics(pFont) /* ARGSUSED */ int -bitmapComputeWeight(pFont) - FontPtr pFont; +bitmapComputeWeight(FontPtr pFont) { return 10; } diff --git a/src/bitmap/bitscale.c b/src/bitmap/bitscale.c index 5f8ef80..287bd5c 100644 --- a/src/bitmap/bitscale.c +++ b/src/bitmap/bitscale.c @@ -1,5 +1,4 @@ /* $Xorg: bitscale.c,v 1.5 2001/02/09 02:04:02 xorgcvs Exp $ */ - /* Copyright 1991, 1994, 1998 The Open Group @@ -27,6 +26,7 @@ other dealings in this Software without prior written authorization from The Open Group. */ +/* $XFree86: xc/lib/font/bitmap/bitscale.c,v 3.29 2003/01/12 03:55:46 tsi Exp $ */ /* * Author: Keith Packard, MIT X Consortium @@ -34,6 +34,8 @@ from The Open Group. #include "fntfilst.h" #include "bitmap.h" +#include "fontutil.h" +#ifndef FONTMODULE #ifdef _XOPEN_SOURCE #include <math.h> #else @@ -41,14 +43,25 @@ from The Open Group. #include <math.h> #undef _XOPEN_SOURCE #endif +#endif #ifndef MAX #define MAX(a,b) (((a)>(b)) ? a : b) #endif -extern Atom MakeAtom(); +/* Should get this from elsewhere */ +extern unsigned long serverGeneration; -void bitmapUnloadScalable(); +static void bitmapUnloadScalable (FontPtr pFont); +static void ScaleBitmap ( FontPtr pFont, CharInfoPtr opci, + CharInfoPtr pci, double *inv_xform, + double widthMult, double heightMult ); +static FontPtr BitmapScaleBitmaps(FontPtr pf, FontPtr opf, + double widthMult, double heightMult, + FontScalablePtr vals); +static FontPtr PrinterScaleBitmaps(FontPtr pf, FontPtr opf, + double widthMult, double heightMult, + FontScalablePtr vals); enum scaleType { atom, truncate_atom, pixel_size, point_size, resolution_x, @@ -63,38 +76,84 @@ typedef struct _fontProp { enum scaleType type; } fontProp; -static FontPtr BitmapScaleBitmaps(); -static FontPtr PrinterScaleBitmaps(); +typedef FontPtr (*ScaleFunc) ( FontPtr /* pf */, + FontPtr /* opf */, + double /* widthMult */, + double /* heightMult */, + FontScalablePtr /* vals */); -typedef FontPtr (*ScaleFunc) (); /* These next two arrays must be kept in step with the renderer array */ ScaleFunc scale[] = { +#ifdef PCFFORMAT + BitmapScaleBitmaps, + BitmapScaleBitmaps, +#ifdef X_GZIP_FONT_COMPRESSION BitmapScaleBitmaps, +#endif +#endif +#ifdef SNFFORMAT BitmapScaleBitmaps, BitmapScaleBitmaps, +#ifdef X_GZIP_FONT_COMPRESSION + BitmapScaleBitmaps, +#endif +#endif +#ifdef BDFFORMAT BitmapScaleBitmaps, BitmapScaleBitmaps, +#ifdef X_GZIP_FONT_COMPRESSION BitmapScaleBitmaps, +#endif +#endif +#ifdef PCFFORMAT PrinterScaleBitmaps, +#endif }; - -static FontEntryPtr FindBestToScale(); -static FontEntryPtr FindPmfToScale(); - -typedef FontEntryPtr (*FindToScale) (); + +static FontEntryPtr FindBestToScale ( FontPathElementPtr fpe, + FontEntryPtr entry, + FontScalablePtr vals, + FontScalablePtr best, + double *dxp, double *dyp, + double *sdxp, double *sdyp, + FontPathElementPtr *fpep ); +static FontEntryPtr FindPmfToScale ( FontPathElementPtr fpe, + FontEntryPtr entry, + FontScalablePtr vals, + FontScalablePtr best, + double *dxp, double *dyp, + double *sdxp, double *sdyp, + FontPathElementPtr *fpep ); + +typedef FontEntryPtr (*FindToScale) (FontPathElementPtr fpe, + FontEntryPtr entry, + FontScalablePtr vals, + FontScalablePtr best, + double *dxp, double *dyp, + double *sdxp, double *sdyp, + FontPathElementPtr *fpep); FindToScale find_scale[] = { FindBestToScale, FindBestToScale, +#ifdef X_GZIP_FONT_COMPRESSION + FindBestToScale, +#endif + FindBestToScale, + FindBestToScale, +#ifdef X_GZIP_FONT_COMPRESSION FindBestToScale, +#endif FindBestToScale, FindBestToScale, +#ifdef X_GZIP_FONT_COMPRESSION FindBestToScale, +#endif FindPmfToScale, }; -static unsigned long fontGeneration = 0; /* initialization flag */ +static unsigned long bitscaleGeneration = 0; /* initialization flag */ static fontProp fontNamePropTable[] = { { "FOUNDRY", 0, atom }, @@ -194,7 +253,7 @@ static fontProp rawFontPropTable[] = { }; static void -initFontPropTable() +initFontPropTable(void) { int i; fontProp *t; @@ -212,39 +271,34 @@ initFontPropTable() t->atom = MakeAtom(t->name, (unsigned) strlen(t->name), TRUE); } +#if 0 static FontEntryPtr -GetScalableEntry (fpe, name) - FontPathElementPtr fpe; - FontNamePtr name; +GetScalableEntry (FontPathElementPtr fpe, FontNamePtr name) { FontDirectoryPtr dir; dir = (FontDirectoryPtr) fpe->private; return FontFileFindNameInDir (&dir->scalable, name); } +#endif static double -get_matrix_horizontal_component(matrix) - double *matrix; +get_matrix_horizontal_component(double *matrix) { return hypot(matrix[0], matrix[1]); } static double -get_matrix_vertical_component(matrix) - double *matrix; +get_matrix_vertical_component(double *matrix) { return hypot(matrix[2], matrix[3]); } static Bool -ComputeScaleFactors(from, to, dx, dy, sdx, sdy, rescale_x) - FontScalablePtr from, - to; - double *dx, *sdx, - *dy, *sdy, - *rescale_x; +ComputeScaleFactors(FontScalablePtr from, FontScalablePtr to, + double *dx, double *dy, double *sdx, double *sdy, + double *rescale_x) { double srcpixelset, destpixelset, srcpixel, destpixel; @@ -315,40 +369,37 @@ if (m >= 1.0) { \ else if (m == 2.0) \ score += (4 * s); \ else \ - score += (3 * s) / m; \ + score += (int)(((double)(3 * s)) / m); \ } else { \ - score += (2 * s) * m; \ + score += (int)(((double)(2 * s)) * m); \ } /* don't need to favor enlargement when looking for bitmap that can be used unscalable */ #define SCORE2(m,s) \ if (m >= 1.0) \ - score += (8 * s) / m; \ + score += (int)(((double)(8 * s)) / m); \ else \ - score += (8 * s) * m; + score += (int)(((double)(8 * s)) * m); static FontEntryPtr -FindBestToScale(fpe, entry, vals, best, dxp, dyp, sdxp, sdyp, fpep) - FontPathElementPtr fpe; - FontEntryPtr entry; - FontScalablePtr vals, - best; - double *dxp, *sdxp, - *dyp, *sdyp; - FontPathElementPtr *fpep; +FindBestToScale(FontPathElementPtr fpe, FontEntryPtr entry, + FontScalablePtr vals, FontScalablePtr best, + double *dxp, double *dyp, + double *sdxp, double *sdyp, + FontPathElementPtr *fpep) { FontScalableRec temp; int source, i; int best_score, best_unscaled_score, score; - double dx, sdx, dx_amount, - dy, sdy, dy_amount, - best_dx, best_sdx, best_dx_amount, - best_dy, best_sdy, best_dy_amount, - best_unscaled_sdx, best_unscaled_sdy, - rescale_x, best_rescale_x, - best_unscaled_rescale_x; + double dx = 0.0, sdx = 0.0, dx_amount = 0.0, + dy = 0.0, sdy = 0.0, dy_amount = 0.0, + best_dx = 0.0, best_sdx = 0.0, best_dx_amount = 0.0, + best_dy = 0.0, best_sdy = 0.0, best_dy_amount = 0.0, + best_unscaled_sdx = 0.0, best_unscaled_sdy = 0.0, + rescale_x = 0.0, best_rescale_x = 0.0, + best_unscaled_rescale_x = 0.0; FontEntryPtr zero; FontNameRec zeroName; char zeroChars[MAXFONTNAMELEN]; @@ -356,14 +407,15 @@ FindBestToScale(fpe, entry, vals, best, dxp, dyp, sdxp, sdyp, fpep) FontScaledPtr scaled; FontScalableExtraPtr extra; FontScaledPtr best_scaled, best_unscaled; - FontPathElementPtr best_fpe, best_unscaled_fpe; + FontPathElementPtr best_fpe = NULL, best_unscaled_fpe = NULL; FontEntryPtr bitmap = NULL; FontEntryPtr result; int aliascount = 20; - FontPathElementPtr bitmap_fpe; + FontPathElementPtr bitmap_fpe = NULL; FontNameRec xlfdName; /* find the best match */ + rescale_x = 1.0; best_scaled = 0; best_score = 0; best_unscaled = 0; @@ -542,14 +594,11 @@ FindBestToScale(fpe, entry, vals, best, dxp, dyp, sdxp, sdyp, fpep) } static FontEntryPtr -FindPmfToScale(fpe, entry, vals, best, dxp, dyp, sdxp, sdyp, fpep) - FontPathElementPtr fpe; - FontEntryPtr entry; - FontScalablePtr vals, - best; - double *dxp, *sdxp, - *dyp, *sdyp; - FontPathElementPtr *fpep; +FindPmfToScale(FontPathElementPtr fpe, FontEntryPtr entry, + FontScalablePtr vals, FontScalablePtr best, + double *dxp, double *dyp, + double *sdxp, double *sdyp, + FontPathElementPtr *fpep) { FontEntryPtr result = NULL; FontScaledPtr scaled; @@ -576,7 +625,7 @@ FindPmfToScale(fpe, entry, vals, best, dxp, dyp, sdxp, sdyp, fpep) the matrix appropriately */ vals->pixel_matrix[0] *= rescale_x; vals->pixel_matrix[1] *= rescale_x; - #ifdef NOTDEF +#ifdef NOTDEF /* This would force the pointsize and pixelsize fields in the FONT property to display as matrices to more accurately report the font being supplied. It might also break existing @@ -584,9 +633,9 @@ FindPmfToScale(fpe, entry, vals, best, dxp, dyp, sdxp, sdyp, fpep) vals->values_supplied = vals->values_supplied & ~(PIXELSIZE_MASK | POINTSIZE_MASK) | PIXELSIZE_ARRAY; - #else /* NOTDEF */ +#else /* NOTDEF */ vals->values_supplied = vals->values_supplied & ~POINTSIZE_MASK; - #endif /* NOTDEF */ +#endif /* NOTDEF */ /* Recompute and reround the FontScalablePtr values after rescaling for the new width. */ FontFileCompleteXLFD(vals, vals); @@ -597,27 +646,21 @@ FindPmfToScale(fpe, entry, vals, best, dxp, dyp, sdxp, sdyp, fpep) } static long -doround(x) -double x; +doround(double x) { return (x >= 0) ? (long)(x + .5) : (long)(x - .5); } static int -computeProps(pf, wasStringProp, npf, isStringProp, nprops, xfactor, yfactor, - sXfactor, sYfactor) - FontPropPtr pf; - char *wasStringProp; - FontPropPtr npf; - char *isStringProp; - unsigned int nprops; - double xfactor, sXfactor, - yfactor, sYfactor; +computeProps(FontPropPtr pf, char *wasStringProp, + FontPropPtr npf, char *isStringProp, + unsigned int nprops, double xfactor, double yfactor, + double sXfactor, double sYfactor) { int n; int count; fontProp *t; - double rawfactor; + double rawfactor = 0.0; for (count = 0; nprops > 0; nprops--, pf++, wasStringProp++) { n = sizeof(fontPropTable) / sizeof(fontProp); @@ -641,6 +684,8 @@ computeProps(pf, wasStringProp, npf, isStringProp, nprops, xfactor, yfactor, count++; *isStringProp++ = *wasStringProp; break; + default: + break; } if (t->type != unscaled) { @@ -660,44 +705,43 @@ computeProps(pf, wasStringProp, npf, isStringProp, nprops, xfactor, yfactor, static int -ComputeScaledProperties(sourceFontInfo, name, vals, dx, dy, sdx, sdy, - sWidth, pProps, pIsStringProp) - FontInfoPtr sourceFontInfo; /* the font to be scaled */ - char *name; /* name of resulting font */ - FontScalablePtr vals; - double dx, sdx, - dy, sdy; /* scale factors in x and y directions */ - long sWidth; /* 1000-pixel average width */ - FontPropPtr *pProps; /* returns properties; preallocated */ - char **pIsStringProp; /* return booleans; preallocated */ +ComputeScaledProperties(FontInfoPtr sourceFontInfo, /* the font to be scaled */ + char *name, /* name of resulting font */ + FontScalablePtr vals, + double dx, double dy, /* scale factors in x and y */ + double sdx, double sdy, /* directions */ + long sWidth, /* 1000-pixel average width */ + FontPropPtr *pProps, /* returns properties; + preallocated */ + char **pIsStringProp) /* return booleans; + preallocated */ { int n; - char *ptr1, - *ptr2; + char *ptr1 = NULL, *ptr2 = NULL; char *ptr3; FontPropPtr fp; fontProp *fpt; - extern int serverGeneration; char *isStringProp; int nProps; - if (fontGeneration != serverGeneration) { + if (bitscaleGeneration != serverGeneration) { initFontPropTable(); - fontGeneration = serverGeneration; + bitscaleGeneration = serverGeneration; } nProps = NPROPS + 1 + sizeof(fontPropTable) / sizeof(fontProp) + sizeof(rawFontPropTable) / sizeof(fontProp); fp = (FontPropPtr) xalloc(sizeof(FontPropRec) * nProps); *pProps = fp; if (!fp) { - fprintf(stderr, "Error: Couldn't allocate font properties (%d*%d)\n", sizeof(FontPropRec), nProps); + fprintf(stderr, "Error: Couldn't allocate font properties (%ld*%d)\n", + (unsigned long)sizeof(FontPropRec), nProps); return 1; } isStringProp = (char *) xalloc (nProps); *pIsStringProp = isStringProp; if (!isStringProp) { - fprintf(stderr, "Error: Couldn't allocate isStringProp (%d)\n", nProps); + fprintf(stderr, "Error: Couldn't allocate isStringProp (%d)\n", nProps); xfree (fp); return 1; } @@ -761,6 +805,8 @@ ComputeScaledProperties(sourceFontInfo, name, vals, dx, dy, sdx, sdy, case raw_average_width: fp->value = sWidth; break; + default: + break; } fp->name = fpt->atom; } @@ -771,13 +817,11 @@ ComputeScaledProperties(sourceFontInfo, name, vals, dx, dy, sdx, sdy, return n; } -static void ScaleBitmap(); static int -compute_xform_matrix(vals, dx, dy, xform, inv_xform, xmult, ymult) - FontScalablePtr vals; - double dx, dy, *inv_xform, *xmult, *ymult; - register double *xform; +compute_xform_matrix(FontScalablePtr vals, double dx, double dy, + double *xform, double *inv_xform, + double *xmult, double *ymult) { double det; double pixel = get_matrix_vertical_component(vals->pixel_matrix); @@ -835,19 +879,17 @@ compute_xform_matrix(vals, dx, dy, xform, inv_xform, xmult, ymult) * returns a pointer to the new scaled font, or NULL (due to AllocError). */ static FontPtr -ScaleFont(opf, widthMult, heightMult, sWidthMult, sHeightMult, vals, - newWidthMult, newHeightMult, sWidth) - FontPtr opf; /* originating font */ - double widthMult; /* glyphs width scale factor */ - double heightMult; /* glyphs height scale factor */ - double sWidthMult; /* scalable glyphs width scale factor */ - double sHeightMult; /* scalable glyphs height scale factor */ - FontScalablePtr vals; - double *newWidthMult; /* return: X component of glyphs width - scale factor */ - double *newHeightMult; /* return: Y component of glyphs height - scale factor */ - long *sWidth; /* return: average 1000-pixel width */ +ScaleFont(FontPtr opf, /* originating font */ + double widthMult, /* glyphs width scale factor */ + double heightMult, /* glyphs height scale factor */ + double sWidthMult, /* scalable glyphs width scale factor */ + double sHeightMult, /* scalable glyphs height scale factor */ + FontScalablePtr vals, + double *newWidthMult, /* return: X component of glyphs width + scale factor */ + double *newHeightMult, /* return: Y component of glyphs height + scale factor */ + long *sWidth) /* return: average 1000-pixel width */ { FontPtr pf; FontInfoPtr pfi, @@ -856,7 +898,7 @@ ScaleFont(opf, widthMult, heightMult, sWidthMult, sHeightMult, vals, obitmapFont; CharInfoPtr pci, opci; - int nchars; /* how many characters in the font */ + int nchars = 0; /* how many characters in the font */ int i; int glyph; int firstCol, lastCol, firstRow, lastRow; @@ -870,11 +912,6 @@ ScaleFont(opf, widthMult, heightMult, sWidthMult, sHeightMult, vals, (i)%(lastCol - firstCol + 1) + \ firstCol - opf->info.firstCol) - extern int bitmapGetBitmaps(); - extern int bitmapGetExtents(); - extern int bitmapGetGlyphs(); - extern int bitmapGetMetrics(); - *sWidth = 0; opfi = &opf->info; @@ -882,14 +919,12 @@ ScaleFont(opf, widthMult, heightMult, sWidthMult, sHeightMult, vals, obitmapFont = (BitmapFontPtr) opf->fontPrivate; bitmapFont = 0; - pf = (FontPtr) xalloc(sizeof(FontRec)); - if (!pf) { - fprintf(stderr, "Error: Couldn't allocate FontRec (%d)\n", sizeof(FontRec)); + if (!(pf = CreateFontRec())) { + fprintf(stderr, "Error: Couldn't allocate FontRec (%ld)\n", + (unsigned long)sizeof(FontRec)); goto bail; } pf->refcnt = 0; - pf->maxPrivate = -1; - pf->devPrivates = (pointer *) 0; pf->bit = opf->bit; pf->byte = opf->byte; pf->glyph = opf->glyph; @@ -953,7 +988,8 @@ ScaleFont(opf, widthMult, heightMult, sWidthMult, sHeightMult, vals, bitmapFont = (BitmapFontPtr) xalloc(sizeof(BitmapFontRec)); if (!bitmapFont) { - fprintf(stderr, "Error: Couldn't allocate bitmapFont (%d)\n", sizeof(BitmapFontRec)); + fprintf(stderr, "Error: Couldn't allocate bitmapFont (%ld)\n", + (unsigned long)sizeof(BitmapFontRec)); goto bail; } nchars = (lastRow - firstRow + 1) * (lastCol - firstCol + 1); @@ -973,12 +1009,16 @@ ScaleFont(opf, widthMult, heightMult, sWidthMult, sHeightMult, vals, bitmapFont->pDefault = 0; bitmapFont->metrics = (CharInfoPtr) xalloc(nchars * sizeof(CharInfoRec)); if (!bitmapFont->metrics) { - fprintf(stderr, "Error: Couldn't allocate metrics (%d*%d)\n", nchars, sizeof(CharInfoRec)); + fprintf(stderr, "Error: Couldn't allocate metrics (%d*%ld)\n", + nchars, (unsigned long)sizeof(CharInfoRec)); goto bail; } - bitmapFont->encoding = (CharInfoPtr *) xalloc(nchars * sizeof(CharInfoPtr)); + bitmapFont->encoding = + (CharInfoPtr **) xcalloc(NUM_SEGMENTS(nchars), + sizeof(CharInfoPtr*)); if (!bitmapFont->encoding) { - fprintf(stderr, "Error: Couldn't allocate encoding (%d*%d)\n", nchars, sizeof(CharInfoPtr)); + fprintf(stderr, "Error: Couldn't allocate encoding (%d*%ld)\n", + nchars, (unsigned long)sizeof(CharInfoPtr)); goto bail; } @@ -1020,7 +1060,8 @@ ScaleFont(opf, widthMult, heightMult, sWidthMult, sHeightMult, vals, pci = bitmapFont->metrics; for (i = 0; i < nchars; i++) { - if ((opci = obitmapFont->encoding[inkindex2 = OLDINDEX(i)])) + inkindex2 = OLDINDEX(i); + if ((opci = ACCESSENCODING(obitmapFont->encoding,OLDINDEX(i)))) { double newlsb, newrsb, newdesc, newasc, point[2]; @@ -1039,7 +1080,6 @@ ScaleFont(opf, widthMult, heightMult, sWidthMult, sHeightMult, vals, break; if (j == vals->nranges) { - bitmapFont->encoding[i] = 0; continue; } } @@ -1050,11 +1090,17 @@ ScaleFont(opf, widthMult, heightMult, sWidthMult, sHeightMult, vals, opci->metrics.descent == 0 && opci->metrics.characterWidth == 0) { - bitmapFont->encoding[i] = 0; continue; } - bitmapFont->encoding[i] = pci; + if(!bitmapFont->encoding[SEGMENT_MAJOR(i)]) { + bitmapFont->encoding[SEGMENT_MAJOR(i)]= + (CharInfoPtr*)xcalloc(BITMAP_FONT_SEGMENT_SIZE, + sizeof(CharInfoPtr)); + if(!bitmapFont->encoding[SEGMENT_MAJOR(i)]) + goto bail; + } + ACCESSENCODINGL(bitmapFont->encoding, i) = pci; /* Compute new extents for this glyph */ TRANSFORM_POINT(xform, @@ -1107,8 +1153,6 @@ ScaleFont(opf, widthMult, heightMult, sWidthMult, sHeightMult, vals, pci++; } - else - bitmapFont->encoding[i] = 0; } @@ -1120,10 +1164,9 @@ ScaleFont(opf, widthMult, heightMult, sWidthMult, sHeightMult, vals, pci = bitmapFont->metrics; for (i = 0; i < nchars; i++) { - if ((pci = bitmapFont->encoding[i]) && - (opci = obitmapFont->encoding[OLDINDEX(i)])) + if ((pci = ACCESSENCODING(bitmapFont->encoding,i)) && + (opci = ACCESSENCODING(obitmapFont->encoding,OLDINDEX(i)))) { - pci = bitmapFont->encoding[i]; totalchars++; *sWidth += abs((int)(INT16)pci->metrics.attributes); #define MINMAX(field) \ @@ -1185,7 +1228,8 @@ ScaleFont(opf, widthMult, heightMult, sWidthMult, sHeightMult, vals, cols = pfi->lastCol - pfi->firstCol + 1; r = r - pfi->firstRow; c = c - pfi->firstCol; - bitmapFont->pDefault = bitmapFont->encoding[r * cols + c]; + bitmapFont->pDefault = + ACCESSENCODING(bitmapFont->encoding, r * cols + c); } } @@ -1199,19 +1243,17 @@ bail: xfree(bitmapFont->metrics); xfree(bitmapFont->ink_metrics); xfree(bitmapFont->bitmaps); + if(bitmapFont->encoding) + for(i=0; i<NUM_SEGMENTS(nchars); i++) + xfree(bitmapFont->encoding[i]); xfree(bitmapFont->encoding); } return NULL; } static void -ScaleBitmap(pFont, opci, pci, inv_xform, widthMult, heightMult) - FontPtr pFont; - CharInfoPtr opci; - CharInfoPtr pci; - double *inv_xform; - double widthMult; - double heightMult; +ScaleBitmap(FontPtr pFont, CharInfoPtr opci, CharInfoPtr pci, + double *inv_xform, double widthMult, double heightMult) { register char *bitmap, /* The bits */ *newBitmap; @@ -1229,8 +1271,9 @@ ScaleBitmap(pFont, opci, pci, inv_xform, widthMult, heightMult) yValue; double point[2]; unsigned char *char_grayscale = 0; - INT32 *diffusion_workspace, *thisrow, *nextrow, pixmult; - int box_x, box_y; + INT32 *diffusion_workspace = NULL, *thisrow = NULL, + *nextrow = NULL, pixmult = 0; + int box_x = 0, box_y = 0; static unsigned char masklsb[] = { 0x1, 0x2, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80 }; @@ -1292,7 +1335,9 @@ ScaleBitmap(pFont, opci, pci, inv_xform, widthMult, heightMult) (INT32 *)xalloc((newWidth + 2) * 2 * sizeof(int)); if (!diffusion_workspace) { - fprintf(stderr, "Warning: Couldn't allocate diffusion workspace (%d)\n", (newWidth + 2) * 2 * sizeof(int)); + fprintf(stderr, "Warning: Couldn't allocate diffusion" + " workspace (%ld)\n", + (newWidth + 2) * 2 * (unsigned long)sizeof(int)); xfree(char_grayscale); char_grayscale = (unsigned char *)0; } @@ -1301,8 +1346,8 @@ ScaleBitmap(pFont, opci, pci, inv_xform, widthMult, heightMult) (newWidth + 3) * sizeof(int)); thisrow = diffusion_workspace + 1; nextrow = diffusion_workspace + newWidth + 3; - } else { - fprintf(stderr, "Warning: Couldn't allocate character grayscale (%d)\n", (width + 1) * (height + 1)); + } else { + fprintf(stderr, "Warning: Couldn't allocate character grayscale (%d)\n", (width + 1) * (height + 1)); } } } @@ -1554,15 +1599,14 @@ ScaleBitmap(pFont, opci, pci, inv_xform, widthMult, heightMult) } static FontPtr -BitmapScaleBitmaps(pf, opf, widthMult, heightMult, vals) - FontPtr pf; /* scaled font */ - FontPtr opf; /* originating font */ - double widthMult; /* glyphs width scale factor */ - double heightMult; /* glyphs height scale factor */ - FontScalablePtr vals; +BitmapScaleBitmaps(FontPtr pf, /* scaled font */ + FontPtr opf, /* originating font */ + double widthMult, /* glyphs width scale factor */ + double heightMult, /* glyphs height scale factor */ + FontScalablePtr vals) { register int i; - int nchars; + int nchars = 0; char *glyphBytes; BitmapFontPtr bitmapFont, obitmapFont; @@ -1593,7 +1637,7 @@ BitmapScaleBitmaps(pf, opf, widthMult, heightMult, vals) glyph = pf->glyph; for (i = 0; i < nchars; i++) { - if ((pci = bitmapFont->encoding[i])) + if ((pci = ACCESSENCODING(bitmapFont->encoding, i))) bytestoalloc += BYTES_FOR_GLYPH(pci, glyph); } @@ -1603,7 +1647,7 @@ BitmapScaleBitmaps(pf, opf, widthMult, heightMult, vals) bitmapFont->bitmaps = (char *) xalloc(bytestoalloc); if (!bitmapFont->bitmaps) { - fprintf(stderr, "Error: Couldn't allocate bitmaps (%d)\n", bytestoalloc); + fprintf(stderr, "Error: Couldn't allocate bitmaps (%d)\n", bytestoalloc); goto bail; } bzero(bitmapFont->bitmaps, bytestoalloc); @@ -1611,8 +1655,8 @@ BitmapScaleBitmaps(pf, opf, widthMult, heightMult, vals) glyphBytes = bitmapFont->bitmaps; for (i = 0; i < nchars; i++) { - if ((pci = bitmapFont->encoding[i]) && - (opci = obitmapFont->encoding[OLDINDEX(i)])) + if ((pci = ACCESSENCODING(bitmapFont->encoding, i)) && + (opci = ACCESSENCODING(obitmapFont->encoding, OLDINDEX(i)))) { pci->bits = glyphBytes; ScaleBitmap (pf, opci, pci, inv_xform, @@ -1629,21 +1673,23 @@ bail: xfree(bitmapFont->metrics); xfree(bitmapFont->ink_metrics); xfree(bitmapFont->bitmaps); + if(bitmapFont->encoding) + for(i=0; i<NUM_SEGMENTS(nchars); i++) + xfree(bitmapFont->encoding[i]); xfree(bitmapFont->encoding); } return NULL; } static FontPtr -PrinterScaleBitmaps(pf, opf, widthMult, heightMult, vals) - FontPtr pf; /* scaled font */ - FontPtr opf; /* originating font */ - double widthMult; /* glyphs width scale factor */ - double heightMult; /* glyphs height scale factor */ - FontScalablePtr vals; +PrinterScaleBitmaps(FontPtr pf, /* scaled font */ + FontPtr opf, /* originating font */ + double widthMult, /* glyphs width scale factor */ + double heightMult, /* glyphs height scale factor */ + FontScalablePtr vals) { register int i; - int nchars; + int nchars = 0; char *glyphBytes; BitmapFontPtr bitmapFont, obitmapFont; @@ -1674,7 +1720,7 @@ PrinterScaleBitmaps(pf, opf, widthMult, heightMult, vals) glyph = pf->glyph; for (i = 0; i < nchars; i++) { - if ((pci = bitmapFont->encoding[i])) + if ((pci = ACCESSENCODING(bitmapFont->encoding, i))) bytestoalloc = MAX(bytestoalloc,BYTES_FOR_GLYPH(pci, glyph)); } @@ -1684,7 +1730,7 @@ PrinterScaleBitmaps(pf, opf, widthMult, heightMult, vals) bitmapFont->bitmaps = (char *) xalloc(bytestoalloc); if (!bitmapFont->bitmaps) { - fprintf(stderr, "Error: Couldn't allocate bitmaps (%d)\n", bytestoalloc); + fprintf(stderr, "Error: Couldn't allocate bitmaps (%d)\n", bytestoalloc); goto bail; } bzero(bitmapFont->bitmaps, bytestoalloc); @@ -1692,8 +1738,8 @@ PrinterScaleBitmaps(pf, opf, widthMult, heightMult, vals) glyphBytes = bitmapFont->bitmaps; for (i = 0; i < nchars; i++) { - if ((pci = bitmapFont->encoding[i]) && - (opci = obitmapFont->encoding[OLDINDEX(i)])) + if ((pci = ACCESSENCODING(bitmapFont->encoding, i)) && + (opci = ACCESSENCODING(obitmapFont->encoding, OLDINDEX(i)))) { pci->bits = glyphBytes; } @@ -1707,6 +1753,9 @@ bail: xfree(bitmapFont->metrics); xfree(bitmapFont->ink_metrics); xfree(bitmapFont->bitmaps); + if(bitmapFont->encoding) + for(i=0; i<NUM_SEGMENTS(nchars); i++) + xfree(bitmapFont->encoding[i]); xfree(bitmapFont->encoding); } return NULL; @@ -1717,13 +1766,8 @@ bail: * exported interfaces */ -FontFileLoadName(dirs, ndirs, name, pfont, format, fmask) - FontFileDirPtr *dirs; - int ndirs; - char *name; - FontPtr *pfont; - fsBitmapFormat format; - fsBitmapFormatMask fmask; +FontFileLoadName(FontFileDirPtr *dirs, int ndirs, char *name, FontPtr *pfont, + fsBitmapFormat format, fsBitmapFormatMask fmask) { FontFileNamePtr fname; char full_name[1024]; @@ -1758,17 +1802,15 @@ FontFileLoadName(dirs, ndirs, name, pfont, format, fmask) /* ARGSUSED */ int -BitmapOpenScalable (fpe, pFont, flags, entry, fileName, vals, format, fmask, - non_cachable_font) - FontPathElementPtr fpe; - FontPtr *pFont; - int flags; - FontEntryPtr entry; - char *fileName; /* unused */ - FontScalablePtr vals; - fsBitmapFormat format; - fsBitmapFormatMask fmask; - FontPtr non_cachable_font; /* We don't do licensing */ +BitmapOpenScalable (FontPathElementPtr fpe, + FontPtr *pFont, + int flags, + FontEntryPtr entry, + char *fileName, /* unused */ + FontScalablePtr vals, + fsBitmapFormat format, + fsBitmapFormatMask fmask, + FontPtr non_cachable_font) /* We don't do licensing */ { FontScalableRec best; FontPtr font = NullFont; @@ -1861,13 +1903,12 @@ BitmapOpenScalable (fpe, pFont, flags, entry, fileName, vals, format, fmask, } int -BitmapGetInfoScalable (fpe, pFontInfo, entry, fontName, fileName, vals) - FontPathElementPtr fpe; - FontInfoPtr pFontInfo; - FontEntryPtr entry; - FontNamePtr fontName; - char *fileName; - FontScalablePtr vals; +BitmapGetInfoScalable (FontPathElementPtr fpe, + FontInfoPtr pFontInfo, + FontEntryPtr entry, + FontNamePtr fontName, + char *fileName, + FontScalablePtr vals) { FontPtr pfont; int flags = 0; @@ -1881,6 +1922,7 @@ BitmapGetInfoScalable (fpe, pFontInfo, entry, fontName, fileName, vals) return ret; *pFontInfo = pfont->info; + pfont->info.nprops = 0; pfont->info.props = NULL; pfont->info.isStringProp = NULL; @@ -1888,22 +1930,27 @@ BitmapGetInfoScalable (fpe, pFontInfo, entry, fontName, fileName, vals) return Successful; } -void -bitmapUnloadScalable (pFont) - FontPtr pFont; +static void +bitmapUnloadScalable (FontPtr pFont) { BitmapFontPtr bitmapFont; FontInfoPtr pfi; + int i, nencoding; bitmapFont = (BitmapFontPtr) pFont->fontPrivate; pfi = &pFont->info; xfree (pfi->props); xfree (pfi->isStringProp); + if(bitmapFont->encoding) { + nencoding = (pFont->info.lastCol - pFont->info.firstCol + 1) * + (pFont->info.lastRow - pFont->info.firstRow + 1); + for(i=0; i<NUM_SEGMENTS(nencoding); i++) + xfree(bitmapFont->encoding[i]); + } xfree (bitmapFont->encoding); xfree (bitmapFont->bitmaps); xfree (bitmapFont->ink_metrics); xfree (bitmapFont->metrics); xfree (pFont->fontPrivate); - xfree (pFont->devPrivates); - xfree (pFont); + DestroyFontRec (pFont); } diff --git a/src/bitmap/fontink.c b/src/bitmap/fontink.c index fc9bc9a..45226c5 100644 --- a/src/bitmap/fontink.c +++ b/src/bitmap/fontink.c @@ -27,12 +27,15 @@ other dealings in this Software without prior written authorization from The Open Group. */ +/* $XFree86: xc/lib/font/bitmap/fontink.c,v 1.7 2001/12/14 19:56:46 dawes Exp $ */ /* * Author: Keith Packard, MIT X Consortium */ #include "fntfilst.h" +#include "bitmap.h" +#include "bdfint.h" static unsigned char ink_mask_msb[8] = { 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01, @@ -43,23 +46,20 @@ static unsigned char ink_mask_lsb[8] = { }; void -FontCharInkMetrics(pFont, pCI, pInk) - FontPtr pFont; - CharInfoPtr pCI; - xCharInfo *pInk; +FontCharInkMetrics(FontPtr pFont, CharInfoPtr pCI, xCharInfo *pInk) { int leftBearing, ascent, descent; register int vpos, hpos, - bpos; + bpos = 0; int bitmapByteWidth, bitmapByteWidthPadded; int bitmapBitWidth; int span; register unsigned char *p; - unsigned char *ink_mask; + unsigned char *ink_mask = 0; register int bmax; register unsigned char charbits; @@ -157,10 +157,7 @@ found_right: #define Max(a,b) ((a)>(b)?(a):(b)) void -FontCharReshape(pFont, pSrc, pDst) - FontPtr pFont; - CharInfoPtr pSrc, - pDst; +FontCharReshape(FontPtr pFont, CharInfoPtr pSrc, CharInfoPtr pDst) { int x, y; diff --git a/src/bitmap/pcfread.c b/src/bitmap/pcfread.c index 7125b1a..1e07b09 100644 --- a/src/bitmap/pcfread.c +++ b/src/bitmap/pcfread.c @@ -1,5 +1,4 @@ /* $Xorg: pcfread.c,v 1.5 2001/02/09 02:04:02 xorgcvs Exp $ */ - /* Copyright 1990, 1998 The Open Group @@ -27,6 +26,7 @@ other dealings in this Software without prior written authorization from The Open Group. */ +/* $XFree86: xc/lib/font/bitmap/pcfread.c,v 1.20 2003/01/12 03:55:46 tsi Exp $ */ /* * Author: Keith Packard, MIT X Consortium @@ -35,6 +35,7 @@ from The Open Group. #include "fntfilst.h" #include "bitmap.h" #include "pcf.h" + #ifndef MAX #define MAX(a,b) (((a)>(b)) ? a : b) #endif @@ -57,24 +58,28 @@ pcfError (message, va_alist) va_list args; #if NeedVarargsPrototypes - va_start (args, message); + va_start(args, message); #else - va_start (args); + va_start(args); #endif fprintf(stderr, "PCF Error: "); vfprintf(stderr, message, args); - va_end (args); + va_end(args); } - + /* Read PCF font files */ -void pcfUnloadFont(); +static void pcfUnloadFont ( FontPtr pFont ); static int position; + +#define IS_EOF(file) ((file)->eof == BUFFILEEOF) + +#define FONT_FILE_GETC_ERR(f) (tmp = FontFileGetc(f), BAIL_ON_EOF) + static int -pcfGetLSB32(file) - FontFilePtr file; +pcfGetLSB32(FontFilePtr file) { int c; @@ -87,9 +92,7 @@ pcfGetLSB32(file) } static int -pcfGetINT32(file, format) - FontFilePtr file; - CARD32 format; +pcfGetINT32(FontFilePtr file, CARD32 format) { int c; @@ -109,9 +112,7 @@ pcfGetINT32(file, format) } static int -pcfGetINT16(file, format) - FontFilePtr file; - CARD32 format; +pcfGetINT16(FontFilePtr file, CARD32 format) { int c; @@ -129,9 +130,7 @@ pcfGetINT16(file, format) #define pcfGetINT8(file, format) (position++, FontFileGetc(file)) static PCFTablePtr -pcfReadTOC(file, countp) - FontFilePtr file; - int *countp; +pcfReadTOC(FontFilePtr file, int *countp) { CARD32 version; PCFTablePtr tables; @@ -143,9 +142,10 @@ pcfReadTOC(file, countp) if (version != PCF_FILE_VERSION) return (PCFTablePtr) NULL; count = pcfGetLSB32(file); + if (IS_EOF(file)) return (PCFTablePtr) NULL; tables = (PCFTablePtr) xalloc(count * sizeof(PCFTableRec)); if (!tables) { - pcfError("pcfReadTOC(): Couldn't allocate tables (%d*%d)\n", count, sizeof(PCFTableRec)); + pcfError("pcfReadTOC(): Couldn't allocate tables (%d*%d)\n", count, sizeof(PCFTableRec)); return (PCFTablePtr) NULL; } for (i = 0; i < count; i++) { @@ -153,9 +153,15 @@ pcfReadTOC(file, countp) tables[i].format = pcfGetLSB32(file); tables[i].size = pcfGetLSB32(file); tables[i].offset = pcfGetLSB32(file); + if (IS_EOF(file)) goto Bail; } + *countp = count; return tables; + + Bail: + xfree(tables); + return (PCFTablePtr) NULL; } /* @@ -165,11 +171,8 @@ pcfReadTOC(file, countp) * metrics */ -static void -pcfGetMetric(file, format, metric) - FontFilePtr file; - CARD32 format; - xCharInfo *metric; +static Bool +pcfGetMetric(FontFilePtr file, CARD32 format, xCharInfo *metric) { metric->leftSideBearing = pcfGetINT16(file, format); metric->rightSideBearing = pcfGetINT16(file, format); @@ -177,13 +180,13 @@ pcfGetMetric(file, format, metric) metric->ascent = pcfGetINT16(file, format); metric->descent = pcfGetINT16(file, format); metric->attributes = pcfGetINT16(file, format); + if (IS_EOF(file)) return FALSE; + + return TRUE; } -static void -pcfGetCompressedMetric(file, format, metric) - FontFilePtr file; - CARD32 format; - xCharInfo *metric; +static Bool +pcfGetCompressedMetric(FontFilePtr file, CARD32 format, xCharInfo *metric) { metric->leftSideBearing = pcfGetINT8(file, format) - 0x80; metric->rightSideBearing = pcfGetINT8(file, format) - 0x80; @@ -191,6 +194,9 @@ pcfGetCompressedMetric(file, format, metric) metric->ascent = pcfGetINT8(file, format) - 0x80; metric->descent = pcfGetINT8(file, format) - 0x80; metric->attributes = 0; + if (IS_EOF(file)) return FALSE; + + return TRUE; } /* @@ -198,13 +204,8 @@ pcfGetCompressedMetric(file, format, metric) * in the font file */ static Bool -pcfSeekToType(file, tables, ntables, type, formatp, sizep) - FontFilePtr file; - PCFTablePtr tables; - int ntables; - CARD32 type; - CARD32 *formatp; - CARD32 *sizep; +pcfSeekToType(FontFilePtr file, PCFTablePtr tables, int ntables, + CARD32 type, CARD32 *formatp, CARD32 *sizep) { int i; @@ -223,10 +224,7 @@ pcfSeekToType(file, tables, ntables, type, formatp, sizep) } static Bool -pcfHasType (tables, ntables, type) - PCFTablePtr tables; - int ntables; - CARD32 type; +pcfHasType (PCFTablePtr tables, int ntables, CARD32 type) { int i; @@ -244,18 +242,15 @@ pcfHasType (tables, ntables, type) */ static Bool -pcfGetProperties(pFontInfo, file, tables, ntables) - FontInfoPtr pFontInfo; - FontFilePtr file; - PCFTablePtr tables; - int ntables; +pcfGetProperties(FontInfoPtr pFontInfo, FontFilePtr file, + PCFTablePtr tables, int ntables) { FontPropPtr props = 0; int nprops; char *isStringProp = 0; CARD32 format; int i; - int size; + CARD32 size; int string_size; char *strings; @@ -267,20 +262,22 @@ pcfGetProperties(pFontInfo, file, tables, ntables) if (!PCF_FORMAT_MATCH(format, PCF_DEFAULT_FORMAT)) goto Bail; nprops = pcfGetINT32(file, format); + if (IS_EOF(file)) goto Bail; props = (FontPropPtr) xalloc(nprops * sizeof(FontPropRec)); if (!props) { - pcfError("pcfGetProperties(): Couldn't allocate props (%d*%d)\n", nprops, sizeof(FontPropRec)); + pcfError("pcfGetProperties(): Couldn't allocate props (%d*%d)\n", nprops, sizeof(FontPropRec)); goto Bail; } isStringProp = (char *) xalloc(nprops * sizeof(char)); if (!isStringProp) { - pcfError("pcfGetProperties(): Couldn't allocate isStringProp (%d*%d)\n", nprops, sizeof(char)); + pcfError("pcfGetProperties(): Couldn't allocate isStringProp (%d*%d)\n", nprops, sizeof(char)); goto Bail; } for (i = 0; i < nprops; i++) { props[i].name = pcfGetINT32(file, format); isStringProp[i] = pcfGetINT8(file, format); props[i].value = pcfGetINT32(file, format); + if (IS_EOF(file)) goto Bail; } /* pad the property array */ /* @@ -290,16 +287,19 @@ pcfGetProperties(pFontInfo, file, tables, ntables) if (nprops & 3) { i = 4 - (nprops & 3); - FontFileSkip(file, i); + (void)FontFileSkip(file, i); position += i; } + if (IS_EOF(file)) goto Bail; string_size = pcfGetINT32(file, format); + if (IS_EOF(file)) goto Bail; strings = (char *) xalloc(string_size); if (!strings) { - pcfError("pcfGetProperties(): Couldn't allocate strings (%d)\n", string_size); + pcfError("pcfGetProperties(): Couldn't allocate strings (%d)\n", string_size); goto Bail; } FontFileRead(file, strings, string_size); + if (IS_EOF(file)) goto Bail; position += string_size; for (i = 0; i < nprops; i++) { props[i].name = MakeAtom(strings + props[i].name, @@ -329,17 +329,14 @@ Bail: */ static Bool -pcfGetAccel(pFontInfo, file, tables, ntables, type) - FontInfoPtr pFontInfo; - FontFilePtr file; - PCFTablePtr tables; - int ntables; - CARD32 type; +pcfGetAccel(FontInfoPtr pFontInfo, FontFilePtr file, + PCFTablePtr tables, int ntables, CARD32 type) { CARD32 format; - int size; + CARD32 size; - if (!pcfSeekToType(file, tables, ntables, type, &format, &size)) + if (!pcfSeekToType(file, tables, ntables, type, &format, &size) || + IS_EOF(file)) goto Bail; format = pcfGetLSB32(file); if (!PCF_FORMAT_MATCH(format, PCF_DEFAULT_FORMAT) && @@ -360,11 +357,16 @@ pcfGetAccel(pFontInfo, file, tables, ntables, type) pFontInfo->fontAscent = pcfGetINT32(file, format); pFontInfo->fontDescent = pcfGetINT32(file, format); pFontInfo->maxOverlap = pcfGetINT32(file, format); - pcfGetMetric(file, format, &pFontInfo->minbounds); - pcfGetMetric(file, format, &pFontInfo->maxbounds); + if (IS_EOF(file)) goto Bail; + if (!pcfGetMetric(file, format, &pFontInfo->minbounds)) + goto Bail; + if (!pcfGetMetric(file, format, &pFontInfo->maxbounds)) + goto Bail; if (PCF_FORMAT_MATCH(format, PCF_ACCEL_W_INKBOUNDS)) { - pcfGetMetric(file, format, &pFontInfo->ink_minbounds); - pcfGetMetric(file, format, &pFontInfo->ink_maxbounds); + if (!pcfGetMetric(file, format, &pFontInfo->ink_minbounds)) + goto Bail; + if (!pcfGetMetric(file, format, &pFontInfo->ink_maxbounds)) + goto Bail; } else { pFontInfo->ink_minbounds = pFontInfo->minbounds; pFontInfo->ink_maxbounds = pFontInfo->maxbounds; @@ -375,13 +377,8 @@ Bail: } int -pcfReadFont(pFont, file, bit, byte, glyph, scan) - FontPtr pFont; - FontFilePtr file; - int bit, - byte, - glyph, - scan; +pcfReadFont(FontPtr pFont, FontFilePtr file, + int bit, int byte, int glyph, int scan) { CARD32 format; CARD32 size; @@ -396,13 +393,14 @@ pcfReadFont(pFont, file, bit, byte, glyph, scan) CharInfoPtr metrics = 0; xCharInfo *ink_metrics = 0; char *bitmaps = 0; - CharInfoPtr *encoding = 0; - int nencoding; + CharInfoPtr **encoding = 0; + int nencoding = 0; int encodingOffset; CARD32 bitmapSizes[GLYPHPADOPTIONS]; CARD32 *offsets = 0; Bool hasBDFAccelerators; + pFont->info.nprops = 0; pFont->info.props = 0; if (!(tables = pcfReadTOC(file, &ntables))) goto Bail; @@ -433,17 +431,21 @@ pcfReadFont(pFont, file, bit, byte, glyph, scan) nmetrics = pcfGetINT32(file, format); else nmetrics = pcfGetINT16(file, format); + if (IS_EOF(file)) goto Bail; metrics = (CharInfoPtr) xalloc(nmetrics * sizeof(CharInfoRec)); if (!metrics) { - pcfError("pcfReadFont(): Couldn't allocate metrics (%d*%d)\n", nmetrics, sizeof(CharInfoRec)); + pcfError("pcfReadFont(): Couldn't allocate metrics (%d*%d)\n", nmetrics, sizeof(CharInfoRec)); goto Bail; } for (i = 0; i < nmetrics; i++) - if (PCF_FORMAT_MATCH(format, PCF_DEFAULT_FORMAT)) - pcfGetMetric(file, format, &(metrics + i)->metrics); - else - pcfGetCompressedMetric(file, format, &(metrics + i)->metrics); - + if (PCF_FORMAT_MATCH(format, PCF_DEFAULT_FORMAT)) { + if (!pcfGetMetric(file, format, &(metrics + i)->metrics)) + goto Bail; + } else { + if (!pcfGetCompressedMetric(file, format, &(metrics + i)->metrics)) + goto Bail; + } + /* bitmaps */ if (!pcfSeekToType(file, tables, ntables, PCF_BITMAPS, &format, &size)) @@ -453,41 +455,46 @@ pcfReadFont(pFont, file, bit, byte, glyph, scan) goto Bail; nbitmaps = pcfGetINT32(file, format); - if (nbitmaps != nmetrics) + if (nbitmaps != nmetrics || IS_EOF(file)) goto Bail; offsets = (CARD32 *) xalloc(nbitmaps * sizeof(CARD32)); if (!offsets) { - pcfError("pcfReadFont(): Couldn't allocate offsets (%d*%d)\n", nbitmaps, sizeof(CARD32)); + pcfError("pcfReadFont(): Couldn't allocate offsets (%d*%d)\n", nbitmaps, sizeof(CARD32)); goto Bail; } - - for (i = 0; i < nbitmaps; i++) + for (i = 0; i < nbitmaps; i++) { offsets[i] = pcfGetINT32(file, format); + if (IS_EOF(file)) goto Bail; + } - for (i = 0; i < GLYPHPADOPTIONS; i++) + for (i = 0; i < GLYPHPADOPTIONS; i++) { bitmapSizes[i] = pcfGetINT32(file, format); + if (IS_EOF(file)) goto Bail; + } + sizebitmaps = bitmapSizes[PCF_GLYPH_PAD_INDEX(format)]; /* guard against completely empty font */ - bitmaps = (char *) xalloc(sizebitmaps ? sizebitmaps : 1); + bitmaps = xalloc(sizebitmaps ? sizebitmaps : 1); if (!bitmaps) { - pcfError("pcfReadFont(): Couldn't allocate bitmaps (%d)\n", sizebitmaps ? sizebitmaps : 1); + pcfError("pcfReadFont(): Couldn't allocate bitmaps (%d)\n", sizebitmaps ? sizebitmaps : 1); goto Bail; } FontFileRead(file, bitmaps, sizebitmaps); + if (IS_EOF(file)) goto Bail; position += sizebitmaps; if (PCF_BIT_ORDER(format) != bit) - BitOrderInvert(bitmaps, sizebitmaps); + BitOrderInvert((unsigned char *)bitmaps, sizebitmaps); if ((PCF_BYTE_ORDER(format) == PCF_BIT_ORDER(format)) != (bit == byte)) { switch (bit == byte ? PCF_SCAN_UNIT(format) : scan) { case 1: break; case 2: - TwoByteSwap(bitmaps, sizebitmaps); + TwoByteSwap((unsigned char *)bitmaps, sizebitmaps); break; case 4: - FourByteSwap(bitmaps, sizebitmaps); + FourByteSwap((unsigned char *)bitmaps, sizebitmaps); break; } } @@ -501,7 +508,7 @@ pcfReadFont(pFont, file, bit, byte, glyph, scan) sizepadbitmaps = bitmapSizes[PCF_SIZE_TO_INDEX(glyph)]; padbitmaps = (char *) xalloc(sizepadbitmaps); if (!padbitmaps) { - pcfError("pcfReadFont(): Couldn't allocate padbitmaps (%d)\n", sizepadbitmaps); + pcfError("pcfReadFont(): Couldn't allocate padbitmaps (%d)\n", sizepadbitmaps); goto Bail; } new = 0; @@ -536,18 +543,22 @@ pcfReadFont(pFont, file, bit, byte, glyph, scan) nink_metrics = pcfGetINT32(file, format); else nink_metrics = pcfGetINT16(file, format); + if (IS_EOF(file)) goto Bail; if (nink_metrics != nmetrics) goto Bail; ink_metrics = (xCharInfo *) xalloc(nink_metrics * sizeof(xCharInfo)); - if (!ink_metrics) { - pcfError("pcfReadFont(): Couldn't allocate ink_metrics (%d*%d)\n", nink_metrics, sizeof(xCharInfo)); + if (!ink_metrics) { + pcfError("pcfReadFont(): Couldn't allocate ink_metrics (%d*%d)\n", nink_metrics, sizeof(xCharInfo)); goto Bail; - } + } for (i = 0; i < nink_metrics; i++) - if (PCF_FORMAT_MATCH(format, PCF_DEFAULT_FORMAT)) - pcfGetMetric(file, format, ink_metrics + i); - else - pcfGetCompressedMetric(file, format, ink_metrics + i); + if (PCF_FORMAT_MATCH(format, PCF_DEFAULT_FORMAT)) { + if (!pcfGetMetric(file, format, ink_metrics + i)) + goto Bail; + } else { + if (!pcfGetCompressedMetric(file, format, ink_metrics + i)) + goto Bail; + } } /* encoding */ @@ -563,24 +574,34 @@ pcfReadFont(pFont, file, bit, byte, glyph, scan) pFont->info.firstRow = pcfGetINT16(file, format); pFont->info.lastRow = pcfGetINT16(file, format); pFont->info.defaultCh = pcfGetINT16(file, format); + if (IS_EOF(file)) goto Bail; nencoding = (pFont->info.lastCol - pFont->info.firstCol + 1) * (pFont->info.lastRow - pFont->info.firstRow + 1); - encoding = (CharInfoPtr *) xalloc(nencoding * sizeof(CharInfoPtr)); + encoding = (CharInfoPtr **) xcalloc(NUM_SEGMENTS(nencoding), + sizeof(CharInfoPtr*)); if (!encoding) { - pcfError("pcfReadFont(): Couldn't allocate encoding (%d*%d)\n", nencoding, sizeof(CharInfoPtr)); + pcfError("pcfReadFont(): Couldn't allocate encoding (%d*%d)\n", nencoding, sizeof(CharInfoPtr)); goto Bail; } - + pFont->info.allExist = TRUE; for (i = 0; i < nencoding; i++) { encodingOffset = pcfGetINT16(file, format); + if (IS_EOF(file)) goto Bail; if (encodingOffset == 0xFFFF) { pFont->info.allExist = FALSE; - encoding[i] = 0; - } else - encoding[i] = metrics + encodingOffset; + } else { + if(!encoding[SEGMENT_MAJOR(i)]) { + encoding[SEGMENT_MAJOR(i)]= + (CharInfoPtr*)xcalloc(BITMAP_FONT_SEGMENT_SIZE, + sizeof(CharInfoPtr)); + if(!encoding[SEGMENT_MAJOR(i)]) + goto Bail; + } + ACCESSENCODINGL(encoding, i) = metrics + encodingOffset; + } } /* BDF style accelerators (i.e. bounds based on encoded glyphs) */ @@ -591,7 +612,7 @@ pcfReadFont(pFont, file, bit, byte, glyph, scan) bitmapFont = (BitmapFontPtr) xalloc(sizeof *bitmapFont); if (!bitmapFont) { - pcfError("pcfReadFont(): Couldn't allocate bitmapFont (%d)\n", sizeof *bitmapFont); + pcfError("pcfReadFont(): Couldn't allocate bitmapFont (%d)\n", sizeof *bitmapFont); goto Bail; } @@ -615,7 +636,7 @@ pcfReadFont(pFont, file, bit, byte, glyph, scan) cols = pFont->info.lastCol - pFont->info.firstCol + 1; r = r - pFont->info.firstRow; c = c - pFont->info.firstCol; - bitmapFont->pDefault = encoding[r * cols + c]; + bitmapFont->pDefault = ACCESSENCODING(encoding, r * cols + c); } } bitmapFont->bitmapExtra = (BitmapExtraPtr) 0; @@ -632,21 +653,25 @@ pcfReadFont(pFont, file, bit, byte, glyph, scan) return Successful; Bail: xfree(ink_metrics); + if(encoding) { + for(i=0; i<NUM_SEGMENTS(nencoding); i++) + xfree(encoding[i]); + } xfree(encoding); xfree(bitmaps); - xfree(offsets); xfree(metrics); xfree(pFont->info.props); + pFont->info.nprops = 0; pFont->info.props = 0; + xfree (pFont->info.isStringProp); xfree(bitmapFont); xfree(tables); + xfree(offsets); return AllocError; } int -pcfReadFontInfo(pFontInfo, file) - FontInfoPtr pFontInfo; - FontFilePtr file; +pcfReadFontInfo(FontInfoPtr pFontInfo, FontFilePtr file) { PCFTablePtr tables; int ntables; @@ -657,6 +682,7 @@ pcfReadFontInfo(pFontInfo, file) pFontInfo->isStringProp = NULL; pFontInfo->props = NULL; + pFontInfo->nprops = 0; if (!(tables = pcfReadTOC(file, &ntables))) goto Bail; @@ -686,6 +712,7 @@ pcfReadFontInfo(pFontInfo, file) pFontInfo->firstRow = pcfGetINT16(file, format); pFontInfo->lastRow = pcfGetINT16(file, format); pFontInfo->defaultCh = pcfGetINT16(file, format); + if (IS_EOF(file)) goto Bail; nencoding = (pFontInfo->lastCol - pFontInfo->firstCol + 1) * (pFontInfo->lastRow - pFontInfo->firstRow + 1); @@ -694,7 +721,9 @@ pcfReadFontInfo(pFontInfo, file) while (nencoding--) { if (pcfGetINT16(file, format) == 0xFFFF) pFontInfo->allExist = FALSE; + if (IS_EOF(file)) goto Bail; } + if (IS_EOF(file)) goto Bail; /* BDF style accelerators (i.e. bounds based on encoded glyphs) */ @@ -705,38 +734,39 @@ pcfReadFontInfo(pFontInfo, file) xfree(tables); return Successful; Bail: + pFontInfo->nprops = 0; xfree (pFontInfo->props); xfree (pFontInfo->isStringProp); xfree(tables); return AllocError; } -void -pcfUnloadFont(pFont) - FontPtr pFont; +static void +pcfUnloadFont(FontPtr pFont) { BitmapFontPtr bitmapFont; + int i,nencoding; bitmapFont = (BitmapFontPtr) pFont->fontPrivate; xfree(bitmapFont->ink_metrics); + if(bitmapFont->encoding) { + nencoding = (pFont->info.lastCol - pFont->info.firstCol + 1) * + (pFont->info.lastRow - pFont->info.firstRow + 1); + for(i=0; i<NUM_SEGMENTS(nencoding); i++) + xfree(bitmapFont->encoding[i]); + } xfree(bitmapFont->encoding); xfree(bitmapFont->bitmaps); xfree(bitmapFont->metrics); xfree(pFont->info.isStringProp); xfree(pFont->info.props); xfree(bitmapFont); - xfree(pFont->devPrivates); - xfree(pFont); + DestroyFontRec(pFont); } int -pmfReadFont(pFont, file, bit, byte, glyph, scan) - FontPtr pFont; - FontFilePtr file; - int bit, - byte, - glyph, - scan; +pmfReadFont(FontPtr pFont, FontFilePtr file, + int bit, int byte, int glyph, int scan) { CARD32 format; CARD32 size; @@ -750,13 +780,15 @@ pmfReadFont(pFont, file, bit, byte, glyph, scan) CharInfoPtr metrics = 0; xCharInfo *ink_metrics = 0; char *bitmaps = 0; - CharInfoPtr *encoding = 0; - int nencoding; + CharInfoPtr **encoding = 0; + int nencoding = 0; int encodingOffset; Bool hasBDFAccelerators; CharInfoPtr pci; + pFont->info.nprops = 0; pFont->info.props = 0; + if (!(tables = pcfReadTOC(file, &ntables))) goto Bail; @@ -786,17 +818,21 @@ pmfReadFont(pFont, file, bit, byte, glyph, scan) nmetrics = pcfGetINT32(file, format); else nmetrics = pcfGetINT16(file, format); + if (IS_EOF(file)) goto Bail; metrics = (CharInfoPtr) xalloc(nmetrics * sizeof(CharInfoRec)); if (!metrics) { - pcfError("pmfReadFont(): Couldn't allocate metrics (%d*%d)\n", nmetrics, sizeof(CharInfoRec)); + pcfError("pmfReadFont(): Couldn't allocate metrics (%d*%d)\n", nmetrics, sizeof(CharInfoRec)); goto Bail; } for (i = 0; i < nmetrics; i++) - if (PCF_FORMAT_MATCH(format, PCF_DEFAULT_FORMAT)) - pcfGetMetric(file, format, &(metrics + i)->metrics); - else - pcfGetCompressedMetric(file, format, &(metrics + i)->metrics); - + if (PCF_FORMAT_MATCH(format, PCF_DEFAULT_FORMAT)) { + if (!pcfGetMetric(file, format, &(metrics + i)->metrics)) + goto Bail; + } else { + if (!pcfGetCompressedMetric(file, format, &(metrics + i)->metrics)) + goto Bail; + } + /* Set the bitmaps to all point to the same zero filled array * that is the size of the largest bitmap. */ @@ -809,11 +845,15 @@ pmfReadFont(pFont, file, bit, byte, glyph, scan) pci++; } +#ifdef FONTMODULE + sizebitmaps = 1024; /* Default - we xalloc the size anyway */ +#else sizebitmaps = BUFSIZ; +#endif /* guard against completely empty font */ bitmaps = (char *) xalloc(sizebitmaps); if (!bitmaps) { - pcfError("pmfReadFont(): Couldn't allocate bitmaps (%d)\n", sizebitmaps); + pcfError("pmfReadFont(): Couldn't allocate bitmaps (%d)\n", sizebitmaps); goto Bail; } @@ -836,16 +876,20 @@ pmfReadFont(pFont, file, bit, byte, glyph, scan) nink_metrics = pcfGetINT16(file, format); if (nink_metrics != nmetrics) goto Bail; + if (IS_EOF(file)) goto Bail; ink_metrics = (xCharInfo *) xalloc(nink_metrics * sizeof(xCharInfo)); - if (!ink_metrics) { - pcfError("pmfReadFont(): Couldn't allocate ink_metrics (%d*%d)\n", nink_metrics, sizeof(xCharInfo)); + if (!ink_metrics) { + pcfError("pmfReadFont(): Couldn't allocate ink_metrics (%d*%d)\n", nink_metrics, sizeof(xCharInfo)); goto Bail; - } + } for (i = 0; i < nink_metrics; i++) - if (PCF_FORMAT_MATCH(format, PCF_DEFAULT_FORMAT)) - pcfGetMetric(file, format, ink_metrics + i); - else - pcfGetCompressedMetric(file, format, ink_metrics + i); + if (PCF_FORMAT_MATCH(format, PCF_DEFAULT_FORMAT)) { + if (!pcfGetMetric(file, format, ink_metrics + i)) + goto Bail; + } else { + if (!pcfGetCompressedMetric(file, format, ink_metrics + i)) + goto Bail; + } } /* encoding */ @@ -861,25 +905,36 @@ pmfReadFont(pFont, file, bit, byte, glyph, scan) pFont->info.firstRow = pcfGetINT16(file, format); pFont->info.lastRow = pcfGetINT16(file, format); pFont->info.defaultCh = pcfGetINT16(file, format); + if (IS_EOF(file)) goto Bail; nencoding = (pFont->info.lastCol - pFont->info.firstCol + 1) * (pFont->info.lastRow - pFont->info.firstRow + 1); - encoding = (CharInfoPtr *) xalloc(nencoding * sizeof(CharInfoPtr)); + encoding = (CharInfoPtr **) xcalloc(NUM_SEGMENTS(nencoding), + sizeof(CharInfoPtr*)); if (!encoding) { - pcfError("pmfReadFont(): Couldn't allocate encoding (%d*%d)\n", nencoding, sizeof(CharInfoPtr)); + pcfError("pmfReadFont(): Couldn't allocate encoding (%d*%d)\n", nencoding, sizeof(CharInfoPtr)); goto Bail; } - pFont->info.allExist = TRUE; for (i = 0; i < nencoding; i++) { encodingOffset = pcfGetINT16(file, format); + if (IS_EOF(file)) goto Bail; if (encodingOffset == 0xFFFF) { pFont->info.allExist = FALSE; encoding[i] = 0; - } else - encoding[i] = metrics + encodingOffset; + } else { + if(!encoding[SEGMENT_MAJOR(i)]) { + encoding[SEGMENT_MAJOR(i)]= + (CharInfoPtr*)xcalloc(BITMAP_FONT_SEGMENT_SIZE, + sizeof(CharInfoPtr)); + if(!encoding[SEGMENT_MAJOR(i)]) + goto Bail; + } + ACCESSENCODINGL(encoding, i) = metrics + encodingOffset; + } } + if (IS_EOF(file)) goto Bail; /* BDF style accelerators (i.e. bounds based on encoded glyphs) */ @@ -889,10 +944,10 @@ pmfReadFont(pFont, file, bit, byte, glyph, scan) bitmapFont = (BitmapFontPtr) xalloc(sizeof *bitmapFont); if (!bitmapFont) { - pcfError("pmfReadFont(): Couldn't allocate bitmapFont (%d)\n", sizeof *bitmapFont); + pcfError("pmfReadFont(): Couldn't allocate bitmapFont (%d)\n", sizeof *bitmapFont); goto Bail; } - + bitmapFont->version_num = PCF_FILE_VERSION; bitmapFont->num_chars = nmetrics; bitmapFont->num_tables = ntables; @@ -913,7 +968,7 @@ pmfReadFont(pFont, file, bit, byte, glyph, scan) cols = pFont->info.lastCol - pFont->info.firstCol + 1; r = r - pFont->info.firstRow; c = c - pFont->info.firstCol; - bitmapFont->pDefault = encoding[r * cols + c]; + bitmapFont->pDefault = ACCESSENCODING(encoding, r * cols + c); } } bitmapFont->bitmapExtra = (BitmapExtraPtr) 0; @@ -930,11 +985,18 @@ pmfReadFont(pFont, file, bit, byte, glyph, scan) return Successful; Bail: xfree(ink_metrics); + if(encoding) { + for(i=0; i<NUM_SEGMENTS(nencoding); i++) + xfree(encoding[i]); + } xfree(encoding); + xfree(bitmaps); xfree(metrics); xfree(pFont->info.props); - xfree(bitmapFont); + pFont->info.nprops = 0; pFont->info.props = 0; + xfree (pFont->info.isStringProp); + xfree(bitmapFont); xfree(tables); return AllocError; } diff --git a/src/bitmap/pcfwrite.c b/src/bitmap/pcfwrite.c index 39f79bc..74b099e 100644 --- a/src/bitmap/pcfwrite.c +++ b/src/bitmap/pcfwrite.c @@ -1,5 +1,4 @@ /* $Xorg: pcfwrite.c,v 1.5 2001/02/09 02:04:02 xorgcvs Exp $ */ - /* Copyright 1990, 1994, 1998 The Open Group @@ -27,6 +26,7 @@ other dealings in this Software without prior written authorization from The Open Group. */ +/* $XFree86: xc/lib/font/bitmap/pcfwrite.c,v 1.10 2003/01/12 03:55:46 tsi Exp $ */ /* * Author: Keith Packard, MIT X Consortium @@ -39,27 +39,23 @@ from The Open Group. extern void pcfError( #if NeedVarargsPrototypes - char* message, ... + char* message, ... #endif -); + ); /* Write PCF font files */ -static int current_position; +static CARD32 current_position; static int -pcfWrite(file, b, c) - FontFilePtr file; - char *b; - int c; +pcfWrite(FontFilePtr file, char *b, int c) { current_position += c; return FontFileWrite(file, b, c); } static int -pcfPutLSB32(file, c) - FontFilePtr file; +pcfPutLSB32(FontFilePtr file, int c) { current_position += 4; (void) FontFilePutc(c, file); @@ -69,9 +65,7 @@ pcfPutLSB32(file, c) } static int -pcfPutINT32(file, format, c) - FontFilePtr file; - CARD32 format; +pcfPutINT32(FontFilePtr file, CARD32 format, int c) { current_position += 4; if (PCF_BYTE_ORDER(format) == MSBFirst) { @@ -88,9 +82,7 @@ pcfPutINT32(file, format, c) } static int -pcfPutINT16(file, format, c) - FontFilePtr file; - CARD32 format; +pcfPutINT16(FontFilePtr file, CARD32 format, int c) { current_position += 2; if (PCF_BYTE_ORDER(format) == MSBFirst) { @@ -104,19 +96,14 @@ pcfPutINT16(file, format, c) /*ARGSUSED*/ static int -pcfPutINT8(file, format, c) - FontFilePtr file; - CARD32 format; +pcfPutINT8(FontFilePtr file, CARD32 format, int c) { current_position += 1; return FontFilePutc(c, file); } static void -pcfWriteTOC(file, table, count) - FontFilePtr file; - PCFTablePtr table; - int count; +pcfWriteTOC(FontFilePtr file, PCFTablePtr table, int count) { CARD32 version; int i; @@ -134,10 +121,7 @@ pcfWriteTOC(file, table, count) } static void -pcfPutCompressedMetric(file, format, metric) - FontFilePtr file; - CARD32 format; - xCharInfo *metric; +pcfPutCompressedMetric(FontFilePtr file, CARD32 format, xCharInfo *metric) { pcfPutINT8(file, format, metric->leftSideBearing + 0x80); pcfPutINT8(file, format, metric->rightSideBearing + 0x80); @@ -147,10 +131,7 @@ pcfPutCompressedMetric(file, format, metric) } static void -pcfPutMetric(file, format, metric) - FontFilePtr file; - CARD32 format; - xCharInfo *metric; +pcfPutMetric(FontFilePtr file, CARD32 format, xCharInfo *metric) { pcfPutINT16(file, format, metric->leftSideBearing); pcfPutINT16(file, format, metric->rightSideBearing); @@ -161,10 +142,7 @@ pcfPutMetric(file, format, metric) } static void -pcfPutBitmap(file, format, pCI) - FontFilePtr file; - CARD32 format; - CharInfoPtr pCI; +pcfPutBitmap(FontFilePtr file, CARD32 format, CharInfoPtr pCI) { int count; unsigned char *bits; @@ -177,10 +155,7 @@ pcfPutBitmap(file, format, pCI) } static void -pcfPutAccel(file, format, pFontInfo) - FontFilePtr file; - CARD32 format; - FontInfoPtr pFontInfo; +pcfPutAccel(FontFilePtr file, CARD32 format, FontInfoPtr pFontInfo) { pcfPutINT8(file, format, pFontInfo->noOverlap); pcfPutINT8(file, format, pFontInfo->constantMetrics); @@ -220,16 +195,13 @@ pcfPutAccel(file, format, pFontInfo) #define CanCompressMetrics(min,max) (CanCompressMetric(min) && CanCompressMetric(max)) static char * -pcfNameForAtom(a) - Atom a; +pcfNameForAtom(Atom a) { return NameForAtom(a); } int -pcfWriteFont(pFont, file) - FontPtr pFont; - FontFilePtr file; +pcfWriteFont(FontPtr pFont, FontFilePtr file) { PCFTableRec tables[32], *table; @@ -247,13 +219,13 @@ pcfWriteFont(pFont, file) xCharInfo *ink_minbounds, *ink_maxbounds; BitmapFontPtr bitmapFont; - int nencodings; + int nencodings = 0; int header_size; FontPropPtr offsetProps; - int prop_pad; + int prop_pad = 0; char *atom_name; int glyph; - int offset; + CARD32 offset; bitmapFont = (BitmapFontPtr) pFont->fontPrivate; if (bitmapFont->bitmapExtra) { @@ -269,7 +241,7 @@ pcfWriteFont(pFont, file) } offsetProps = (FontPropPtr) xalloc(pFont->info.nprops * sizeof(FontPropRec)); if (!offsetProps) { - pcfError("pcfWriteFont(): Couldn't allocate offsetProps (%d*%d)", pFont->info.nprops, sizeof(FontPropRec)); + pcfError("pcfWriteFont(): Couldn't allocate offsetProps (%d*%d)", pFont->info.nprops, sizeof(FontPropRec)); return AllocError; } prop_string_size = 0; @@ -388,7 +360,8 @@ pcfWriteFont(pFont, file) cur_table++, table++) { if (current_position > table->offset) { printf("can't go backwards... %d > %d\n", - current_position, table->offset); + (int)current_position, (int)table->offset); + xfree(offsetProps); return BadFontName; } while (current_position < table->offset) @@ -461,8 +434,10 @@ pcfWriteFont(pFont, file) pcfPutINT16(file, format, pFont->info.lastRow); pcfPutINT16(file, format, pFont->info.defaultCh); for (i = 0; i < nencodings; i++) { - if (bitmapFont->encoding[i]) - pcfPutINT16(file, format, bitmapFont->encoding[i] - bitmapFont->metrics); + if (ACCESSENCODING(bitmapFont->encoding,i)) + pcfPutINT16(file, format, + ACCESSENCODING(bitmapFont->encoding, i) - + bitmapFont->metrics); else pcfPutINT16(file, format, 0xFFFF); } @@ -490,5 +465,7 @@ pcfWriteFont(pFont, file) break; } } + + xfree(offsetProps); return Successful; } diff --git a/src/bitmap/snfread.c b/src/bitmap/snfread.c index 04982bc..375fa5a 100644 --- a/src/bitmap/snfread.c +++ b/src/bitmap/snfread.c @@ -49,8 +49,12 @@ other dealings in this Software without prior written authorization from The Open Group. */ +/* $XFree86: xc/lib/font/bitmap/snfread.c,v 1.11 2003/01/12 03:55:46 tsi Exp $ */ +#ifndef FONTMODULE #include <ctype.h> +#endif + #include "fntfilst.h" #include "bitmap.h" #include "snfstr.h" @@ -73,23 +77,20 @@ snfError (message, va_alist) va_list args; #if NeedVarargsPrototypes - va_start (args, message); + va_start(args, message); #else - va_start (args); + va_start(args); #endif fprintf(stderr, "SNF Error: "); vfprintf(stderr, message, args); - va_end (args); + va_end(args); } - -static void snfUnloadFont(); + +static void snfUnloadFont(FontPtr pFont); static int -snfReadCharInfo(file, charInfo, base) - FontFilePtr file; - CharInfoPtr charInfo; - char *base; +snfReadCharInfo(FontFilePtr file, CharInfoPtr charInfo, char *base) { snfCharInfoRec snfCharInfo; @@ -109,9 +110,7 @@ snfReadCharInfo(file, charInfo, base) } static int -snfReadxCharInfo(file, charInfo) - FontFilePtr file; - xCharInfo *charInfo; +snfReadxCharInfo(FontFilePtr file, xCharInfo *charInfo) { snfCharInfoRec snfCharInfo; @@ -124,9 +123,7 @@ snfReadxCharInfo(file, charInfo) } static void -snfCopyInfo(snfInfo, pFontInfo) - snfFontInfoPtr snfInfo; - FontInfoPtr pFontInfo; +snfCopyInfo(snfFontInfoPtr snfInfo, FontInfoPtr pFontInfo) { pFontInfo->firstCol = snfInfo->firstCol; pFontInfo->lastCol = snfInfo->lastCol; @@ -152,10 +149,7 @@ snfCopyInfo(snfInfo, pFontInfo) } static int -snfReadProps(snfInfo, pFontInfo, file) - snfFontInfoPtr snfInfo; - FontInfoPtr pFontInfo; - FontFilePtr file; +snfReadProps(snfFontInfoPtr snfInfo, FontInfoPtr pFontInfo, FontFilePtr file) { char *strings; FontPropPtr pfp; @@ -168,7 +162,7 @@ snfReadProps(snfInfo, pFontInfo, file) BYTESOFSTRINGINFO(snfInfo); propspace = (char *) xalloc(bytestoalloc); if (!propspace) { - snfError("snfReadProps(): Couldn't allocate propspace (%d)\n", bytestoalloc); + snfError("snfReadProps(): Couldn't allocate propspace (%d)\n", bytestoalloc); return AllocError; } @@ -195,10 +189,8 @@ snfReadProps(snfInfo, pFontInfo, file) return Successful; } -int -snfReadHeader(snfInfo, file) - snfFontInfoPtr snfInfo; - FontFilePtr file; +static int +snfReadHeader(snfFontInfoPtr snfInfo, FontFilePtr file) { if (FontFileRead(file, (char *) snfInfo, sizeof *snfInfo) != sizeof *snfInfo) return BadFontName; @@ -213,8 +205,7 @@ static int snf_set; static int snf_bit, snf_byte, snf_glyph, snf_scan; void -SnfSetFormat (bit, byte, glyph, scan) - int bit, byte, glyph, scan; +SnfSetFormat (int bit, int byte, int glyph, int scan) { snf_bit = bit; snf_byte = byte; @@ -223,9 +214,8 @@ SnfSetFormat (bit, byte, glyph, scan) snf_set = 1; } -void -SnfGetFormat (bit, byte, glyph, scan) - int *bit, *byte, *glyph, *scan; +static void +SnfGetFormat (int *bit, int *byte, int *glyph, int *scan) { if (!snf_set) FontDefaultFormat (&snf_bit, &snf_byte, &snf_glyph, &snf_scan); @@ -236,17 +226,12 @@ SnfGetFormat (bit, byte, glyph, scan) } int -snfReadFont(pFont, file, bit, byte, glyph, scan) - FontPtr pFont; - FontFilePtr file; - int bit, - byte, - glyph, - scan; +snfReadFont(FontPtr pFont, FontFilePtr file, + int bit, int byte, int glyph, int scan) { snfFontInfoRec fi; unsigned bytestoalloc; - int i; + int i, j; char *fontspace; BitmapFontPtr bitmapFont; int num_chars; @@ -283,7 +268,8 @@ snfReadFont(pFont, file, bit, byte, glyph, scan) metrics_off = bytestoalloc; bytestoalloc += num_chars * sizeof(CharInfoRec); /* metrics */ encoding_off = bytestoalloc; - bytestoalloc += num_chars * sizeof(CharInfoPtr); /* encoding */ + bytestoalloc += NUM_SEGMENTS(num_chars) * sizeof(CharInfoPtr**); + /* encoding */ props_off = bytestoalloc; bytestoalloc += fi.nProps * sizeof(FontPropRec); /* props */ isStringProp_off = bytestoalloc; @@ -295,14 +281,13 @@ snfReadFont(pFont, file, bit, byte, glyph, scan) fontspace = (char *) xalloc(bytestoalloc); if (!fontspace) { - snfError("snfReadFont(): Couldn't allocate fontspace (%d)\n", bytestoalloc); + snfError("snfReadFont(): Couldn't allocate fontspace (%d)\n", bytestoalloc); return AllocError; } - bitmaps = (char *) xalloc (bitmapsSize); if (!bitmaps) { - snfError("snfReadFont(): Couldn't allocate bitmaps (%d)\n", bitmapsSize); + snfError("snfReadFont(): Couldn't allocate bitmaps (%d)\n", bitmapsSize); xfree (fontspace); return AllocError; } @@ -313,7 +298,7 @@ snfReadFont(pFont, file, bit, byte, glyph, scan) bitmapFont = (BitmapFontPtr) fontspace; bitmapFont->num_chars = num_chars; bitmapFont->metrics = (CharInfoPtr) (fontspace + metrics_off); - bitmapFont->encoding = (CharInfoPtr *) (fontspace + encoding_off); + bitmapFont->encoding = (CharInfoPtr **) (fontspace + encoding_off); bitmapFont->bitmaps = bitmaps; bitmapFont->pDefault = NULL; bitmapFont->bitmapExtra = NULL; @@ -329,16 +314,30 @@ snfReadFont(pFont, file, bit, byte, glyph, scan) */ ret = Successful; + memset(bitmapFont->encoding, 0, + NUM_SEGMENTS(num_chars)*sizeof(CharInfoPtr*)); for (i = 0; ret == Successful && i < num_chars; i++) { ret = snfReadCharInfo(file, &bitmapFont->metrics[i], bitmaps); - if (bitmapFont->metrics[i].bits) - bitmapFont->encoding[i] = &bitmapFont->metrics[i]; - else - bitmapFont->encoding[i] = 0; + if (bitmapFont->metrics[i].bits) { + if (!bitmapFont->encoding[SEGMENT_MAJOR(i)]) { + bitmapFont->encoding[SEGMENT_MAJOR(i)]= + (CharInfoPtr*)xcalloc(BITMAP_FONT_SEGMENT_SIZE, + sizeof(CharInfoPtr)); + if (!bitmapFont->encoding[SEGMENT_MAJOR(i)]) { + ret = AllocError; + break; + } + } + ACCESSENCODINGL(bitmapFont->encoding,i) = &bitmapFont->metrics[i]; + } } if (ret != Successful) { xfree(bitmaps); + if(bitmapFont->encoding) { + for(j=0; j<SEGMENT_MAJOR(i); j++) + xfree(bitmapFont->encoding[i]); + } xfree(fontspace); return ret; } @@ -346,23 +345,23 @@ snfReadFont(pFont, file, bit, byte, glyph, scan) * read the glyphs */ - if (FontFileRead(file, (char *) bitmaps, bitmapsSize) != bitmapsSize) { + if (FontFileRead(file, bitmaps, bitmapsSize) != bitmapsSize) { xfree(bitmaps); xfree(fontspace); return BadFontName; } if (def_bit != bit) - BitOrderInvert(bitmaps, bitmapsSize); + BitOrderInvert((unsigned char *)bitmaps, bitmapsSize); if ((def_byte == def_bit) != (bit == byte)) { switch (bit == byte ? def_scan : scan) { case 1: break; case 2: - TwoByteSwap(bitmaps, bitmapsSize); + TwoByteSwap((unsigned char *)bitmaps, bitmapsSize); break; case 4: - FourByteSwap(bitmaps, bitmapsSize); + FourByteSwap((unsigned char *)bitmaps, bitmapsSize); break; } } @@ -457,9 +456,7 @@ snfReadFont(pFont, file, bit, byte, glyph, scan) } int -snfReadFontInfo(pFontInfo, file) - FontInfoPtr pFontInfo; - FontFilePtr file; +snfReadFontInfo(FontInfoPtr pFontInfo, FontFilePtr file) { int ret; snfFontInfoRec fi; @@ -473,19 +470,19 @@ snfReadFontInfo(pFontInfo, file) pFontInfo->props = (FontPropPtr) xalloc(fi.nProps * sizeof(FontPropRec)); if (!pFontInfo->props) { - snfError("snfReadFontInfo(): Couldn't allocate props (%d*%d)\n", fi.nProps, sizeof(FontPropRec)); + snfError("snfReadFontInfo(): Couldn't allocate props (%d*%d)\n", fi.nProps, sizeof(FontPropRec)); return AllocError; } pFontInfo->isStringProp = (char *) xalloc(fi.nProps * sizeof(char)); if (!pFontInfo->isStringProp) { - snfError("snfReadFontInfo(): Couldn't allocate isStringProp (%d*%d)\n", fi.nProps, sizeof(char)); + snfError("snfReadFontInfo(): Couldn't allocate isStringProp (%d*%d)\n", fi.nProps, sizeof(char)); xfree(pFontInfo->props); return AllocError; } num_chars = n2dChars(&fi); bytestoskip = num_chars * sizeof(snfCharInfoRec); /* charinfos */ bytestoskip += BYTESOFGLYPHINFO(&fi); - FontFileSkip(file, bytestoskip); + (void)FontFileSkip(file, bytestoskip); ret = snfReadProps(&fi, pFontInfo, file); if (ret != Successful) { @@ -515,15 +512,13 @@ snfReadFontInfo(pFontInfo, file) } static void -snfUnloadFont(pFont) - FontPtr pFont; +snfUnloadFont(FontPtr pFont) { BitmapFontPtr bitmapFont; bitmapFont = (BitmapFontPtr) pFont->fontPrivate; xfree (bitmapFont->bitmaps); xfree (bitmapFont); - xfree (pFont->devPrivates); - xfree (pFont); + DestroyFontRec (pFont); } diff --git a/src/bitmap/snfstr.h b/src/bitmap/snfstr.h index 1ca91fb..09ecf8a 100644 --- a/src/bitmap/snfstr.h +++ b/src/bitmap/snfstr.h @@ -49,10 +49,13 @@ other dealings in this Software without prior written authorization from The Open Group. */ +/* $XFree86: xc/lib/font/bitmap/snfstr.h,v 1.5 2001/12/14 19:56:47 dawes Exp $ */ #ifndef SNFSTR_H #define SNFSTR_H 1 +#include "fntfilio.h" + /*- * This file describes the Server Natural Font format. * SNF fonts are both CPU-dependent and frame buffer bit order dependent. @@ -173,4 +176,9 @@ typedef struct _snfFontInfo { unsigned int version2; /* version stamp double-check */ } snfFontInfoRec; +extern void SnfSetFormat ( int bit, int byte, int glyph, int scan ); +extern int snfReadFont ( FontPtr pFont, FontFilePtr file, + int bit, int byte, int glyph, int scan ); +extern int snfReadFontInfo ( FontInfoPtr pFontInfo, FontFilePtr file ); + #endif /* SNFSTR_H */ diff --git a/src/fc/fsconvert.c b/src/fc/fsconvert.c index 1c8c6d1..47239cf 100644 --- a/src/fc/fsconvert.c +++ b/src/fc/fsconvert.c @@ -22,31 +22,32 @@ * * Author: Dave Lemke, Network Computing Devices, Inc */ +/* $XFree86: xc/lib/font/fc/fsconvert.c,v 1.11 2002/09/10 16:14:35 tsi Exp $ */ /* * FS data conversion */ #include <X11/X.h> +#include <X11/Xtrans.h> +#include <X11/Xpoll.h> #include "FS.h" #include "FSproto.h" #include "fontmisc.h" #include "fontstruct.h" #include "fservestr.h" +#include "fontutil.h" extern char _fs_glyph_undefined; extern char _fs_glyph_requested; extern char _fs_glyph_zero_length; -extern int _fs_load_glyphs(); /* * converts data from font server form to X server form */ void -_fs_convert_char_info(src, dst) - fsXCharInfo *src; - xCharInfo *dst; +_fs_convert_char_info(fsXCharInfo *src, xCharInfo *dst) { dst->ascent = src->ascent; dst->descent = src->descent; @@ -57,9 +58,7 @@ _fs_convert_char_info(src, dst) } void -_fs_init_fontinfo(conn, pfi) - FSFpePtr conn; - FontInfoPtr pfi; +_fs_init_fontinfo(FSFpePtr conn, FontInfoPtr pfi) { if (conn->fsMajorVersion == 1) { unsigned short n; @@ -69,7 +68,7 @@ _fs_init_fontinfo(conn, pfi) n = pfi->lastCol; pfi->lastCol = pfi->lastRow; pfi->lastRow = n; - pfi->defaultCh = (pfi->defaultCh >> 8) & 0xff + pfi->defaultCh = ((pfi->defaultCh >> 8) & 0xff) + ((pfi->defaultCh & 0xff) << 8); } @@ -87,11 +86,8 @@ _fs_init_fontinfo(conn, pfi) } int -_fs_convert_props(pi, po, pd, pfi) - fsPropInfo *pi; - fsPropOffset *po; - pointer pd; - FontInfoPtr pfi; +_fs_convert_props(fsPropInfo *pi, fsPropOffset *po, pointer pd, + FontInfoPtr pfi) { FontPropPtr dprop; int i, @@ -99,38 +95,39 @@ _fs_convert_props(pi, po, pd, pfi) char *is_str; fsPropOffset local_off; char *off_adr; + char *pdc = pd; /* stolen from server/include/resource.h */ #define BAD_RESOURCE 0xe0000000 nprops = pfi->nprops = pi->num_offsets; - dprop = (FontPropPtr) xalloc(sizeof(FontPropRec) * nprops); - is_str = (char *) xalloc(sizeof(char) * nprops); - if (!dprop || !is_str) { - xfree(is_str); - xfree(dprop); + dprop = (FontPropPtr) xalloc(sizeof(FontPropRec) * nprops + + sizeof (char) * nprops); + if (!dprop) return -1; - } + + is_str = (char *) (dprop + nprops); pfi->props = dprop; pfi->isStringProp = is_str; off_adr = (char *)po; - for (i = 0; i < nprops; i++, dprop++, is_str++) { + for (i = 0; i < nprops; i++, dprop++, is_str++) + { memcpy(&local_off, off_adr, SIZEOF(fsPropOffset)); - dprop->name = MakeAtom(&pd[local_off.name.position], + dprop->name = MakeAtom(&pdc[local_off.name.position], local_off.name.length, 1); if (local_off.type != PropTypeString) { *is_str = FALSE; dprop->value = local_off.value.position; } else { *is_str = TRUE; - dprop->value = (INT32) MakeAtom(&pd[local_off.value.position], + dprop->value = (INT32) MakeAtom(&pdc[local_off.value.position], local_off.value.length, 1); if (dprop->value == BAD_RESOURCE) { xfree (pfi->props); - xfree (pfi->isStringProp); + pfi->nprops = 0; pfi->props = 0; pfi->isStringProp = 0; return -1; @@ -142,14 +139,21 @@ _fs_convert_props(pi, po, pd, pfi) return nprops; } +void +_fs_free_props (FontInfoPtr pfi) +{ + if (pfi->props) + { + xfree (pfi->props); + pfi->nprops = 0; + pfi->props = 0; + } +} + int -_fs_convert_lfwi_reply(conn, pfi, fsrep, pi, po, pd) - FSFpePtr conn; - FontInfoPtr pfi; - fsListFontsWithXInfoReply *fsrep; - fsPropInfo *pi; - fsPropOffset *po; - pointer pd; +_fs_convert_lfwi_reply(FSFpePtr conn, FontInfoPtr pfi, + fsListFontsWithXInfoReply *fsrep, + fsPropInfo *pi, fsPropOffset *po, pointer pd) { fsUnpack_XFontInfoHeader(fsrep, pfi); _fs_init_fontinfo(conn, pfi); @@ -181,14 +185,9 @@ _fs_convert_lfwi_reply(conn, pfi, fsrep, pi, po, pd) */ /* ARGSUSED */ int -fs_build_range(pfont, range_flag, count, item_size, data, nranges, ranges) - FontPtr pfont; - Bool range_flag; - register unsigned int count; - int item_size; - register unsigned char *data; - int *nranges; - fsRange **ranges; +fs_build_range(FontPtr pfont, Bool range_flag, unsigned int count, + int item_size, unsigned char *data, int *nranges, + fsRange **ranges) { FSFontDataPtr fsd = (FSFontDataPtr) (pfont->fpePrivate); FSFontPtr fsfont = (FSFontPtr) (pfont->fontPrivate); @@ -309,7 +308,7 @@ fs_build_range(pfont, range_flag, count, item_size, data, nranges, ranges) if (GLYPH_UNDEFINED(loc)) { if (row1 == row2 && - ((col1 & 0xf) && col1 > firstcol || + (((col1 & 0xf) && col1 > firstcol) || (col2 & 0xf) != 0xf) && (col2 < lastcol)) { /* If we're loading from a single row, expand @@ -348,10 +347,8 @@ fs_build_range(pfont, range_flag, count, item_size, data, nranges, ranges) requests needs to be cancelled. */ void -_fs_clean_aborted_loadglyphs(pfont, num_expected_ranges, expected_ranges) - FontPtr pfont; - int num_expected_ranges; - fsRange *expected_ranges; +_fs_clean_aborted_loadglyphs(FontPtr pfont, int num_expected_ranges, + fsRange *expected_ranges) { register FSFontPtr fsfont; register FSFontDataRec *fsd; @@ -405,12 +402,8 @@ _fs_clean_aborted_loadglyphs(pfont, num_expected_ranges, expected_ranges) */ /* ARGSUSED */ int -_fs_check_extents(pfont, flags, nranges, range, blockrec) - FontPtr pfont; - Mask flags; - int nranges; - fsRange *range; - FSBlockDataPtr blockrec; +_fs_check_extents(FontPtr pfont, Mask flags, int nranges, fsRange *range, + FSBlockDataPtr blockrec) { /* XXX -- either fill in the requested info if we have it somewhere * and return AccessDone, or else return Successful @@ -425,13 +418,9 @@ _fs_check_extents(pfont, flags, nranges, range, blockrec) */ /* ARGSUSED */ int -_fs_check_bitmaps(pfont, format, flags, nranges, range, blockrec) - FontPtr pfont; - fsBitmapFormat format; - Mask flags; - int nranges; - fsRange *range; - FSBlockDataPtr blockrec; +_fs_check_bitmaps(FontPtr pfont, fsBitmapFormat format, + Mask flags, int nranges, fsRange *range, + FSBlockDataPtr blockrec) { /* XXX -- either fill in the requested info if we have it somewhere * and return AccessDone, or else return Successful @@ -440,13 +429,10 @@ _fs_check_bitmaps(pfont, format, flags, nranges, range, blockrec) } int -_fs_get_glyphs(pFont, count, chars, charEncoding, glyphCount, glyphs) - FontPtr pFont; - unsigned long count; - register unsigned char *chars; - FontEncoding charEncoding; - unsigned long *glyphCount; /* RETURN */ - CharInfoPtr *glyphs; /* RETURN */ +_fs_get_glyphs(FontPtr pFont, unsigned long count, unsigned char *chars, + FontEncoding charEncoding, + unsigned long *glyphCount, /* RETURN */ + CharInfoPtr *glyphs) /* RETURN */ { FSFontPtr fsdata; unsigned int firstCol; @@ -562,13 +548,10 @@ _fs_get_glyphs(pFont, count, chars, charEncoding, glyphCount, glyphs) static int -_fs_get_metrics(pFont, count, chars, charEncoding, glyphCount, glyphs) - FontPtr pFont; - unsigned long count; - register unsigned char *chars; - FontEncoding charEncoding; - unsigned long *glyphCount; /* RETURN */ - xCharInfo **glyphs; /* RETURN */ +_fs_get_metrics(FontPtr pFont, unsigned long count, unsigned char *chars, + FontEncoding charEncoding, + unsigned long *glyphCount, /* RETURN */ + xCharInfo **glyphs) /* RETURN */ { FSFontPtr fsdata; unsigned int firstCol; @@ -585,6 +568,9 @@ _fs_get_metrics(pFont, count, chars, charEncoding, glyphCount, glyphs) fsdata = (FSFontPtr) pFont->fontPrivate; encoding = fsdata->inkMetrics; pDefault = fsdata->pDefault; + /* convert default bitmap metric to default ink metric */ + if (pDefault) + pDefault = encoding + (pDefault - fsdata->encoding); firstCol = pFont->info.firstCol; numCols = pFont->info.lastCol - firstCol + 1; glyphsBase = glyphs; @@ -662,41 +648,120 @@ _fs_get_metrics(pFont, count, chars, charEncoding, glyphCount, glyphs) void -_fs_unload_font(pfont) - FontPtr pfont; +_fs_unload_font(FontPtr pfont) { - FSFontPtr fsdata = (FSFontPtr) pfont->fontPrivate; - - if (fsdata->encoding) + FSFontPtr fsdata = (FSFontPtr) pfont->fontPrivate; + FSFontDataPtr fsd = (FSFontDataPtr) pfont->fpePrivate; + CharInfoPtr encoding = fsdata->encoding; + FSGlyphPtr glyphs; + + /* + * fsdata points at FSFontRec, FSFontDataRec and name + */ + if (encoding) + xfree(encoding); + + while ((glyphs = fsdata->glyphs)) { - register int i; - register CharInfoPtr encoding = fsdata->encoding; - FontInfoPtr pfi = &pfont->info; - for (i = (pfi->lastCol - pfi->firstCol + 1) * - (pfi->lastRow - pfi->firstRow + 1); - i > 0; - encoding++, i--) - { - if (encoding->bits && - encoding->bits != &_fs_glyph_undefined && - encoding->bits != &_fs_glyph_requested && - encoding->bits != &_fs_glyph_zero_length) - xfree(encoding->bits); - } + fsdata->glyphs = glyphs->next; + xfree (glyphs); } - xfree(fsdata->encoding); + + /* XXX we may get called after the resource DB has been cleaned out */ + if (find_old_font(fsd->fontid)) + DeleteFontClientID (fsd->fontid); + + _fs_free_props (&pfont->info); + xfree(fsdata); - - pfont->fontPrivate = 0; + + DestroyFontRec(pfont); } -void -_fs_init_font(pfont) - FontPtr pfont; +FontPtr +fs_create_font (FontPathElementPtr fpe, + char *name, + int namelen, + fsBitmapFormat format, + fsBitmapFormatMask fmask) { + FontPtr pfont; + FSFontPtr fsfont; + FSFontDataPtr fsd; + int bit, byte, scan, glyph; + + pfont = CreateFontRec (); + if (!pfont) + return 0; + fsfont = (FSFontPtr) xalloc (sizeof (FSFontRec) + + sizeof (FSFontDataRec) + + namelen + 1); + if (!fsfont) + { + DestroyFontRec (pfont); + return 0; + } + fsd = (FSFontDataPtr) (fsfont + 1); + bzero((char *) fsfont, sizeof(FSFontRec)); + bzero((char *) fsd, sizeof(FSFontDataRec)); + + pfont->fpe = fpe; + pfont->fontPrivate = (pointer) fsfont; + pfont->fpePrivate = (pointer) fsd; + + /* These font components will be needed in packGlyphs */ + CheckFSFormat(format, BitmapFormatMaskBit | + BitmapFormatMaskByte | + BitmapFormatMaskScanLineUnit | + BitmapFormatMaskScanLinePad, + &bit, + &byte, + &scan, + &glyph, + NULL); + pfont->format = format; + pfont->bit = bit; + pfont->byte = byte; + pfont->scan = scan; + pfont->glyph = glyph; + + pfont->info.nprops = 0; + pfont->info.props = 0; + pfont->info.isStringProp = 0; + /* set font function pointers */ pfont->get_glyphs = _fs_get_glyphs; pfont->get_metrics = _fs_get_metrics; pfont->unload_font = _fs_unload_font; - pfont->unload_glyphs = (void (*)())0; + pfont->unload_glyphs = NULL; + + /* set the FPE private information */ + fsd->format = format; + fsd->fmask = fmask; + fsd->name = (char *) (fsd + 1); + memcpy (fsd->name, name, namelen); + fsd->name[namelen] = '\0'; + fsd->fontid = GetNewFontClientID (); + + /* save the ID */ + if (!StoreFontClientFont(pfont, fsd->fontid)) + { + xfree (fsfont); + DestroyFontRec (pfont); + return 0; + } + + return pfont; +} + +pointer +fs_alloc_glyphs (FontPtr pFont, int size) +{ + FSGlyphPtr glyphs; + FSFontPtr fsfont = (FSFontPtr) pFont->fontPrivate; + + glyphs = xalloc (sizeof (FSGlyphRec) + size); + glyphs->next = fsfont->glyphs; + fsfont->glyphs = glyphs; + return (pointer) (glyphs + 1); } diff --git a/src/fc/fserve.c b/src/fc/fserve.c index 95ce811..f21233c 100644 --- a/src/fc/fserve.c +++ b/src/fc/fserve.c @@ -24,6 +24,7 @@ used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from The Open Group. */ +/* $XFree86: xc/lib/font/fc/fserve.c,v 3.22 2002/05/31 18:45:49 dawes Exp $ */ /* * Copyright 1990 Network Computing Devices @@ -54,36 +55,32 @@ in this Software without prior written authorization from The Open Group. #ifdef WIN32 #define _WILLWINSOCK_ #endif -#include <X11/X.h> -#include <X11/Xos.h> +#include "X11/Xtrans.h" #include "X11/Xpoll.h" #include "FS.h" #include "FSproto.h" +#include <X11/X.h> +#include <X11/Xos.h> #include "fontmisc.h" #include "fontstruct.h" #include "fservestr.h" +#include "fontutil.h" #include <errno.h> -#ifdef X_NOT_STDC_ENV -extern int errno; -#define Time_t long -extern Time_t time (); -#else + #include <time.h> #define Time_t time_t -#endif #ifdef NCD #include <ncd/nvram.h> #endif -#ifndef NULL -#define NULL 0 -#endif +#include <stddef.h> #ifndef MIN #define MIN(a,b) ((a)<(b)?(a):(b)) #endif - +#define TimeCmp(a,c,b) ((int) ((a) - (b)) c 0) + #define NONZEROMETRICS(pci) ((pci)->leftSideBearing || \ (pci)->rightSideBearing || \ (pci)->ascent || \ @@ -91,37 +88,71 @@ extern Time_t time (); (pci)->characterWidth) -extern FontPtr find_old_font(); - -extern int _fs_build_range(); - -static int fs_read_glyphs(); -static int fs_read_list(); -static int fs_read_list_info(); +static int fs_read_glyphs ( FontPathElementPtr fpe, FSBlockDataPtr blockrec ); +static int fs_read_list ( FontPathElementPtr fpe, FSBlockDataPtr blockrec ); +static int fs_read_list_info ( FontPathElementPtr fpe, + FSBlockDataPtr blockrec ); static int fs_font_type; extern fd_set _fs_fd_mask; -static void fs_block_handler(); -static int fs_wakeup(); - -static FSFpePtr awaiting_reconnect; +static void fs_block_handler ( pointer data, OSTimePtr wt, + pointer LastSelectMask ); +static int fs_wakeup ( FontPathElementPtr fpe, unsigned long *mask ); -void _fs_connection_died(); -static int _fs_restart_connection(); -static void _fs_try_reconnect(); -static int fs_send_query_info(); -static int fs_send_query_extents(); -static int fs_send_query_bitmaps(); -static int fs_send_close_font(); -static void fs_client_died(); -static void _fs_client_access(); -static void _fs_client_resolution(); +/* + * List of all FPEs + */ +static FSFpePtr fs_fpes; +/* + * Union of all FPE blockStates + */ +static CARD32 fs_blockState; + +static int _fs_restart_connection ( FSFpePtr conn ); +static void fs_send_query_bitmaps ( FontPathElementPtr fpe, + FSBlockDataPtr blockrec ); +static int fs_send_close_font ( FontPathElementPtr fpe, Font id ); +static void fs_client_died ( pointer client, FontPathElementPtr fpe ); +static void _fs_client_access ( FSFpePtr conn, pointer client, Bool sync ); +static void _fs_client_resolution ( FSFpePtr conn ); +static fsGenericReply *fs_get_reply (FSFpePtr conn, int *error); +static int fs_await_reply (FSFpePtr conn); +static void _fs_do_blocked (FSFpePtr conn); +static void fs_cleanup_bfont (FSBlockedFontPtr bfont); char _fs_glyph_undefined; char _fs_glyph_requested; char _fs_glyph_zero_length; +static int generationCount; + +int FontServerRequestTimeout = 30 * 1000; + +static void +_fs_close_server (FSFpePtr conn); + +static FSFpePtr +_fs_init_conn (char *servername); + +static int +_fs_wait_connect (FSFpePtr conn); + +static int +_fs_send_init_packets (FSFpePtr conn); + +static void +_fs_check_reconnect (FSFpePtr conn); + +static void +_fs_start_reconnect (FSFpePtr conn); + +static void +_fs_free_conn (FSFpePtr conn); + +static int +fs_free_fpe(FontPathElementPtr fpe); + /* * Font server access * @@ -141,35 +172,58 @@ char _fs_glyph_zero_length; */ -/* XXX this should probably be a macro once its fully debugged */ -/* ARGSUSED */ +#ifdef DEBUG static void -_fs_add_req_log(conn, opcode) - FSFpePtr conn; - int opcode; +_fs_add_req_log(FSFpePtr conn, int opcode) { - -#ifdef DEBUG - conn->reqbuffer[conn->reqindex++] = opcode; + conn->current_seq++; + fprintf (stderr, "\t\tRequest: %5d Opcode: %2d\n", + conn->current_seq, opcode); + conn->reqbuffer[conn->reqindex].opcode = opcode; + conn->reqbuffer[conn->reqindex].sequence = conn->current_seq; + conn->reqindex++; if (conn->reqindex == REQUEST_LOG_SIZE) conn->reqindex = 0; -#endif +} - conn->current_seq++; +static void +_fs_add_rep_log (FSFpePtr conn, fsGenericReply *rep) +{ + int i; + + for (i = 0; i < REQUEST_LOG_SIZE; i++) + if (conn->reqbuffer[i].sequence == rep->sequenceNumber) + break; + if (i == REQUEST_LOG_SIZE) + fprintf (stderr, "\t\t\t\t\tReply: %5d Opcode: unknown\n", + rep->sequenceNumber); + else + fprintf (stderr, "\t\t\t\t\tReply: %5d Opcode: %d\n", + rep->sequenceNumber, + conn->reqbuffer[i].opcode); } +#else +#define _fs_add_req_log(conn,op) ((conn)->current_seq++) +#define _fs_add_rep_log(conn,rep) +#endif static Bool -fs_name_check(name) - char *name; +fs_name_check(char *name) { +#ifdef __UNIXOS2__ + /* OS/2 uses D:/usr/X11R6/.... as fontfile pathnames, so check that + * there is not only a protocol/ prefix, but also that the first chars + * are not a drive letter + */ + if (name && isalpha(*name) && name[1] == ':') + return FALSE; +#endif /* Just make sure there is a protocol/ prefix */ - return (name && *name != '/' && strchr(name, '/')); } static void -_fs_client_resolution(conn) - FSFpePtr conn; +_fs_client_resolution(FSFpePtr conn) { fsSetResolutionReq srreq; int num_res; @@ -190,158 +244,18 @@ _fs_client_resolution(conn) } } -/* - * sends the stuff that's meaningful to a newly opened or reset FS - */ -static int -fs_send_init_packets(conn) - FSFpePtr conn; -{ - fsSetResolutionReq srreq; - fsSetCataloguesReq screq; - fsListCataloguesReq lcreq; - fsListCataloguesReply lcreply; - int num_cats, - clen, - len; - char *client_cat = (char *) 0, - *cp, - *sp, - *end; - int num_res; - FontResolutionPtr res; - int err = Successful; - -#define CATALOGUE_SEP '+' - - res = GetClientResolutions(&num_res); - if (num_res) { - srreq.reqType = FS_SetResolution; - srreq.num_resolutions = num_res; - srreq.length = (SIZEOF(fsSetResolutionReq) + - (num_res * SIZEOF(fsResolution)) + 3) >> 2; - - _fs_add_req_log(conn, FS_SetResolution); - if (_fs_write(conn, (char *) &srreq, SIZEOF(fsSetResolutionReq)) == -1) - { - err = BadFontPath; - goto fail; - } - if (_fs_write_pad(conn, (char *) res, (num_res * SIZEOF(fsResolution))) == -1) - { - err = BadFontPath; - goto fail; - } - } - sp = strrchr(conn->servername, '/'); - - /* don't get tricked by a non-existant catalogue list */ - if (sp == strchr(conn->servername, '/')) { - /* - * try original name -- this might be an alternate with no catalogues - */ - sp = strrchr(conn->requestedname, '/'); - if (sp == strchr(conn->requestedname, '/')) - sp = (char *) 0; - } - if (sp) { /* turn cats into counted list */ - sp++; - /* allocate more than enough room */ - cp = client_cat = (char *) xalloc(strlen(conn->servername)); - if (!cp) { - err = BadAlloc; - goto fail; - } - num_cats = 0; - while (*sp) { - end = strchr(sp, CATALOGUE_SEP); - if (!end) - end = sp + strlen(sp); - *cp++ = len = end - sp; - num_cats++; - memmove(cp, sp, len); - sp += len; - if (*sp == CATALOGUE_SEP) - sp++; - cp += len; - } - clen = cp - client_cat; - /* our list checked out, so send it */ - screq.reqType = FS_SetCatalogues; - screq.num_catalogues = num_cats; - screq.length = (SIZEOF(fsSetCataloguesReq) + clen + 3) >> 2; - - _fs_add_req_log(conn, FS_SetCatalogues); - if (_fs_write(conn, (char *) &screq, SIZEOF(fsSetCataloguesReq)) == -1) - { - err = BadFontPath; - goto fail; - } - if (_fs_write_pad(conn, (char *) client_cat, clen) == -1) - { - err = BadFontPath; - goto fail; - } - - /* - * now sync up with the font server, to see if an error was generated - * by a bogus catalogue - */ - lcreq.reqType = FS_ListCatalogues; - lcreq.length = (SIZEOF(fsListCataloguesReq)) >> 2; - lcreq.maxNames = 0; - lcreq.nbytes = 0; - _fs_add_req_log(conn, FS_SetCatalogues); - if (_fs_write(conn, (char *) &lcreq, SIZEOF(fsListCataloguesReq)) == -1) - { - err = BadFontPath; - goto fail; - } - - /* - * next bit will either by the ListCats reply, or an error followed by - * the reply - */ - if (_fs_read(conn, (char *) &lcreply, SIZEOF(fsGenericReply)) == -1) { - err = BadFontPath; - goto fail; - } - if (lcreply.type == FS_Error && - ((fsError *) & lcreply)->major_opcode == FS_SetCatalogues) { - _fs_eat_rest_of_error(conn, (fsError *) & lcreply); - /* get ListCats response */ - (void) _fs_read(conn, (char *) &lcreply, - SIZEOF(fsListCataloguesReply)); - err = BadFontPath; - goto fail; - } - /* must be reply, swallow the rest of it */ - _fs_eat_rest_of_error(conn, (fsError *) & lcreply); - } -fail: - xfree(client_cat); - return err; -} - /* * close font server and remove any state associated with * this connection - this includes any client records. */ static void -fs_close_conn(conn) - FSFpePtr conn; +fs_close_conn(FSFpePtr conn) { FSClientPtr client, nclient; - /* XXX - hack. The right fix is to remember that the font server - has gone away when we first discovered it. */ - if (conn->trans_conn) - (void) _FontTransClose (conn->trans_conn); - - if (conn->fs_fd != -1) - FD_CLR(conn->fs_fd, &_fs_fd_mask); - + _fs_close_server (conn); + for (client = conn->clients; client; client = nclient) { nclient = client->next; @@ -357,65 +271,76 @@ fs_close_conn(conn) */ /* ARGSUSED */ static int -fs_init_fpe(fpe) - FontPathElementPtr fpe; +fs_init_fpe(FontPathElementPtr fpe) { FSFpePtr conn; char *name; int err; + int ret; /* open font server */ /* create FS specific fpe info */ - errno = 0; - name = fpe->name; /* hack for old style names */ if (*name == ':') name++; /* skip ':' */ - conn = _fs_open_server(name); - if (conn) { - conn->requestedname = fpe->name; /* stash this for later init use */ - fpe->private = (pointer) conn; - err = fs_send_init_packets(conn); - if (err != Successful) { - fs_close_conn(conn); - xfree(conn->servername); - xfree(conn->alts); - xfree(conn); - return err; + conn = _fs_init_conn (name); + if (!conn) + err = AllocError; + else + { + err = init_fs_handlers (fpe, fs_block_handler); + if (err != Successful) + { + _fs_free_conn (conn); + err = AllocError; } - if (init_fs_handlers(fpe, fs_block_handler) != Successful) - return AllocError; - FD_SET(conn->fs_fd, &_fs_fd_mask); - conn->attemptReconnect = TRUE; - + else + { + fpe->private = conn; + conn->next = fs_fpes; + fs_fpes = conn; + ret = _fs_wait_connect (conn); + if (ret != FSIO_READY) + { + fs_free_fpe (fpe); + err = BadFontPath; + } + else + err = Successful; + } + } + + if (err == Successful) + { #ifdef NCD if (configData.ExtendedFontDiags) printf("Connected to font server \"%s\"\n", name); #endif - - return err; +#ifdef DEBUG + fprintf (stderr, "connected to FS \"%s\"\n", name); +#endif } - + else + { #ifdef DEBUG - fprintf(stderr, "failed to connect to FS \"%s\"\n", name); + fprintf(stderr, "failed to connect to FS \"%s\" %d\n", name, err); #endif - #ifdef NCD - if (configData.ExtendedFontDiags) - printf("Failed to connect to font server \"%s\"\n", name); + if (configData.ExtendedFontDiags) + printf("Failed to connect to font server \"%s\"\n", name); #endif - - return (errno == ENOMEM) ? AllocError : BadFontPath; + ; + } + return err; } static int -fs_reset_fpe(fpe) - FontPathElementPtr fpe; +fs_reset_fpe(FontPathElementPtr fpe) { - (void) fs_send_init_packets((FSFpePtr) fpe->private); + (void) _fs_send_init_packets((FSFpePtr) fpe->private); return Successful; } @@ -424,54 +349,44 @@ fs_reset_fpe(fpe) */ static int -fs_free_fpe(fpe) - FontPathElementPtr fpe; +fs_free_fpe(FontPathElementPtr fpe) { - FSFpePtr conn = (FSFpePtr) fpe->private; - FSFpePtr recon, - *prev; - prev = &awaiting_reconnect; - while (*prev) { - recon = *prev; - if (conn == recon) { - *prev = recon->next_reconnect; + FSFpePtr conn = (FSFpePtr) fpe->private, *prev; + + /* unhook from chain of all font servers */ + for (prev = &fs_fpes; *prev; prev = &(*prev)->next) + { + if (*prev == conn) + { + *prev = conn->next; break; } - prev = &recon->next_reconnect; } - + _fs_unmark_block (conn, conn->blockState); fs_close_conn(conn); - - remove_fs_handlers(fpe, fs_block_handler, - !XFD_ANYSET(&_fs_fd_mask) && !awaiting_reconnect); - - xfree(conn->alts); - xfree(conn->servername); - xfree(conn); + remove_fs_handlers(fpe, fs_block_handler, fs_fpes == 0); + _fs_free_conn (conn); fpe->private = (pointer) 0; #ifdef NCD if (configData.ExtendedFontDiags) printf("Disconnected from font server \"%s\"\n", fpe->name); #endif +#ifdef DEBUG + fprintf (stderr, "disconnect from FS \"%s\"\n", fpe->name); +#endif return Successful; } static FSBlockDataPtr -fs_new_block_rec(fpe, client, type) - FontPathElementPtr fpe; - pointer client; - int type; +fs_new_block_rec(FontPathElementPtr fpe, pointer client, int type) { FSBlockDataPtr blockrec, - br; - FSFpePtr fsfpe = (FSFpePtr) fpe->private; + *prev; + FSFpePtr conn = (FSFpePtr) fpe->private; int size; - blockrec = (FSBlockDataPtr) xalloc(sizeof(FSBlockDataRec)); - if (!blockrec) - return (FSBlockDataPtr) 0; switch (type) { case FS_OPEN_FONT: size = sizeof(FSBlockedFontRec); @@ -486,208 +401,301 @@ fs_new_block_rec(fpe, client, type) size = sizeof(FSBlockedListInfoRec); break; default: + size = 0; break; } - blockrec->data = (pointer) xalloc(size); - if (!blockrec->data) { - xfree(blockrec); + blockrec = (FSBlockDataPtr) xalloc(sizeof(FSBlockDataRec) + size); + if (!blockrec) return (FSBlockDataPtr) 0; - } + blockrec->data = (pointer) (blockrec + 1); blockrec->client = client; - blockrec->sequence_number = fsfpe->current_seq; + blockrec->sequenceNumber = -1; + blockrec->errcode = StillWorking; blockrec->type = type; blockrec->depending = 0; blockrec->next = (FSBlockDataPtr) 0; - + /* stick it on the end of the list (since its expected last) */ - br = (FSBlockDataPtr) fsfpe->blocked_requests; - if (!br) { - fsfpe->blocked_requests = (pointer) blockrec; - } else { - while (br->next) - br = br->next; - br->next = blockrec; - } + for (prev = &conn->blockedRequests; *prev; prev = &(*prev)->next) + ; + *prev = blockrec; return blockrec; } static void -_fs_remove_block_rec(conn, blockrec) - FSFpePtr conn; - FSBlockDataPtr blockrec; +_fs_set_pending_reply (FSFpePtr conn) { - FSBlockDataPtr br, - last; + FSBlockDataPtr blockrec; + + for (blockrec = conn->blockedRequests; blockrec; blockrec = blockrec->next) + if (blockrec->errcode == StillWorking) + break; + if (blockrec) + { + conn->blockedReplyTime = GetTimeInMillis () + FontServerRequestTimeout; + _fs_mark_block (conn, FS_PENDING_REPLY); + } + else + _fs_unmark_block (conn, FS_PENDING_REPLY); +} - last = (FSBlockDataPtr) 0; - br = (FSBlockDataPtr) conn->blocked_requests; - while (br) { - if (br == blockrec) { - if (last) - last->next = br->next; - else - conn->blocked_requests = (pointer) br->next; - if (br->type == FS_LOAD_GLYPHS) - { - FSBlockedGlyphPtr bglyph = (FSBlockedGlyphPtr)br->data; - if (bglyph->num_expected_ranges) - xfree(bglyph->expected_ranges); - } - xfree(br->data); - xfree(br); - return; +static void +_fs_remove_block_rec(FSFpePtr conn, FSBlockDataPtr blockrec) +{ + FSBlockDataPtr *prev; + + for (prev = &conn->blockedRequests; *prev; prev = &(*prev)->next) + if (*prev == blockrec) + { + *prev = blockrec->next; + break; } - last = br; - br = br->next; + if (blockrec->type == FS_LOAD_GLYPHS) + { + FSBlockedGlyphPtr bglyph = (FSBlockedGlyphPtr)blockrec->data; + if (bglyph->num_expected_ranges) + xfree(bglyph->expected_ranges); } + xfree(blockrec); + _fs_set_pending_reply (conn); } static void -signal_clients_depending(clients_depending) -FSClientsDependingPtr *clients_depending; +_fs_signal_clients_depending(FSClientsDependingPtr *clients_depending) { - FSClientsDependingPtr p = *clients_depending, p2; - *clients_depending = (FSClientsDependingPtr)0; - - while (p != (FSClientsDependingPtr)0) + FSClientsDependingPtr p; + + while ((p = *clients_depending)) { - p2 = p; + *clients_depending = p->next; ClientSignal(p->client); - p = p->next; - xfree(p2); + xfree(p); } } static int -add_clients_depending(clients_depending, client) -FSClientsDependingPtr *clients_depending; -pointer client; +_fs_add_clients_depending(FSClientsDependingPtr *clients_depending, pointer client) { - while (*clients_depending != (FSClientsDependingPtr)0) + FSClientsDependingPtr new, cd; + + for (; (cd = *clients_depending); + clients_depending = &(*clients_depending)->next) { - if ((*clients_depending)->client == client) return Suspended; - clients_depending = &(*clients_depending)->next; + if (cd->client == client) + return Suspended; } - *clients_depending = (FSClientsDependingPtr)xalloc( - sizeof(FSClientsDependingRec)); - if (!*clients_depending) + + new = (FSClientsDependingPtr)xalloc (sizeof (FSClientsDependingRec)); + if (!new) return BadAlloc; - (*clients_depending)->client = client; - (*clients_depending)->next = 0; + new->client = client; + new->next = 0; + *clients_depending = new; return Suspended; } +/* + * When a request is aborted due to a font server failure, + * signal any depending clients to restart their dependant + * requests + */ static void -clean_aborted_blockrec(blockrec) - FSBlockDataPtr blockrec; +_fs_clean_aborted_blockrec(FSFpePtr conn, FSBlockDataPtr blockrec) { - - switch(blockrec->type) - { - case FS_LOAD_GLYPHS: - { - FSBlockedGlyphPtr bglyph = (FSBlockedGlyphPtr)blockrec->data; - FontPtr pfont = bglyph->pfont; - int num_expected_ranges = bglyph->num_expected_ranges; - fsRange *expected_ranges = bglyph->expected_ranges; - _fs_clean_aborted_loadglyphs(pfont, - num_expected_ranges, - expected_ranges); - signal_clients_depending(&bglyph->clients_depending); - break; - } - case FS_OPEN_FONT: - { - FSBlockedFontPtr bfont = (FSBlockedFontPtr)blockrec->data; - signal_clients_depending(&bfont->clients_depending); - break; - } - default: - break; + switch(blockrec->type) { + case FS_OPEN_FONT: { + FSBlockedFontPtr bfont = (FSBlockedFontPtr)blockrec->data; + + fs_cleanup_bfont (bfont); + _fs_signal_clients_depending(&bfont->clients_depending); + break; + } + case FS_LOAD_GLYPHS: { + FSBlockedGlyphPtr bglyph = (FSBlockedGlyphPtr)blockrec->data; + + _fs_clean_aborted_loadglyphs(bglyph->pfont, + bglyph->num_expected_ranges, + bglyph->expected_ranges); + _fs_signal_clients_depending(&bglyph->clients_depending); + break; + } + case FS_LIST_FONTS: + break; + case FS_LIST_WITH_INFO: { + FSBlockedListInfoPtr binfo; + binfo = (FSBlockedListInfoPtr) blockrec->data; + if (binfo->status == FS_LFWI_REPLY) + FD_SET(conn->fs_fd, &_fs_fd_mask); + _fs_free_props (&binfo->info); + } + default: + break; } } static void -fs_abort_blockrec(conn, blockrec) - FSFpePtr conn; - FSBlockDataPtr blockrec; +fs_abort_blockrec(FSFpePtr conn, FSBlockDataPtr blockrec) { - clean_aborted_blockrec(blockrec); - _fs_remove_block_rec(conn, blockrec); + _fs_clean_aborted_blockrec (conn, blockrec); + _fs_remove_block_rec (conn, blockrec); } - +/* + * Tell the font server we've failed to complete an open and + * then unload the partially created font + */ static void -fs_free_font(bfont) - FSBlockedFontPtr bfont; +fs_cleanup_bfont (FSBlockedFontPtr bfont) { - FontPtr pfont; FSFontDataRec *fsd; - pfont = bfont->pfont; - fsd = (FSFontDataRec *) pfont->fpePrivate; - - /* xfree better be able to handle NULL */ - (*pfont->unload_font)(pfont); - DeleteFontClientID(fsd->fontid); - xfree(fsd->name); - xfree(pfont->info.isStringProp); - xfree(pfont->info.props); - - xfree(pfont); - xfree(fsd); - - bfont->pfont = (FontPtr) 0; + if (bfont->pfont) + { + fsd = (FSFontDataRec *) bfont->pfont->fpePrivate; + + /* make sure the FS knows we choked on it */ + fs_send_close_font(bfont->pfont->fpe, bfont->fontid); + + /* + * Either unload the font if it's being opened for + * the first time, or smash the generation field to + * mark this font as an orphan + */ + if (!(bfont->flags & FontReopen)) + { + if (bfont->freeFont) + (*bfont->pfont->unload_font) (bfont->pfont); +#ifdef DEBUG + else + fprintf (stderr, "Not freeing other font in cleanup_bfont\n"); +#endif + bfont->pfont = 0; + } + else + fsd->generation = -1; + } } -static void -_fs_cleanup_font(bfont) - FSBlockedFontPtr bfont; +/* + * Check to see if a complete reply is waiting + */ +static fsGenericReply * +fs_get_reply (FSFpePtr conn, int *error) { - FSFontDataRec *fsd; + char *buf; + fsGenericReply *rep; + int ret; - if (bfont->pfont) + /* block if the connection is down or paused in lfwi */ + if (conn->fs_fd == -1 || !FD_ISSET (conn->fs_fd, &_fs_fd_mask)) { - fsd = (FSFontDataRec *) bfont->pfont->fpePrivate; + *error = FSIO_BLOCK; + return 0; + } - /* make sure the FS knows we choked on it */ - fs_send_close_font(fsd->fpe, bfont->fontid); + ret = _fs_start_read (conn, sizeof (fsGenericReply), &buf); + if (ret != FSIO_READY) + { + *error = FSIO_BLOCK; + return 0; + } - fs_free_font(bfont); + rep = (fsGenericReply *) buf; + + ret = _fs_start_read (conn, rep->length << 2, &buf); + if (ret != FSIO_READY) + { + *error = FSIO_BLOCK; + return 0; } - bfont->errcode = AllocError; + + *error = FSIO_READY; + + return (fsGenericReply *) buf; } +static Bool +fs_reply_ready (FSFpePtr conn) +{ + fsGenericReply *rep; + + if (conn->fs_fd == -1 || !FD_ISSET (conn->fs_fd, &_fs_fd_mask)) + return FALSE; + if (fs_data_read (conn) < sizeof (fsGenericReply)) + return FALSE; + rep = (fsGenericReply *) (conn->inBuf.buf + conn->inBuf.remove); + if (fs_data_read (conn) < rep->length << 2) + return FALSE; + return TRUE; +} -static int -fs_read_open_font(fpe, blockrec) - FontPathElementPtr fpe; - FSBlockDataPtr blockrec; +static void +_fs_pending_reply (FSFpePtr conn) { - FSBlockedFontPtr bfont = (FSBlockedFontPtr) blockrec->data; - FSFpePtr conn = (FSFpePtr) fpe->private; - fsOpenBitmapFontReply rep; - FSBlockDataPtr blockOrig; - FSBlockedFontPtr origBfont; + if (!(conn->blockState & FS_PENDING_REPLY)) + { + _fs_mark_block (conn, FS_PENDING_REPLY); + conn->blockedReplyTime = GetTimeInMillis () + FontServerRequestTimeout; + } +} - /* pull out the OpenFont reply */ - memcpy(&rep, &blockrec->header, SIZEOF(fsGenericReply)); +static void +_fs_prepare_for_reply (FSFpePtr conn) +{ + _fs_pending_reply (conn); + _fs_flush (conn); +} - if (rep.type == FS_Error) { - _fs_eat_rest_of_error(conn, (fsError *) & rep); - return BadFontName; - } else { /* get rest of reply */ - if (_fs_read(conn, (char *) &rep + SIZEOF(fsGenericReply), - SIZEOF(fsOpenBitmapFontReply) - SIZEOF(fsGenericReply)) == -1) { - /* If we're not reopening a font, we'll allocate the - structures again after connection is reestablished. */ - if (!(bfont->flags & FontReopen)) fs_free_font(bfont); - return StillWorking; +/* + * Block (for a while) awaiting a complete reply + */ +static int +fs_await_reply (FSFpePtr conn) +{ + int ret; + + if (conn->blockState & FS_COMPLETE_REPLY) + return FSIO_READY; + + while (!fs_get_reply (conn, &ret)) + { + if (ret != FSIO_BLOCK) + return ret; + if (_fs_wait_for_readable (conn, FontServerRequestTimeout) != FSIO_READY) + { + _fs_connection_died (conn); + return FSIO_ERROR; } } + return FSIO_READY; +} +/* + * Process the reply to an OpenBitmapFont request + */ +static int +fs_read_open_font(FontPathElementPtr fpe, FSBlockDataPtr blockrec) +{ + FSFpePtr conn = (FSFpePtr) fpe->private; + FSBlockedFontPtr bfont = (FSBlockedFontPtr) blockrec->data; + fsOpenBitmapFontReply *rep; + FSBlockDataPtr blockOrig; + FSBlockedFontPtr origBfont; + int ret; + + rep = (fsOpenBitmapFontReply *) fs_get_reply (conn, &ret); + if (!rep || rep->type == FS_Error) + { + if (ret == FSIO_BLOCK) + return StillWorking; + if (rep) + _fs_done_read (conn, rep->length << 2); + fs_cleanup_bfont (bfont); + return BadFontName; + } + /* If we're not reopening a font and FS detected a duplicate font open request, replace our reference to the new font with a reference to an existing font (possibly one not finished @@ -697,23 +705,27 @@ fs_read_open_font(fpe, blockrec) if we we decide (in fs_read_query_info()) that we don't like what we got. */ - if (rep.otherid && !(bfont->flags & FontReopen)) { - (void) fs_send_close_font(fpe, bfont->fontid); - + if (rep->otherid && !(bfont->flags & FontReopen)) + { + fs_cleanup_bfont (bfont); + /* Find old font if we're completely done getting it from server. */ - fs_free_font(bfont); - bfont->pfont = find_old_font(rep.otherid); - bfont->fontid = rep.otherid; + bfont->pfont = find_old_font(rep->otherid); + bfont->freeFont = FALSE; + bfont->fontid = rep->otherid; bfont->state = FS_DONE_REPLY; /* * look for a blocked request to open the same font */ - for (blockOrig = (FSBlockDataPtr) conn->blocked_requests; + for (blockOrig = conn->blockedRequests; blockOrig; - blockOrig = blockOrig->next) { - if (blockOrig != blockrec && blockOrig->type == FS_OPEN_FONT) { + blockOrig = blockOrig->next) + { + if (blockOrig != blockrec && blockOrig->type == FS_OPEN_FONT) + { origBfont = (FSBlockedFontPtr) blockOrig->data; - if (origBfont->fontid == rep.otherid) { + if (origBfont->fontid == rep->otherid) + { blockrec->depending = blockOrig->depending; blockOrig->depending = blockrec; bfont->state = FS_DEPENDING; @@ -725,252 +737,267 @@ fs_read_open_font(fpe, blockrec) if (bfont->pfont == NULL) { /* XXX - something nasty happened */ - return BadFontName; + ret = BadFontName; } - return AccessDone; + else + ret = AccessDone; } - - bfont->pfont->info.cachable = rep.cachable != 0; - bfont->state = FS_INFO_REPLY; - /* ask for the next stage */ - (void) fs_send_query_info(fpe, blockrec); - return StillWorking; + else + { + bfont->pfont->info.cachable = rep->cachable != 0; + bfont->state = FS_INFO_REPLY; + /* + * Reset the blockrec for the next reply + */ + blockrec->sequenceNumber = bfont->queryInfoSequence; + conn->blockedReplyTime = GetTimeInMillis () + FontServerRequestTimeout; + ret = StillWorking; + } + _fs_done_read (conn, rep->length << 2); + return ret; } +static Bool +fs_fonts_match (FontInfoPtr pInfo1, FontInfoPtr pInfo2) +{ + int i; + + if (pInfo1->firstCol != pInfo2->firstCol || + pInfo1->lastCol != pInfo2->lastCol || + pInfo1->firstRow != pInfo2->firstRow || + pInfo1->lastRow != pInfo2->lastRow || + pInfo1->defaultCh != pInfo2->defaultCh || + pInfo1->noOverlap != pInfo2->noOverlap || + pInfo1->terminalFont != pInfo2->terminalFont || + pInfo1->constantMetrics != pInfo2->constantMetrics || + pInfo1->constantWidth != pInfo2->constantWidth || + pInfo1->inkInside != pInfo2->inkInside || + pInfo1->inkMetrics != pInfo2->inkMetrics || + pInfo1->allExist != pInfo2->allExist || + pInfo1->drawDirection != pInfo2->drawDirection || + pInfo1->cachable != pInfo2->cachable || + pInfo1->anamorphic != pInfo2->anamorphic || + pInfo1->maxOverlap != pInfo2->maxOverlap || + pInfo1->fontAscent != pInfo2->fontAscent || + pInfo1->fontDescent != pInfo2->fontDescent || + pInfo1->nprops != pInfo2->nprops) + return FALSE; + +#define MATCH(xci1, xci2) \ + (((xci1).leftSideBearing == (xci2).leftSideBearing) && \ + ((xci1).rightSideBearing == (xci2).rightSideBearing) && \ + ((xci1).characterWidth == (xci2).characterWidth) && \ + ((xci1).ascent == (xci2).ascent) && \ + ((xci1).descent == (xci2).descent) && \ + ((xci1).attributes == (xci2).attributes)) + + if (!MATCH(pInfo1->maxbounds, pInfo2->maxbounds) || + !MATCH(pInfo1->minbounds, pInfo2->minbounds) || + !MATCH(pInfo1->ink_maxbounds, pInfo2->ink_maxbounds) || + !MATCH(pInfo1->ink_minbounds, pInfo2->ink_minbounds)) + return FALSE; + +#undef MATCH + + for (i = 0; i < pInfo1->nprops; i++) + if (pInfo1->isStringProp[i] != + pInfo2->isStringProp[i] || + pInfo1->props[i].name != + pInfo2->props[i].name || + pInfo1->props[i].value != + pInfo2->props[i].value) + { + return FALSE; + } + return TRUE; +} static int -fs_read_query_info(fpe, blockrec) - FontPathElementPtr fpe; - FSBlockDataPtr blockrec; +fs_read_query_info(FontPathElementPtr fpe, FSBlockDataPtr blockrec) { - FSBlockedFontPtr bfont = (FSBlockedFontPtr) blockrec->data; - FSFpePtr conn = (FSFpePtr) fpe->private; - fsQueryXInfoReply rep; - fsPropInfo pi; - fsPropOffset *po; - pointer pd; - unsigned long prop_len; - FSBlockedFontRec newbfont, *oldbfont; - FontRec newpfont, *oldpfont; - int err; - + FSBlockedFontPtr bfont = (FSBlockedFontPtr) blockrec->data; + FSFpePtr conn = (FSFpePtr) fpe->private; + fsQueryXInfoReply *rep; + char *buf; + fsPropInfo *pi; + fsPropOffset *po; + pointer pd; + FontInfoPtr pInfo; + FontInfoRec tempInfo; + int err; + int ret; + + rep = (fsQueryXInfoReply *) fs_get_reply (conn, &ret); + if (!rep || rep->type == FS_Error) + { + if (ret == FSIO_BLOCK) + return StillWorking; + if (rep) + _fs_done_read (conn, rep->length << 2); + fs_cleanup_bfont (bfont); + return BadFontName; + } + /* If this is a reopen, accumulate the query info into a dummy font and compare to our original data. */ if (bfont->flags & FontReopen) - { - newbfont = *(oldbfont = bfont); - bfont = &newbfont; - newpfont = *(oldpfont = oldbfont->pfont); - newpfont.info.isStringProp = NULL; - newpfont.info.props = NULL; - newbfont.pfont = &newpfont; - err = StillWorking; - } - - /* pull out the QueryXInfo reply */ - memcpy(&rep, &blockrec->header, SIZEOF(fsGenericReply)); - if (_fs_read(conn, (char *) &rep + SIZEOF(fsGenericReply), - SIZEOF(fsQueryXInfoReply) - SIZEOF(fsGenericReply)) == -1) { - if (bfont->flags & FontReopen) goto bail; - fs_free_font(bfont); - return StillWorking; - } + pInfo = &tempInfo; + else + pInfo = &bfont->pfont->info; + + buf = (char *) rep; + buf += SIZEOF(fsQueryXInfoReply); + /* move the data over */ - fsUnpack_XFontInfoHeader(&rep, &bfont->pfont->info); - _fs_init_fontinfo(conn, &bfont->pfont->info); + fsUnpack_XFontInfoHeader(rep, pInfo); + + /* compute accelerators */ + _fs_init_fontinfo(conn, pInfo); - if (bfont->pfont->info.terminalFont) - { - bfont->format = - (bfont->format & ~ (BitmapFormatImageRectMask)) | - BitmapFormatImageRectMax; - } + /* Compute offsets into the reply */ + pi = (fsPropInfo *) buf; + buf += SIZEOF (fsPropInfo); + + po = (fsPropOffset *) buf; + buf += pi->num_offsets * SIZEOF(fsPropOffset); - if (_fs_read(conn, (char *) &pi, SIZEOF(fsPropInfo)) == -1) { - if (bfont->flags & FontReopen) goto bail; - fs_free_font(bfont); - return StillWorking; - } - prop_len = pi.num_offsets * SIZEOF(fsPropOffset); - po = (fsPropOffset *) xalloc(prop_len); - pd = (pointer) xalloc(pi.data_len); - if (!po || !pd) { - xfree(pd); - xfree(po); - /* clear the wire */ - (void) _fs_drain_bytes(conn, prop_len + pi.data_len); - /* clean up the font */ - if (bfont->flags & FontReopen) { err = AllocError ; goto bail; } - (void) _fs_cleanup_font(bfont); - return AllocError; - } - if (_fs_read_pad(conn, (char *) po, prop_len) == -1 || - _fs_read_pad(conn, (char *) pd, pi.data_len) == -1) { - xfree(pd); - xfree(po); - if (bfont->flags & FontReopen) goto bail; - fs_free_font(bfont); - return StillWorking; - } - if (_fs_convert_props(&pi, po, pd, &bfont->pfont->info) == -1) + pd = (pointer) buf; + buf += pi->data_len; + + /* convert the properties and step over the reply */ + ret = _fs_convert_props(pi, po, pd, pInfo); + _fs_done_read (conn, rep->length << 2); + + if (ret == -1) { - xfree(po); - xfree(pd); - if (bfont->flags & FontReopen) { err = AllocError ; goto bail; } - (void) _fs_cleanup_font(bfont); + fs_cleanup_bfont (bfont); return AllocError; } - xfree(po); - xfree(pd); if (bfont->flags & FontReopen) { - int i; - - err = BadFontName; - /* We're reopening a font that we lost because of a downed connection. In the interest of avoiding corruption from opening a different font than the old one (we already have its metrics, extents, and probably some of its glyphs), verify that the metrics and properties all match. */ - if (newpfont.info.firstCol != oldpfont->info.firstCol || - newpfont.info.lastCol != oldpfont->info.lastCol || - newpfont.info.firstRow != oldpfont->info.firstRow || - newpfont.info.lastRow != oldpfont->info.lastRow || - newpfont.info.defaultCh != oldpfont->info.defaultCh || - newpfont.info.noOverlap != oldpfont->info.noOverlap || - newpfont.info.terminalFont != oldpfont->info.terminalFont || - newpfont.info.constantMetrics != oldpfont->info.constantMetrics || - newpfont.info.constantWidth != oldpfont->info.constantWidth || - newpfont.info.inkInside != oldpfont->info.inkInside || - newpfont.info.inkMetrics != oldpfont->info.inkMetrics || - newpfont.info.allExist != oldpfont->info.allExist || - newpfont.info.drawDirection != oldpfont->info.drawDirection || - newpfont.info.cachable != oldpfont->info.cachable || - newpfont.info.anamorphic != oldpfont->info.anamorphic || - newpfont.info.maxOverlap != oldpfont->info.maxOverlap || - newpfont.info.fontAscent != oldpfont->info.fontAscent || - newpfont.info.fontDescent != oldpfont->info.fontDescent || - newpfont.info.nprops != oldpfont->info.nprops) - goto bail; - -#define MATCH(xci1, xci2) \ - (((xci1).leftSideBearing == (xci2).leftSideBearing) && \ - ((xci1).rightSideBearing == (xci2).rightSideBearing) && \ - ((xci1).characterWidth == (xci2).characterWidth) && \ - ((xci1).ascent == (xci2).ascent) && \ - ((xci1).descent == (xci2).descent) && \ - ((xci1).attributes == (xci2).attributes)) - - if (!MATCH(newpfont.info.maxbounds, oldpfont->info.maxbounds) || - !MATCH(newpfont.info.minbounds, oldpfont->info.minbounds) || - !MATCH(newpfont.info.ink_maxbounds, oldpfont->info.ink_maxbounds) || - !MATCH(newpfont.info.ink_minbounds, oldpfont->info.ink_minbounds)) - goto bail; - -#undef MATCH - - for (i = 0; i < newpfont.info.nprops; i++) - if (newpfont.info.isStringProp[i] != - oldpfont->info.isStringProp[i] || - newpfont.info.props[i].name != - oldpfont->info.props[i].name || - newpfont.info.props[i].value != - oldpfont->info.props[i].value) - goto bail; - - err = Successful; - bail: - if (err != Successful && err != StillWorking) + if (fs_fonts_match (pInfo, &bfont->pfont->info)) { - /* Failure. Close the font. */ - fs_send_close_font(((FSFontDataPtr)oldpfont->fpePrivate)->fpe, - bfont->fontid); - ((FSFontDataPtr)oldpfont->fpePrivate)->generation = -1; + err = Successful; + bfont->state = FS_DONE_REPLY; } - xfree(newpfont.info.isStringProp); - xfree(newpfont.info.props); - - if (err == Successful) oldbfont->state = FS_DONE_REPLY; + else + { + fs_cleanup_bfont (bfont); + err = BadFontName; + } + _fs_free_props (pInfo); + return err; } + /* + * Ask for terminal format fonts if possible + */ + if (bfont->pfont->info.terminalFont) + bfont->format = ((bfont->format & ~ (BitmapFormatImageRectMask)) | + BitmapFormatImageRectMax); + + /* + * Figure out if the whole font should get loaded right now. + */ if (glyphCachingMode == CACHING_OFF || - glyphCachingMode == CACHE_16_BIT_GLYPHS && !bfont->pfont->info.lastRow) + (glyphCachingMode == CACHE_16_BIT_GLYPHS + && !bfont->pfont->info.lastRow)) + { bfont->flags |= FontLoadAll; + } + + /* + * Ready to send the query bitmaps; the terminal font bit has + * been computed and glyphCaching has been considered + */ + if (bfont->flags & FontLoadBitmaps) + { + fs_send_query_bitmaps (fpe, blockrec); + _fs_flush (conn); + } bfont->state = FS_EXTENT_REPLY; - fs_send_query_extents(fpe, blockrec); + /* + * Reset the blockrec for the next reply + */ + blockrec->sequenceNumber = bfont->queryExtentsSequence; + conn->blockedReplyTime = GetTimeInMillis () + FontServerRequestTimeout; + return StillWorking; } static int -fs_read_extent_info(fpe, blockrec) - FontPathElementPtr fpe; - FSBlockDataPtr blockrec; +fs_read_extent_info(FontPathElementPtr fpe, FSBlockDataPtr blockrec) { - FSBlockedFontPtr bfont = (FSBlockedFontPtr) blockrec->data; - FSFontDataPtr fsd = (FSFontDataPtr) bfont->pfont->fpePrivate; - FSFpePtr conn = (FSFpePtr) fpe->private; - fsQueryXExtents16Reply rep; - int i; - int numInfos; - Bool haveInk = FALSE; /* need separate ink metrics? */ - CharInfoPtr ci, - pCI; - FSFontPtr fsfont = (FSFontPtr) bfont->pfont->fontPrivate; - fsXCharInfo *fsci; - fsXCharInfo fscilocal; - pointer fscip; - - /* read the QueryXExtents reply */ - memcpy(&rep, &blockrec->header, SIZEOF(fsGenericReply)); - if (_fs_read(conn, (char *) &rep + SIZEOF(fsGenericReply), - SIZEOF(fsQueryXExtents16Reply) - SIZEOF(fsGenericReply)) == -1) { - fs_free_font(bfont); - return StillWorking; + FSFpePtr conn = (FSFpePtr) fpe->private; + FSBlockedFontPtr bfont = (FSBlockedFontPtr) blockrec->data; + FSFontDataPtr fsd = (FSFontDataPtr) bfont->pfont->fpePrivate; + FSFontPtr fsfont = (FSFontPtr) bfont->pfont->fontPrivate; + fsQueryXExtents16Reply *rep; + char *buf; + int i; + int numExtents; + int numInfos; + int ret; + Bool haveInk = FALSE; /* need separate ink metrics? */ + CharInfoPtr ci, pCI; + char *fsci; + fsXCharInfo fscilocal; + + rep = (fsQueryXExtents16Reply *) fs_get_reply (conn, &ret); + if (!rep || rep->type == FS_Error) + { + if (ret == FSIO_BLOCK) + return StillWorking; + if (rep) + _fs_done_read (conn, rep->length << 2); + fs_cleanup_bfont (bfont); + return BadFontName; } + /* move the data over */ /* need separate inkMetrics for fixed font server protocol version */ - numInfos = rep.num_extents; + numExtents = rep->num_extents; + numInfos = numExtents; if (bfont->pfont->info.terminalFont && conn->fsMajorVersion > 1) { numInfos *= 2; haveInk = TRUE; } ci = pCI = (CharInfoPtr) xalloc(sizeof(CharInfoRec) * numInfos); -/* XXX this could be done with an ALLOCATE_LOCAL */ - fsci = (fsXCharInfo *) xalloc(SIZEOF(fsXCharInfo) * rep.num_extents); - if (!pCI || !fsci) { - xfree(pCI); - xfree(fsci); - /* clear the unusable data */ - _fs_drain_bytes(conn, SIZEOF(fsXCharInfo) * rep.num_extents); - _fs_cleanup_font(bfont); + + if (!pCI) + { + _fs_done_read (conn, rep->length << 2); + fs_cleanup_bfont(bfont); return AllocError; } fsfont->encoding = pCI; if (haveInk) - fsfont->inkMetrics = pCI + rep.num_extents; + fsfont->inkMetrics = pCI + numExtents; else fsfont->inkMetrics = pCI; - if (_fs_read_pad(conn, (char *) fsci, - SIZEOF(fsXCharInfo) * rep.num_extents) == -1) { - fs_free_font(bfont); - xfree(fsci); - return StillWorking; - } + buf = (char *) rep; + buf += SIZEOF (fsQueryXExtents16Reply); + fsci = buf; + fsd->glyphs_to_get = 0; - fscip = (pointer) fsci; ci = fsfont->inkMetrics; - for (i = 0; i < rep.num_extents; i++) { - memcpy(&fscilocal, fscip, SIZEOF(fsXCharInfo)); /* align it */ + for (i = 0; i < numExtents; i++) + { + memcpy(&fscilocal, fsci, SIZEOF(fsXCharInfo)); /* align it */ _fs_convert_char_info(&fscilocal, &ci->metrics); - fscip += SIZEOF(fsXCharInfo); + fsci = fsci + SIZEOF(fsXCharInfo); /* Initialize the bits field for later glyph-caching use */ if (NONZEROMETRICS(&ci->metrics)) { @@ -989,8 +1016,9 @@ fs_read_extent_info(fpe, blockrec) ci++; } - xfree(fsci); - + /* Done with reply */ + _fs_done_read (conn, rep->length << 2); + /* build bitmap metrics, ImageRectMax style */ if (haveInk) { @@ -999,7 +1027,7 @@ fs_read_extent_info(fpe, blockrec) ci = fsfont->encoding; ii = fsfont->inkMetrics; - for (i = 0; i < rep.num_extents; i++, ci++, ii++) + for (i = 0; i < numExtents; i++, ci++, ii++) { if (NONZEROMETRICS(&ii->metrics)) { @@ -1042,164 +1070,190 @@ fs_read_extent_info(fpe, blockrec) } bfont->state = FS_GLYPHS_REPLY; - if (bfont->flags & FontLoadBitmaps) { - fs_send_query_bitmaps(fpe, blockrec); + if (bfont->flags & FontLoadBitmaps) + { + /* + * Reset the blockrec for the next reply + */ + blockrec->sequenceNumber = bfont->queryBitmapsSequence; + conn->blockedReplyTime = GetTimeInMillis () + FontServerRequestTimeout; return StillWorking; } return Successful; } -/* - * XXX should probably continue to read here if we can, but must be sure - * it's our packet waiting, rather than another interspersed - */ +#ifdef DEBUG +static char *fs_open_states[] = { + "OPEN_REPLY ", + "INFO_REPLY ", + "EXTENT_REPLY", + "GLYPHS_REPLY", + "DONE_REPLY ", + "DEPENDING ", +}; +#endif + static int -fs_do_open_font(fpe, blockrec, readheader) - FontPathElementPtr fpe; - FSBlockDataPtr blockrec; - Bool readheader; +fs_do_open_font(FontPathElementPtr fpe, FSBlockDataPtr blockrec) { - FSBlockedFontPtr bfont = (FSBlockedFontPtr) blockrec->data; - FSFpePtr conn = (FSFpePtr) fpe->private; - int err; + FSBlockedFontPtr bfont = (FSBlockedFontPtr) blockrec->data; + int err; +#ifdef DEBUG + fprintf (stderr, "fs_do_open_font state %s %s\n", + fs_open_states[bfont->state], + ((FSFontDataPtr) (bfont->pfont->fpePrivate))->name); +#endif + err = BadFontName; switch (bfont->state) { case FS_OPEN_REPLY: - if (readheader) { - /* get the next header */ - if (_fs_read(conn, (char *) &blockrec->header, - SIZEOF(fsGenericReply)) == -1) { - fs_free_font(bfont); - err = StillWorking; - break; - } - } - bfont->errcode = fs_read_open_font(fpe, blockrec); - if (bfont->errcode != StillWorking) { /* already loaded, or error */ + err = fs_read_open_font(fpe, blockrec); + if (err != StillWorking) { /* already loaded, or error */ /* if font's already loaded, massage error code */ switch (bfont->state) { case FS_DONE_REPLY: - bfont->errcode = Successful; + err = Successful; break; case FS_DEPENDING: - bfont->errcode = StillWorking; - break; - } - err = bfont->errcode; - break; - } - /* if more data to read or Sync, fall thru, else return */ - if (!(bfont->flags & FontOpenSync)) { - err = bfont->errcode; - break; - } else { - if (_fs_read(conn, (char *) &blockrec->header, - SIZEOF(fsGenericReply)) == -1) { - fs_free_font(bfont); err = StillWorking; break; } } - /* fall through */ + break; case FS_INFO_REPLY: - bfont->errcode = fs_read_query_info(fpe, blockrec); - if (bfont->errcode != StillWorking) { - err = bfont->errcode; - break; - } - if (!(bfont->flags & FontOpenSync)) { - err = bfont->errcode; - break; - /* if more data to read, fall thru, else return */ - } else { - if (_fs_read(conn, (char *) &blockrec->header, - SIZEOF(fsGenericReply))) { - fs_free_font(bfont); - err = StillWorking; - break; - } - } - /* fall through */ + err = fs_read_query_info(fpe, blockrec); + break; case FS_EXTENT_REPLY: - bfont->errcode = fs_read_extent_info(fpe, blockrec); - if (bfont->errcode != StillWorking) { - err = bfont->errcode; - break; - } - if (!(bfont->flags & FontOpenSync)) { - err = bfont->errcode; - break; - } else if (bfont->flags & FontLoadBitmaps) { - if (_fs_read(conn, (char *) &blockrec->header, - SIZEOF(fsGenericReply))) { - fs_free_font(bfont); - err = StillWorking; - break; - } - } - /* fall through */ + err = fs_read_extent_info(fpe, blockrec); + break; case FS_GLYPHS_REPLY: - if (bfont->flags & FontLoadBitmaps) { - bfont->errcode = fs_read_glyphs(fpe, blockrec); - } - err = bfont->errcode; + if (bfont->flags & FontLoadBitmaps) + err = fs_read_glyphs(fpe, blockrec); break; case FS_DEPENDING: /* can't happen */ - err = bfont->errcode; default: - err = bfont->errcode; break; } - if (err != StillWorking) { +#ifdef DEBUG + fprintf (stderr, "fs_do_open_font err %d\n", err); +#endif + if (err != StillWorking) + { bfont->state = FS_DONE_REPLY; /* for _fs_load_glyphs() */ - while (blockrec = blockrec->depending) { + while ((blockrec = blockrec->depending)) + { bfont = (FSBlockedFontPtr) blockrec->data; - bfont->errcode = err; bfont->state = FS_DONE_REPLY; /* for _fs_load_glyphs() */ } } return err; } +void +_fs_mark_block (FSFpePtr conn, CARD32 mask) +{ + conn->blockState |= mask; + fs_blockState |= mask; +} + +void +_fs_unmark_block (FSFpePtr conn, CARD32 mask) +{ + FSFpePtr c; + + if (conn->blockState & mask) + { + conn->blockState &= ~mask; + fs_blockState = 0; + for (c = fs_fpes; c; c = c->next) + fs_blockState |= c->blockState; + } +} + /* ARGSUSED */ static void -fs_block_handler(data, wt, LastSelectMask) - pointer data; - struct timeval **wt; - fd_set* LastSelectMask; -{ - static struct timeval recon_timeout; - Time_t now, - soonest; - FSFpePtr recon; - - XFD_ORSET(LastSelectMask, LastSelectMask, &_fs_fd_mask); - if (recon = awaiting_reconnect) { - now = time((Time_t *) 0); - soonest = recon->time_to_try; - while (recon = recon->next_reconnect) { - if (recon->time_to_try < soonest) - soonest = recon->time_to_try; - } - if (soonest < now) - soonest = now; - soonest = soonest - now; - recon_timeout.tv_sec = soonest; - recon_timeout.tv_usec = 0; - if (*wt == (struct timeval *) 0) { - *wt = &recon_timeout; - } else if ((*wt)->tv_sec > soonest) { - **wt = recon_timeout; +fs_block_handler(pointer data, OSTimePtr wt, pointer LastSelectMask) +{ + static struct timeval block_timeout; + CARD32 now, earliest, wakeup; + int soonest; + FSFpePtr conn; + + XFD_ORSET((fd_set *)LastSelectMask, (fd_set *)LastSelectMask, + &_fs_fd_mask); + /* + * Flush all pending output + */ + if (fs_blockState & FS_PENDING_WRITE) + for (conn = fs_fpes; conn; conn = conn->next) + if (conn->blockState & FS_PENDING_WRITE) + _fs_flush (conn); + /* + * Check for any fpe with a complete reply, set sleep time to zero + */ + if (fs_blockState & FS_COMPLETE_REPLY) + { + block_timeout.tv_sec = 0; + block_timeout.tv_usec = 0; + if (*wt == NULL) + *wt = &block_timeout; + else + **wt = block_timeout; + } + /* + * Walk through fpe list computing sleep time + */ + else if (fs_blockState & (FS_BROKEN_WRITE| + FS_BROKEN_CONNECTION| + FS_PENDING_REPLY| + FS_RECONNECTING)) + { + now = GetTimeInMillis (); + earliest = now + 10000000; + for (conn = fs_fpes; conn; conn = conn->next) + { + if (conn->blockState & FS_RECONNECTING) + { + wakeup = conn->blockedConnectTime; + if (TimeCmp (wakeup, <, earliest)) + earliest = wakeup; + } + if (conn->blockState & FS_BROKEN_CONNECTION) + { + wakeup = conn->brokenConnectionTime; + if (TimeCmp (wakeup, <, earliest)) + earliest = wakeup; + } + if (conn->blockState & FS_BROKEN_WRITE) + { + wakeup = conn->brokenWriteTime; + if (TimeCmp (wakeup, <, earliest)) + earliest = wakeup; + } + if (conn->blockState & FS_PENDING_REPLY) + { + wakeup = conn->blockedReplyTime; + if (TimeCmp (wakeup, <, earliest)) + earliest = wakeup; + } } + soonest = earliest - now; + if (soonest < 0) + soonest = 0; + block_timeout.tv_sec = soonest / 1000; + block_timeout.tv_usec = (soonest % 1000) * 1000; + if (*wt == NULL) + *wt = &block_timeout; + else if (soonest < (*wt)->tv_sec * 1000 + (*wt)->tv_usec / 1000) + **wt = block_timeout; } } static void -fs_handle_unexpected(conn, rep) - FSFpePtr conn; - fsGenericReply *rep; +fs_handle_unexpected(FSFpePtr conn, fsGenericReply *rep) { - if (rep->type == FS_Event && rep->data1 == KeepAlive) { + if (rep->type == FS_Event && rep->data1 == KeepAlive) + { fsNoopReq req; /* ping it back */ @@ -1209,155 +1263,223 @@ fs_handle_unexpected(conn, rep) _fs_write(conn, (char *) &req, SIZEOF(fsNoopReq)); } /* this should suck up unexpected replies and events */ - _fs_eat_rest_of_error(conn, (fsError *) rep); + _fs_done_read (conn, rep->length << 2); } -static int -fs_wakeup(fpe, LastSelectMask) - FontPathElementPtr fpe; - fd_set* LastSelectMask; +static void +fs_read_reply (FontPathElementPtr fpe, pointer client) { - FSBlockDataPtr blockrec, - br; - FSFpePtr conn = (FSFpePtr) fpe->private; - int err; - fsGenericReply rep; + FSFpePtr conn = (FSFpePtr) fpe->private; + FSBlockDataPtr blockrec; + int ret; + int err; + fsGenericReply *rep; + + if ((rep = fs_get_reply (conn, &ret))) + { + _fs_add_rep_log (conn, rep); + for (blockrec = conn->blockedRequests; + blockrec; + blockrec = blockrec->next) + { + if (blockrec->sequenceNumber == rep->sequenceNumber) + break; + } + err = Successful; + if (!blockrec) + { + fs_handle_unexpected(conn, rep); + } + else + { + /* + * go read it, and if we're done, + * wake up the appropriate client + */ + switch (blockrec->type) { + case FS_OPEN_FONT: + blockrec->errcode = fs_do_open_font(fpe, blockrec); + break; + case FS_LOAD_GLYPHS: + blockrec->errcode = fs_read_glyphs(fpe, blockrec); + break; + case FS_LIST_FONTS: + blockrec->errcode = fs_read_list(fpe, blockrec); + break; + case FS_LIST_WITH_INFO: + blockrec->errcode = fs_read_list_info(fpe, blockrec); + break; + default: + break; + } + err = blockrec->errcode; + if (err != StillWorking) + { + while (blockrec) + { + blockrec->errcode = err; + if (client != blockrec->client) + ClientSignal(blockrec->client); + blockrec = blockrec->depending; + } + _fs_unmark_block (conn, FS_PENDING_REPLY); + } + } + if (fs_reply_ready (conn)) + _fs_mark_block (conn, FS_COMPLETE_REPLY); + else + _fs_unmark_block (conn, FS_COMPLETE_REPLY); + } +} - /* see if there's any data to be read */ +static int +fs_wakeup(FontPathElementPtr fpe, unsigned long *mask) +{ + fd_set *LastSelectMask = (fd_set *) mask; + FSFpePtr conn = (FSFpePtr) fpe->private; /* * Don't continue if the fd is -1 (which will be true when the * font server terminates */ - if (conn->fs_fd == -1) - return FALSE; - - if (FD_ISSET(conn->fs_fd, LastSelectMask)) { + if ((conn->blockState & FS_RECONNECTING)) + _fs_check_reconnect (conn); + else if ((conn->blockState & FS_COMPLETE_REPLY) || + (conn->fs_fd != -1 && FD_ISSET(conn->fs_fd, LastSelectMask))) + fs_read_reply (fpe, 0); + if (conn->blockState & (FS_PENDING_REPLY|FS_BROKEN_CONNECTION|FS_BROKEN_WRITE)) + _fs_do_blocked (conn); +#ifdef DEBUG + { + FSBlockDataPtr blockrec; + FSBlockedFontPtr bfont; + FSBlockedListPtr blist; + static CARD32 lastState; + static FSBlockDataPtr lastBlock; -#ifdef NOTDEF /* bogus - doesn't deal with EOF very well, - * now does it ... */ - /* - * make sure it isn't spurious - mouse events seem to trigger extra - * problems - */ - if (_fs_data_ready(conn) <= 0) { - return FALSE; + if (conn->blockState || conn->blockedRequests || lastState || lastBlock) + { + fprintf (stderr, " Block State 0x%x\n", (int) conn->blockState); + lastState = conn->blockState; + lastBlock = conn->blockedRequests; } -#endif - - /* get the header */ - if (_fs_read(conn, (char *) &rep, SIZEOF(fsGenericReply)) == -1) - return FALSE; - - /* find the matching block record */ - - for (br = (FSBlockDataPtr) conn->blocked_requests; br; br = br->next) { - if ((CARD16)(br->sequence_number & 0xffff) == - (CARD16)(rep.sequenceNumber - 1)) + for (blockrec = conn->blockedRequests; blockrec; blockrec = blockrec->next) + { + switch (blockrec->type) { + case FS_OPEN_FONT: + bfont = (FSBlockedFontPtr) blockrec->data; + fprintf (stderr, " Blocked font errcode %d sequence %d state %s %s\n", + blockrec->errcode, + blockrec->sequenceNumber, + fs_open_states[bfont->state], + bfont->pfont ? + ((FSFontDataPtr) (bfont->pfont->fpePrivate))->name : + "<freed>"); + break; + case FS_LIST_FONTS: + blist = (FSBlockedListPtr) blockrec->data; + fprintf (stderr, " Blocked list errcode %d sequence %d\n", + blockrec->errcode, blockrec->sequenceNumber); + break; + default: + fprintf (stderr, " Blocked type %d errcode %d sequence %d\n", + blockrec->type, + blockrec->errcode, + blockrec->sequenceNumber); break; - } - if (!br) { - fs_handle_unexpected(conn, &rep); - return FALSE; - } - blockrec = br; - - memcpy(&blockrec->header, &rep, SIZEOF(fsGenericReply)); - - /* go read it, and if we're done, wake up the appropriate client */ - switch (blockrec->type) { - case FS_OPEN_FONT: - err = fs_do_open_font(fpe, blockrec, FALSE); - break; - case FS_LOAD_GLYPHS: - err = fs_read_glyphs(fpe, blockrec); - break; - case FS_LIST_FONTS: - err = fs_read_list(fpe, blockrec); - break; - case FS_LIST_WITH_INFO: - err = fs_read_list_info(fpe, blockrec); - break; - default: - break; - } - - if (err != StillWorking) { - while (blockrec) { - ClientSignal(blockrec->client); - blockrec = blockrec->depending; } } - /* - * Xx we could loop here and eat any additional replies, but it should - * feel more responsive for other clients if we come back later - */ - } else if (awaiting_reconnect) { - _fs_try_reconnect(); } +#endif return FALSE; } /* - * Reconnection code + * Notice a dead connection and prepare for reconnect */ void -_fs_connection_died(conn) - FSFpePtr conn; +_fs_connection_died(FSFpePtr conn) { - if (!conn->attemptReconnect) + if (conn->blockState & FS_BROKEN_CONNECTION) return; - conn->attemptReconnect = FALSE; fs_close_conn(conn); - conn->time_to_try = time((Time_t *) 0) + FS_RECONNECT_WAIT; - conn->reconnect_delay = FS_RECONNECT_WAIT; - conn->fs_fd = -1; - conn->trans_conn = NULL; - conn->next_reconnect = awaiting_reconnect; - awaiting_reconnect = conn; + conn->brokenConnectionTime = GetTimeInMillis (); + _fs_mark_block (conn, FS_BROKEN_CONNECTION); + _fs_unmark_block (conn, FS_BROKEN_WRITE|FS_PENDING_WRITE|FS_RECONNECTING); } +/* + * Signal clients that the connection has come back up + */ static int -_fs_restart_connection(conn) - FSFpePtr conn; +_fs_restart_connection(FSFpePtr conn) { FSBlockDataPtr block; - conn->current_seq = 0; - FD_SET(conn->fs_fd, &_fs_fd_mask); - if (!fs_send_init_packets(conn)) - return FALSE; - while (block = (FSBlockDataPtr) conn->blocked_requests) { - ClientSignal(block->client); - fs_abort_blockrec(conn, block); + _fs_unmark_block (conn, FS_GIVE_UP); + while ((block = (FSBlockDataPtr) conn->blockedRequests)) + { + if (block->errcode == StillWorking) + { + ClientSignal(block->client); + fs_abort_blockrec(conn, block); + } } return TRUE; } +/* + * Declare this font server connection useless + */ static void -_fs_try_reconnect() -{ - FSFpePtr conn, - *prev; - Time_t now; - - prev = &awaiting_reconnect; - now = time((Time_t *) 0); - while (conn = *prev) { - if (now - conn->time_to_try > 0) { - if (_fs_reopen_server(conn) && _fs_restart_connection(conn)) { - conn->attemptReconnect = TRUE; - *prev = conn->next_reconnect; - if (prev == &awaiting_reconnect) continue; - } else { - if (conn->reconnect_delay < FS_MAX_RECONNECT_WAIT) - conn->reconnect_delay *= 2; - now = time((Time_t *) 0); - conn->time_to_try = now + conn->reconnect_delay; - } +_fs_giveup (FSFpePtr conn) +{ + FSBlockDataPtr block; + + if (conn->blockState & FS_GIVE_UP) + return; +#ifdef DEBUG + fprintf (stderr, "give up on FS \"%s\"\n", conn->servername); +#endif + _fs_mark_block (conn, FS_GIVE_UP); + while ((block = (FSBlockDataPtr) conn->blockedRequests)) + { + if (block->errcode == StillWorking) + { + ClientSignal (block->client); + fs_abort_blockrec (conn, block); + } + } + if (conn->fs_fd >= 0) + _fs_connection_died (conn); +} + +static void +_fs_do_blocked (FSFpePtr conn) +{ + CARD32 now; + + now = GetTimeInMillis (); + if ((conn->blockState & FS_PENDING_REPLY) && + TimeCmp (conn->blockedReplyTime, <=, now)) + { + _fs_giveup (conn); + } + else + { + if (conn->blockState & FS_BROKEN_CONNECTION) + { + /* Try to reconnect broken connections */ + if (TimeCmp (conn->brokenConnectionTime, <=, now)) + _fs_start_reconnect (conn); + } + else if (conn->blockState & FS_BROKEN_WRITE) + { + /* Try to flush blocked connections */ + if (TimeCmp (conn->brokenWriteTime, <=, now)) + _fs_flush (conn); } - prev = &conn->next_reconnect; } } @@ -1366,50 +1488,50 @@ _fs_try_reconnect() */ /* ARGSUSED */ static int -fs_send_open_font(client, fpe, flags, name, namelen, format, fmask, id, ppfont) - pointer client; - FontPathElementPtr fpe; - Mask flags; - char *name; - int namelen; - fsBitmapFormat format; - fsBitmapFormatMask fmask; - XID id; - FontPtr *ppfont; -{ - FontPtr newfont; - FSBlockDataPtr blockrec = NULL; - FSBlockedFontPtr blockedfont; - FSFontDataPtr fsd; - FSFontPtr fsfont; - FSFpePtr conn; - fsOpenBitmapFontReq openreq; - int err = Suspended; - XID newid; - unsigned char buf[1024]; - char *fontname; - +fs_send_open_font(pointer client, FontPathElementPtr fpe, Mask flags, + char *name, int namelen, + fsBitmapFormat format, fsBitmapFormatMask fmask, + XID id, FontPtr *ppfont) +{ + FSFpePtr conn = (FSFpePtr) fpe->private; + FontPtr font; + FSBlockDataPtr blockrec = NULL; + FSBlockedFontPtr bfont; + FSFontDataPtr fsd; + FSFontPtr fsfont; + fsOpenBitmapFontReq openreq; + fsQueryXInfoReq inforeq; + fsQueryXExtents16Req extreq; + int err; + unsigned char buf[1024]; + + if (conn->blockState & FS_GIVE_UP) + return BadFontName; + + if (namelen > sizeof (buf) - 1) + return BadFontName; + + /* + * Get the font structure put together, either by reusing + * the existing one or creating a new one + */ if (flags & FontReopen) { - Atom nameatom, fn = None; - int i; + Atom nameatom, fn = None; + int i; - newfont = *ppfont; - fsd = (FSFontDataPtr)newfont->fpePrivate; - fsfont = (FSFontPtr)newfont->fontPrivate; - fpe = newfont->fpe; - format = fsd->format; - fmask = fsd->fmask; - newid = fsd->fontid; + font = *ppfont; + fsd = (FSFontDataPtr)font->fpePrivate; + fsfont = (FSFontPtr)font->fontPrivate; /* This is an attempt to reopen a font. Did the font have a NAME property? */ if ((nameatom = MakeAtom("FONT", 4, 0)) != None) { - for (i = 0; i < newfont->info.nprops; i++) - if (newfont->info.props[i].name == nameatom && - newfont->info.isStringProp[i]) + for (i = 0; i < font->info.nprops; i++) + if (font->info.props[i].name == nameatom && + font->info.isStringProp[i]) { - fn = newfont->info.props[i].value; + fn = font->info.props[i].value; break; } } @@ -1421,195 +1543,127 @@ fs_send_open_font(client, fpe, flags, name, namelen, format, fmask, id, ppfont) else namelen = strlen(name); } - - conn = (FSFpePtr) fpe->private; - if (namelen > sizeof (buf) - 1) - return BadFontName; - _fs_client_access (conn, client, (flags & FontOpenSync) != 0); - _fs_client_resolution(conn); - - - if (!(flags & FontReopen)) + else { - - newid = GetNewFontClientID(); - - /* make the font */ - newfont = (FontPtr) xalloc(sizeof(FontRec)); - - /* and the FS data */ - fsd = (FSFontDataPtr) xalloc(sizeof(FSFontDataRec)); - - fsfont = (FSFontPtr) xalloc(sizeof(FSFontRec)); - - fontname = (char *)xalloc(namelen); - - if (!newfont || !fsd || !fsfont || !fontname) { -lowmem: - if (!(flags & FontReopen)) - { - xfree((char *) newfont); - xfree((char *) fsd); - xfree((char *) fsfont); - xfree((char *) fontname); - } - if (blockrec) fs_abort_blockrec(conn, blockrec); + font = fs_create_font (fpe, name, namelen, format, fmask); + if (!font) return AllocError; - } - bzero((char *) newfont, sizeof(FontRec)); - bzero((char *) fsfont, sizeof(FSFontRec)); - bzero((char *) fsd, sizeof(FSFontDataRec)); + + fsd = (FSFontDataPtr)font->fpePrivate; + fsfont = (FSFontPtr)font->fontPrivate; } - + /* make a new block record, and add it to the end of the list */ - blockrec = fs_new_block_rec(fpe, client, FS_OPEN_FONT); - if (!blockrec) { - goto lowmem; - } - - if (!(flags & FontReopen)) - { - int bit, byte, scan, glyph; - - newfont->refcnt = 0; - newfont->maxPrivate = -1; - newfont->devPrivates = (pointer *) 0; - newfont->format = format; - - /* These font components will be needed in packGlyphs */ - CheckFSFormat(format, BitmapFormatMaskBit | - BitmapFormatMaskByte | - BitmapFormatMaskScanLineUnit | - BitmapFormatMaskScanLinePad, - &bit, - &byte, - &scan, - &glyph, - NULL); - newfont->bit = bit; - newfont->byte = byte; - newfont->scan = scan; - newfont->glyph = glyph; - - newfont->fpe = fpe; - newfont->fpePrivate = (pointer) fsd; - newfont->fontPrivate = (pointer) fsfont; - _fs_init_font(newfont); - - fsd->fpe = fpe; - fsd->name = fontname; - fsd->namelen = namelen; - memcpy(fontname, name, namelen); - fsd->format = format; - fsd->fmask = fmask; - } - fsd->fontid = newid; + blockrec = fs_new_block_rec(font->fpe, client, FS_OPEN_FONT); + if (!blockrec) + { + if (!(flags & FontReopen)) + (*font->unload_font) (font); + return AllocError; + } + + /* + * Must check this before generating any protocol, otherwise we'll + * mess up a reconnect in progress + */ + if (conn->blockState & (FS_BROKEN_CONNECTION | FS_RECONNECTING)) + { + _fs_pending_reply (conn); + return Suspended; + } + fsd->generation = conn->generation; - blockedfont = (FSBlockedFontPtr) blockrec->data; - blockedfont->fontid = newid; - blockedfont->pfont = newfont; - blockedfont->state = FS_OPEN_REPLY; - blockedfont->flags = flags; - blockedfont->format = format; - blockedfont->clients_depending = (FSClientsDependingPtr)0; + bfont = (FSBlockedFontPtr) blockrec->data; + bfont->fontid = fsd->fontid; + bfont->pfont = font; + bfont->state = FS_OPEN_REPLY; + bfont->flags = flags; + bfont->format = fsd->format; + bfont->clients_depending = (FSClientsDependingPtr)0; + bfont->freeFont = (flags & FontReopen) == 0; + + _fs_client_access (conn, client, (flags & FontOpenSync) != 0); + _fs_client_resolution(conn); - /* save the ID */ - if (!StoreFontClientFont(blockedfont->pfont, blockedfont->fontid)) { - goto lowmem; - } /* do an FS_OpenFont, FS_QueryXInfo and FS_QueryXExtents */ buf[0] = (unsigned char) namelen; memcpy(&buf[1], name, namelen); - namelen++; openreq.reqType = FS_OpenBitmapFont; - openreq.fid = newid; - openreq.format_hint = format; - openreq.format_mask = fmask; - openreq.length = (SIZEOF(fsOpenBitmapFontReq) + namelen + 3) >> 2; + openreq.fid = fsd->fontid; + openreq.format_hint = fsd->format; + openreq.format_mask = fsd->fmask; + openreq.length = (SIZEOF(fsOpenBitmapFontReq) + namelen + 4) >> 2; _fs_add_req_log(conn, FS_OpenBitmapFont); _fs_write(conn, (char *) &openreq, SIZEOF(fsOpenBitmapFontReq)); - _fs_write_pad(conn, (char *) buf, namelen); + _fs_write_pad(conn, (char *) buf, namelen + 1); + + blockrec->sequenceNumber = conn->current_seq; + + inforeq.reqType = FS_QueryXInfo; + inforeq.id = fsd->fontid; + inforeq.length = SIZEOF(fsQueryXInfoReq) >> 2; + bfont->queryInfoSequence = conn->current_seq + 1; + + _fs_add_req_log(conn, FS_QueryXInfo); + _fs_write(conn, (char *) &inforeq, SIZEOF(fsQueryXInfoReq)); + + if (!(bfont->flags & FontReopen)) + { + extreq.reqType = FS_QueryXExtents16; + extreq.range = fsTrue; + extreq.fid = fsd->fontid; + extreq.num_ranges = 0; + extreq.length = SIZEOF(fsQueryXExtents16Req) >> 2; + + bfont->queryExtentsSequence = conn->current_seq + 1; + + _fs_add_req_log(conn, FS_QueryXExtents16); + _fs_write(conn, (char *) &extreq, SIZEOF(fsQueryXExtents16Req)); + } + #ifdef NCD - if (configData.ExtendedFontDiags) { + if (configData.ExtendedFontDiags) + { memcpy(buf, name, MIN(256, namelen)); buf[MIN(256, namelen)] = '\0'; printf("Requesting font \"%s\" from font server \"%s\"\n", - buf, fpe->name); + buf, font->fpe->name); } #endif - - if (flags & FontOpenSync) { - err = fs_do_open_font(fpe, blockrec, TRUE); - if (blockedfont->errcode == Successful) { - *ppfont = blockedfont->pfont; - } else { - _fs_cleanup_font(blockedfont); + _fs_prepare_for_reply (conn); + + err = blockrec->errcode; + if (bfont->flags & FontOpenSync) + { + while (blockrec->errcode == StillWorking) + { + if (fs_await_reply (conn) != FSIO_READY) + { + blockrec->errcode = BadFontName; + break; + } + fs_read_reply (font->fpe, client); } - _fs_remove_block_rec(conn, blockrec); + err = blockrec->errcode; + if (err == Successful) + *ppfont = bfont->pfont; + else + fs_cleanup_bfont (bfont); + bfont->freeFont = FALSE; + _fs_remove_block_rec (conn, blockrec); } - return err; -} - -static int -fs_send_query_info(fpe, blockrec) - FontPathElementPtr fpe; - FSBlockDataPtr blockrec; -{ - FSBlockedFontPtr bfont; - FSFpePtr conn = (FSFpePtr) fpe->private; - fsQueryXInfoReq inforeq; - - bfont = (FSBlockedFontPtr) blockrec->data; - - inforeq.reqType = FS_QueryXInfo; - inforeq.id = bfont->fontid; - inforeq.length = SIZEOF(fsQueryXInfoReq) >> 2; - - blockrec->sequence_number = conn->current_seq; - _fs_add_req_log(conn, FS_QueryXInfo); - _fs_write(conn, (char *) &inforeq, SIZEOF(fsQueryXInfoReq)); - - return Successful; + return err == StillWorking ? Suspended : err; } -static int -fs_send_query_extents(fpe, blockrec) - FontPathElementPtr fpe; - FSBlockDataPtr blockrec; -{ - FSBlockedFontPtr bfont; - FSFpePtr conn = (FSFpePtr) fpe->private; - fsQueryXExtents16Req extreq; - - bfont = (FSBlockedFontPtr) blockrec->data; - - extreq.reqType = FS_QueryXExtents16; - extreq.range = fsTrue; - extreq.fid = bfont->fontid; - extreq.num_ranges = 0; - extreq.length = SIZEOF(fsQueryXExtents16Req) >> 2; - - blockrec->sequence_number = conn->current_seq; - _fs_add_req_log(conn, FS_QueryXExtents16); - _fs_write(conn, (char *) &extreq, SIZEOF(fsQueryXExtents16Req)); - - return Successful; -} - -static int -fs_send_query_bitmaps(fpe, blockrec) - FontPathElementPtr fpe; - FSBlockDataPtr blockrec; +static void +fs_send_query_bitmaps(FontPathElementPtr fpe, FSBlockDataPtr blockrec) { - FSBlockedFontPtr bfont; - FSFpePtr conn = (FSFpePtr) fpe->private; - fsQueryXBitmaps16Req bitreq; - - - bfont = (FSBlockedFontPtr) blockrec->data; + FSFpePtr conn = (FSFpePtr) fpe->private; + FSBlockedFontPtr bfont = (FSBlockedFontPtr) blockrec->data; + fsQueryXBitmaps16Req bitreq; /* send the request */ bitreq.reqType = FS_QueryXBitmaps16; @@ -1619,55 +1673,45 @@ fs_send_query_bitmaps(fpe, blockrec) bitreq.length = SIZEOF(fsQueryXBitmaps16Req) >> 2; bitreq.num_ranges = 0; - blockrec->sequence_number = conn->current_seq; + bfont->queryBitmapsSequence = conn->current_seq + 1; + _fs_add_req_log(conn, FS_QueryXBitmaps16); _fs_write(conn, (char *) &bitreq, SIZEOF(fsQueryXBitmaps16Req)); - - return Successful; } /* ARGSUSED */ static int -fs_open_font(client, fpe, flags, name, namelen, format, fmask, id, ppfont, - alias, non_cachable_font) - pointer client; - FontPathElementPtr fpe; - Mask flags; - char *name; - fsBitmapFormat format; - fsBitmapFormatMask fmask; - int namelen; - XID id; - FontPtr *ppfont; - char **alias; - FontPtr non_cachable_font; /* Not used in this FPE */ +fs_open_font(pointer client, FontPathElementPtr fpe, Mask flags, + char *name, int namelen, + fsBitmapFormat format, fsBitmapFormatMask fmask, + XID id, FontPtr *ppfont, + char **alias, FontPtr non_cachable_font) { - FSFpePtr conn = (FSFpePtr) fpe->private; - FSBlockDataPtr blockrec; - FSBlockedFontPtr blockedfont; - int err; + FSFpePtr conn = (FSFpePtr) fpe->private; + FSBlockDataPtr blockrec; + FSBlockedFontPtr bfont; + int err; /* libfont interface expects ImageRectMin glyphs */ - format = format & ~BitmapFormatImageRectMask | BitmapFormatImageRectMin; + format = (format & ~BitmapFormatImageRectMask) | BitmapFormatImageRectMin; *alias = (char *) 0; - /* XX if we find the blockrec for the font */ - blockrec = (FSBlockDataPtr) conn->blocked_requests; - while (blockrec != (FSBlockDataPtr) 0) { - if (blockrec->type == FS_OPEN_FONT && - blockrec->client == client) { - blockedfont = (FSBlockedFontPtr) blockrec->data; - err = blockedfont->errcode; - if (err == Successful) { - *ppfont = blockedfont->pfont; - } else { - _fs_cleanup_font(blockedfont); - } - /* cleanup */ - _fs_remove_block_rec(conn, blockrec); + for (blockrec = conn->blockedRequests; blockrec; blockrec = blockrec->next) + { + if (blockrec->type == FS_OPEN_FONT && blockrec->client == client) + { + err = blockrec->errcode; + if (err == StillWorking) + return Suspended; + + bfont = (FSBlockedFontPtr) blockrec->data; + if (err == Successful) + *ppfont = bfont->pfont; + else + fs_cleanup_bfont (bfont); + _fs_remove_block_rec (conn, blockrec); return err; } - blockrec = blockrec->next; } return fs_send_open_font(client, fpe, flags, name, namelen, format, fmask, id, ppfont); @@ -1675,13 +1719,13 @@ fs_open_font(client, fpe, flags, name, namelen, format, fmask, id, ppfont, /* ARGSUSED */ static int -fs_send_close_font(fpe, id) - FontPathElementPtr fpe; - Font id; +fs_send_close_font(FontPathElementPtr fpe, Font id) { FSFpePtr conn = (FSFpePtr) fpe->private; fsCloseReq req; + if (conn->blockState & FS_GIVE_UP) + return Successful; /* tell the font server to close the font */ req.reqType = FS_CloseFont; req.length = SIZEOF(fsCloseReq) >> 2; @@ -1693,110 +1737,83 @@ fs_send_close_font(fpe, id) } /* ARGSUSED */ -static int -fs_close_font(fpe, pfont) - FontPathElementPtr fpe; - FontPtr pfont; +static void +fs_close_font(FontPathElementPtr fpe, FontPtr pfont) { - FSFontDataPtr fsd = (FSFontDataPtr) pfont->fpePrivate; - FSFpePtr conn = (FSFpePtr) fpe->private; + FSFontDataPtr fsd = (FSFontDataPtr) pfont->fpePrivate; + FSFpePtr conn = (FSFpePtr) fpe->private; - /* XXX we may get called after the resource DB has been cleaned out */ - if (find_old_font(fsd->fontid)) - DeleteFontClientID(fsd->fontid); if (conn->generation == fsd->generation) fs_send_close_font(fpe, fsd->fontid); - (*pfont->unload_font) (pfont); - - - xfree(fsd->name); - xfree(fsd); - xfree(pfont->info.isStringProp); - xfree(pfont->info.props); - xfree(pfont->devPrivates); - xfree(pfont); +#ifdef DEBUG + { + FSBlockDataPtr blockrec; + FSBlockedFontPtr bfont; - return Successful; + for (blockrec = conn->blockedRequests; blockrec; blockrec = blockrec->next) + { + if (blockrec->type == FS_OPEN_FONT) + { + bfont = (FSBlockedFontPtr) blockrec->data; + if (bfont->pfont == pfont) + fprintf (stderr, "closing font which hasn't been opened\n"); + } + } + } +#endif + (*pfont->unload_font) (pfont); } static int -fs_read_glyphs(fpe, blockrec) - FontPathElementPtr fpe; - FSBlockDataPtr blockrec; +fs_read_glyphs(FontPathElementPtr fpe, FSBlockDataPtr blockrec) { - FSBlockedGlyphPtr bglyph = (FSBlockedGlyphPtr) blockrec->data; - FSBlockedFontPtr bfont = (FSBlockedFontPtr) blockrec->data; - FSFpePtr conn = (FSFpePtr) fpe->private; - FontPtr pfont = bglyph->pfont; /* works for either blocked font + FSBlockedGlyphPtr bglyph = (FSBlockedGlyphPtr) blockrec->data; + FSBlockedFontPtr bfont = (FSBlockedFontPtr) blockrec->data; + FSFpePtr conn = (FSFpePtr) fpe->private; + FontPtr pfont = bglyph->pfont; + /* works for either blocked font or glyph rec... pfont is at the very beginning of both blockrec->data structures */ - FSFontDataPtr fsd = (FSFontDataPtr) (pfont->fpePrivate); - FSFontPtr fsdata = (FSFontPtr) pfont->fontPrivate; - FontInfoPtr pfi = &pfont->info; - fsQueryXBitmaps16Reply rep; - fsOffset32 *ppbits; - fsOffset32 local_off; - char *off_adr; - pointer pbitmaps; - char *bits; - int glyph_size, - offset_size, - i, - err; - int nranges = 0; - fsRange *ranges, *nextrange; - unsigned long minchar, maxchar; - - /* get reply header */ - memcpy(&rep, &blockrec->header, SIZEOF(fsGenericReply)); - if (rep.type == FS_Error) { -/* XXX -- translate FS error */ - _fs_eat_rest_of_error(conn, (fsError *) & rep); - err = AllocError; - goto bail; - } - if (_fs_read(conn, (char *) &rep + SIZEOF(fsGenericReply), - SIZEOF(fsQueryXBitmaps16Reply) - SIZEOF(fsGenericReply)) == -1) { - if (blockrec->type == FS_OPEN_FONT) - fs_free_font(bfont); - return StillWorking; - } - /* allocate space for glyphs */ - offset_size = SIZEOF(fsOffset32) * (rep.num_chars); - glyph_size = (rep.length << 2) - SIZEOF(fsQueryXBitmaps16Reply) - - offset_size; - ppbits = (fsOffset32 *) xalloc(offset_size); - pbitmaps = (pointer) xalloc(glyph_size); - if (glyph_size && !pbitmaps || !ppbits) + FSFontDataPtr fsd = (FSFontDataPtr) (pfont->fpePrivate); + FSFontPtr fsdata = (FSFontPtr) pfont->fontPrivate; + FontInfoPtr pfi = &pfont->info; + fsQueryXBitmaps16Reply *rep; + char *buf; + fsOffset32 *ppbits; + fsOffset32 local_off; + char *off_adr; + pointer pbitmaps; + char *bits, *allbits; +#ifdef DEBUG + char *origallbits; +#endif + int i, + err; + int nranges = 0; + int ret; + fsRange *ranges, *nextrange = 0; + unsigned long minchar, maxchar; + + rep = (fsQueryXBitmaps16Reply *) fs_get_reply (conn, &ret); + if (!rep || rep->type == FS_Error) { - xfree(pbitmaps); - xfree(ppbits); - - /* clear wire */ - (void) _fs_drain_bytes_pad(conn, offset_size); - (void) _fs_drain_bytes_pad(conn, glyph_size); - - if (blockrec->type == FS_OPEN_FONT) - _fs_cleanup_font(bfont); + if (ret == FSIO_BLOCK) + return StillWorking; + if (rep) + _fs_done_read (conn, rep->length << 2); err = AllocError; goto bail; } - /* read offsets */ - if (_fs_read_pad(conn, (char *) ppbits, offset_size) == -1) { - if (blockrec->type == FS_OPEN_FONT) - fs_free_font(bfont); - return StillWorking; - } + buf = (char *) rep; + buf += SIZEOF (fsQueryXBitmaps16Reply); - /* read glyphs */ - if (_fs_read_pad(conn, (char *) pbitmaps, glyph_size) == -1) { - if (blockrec->type == FS_OPEN_FONT) - fs_free_font(bfont); - return StillWorking; - } + ppbits = (fsOffset32 *) buf; + buf += SIZEOF (fsOffset32) * (rep->num_chars); + + pbitmaps = (pointer ) buf; if (blockrec->type == FS_LOAD_GLYPHS) { @@ -1822,31 +1839,47 @@ fs_read_glyphs(fpe, blockrec) else { minchar = 0; - maxchar = rep.num_chars; + maxchar = rep->num_chars; } off_adr = (char *)ppbits; - for (i = 0; i < rep.num_chars; i++) + + allbits = fs_alloc_glyphs (pfont, rep->nbytes); + + if (!allbits) + { + err = AllocError; + goto bail; + } + +#ifdef DEBUG + origallbits = allbits; + fprintf (stderr, "Reading %d glyphs in %d bytes for %s\n", + (int) rep->num_chars, (int) rep->nbytes, fsd->name); +#endif + + for (i = 0; i < rep->num_chars; i++) { memcpy(&local_off, off_adr, SIZEOF(fsOffset32)); /* align it */ if (blockrec->type == FS_OPEN_FONT || fsdata->encoding[minchar].bits == &_fs_glyph_requested) { - if (local_off.length) + /* + * Broken X font server returns bits for missing characters + * when font is padded + */ + if (NONZEROMETRICS(&fsdata->encoding[minchar].metrics)) { - bits = (char *)xalloc(local_off.length); - if (bits == NULL) + if (local_off.length) { - xfree(ppbits); - xfree(pbitmaps); - err = AllocError; - goto bail; + bits = allbits; + allbits += local_off.length; + memcpy(bits, (char *)pbitmaps + local_off.position, + local_off.length); } - memcpy(bits, pbitmaps + local_off.position, - local_off.length); + else + bits = &_fs_glyph_zero_length; } - else if (NONZEROMETRICS(&fsdata->encoding[minchar].metrics)) - bits = &_fs_glyph_zero_length; else bits = 0; if (fsdata->encoding[minchar].bits == &_fs_glyph_requested) @@ -1866,9 +1899,10 @@ fs_read_glyphs(fpe, blockrec) } off_adr += SIZEOF(fsOffset32); } - - xfree(ppbits); - xfree(pbitmaps); +#ifdef DEBUG + fprintf (stderr, "Used %d bytes instead of %d\n", + (int) (allbits - origallbits), (int) rep->nbytes); +#endif if (blockrec->type == FS_OPEN_FONT) { @@ -1878,31 +1912,23 @@ fs_read_glyphs(fpe, blockrec) err = Successful; bail: - if (blockrec->type == FS_LOAD_GLYPHS) - { - bglyph->done = TRUE; - bglyph->errcode = err; - } - + _fs_done_read (conn, rep->length << 2); return err; } - - static int -fs_send_load_glyphs(client, pfont, nranges, ranges) - pointer client; - FontPtr pfont; - int nranges; - fsRange *ranges; -{ - FSBlockedGlyphPtr blockedglyph; - fsQueryXBitmaps16Req req; - FSFontDataPtr fsd = (FSFontDataPtr) (pfont->fpePrivate); - FontPathElementPtr fpe = fsd->fpe; - FSFpePtr conn = (FSFpePtr) fpe->private; - FSBlockDataPtr blockrec; - +fs_send_load_glyphs(pointer client, FontPtr pfont, + int nranges, fsRange *ranges) +{ + FontPathElementPtr fpe = pfont->fpe; + FSFpePtr conn = (FSFpePtr) fpe->private; + FSBlockedGlyphPtr blockedglyph; + fsQueryXBitmaps16Req req; + FSBlockDataPtr blockrec; + + if (conn->blockState & FS_GIVE_UP) + return BadCharRange; + /* make a new block record, and add it to the end of the list */ blockrec = fs_new_block_rec(fpe, client, FS_LOAD_GLYPHS); if (!blockrec) @@ -1912,17 +1938,20 @@ fs_send_load_glyphs(client, pfont, nranges, ranges) blockedglyph->num_expected_ranges = nranges; /* Assumption: it's our job to free ranges */ blockedglyph->expected_ranges = ranges; - blockedglyph->done = FALSE; blockedglyph->clients_depending = (FSClientsDependingPtr)0; - blockrec->sequence_number = conn->current_seq; - + if (conn->blockState & (FS_BROKEN_CONNECTION|FS_RECONNECTING)) + { + _fs_pending_reply (conn); + return Suspended; + } + /* send the request */ req.reqType = FS_QueryXBitmaps16; req.fid = ((FSFontDataPtr) pfont->fpePrivate)->fontid; req.format = pfont->format; if (pfont->info.terminalFont) - req.format = req.format & ~(BitmapFormatImageRectMask) | + req.format = (req.format & ~(BitmapFormatImageRectMask)) | BitmapFormatImageRectMax; req.range = TRUE; /* each range takes up 4 bytes */ @@ -1931,6 +1960,8 @@ fs_send_load_glyphs(client, pfont, nranges, ranges) _fs_add_req_log(conn, FS_QueryXBitmaps16); _fs_write(conn, (char *) &req, SIZEOF(fsQueryXBitmaps16Req)); + blockrec->sequenceNumber = conn->current_seq; + /* Send ranges to the server... pack into a char array by hand to avoid structure-packing portability problems and to handle swapping for version1 protocol */ @@ -1970,19 +2001,20 @@ fs_send_load_glyphs(client, pfont, nranges, ranges) _fs_write(conn, range_buffer, i * 4); } + _fs_prepare_for_reply (conn); return Suspended; } +extern pointer serverClient; /* This could be any number that + doesn't conflict with existing + client values. */ + int -fs_load_all_glyphs(pfont) - FontPtr pfont; +fs_load_all_glyphs(FontPtr pfont) { - extern pointer serverClient; /* This could be any number that - doesn't conflict with existing - client values. */ - int err; - FSFpePtr conn = (FSFpePtr) pfont->fpe->private; + int err; + FSFpePtr conn = (FSFpePtr) pfont->fpe->private; /* * The purpose of this procedure is to load all glyphs in the event @@ -1999,67 +2031,49 @@ fs_load_all_glyphs(pfont) while ((err = _fs_load_glyphs(serverClient, pfont, TRUE, 0, 0, NULL)) == Suspended) { - fd_set TempSelectMask; - - FD_ZERO (&TempSelectMask); - - if (_fs_wait_for_readable(conn) == -1) + if (fs_await_reply (conn) != FSIO_READY) { - /* We lost our connection. Don't wait to reestablish it; - just give up. */ - _fs_connection_died(conn); - /* Get rid of blockrec */ fs_client_died(serverClient, pfont->fpe); - - return BadCharRange; /* As good an error as any other */ + err = BadCharRange; + break; } - FD_SET(conn->fs_fd, &TempSelectMask); - fs_wakeup(pfont->fpe, &TempSelectMask); + fs_read_reply (pfont->fpe, serverClient); } - return err; } int -_fs_load_glyphs(client, pfont, range_flag, nchars, item_size, data) - pointer client; - FontPtr pfont; - Bool range_flag; - unsigned int nchars; - int item_size; - unsigned char *data; -{ - - int nranges = 0; - fsRange *ranges = NULL; - int res; - FSBlockDataPtr blockrec; - FSBlockedGlyphPtr blockedglyph; - FSFpePtr conn = (FSFpePtr) pfont->fpe->private; - FSClientsDependingPtr *clients_depending = NULL; +_fs_load_glyphs(pointer client, FontPtr pfont, Bool range_flag, + unsigned int nchars, int item_size, unsigned char *data) +{ + FSFpePtr conn = (FSFpePtr) pfont->fpe->private; + int nranges = 0; + fsRange *ranges = NULL; + int res; + FSBlockDataPtr blockrec; + FSBlockedGlyphPtr blockedglyph; + FSClientsDependingPtr *clients_depending = NULL; + int err; /* see if the result is already there */ - - blockrec = (FSBlockDataPtr) conn->blocked_requests; - while (blockrec) { + for (blockrec = conn->blockedRequests; blockrec; blockrec = blockrec->next) + { if (blockrec->type == FS_LOAD_GLYPHS) { blockedglyph = (FSBlockedGlyphPtr) blockrec->data; if (blockedglyph->pfont == pfont) { + /* Look for this request */ if (blockrec->client == client) { - if (blockedglyph->done) - { - int errcode = blockedglyph->errcode; - signal_clients_depending(&blockedglyph-> - clients_depending); - _fs_remove_block_rec(conn, blockrec); - return errcode; - } - else return Suspended; + err = blockrec->errcode; + if (err == StillWorking) + return Suspended; + _fs_signal_clients_depending(&blockedglyph->clients_depending); + _fs_remove_block_rec(conn, blockrec); + return err; } /* We've found an existing LoadGlyphs blockrec for this font but for another client. Rather than build a @@ -2077,17 +2091,22 @@ _fs_load_glyphs(client, pfont, range_flag, nchars, item_size, data) bfont = (FSBlockedFontPtr) blockrec->data; if (bfont->pfont == pfont) { + /* + * An OpenFont is pending for this font, this must + * be from a reopen attempt, so finish the open + * attempt and retry the LoadGlyphs + */ if (blockrec->client == client) { - if (bfont->state == FS_DONE_REPLY) - { - int errcode = bfont->errcode; - signal_clients_depending(&bfont->clients_depending); - _fs_remove_block_rec(conn, blockrec); - if (errcode == Successful) break; - else return errcode; - } - else return Suspended; + err = blockrec->errcode; + if (err == StillWorking) + return Suspended; + + _fs_signal_clients_depending(&bfont->clients_depending); + _fs_remove_block_rec(conn, blockrec); + if (err != Successful) + return err; + break; } /* We've found an existing OpenFont blockrec for this font but for another client. Rather than build a @@ -2095,15 +2114,13 @@ _fs_load_glyphs(client, pfont, range_flag, nchars, item_size, data) maintenance), we'll add it to a queue of clients to be signalled when the existing OpenFont is completed. */ - if (bfont->state != FS_DONE_REPLY) + if (blockrec->errcode == StillWorking) { clients_depending = &bfont->clients_depending; break; } } } - - blockrec = blockrec->next; } /* @@ -2139,7 +2156,7 @@ _fs_load_glyphs(client, pfont, range_flag, nchars, item_size, data) _fs_clean_aborted_loadglyphs(pfont, nranges, ranges); xfree(ranges); } - return add_clients_depending(clients_depending, client); + return _fs_add_clients_depending(clients_depending, client); } /* @@ -2177,87 +2194,70 @@ _fs_load_glyphs(client, pfont, range_flag, nchars, item_size, data) return fs_send_load_glyphs(client, pfont, nranges, ranges); } - - static int -fs_read_list(fpe, blockrec) - FontPathElementPtr fpe; - FSBlockDataPtr blockrec; +fs_read_list(FontPathElementPtr fpe, FSBlockDataPtr blockrec) { - FSBlockedListPtr blist = (FSBlockedListPtr) blockrec->data; - FSFpePtr conn = (FSFpePtr) fpe->private; - fsListFontsReply rep; - char *data, - *dp; - int length, - i; - - blist->done = TRUE; - - /* read reply header */ - memcpy(&rep, &blockrec->header, SIZEOF(fsGenericReply)); - if (rep.type == FS_Error) { -/* XXX -- translate FS error */ - _fs_eat_rest_of_error(conn, (fsError *) & rep); - return AllocError; - } - if (_fs_read(conn, (char *) &rep + SIZEOF(fsGenericReply), - SIZEOF(fsListFontsReply) - SIZEOF(fsGenericReply)) == -1) { - /* nothing to free (i think) */ - return StillWorking; - } - length = (rep.length << 2) - SIZEOF(fsListFontsReply); - data = (char *) xalloc(length); - if (!data) { - _fs_drain_bytes_pad(conn, length); + FSFpePtr conn = (FSFpePtr) fpe->private; + FSBlockedListPtr blist = (FSBlockedListPtr) blockrec->data; + fsListFontsReply *rep; + char *data; + int length, + i, + ret; + int err; + + rep = (fsListFontsReply *) fs_get_reply (conn, &ret); + if (!rep || rep->type == FS_Error) + { + if (ret == FSIO_BLOCK) + return StillWorking; + if (rep) + _fs_done_read (conn, rep->length << 2); return AllocError; } - /* read the list */ - if (_fs_read_pad(conn, data, length) == -1) { - /* nothing to free (i think) */ - return StillWorking; - } + data = (char *) rep + SIZEOF (fsListFontsReply); + + err = Successful; /* copy data into FontPathRecord */ - dp = data; - for (i = 0; i < rep.nFonts; i++) { - length = *(unsigned char *)dp++; - if (AddFontNamesName(blist->names, dp, length) != Successful) { - blist->errcode = AllocError; + for (i = 0; i < rep->nFonts; i++) + { + length = *(unsigned char *)data++; + err = AddFontNamesName(blist->names, data, length); + if (err != Successful) break; - } - dp += length; + data += length; } - - xfree(data); - return Successful; + _fs_done_read (conn, rep->length << 2); + return err; } static int -fs_send_list_fonts(client, fpe, pattern, patlen, maxnames, newnames) - pointer client; - FontPathElementPtr fpe; - char *pattern; - int patlen; - int maxnames; - FontNamesPtr newnames; -{ - FSBlockDataPtr blockrec; - FSBlockedListPtr blockedlist; - FSFpePtr conn = (FSFpePtr) fpe->private; - fsListFontsReq req; - - _fs_client_access (conn, client, FALSE); - _fs_client_resolution(conn); +fs_send_list_fonts(pointer client, FontPathElementPtr fpe, char *pattern, + int patlen, int maxnames, FontNamesPtr newnames) +{ + FSFpePtr conn = (FSFpePtr) fpe->private; + FSBlockDataPtr blockrec; + FSBlockedListPtr blockedlist; + fsListFontsReq req; + if (conn->blockState & FS_GIVE_UP) + return BadFontName; + /* make a new block record, and add it to the end of the list */ blockrec = fs_new_block_rec(fpe, client, FS_LIST_FONTS); if (!blockrec) return AllocError; blockedlist = (FSBlockedListPtr) blockrec->data; - blockedlist->patlen = patlen; - blockedlist->errcode = Successful; blockedlist->names = newnames; - blockedlist->done = FALSE; + + if (conn->blockState & (FS_BROKEN_CONNECTION | FS_RECONNECTING)) + { + _fs_pending_reply (conn); + return Suspended; + } + + _fs_client_access (conn, client, FALSE); + _fs_client_resolution(conn); /* send the request */ req.reqType = FS_ListFonts; @@ -2268,6 +2268,8 @@ fs_send_list_fonts(client, fpe, pattern, patlen, maxnames, newnames) _fs_write(conn, (char *) &req, SIZEOF(fsListFontsReq)); _fs_write_pad(conn, (char *) pattern, patlen); + blockrec->sequenceNumber = conn->current_seq; + #ifdef NCD if (configData.ExtendedFontDiags) { char buf[256]; @@ -2279,198 +2281,155 @@ fs_send_list_fonts(client, fpe, pattern, patlen, maxnames, newnames) } #endif + _fs_prepare_for_reply (conn); return Suspended; } static int -fs_list_fonts(client, fpe, pattern, patlen, maxnames, newnames) - pointer client; - FontPathElementPtr fpe; - char *pattern; - int patlen; - int maxnames; - FontNamesPtr newnames; -{ - FSBlockDataPtr blockrec; - FSBlockedListPtr blockedlist; - FSFpePtr conn = (FSFpePtr) fpe->private; - int err; +fs_list_fonts(pointer client, FontPathElementPtr fpe, + char *pattern, int patlen, int maxnames, FontNamesPtr newnames) +{ + FSFpePtr conn = (FSFpePtr) fpe->private; + FSBlockDataPtr blockrec; + FSBlockedListPtr blockedlist; + int err; /* see if the result is already there */ - blockrec = (FSBlockDataPtr) conn->blocked_requests; - while (blockrec) { - if (blockrec->type == FS_LIST_FONTS && blockrec->client == client) { + for (blockrec = conn->blockedRequests; blockrec; blockrec = blockrec->next) + { + if (blockrec->type == FS_LIST_FONTS && blockrec->client == client) + { + err = blockrec->errcode; + if (err == StillWorking) + return Suspended; blockedlist = (FSBlockedListPtr) blockrec->data; - if (blockedlist->patlen == patlen && blockedlist->done) { - err = blockedlist->errcode; - _fs_remove_block_rec(conn, blockrec); - return err; - } + _fs_remove_block_rec(conn, blockrec); + return err; } - blockrec = blockrec->next; } /* didn't find waiting record, so send a new one */ return fs_send_list_fonts(client, fpe, pattern, patlen, maxnames, newnames); } -static int padlength[4] = {0, 3, 2, 1}; - +/* + * Read a single list info reply and restart for the next reply + */ static int -fs_read_list_info(fpe, blockrec) - FontPathElementPtr fpe; - FSBlockDataPtr blockrec; +fs_read_list_info(FontPathElementPtr fpe, FSBlockDataPtr blockrec) { - FSBlockedListInfoPtr binfo = (FSBlockedListInfoPtr) blockrec->data; - fsListFontsWithXInfoReply rep; - FSFpePtr conn = (FSFpePtr) fpe->private; - fsPropInfo pi; - fsPropOffset *po; - char *name; - pointer pd; - int err; + FSBlockedListInfoPtr binfo = (FSBlockedListInfoPtr) blockrec->data; + fsListFontsWithXInfoReply *rep; + char *buf; + FSFpePtr conn = (FSFpePtr) fpe->private; + fsPropInfo *pi; + fsPropOffset *po; + pointer pd; + int ret; + int err; /* clean up anything from the last trip */ - if (binfo->name) - { - xfree(binfo->name); - binfo->name = NULL; - } - if (binfo->pfi) { - xfree(binfo->pfi->isStringProp); - xfree(binfo->pfi->props); - xfree(binfo->pfi); - binfo->pfi = NULL; - } - /* get reply header */ - memcpy(&rep, &blockrec->header, SIZEOF(fsGenericReply)); - if (rep.type == FS_Error) { -/* XXX -- translate FS error */ - _fs_eat_rest_of_error(conn, (fsError *) & rep); - binfo->errcode = AllocError; - return AllocError; - } - if (conn->fsMajorVersion > 1) - if (rep.nameLength == 0) - goto done; - /* old protocol sent a full-length reply even for the last one */ - if (_fs_read(conn, (char *) &rep + SIZEOF(fsGenericReply), - SIZEOF(fsListFontsWithXInfoReply) - SIZEOF(fsGenericReply)) == -1) { - goto done; - } - if (rep.nameLength == 0) - goto done; + _fs_free_props (&binfo->info); - /* read the data */ - name = (char *) xalloc(rep.nameLength); - binfo->pfi = (FontInfoPtr) xalloc(sizeof(FontInfoRec)); - if (!name || !binfo->pfi) { - xfree(name); - xfree(binfo->pfi); - binfo->pfi = NULL; - _fs_drain_bytes(conn, - rep.length - (SIZEOF(fsListFontsWithXInfoReply) - - SIZEOF(fsGenericReply))); - binfo->errcode = AllocError; - return AllocError; - } - if (conn->fsMajorVersion == 1) - if (_fs_read_pad(conn, name, rep.nameLength) == -1) - goto done; - if (_fs_read_pad(conn, (char *) &pi, SIZEOF(fsPropInfo)) == -1) - goto done; - - po = (fsPropOffset *) xalloc(SIZEOF(fsPropOffset) * pi.num_offsets); - pd = (pointer) xalloc(pi.data_len); - if (!po || !pd) { - xfree(name); - xfree(po); - xfree(pd); - xfree (binfo->pfi); - binfo->pfi = NULL; - binfo->errcode = AllocError; - return AllocError; - } - err = _fs_read_pad(conn, (char *) po, - (pi.num_offsets * SIZEOF(fsPropOffset))); - if (err != -1) + rep = (fsListFontsWithXInfoReply *) fs_get_reply (conn, &ret); + if (rep == 0) { - if (conn->fsMajorVersion > 1) - err = _fs_read(conn, (char *) pd, pi.data_len); - else - err = _fs_read_pad(conn, (char *) pd, pi.data_len); + if (ret == FSIO_BLOCK) + return StillWorking; + binfo->status = FS_LFWI_FINISHED; + err = AllocError; + goto done; } - if (err != -1 && conn->fsMajorVersion != 1) + /* + * Normal termination -- the list ends with a name of length 0 + */ + if (rep->nameLength == 0) { - err = _fs_read(conn, name, rep.nameLength); - if (err != -1) - err = _fs_drain_bytes(conn, padlength[(pi.data_len+rep.nameLength)&3]); +#ifdef DEBUG + fprintf (stderr, "fs_read_list_info done\n"); +#endif + binfo->status = FS_LFWI_FINISHED; + err = BadFontName; + goto done; } - if (err == -1) { - xfree(name); - xfree(po); - xfree(pd); - xfree (binfo->pfi); - binfo->pfi = NULL; - goto done; + buf = (char *) rep + SIZEOF (fsListFontsWithXInfoReply); + + /* + * The original FS implementation didn't match + * the spec, version 1 was respecified to match the FS. + * Version 2 matches the original intent + */ + if (conn->fsMajorVersion <= 1) + { + memcpy (binfo->name, buf, rep->nameLength); + buf += _fs_pad_length (rep->nameLength); + } + pi = (fsPropInfo *) buf; + buf += SIZEOF (fsPropInfo); + po = (fsPropOffset *) buf; + buf += pi->num_offsets * SIZEOF (fsPropOffset); + pd = (pointer) buf; + buf += pi->data_len; + if (conn->fsMajorVersion > 1) + { + memcpy (binfo->name, buf, rep->nameLength); + buf += _fs_pad_length (rep->nameLength); } - if (_fs_convert_lfwi_reply(conn, binfo->pfi, &rep, &pi, po, pd) != Successful) +#ifdef DEBUG + binfo->name[rep->nameLength] = '\0'; + fprintf (stderr, "fs_read_list_info %s\n", binfo->name); +#endif + err = _fs_convert_lfwi_reply(conn, &binfo->info, rep, pi, po, pd); + if (err != Successful) { - xfree(name); - xfree(po); - xfree(pd); - xfree (binfo->pfi); - binfo->pfi = NULL; + binfo->status = FS_LFWI_FINISHED; goto done; } - xfree(po); - xfree(pd); - binfo->name = name; - binfo->namelen = rep.nameLength; - binfo->remaining = rep.nReplies; + binfo->namelen = rep->nameLength; + binfo->remaining = rep->nReplies; binfo->status = FS_LFWI_REPLY; - binfo->errcode = Suspended; + /* disable this font server until we've processed this response */ + _fs_unmark_block (conn, FS_COMPLETE_REPLY); FD_CLR(conn->fs_fd, &_fs_fd_mask); - - return Successful; - -done: - binfo->status = FS_LFWI_FINISHED; - binfo->errcode = BadFontName; - binfo->name = (char *) 0; - return Successful; +done: + _fs_done_read (conn, rep->length << 2); + return err; } /* ARGSUSED */ static int -fs_start_list_with_info(client, fpe, pattern, len, maxnames, pdata) - pointer client; - FontPathElementPtr fpe; - char *pattern; - int len; - int maxnames; - pointer *pdata; -{ - FSBlockDataPtr blockrec; - FSBlockedListInfoPtr blockedinfo; +fs_start_list_with_info(pointer client, FontPathElementPtr fpe, + char *pattern, int len, int maxnames, pointer *pdata) +{ + FSFpePtr conn = (FSFpePtr) fpe->private; + FSBlockDataPtr blockrec; + FSBlockedListInfoPtr binfo; fsListFontsWithXInfoReq req; - FSFpePtr conn = (FSFpePtr) fpe->private; - _fs_client_access (conn, client, FALSE); - _fs_client_resolution(conn); + if (conn->blockState & FS_GIVE_UP) + return BadFontName; /* make a new block record, and add it to the end of the list */ blockrec = fs_new_block_rec(fpe, client, FS_LIST_WITH_INFO); if (!blockrec) return AllocError; - blockedinfo = (FSBlockedListInfoPtr) blockrec->data; - bzero((char *) blockedinfo, sizeof(FSBlockedListInfoRec)); - blockedinfo->status = FS_LFWI_WAITING; - blockedinfo->errcode = Suspended; + + binfo = (FSBlockedListInfoPtr) blockrec->data; + bzero((char *) binfo, sizeof(FSBlockedListInfoRec)); + binfo->status = FS_LFWI_WAITING; + + if (conn->blockState & (FS_BROKEN_CONNECTION | FS_RECONNECTING)) + { + _fs_pending_reply (conn); + return Suspended; + } + + _fs_client_access (conn, client, FALSE); + _fs_client_resolution(conn); /* send the request */ req.reqType = FS_ListFontsWithXInfo; @@ -2481,6 +2440,8 @@ fs_start_list_with_info(client, fpe, pattern, len, maxnames, pdata) (void) _fs_write(conn, (char *) &req, SIZEOF(fsListFontsWithXInfoReq)); (void) _fs_write_pad(conn, pattern, len); + blockrec->sequenceNumber = conn->current_seq; + #ifdef NCD if (configData.ExtendedFontDiags) { char buf[256]; @@ -2492,35 +2453,26 @@ fs_start_list_with_info(client, fpe, pattern, len, maxnames, pdata) } #endif + _fs_prepare_for_reply (conn); return Successful; } /* ARGSUSED */ static int -fs_next_list_with_info(client, fpe, namep, namelenp, pFontInfo, numFonts, - private) - pointer client; - FontPathElementPtr fpe; - char **namep; - int *namelenp; - FontInfoPtr *pFontInfo; - int *numFonts; - pointer private; -{ - FSBlockDataPtr blockrec; - FSBlockedListInfoPtr blockedinfo; - FSFpePtr conn = (FSFpePtr) fpe->private; +fs_next_list_with_info(pointer client, FontPathElementPtr fpe, + char **namep, int *namelenp, + FontInfoPtr *pFontInfo, int *numFonts, + pointer private) +{ + FSFpePtr conn = (FSFpePtr) fpe->private; + FSBlockDataPtr blockrec; + FSBlockedListInfoPtr binfo; + int err; /* see if the result is already there */ - blockrec = (FSBlockDataPtr) conn->blocked_requests; - while (blockrec) { - if (blockrec->type == FS_LIST_WITH_INFO && - blockrec->client == client) { - blockedinfo = (FSBlockedListInfoPtr) blockrec->data; + for (blockrec = conn->blockedRequests; blockrec; blockrec = blockrec->next) + if (blockrec->type == FS_LIST_WITH_INFO && blockrec->client == client) break; - } - blockrec = blockrec->next; - } if (!blockrec) { @@ -2533,26 +2485,35 @@ fs_next_list_with_info(client, fpe, namep, namelenp, pFontInfo, numFonts, return BadFontName; } - if (blockedinfo->status == FS_LFWI_WAITING) + binfo = (FSBlockedListInfoPtr) blockrec->data; + + if (binfo->status == FS_LFWI_WAITING) return Suspended; - *namep = blockedinfo->name; - *namelenp = blockedinfo->namelen; - *pFontInfo = blockedinfo->pfi; - *numFonts = blockedinfo->remaining; + *namep = binfo->name; + *namelenp = binfo->namelen; + *pFontInfo = &binfo->info; + *numFonts = binfo->remaining; + + /* Restart reply processing from this font server */ FD_SET(conn->fs_fd, &_fs_fd_mask); - if (blockedinfo->status == FS_LFWI_FINISHED) { - int err = blockedinfo->errcode; - + if (fs_reply_ready (conn)) + _fs_mark_block (conn, FS_COMPLETE_REPLY); + + err = blockrec->errcode; + switch (binfo->status) { + case FS_LFWI_FINISHED: _fs_remove_block_rec(conn, blockrec); - return err; - } - if (blockedinfo->status == FS_LFWI_REPLY) { - blockedinfo->status = FS_LFWI_WAITING; - return Successful; - } else { - return blockedinfo->errcode; + break; + case FS_LFWI_REPLY: + binfo->status = FS_LFWI_WAITING; + blockrec->errcode = StillWorking; + conn->blockedReplyTime = GetTimeInMillis () + FontServerRequestTimeout; + _fs_mark_block (conn, FS_PENDING_REPLY); + break; } + + return err; } /* @@ -2560,17 +2521,15 @@ fs_next_list_with_info(client, fpe, namep, namelenp, pFontInfo, numFonts, */ static void -fs_client_died(client, fpe) - pointer client; - FontPathElementPtr fpe; +fs_client_died(pointer client, FontPathElementPtr fpe) { - FSFpePtr conn = (FSFpePtr) fpe->private; - FSBlockDataPtr blockrec, - depending; - FSClientPtr *prev, cur; - fsFreeACReq freeac; + FSFpePtr conn = (FSFpePtr) fpe->private; + FSBlockDataPtr blockrec, + depending; + FSClientPtr *prev, cur; + fsFreeACReq freeac; - for (prev = &conn->clients; cur = *prev; prev = &cur->next) + for (prev = &conn->clients; (cur = *prev); prev = &cur->next) { if (cur->client == client) { freeac.reqType = FS_FreeAC; @@ -2583,36 +2542,17 @@ fs_client_died(client, fpe) break; } } - /* see if the result is already there */ - blockrec = (FSBlockDataPtr) conn->blocked_requests; - while (blockrec) { + /* find a pending requests */ + for (blockrec = conn->blockedRequests; blockrec; blockrec = blockrec->next) if (blockrec->client == client) break; - blockrec = blockrec->next; - } + if (!blockrec) return; - if (blockrec->type == FS_LIST_WITH_INFO) - { - FSBlockedListInfoPtr binfo; - binfo = (FSBlockedListInfoPtr) blockrec->data; - if (binfo->status == FS_LFWI_REPLY) - FD_SET(conn->fs_fd, &_fs_fd_mask); - if (binfo->name) - { - xfree(binfo->name); - binfo->name = NULL; - } - if (binfo->pfi) - { - xfree(binfo->pfi->isStringProp); - xfree(binfo->pfi->props); - xfree(binfo->pfi); - binfo->pfi = NULL; - } - } + /* replace the client pointers in this block rec with the chained one */ - if (depending = blockrec->depending) { + if ((depending = blockrec->depending)) + { blockrec->client = depending->client; blockrec->depending = depending->depending; blockrec = depending; @@ -2621,20 +2561,22 @@ fs_client_died(client, fpe) } static void -_fs_client_access (conn, client, sync) - FSFpePtr conn; - pointer client; - Bool sync; +_fs_client_access (FSFpePtr conn, pointer client, Bool sync) { FSClientPtr *prev, cur; fsCreateACReq crac; fsSetAuthorizationReq setac; - fsGenericReply rep; char *authorizations; int authlen; Bool new_cur = FALSE; - for (prev = &conn->clients; cur = *prev; prev = &cur->next) +#ifdef DEBUG + if (conn->blockState & (FS_RECONNECTING|FS_BROKEN_CONNECTION)) + { + fprintf (stderr, "Sending requests without a connection\n"); + } +#endif + for (prev = &conn->clients; (cur = *prev); prev = &cur->next) { if (cur->client == client) { @@ -2678,15 +2620,6 @@ _fs_client_access (conn, client, sync) _fs_add_req_log(conn, FS_CreateAC); _fs_write(conn, (char *) &crac, sizeof (fsCreateACReq)); _fs_write(conn, authorizations, authlen); - /* if we're synchronous, open_font will be confused by - * the reply; eat it and continue - */ - if (sync) - { - if (_fs_read(conn, (char *) &rep, sizeof (fsGenericReply)) == -1) - return; - fs_handle_unexpected(conn, &rep); - } /* ignore reply; we don't even care about it */ conn->curacid = 0; cur->auth_generation = client_auth_generation(client); @@ -2703,11 +2636,512 @@ _fs_client_access (conn, client, sync) } /* + * Poll a pending connect + */ + +static int +_fs_check_connect (FSFpePtr conn) +{ + int ret; + + ret = _fs_poll_connect (conn->trans_conn, 0); + switch (ret) { + case FSIO_READY: + conn->fs_fd = _FontTransGetConnectionNumber (conn->trans_conn); + FD_SET (conn->fs_fd, &_fs_fd_mask); + break; + case FSIO_BLOCK: + break; + } + return ret; +} + +/* + * Return an FSIO status while waiting for the completed connection + * reply to arrive + */ + +static fsConnSetup * +_fs_get_conn_setup (FSFpePtr conn, int *error, int *setup_len) +{ + int ret; + char *data; + int headlen; + int len; + fsConnSetup *setup; + fsConnSetupAccept *accept; + + ret = _fs_start_read (conn, SIZEOF (fsConnSetup), &data); + if (ret != FSIO_READY) + { + *error = ret; + return 0; + } + + setup = (fsConnSetup *) data; + if (setup->major_version > FS_PROTOCOL) + { + *error = FSIO_ERROR; + return 0; + } + + headlen = (SIZEOF (fsConnSetup) + + (setup->alternate_len << 2) + + (setup->auth_len << 2)); + /* On anything but Success, no extra data is sent */ + if (setup->status != AuthSuccess) + { + len = headlen; + } + else + { + ret = _fs_start_read (conn, headlen + SIZEOF (fsConnSetupAccept), &data); + if (ret != FSIO_READY) + { + *error = ret; + return 0; + } + setup = (fsConnSetup *) data; + accept = (fsConnSetupAccept *) (data + headlen); + len = headlen + (accept->length << 2); + } + ret = _fs_start_read (conn, len, &data); + if (ret != FSIO_READY) + { + *error = ret; + return 0; + } + *setup_len = len; + return (fsConnSetup *) data; +} + +static int +_fs_send_conn_client_prefix (FSFpePtr conn) +{ + fsConnClientPrefix req; + int endian; + int ret; + + /* send setup prefix */ + endian = 1; + if (*(char *) &endian) + req.byteOrder = 'l'; + else + req.byteOrder = 'B'; + + req.major_version = FS_PROTOCOL; + req.minor_version = FS_PROTOCOL_MINOR; + +/* XXX add some auth info here */ + req.num_auths = 0; + req.auth_len = 0; + ret = _fs_write (conn, (char *) &req, SIZEOF (fsConnClientPrefix)); + if (ret != FSIO_READY) + return FSIO_ERROR; + conn->blockedConnectTime = GetTimeInMillis () + FontServerRequestTimeout; + return ret; +} + +static int +_fs_recv_conn_setup (FSFpePtr conn) +{ + int ret; + fsConnSetup *setup; + FSFpeAltPtr alts; + int i, alt_len; + int setup_len; + char *alt_save, *alt_names; + + setup = _fs_get_conn_setup (conn, &ret, &setup_len); + if (!setup) + return ret; + conn->current_seq = 0; + conn->fsMajorVersion = setup->major_version; + /* + * Create an alternate list from the initial server, but + * don't chain looking for alternates. + */ + if (conn->alternate == 0) + { + /* + * free any existing alternates list, allowing the list to + * be updated + */ + if (conn->alts) + { + xfree (conn->alts); + conn->alts = 0; + conn->numAlts = 0; + } + if (setup->num_alternates) + { + alts = (FSFpeAltPtr) xalloc (setup->num_alternates * + sizeof (FSFpeAltRec) + + (setup->alternate_len << 2)); + if (alts) + { + alt_names = (char *) (setup + 1); + alt_save = (char *) (alts + setup->num_alternates); + for (i = 0; i < setup->num_alternates; i++) + { + alts[i].subset = alt_names[0]; + alt_len = alt_names[1]; + alts[i].name = alt_save; + memcpy (alt_save, alt_names + 2, alt_len); + alt_save[alt_len] = '\0'; + alt_save += alt_len + 1; + alt_names += _fs_pad_length (alt_len + 2); + } + conn->numAlts = setup->num_alternates; + conn->alts = alts; + } + } + } + _fs_done_read (conn, setup_len); + if (setup->status != AuthSuccess) + return FSIO_ERROR; + return FSIO_READY; +} + +static int +_fs_open_server (FSFpePtr conn) +{ + int ret; + char *servername; + + if (conn->alternate == 0) + servername = conn->servername; + else + servername = conn->alts[conn->alternate-1].name; + conn->trans_conn = _fs_connect (servername, &ret); + conn->blockedConnectTime = GetTimeInMillis () + FS_RECONNECT_WAIT; + return ret; +} + +static char * +_fs_catalog_name (char *servername) +{ + char *sp; + + sp = strchr (servername, '/'); + if (!sp) + return 0; + return strrchr (sp + 1, '/'); +} + +static int +_fs_send_init_packets (FSFpePtr conn) +{ + fsSetResolutionReq srreq; + fsSetCataloguesReq screq; + int num_cats, + clen; + char *catalogues; + char *cat; + char len; + char *end; + int num_res; + FontResolutionPtr res; + +#define CATALOGUE_SEP '+' + + res = GetClientResolutions(&num_res); + if (num_res) + { + srreq.reqType = FS_SetResolution; + srreq.num_resolutions = num_res; + srreq.length = (SIZEOF(fsSetResolutionReq) + + (num_res * SIZEOF(fsResolution)) + 3) >> 2; + + _fs_add_req_log(conn, FS_SetResolution); + if (_fs_write(conn, (char *) &srreq, SIZEOF(fsSetResolutionReq)) != FSIO_READY) + return FSIO_ERROR; + if (_fs_write_pad(conn, (char *) res, (num_res * SIZEOF(fsResolution))) != FSIO_READY) + return FSIO_ERROR; + } + + catalogues = 0; + if (conn->alternate != 0) + catalogues = _fs_catalog_name (conn->alts[conn->alternate-1].name); + if (!catalogues) + catalogues = _fs_catalog_name (conn->servername); + + if (!catalogues) + { + conn->has_catalogues = FALSE; + return FSIO_READY; + } + conn->has_catalogues = TRUE; + + /* turn cats into counted list */ + catalogues++; + + cat = catalogues; + num_cats = 0; + clen = 0; + while (*cat) + { + num_cats++; + end = strchr(cat, CATALOGUE_SEP); + if (!end) + end = cat + strlen (cat); + clen += (end - cat) + 1; /* length byte + string */ + cat = end; + } + + screq.reqType = FS_SetCatalogues; + screq.num_catalogues = num_cats; + screq.length = (SIZEOF(fsSetCataloguesReq) + clen + 3) >> 2; + + _fs_add_req_log(conn, FS_SetCatalogues); + if (_fs_write(conn, (char *) &screq, SIZEOF(fsSetCataloguesReq)) != FSIO_READY) + return FSIO_ERROR; + + while (*cat) + { + num_cats++; + end = strchr(cat, CATALOGUE_SEP); + if (!end) + end = cat + strlen (cat); + len = end - cat; + if (_fs_write (conn, &len, 1) != FSIO_READY) + return FSIO_ERROR; + if (_fs_write (conn, cat, (int) len) != FSIO_READY) + return FSIO_ERROR; + cat = end; + } + + if (_fs_write (conn, "....", _fs_pad_length (clen) - clen) != FSIO_READY) + return FSIO_ERROR; + + return FSIO_READY; +} + +static int +_fs_send_cat_sync (FSFpePtr conn) +{ + fsListCataloguesReq lcreq; + + /* + * now sync up with the font server, to see if an error was generated + * by a bogus catalogue + */ + lcreq.reqType = FS_ListCatalogues; + lcreq.length = (SIZEOF(fsListCataloguesReq)) >> 2; + lcreq.maxNames = 0; + lcreq.nbytes = 0; + _fs_add_req_log(conn, FS_SetCatalogues); + if (_fs_write(conn, (char *) &lcreq, SIZEOF(fsListCataloguesReq)) != FSIO_READY) + return FSIO_ERROR; + conn->blockedConnectTime = GetTimeInMillis () + FontServerRequestTimeout; + return FSIO_READY; +} + +static int +_fs_recv_cat_sync (FSFpePtr conn) +{ + fsGenericReply *reply; + fsError *error; + int err; + int ret; + + reply = fs_get_reply (conn, &err); + if (!reply) + return err; + + ret = FSIO_READY; + if (reply->type == FS_Error) + { + error = (fsError *) reply; + if (error->major_opcode == FS_SetCatalogues) + ret = FSIO_ERROR; + } + _fs_done_read (conn, reply->length << 2); + return ret; +} + +static void +_fs_close_server (FSFpePtr conn) +{ + _fs_unmark_block (conn, FS_PENDING_WRITE|FS_BROKEN_WRITE|FS_COMPLETE_REPLY|FS_BROKEN_CONNECTION); + if (conn->trans_conn) + { + _FontTransClose (conn->trans_conn); + conn->trans_conn = 0; + _fs_io_reinit (conn); + } + if (conn->fs_fd >= 0) + { + FD_CLR (conn->fs_fd, &_fs_fd_mask); + conn->fs_fd = -1; + } + conn->fs_conn_state = FS_CONN_UNCONNECTED; +} + +static int +_fs_do_setup_connection (FSFpePtr conn) +{ + int ret; + + do + { +#ifdef DEBUG + fprintf (stderr, "fs_do_setup_connection state %d\n", conn->fs_conn_state); +#endif + switch (conn->fs_conn_state) { + case FS_CONN_UNCONNECTED: + ret = _fs_open_server (conn); + if (ret == FSIO_BLOCK) + conn->fs_conn_state = FS_CONN_CONNECTING; + break; + case FS_CONN_CONNECTING: + ret = _fs_check_connect (conn); + break; + case FS_CONN_CONNECTED: + ret = _fs_send_conn_client_prefix (conn); + break; + case FS_CONN_SENT_PREFIX: + ret = _fs_recv_conn_setup (conn); + break; + case FS_CONN_RECV_INIT: + ret = _fs_send_init_packets (conn); + if (conn->has_catalogues) + ret = _fs_send_cat_sync (conn); + break; + case FS_CONN_SENT_CAT: + if (conn->has_catalogues) + ret = _fs_recv_cat_sync (conn); + else + ret = FSIO_READY; + break; + default: + ret = FSIO_READY; + break; + } + switch (ret) { + case FSIO_READY: + if (conn->fs_conn_state < FS_CONN_RUNNING) + conn->fs_conn_state++; + break; + case FSIO_BLOCK: + if (TimeCmp (GetTimeInMillis (), <, conn->blockedConnectTime)) + break; + ret = FSIO_ERROR; + /* fall through... */ + case FSIO_ERROR: + _fs_close_server (conn); + /* + * Try the next alternate + */ + if (conn->alternate < conn->numAlts) + { + conn->alternate++; + ret = FSIO_READY; + } + else + conn->alternate = 0; + break; + } + } while (conn->fs_conn_state != FS_CONN_RUNNING && ret == FSIO_READY); + if (ret == FSIO_READY) + conn->generation = ++generationCount; + return ret; +} + +static int +_fs_wait_connect (FSFpePtr conn) +{ + int ret; + + for (;;) + { + ret = _fs_do_setup_connection (conn); + if (ret != FSIO_BLOCK) + break; + if (conn->fs_conn_state <= FS_CONN_CONNECTING) + ret = _fs_poll_connect (conn->trans_conn, 1000); + else + ret = _fs_wait_for_readable (conn, 1000); + if (ret == FSIO_ERROR) + break; + } + return ret; +} + +/* + * Poll a connection in the process of reconnecting + */ +static void +_fs_check_reconnect (FSFpePtr conn) +{ + int ret; + + ret = _fs_do_setup_connection (conn); + switch (ret) { + case FSIO_READY: + _fs_unmark_block (conn, FS_RECONNECTING|FS_GIVE_UP); + _fs_restart_connection (conn); + break; + case FSIO_BLOCK: + break; + case FSIO_ERROR: + conn->brokenConnectionTime = GetTimeInMillis () + FS_RECONNECT_POLL; + break; + } +} + +/* + * Start the reconnection process + */ +static void +_fs_start_reconnect (FSFpePtr conn) +{ + if (conn->blockState & FS_RECONNECTING) + return; + conn->alternate = 0; + _fs_mark_block (conn, FS_RECONNECTING); + _fs_unmark_block (conn, FS_BROKEN_CONNECTION); + _fs_check_reconnect (conn); +} + + +static FSFpePtr +_fs_init_conn (char *servername) +{ + FSFpePtr conn; + + conn = xalloc (sizeof (FSFpeRec) + strlen (servername) + 1); + if (!conn) + return 0; + memset (conn, '\0', sizeof (FSFpeRec)); + if (!_fs_io_init (conn)) + { + xfree (conn); + return 0; + } + conn->servername = (char *) (conn + 1); + conn->fs_conn_state = FS_CONN_UNCONNECTED; + conn->fs_fd = -1; + strcpy (conn->servername, servername); + return conn; +} + +static void +_fs_free_conn (FSFpePtr conn) +{ + _fs_close_server (conn); + _fs_io_fini (conn); + if (conn->alts) + xfree (conn->alts); + xfree (conn); +} + +/* * called at server init time */ void -fs_register_fpe_functions() +fs_register_fpe_functions(void) { fs_font_type = RegisterFPEFunctions(fs_name_check, fs_init_fpe, @@ -2718,28 +3152,20 @@ fs_register_fpe_functions() fs_list_fonts, fs_start_list_with_info, fs_next_list_with_info, - fs_wakeup, + (WakeupFpeFunc)fs_wakeup, fs_client_died, _fs_load_glyphs, - (int (*))0, - (int (*))0, - (void (*))0); + NULL, + NULL, + NULL); } static int -check_fs_open_font(client, fpe, flags, name, namelen, format, fmask, id, ppfont, - alias, non_cachable_font) - pointer client; - FontPathElementPtr fpe; - Mask flags; - char *name; - fsBitmapFormat format; - fsBitmapFormatMask fmask; - int namelen; - XID id; - FontPtr *ppfont; - char **alias; - FontPtr non_cachable_font; /* Not used in this FPE */ +check_fs_open_font(pointer client, FontPathElementPtr fpe, Mask flags, + char *name, int namelen, + fsBitmapFormat format, fsBitmapFormatMask fmask, + XID id, FontPtr *ppfont, + char **alias, FontPtr non_cachable_font) { if (XpClientIsBitmapClient(client)) return (fs_open_font(client, fpe, flags, name, namelen, format, @@ -2748,13 +3174,9 @@ check_fs_open_font(client, fpe, flags, name, namelen, format, fmask, id, ppfont, } static int -check_fs_list_fonts(client, fpe, pattern, patlen, maxnames, newnames) - pointer client; - FontPathElementPtr fpe; - char *pattern; - int patlen; - int maxnames; - FontNamesPtr newnames; +check_fs_list_fonts(pointer client, FontPathElementPtr fpe, + char *pattern, int patlen, int maxnames, + FontNamesPtr newnames) { if (XpClientIsBitmapClient(client)) return (fs_list_fonts(client, fpe, pattern, patlen, maxnames, @@ -2763,13 +3185,9 @@ check_fs_list_fonts(client, fpe, pattern, patlen, maxnames, newnames) } static int -check_fs_start_list_with_info(client, fpe, pattern, len, maxnames, pdata) - pointer client; - FontPathElementPtr fpe; - char *pattern; - int len; - int maxnames; - pointer *pdata; +check_fs_start_list_with_info(pointer client, FontPathElementPtr fpe, + char *pattern, int len, int maxnames, + pointer *pdata) { if (XpClientIsBitmapClient(client)) return (fs_start_list_with_info(client, fpe, pattern, len, maxnames, @@ -2778,15 +3196,10 @@ check_fs_start_list_with_info(client, fpe, pattern, len, maxnames, pdata) } static int -check_fs_next_list_with_info(client, fpe, namep, namelenp, pFontInfo, numFonts, - private) - pointer client; - FontPathElementPtr fpe; - char **namep; - int *namelenp; - FontInfoPtr *pFontInfo; - int *numFonts; - pointer private; +check_fs_next_list_with_info(pointer client, FontPathElementPtr fpe, + char **namep, int *namelenp, + FontInfoPtr *pFontInfo, int *numFonts, + pointer private) { if (XpClientIsBitmapClient(client)) return (fs_next_list_with_info(client, fpe, namep, namelenp, pFontInfo, @@ -2795,7 +3208,7 @@ check_fs_next_list_with_info(client, fpe, namep, namelenp, pFontInfo, numFonts, } void -check_fs_register_fpe_functions() +check_fs_register_fpe_functions(void) { fs_font_type = RegisterFPEFunctions(fs_name_check, fs_init_fpe, @@ -2806,10 +3219,10 @@ check_fs_register_fpe_functions() check_fs_list_fonts, check_fs_start_list_with_info, check_fs_next_list_with_info, - fs_wakeup, + (WakeupFpeFunc)fs_wakeup, fs_client_died, _fs_load_glyphs, - (int (*))0, - (int (*))0, - (void (*))0); + NULL, + NULL, + NULL); } diff --git a/src/fc/fserve.h b/src/fc/fserve.h index b5370d0..9d69257 100644 --- a/src/fc/fserve.h +++ b/src/fc/fserve.h @@ -24,6 +24,7 @@ * Author: Dave Lemke, Network Computing Devices, Inc * */ +/* $XFree86: xc/lib/font/fc/fserve.h,v 1.5 2001/04/05 17:42:28 dawes Exp $ */ #ifndef _FSERVE_H_ #define _FSERVE_H_ @@ -50,6 +51,12 @@ #define FS_LFWI_REPLY 1 #define FS_LFWI_FINISHED 2 +/* states of connection */ +#define FS_CONN_CLOSED 0 +#define FS_CONN_CONNECTING 1 +#define FS_CONN_READ_HEADER 2 +#define FS_CONN_READ_DATA 3 + #define AccessDone 0x400 typedef struct _fs_font_data *FSFontDataPtr; @@ -59,10 +66,31 @@ typedef struct _fs_blocked_list *FSBlockedListPtr; typedef struct _fs_blocked_list_info *FSBlockedListInfoPtr; typedef struct _fs_block_data *FSBlockDataPtr; typedef struct _fs_font_table *FSFontTablePtr; +typedef struct _fs_fpe_data *FSFpePtr; typedef struct _fs_blocked_bitmaps *FSBlockedBitmapPtr; typedef struct _fs_blocked_extents *FSBlockedExtentPtr; -extern void fs_convert_char_info(); +extern void _fs_convert_char_info ( fsXCharInfo *src, xCharInfo *dst ); +extern void _fs_free_props (FontInfoPtr pfi); +extern FontPtr fs_create_font (FontPathElementPtr fpe, + char *name, + int namelen, + fsBitmapFormat format, + fsBitmapFormatMask fmask); + +extern int fs_load_all_glyphs ( FontPtr pfont ); +extern int _fs_load_glyphs ( pointer client, FontPtr pfont, Bool range_flag, + unsigned int nchars, int item_size, + unsigned char *data ); + +/* + * These should be declared elsewhere, but I'm concerned that moving them + * would cause problems building other pieces + */ +extern FontPtr find_old_font (Font id); +extern int set_font_authorizations (char **a, int *len, pointer client); +extern long GetTimeInMillis (void); + #endif /* _FSERVE_H_ */ diff --git a/src/fc/fservestr.h b/src/fc/fservestr.h index 891d4ae..20c85f6 100644 --- a/src/fc/fservestr.h +++ b/src/fc/fservestr.h @@ -23,6 +23,7 @@ * * Author: Dave Lemke, Network Computing Devices, Inc */ +/* $XFree86: xc/lib/font/fc/fservestr.h,v 3.4 2001/07/25 15:04:56 dawes Exp $ */ #ifndef _FSERVESTR_H_ #define _FSERVESTR_H_ @@ -37,18 +38,21 @@ * font server private storage */ +typedef struct _fs_glyph { + struct _fs_glyph *next; +} FSGlyphRec, *FSGlyphPtr; typedef struct _fs_font { CharInfoPtr pDefault; CharInfoPtr encoding; CharInfoPtr inkMetrics; + FSGlyphPtr glyphs; } FSFontRec, *FSFontPtr; /* FS special data for the font */ typedef struct _fs_font_data { long fontid; int generation; /* FS generation when opened */ - FontPathElementPtr fpe; unsigned long glyphs_to_get; /* # glyphs remaining to be gotten */ /* Following data needed in case font needs to be reopened. */ @@ -65,22 +69,23 @@ typedef struct fs_clients_depending { /* OpenFont specific data for blocked request */ typedef struct _fs_blocked_font { - FontPtr pfont; + FontPtr pfont; /* must be first for fs_read_glyphs */ long fontid; int state; /* how many of the replies have landed */ - int errcode; int flags; + Bool freeFont; /* free this font on failure */ + CARD16 queryInfoSequence; + CARD16 queryExtentsSequence; + CARD16 queryBitmapsSequence; fsBitmapFormat format; FSClientsDependingPtr clients_depending; } FSBlockedFontRec; /* LoadGlyphs data for blocked request */ typedef struct _fs_blocked_glyphs { - FontPtr pfont; + FontPtr pfont; /* must be first for fs_read_glyphs */ int num_expected_ranges; fsRange *expected_ranges; - int errcode; - Bool done; FSClientsDependingPtr clients_depending; } FSBlockedGlyphRec; @@ -89,7 +94,6 @@ typedef struct _fs_blocked_extents { FontPtr pfont; fsRange *expected_ranges; int nranges; - Bool done; unsigned long nextents; fsXCharInfo *extents; } FSBlockedExtentRec; @@ -99,7 +103,6 @@ typedef struct _fs_blocked_bitmaps { FontPtr pfont; fsRange *expected_ranges; int nranges; - Bool done; unsigned long size; unsigned long nglyphs; fsOffset32 *offsets; @@ -109,29 +112,25 @@ typedef struct _fs_blocked_bitmaps { /* state for blocked ListFonts */ typedef struct _fs_blocked_list { FontNamesPtr names; - int patlen; - int errcode; - Bool done; } FSBlockedListRec; /* state for blocked ListFontsWithInfo */ typedef struct _fs_blocked_list_info { int status; - char *name; int namelen; - FontInfoPtr pfi; + FontInfoRec info; + char name[256]; int remaining; - int errcode; } FSBlockedListInfoRec; /* state for blocked request */ typedef struct _fs_block_data { - int type; /* Open Font, LoadGlyphs, ListFonts, - * ListWithInfo */ + int type; /* Open Font, LoadGlyphs, ListFonts, + * ListWithInfo */ pointer client; /* who wants it */ - int sequence_number;/* expected */ - fsGenericReply header; + CARD16 sequenceNumber; /* expected */ pointer data; /* type specific data */ + int errcode; /* Suspended, et al. */ struct _fs_block_data *depending; /* clients depending on this one */ struct _fs_block_data *next; } FSBlockDataRec; @@ -142,7 +141,7 @@ typedef struct _fs_reconnect { } FSReconnectRec, *FSReconnectPtr; -#if (defined(__STDC__) && !defined(UNIXCPP)) || defined(ANSICPP) +#if !defined(UNIXCPP) || defined(ANSICPP) #define fsCat(x,y) x##_##y #else #define fsCat(x,y) x/**/_/**/y @@ -184,5 +183,29 @@ typedef struct _fs_reconnect { fsUnpack_XCharInfo((packet)->font_header_max_bounds, &(structure)->maxbounds); \ fsUnpack_XCharInfo((packet)->font_header_max_bounds, &(structure)->ink_maxbounds) - +extern void _fs_init_fontinfo ( FSFpePtr conn, FontInfoPtr pfi ); +extern int _fs_convert_props ( fsPropInfo *pi, fsPropOffset *po, pointer pd, + FontInfoPtr pfi ); +extern int _fs_convert_lfwi_reply ( FSFpePtr conn, FontInfoPtr pfi, + fsListFontsWithXInfoReply *fsrep, + fsPropInfo *pi, fsPropOffset *po, + pointer pd ); +extern int fs_build_range ( FontPtr pfont, Bool range_flag, + unsigned int count, int item_size, + unsigned char *data, int *nranges, + fsRange **ranges ); +extern void _fs_clean_aborted_loadglyphs ( FontPtr pfont, + int num_expected_ranges, + fsRange *expected_ranges ); +extern int _fs_check_extents ( FontPtr pfont, Mask flags, int nranges, + fsRange *range, FSBlockDataPtr blockrec ); +extern int _fs_check_bitmaps ( FontPtr pfont, fsBitmapFormat format, + Mask flags, int nranges, fsRange *range, + FSBlockDataPtr blockrec ); +extern int _fs_get_glyphs ( FontPtr pFont, unsigned long count, + unsigned char *chars, FontEncoding charEncoding, + unsigned long *glyphCount, CharInfoPtr *glyphs ); +extern void _fs_unload_font ( FontPtr pfont ); +extern void _fs_init_font ( FontPtr pfont ); +extern pointer fs_alloc_glyphs (FontPtr pFont, int size); #endif /* _FSERVESTR_H_ */ diff --git a/src/fc/fsio.c b/src/fc/fsio.c index 578d86a..b5d9de0 100644 --- a/src/fc/fsio.c +++ b/src/fc/fsio.c @@ -23,6 +23,7 @@ * * Author: Dave Lemke, Network Computing Devices, Inc */ +/* $XFree86: xc/lib/font/fc/fsio.c,v 3.16 2002/05/31 18:45:49 dawes Exp $ */ /* * font server i/o routines */ @@ -31,113 +32,84 @@ #define _WILLWINSOCK_ #endif -#include "FS.h" -#include "FSproto.h" - #include "X11/Xtrans.h" #include "X11/Xpoll.h" +#include "FS.h" +#include "FSproto.h" #include "fontmisc.h" -#include "fsio.h" +#include "fontstruct.h" +#include "fservestr.h" #include <stdio.h> #include <signal.h> #include <sys/types.h> -#ifndef WIN32 +#if !defined(WIN32) +#ifndef Lynx #include <sys/socket.h> +#else +#include <socket.h> +#endif #endif #include <errno.h> -#ifdef X_NOT_STDC_ENV -extern int errno; -#endif #ifdef WIN32 #define EWOULDBLOCK WSAEWOULDBLOCK #undef EINTR #define EINTR WSAEINTR #endif -/* check for both EAGAIN and EWOULDBLOCK, because some supposedly POSIX - * systems are broken and return EWOULDBLOCK when they should return EAGAIN - */ -#ifdef WIN32 -#define ETEST() (WSAGetLastError() == WSAEWOULDBLOCK) -#else -#if defined(EAGAIN) && defined(EWOULDBLOCK) -#define ETEST() (errno == EAGAIN || errno == EWOULDBLOCK) -#else -#ifdef EAGAIN -#define ETEST() (errno == EAGAIN) -#else -#define ETEST() (errno == EWOULDBLOCK) -#endif -#endif -#endif -#ifdef WIN32 -#define ECHECK(err) (WSAGetLastError() == err) -#define ESET(val) WSASetLastError(val) -#else -#define ECHECK(err) (errno == err) -#define ESET(val) errno = val +#ifdef __UNIXOS2__ +#define select(n,r,w,x,t) os2PseudoSelect(n,r,w,x,t) #endif + static int padlength[4] = {0, 3, 2, 1}; fd_set _fs_fd_mask; -int _fs_wait_for_readable(); +static int +_fs_resize (FSBufPtr buf, long size); -#ifdef SIGNALRETURNSINT -#define SIGNAL_T int -#else -#define SIGNAL_T void -#endif - -/* ARGSUSED */ -static SIGNAL_T -_fs_alarm(foo) - int foo; +static void +_fs_downsize (FSBufPtr buf, long size); + +int +_fs_poll_connect (XtransConnInfo trans_conn, int timeout) { - return; + fd_set w_mask; + struct timeval tv; + int fs_fd = _FontTransGetConnectionNumber (trans_conn); + int ret; + + do + { + tv.tv_usec = 0; + tv.tv_sec = timeout; + FD_ZERO (&w_mask); + FD_SET (fs_fd, &w_mask); + ret = Select (fs_fd + 1, NULL, &w_mask, NULL, &tv); + } while (ret < 0 && ECHECK(EINTR)); + if (ret == 0) + return FSIO_BLOCK; + if (ret < 0) + return FSIO_ERROR; + return FSIO_READY; } -static XtransConnInfo -_fs_connect(servername, timeout) - char *servername; - int timeout; +XtransConnInfo +_fs_connect(char *servername, int *err) { - XtransConnInfo trans_conn; /* transport connection object */ - int ret = -1; -#ifdef SIGALRM - unsigned oldTime; - - SIGNAL_T(*oldAlarm) (); -#endif + XtransConnInfo trans_conn; /* transport connection object */ + int ret; + int i = 0; + int retries = 5; /* * Open the network connection. */ if( (trans_conn=_FontTransOpenCOTSClient(servername)) == NULL ) - { - return (NULL); - } - -#ifdef SIGALRM - oldTime = alarm((unsigned) 0); - oldAlarm = signal(SIGALRM, _fs_alarm); - alarm((unsigned) timeout); -#endif - - ret = _FontTransConnect(trans_conn,servername); - -#ifdef SIGALRM - alarm((unsigned) 0); - signal(SIGALRM, oldAlarm); - alarm(oldTime); -#endif - - if (ret < 0) - { - _FontTransClose(trans_conn); - return (NULL); - } + { + *err = FSIO_ERROR; + return 0; + } /* * Set the connection non-blocking since we use select() to block. @@ -145,330 +117,310 @@ _fs_connect(servername, timeout) _FontTransSetOption(trans_conn, TRANS_NONBLOCKING, 1); - return trans_conn; -} - -static int generationCount; - -/* ARGSUSED */ -static Bool -_fs_setup_connection(conn, servername, timeout, copy_name_p) - FSFpePtr conn; - char *servername; - int timeout; - Bool copy_name_p; -{ - fsConnClientPrefix prefix; - fsConnSetup rep; - int setuplength; - fsConnSetupAccept conn_accept; - int endian; - int i; - int alt_len; - char *auth_data = NULL, - *vendor_string = NULL, - *alt_data = NULL, - *alt_dst; - FSFpeAltPtr alts; - int nalts; - - if ((conn->trans_conn = _fs_connect(servername, 5)) == NULL) - return FALSE; - - conn->fs_fd = _FontTransGetConnectionNumber (conn->trans_conn); - - conn->generation = ++generationCount; + do { + if (i == TRANS_TRY_CONNECT_AGAIN) + sleep(1); + i = _FontTransConnect(trans_conn,servername); + } while ((i == TRANS_TRY_CONNECT_AGAIN) && (retries-- > 0)); - /* send setup prefix */ - endian = 1; - if (*(char *) &endian) - prefix.byteOrder = 'l'; + if (i < 0) + { + if (i == TRANS_IN_PROGRESS) + ret = FSIO_BLOCK; + else + ret = FSIO_ERROR; + } else - prefix.byteOrder = 'B'; - - prefix.major_version = FS_PROTOCOL; - prefix.minor_version = FS_PROTOCOL_MINOR; + ret = FSIO_READY; -/* XXX add some auth info here */ - prefix.num_auths = 0; - prefix.auth_len = 0; - - if (_fs_write(conn, (char *) &prefix, SIZEOF(fsConnClientPrefix)) == -1) - return FALSE; - - /* read setup info */ - if (_fs_read(conn, (char *) &rep, SIZEOF(fsConnSetup)) == -1) - return FALSE; + if (ret == FSIO_ERROR) + { + _FontTransClose(trans_conn); + trans_conn = 0; + } - conn->fsMajorVersion = rep.major_version; - if (rep.major_version > FS_PROTOCOL) - return FALSE; + *err = ret; + return trans_conn; +} - alts = 0; - /* parse alternate list */ - if ((nalts = rep.num_alternates)) { - setuplength = rep.alternate_len << 2; - alts = (FSFpeAltPtr) xalloc(nalts * sizeof(FSFpeAltRec) + - setuplength); - if (!alts) { - _FontTransClose(conn->trans_conn); - errno = ENOMEM; - return FALSE; - } - alt_data = (char *) (alts + nalts); - if (_fs_read(conn, (char *) alt_data, setuplength) == -1) { - xfree(alts); - return FALSE; +int +_fs_fill (FSFpePtr conn) +{ + long avail, need; + long bytes_read; + Bool waited = FALSE; + + if (_fs_flush (conn) < 0) + return FSIO_ERROR; + /* + * Don't go overboard here; stop reading when we've + * got enough to satisfy the pending request + */ + while ((need = conn->inNeed - (conn->inBuf.insert - + conn->inBuf.remove)) > 0) + { + avail = conn->inBuf.size - conn->inBuf.insert; + /* + * For SVR4 with a unix-domain connection, ETEST() after selecting + * readable means the server has died. To do this here, we look for + * two consecutive reads returning ETEST(). + */ + ESET (0); + bytes_read =_FontTransRead(conn->trans_conn, + conn->inBuf.buf + conn->inBuf.insert, + avail); + if (bytes_read > 0) { + conn->inBuf.insert += bytes_read; + waited = FALSE; } - alt_dst = alt_data; - for (i = 0; i < nalts; i++) { - alts[i].subset = alt_data[0]; - alt_len = alt_data[1]; - alts[i].name = alt_dst; - memmove(alt_dst, alt_data + 2, alt_len); - alt_dst[alt_len] = '\0'; - alt_dst += (alt_len + 1); - alt_data += (2 + alt_len + padlength[(2 + alt_len) & 3]); + else + { + if (bytes_read == 0 || ETEST ()) + { + if (!waited) + { + waited = TRUE; + if (_fs_wait_for_readable (conn, 0) == FSIO_BLOCK) + return FSIO_BLOCK; + continue; + } + } + _fs_connection_died (conn); + return FSIO_ERROR; } } - if (conn->alts) - xfree(conn->alts); - conn->alts = alts; - conn->numAlts = nalts; - - setuplength = rep.auth_len << 2; - if (setuplength && - !(auth_data = (char *) xalloc((unsigned int) setuplength))) { - _FontTransClose(conn->trans_conn); - errno = ENOMEM; - return FALSE; - } - if (_fs_read(conn, (char *) auth_data, setuplength) == -1) { - xfree(auth_data); - return FALSE; - } - if (rep.status != AuthSuccess) { - xfree(auth_data); - _FontTransClose(conn->trans_conn); - errno = EPERM; - return FALSE; - } - /* get rest */ - if (_fs_read(conn, (char *) &conn_accept, (long) SIZEOF(fsConnSetupAccept)) == -1) { - xfree(auth_data); - return FALSE; - } - if ((vendor_string = (char *) - xalloc((unsigned) conn_accept.vendor_len + 1)) == NULL) { - xfree(auth_data); - _FontTransClose(conn->trans_conn); - errno = ENOMEM; - return FALSE; - } - if (_fs_read_pad(conn, (char *) vendor_string, conn_accept.vendor_len) == -1) { - xfree(vendor_string); - xfree(auth_data); - return FALSE; + return FSIO_READY; +} + +/* + * Make space and return whether data have already arrived + */ + +int +_fs_start_read (FSFpePtr conn, long size, char **buf) +{ + int ret; + + conn->inNeed = size; + if (fs_inqueued(conn) < size) + { + if (_fs_resize (&conn->inBuf, size) != FSIO_READY) + { + _fs_connection_died (conn); + return FSIO_ERROR; + } + ret = _fs_fill (conn); + if (ret == FSIO_ERROR) + return ret; + if (ret == FSIO_BLOCK || fs_inqueued(conn) < size) + return FSIO_BLOCK; } - xfree(auth_data); - xfree(vendor_string); + if (buf) + *buf = conn->inBuf.buf + conn->inBuf.remove; + return FSIO_READY; +} - if (copy_name_p) +void +_fs_done_read (FSFpePtr conn, long size) +{ + if (conn->inBuf.insert - conn->inBuf.remove < size) { - conn->servername = (char *) xalloc(strlen(servername) + 1); - if (conn->servername == NULL) - return FALSE; - strcpy(conn->servername, servername); +#ifdef DEBUG + fprintf (stderr, "_fs_done_read skipping to many bytes\n"); +#endif + return; } - else - conn->servername = servername; + conn->inBuf.remove += size; + conn->inNeed -= size; + _fs_downsize (&conn->inBuf, FS_BUF_MAX); +} - return TRUE; +long +_fs_pad_length (long len) +{ + return len + padlength[len&3]; } -static Bool -_fs_try_alternates(conn, timeout) - FSFpePtr conn; - int timeout; +int +_fs_flush (FSFpePtr conn) { - int i; + long bytes_written; + long remain; + + /* XXX - hack. The right fix is to remember that the font server + has gone away when we first discovered it. */ + if (conn->fs_fd < 0) + return FSIO_ERROR; - for (i = 0; i < conn->numAlts; i++) - if (_fs_setup_connection(conn, conn->alts[i].name, timeout, TRUE)) - return TRUE; - return FALSE; + while ((remain = conn->outBuf.insert - conn->outBuf.remove) > 0) + { + bytes_written = _FontTransWrite(conn->trans_conn, + conn->outBuf.buf + conn->outBuf.remove, + (int) remain); + if (bytes_written > 0) + { + conn->outBuf.remove += bytes_written; + } + else + { + if (bytes_written == 0 || ETEST ()) + { + conn->brokenWriteTime = GetTimeInMillis () + FS_FLUSH_POLL; + _fs_mark_block (conn, FS_BROKEN_WRITE); + break; + } + if (!ECHECK (EINTR)) + { + _fs_connection_died (conn); + return FSIO_ERROR; + } + } + } + if (conn->outBuf.remove == conn->outBuf.insert) + { + _fs_unmark_block (conn, FS_BROKEN_WRITE|FS_PENDING_WRITE); + if (conn->outBuf.size > FS_BUF_INC) + conn->outBuf.buf = xrealloc (conn->outBuf.buf, FS_BUF_INC); + conn->outBuf.remove = conn->outBuf.insert = 0; + } + return FSIO_READY; } -#define FS_OPEN_TIMEOUT 30 -#define FS_REOPEN_TIMEOUT 10 - -FSFpePtr -_fs_open_server(servername) - char *servername; +static int +_fs_resize (FSBufPtr buf, long size) { - FSFpePtr conn; + char *new; + long new_size; - conn = (FSFpePtr) xalloc(sizeof(FSFpeRec)); - if (!conn) { - errno = ENOMEM; - return (FSFpePtr) NULL; - } - bzero((char *) conn, sizeof(FSFpeRec)); - if (!_fs_setup_connection(conn, servername, FS_OPEN_TIMEOUT, TRUE)) { - if (!_fs_try_alternates(conn, FS_OPEN_TIMEOUT)) { - xfree(conn->alts); - xfree(conn); - return (FSFpePtr) NULL; + if (buf->remove) + { + if (buf->remove != buf->insert) + { + memmove (buf->buf, + buf->buf + buf->remove, + buf->insert - buf->remove); } + buf->insert -= buf->remove; + buf->remove = 0; } - return conn; + if (buf->size - buf->remove < size) + { + new_size = ((buf->remove + size + FS_BUF_INC) / FS_BUF_INC) * FS_BUF_INC; + new = xrealloc (buf->buf, new_size); + if (!new) + return FSIO_ERROR; + buf->buf = new; + buf->size = new_size; + } + return FSIO_READY; } -Bool -_fs_reopen_server(conn) - FSFpePtr conn; +static void +_fs_downsize (FSBufPtr buf, long size) { - if (_fs_setup_connection(conn, conn->servername, FS_REOPEN_TIMEOUT, FALSE)) - return TRUE; - if (_fs_try_alternates(conn, FS_REOPEN_TIMEOUT)) - return TRUE; - return FALSE; + if (buf->insert == buf->remove) + { + buf->insert = buf->remove = 0; + if (buf->size > size) + { + buf->buf = xrealloc (buf->buf, size); + buf->size = size; + } + } } -/* - * expects everything to be here. *not* to be called when reading huge - * numbers of replies, but rather to get each chunk - */ -int -_fs_read(conn, data, size) - FSFpePtr conn; - char *data; - unsigned long size; +void +_fs_io_reinit (FSFpePtr conn) { - long bytes_read; - - if (size == 0) { - -#ifdef DEBUG - fprintf(stderr, "tried to read 0 bytes \n"); -#endif + conn->outBuf.insert = conn->outBuf.remove = 0; + _fs_downsize (&conn->outBuf, FS_BUF_INC); + conn->inBuf.insert = conn->inBuf.remove = 0; + _fs_downsize (&conn->inBuf, FS_BUF_MAX); +} - return 0; - } - ESET(0); - while ((bytes_read = _FontTransRead(conn->trans_conn, - data, (int) size)) != size) { - if (bytes_read > 0) { - size -= bytes_read; - data += bytes_read; - } else if (ETEST()) { - /* in a perfect world, this shouldn't happen */ - /* ... but then, its less than perfect... */ - if (_fs_wait_for_readable(conn) == -1) { /* check for error */ - _fs_connection_died(conn); - ESET(EPIPE); - return -1; - } - ESET(0); - } else if (ECHECK(EINTR)) { - continue; - } else { /* something bad happened */ - if (conn->fs_fd > 0) - _fs_connection_died(conn); - ESET(EPIPE); - return -1; - } +Bool +_fs_io_init (FSFpePtr conn) +{ + conn->outBuf.insert = conn->outBuf.remove = 0; + conn->outBuf.buf = xalloc (FS_BUF_INC); + if (!conn->outBuf.buf) + return FALSE; + conn->outBuf.size = FS_BUF_INC; + + conn->inBuf.insert = conn->inBuf.remove = 0; + conn->inBuf.buf = xalloc (FS_BUF_INC); + if (!conn->inBuf.buf) + { + xfree (conn->outBuf.buf); + conn->outBuf.buf = 0; + return FALSE; } - return 0; + conn->inBuf.size = FS_BUF_INC; + + return TRUE; } -int -_fs_write(conn, data, size) - FSFpePtr conn; - char *data; - unsigned long size; +void +_fs_io_fini (FSFpePtr conn) { - long bytes_written; + if (conn->outBuf.buf) + xfree (conn->outBuf.buf); + if (conn->inBuf.buf) + xfree (conn->inBuf.buf); +} +static int +_fs_do_write(FSFpePtr conn, char *data, long len, long size) +{ if (size == 0) { - #ifdef DEBUG fprintf(stderr, "tried to write 0 bytes \n"); #endif - - return 0; + return FSIO_READY; } - /* XXX - hack. The right fix is to remember that the font server - has gone away when we first discovered it. */ - if (!conn->trans_conn) - return -1; - - ESET(0); - while ((bytes_written = _FontTransWrite(conn->trans_conn, - data, (int) size)) != size) { - if (bytes_written > 0) { - size -= bytes_written; - data += bytes_written; - } else if (ETEST()) { - /* XXX -- we assume this can't happen */ - -#ifdef DEBUG - fprintf(stderr, "fs_write blocking\n"); -#endif - } else if (ECHECK(EINTR)) { - continue; - } else { /* something bad happened */ - _fs_connection_died(conn); - ESET(EPIPE); - return -1; + if (conn->fs_fd == -1) + return FSIO_ERROR; + + while (conn->outBuf.insert + size > conn->outBuf.size) + { + if (_fs_flush (conn) < 0) + return FSIO_ERROR; + if (_fs_resize (&conn->outBuf, size) < 0) + { + _fs_connection_died (conn); + return FSIO_ERROR; } } - return 0; + memcpy (conn->outBuf.buf + conn->outBuf.insert, data, len); + conn->outBuf.insert += size; + _fs_mark_block (conn, FS_PENDING_WRITE); + return FSIO_READY; } +/* + * Write the indicated bytes + */ int -_fs_read_pad(conn, data, len) - FSFpePtr conn; - char *data; - int len; +_fs_write (FSFpePtr conn, char *data, long len) { - char pad[3]; - - if (_fs_read(conn, data, len) == -1) - return -1; - - /* read the junk */ - if (padlength[len & 3]) { - return _fs_read(conn, pad, padlength[len & 3]); - } - return 0; + return _fs_do_write (conn, data, len, len); } - + +/* + * Write the indicated bytes adding any appropriate pad + */ int -_fs_write_pad(conn, data, len) - FSFpePtr conn; - char *data; - int len; +_fs_write_pad(FSFpePtr conn, char *data, long len) { - static char pad[3]; - - if (_fs_write(conn, data, len) == -1) - return -1; - - /* write the pad */ - if (padlength[len & 3]) { - return _fs_write(conn, pad, padlength[len & 3]); - } - return 0; + return _fs_do_write (conn, data, len, len + padlength[len & 3]); } /* * returns the amount of data waiting to be read */ int -_fs_data_ready(conn) - FSFpePtr conn; +_fs_data_ready(FSFpePtr conn) { BytesReadable_t readable; @@ -478,73 +430,65 @@ _fs_data_ready(conn) } int -_fs_wait_for_readable(conn) - FSFpePtr conn; +_fs_wait_for_readable(FSFpePtr conn, int ms) { - fd_set r_mask; - fd_set e_mask; + fd_set r_mask; + fd_set e_mask; int result; + struct timeval tv; -#ifdef DEBUG - fprintf(stderr, "read would block\n"); -#endif - - do { + for (;;) { + if (conn->fs_fd < 0) + return FSIO_ERROR; FD_ZERO(&r_mask); FD_ZERO(&e_mask); + tv.tv_sec = ms / 1000; + tv.tv_usec = (ms % 1000) * 1000; FD_SET(conn->fs_fd, &r_mask); FD_SET(conn->fs_fd, &e_mask); - result = Select(conn->fs_fd + 1, &r_mask, NULL, &e_mask, NULL); - if (result == -1) { + result = Select(conn->fs_fd + 1, &r_mask, NULL, &e_mask, &tv); + if (result < 0) + { if (ECHECK(EINTR) || ECHECK(EAGAIN)) continue; else - return -1; + return FSIO_ERROR; } - if (result && FD_ISSET(conn->fs_fd, &e_mask)) - return -1; - } while (result <= 0); - - return 0; + if (result == 0) + return FSIO_BLOCK; + if (FD_ISSET(conn->fs_fd, &r_mask)) + return FSIO_READY; + return FSIO_ERROR; + } } int -_fs_set_bit(mask, fd) - fd_set* mask; - int fd; +_fs_set_bit(fd_set *mask, int fd) { FD_SET(fd, mask); return fd; } int -_fs_is_bit_set(mask, fd) - fd_set* mask; - int fd; +_fs_is_bit_set(fd_set *mask, int fd) { return FD_ISSET(fd, mask); } void -_fs_bit_clear(mask, fd) - fd_set* mask; - int fd; +_fs_bit_clear(fd_set *mask, int fd) { FD_CLR(fd, mask); } int -_fs_any_bit_set(mask) - fd_set* mask; +_fs_any_bit_set(fd_set *mask) { return XFD_ANYSET(mask); } void -_fs_or_bits(dst, m1, m2) - fd_set* dst; - fd_set* m1; - fd_set* m2; +_fs_or_bits(fd_set *dst, fd_set *m1, fd_set *m2) { #ifdef WIN32 int i; @@ -564,49 +508,3 @@ _fs_or_bits(dst, m1, m2) XFD_ORSET(dst, m1, m2); #endif } - -int -_fs_drain_bytes(conn, len) - FSFpePtr conn; - int len; -{ - char buf[128]; - -#ifdef DEBUG - fprintf(stderr, "draining wire\n"); -#endif - - while (len > 0) { - if (_fs_read(conn, buf, (len < 128) ? len : 128) < 0) - return -1; - len -= 128; - } - return 0; -} - -void -_fs_drain_bytes_pad(conn, len) - FSFpePtr conn; - int len; -{ - _fs_drain_bytes(conn, len); - - /* read the junk */ - if (padlength[len & 3]) { - _fs_drain_bytes(conn, padlength[len & 3]); - } -} - -void -_fs_eat_rest_of_error(conn, err) - FSFpePtr conn; - fsError *err; -{ - int len = (err->length - (SIZEOF(fsGenericReply) >> 2)) << 2; - -#ifdef DEBUG - fprintf(stderr, "clearing error\n"); -#endif - - _fs_drain_bytes(conn, len); -} diff --git a/src/fc/fsio.h b/src/fc/fsio.h index dd33cdf..974ef4a 100644 --- a/src/fc/fsio.h +++ b/src/fc/fsio.h @@ -23,10 +23,12 @@ * * Author: Dave Lemke, Network Computing Devices, Inc */ +/* $XFree86: xc/lib/font/fc/fsio.h,v 1.6 2001/01/17 19:43:29 dawes Exp $ */ #ifndef _FSIO_H_ #define _FSIO_H_ +#undef DEBUG #define REQUEST_LOG_SIZE 100 typedef struct _fs_fpe_alternate { @@ -43,18 +45,52 @@ typedef struct _fs_client_data { int auth_generation; } FSClientRec, *FSClientPtr; -#define FS_RECONNECT_WAIT 5 -#define FS_MAX_RECONNECT_WAIT 80 +#define FS_RECONNECT_POLL 1000 +#define FS_RECONNECT_WAIT 5000 +#define FS_GIVEUP_WAIT 20000 +#define FS_REQUEST_TIMEOUT 20000 +#define FS_OPEN_TIMEOUT 30000 +#define FS_REOPEN_TIMEOUT 10000 +#define FS_FLUSH_POLL 1000 + +typedef struct _fs_buf { + char *buf; /* data */ + long size; /* sizeof data */ + long insert; /* where to insert new data */ + long remove; /* where to remove old data */ +} FSBufRec, *FSBufPtr; + +#define FS_BUF_INC 1024 +#define FS_BUF_MAX 32768 + +#define FS_PENDING_WRITE 0x01 /* some write data is queued */ +#define FS_BROKEN_WRITE 0x02 /* writes are broken */ +#define FS_BROKEN_CONNECTION 0x04 /* connection is broken */ +#define FS_PENDING_REPLY 0x08 /* waiting for a reply */ +#define FS_GIVE_UP 0x10 /* font server declared useless */ +#define FS_COMPLETE_REPLY 0x20 /* complete reply ready */ +#define FS_RECONNECTING 0x40 + +#define FS_CONN_UNCONNECTED 0 +#define FS_CONN_CONNECTING 1 +#define FS_CONN_CONNECTED 2 +#define FS_CONN_SENT_PREFIX 3 +#define FS_CONN_RECV_INIT 4 +#define FS_CONN_SENT_CAT 5 +#define FS_CONN_RUNNING 6 /* FS specific font FontPathElement data */ typedef struct _fs_fpe_data { - int fs_fd; + FSFpePtr next; /* list of all active fs fpes */ + int fs_fd; /* < 0 when not running */ + int fs_conn_state; /* connection state */ int current_seq; char *servername; - char *requestedname; /* client's name for this connection */ + Bool has_catalogues; int generation; int numAlts; + int alternate; /* which alternate is in use +1 */ int fsMajorVersion; /* font server major version number */ FSFpeAltPtr alts; @@ -62,21 +98,90 @@ typedef struct _fs_fpe_data { XID curacid; #ifdef DEBUG int reqindex; - int reqbuffer[REQUEST_LOG_SIZE]; + struct { + int opcode; + int sequence; + } reqbuffer[REQUEST_LOG_SIZE]; #endif + FSBufRec outBuf; /* request queue */ + FSBufRec inBuf; /* reply queue */ + long inNeed; /* amount needed for reply */ - int attemptReconnect; - -/* XXX massive crock to get around stupid #include interferences */ - pointer blocked_requests; -/* Data for reconnect - put it here to avoid allocate failure nightmare */ - long time_to_try; - long reconnect_delay; - struct _fs_fpe_data *next_reconnect; + CARD32 blockState; + CARD32 blockedReplyTime; /* time to abort blocked read */ + CARD32 brokenWriteTime; /* time to retry broken write */ + CARD32 blockedConnectTime; /* time to abort blocked connect */ + CARD32 brokenConnectionTime; /* time to retry broken connection */ + + FSBlockDataPtr blockedRequests; + struct _XtransConnInfo *trans_conn; /* transport connection object */ -} FSFpeRec, *FSFpePtr; +} FSFpeRec; + +#define fs_outspace(conn) ((conn)->outBuf.size - (conn)->outBuf.insert) +#define fs_outqueued(conn) ((conn)->outBuf.insert - (conn)->outBuf.remove) +#define fs_inqueued(conn) ((conn)->inBuf.insert - (conn)->inBuf.remove) +#define fs_needsflush(conn) (fs_outqueued(conn) != 0) +#define fs_needsfill(conn) (fs_inqueued(conn) < (conn)->inNeed) +#define fs_needsconnect(conn) ((conn)->fs_fd < 0) +#define fs_data_read(conn) ((conn)->inBuf.insert - (conn)->inBuf.remove) + +#define FSIO_READY 1 +#define FSIO_BLOCK 0 +#define FSIO_ERROR -1 + +extern Bool _fs_reopen_server ( FSFpePtr conn ); +extern int _fs_write ( FSFpePtr conn, char *data, long size ); +extern int _fs_write_pad ( FSFpePtr conn, char *data, long len ); +extern int _fs_data_ready ( FSFpePtr conn ); +extern int _fs_wait_for_readable ( FSFpePtr conn, int ms ); +extern int _fs_set_bit ( fd_set * mask, int fd ); +extern int _fs_is_bit_set ( fd_set * mask, int fd ); +extern void _fs_bit_clear ( fd_set * mask, int fd ); +extern int _fs_any_bit_set ( fd_set * mask ); +extern void _fs_or_bits ( fd_set * dst, fd_set * m1, fd_set * m2 ); +extern long _fs_pad_length (long len); -FSFpePtr _fs_open_server(); -void _fs_bit_clear(); +extern void _fs_connection_died ( FSFpePtr conn ); + +extern int _fs_fill (FSFpePtr conn); +extern int _fs_flush (FSFpePtr conn); +extern void _fs_mark_block (FSFpePtr conn, CARD32 mask); +extern void _fs_unmark_block (FSFpePtr conn, CARD32 mask); +extern void _fs_done_read (FSFpePtr conn, long size); +extern void _fs_io_reinit (FSFpePtr conn); +extern int _fs_start_read (FSFpePtr conn, long size, char **buf); +extern Bool _fs_io_init (FSFpePtr conn); +extern void _fs_io_fini (FSFpePtr conn); +extern int _fs_poll_connect (XtransConnInfo trans_conn, int timeout); +extern XtransConnInfo _fs_connect(char *servername, int *ret); + +/* check for both EAGAIN and EWOULDBLOCK, because some supposedly POSIX + * systems are broken and return EWOULDBLOCK when they should return EAGAIN + */ +#ifdef WIN32 +#define ETEST() (WSAGetLastError() == WSAEWOULDBLOCK) +#else +#if defined(EAGAIN) && defined(EWOULDBLOCK) +#define ETEST() (errno == EAGAIN || errno == EWOULDBLOCK) +#else +#ifdef EAGAIN +#define ETEST() (errno == EAGAIN) +#else +#define ETEST() (errno == EWOULDBLOCK) +#endif +#endif +#endif +#ifdef WIN32 +#define ECHECK(err) (WSAGetLastError() == err) +#define ESET(val) WSASetLastError(val) +#else +#ifdef ISC +#define ECHECK(err) ((errno == err) || ETEST()) +#else +#define ECHECK(err) (errno == err) +#endif +#define ESET(val) errno = val +#endif #endif /* _FSIO_H_ */ diff --git a/src/fc/fslibos.h b/src/fc/fslibos.h index d666ea4..8ca2a8a 100644 --- a/src/fc/fslibos.h +++ b/src/fc/fslibos.h @@ -31,6 +31,7 @@ other dealings in this Software without prior written authorization from The Open Group. */ +/* $XFree86: xc/lib/font/fc/fslibos.h,v 3.7 2002/05/31 18:45:49 dawes Exp $ */ /* * FSlib networking & os include file @@ -56,8 +57,12 @@ from The Open Group. #endif #endif #ifndef OPEN_MAX -#ifdef SVR4 +#if defined(SVR4) || defined(__UNIXOS2__) +#ifdef SCO325 +#define OPEN_MAX sysconf(_SC_OPEN_MAX) +#else #define OPEN_MAX 256 +#endif #else #include <sys/param.h> #ifndef OPEN_MAX diff --git a/src/fontfile/bitsource.c b/src/fontfile/bitsource.c index ac77875..0230535 100644 --- a/src/fontfile/bitsource.c +++ b/src/fontfile/bitsource.c @@ -25,6 +25,7 @@ used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from The Open Group. */ +/* $XFree86: xc/lib/font/fontfile/bitsource.c,v 1.4 2001/12/14 19:56:49 dawes Exp $ */ /* * Author: Keith Packard, MIT X Consortium @@ -35,8 +36,7 @@ in this Software without prior written authorization from The Open Group. BitmapSourcesRec FontFileBitmapSources; Bool -FontFileRegisterBitmapSource (fpe) - FontPathElementPtr fpe; +FontFileRegisterBitmapSource (FontPathElementPtr fpe) { FontPathElementPtr *new; int i; @@ -59,8 +59,7 @@ FontFileRegisterBitmapSource (fpe) } void -FontFileUnregisterBitmapSource (fpe) - FontPathElementPtr fpe; +FontFileUnregisterBitmapSource (FontPathElementPtr fpe) { int i; @@ -90,7 +89,7 @@ FontFileUnregisterBitmapSource (fpe) * The bitmap sources in the new path will be registered by the init_func. */ void -FontFileEmptyBitmapSource() +FontFileEmptyBitmapSource(void) { if (FontFileBitmapSources.count == 0) return; @@ -102,16 +101,15 @@ FontFileEmptyBitmapSource() } int -FontFileMatchBitmapSource (fpe, pFont, flags, entry, zeroPat, vals, format, fmask, noSpecificSize) - FontPathElementPtr fpe; - FontPtr *pFont; - int flags; - FontEntryPtr entry; - FontNamePtr zeroPat; - FontScalablePtr vals; - fsBitmapFormat format; - fsBitmapFormatMask fmask; - Bool noSpecificSize; +FontFileMatchBitmapSource (FontPathElementPtr fpe, + FontPtr *pFont, + int flags, + FontEntryPtr entry, + FontNamePtr zeroPat, + FontScalablePtr vals, + fsBitmapFormat format, + fsBitmapFormatMask fmask, + Bool noSpecificSize) { int source; FontEntryPtr zero; diff --git a/src/fontfile/bufio.c b/src/fontfile/bufio.c index 40293c5..19d61bf 100644 --- a/src/fontfile/bufio.c +++ b/src/fontfile/bufio.c @@ -27,6 +27,7 @@ other dealings in this Software without prior written authorization from The Open Group. */ +/* $XFree86: xc/lib/font/fontfile/bufio.c,v 3.10 2002/05/31 18:45:49 dawes Exp $ */ /* * Author: Keith Packard, MIT X Consortium @@ -37,16 +38,13 @@ from The Open Group. #include <fontmisc.h> #include <bufio.h> #include <errno.h> -#ifdef X_NOT_STDC_ENV -extern int errno; -#endif BufFilePtr -BufFileCreate (private, io, skip, close) - char *private; - int (*io)(); - int (*skip)(); - int (*close)(); +BufFileCreate (char *private, + int (*input)(BufFilePtr), + int (*output)(int, BufFilePtr), + int (*skip)(BufFilePtr, int), + int (*close)(BufFilePtr, int)) { BufFilePtr f; @@ -56,17 +54,18 @@ BufFileCreate (private, io, skip, close) f->private = private; f->bufp = f->buffer; f->left = 0; - f->io = io; + f->input = input; + f->output = output; f->skip = skip; + f->eof = 0; f->close = close; return f; } -#define FileDes(f) ((int) (f)->private) +#define FileDes(f) ((int)(long) (f)->private) static int -BufFileRawFill (f) - BufFilePtr f; +BufFileRawFill (BufFilePtr f) { int left; @@ -81,9 +80,7 @@ BufFileRawFill (f) } static int -BufFileRawSkip (f, count) - BufFilePtr f; - int count; +BufFileRawSkip (BufFilePtr f, int count) { int curoff; int fileoff; @@ -115,8 +112,7 @@ BufFileRawSkip (f, count) } static int -BufFileRawClose (f, doClose) - BufFilePtr f; +BufFileRawClose (BufFilePtr f, int doClose) { if (doClose) close (FileDes (f)); @@ -124,16 +120,17 @@ BufFileRawClose (f, doClose) } BufFilePtr -BufFileOpenRead (fd) - int fd; +BufFileOpenRead (int fd) { - return BufFileCreate ((char *) fd, BufFileRawFill, BufFileRawSkip, BufFileRawClose); +#ifdef __UNIXOS2__ + /* hv: I'd bet WIN32 has the same effect here */ + setmode(fd,O_BINARY); +#endif + return BufFileCreate ((char *)(long) fd, BufFileRawFill, 0, BufFileRawSkip, BufFileRawClose); } static int -BufFileRawFlush (c, f) - int c; - BufFilePtr f; +BufFileRawFlush (int c, BufFilePtr f) { int cnt; @@ -148,22 +145,22 @@ BufFileRawFlush (c, f) } BufFilePtr -BufFileOpenWrite (fd) - int fd; +BufFileOpenWrite (int fd) { BufFilePtr f; - f = BufFileCreate ((char *) fd, BufFileRawFlush, 0, BufFileFlush); +#ifdef __UNIXOS2__ + /* hv: I'd bet WIN32 has the same effect here */ + setmode(fd,O_BINARY); +#endif + f = BufFileCreate ((char *)(long) fd, 0, BufFileRawFlush, 0, BufFileFlush); f->bufp = f->buffer; f->left = BUFFILESIZE; return f; } int -BufFileRead (f, b, n) - BufFilePtr f; - char *b; - int n; +BufFileRead (BufFilePtr f, char *b, int n) { int c, cnt; cnt = n; @@ -177,10 +174,7 @@ BufFileRead (f, b, n) } int -BufFileWrite (f, b, n) - BufFilePtr f; - char *b; - int n; +BufFileWrite (BufFilePtr f, char *b, int n) { int cnt; cnt = n; @@ -192,18 +186,15 @@ BufFileWrite (f, b, n) } int -BufFileFlush (f) - BufFilePtr f; +BufFileFlush (BufFilePtr f, int doClose) { if (f->bufp != f->buffer) - return (*f->io) (BUFFILEEOF, f); + return (*f->output) (BUFFILEEOF, f); return 0; } int -BufFileClose (f, doClose) - BufFilePtr f; - int doClose; +BufFileClose (BufFilePtr f, int doClose) { int ret; ret = (*f->close) (f, doClose); @@ -212,8 +203,7 @@ BufFileClose (f, doClose) } void -BufFileFree (f) - BufFilePtr f; +BufFileFree (BufFilePtr f) { xfree (f); } diff --git a/src/fontfile/decompress.c b/src/fontfile/decompress.c index aef4461..187254d 100644 --- a/src/fontfile/decompress.c +++ b/src/fontfile/decompress.c @@ -45,6 +45,7 @@ used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from The Open Group. */ +/* $XFree86: xc/lib/font/fontfile/decompress.c,v 1.5 2001/12/14 19:56:50 dawes Exp $ */ /* * decompress - cat a compressed file */ @@ -88,8 +89,6 @@ static char_type magic_header[] = { "\037\235" }; /* 1F 9D */ # define MAXCODE(n_bits) ((1 << (n_bits)) - 1) #endif /* COMPATIBLE */ -static code_int getcode(); - /* * the next two codes should not be changed lightly, as they must not * lie within the contiguous general code space. @@ -132,11 +131,13 @@ static int hsize_table[] = { 69001 /* 16 bits - 95% occupancy */ }; -static int BufCompressedFill(), BufCompressedSkip(), BufCompressedClose(); +static int BufCompressedClose ( BufFilePtr f, int doClose ); +static int BufCompressedFill ( BufFilePtr f ); +static code_int getcode ( CompressedFile *file ); +static int BufCompressedSkip ( BufFilePtr f, int bytes ); BufFilePtr -BufFilePushCompressed (f) - BufFilePtr f; +BufFilePushCompressed (BufFilePtr f) { int code; int maxbits; @@ -150,6 +151,8 @@ BufFilePushCompressed (f) return 0; } code = BufFileGet (f); + if (code == BUFFILEEOF) return 0; + maxbits = code & BIT_MASK; if (maxbits > BITS || maxbits < 12) return 0; @@ -184,13 +187,13 @@ BufFilePushCompressed (f) *file->stackp++ = file->finchar; return BufFileCreate ((char *) file, BufCompressedFill, + 0, BufCompressedSkip, BufCompressedClose); } static int -BufCompressedClose (f, doClose) - BufFilePtr f; +BufCompressedClose (BufFilePtr f, int doClose) { CompressedFile *file; BufFilePtr raw; @@ -203,8 +206,7 @@ BufCompressedClose (f, doClose) } static int -BufCompressedFill (f) - BufFilePtr f; +BufCompressedFill (BufFilePtr f) { CompressedFile *file; register char_type *stackp, *de_stack; @@ -300,8 +302,7 @@ BufCompressedFill (f) static char_type rmask[9] = {0x00, 0x01, 0x03, 0x07, 0x0f, 0x1f, 0x3f, 0x7f, 0xff}; static code_int -getcode(file) - CompressedFile *file; +getcode(CompressedFile *file) { register code_int code; register int r_off, bits; @@ -375,9 +376,7 @@ getcode(file) } static int -BufCompressedSkip (f, bytes) - BufFilePtr f; - int bytes; +BufCompressedSkip (BufFilePtr f, int bytes) { int c; while (bytes--) @@ -390,9 +389,8 @@ BufCompressedSkip (f, bytes) } #ifdef TEST -main (argc, argv) - int argc; - char **argv; +int +main (int argc, char *argv[]) { BufFilePtr inputraw, input, output; int c; @@ -400,9 +398,10 @@ main (argc, argv) inputraw = BufFileOpenRead (0); input = BufFilePushCompressed (inputraw); output = BufFileOpenWrite (1); - while ((c = BufFileGet (input)) != -1) + while ((c = BufFileGet (input)) != BUFFILEEOF) BufFilePut (c, output); BufFileClose (input, FALSE); BufFileClose (output, FALSE); + return 0; } #endif diff --git a/src/fontfile/defaults.c b/src/fontfile/defaults.c index 2738287..6425d20 100644 --- a/src/fontfile/defaults.c +++ b/src/fontfile/defaults.c @@ -25,6 +25,7 @@ used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from The Open Group. */ +/* $XFree86: xc/lib/font/fontfile/defaults.c,v 1.8 2001/12/14 19:56:50 dawes Exp $ */ /* * Author: Keith Packard, MIT X Consortium @@ -62,8 +63,10 @@ in this Software without prior written authorization from The Open Group. #define DEFAULT_SCAN_UNIT 1 #endif -FontDefaultFormat (bit, byte, glyph, scan) - int *bit, *byte, *glyph, *scan; +#include "fntfilst.h" + +void +FontDefaultFormat (int *bit, int *byte, int *glyph, int *scan) { *bit = DEFAULT_BIT_ORDER; *byte = DEFAULT_BYTE_ORDER; diff --git a/src/fontfile/dirfile.c b/src/fontfile/dirfile.c index 82f0d10..5f90501 100644 --- a/src/fontfile/dirfile.c +++ b/src/fontfile/dirfile.c @@ -25,6 +25,7 @@ used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from The Open Group. */ +/* $XFree86: xc/lib/font/fontfile/dirfile.c,v 3.15 2002/05/31 18:45:50 dawes Exp $ */ /* * Author: Keith Packard, MIT X Consortium @@ -41,20 +42,23 @@ in this Software without prior written authorization from The Open Group. #include <sys/types.h> #include <sys/stat.h> #include <errno.h> -#ifdef X_NOT_STDC_ENV -extern int errno; -#endif -static int ReadFontAlias(); +static Bool AddFileNameAliases ( FontDirectoryPtr dir ); +static int ReadFontAlias ( char *directory, Bool isFile, + FontDirectoryPtr *pdir ); +static int lexAlias ( FILE *file, char **lexToken ); +static int lexc ( FILE *file ); int -FontFileReadDirectory (directory, pdir) - char *directory; - FontDirectoryPtr *pdir; +FontFileReadDirectory (char *directory, FontDirectoryPtr *pdir) { char file_name[MAXFONTFILENAMELEN]; char font_name[MAXFONTNAMELEN]; char dir_file[MAXFONTFILENAMELEN]; +#ifdef FONTDIRATTRIB + char dir_path[MAXFONTFILENAMELEN]; + char *ptr; +#endif FILE *file; int count, i, @@ -64,8 +68,24 @@ FontFileReadDirectory (directory, pdir) FontDirectoryPtr dir = NullFontDirectory; +#ifdef FONTDIRATTRIB + /* Check for font directory attributes */ +#ifndef __UNIXOS2__ + if ((ptr = strchr(directory, ':'))) { +#else + /* OS/2 path might start with a drive letter, don't clip this */ + if (ptr = strchr(directory+2, ':')) { +#endif + strncpy(dir_path, directory, ptr - directory); + dir_path[ptr - directory] = '\0'; + } else { + strcpy(dir_path, directory); + } + strcpy(dir_file, dir_path); +#else strcpy(dir_file, directory); - if (directory[strlen(directory) - 1] != '/') +#endif + if (dir_file[strlen(dir_file) - 1] != '/') strcat(dir_file, "/"); strcat(dir_file, FontDirFile); file = fopen(dir_file, "r"); @@ -85,8 +105,14 @@ FontFileReadDirectory (directory, pdir) dir->dir_mtime = statb.st_mtime; if (format[0] == '\0') sprintf(format, "%%%ds %%%d[^\n]\n", - MAXFONTFILENAMELEN-1, MAXFONTNAMELEN-1); + MAXFONTFILENAMELEN-1, MAXFONTNAMELEN-1); while ((count = fscanf(file, format, file_name, font_name)) != EOF) { +#ifdef __UNIXOS2__ + /* strip any existing trailing CR */ + for (i=0; i<strlen(font_name); i++) { + if (font_name[i]=='\r') font_name[i] = '\0'; + } +#endif if (count != 2) { FontFileFreeDir (dir); fclose(file); @@ -103,7 +129,11 @@ FontFileReadDirectory (directory, pdir) } else if (errno != ENOENT) { return BadFontPath; } +#ifdef FONTDIRATTRIB + status = ReadFontAlias(dir_path, FALSE, &dir); +#else status = ReadFontAlias(directory, FALSE, &dir); +#endif if (status != Successful) { if (dir) FontFileFreeDir (dir); @@ -119,10 +149,9 @@ FontFileReadDirectory (directory, pdir) } Bool -FontFileDirectoryChanged(dir) - FontDirectoryPtr dir; +FontFileDirectoryChanged(FontDirectoryPtr dir) { - char dir_file[MAXFONTNAMELEN]; + char dir_file[MAXFONTFILENAMELEN]; struct stat statb; strcpy (dir_file, dir->directory); @@ -153,11 +182,10 @@ FontFileDirectoryChanged(dir) */ static Bool -AddFileNameAliases(dir) - FontDirectoryPtr dir; +AddFileNameAliases(FontDirectoryPtr dir) { int i; - char copy[MAXFONTNAMELEN]; + char copy[MAXFONTFILENAMELEN]; char *fileName; FontTablePtr table; FontRendererPtr renderer; @@ -198,29 +226,24 @@ AddFileNameAliases(dir) * "font name \"With Double Quotes\" \\ and \\ back-slashes" * works just fine. * - * A line beginning with a # denotes a newline-terminated comment. + * A line beginning with a ! denotes a newline-terminated comment. */ /* * token types */ -static int lexAlias(), lexc(); - #define NAME 0 #define NEWLINE 1 #define DONE 2 #define EALLOC 3 static int -ReadFontAlias(directory, isFile, pdir) - char *directory; - Bool isFile; - FontDirectoryPtr *pdir; +ReadFontAlias(char *directory, Bool isFile, FontDirectoryPtr *pdir) { char alias[MAXFONTNAMELEN]; char font_name[MAXFONTNAMELEN]; - char alias_file[MAXFONTNAMELEN]; + char alias_file[MAXFONTFILENAMELEN]; FILE *file; FontDirectoryPtr dir; int token; @@ -279,12 +302,8 @@ ReadFontAlias(directory, isFile, pdir) status = AllocError; break; case NAME: - CopyISOLatin1Lowered((unsigned char *) alias, - (unsigned char *) alias, - strlen(alias)); - CopyISOLatin1Lowered((unsigned char *) font_name, - (unsigned char *) lexToken, - strlen(lexToken)); + CopyISOLatin1Lowered(alias, alias, strlen(alias)); + CopyISOLatin1Lowered(font_name, lexToken, strlen(lexToken)); if (!FontFileAddFontAlias (dir, alias, font_name)) status = AllocError; break; @@ -305,9 +324,7 @@ ReadFontAlias(directory, isFile, pdir) static int charClass; static int -lexAlias(file, lexToken) - FILE *file; - char **lexToken; +lexAlias(FILE *file, char **lexToken) { int c; char *t; @@ -370,6 +387,8 @@ lexAlias(file, lexToken) break; case Comment: continue; + default: + break; } *t++ = c; ++count; @@ -405,8 +424,7 @@ lexAlias(file, lexToken) } static int -lexc(file) - FILE *file; +lexc(FILE *file) { int c; @@ -429,6 +447,7 @@ lexc(file) case '\t': charClass = WHITE; break; + case '\r': case '\n': charClass = NL; break; diff --git a/src/fontfile/ffcheck.c b/src/fontfile/ffcheck.c index 6f29801..4de2a4b 100644 --- a/src/fontfile/ffcheck.c +++ b/src/fontfile/ffcheck.c @@ -25,43 +25,34 @@ used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from The Open Group. */ +/* $XFree86: xc/lib/font/fontfile/ffcheck.c,v 1.15 2001/12/14 19:56:51 dawes Exp $ */ /* * Author: Keith Packard, MIT X Consortium */ -/* $NCDId: @(#)fontfile.c,v 1.6 1991/07/02 17:00:46 lemke Exp $ */ +/* $NCDXorg: @(#)fontfile.c,v 1.6 1991/07/02 17:00:46 lemke Exp $ */ -#include "fntfilst.h" +#include "fntfilst.h" +#include "bitmap.h" +#ifdef LOADABLEFONTS +#include "fontmod.h" +#endif /* * Map FPE functions to renderer functions */ -extern int FontFileNameCheck(); -extern int FontFileInitFPE(); -extern int FontFileResetFPE(); -extern int FontFileFreeFPE(); -extern void FontFileCloseFont(); - /* Here we must check the client to see if it has a context attached to * it that allows us to access the printer fonts */ -int -FontFileCheckOpenFont (client, fpe, flags, name, namelen, format, fmask, - id, pFont, aliasName, non_cachable_font) - pointer client; - FontPathElementPtr fpe; - int flags; - char *name; - int namelen; - fsBitmapFormat format; - fsBitmapFormatMask fmask; - XID id; - FontPtr *pFont; - char **aliasName; - FontPtr non_cachable_font; +static int +FontFileCheckOpenFont (pointer client, FontPathElementPtr fpe, Mask flags, + char *name, int namelen, + fsBitmapFormat format, fsBitmapFormatMask fmask, + XID id, FontPtr *pFont, char **aliasName, + FontPtr non_cachable_font) { if (XpClientIsBitmapClient(client)) return (FontFileOpenFont (client, fpe, flags, name, namelen, format, @@ -69,28 +60,19 @@ FontFileCheckOpenFont (client, fpe, flags, name, namelen, format, fmask, return BadFontName; } -int -FontFileCheckListFonts (client, fpe, pat, len, max, names) - pointer client; - FontPathElementPtr fpe; - char *pat; - int len; - int max; - FontNamesPtr names; +static int +FontFileCheckListFonts (pointer client, FontPathElementPtr fpe, + char *pat, int len, int max, FontNamesPtr names) { if (XpClientIsBitmapClient(client)) return FontFileListFonts (client, fpe, pat, len, max, names); return BadFontName; } -int -FontFileCheckStartListFontsWithInfo(client, fpe, pat, len, max, privatep) - pointer client; - FontPathElementPtr fpe; - char *pat; - int len; - int max; - pointer *privatep; +static int +FontFileCheckStartListFontsWithInfo(pointer client, FontPathElementPtr fpe, + char *pat, int len, int max, + pointer *privatep) { if (XpClientIsBitmapClient(client)) return FontFileStartListFontsWithInfo(client, fpe, pat, len, @@ -98,16 +80,11 @@ FontFileCheckStartListFontsWithInfo(client, fpe, pat, len, max, privatep) return BadFontName; } -int -FontFileCheckListNextFontWithInfo(client, fpe, namep, namelenp, pFontInfo, - numFonts, private) - pointer client; - FontPathElementPtr fpe; - char **namep; - int *namelenp; - FontInfoPtr *pFontInfo; - int *numFonts; - pointer private; +static int +FontFileCheckListNextFontWithInfo(pointer client, FontPathElementPtr fpe, + char **namep, int *namelenp, + FontInfoPtr *pFontInfo, + int *numFonts, pointer private) { if (XpClientIsBitmapClient(client)) return FontFileListNextFontWithInfo(client, fpe, namep, namelenp, @@ -115,14 +92,10 @@ FontFileCheckListNextFontWithInfo(client, fpe, namep, namelenp, pFontInfo, return BadFontName; } -int -FontFileCheckStartListFontsAndAliases(client, fpe, pat, len, max, privatep) - pointer client; - FontPathElementPtr fpe; - char *pat; - int len; - int max; - pointer *privatep; +static int +FontFileCheckStartListFontsAndAliases(pointer client, FontPathElementPtr fpe, + char *pat, int len, int max, + pointer *privatep) { if (XpClientIsBitmapClient(client)) return FontFileStartListFontsAndAliases(client, fpe, pat, len, @@ -130,16 +103,11 @@ FontFileCheckStartListFontsAndAliases(client, fpe, pat, len, max, privatep) return BadFontName; } -int -FontFileCheckListNextFontOrAlias(client, fpe, namep, namelenp, resolvedp, - resolvedlenp, private) - pointer client; - FontPathElementPtr fpe; - char **namep; - int *namelenp; - char **resolvedp; - int *resolvedlenp; - pointer private; +static int +FontFileCheckListNextFontOrAlias(pointer client, FontPathElementPtr fpe, + char **namep, int *namelenp, + char **resolvedp, int *resolvedlenp, + pointer private) { if (XpClientIsBitmapClient(client)) return FontFileListNextFontOrAlias(client, fpe, namep, namelenp, @@ -147,24 +115,51 @@ FontFileCheckListNextFontOrAlias(client, fpe, namep, namelenp, resolvedp, return BadFontName; } -extern void FontFileEmptyBitmapSource(); -typedef int (*IntFunc) (); +typedef int (*IntFunc) (void); static int font_file_check_type; void -FontFileCheckRegisterFpeFunctions () +FontFileCheckRegisterFpeFunctions (void) { +#ifndef LOADABLEFONTS BitmapRegisterFontFileFunctions (); #ifndef LOWMEMFTPT #ifndef CRAY +#ifdef BUILD_SPEEDO SpeedoRegisterFontFileFunctions (); +#endif +#ifdef BUILD_TYPE1 Type1RegisterFontFileFunctions(); #endif +#endif +#ifdef BUILD_CID + CIDRegisterFontFileFunctions(); +#endif +#ifdef BUILD_FREETYPE + FreeTypeRegisterFontFileFunctions(); +#endif +#ifdef BUILD_XTRUETYPE + XTrueTypeRegisterFontFileFunctions(); +#endif #endif /* ifndef LOWMEMFTPT */ +#else + + { + int i; + + if (FontModuleList) { + for (i = 0; FontModuleList[i].name; i++) { + if (FontModuleList[i].initFunc) + FontModuleList[i].initFunc(); + } + } + } +#endif + font_file_check_type = RegisterFPEFunctions(FontFileNameCheck, FontFileInitFPE, FontFileFreeFPE, @@ -174,9 +169,9 @@ FontFileCheckRegisterFpeFunctions () FontFileCheckListFonts, FontFileCheckStartListFontsWithInfo, FontFileCheckListNextFontWithInfo, - (IntFunc) 0, - (IntFunc) 0, - (IntFunc) 0, + NULL, + NULL, + NULL, FontFileCheckStartListFontsAndAliases, FontFileCheckListNextFontOrAlias, FontFileEmptyBitmapSource); diff --git a/src/fontfile/fileio.c b/src/fontfile/fileio.c index 43c84ab..8a7cb03 100644 --- a/src/fontfile/fileio.c +++ b/src/fontfile/fileio.c @@ -25,6 +25,7 @@ used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from The Open Group. */ +/* $XFree86: xc/lib/font/fontfile/fileio.c,v 3.10 2002/05/31 18:45:50 dawes Exp $ */ /* * Author: Keith Packard, MIT X Consortium @@ -33,12 +34,11 @@ in this Software without prior written authorization from The Open Group. #include <fntfilio.h> #include <X11/Xos.h> #ifndef O_BINARY -#define O_BINARY 0 +#define O_BINARY O_RDONLY #endif FontFilePtr -FontFileOpen (name) - char *name; +FontFileOpen (const char *name) { int fd; int len; @@ -54,7 +54,12 @@ FontFileOpen (name) return 0; } len = strlen (name); +#ifndef __UNIXOS2__ if (len > 2 && !strcmp (name + len - 2, ".Z")) { +#else + if (len > 2 && (!strcmp (name + len - 4, ".pcz") || + !strcmp (name + len - 2, ".Z"))) { +#endif cooked = BufFilePushCompressed (raw); if (!cooked) { BufFileClose (raw, TRUE); @@ -75,8 +80,7 @@ FontFileOpen (name) } int -FontFileClose (f) - FontFilePtr f; +FontFileClose (FontFilePtr f) { return BufFileClose ((BufFilePtr) f, TRUE); } diff --git a/src/fontfile/filewr.c b/src/fontfile/filewr.c index d8ed5b5..8de8f26 100644 --- a/src/fontfile/filewr.c +++ b/src/fontfile/filewr.c @@ -25,6 +25,7 @@ used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from The Open Group. */ +/* $XFree86: xc/lib/font/fontfile/filewr.c,v 3.7 2002/05/31 18:45:50 dawes Exp $ */ /* * Author: Keith Packard, MIT X Consortium @@ -34,12 +35,11 @@ in this Software without prior written authorization from The Open Group. #include <X11/Xos.h> FontFilePtr -FontFileOpenWrite (name) - char *name; +FontFileOpenWrite (const char *name) { int fd; -#ifdef WIN32 +#if defined(WIN32) || defined(__UNIXOS2__) || defined(__CYGWIN__) fd = open (name, O_CREAT|O_TRUNC|O_RDWR|O_BINARY, 0666); #else fd = creat (name, 0666); @@ -50,14 +50,13 @@ FontFileOpenWrite (name) } FontFilePtr -FontFileOpenWriteFd (fd) +FontFileOpenWriteFd (int fd) { return (FontFilePtr) BufFileOpenWrite (fd); } FontFilePtr -FontFileOpenFd (fd) - int fd; +FontFileOpenFd (int fd) { return (FontFilePtr) BufFileOpenRead (fd); } diff --git a/src/fontfile/fontdir.c b/src/fontfile/fontdir.c index beca5af..a2bd411 100644 --- a/src/fontfile/fontdir.c +++ b/src/fontfile/fontdir.c @@ -25,6 +25,7 @@ used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from The Open Group. */ +/* $XFree86: xc/lib/font/fontfile/fontdir.c,v 3.19 2002/05/31 18:45:50 dawes Exp $ */ /* * Author: Keith Packard, MIT X Consortium @@ -34,9 +35,7 @@ in this Software without prior written authorization from The Open Group. #include <X11/keysym.h> Bool -FontFileInitTable (table, size) - FontTablePtr table; - int size; +FontFileInitTable (FontTablePtr table, int size) { if (size) { @@ -53,14 +52,14 @@ FontFileInitTable (table, size) } void -FontFileFreeEntry (entry) - FontEntryPtr entry; +FontFileFreeEntry (FontEntryPtr entry) { FontScalableExtraPtr extra; int i; if (entry->name.name) xfree(entry->name.name); + entry->name.name = NULL; switch (entry->type) { @@ -75,9 +74,11 @@ FontFileFreeEntry (entry) break; case FONT_ENTRY_BITMAP: xfree (entry->u.bitmap.fileName); + entry->u.bitmap.fileName = NULL; break; case FONT_ENTRY_ALIAS: xfree (entry->u.alias.resolved); + entry->u.alias.resolved = NULL; break; #ifdef NOTYET case FONT_ENTRY_BC: @@ -87,8 +88,7 @@ FontFileFreeEntry (entry) } void -FontFileFreeTable (table) - FontTablePtr table; +FontFileFreeTable (FontTablePtr table) { int i; @@ -98,21 +98,44 @@ FontFileFreeTable (table) } FontDirectoryPtr -FontFileMakeDir(dirName, size) - char *dirName; - int size; +FontFileMakeDir(char *dirName, int size) { FontDirectoryPtr dir; int dirlen; int needslash = 0; +#ifdef FONTDIRATTRIB + char *attrib; + int attriblen; +#endif +#ifdef FONTDIRATTRIB +#ifndef __UNIXOS2__ + attrib = strchr(dirName, ':'); +#else + /* OS/2 uses the colon in the drive letter descriptor, skip this */ + attrib = strchr(dirName+2, ':'); +#endif + if (attrib) { + dirlen = attrib - dirName; + attriblen = strlen(attrib); + } else { + dirlen = strlen(dirName); + attriblen = 0; + } +#else dirlen = strlen(dirName); +#endif if (dirName[dirlen - 1] != '/') #ifdef NCD if (dirlen) /* leave out slash for builtins */ #endif needslash = 1; +#ifdef FONTDIRATTRIB + dir = (FontDirectoryPtr) xalloc(sizeof *dir + dirlen + needslash + 1 + + (attriblen ? attriblen + 1 : 0)); +#else dir = (FontDirectoryPtr) xalloc(sizeof *dir + dirlen + needslash + 1); +#endif if (!dir) return (FontDirectoryPtr)0; if (!FontFileInitTable (&dir->scalable, 0)) @@ -129,15 +152,25 @@ FontFileMakeDir(dirName, size) dir->directory = (char *) (dir + 1); dir->dir_mtime = 0; dir->alias_mtime = 0; +#ifdef FONTDIRATTRIB + if (attriblen) + dir->attributes = dir->directory + dirlen + needslash + 1; + else + dir->attributes = NULL; + strncpy(dir->directory, dirName, dirlen); + dir->directory[dirlen] = '\0'; + if (dir->attributes) + strcpy(dir->attributes, attrib); +#else strcpy(dir->directory, dirName); +#endif if (needslash) strcat(dir->directory, "/"); return dir; } void -FontFileFreeDir (dir) - FontDirectoryPtr dir; +FontFileFreeDir (FontDirectoryPtr dir) { FontFileFreeTable (&dir->scalable); FontFileFreeTable (&dir->nonScalable); @@ -145,9 +178,7 @@ FontFileFreeDir (dir) } FontEntryPtr -FontFileAddEntry(table, prototype) - FontTablePtr table; - FontEntryPtr prototype; +FontFileAddEntry(FontTablePtr table, FontEntryPtr prototype) { FontEntryPtr entry; int newsize; @@ -175,24 +206,56 @@ FontFileAddEntry(table, prototype) return entry; } +/* + * Compare two strings just like strcmp, but preserve decimal integer + * sorting order, i.e. "2" < "10" or "iso8859-2" < "iso8859-10" < + * "iso10646-1". Strings are sorted as if sequences of digits were + * prefixed by a length indicator (i.e., does not ignore leading zeroes). + * + * Markus Kuhn <Markus.Kuhn@cl.cam.ac.uk> + */ +#define Xisdigit(c) ('\060' <= (c) && (c) <= '\071') + +static int strcmpn(const char *s1, const char *s2) +{ + int digits, predigits = 0; + const char *ss1, *ss2; + + while (1) { + if (*s1 == 0 && *s2 == 0) + return 0; + digits = Xisdigit(*s1) && Xisdigit(*s2); + if (digits && !predigits) { + ss1 = s1; + ss2 = s2; + while (Xisdigit(*ss1) && Xisdigit(*ss2)) + ss1++, ss2++; + if (!Xisdigit(*ss1) && Xisdigit(*ss2)) + return -1; + if (Xisdigit(*ss1) && !Xisdigit(*ss2)) + return 1; + } + if ((unsigned char)*s1 < (unsigned char)*s2) + return -1; + if ((unsigned char)*s1 > (unsigned char)*s2) + return 1; + predigits = digits; + s1++, s2++; + } +} + + static int -#ifdef NeedFunctionPrototypes FontFileNameCompare(const void* a, const void* b) -#else -FontFileNameCompare(a, b) - char *a, - *b; -#endif { FontEntryPtr a_name = (FontEntryPtr) a, b_name = (FontEntryPtr) b; - return strcmp(a_name->name.name, b_name->name.name); + return strcmpn(a_name->name.name, b_name->name.name); } void -FontFileSortTable (table) - FontTablePtr table; +FontFileSortTable (FontTablePtr table) { if (!table->sorted) { qsort((char *) table->entries, table->used, sizeof(FontEntryRec), @@ -202,8 +265,7 @@ FontFileSortTable (table) } void -FontFileSortDir(dir) - FontDirectoryPtr dir; +FontFileSortDir(FontDirectoryPtr dir) { FontFileSortTable (&dir->scalable); FontFileSortTable (&dir->nonScalable); @@ -225,19 +287,17 @@ FontFileSortDir(dir) */ #define isWild(c) ((c) == XK_asterisk || (c) == XK_question) +#define isDigit(c) (XK_0 <= (c) && (c) <= XK_9) static int -SetupWildMatch(table, pat, leftp, rightp, privatep) - FontTablePtr table; - FontNamePtr pat; - int *leftp, - *rightp; - int *privatep; +SetupWildMatch(FontTablePtr table, FontNamePtr pat, + int *leftp, int *rightp, int *privatep) { int nDashes; char c; char *t; char *firstWild; + char *firstDigit; int first; int center, left, @@ -248,12 +308,17 @@ SetupWildMatch(table, pat, leftp, rightp, privatep) name = pat->name; nDashes = pat->ndashes; firstWild = 0; + firstDigit = 0; t = name; while ((c = *t++)) { if (isWild(c)) { if (!firstWild) firstWild = t - 1; } + if (isDigit(c)) { + if (!firstDigit) + firstDigit = t - 1; + } } left = 0; right = table->used; @@ -266,7 +331,10 @@ SetupWildMatch(table, pat, leftp, rightp, privatep) *rightp = right; return -1; } else if (firstWild) { - first = firstWild - name; + if (firstDigit && firstDigit < firstWild) + first = firstDigit - name; + else + first = firstWild - name; while (left < right) { center = (left + right) / 2; result = strncmp(name, table->entries[center].name.name, first); @@ -283,7 +351,7 @@ SetupWildMatch(table, pat, leftp, rightp, privatep) } else { while (left < right) { center = (left + right) / 2; - result = strcmp(name, table->entries[center].name.name); + result = strcmpn(name, table->entries[center].name.name); if (result == 0) return center; if (result < 0) @@ -298,9 +366,7 @@ SetupWildMatch(table, pat, leftp, rightp, privatep) } static int -PatternMatch(pat, patdashes, string, stringdashes) - char *pat; - char *string; +PatternMatch(char *pat, int patdashes, char *string, int stringdashes) { char c, t; @@ -360,9 +426,7 @@ PatternMatch(pat, patdashes, string, stringdashes) } int -FontFileCountDashes (name, namelen) - char *name; - int namelen; +FontFileCountDashes (char *name, int namelen) { int ndashes = 0; @@ -373,8 +437,7 @@ FontFileCountDashes (name, namelen) } char * -FontFileSaveString (s) - char *s; +FontFileSaveString (char *s) { char *n; @@ -386,10 +449,8 @@ FontFileSaveString (s) } FontEntryPtr -FontFileFindNameInScalableDir(table, pat, vals) - FontTablePtr table; - FontNamePtr pat; - FontScalablePtr vals; +FontFileFindNameInScalableDir(FontTablePtr table, FontNamePtr pat, + FontScalablePtr vals) { int i, start, @@ -417,11 +478,11 @@ FontFileFindNameInScalableDir(table, pat, vals) cap = ~0; /* Calling code will have to see if true */ else cap = 0; - if (((vs & PIXELSIZE_MASK) == PIXELSIZE_ARRAY || - (vs & POINTSIZE_MASK) == POINTSIZE_ARRAY) && - !(cap & CAP_MATRIX) || - (vs & CHARSUBSET_SPECIFIED) && - !(cap & CAP_CHARSUBSETTING)) + if ((((vs & PIXELSIZE_MASK) == PIXELSIZE_ARRAY || + (vs & POINTSIZE_MASK) == POINTSIZE_ARRAY) && + !(cap & CAP_MATRIX)) || + ((vs & CHARSUBSET_SPECIFIED) && + !(cap & CAP_CHARSUBSETTING))) continue; } return &table->entries[i]; @@ -433,23 +494,15 @@ FontFileFindNameInScalableDir(table, pat, vals) } FontEntryPtr -FontFileFindNameInDir(table, pat) - FontTablePtr table; - FontNamePtr pat; +FontFileFindNameInDir(FontTablePtr table, FontNamePtr pat) { return FontFileFindNameInScalableDir(table, pat, (FontScalablePtr)0); } int -FontFileFindNamesInScalableDir(table, pat, max, names, vals, - alias_behavior, newmax) - FontTablePtr table; - FontNamePtr pat; - int max; - FontNamesPtr names; - FontScalablePtr vals; - int alias_behavior; - int *newmax; +FontFileFindNamesInScalableDir(FontTablePtr table, FontNamePtr pat, int max, + FontNamesPtr names, FontScalablePtr vals, + int alias_behavior, int *newmax) { int i, start, @@ -487,11 +540,11 @@ FontFileFindNamesInScalableDir(table, pat, max, names, vals, cap = ~0; /* Calling code will have to see if true */ else cap = 0; - if (((vs & PIXELSIZE_MASK) == PIXELSIZE_ARRAY || + if ((((vs & PIXELSIZE_MASK) == PIXELSIZE_ARRAY || (vs & POINTSIZE_MASK) == POINTSIZE_ARRAY) && - !(cap & CAP_MATRIX) || - (vs & CHARSUBSET_SPECIFIED) && - !(cap & CAP_CHARSUBSETTING)) + !(cap & CAP_MATRIX)) || + ((vs & CHARSUBSET_SPECIFIED) && + !(cap & CAP_CHARSUBSETTING))) continue; } @@ -534,11 +587,8 @@ FontFileFindNamesInScalableDir(table, pat, max, names, vals, } int -FontFileFindNamesInDir(table, pat, max, names) - FontTablePtr table; - FontNamePtr pat; - int max; - FontNamesPtr names; +FontFileFindNamesInDir(FontTablePtr table, FontNamePtr pat, + int max, FontNamesPtr names) { return FontFileFindNamesInScalableDir(table, pat, max, names, (FontScalablePtr)0, @@ -546,10 +596,7 @@ FontFileFindNamesInDir(table, pat, max, names) } Bool -FontFileMatchName(name, length, pat) - char *name; - int length; - FontNamePtr pat; +FontFileMatchName(char *name, int length, FontNamePtr pat) { /* Perform a fontfile-type name match on a single name */ FontTableRec table; @@ -573,17 +620,14 @@ FontFileMatchName(name, length, pat) */ Bool -FontFileAddFontFile (dir, fontName, fileName) - FontDirectoryPtr dir; - char *fontName; - char *fileName; +FontFileAddFontFile (FontDirectoryPtr dir, char *fontName, char *fileName) { FontEntryRec entry; FontScalableRec vals, zeroVals; FontRendererPtr renderer; FontEntryPtr existing; FontScalableExtraPtr extra; - FontEntryPtr bitmap, scalable; + FontEntryPtr bitmap = 0, scalable; Bool isscale; renderer = FontFileMatchRenderer (fileName); @@ -610,6 +654,28 @@ FontFileAddFontFile (dir, fontName, fileName) (vals.values_supplied & PIXELSIZE_MASK) != PIXELSIZE_ARRAY && (vals.values_supplied & POINTSIZE_MASK) != POINTSIZE_ARRAY && !(vals.values_supplied & ENHANCEMENT_SPECIFY_MASK); +#ifdef FONTDIRATTRIB +#define UNSCALED_ATTRIB "unscaled" + /* For scalable fonts, check if the "unscaled" attribute is present */ + if (isscale && dir->attributes && dir->attributes[0] == ':') { + char *ptr1 = dir->attributes + 1; + char *ptr2; + int length; + int uslength = strlen(UNSCALED_ATTRIB); + + do { + ptr2 = strchr(ptr1, ':'); + if (ptr2) + length = ptr2 - ptr1; + else + length = dir->attributes + strlen(dir->attributes) - ptr1; + if (length == uslength && !strncmp(ptr1, UNSCALED_ATTRIB, uslength)) + isscale = FALSE; + if (ptr2) + ptr1 = ptr2 + 1; + } while (ptr2); + } +#endif if (!isscale || (vals.values_supplied & SIZE_SPECIFY_MASK)) { /* If the fontname says it is nonScalable, make sure that the @@ -739,10 +805,7 @@ FontFileAddFontFile (dir, fontName, fileName) } Bool -FontFileAddFontAlias (dir, aliasName, fontName) - FontDirectoryPtr dir; - char *aliasName; - char *fontName; +FontFileAddFontAlias (FontDirectoryPtr dir, char *aliasName, char *fontName) { FontEntryRec entry; diff --git a/src/fontfile/fontfile.c b/src/fontfile/fontfile.c index 5230a15..1e39413 100644 --- a/src/fontfile/fontfile.c +++ b/src/fontfile/fontfile.c @@ -25,11 +25,12 @@ used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from The Open Group. */ +/* $XFree86: xc/lib/font/fontfile/fontfile.c,v 3.16 2002/05/31 18:45:50 dawes Exp $ */ /* * Author: Keith Packard, MIT X Consortium */ -/* $NCDId: @(#)fontfile.c,v 1.6 1991/07/02 17:00:46 lemke Exp $ */ +/* $NCDXorg: @(#)fontfile.c,v 1.6 1991/07/02 17:00:46 lemke Exp $ */ #include "fntfilst.h" @@ -37,11 +38,23 @@ in this Software without prior written authorization from The Open Group. * Map FPE functions to renderer functions */ +static int FontFileOpenBitmapNCF (FontPathElementPtr fpe, FontPtr *pFont, + int flags, FontEntryPtr entry, + fsBitmapFormat format, + fsBitmapFormatMask fmask, + FontPtr non_cachable_font); + int -FontFileNameCheck (name) - char *name; +FontFileNameCheck (char *name) { #ifndef NCD +#ifdef __UNIXOS2__ + /* OS/2 uses D:/... as a path name for fonts, so accept this as a valid + * path if it starts with a letter and a colon + */ + if (isalpha(*name) && name[1]==':') + return TRUE; +#endif return *name == '/'; #else return ((strcmp(name, "built-ins") == 0) || (*name == '/')); @@ -49,8 +62,7 @@ FontFileNameCheck (name) } int -FontFileInitFPE (fpe) - FontPathElementPtr fpe; +FontFileInitFPE (FontPathElementPtr fpe) { int status; FontDirectoryPtr dir; @@ -71,12 +83,15 @@ FontFileInitFPE (fpe) /* ARGSUSED */ int -FontFileResetFPE (fpe) - FontPathElementPtr fpe; +FontFileResetFPE (FontPathElementPtr fpe) { FontDirectoryPtr dir; dir = (FontDirectoryPtr) fpe->private; + /* + * The reset must fail for bitmap fonts because they get cleared when + * the path is set. + */ if (FontFileDirectoryChanged (dir)) { /* can't do it, so tell the caller to close and re-open */ @@ -94,8 +109,7 @@ FontFileResetFPE (fpe) } int -FontFileFreeFPE (fpe) - FontPathElementPtr fpe; +FontFileFreeFPE (FontPathElementPtr fpe) { FontFileUnregisterBitmapSource (fpe); FontFileFreeDir ((FontDirectoryPtr) fpe->private); @@ -103,13 +117,9 @@ FontFileFreeFPE (fpe) } static int -transfer_values_to_alias(entryname, entrynamelength, resolvedname, - aliasName, vals) - char *entryname; - int entrynamelength; - char *resolvedname; - char **aliasName; - FontScalablePtr vals; +transfer_values_to_alias(char *entryname, int entrynamelength, + char *resolvedname, + char **aliasName, FontScalablePtr vals) { static char aliasname[MAXFONTNAMELEN]; int nameok = 1, len; @@ -117,6 +127,7 @@ transfer_values_to_alias(entryname, entrynamelength, resolvedname, *aliasName = resolvedname; if ((len = strlen(*aliasName)) <= MAXFONTNAMELEN && + (entrynamelength < MAXFONTNAMELEN) && FontFileCountDashes (*aliasName, len) == 14) { FontScalableRec tmpVals; @@ -158,7 +169,6 @@ transfer_values_to_alias(entryname, entrynamelength, resolvedname, gotchas */ if (FontFileCompleteXLFD(&tmpVals2, &tmpVals2)) { - double hypot(); tempmatrix[0] = matrix[0] * tmpVals2.point_matrix[0] + matrix[1] * tmpVals2.point_matrix[2]; @@ -219,19 +229,11 @@ transfer_values_to_alias(entryname, entrynamelength, resolvedname, /* ARGSUSED */ int -FontFileOpenFont (client, fpe, flags, name, namelen, format, fmask, - id, pFont, aliasName, non_cachable_font) - pointer client; - FontPathElementPtr fpe; - int flags; - char *name; - int namelen; - fsBitmapFormat format; - fsBitmapFormatMask fmask; - XID id; - FontPtr *pFont; - char **aliasName; - FontPtr non_cachable_font; +FontFileOpenFont (pointer client, FontPathElementPtr fpe, Mask flags, + char *name, int namelen, + fsBitmapFormat format, fsBitmapFormatMask fmask, + XID id, FontPtr *pFont, char **aliasName, + FontPtr non_cachable_font) { FontDirectoryPtr dir; char lowerName[MAXFONTNAMELEN]; @@ -461,9 +463,7 @@ FontFileOpenFont (client, fpe, flags, name, namelen, format, fmask, /* ARGSUSED */ void -FontFileCloseFont (fpe, pFont) - FontPathElementPtr fpe; - FontPtr pFont; +FontFileCloseFont (FontPathElementPtr fpe, FontPtr pFont) { FontEntryPtr entry; @@ -484,14 +484,11 @@ FontFileCloseFont (fpe, pFont) (*pFont->unload_font) (pFont); } -int -FontFileOpenBitmapNCF (fpe, pFont, flags, entry, format, fmask, - non_cachable_font) - FontPathElementPtr fpe; - int flags; - FontEntryPtr entry; - FontPtr *pFont; - FontPtr non_cachable_font; +static int +FontFileOpenBitmapNCF (FontPathElementPtr fpe, FontPtr *pFont, + int flags, FontEntryPtr entry, + fsBitmapFormat format, fsBitmapFormatMask fmask, + FontPtr non_cachable_font) { FontBitmapEntryPtr bitmap; char fileName[MAXFONTFILENAMELEN*2+1]; @@ -514,21 +511,17 @@ FontFileOpenBitmapNCF (fpe, pFont, flags, entry, format, fmask, } int -FontFileOpenBitmap (fpe, pFont, flags, entry, format, fmask) - FontPathElementPtr fpe; - int flags; - FontEntryPtr entry; - FontPtr *pFont; +FontFileOpenBitmap (FontPathElementPtr fpe, FontPtr *pFont, + int flags, FontEntryPtr entry, + fsBitmapFormat format, fsBitmapFormatMask fmask) { return FontFileOpenBitmapNCF (fpe, pFont, flags, entry, format, fmask, (FontPtr)0); } -int -FontFileGetInfoBitmap (fpe, pFontInfo, entry) - FontPathElementPtr fpe; - FontInfoPtr pFontInfo; - FontEntryPtr entry; +static int +FontFileGetInfoBitmap (FontPathElementPtr fpe, FontInfoPtr pFontInfo, + FontEntryPtr entry) { FontBitmapEntryPtr bitmap; char fileName[MAXFONTFILENAMELEN*2+1]; @@ -544,16 +537,10 @@ FontFileGetInfoBitmap (fpe, pFontInfo, entry) } static void -_FontFileAddScalableNames(names, scaleNames, nameptr, zeroChars, vals, ranges, - nranges, max) - FontNamesPtr names; - FontNamesPtr scaleNames; - FontNamePtr nameptr; - char *zeroChars; - FontScalablePtr vals; - fsRange *ranges; - int nranges; - int *max; +_FontFileAddScalableNames(FontNamesPtr names, FontNamesPtr scaleNames, + FontNamePtr nameptr, char *zeroChars, + FontScalablePtr vals, fsRange *ranges, + int nranges, int *max) { int i; FontScalableRec zeroVals, tmpVals; @@ -667,14 +654,9 @@ _FontFileAddScalableNames(names, scaleNames, nameptr, zeroChars, vals, ranges, /* ARGSUSED */ static int -_FontFileListFonts (client, fpe, pat, len, max, names, mark_aliases) - pointer client; - FontPathElementPtr fpe; - char *pat; - int len; - int max; - FontNamesPtr names; - int mark_aliases; +_FontFileListFonts (pointer client, FontPathElementPtr fpe, + char *pat, int len, int max, FontNamesPtr names, + int mark_aliases) { FontDirectoryPtr dir; char lowerChars[MAXFONTNAMELEN], zeroChars[MAXFONTNAMELEN]; @@ -779,25 +761,16 @@ typedef struct _LFWIData { } LFWIDataRec, *LFWIDataPtr; int -FontFileListFonts (client, fpe, pat, len, max, names) - pointer client; - FontPathElementPtr fpe; - char *pat; - int len; - int max; - FontNamesPtr names; +FontFileListFonts (pointer client, FontPathElementPtr fpe, char *pat, + int len, int max, FontNamesPtr names) { return _FontFileListFonts (client, fpe, pat, len, max, names, 0); } int -FontFileStartListFontsWithInfo(client, fpe, pat, len, max, privatep) - pointer client; - FontPathElementPtr fpe; - char *pat; - int len; - int max; - pointer *privatep; +FontFileStartListFontsWithInfo(pointer client, FontPathElementPtr fpe, + char *pat, int len, int max, + pointer *privatep) { LFWIDataPtr data; int ret; @@ -825,12 +798,9 @@ FontFileStartListFontsWithInfo(client, fpe, pat, len, max, privatep) /* ARGSUSED */ static int -FontFileListOneFontWithInfo (client, fpe, namep, namelenp, pFontInfo) - pointer client; - FontPathElementPtr fpe; - char **namep; - int *namelenp; - FontInfoPtr *pFontInfo; +FontFileListOneFontWithInfo (pointer client, FontPathElementPtr fpe, + char **namep, int *namelenp, + FontInfoPtr *pFontInfo) { FontDirectoryPtr dir; char lowerName[MAXFONTNAMELEN]; @@ -979,15 +949,10 @@ FontFileListOneFontWithInfo (client, fpe, namep, namelenp, pFontInfo) } int -FontFileListNextFontWithInfo(client, fpe, namep, namelenp, pFontInfo, - numFonts, private) - pointer client; - FontPathElementPtr fpe; - char **namep; - int *namelenp; - FontInfoPtr *pFontInfo; - int *numFonts; - pointer private; +FontFileListNextFontWithInfo(pointer client, FontPathElementPtr fpe, + char **namep, int *namelenp, + FontInfoPtr *pFontInfo, + int *numFonts, pointer private) { LFWIDataPtr data = (LFWIDataPtr) private; int ret; @@ -1013,13 +978,9 @@ FontFileListNextFontWithInfo(client, fpe, namep, namelenp, pFontInfo, } int -FontFileStartListFontsAndAliases(client, fpe, pat, len, max, privatep) - pointer client; - FontPathElementPtr fpe; - char *pat; - int len; - int max; - pointer *privatep; +FontFileStartListFontsAndAliases(pointer client, FontPathElementPtr fpe, + char *pat, int len, int max, + pointer *privatep) { LFWIDataPtr data; int ret; @@ -1046,15 +1007,9 @@ FontFileStartListFontsAndAliases(client, fpe, pat, len, max, privatep) } int -FontFileListNextFontOrAlias(client, fpe, namep, namelenp, resolvedp, - resolvedlenp, private) - pointer client; - FontPathElementPtr fpe; - char **namep; - int *namelenp; - char **resolvedp; - int *resolvedlenp; - pointer private; +FontFileListNextFontOrAlias(pointer client, FontPathElementPtr fpe, + char **namep, int *namelenp, char **resolvedp, + int *resolvedlenp, pointer private) { LFWIDataPtr data = (LFWIDataPtr) private; int ret; @@ -1094,12 +1049,11 @@ FontFileListNextFontOrAlias(client, fpe, namep, namelenp, resolvedp, } -extern void FontFileEmptyBitmapSource(); -typedef int (*IntFunc) (); +typedef int (*IntFunc) (void); static int font_file_type; void -FontFileRegisterLocalFpeFunctions () +FontFileRegisterLocalFpeFunctions (void) { font_file_type = RegisterFPEFunctions(FontFileNameCheck, FontFileInitFPE, @@ -1110,9 +1064,9 @@ FontFileRegisterLocalFpeFunctions () FontFileListFonts, FontFileStartListFontsWithInfo, FontFileListNextFontWithInfo, - (IntFunc) 0, - (IntFunc) 0, - (IntFunc) 0, + NULL, + NULL, + NULL, FontFileStartListFontsAndAliases, FontFileListNextFontOrAlias, FontFileEmptyBitmapSource); diff --git a/src/fontfile/fontscale.c b/src/fontfile/fontscale.c index 56ed691..8fb63e4 100644 --- a/src/fontfile/fontscale.c +++ b/src/fontfile/fontscale.c @@ -25,6 +25,7 @@ used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from The Open Group. */ +/* $XFree86: xc/lib/font/fontfile/fontscale.c,v 3.10 2001/12/14 19:56:52 dawes Exp $ */ /* * Author: Keith Packard, MIT X Consortium @@ -40,11 +41,8 @@ in this Software without prior written authorization from The Open Group. #endif Bool -FontFileAddScaledInstance (entry, vals, pFont, bitmapName) - FontEntryPtr entry; - FontScalablePtr vals; - FontPtr pFont; - char *bitmapName; +FontFileAddScaledInstance (FontEntryPtr entry, FontScalablePtr vals, + FontPtr pFont, char *bitmapName) { FontScalableEntryPtr scalable; FontScalableExtraPtr extra; @@ -75,8 +73,7 @@ FontFileAddScaledInstance (entry, vals, pFont, bitmapName) /* Must call this after the directory is sorted */ void -FontFileSwitchStringsToBitmapPointers (dir) - FontDirectoryPtr dir; +FontFileSwitchStringsToBitmapPointers (FontDirectoryPtr dir) { int s; int b; @@ -100,9 +97,7 @@ FontFileSwitchStringsToBitmapPointers (dir) } void -FontFileRemoveScaledInstance (entry, pFont) - FontEntryPtr entry; - FontPtr pFont; +FontFileRemoveScaledInstance (FontEntryPtr entry, FontPtr pFont) { FontScalableEntryPtr scalable; FontScalableExtraPtr extra; @@ -124,9 +119,7 @@ FontFileRemoveScaledInstance (entry, pFont) } Bool -FontFileCompleteXLFD (vals, def) - register FontScalablePtr vals; - FontScalablePtr def; +FontFileCompleteXLFD (FontScalablePtr vals, FontScalablePtr def) { FontResolutionPtr res; int num_res; @@ -247,7 +240,7 @@ FontFileCompleteXLFD (vals, def) pixel_setsize_adjustment = (double)vals->x / (double)vals->y; vals->pixel_matrix[0] *= pixel_setsize_adjustment; - vals->values_supplied = vals->values_supplied & ~PIXELSIZE_MASK | + vals->values_supplied = (vals->values_supplied & ~PIXELSIZE_MASK) | PIXELSIZE_SCALAR_NORMALIZED; } @@ -349,8 +342,7 @@ FontFileCompleteXLFD (vals, def) } static Bool -MatchScalable (a, b) - FontScalablePtr a, b; +MatchScalable (FontScalablePtr a, FontScalablePtr b) { int i; @@ -370,15 +362,15 @@ MatchScalable (a, b) if (!(a->x == b->x && a->y == b->y && - (a->width == b->width || a->width == 0 || b->width == 0) && + (a->width == b->width || a->width == 0 || b->width == 0 || b->width == -1) && (!(b->values_supplied & PIXELSIZE_MASK) || - (a->values_supplied & PIXELSIZE_MASK) == - (b->values_supplied & PIXELSIZE_MASK) && - EQUAL(a->pixel_matrix, b->pixel_matrix)) && + ((a->values_supplied & PIXELSIZE_MASK) == + (b->values_supplied & PIXELSIZE_MASK) && + EQUAL(a->pixel_matrix, b->pixel_matrix))) && (!(b->values_supplied & POINTSIZE_MASK) || - (a->values_supplied & POINTSIZE_MASK) == - (b->values_supplied & POINTSIZE_MASK) && - EQUAL(a->point_matrix, b->point_matrix)) && + ((a->values_supplied & POINTSIZE_MASK) == + (b->values_supplied & POINTSIZE_MASK) && + EQUAL(a->point_matrix, b->point_matrix))) && (a->nranges == 0 || a->nranges == b->nranges))) return FALSE; @@ -393,9 +385,8 @@ MatchScalable (a, b) } FontScaledPtr -FontFileFindScaledInstance (entry, vals, noSpecificSize) - FontEntryPtr entry; - FontScalablePtr vals; +FontFileFindScaledInstance (FontEntryPtr entry, FontScalablePtr vals, + int noSpecificSize) { FontScalableEntryPtr scalable; FontScalableExtraPtr extra; diff --git a/src/fontfile/gunzip.c b/src/fontfile/gunzip.c index a303f21..21894d0 100644 --- a/src/fontfile/gunzip.c +++ b/src/fontfile/gunzip.c @@ -2,6 +2,7 @@ /* lib/font/fontfile/gunzip.c written by Mark Eichin <eichin@kitten.gen.ma.us> September 1996. intended for inclusion in X11 public releases. */ +/* $XFree86: xc/lib/font/fontfile/gunzip.c,v 1.5 2001/01/17 19:43:30 dawes Exp $ */ #include "fontmisc.h" #include <bufio.h> @@ -15,14 +16,13 @@ typedef struct _xzip_buf { BufFilePtr f; } xzip_buf; -static int BufZipFileSkip(); /* f, count */ -static int BufZipFileFill(); /* read: f; write: char, f */ -static int BufZipFileClose(); /* f, flag */ -static int BufCheckZipHeader(); /* f */ +static int BufZipFileClose ( BufFilePtr f, int flag ); +static int BufZipFileFill ( BufFilePtr f ); +static int BufZipFileSkip ( BufFilePtr f, int c ); +static int BufCheckZipHeader ( BufFilePtr f ); BufFilePtr -BufFilePushZIP (f) - BufFilePtr f; +BufFilePushZIP (BufFilePtr f) { xzip_buf *x; @@ -58,15 +58,15 @@ BufFilePushZIP (f) return 0; } - return BufFileCreate(x, + return BufFileCreate((char *)x, BufZipFileFill, + 0, BufZipFileSkip, BufZipFileClose); } -static int BufZipFileClose(f, flag) - BufFilePtr f; - int flag; +static int +BufZipFileClose(BufFilePtr f, int flag) { xzip_buf *x = (xzip_buf *)f->private; inflateEnd (&(x->z)); @@ -84,8 +84,8 @@ static int BufZipFileClose(f, flag) Z_STREAM_END, we then have 4bytes CRC and 4bytes length... gzio.c:gzread shows most of the mechanism. */ -static int BufZipFileFill (f) - BufFilePtr f; +static int +BufZipFileFill (BufFilePtr f) { xzip_buf *x = (xzip_buf *)f->private; @@ -102,7 +102,8 @@ static int BufZipFileFill (f) case Z_STREAM_END: case Z_DATA_ERROR: case Z_ERRNO: - return BUFFILEEOF; + f->left = 0; + return BUFFILEEOF; default: return BUFFILEEOF; } @@ -148,9 +149,8 @@ static int BufZipFileFill (f) } /* there should be a BufCommonSkip... */ -static int BufZipFileSkip (f, c) - BufFilePtr f; - int c; +static int +BufZipFileSkip (BufFilePtr f, int c) { /* BufFileRawSkip returns the count unchanged. BufCompressedSkip returns 0. @@ -191,8 +191,8 @@ static int BufZipFileSkip (f, c) #define RESERVED 0xE0 /* bits 5..7: reserved */ #define GET(f) do {c = BufFileGet(f); if (c == BUFFILEEOF) return c;} while(0) -static int BufCheckZipHeader(f) - BufFilePtr f; +static int +BufCheckZipHeader(BufFilePtr f) { int c, flags; GET(f); if (c != 0x1f) return 1; /* magic 1 */ diff --git a/src/fontfile/printerfont.c b/src/fontfile/printerfont.c index 5632aa5..6759e91 100644 --- a/src/fontfile/printerfont.c +++ b/src/fontfile/printerfont.c @@ -25,11 +25,12 @@ used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from The Open Group. */ +/* $XFree86: xc/lib/font/fontfile/printerfont.c,v 1.5 2001/12/14 19:56:52 dawes Exp $ */ /* * Author: Keith Packard, MIT X Consortium */ -/* $NCDId: @(#)fontfile.c,v 1.6 1991/07/02 17:00:46 lemke Exp $ */ +/* $NCDXorg: @(#)fontfile.c,v 1.6 1991/07/02 17:00:46 lemke Exp $ */ #include "fntfilst.h" @@ -37,10 +38,6 @@ in this Software without prior written authorization from The Open Group. * Map FPE functions to renderer functions */ -extern int FontFileInitFPE(); -extern int FontFileResetFPE(); -extern int FontFileFreeFPE(); -extern void FontFileCloseFont(); #define PRINTERPATHPREFIX "PRINTER:" /* STUB @@ -50,9 +47,8 @@ FontPathElementPtr fpe; { return 1; } */ -int -PrinterFontNameCheck (name) - char *name; +static int +PrinterFontNameCheck (char *name) { if (strncmp(name,PRINTERPATHPREFIX,strlen(PRINTERPATHPREFIX)) != 0) return 0; @@ -64,9 +60,8 @@ PrinterFontNameCheck (name) #endif } -int -PrinterFontInitFPE (fpe) - FontPathElementPtr fpe; +static int +PrinterFontInitFPE (FontPathElementPtr fpe) { int status; FontDirectoryPtr dir; @@ -91,20 +86,12 @@ PrinterFontInitFPE (fpe) * it that allows us to access the printer fonts */ -int -PrinterFontOpenFont (client, fpe, flags, name, namelen, format, fmask, - id, pFont, aliasName, non_cachable_font) - pointer client; - FontPathElementPtr fpe; - int flags; - char *name; - int namelen; - fsBitmapFormat format; - fsBitmapFormatMask fmask; - XID id; - FontPtr *pFont; - char **aliasName; - FontPtr non_cachable_font; +static int +PrinterFontOpenFont (pointer client, FontPathElementPtr fpe, Mask flags, + char *name, int namelen, + fsBitmapFormat format, fsBitmapFormatMask fmask, + XID id, FontPtr *pFont, char **aliasName, + FontPtr non_cachable_font) { if (XpClientIsPrintClient(client,fpe)) return (FontFileOpenFont (client, fpe, flags, name, namelen, format, @@ -112,28 +99,19 @@ PrinterFontOpenFont (client, fpe, flags, name, namelen, format, fmask, return BadFontName; } -int -PrinterFontListFonts (client, fpe, pat, len, max, names) - pointer client; - FontPathElementPtr fpe; - char *pat; - int len; - int max; - FontNamesPtr names; +static int +PrinterFontListFonts (pointer client, FontPathElementPtr fpe, char *pat, + int len, int max, FontNamesPtr names) { if (XpClientIsPrintClient(client,fpe)) return FontFileListFonts (client, fpe, pat, len, max, names); return BadFontName; } -int -PrinterFontStartListFontsWithInfo(client, fpe, pat, len, max, privatep) - pointer client; - FontPathElementPtr fpe; - char *pat; - int len; - int max; - pointer *privatep; +static int +PrinterFontStartListFontsWithInfo(pointer client, FontPathElementPtr fpe, + char *pat, int len, int max, + pointer *privatep) { if (XpClientIsPrintClient(client,fpe)) return FontFileStartListFontsWithInfo(client, fpe, pat, len, @@ -141,16 +119,11 @@ PrinterFontStartListFontsWithInfo(client, fpe, pat, len, max, privatep) return BadFontName; } -int -PrinterFontListNextFontWithInfo(client, fpe, namep, namelenp, pFontInfo, - numFonts, private) - pointer client; - FontPathElementPtr fpe; - char **namep; - int *namelenp; - FontInfoPtr *pFontInfo; - int *numFonts; - pointer private; +static int +PrinterFontListNextFontWithInfo(pointer client, FontPathElementPtr fpe, + char **namep, int *namelenp, + FontInfoPtr *pFontInfo, + int *numFonts, pointer private) { if (XpClientIsPrintClient(client,fpe)) return FontFileListNextFontWithInfo(client, fpe, namep, namelenp, @@ -158,14 +131,10 @@ PrinterFontListNextFontWithInfo(client, fpe, namep, namelenp, pFontInfo, return BadFontName; } -int -PrinterFontStartListFontsAndAliases(client, fpe, pat, len, max, privatep) - pointer client; - FontPathElementPtr fpe; - char *pat; - int len; - int max; - pointer *privatep; +static int +PrinterFontStartListFontsAndAliases(pointer client, FontPathElementPtr fpe, + char *pat, int len, int max, + pointer *privatep) { if (XpClientIsPrintClient(client,fpe)) return FontFileStartListFontsAndAliases(client, fpe, pat, len, @@ -173,16 +142,11 @@ PrinterFontStartListFontsAndAliases(client, fpe, pat, len, max, privatep) return BadFontName; } -int -PrinterFontListNextFontOrAlias(client, fpe, namep, namelenp, resolvedp, - resolvedlenp, private) - pointer client; - FontPathElementPtr fpe; - char **namep; - int *namelenp; - char **resolvedp; - int *resolvedlenp; - pointer private; +static int +PrinterFontListNextFontOrAlias(pointer client, FontPathElementPtr fpe, + char **namep, int *namelenp, + char **resolvedp, int *resolvedlenp, + pointer private) { if (XpClientIsPrintClient(client,fpe)) return FontFileListNextFontOrAlias(client, fpe, namep, namelenp, @@ -190,12 +154,11 @@ PrinterFontListNextFontOrAlias(client, fpe, namep, namelenp, resolvedp, return BadFontName; } -extern void FontFileEmptyBitmapSource(); -typedef int (*IntFunc) (); +typedef int (*IntFunc) (void); static int printer_font_type; void -PrinterFontRegisterFpeFunctions () +PrinterFontRegisterFpeFunctions (void) { /* what is the use of printer font type? */ printer_font_type = RegisterFPEFunctions(PrinterFontNameCheck, @@ -207,9 +170,9 @@ PrinterFontRegisterFpeFunctions () PrinterFontListFonts, PrinterFontStartListFontsWithInfo, PrinterFontListNextFontWithInfo, - (IntFunc) 0, - (IntFunc) 0, - (IntFunc) 0, + NULL, + NULL, + NULL, PrinterFontStartListFontsAndAliases, PrinterFontListNextFontOrAlias, FontFileEmptyBitmapSource); diff --git a/src/fontfile/register.c b/src/fontfile/register.c index 8379f85..385d165 100644 --- a/src/fontfile/register.c +++ b/src/fontfile/register.c @@ -25,6 +25,7 @@ used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from The Open Group. */ +/* $XFree86: xc/lib/font/fontfile/register.c,v 1.15 2001/12/14 19:56:52 dawes Exp $ */ /* * This is in a separate source file so that small programs @@ -32,19 +33,55 @@ in this Software without prior written authorization from The Open Group. * end up dragging in code from all the renderers, which is not small. */ +#include "fontmisc.h" +#include "fntfilst.h" +#include "bitmap.h" + +#ifdef LOADABLEFONTS +#include "fontmod.h" +#endif + void -FontFileRegisterFpeFunctions() +FontFileRegisterFpeFunctions(void) { +#ifndef LOADABLEFONTS BitmapRegisterFontFileFunctions (); #ifndef LOWMEMFTPT #ifndef CRAY +#ifdef BUILD_SPEEDO SpeedoRegisterFontFileFunctions (); +#endif +#ifdef BUILD_TYPE1 Type1RegisterFontFileFunctions(); #endif +#endif +#ifdef BUILD_CID + CIDRegisterFontFileFunctions(); +#endif +#ifdef BUILD_FREETYPE + FreeTypeRegisterFontFileFunctions(); +#endif +#ifdef BUILD_XTRUETYPE + XTrueTypeRegisterFontFileFunctions(); +#endif #endif /* ifndef LOWMEMFTPT */ +#else + { + int i; + + if (FontModuleList) { + for (i = 0; FontModuleList[i].name; i++) { + if (FontModuleList[i].initFunc) + FontModuleList[i].initFunc(); + } + } + } +#endif + FontFileRegisterLocalFpeFunctions (); } + diff --git a/src/fontfile/renderers.c b/src/fontfile/renderers.c index c997f27..2db871d 100644 --- a/src/fontfile/renderers.c +++ b/src/fontfile/renderers.c @@ -25,39 +25,76 @@ used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from The Open Group. */ +/* $XFree86: xc/lib/font/fontfile/renderers.c,v 1.7 2002/12/09 17:30:00 dawes Exp $ */ /* * Author: Keith Packard, MIT X Consortium */ #include "fntfilst.h" +extern void ErrorF(const char *f, ...); static FontRenderersRec renderers; +/* + * XXX Maybe should allow unregistering renders. For now, just clear the + * list at each new generation. + */ +extern unsigned long serverGeneration; +static unsigned long rendererGeneration = 0; + +Bool +FontFileRegisterRenderer (FontRendererPtr renderer) +{ + return FontFilePriorityRegisterRenderer(renderer, 0); +} + Bool -FontFileRegisterRenderer (renderer) - FontRendererPtr renderer; +FontFilePriorityRegisterRenderer (FontRendererPtr renderer, int priority) { int i; - FontRendererPtr *new; + struct _FontRenderersElement *new; - for (i = 0; i < renderers.number; i++) - if (!strcmp (renderers.renderers[i]->fileSuffix, renderer->fileSuffix)) - return TRUE; - i = renderers.number + 1; - new = (FontRendererPtr *) xrealloc (renderers.renderers, sizeof *new * i); - if (!new) - return FALSE; - renderer->number = i - 1; - renderers.renderers = new; - renderers.renderers[i - 1] = renderer; - renderers.number = i; + if (rendererGeneration != serverGeneration) { + rendererGeneration = serverGeneration; + renderers.number = 0; + if (!renderers.renderers) + xfree(renderers.renderers); + renderers.renderers = NULL; + } + + for (i = 0; i < renderers.number; i++) { + if (!strcmp (renderers.renderers[i].renderer->fileSuffix, + renderer->fileSuffix)) { + if(renderers.renderers[i].priority >= priority) { + if(renderers.renderers[i].priority == priority) { + if (rendererGeneration == 1) + ErrorF("Warning: font renderer for \"%s\" " + "already registered at priority %d\n", + renderer->fileSuffix, priority); + } + return TRUE; + } else { + break; + } + } + } + + if(i >= renderers.number) { + new = xrealloc (renderers.renderers, sizeof(*new) * (i + 1)); + if (!new) + return FALSE; + renderers.renderers = new; + renderers.number = i + 1; + } + renderer->number = i; + renderers.renderers[i].renderer = renderer; + renderers.renderers[i].priority = priority; return TRUE; } FontRendererPtr -FontFileMatchRenderer (fileName) - char *fileName; +FontFileMatchRenderer (char *fileName) { int i; int fileLen; @@ -66,7 +103,7 @@ FontFileMatchRenderer (fileName) fileLen = strlen (fileName); for (i = 0; i < renderers.number; i++) { - r = renderers.renderers[i]; + r = renderers.renderers[i].renderer; if (fileLen >= r->fileSuffixLen && !strcmp (fileName + fileLen - r->fileSuffixLen, r->fileSuffix)) { diff --git a/src/util/atom.c b/src/util/atom.c index 140d774..3863c94 100644 --- a/src/util/atom.c +++ b/src/util/atom.c @@ -25,6 +25,7 @@ used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from The Open Group. */ +/* $XFree86: xc/lib/font/util/atom.c,v 1.10 2002/09/24 20:52:48 tsi Exp $ */ /* * Author: Keith Packard, MIT X Consortium @@ -52,8 +53,7 @@ static int reverseMapSize; static Atom lastAtom; static int -Hash(string, len) - char *string; +Hash(char *string, int len) { int h; @@ -66,7 +66,7 @@ Hash(string, len) } static int -ResizeHashTable () +ResizeHashTable (void) { int newHashSize; int newHashMask; @@ -82,7 +82,9 @@ ResizeHashTable () newHashSize = hashSize * 2; newHashTable = (AtomListPtr *) xalloc (newHashSize * sizeof (AtomListPtr)); if (!newHashTable) { - fprintf(stderr, "ResizeHashTable(): Error: Couldn't allocate newHashTable (%d)\n", newHashSize * sizeof (AtomListPtr)); + fprintf(stderr, "ResizeHashTable(): Error: Couldn't allocate" + " newHashTable (%ld)\n", + newHashSize * (unsigned long)sizeof (AtomListPtr)); return FALSE; } bzero ((char *) newHashTable, newHashSize * sizeof (AtomListPtr)); @@ -114,7 +116,7 @@ ResizeHashTable () } static int -ResizeReverseMap () +ResizeReverseMap (void) { int ret = TRUE; if (reverseMapSize == 0) @@ -123,15 +125,16 @@ ResizeReverseMap () reverseMapSize *= 2; reverseMap = (AtomListPtr *) xrealloc (reverseMap, reverseMapSize * sizeof (AtomListPtr)); if (!reverseMap) { - fprintf(stderr, "ResizeReverseMap(): Error: Couldn't reallocate reverseMap (%d)\n", reverseMapSize * sizeof(AtomListPtr)); + fprintf(stderr, "ResizeReverseMap(): Error: Couldn't reallocate" + " reverseMap (%ld)\n", + reverseMapSize * (unsigned long)sizeof(AtomListPtr)); ret = FALSE; } return ret; } static int -NameEqual (a, b, l) - char *a, *b; +NameEqual (const char *a, const char *b, int l) { while (l--) if (*a++ != *b++) @@ -140,14 +143,11 @@ NameEqual (a, b, l) } Atom -MakeAtom(string, len, makeit) - char *string; - unsigned len; - int makeit; +MakeAtom(char *string, unsigned len, int makeit) { AtomListPtr a; int hash; - int h; + int h = 0; int r; hash = Hash (string, len); @@ -181,7 +181,8 @@ MakeAtom(string, len, makeit) return None; a = (AtomListPtr) xalloc (sizeof (AtomListRec) + len + 1); if (a == NULL) { - fprintf(stderr, "MakeAtom(): Error: Couldn't allocate AtomListRec (%d)\n", sizeof (AtomListRec) + len + 1); + fprintf(stderr, "MakeAtom(): Error: Couldn't allocate AtomListRec" + " (%ld)\n", (unsigned long)sizeof (AtomListRec) + len + 1); return None; } a->name = (char *) (a + 1); @@ -214,17 +215,16 @@ MakeAtom(string, len, makeit) return a->atom; } -int ValidAtom(atom) - Atom atom; +int +ValidAtom(Atom atom) { return (atom != None) && (atom <= lastAtom); } char * -NameForAtom(atom) - Atom atom; +NameForAtom(Atom atom) { if (atom != None && atom <= lastAtom) return reverseMap[atom]->name; - return 0; + return NULL; } diff --git a/src/util/fontaccel.c b/src/util/fontaccel.c index b0e8b57..f922145 100644 --- a/src/util/fontaccel.c +++ b/src/util/fontaccel.c @@ -27,6 +27,7 @@ other dealings in this Software without prior written authorization from The Open Group. */ +/* $XFree86: xc/lib/font/util/fontaccel.c,v 1.7 2001/12/14 19:56:56 dawes Exp $ */ /* * Author: Keith Packard, MIT X Consortium @@ -34,9 +35,10 @@ from The Open Group. #include "fontmisc.h" #include "fontstruct.h" +#include "fontutil.h" -void FontComputeInfoAccelerators(pFontInfo) - FontInfoPtr pFontInfo; +void +FontComputeInfoAccelerators(FontInfoPtr pFontInfo) { pFontInfo->noOverlap = FALSE; if (pFontInfo->maxOverlap <= pFontInfo->minbounds.leftSideBearing) @@ -80,8 +82,8 @@ void FontComputeInfoAccelerators(pFontInfo) pFontInfo->inkInside = FALSE; } -int FontCouldBeTerminal(pFontInfo) - FontInfoPtr pFontInfo; +int +FontCouldBeTerminal(FontInfoPtr pFontInfo) { if ((pFontInfo->minbounds.leftSideBearing >= 0) && (pFontInfo->maxbounds.rightSideBearing <= pFontInfo->maxbounds.characterWidth) && diff --git a/src/util/fontnames.c b/src/util/fontnames.c index 939d531..cbd355a 100644 --- a/src/util/fontnames.c +++ b/src/util/fontnames.c @@ -27,6 +27,7 @@ other dealings in this Software without prior written authorization from The Open Group. */ +/* $XFree86: xc/lib/font/util/fontnames.c,v 1.5 2001/12/14 19:56:56 dawes Exp $ */ /* * Author: Keith Packard, MIT X Consortium @@ -38,8 +39,7 @@ from The Open Group. #include "fontstruct.h" void -FreeFontNames(pFN) - FontNamesPtr pFN; +FreeFontNames(FontNamesPtr pFN) { int i; @@ -54,8 +54,7 @@ FreeFontNames(pFN) } FontNamesPtr -MakeFontNamesRecord(size) - unsigned size; +MakeFontNamesRecord(unsigned int size) { FontNamesPtr pFN; @@ -84,10 +83,7 @@ MakeFontNamesRecord(size) } int -AddFontNamesName(names, name, length) - FontNamesPtr names; - char *name; - int length; +AddFontNamesName(FontNamesPtr names, char *name, int length) { int index = names->nnames; char *nelt; diff --git a/src/util/fontutil.c b/src/util/fontutil.c index c67be62..3bd5e51 100644 --- a/src/util/fontutil.c +++ b/src/util/fontutil.c @@ -27,6 +27,7 @@ other dealings in this Software without prior written authorization from The Open Group. */ +/* $XFree86: xc/lib/font/util/fontutil.c,v 3.7 2001/12/14 19:56:56 dawes Exp $ */ /* * Author: Keith Packard, MIT X Consortium @@ -35,6 +36,7 @@ from The Open Group. #include "fontmisc.h" #include "fontstruct.h" #include "FSproto.h" +#include "fontutil.h" /* Define global here... doesn't hurt the servers, and avoids unresolved references in font clients. */ @@ -43,13 +45,12 @@ static int defaultGlyphCachingMode = DEFAULT_GLYPH_CACHING_MODE; int glyphCachingMode = DEFAULT_GLYPH_CACHING_MODE; void -GetGlyphs(font, count, chars, fontEncoding, glyphcount, glyphs) - FontPtr font; - unsigned long count; - unsigned char *chars; - FontEncoding fontEncoding; - unsigned long *glyphcount; /* RETURN */ - CharInfoPtr *glyphs; /* RETURN */ +GetGlyphs(FontPtr font, + unsigned long count, + unsigned char *chars, + FontEncoding fontEncoding, + unsigned long *glyphcount, /* RETURN */ + CharInfoPtr *glyphs) /* RETURN */ { (*font->get_glyphs) (font, count, chars, fontEncoding, glyphcount, glyphs); } @@ -58,11 +59,10 @@ GetGlyphs(font, count, chars, fontEncoding, glyphcount, glyphs) #define MAX(a,b) ((a)>(b)?(a):(b)) void -QueryGlyphExtents(pFont, charinfo, count, info) - FontPtr pFont; - CharInfoPtr *charinfo; - unsigned long count; - ExtentInfoRec *info; +QueryGlyphExtents(FontPtr pFont, + CharInfoPtr *charinfo, + unsigned long count, + ExtentInfoRec *info) { register unsigned long i; xCharInfo *pCI; @@ -131,11 +131,10 @@ QueryGlyphExtents(pFont, charinfo, count, info) } Bool -QueryTextExtents(pFont, count, chars, info) - FontPtr pFont; - unsigned long count; - unsigned char *chars; - ExtentInfoRec *info; +QueryTextExtents(FontPtr pFont, + unsigned long count, + unsigned char *chars, + ExtentInfoRec *info) { xCharInfo **charinfo; unsigned long n; @@ -158,11 +157,11 @@ QueryTextExtents(pFont, count, chars, info) /* Do default character substitution as get_metrics doesn't */ #define IsNonExistentChar(ci) (!(ci) || \ - (ci)->ascent == 0 && \ + ((ci)->ascent == 0 && \ (ci)->descent == 0 && \ (ci)->leftSideBearing == 0 && \ (ci)->rightSideBearing == 0 && \ - (ci)->characterWidth == 0) + (ci)->characterWidth == 0)) firstReal = n; defc[0] = pFont->info.defaultCh >> 8; @@ -191,8 +190,7 @@ QueryTextExtents(pFont, count, chars, info) } Bool -ParseGlyphCachingMode(str) - char *str; +ParseGlyphCachingMode(char *str) { if (!strcmp(str, "none")) defaultGlyphCachingMode = CACHING_OFF; else if (!strcmp(str, "all")) defaultGlyphCachingMode = CACHE_ALL_GLYPHS; @@ -202,7 +200,7 @@ ParseGlyphCachingMode(str) } void -InitGlyphCaching() +InitGlyphCaching(void) { /* Set glyphCachingMode to the mode the server hopes to support. DDX drivers that do not support the requested level @@ -217,8 +215,7 @@ InitGlyphCaching() * caching they can support. */ void -SetGlyphCachingMode(newmode) - int newmode; +SetGlyphCachingMode(int newmode) { if ( (glyphCachingMode > newmode) && (newmode >= 0) ) glyphCachingMode = newmode; @@ -230,16 +227,15 @@ SetGlyphCachingMode(newmode) /* add_range(): Add range to a list of ranges, with coalescence */ int -add_range(newrange, nranges, range, charset_subset) -fsRange *newrange; -int *nranges; -fsRange **range; -Bool charset_subset; +add_range(fsRange *newrange, + int *nranges, + fsRange **range, + Bool charset_subset) { int first, last, middle; unsigned long keymin, keymax; - unsigned long ptrmin, ptrmax; - fsRange *ptr, *ptr1, *ptr2, *endptr; + unsigned long ptrmin = 0, ptrmax = 0; + fsRange *ptr = NULL, *ptr1, *ptr2, *endptr; /* There are two different ways to treat ranges: @@ -257,7 +253,7 @@ Bool charset_subset; /* If newrange covers multiple rows; break up the rows */ if (!charset_subset && newrange->min_char_high != newrange->max_char_high) { - int i, err; + int i, err = 0; fsRange temprange; for (i = newrange->min_char_high; i <= newrange->max_char_high; @@ -414,3 +410,31 @@ Bool charset_subset; return Successful; } + +/* It is difficult to find a good place for this. */ +#ifdef NEED_STRCASECMP +int +f_strcasecmp(const char *s1, const char *s2) +{ + char c1, c2; + + if (*s1 == 0) + if (*s2 == 0) + return 0; + else + return 1; + + c1 = (isupper (*s1) ? tolower (*s1) : *s1); + c2 = (isupper (*s2) ? tolower (*s2) : *s2); + while (c1 == c2) { + if (c1 == '\0') + return 0; + s1++; + s2++; + c1 = (isupper (*s1) ? tolower (*s1) : *s1); + c2 = (isupper (*s2) ? tolower (*s2) : *s2); + } + return c1 - c2; +} +#endif + diff --git a/src/util/fontxlfd.c b/src/util/fontxlfd.c index f1245f6..3a2c93d 100644 --- a/src/util/fontxlfd.c +++ b/src/util/fontxlfd.c @@ -27,6 +27,7 @@ other dealings in this Software without prior written authorization from The Open Group. */ +/* $XFree86: xc/lib/font/util/fontxlfd.c,v 3.15 2002/05/31 18:45:50 dawes Exp $ */ /* * Author: Keith Packard, MIT X Consortium @@ -35,12 +36,11 @@ from The Open Group. #include "fontmisc.h" #include "fontstruct.h" #include "fontxlfd.h" +#include "fontutil.h" #include <X11/Xos.h> #include <math.h> -#ifndef X_NOT_STDC_ENV #include <stdlib.h> -#endif -#if defined(X_NOT_STDC_ENV) || (defined(sony) && !defined(SYSTYPE_SYSV) && !defined(_SYSTYPE_SYSV)) +#if defined(sony) && !defined(SYSTYPE_SYSV) && !defined(_SYSTYPE_SYSV) #define NO_LOCALE #endif #ifndef NO_LOCALE @@ -50,9 +50,7 @@ from The Open Group. #include <stdio.h> /* for sprintf() */ static char * -GetInt(ptr, val) - char *ptr; - int *val; +GetInt(char *ptr, int *val) { if (*ptr == '*') { *val = -1; @@ -75,9 +73,7 @@ static struct lconv *locale = 0; static char *radix = ".", *plus = "+", *minus = "-"; static char * -readreal(ptr, result) -char *ptr; -double *result; +readreal(char *ptr, double *result) { char buffer[80], *p1, *p2; @@ -112,26 +108,13 @@ double *result; *p2 = 0; /* Now we have something that strtod() can interpret... do it. */ -#ifndef X_NOT_STDC_ENV *result = strtod(buffer, &p1); /* Return NULL if failure, pointer past number if success */ return (p1 == buffer) ? (char *)0 : (ptr + (p1 - buffer)); -#else - for (p1 = buffer; isspace(*p1); p1++) - ; - if (sscanf(p1, "%lf", result) != 1) - return (char *)0; - while (!isspace(*p1)) - p1++; - return ptr + (p1 - buffer); -#endif } static char * -xlfd_double_to_text(value, buffer, space_required) -double value; -char *buffer; -int space_required; +xlfd_double_to_text(double value, char *buffer, int space_required) { char formatbuf[40]; register char *p1; @@ -204,24 +187,95 @@ int space_required; } double -xlfd_round_double(x) -double x; +xlfd_round_double(double x) { - /* Utility for XLFD users to round numbers to XLFD_NDIGITS - significant digits. How do you round to n significant digits on - a binary machine? Let printf() do it for you. */ - char formatbuf[40], buffer[40]; - - sprintf(formatbuf, "%%.%dlg", XLFD_NDIGITS); - sprintf(buffer, formatbuf, x); - return atof(buffer); + /* Utility for XLFD users to round numbers to XLFD_NDIGITS + significant digits. How do you round to n significant digits on + a binary machine? */ + +#if defined(i386) || defined(__i386__) || \ + defined(ia64) || defined(__ia64__) || \ + defined(__alpha__) || defined(__alpha) || \ + defined(__hppa__) || \ + defined(__x86_64__) || defined(__x86_64) +#if !defined(__UNIXOS2__) +#include <float.h> + +/* if we have IEEE 754 fp, we can round to binary digits... */ + +#if (FLT_RADIX == 2) && (DBL_DIG == 15) && (DBL_MANT_DIG == 53) + +#ifndef M_LN2 +#define M_LN2 0.69314718055994530942 +#endif +#ifndef M_LN10 +#define M_LN10 2.30258509299404568402 +#endif + +/* convert # of decimal digits to # of binary digits */ +#define XLFD_NDIGITS_2 ((int)(XLFD_NDIGITS * M_LN10 / M_LN2 + 0.5)) + + union conv_d { + double d; + unsigned char b[8]; + } d; + int i,j,k,d_exp; + + if (x == 0) + return x; + + /* do minor sanity check for IEEE 754 fp and correct byte order */ + d.d = 1.0; + if (sizeof(double) == 8 && d.b[7] == 0x3f && d.b[6] == 0xf0) { + + /* + * this code will round IEEE 754 double to XLFD_NDIGITS_2 binary digits + */ + + d.d = x; + d_exp = (d.b[7] << 4) | (d.b[6] >> 4); + + i = (DBL_MANT_DIG-XLFD_NDIGITS_2) >> 3; + j = 1 << ((DBL_MANT_DIG-XLFD_NDIGITS_2) & 0x07); + for (; i<7; i++) { + k = d.b[i] + j; + d.b[i] = k; + if (k & 0x100) j = 1; + else break; + } + if ((i==7) && ((d.b[6] & 0xf0) != ((d_exp<<4) & 0xf0))) { + /* mantissa overflow: increment exponent */ + d_exp = (d_exp & 0x800 ) | ((d_exp & 0x7ff) + 1); + d.b[7] = d_exp >> 4; + d.b[6] = (d.b[6] & 0x0f) | (d_exp << 4); + } + + i = (DBL_MANT_DIG-XLFD_NDIGITS_2) >> 3; + j = 1 << ((DBL_MANT_DIG-XLFD_NDIGITS_2) & 0x07); + d.b[i] &= ~(j-1); + for (;--i>=0;) d.b[i] = 0; + + return d.d; + } + else +#endif +#endif /* !__UNIXOS2__ */ +#endif /* i386 || __i386__ */ + { + /* + * If not IEEE 754: Let printf() do it for you. + */ + + char formatbuf[40], buffer[40]; + + sprintf(formatbuf, "%%.%dlg", XLFD_NDIGITS); + sprintf(buffer, formatbuf, x); + return atof(buffer); + } } static char * -GetMatrix(ptr, vals, which) -char *ptr; -FontScalablePtr vals; -int which; +GetMatrix(char *ptr, FontScalablePtr vals, int which) { double *matrix; @@ -298,10 +352,8 @@ int which; } -static void append_ranges(fname, nranges, ranges) -char *fname; -int nranges; -fsRange *ranges; +static void +append_ranges(char *fname, int nranges, fsRange *ranges) { if (nranges) { @@ -325,10 +377,7 @@ fsRange *ranges; } Bool -FontParseXLFDName(fname, vals, subst) - char *fname; - FontScalablePtr vals; - int subst; +FontParseXLFDName(char *fname, FontScalablePtr vals, int subst) { register char *ptr; register char *ptr1, @@ -532,15 +581,12 @@ FontParseXLFDName(fname, vals, subst) return TRUE; } -fsRange *FontParseRanges(name, nranges) -char *name; -int *nranges; +fsRange *FontParseRanges(char *name, int *nranges) { int n; unsigned long l; char *p1, *p2; fsRange *result = (fsRange *)0; - extern int add_range(); name = strchr(name, '-'); for (n = 1; name && n < 14; n++) diff --git a/src/util/format.c b/src/util/format.c index 615f0ee..c406009 100644 --- a/src/util/format.c +++ b/src/util/format.c @@ -50,19 +50,21 @@ other dealings in this Software without prior written authorization from The Open Group. */ +/* $XFree86: xc/lib/font/util/format.c,v 1.5 2001/12/14 19:56:57 dawes Exp $ */ #include "FSproto.h" #include "font.h" +#include "fontstruct.h" +#include "fontutil.h" int -CheckFSFormat(format, fmask, bit_order, byte_order, scan, glyph, image) - fsBitmapFormat format; - fsBitmapFormatMask fmask; - int *bit_order, - *byte_order, - *scan, - *glyph, - *image; +CheckFSFormat(fsBitmapFormat format, + fsBitmapFormatMask fmask, + int *bit_order, + int *byte_order, + int *scan, + int *glyph, + int *image) { /* convert format to what the low levels want */ if (fmask & BitmapFormatMaskBit) { diff --git a/src/util/miscutil.c b/src/util/miscutil.c index 5db04a1..484e387 100644 --- a/src/util/miscutil.c +++ b/src/util/miscutil.c @@ -27,13 +27,11 @@ other dealings in this Software without prior written authorization from The Open Group. */ +/* $XFree86: xc/lib/font/util/miscutil.c,v 1.8 2001/12/14 19:56:57 dawes Exp $ */ #include <X11/Xosdefs.h> -#ifndef X_NOT_STDC_ENV #include <stdlib.h> -#else -char *malloc(), *realloc(); -#endif +#include "fontmisc.h" #define XK_LATIN1 #include <X11/keysymdef.h> @@ -43,32 +41,36 @@ char *malloc(), *realloc(); long serverGeneration = 1; -unsigned long * -Xalloc (m) +void * +Xalloc (unsigned long m) { - return (unsigned long *) malloc (m); + return malloc (m); } -unsigned long * -Xrealloc (n,m) - unsigned long *n; +void * +Xrealloc (void *n, unsigned long m) { if (!n) - return (unsigned long *) malloc (m); + return malloc (m); else - return (unsigned long *) realloc ((char *) n, m); + return realloc (n, m); } -void Xfree (n) - unsigned long *n; +void +Xfree (void *n) { if (n) - free ((char *) n); + free (n); } -void CopyISOLatin1Lowered (dst, src, len) - char *dst, *src; - int len; +void * +Xcalloc (unsigned long n) +{ + return calloc (n, 1); +} + +void +CopyISOLatin1Lowered (char *dst, char *src, int len) { register unsigned char *dest, *source; @@ -88,6 +90,7 @@ void CopyISOLatin1Lowered (dst, src, len) *dest = '\0'; } -void register_fpe_functions () +void +register_fpe_functions () { } diff --git a/src/util/patcache.c b/src/util/patcache.c index 824255c..7b31016 100644 --- a/src/util/patcache.c +++ b/src/util/patcache.c @@ -25,6 +25,7 @@ used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from The Open Group. */ +/* $XFree86: xc/lib/font/util/patcache.c,v 3.5 2001/12/14 19:56:57 dawes Exp $ */ /* * Author: Keith Packard, MIT X Consortium @@ -62,8 +63,7 @@ typedef struct _FontPatternCache { /* Empty cache (for rehash) */ void -EmptyFontPatternCache (cache) - FontPatternCachePtr cache; +EmptyFontPatternCache (FontPatternCachePtr cache) { int i; @@ -84,7 +84,7 @@ EmptyFontPatternCache (cache) /* Create and initialize cache */ FontPatternCachePtr -MakeFontPatternCache () +MakeFontPatternCache (void) { FontPatternCachePtr cache; int i; @@ -102,8 +102,7 @@ MakeFontPatternCache () /* toss cache */ void -FreeFontPatternCache (cache) - FontPatternCachePtr cache; +FreeFontPatternCache (FontPatternCachePtr cache) { int i; @@ -114,9 +113,7 @@ FreeFontPatternCache (cache) /* compute id for string */ static int -Hash (string, len) - char *string; - int len; +Hash (const char *string, int len) { int hash; @@ -130,11 +127,10 @@ Hash (string, len) /* add entry */ void -CacheFontPattern (cache, pattern, patlen, pFont) - FontPatternCachePtr cache; - char *pattern; - int patlen; - FontPtr pFont; +CacheFontPattern (FontPatternCachePtr cache, + char *pattern, + int patlen, + FontPtr pFont) { FontPatternCacheEntryPtr e; char *newpat; @@ -177,10 +173,9 @@ CacheFontPattern (cache, pattern, patlen, pFont) /* find matching entry */ FontPtr -FindCachedFontPattern (cache, pattern, patlen) - FontPatternCachePtr cache; - char *pattern; - int patlen; +FindCachedFontPattern (FontPatternCachePtr cache, + char *pattern, + int patlen) { int hash; int i; @@ -200,9 +195,8 @@ FindCachedFontPattern (cache, pattern, patlen) } void -RemoveCachedFontPattern (cache, pFont) - FontPatternCachePtr cache; - FontPtr pFont; +RemoveCachedFontPattern (FontPatternCachePtr cache, + FontPtr pFont) { FontPatternCacheEntryPtr e; int i; diff --git a/src/util/private.c b/src/util/private.c index 9cb58c6..ef7d48b 100644 --- a/src/util/private.c +++ b/src/util/private.c @@ -25,6 +25,7 @@ used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from The Open Group. */ +/* $XFree86: xc/lib/font/util/private.c,v 1.8 2001/12/14 19:56:57 dawes Exp $ */ /* * Author: Keith Packard, MIT X Consortium @@ -33,33 +34,64 @@ in this Software without prior written authorization from The Open Group. #include "fontmisc.h" #include "fontstruct.h" -int _FontPrivateAllocateIndex; +static int _FontPrivateAllocateIndex = 0; int -AllocateFontPrivateIndex () +AllocateFontPrivateIndex (void) { return _FontPrivateAllocateIndex++; } +FontPtr +CreateFontRec (void) +{ + FontPtr pFont; + int size; + + size = sizeof(FontRec) + (sizeof(pointer) * _FontPrivateAllocateIndex); + + pFont = (FontPtr)xalloc(size); + bzero((char*)pFont, size); + + if(pFont) { + pFont->maxPrivate = _FontPrivateAllocateIndex - 1; + if(_FontPrivateAllocateIndex) + pFont->devPrivates = (pointer)(&pFont[1]); + } + + return pFont; +} + +void DestroyFontRec (FontPtr pFont) +{ + if (pFont->devPrivates && pFont->devPrivates != (pointer)(&pFont[1])) + xfree(pFont->devPrivates); + xfree(pFont); +} + void -ResetFontPrivateIndex () +ResetFontPrivateIndex (void) { _FontPrivateAllocateIndex = 0; } Bool -_FontSetNewPrivate (pFont, n, ptr) - FontPtr pFont; - int n; - pointer ptr; +_FontSetNewPrivate (FontPtr pFont, int n, pointer ptr) { pointer *new; - if (n > pFont->maxPrivate) - { - new = (pointer *) xrealloc (pFont->devPrivates, (n + 1) * sizeof (pointer)); - if (!new) - return FALSE; + if (n > pFont->maxPrivate) { + if (pFont->devPrivates && pFont->devPrivates != (pointer)(&pFont[1])) { + new = (pointer *) xrealloc (pFont->devPrivates, (n + 1) * sizeof (pointer)); + if (!new) + return FALSE; + } else { + new = (pointer *) xalloc ((n + 1) * sizeof (pointer)); + if (!new) + return FALSE; + if (pFont->devPrivates) + memcpy (new, pFont->devPrivates, (pFont->maxPrivate + 1) * sizeof (pointer)); + } pFont->devPrivates = new; /* zero out new, uninitialized privates */ while(++pFont->maxPrivate < n) @@ -68,3 +100,4 @@ _FontSetNewPrivate (pFont, n, ptr) pFont->devPrivates[n] = ptr; return TRUE; } + diff --git a/src/util/utilbitmap.c b/src/util/utilbitmap.c index 9842db1..c407f29 100644 --- a/src/util/utilbitmap.c +++ b/src/util/utilbitmap.c @@ -25,11 +25,14 @@ used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from The Open Group. */ +/* $XFree86: xc/lib/font/util/utilbitmap.c,v 1.5 2001/12/14 19:56:57 dawes Exp $ */ /* * Author: Keith Packard, MIT X Consortium */ +#include "fontmisc.h" + /* Utility functions for reformating font bitmaps */ static unsigned char _reverse_byte[0x100] = { @@ -71,11 +74,9 @@ static unsigned char _reverse_byte[0x100] = { * Invert bit order within each BYTE of an array. */ void -BitOrderInvert(buf, nbytes) - register unsigned char *buf; - register int nbytes; +BitOrderInvert(unsigned char *buf, int nbytes) { - register unsigned char *rev = _reverse_byte; + unsigned char *rev = _reverse_byte; for (; --nbytes >= 0; buf++) *buf = rev[*buf]; @@ -85,11 +86,9 @@ BitOrderInvert(buf, nbytes) * Invert byte order within each 16-bits of an array. */ void -TwoByteSwap(buf, nbytes) - register unsigned char *buf; - register int nbytes; +TwoByteSwap(unsigned char *buf, int nbytes) { - register unsigned char c; + unsigned char c; for (; nbytes > 0; nbytes -= 2, buf += 2) { @@ -103,11 +102,9 @@ TwoByteSwap(buf, nbytes) * Invert byte order within each 32-bits of an array. */ void -FourByteSwap(buf, nbytes) - register unsigned char *buf; - register int nbytes; +FourByteSwap(unsigned char *buf, int nbytes) { - register unsigned char c; + unsigned char c; for (; nbytes > 0; nbytes -= 4, buf += 4) { @@ -125,10 +122,9 @@ FourByteSwap(buf, nbytes) */ int -RepadBitmap (pSrc, pDst, srcPad, dstPad, width, height) - char *pSrc, *pDst; - unsigned srcPad, dstPad; - int width, height; +RepadBitmap (char *pSrc, char *pDst, + unsigned int srcPad, unsigned int dstPad, + int width, int height) { int srcWidthBytes,dstWidthBytes; int row,col; |