/*! \brief Print a dotted BOX to Postscript document. * \par Function Description * This function prints the outline of a box when a dotted line type is * required. The box is defined by the coordinates of its upper left corner * in (<B>x</B>,<B>y</B>) and its width and height given by the <B>width</B> and * <B>height</B> parameters. * The postscript file is defined by the file pointer <B>fp</B>. * The parameters <B>length</B> is ignored. * * It uses the function #o_line_print_dotted() to print the outline. * It performs four calls to this function, one for each of its side. * * All dimensions are in mils. * * \param [in] toplevel The TOPLEVEL object. * \param [in] fp FILE pointer to Postscript document. * \param [in] x Upper x coordinate of BOX. * \param [in] y Upper y coordinate of BOX. * \param [in] width Width of BOX. * \param [in] height Height of BOX. * \param [in] color BOX color. * \param [in] line_width BOX Line width. * \param [in] length Dashed line length. * \param [in] space Amount of space between dashes. * \param [in] origin_x Page x coordinate to place BOX OBJECT. * \param [in] origin_y Page y coordinate to place BOX OBJECT. */ void o_box_print_dotted(TOPLEVEL *toplevel, FILE *fp, int x, int y, int width, int height, int color, int line_width, int length, int space, int origin_x, int origin_y) { int x1, y1; f_print_set_color(toplevel, fp, color); x1 = x; y1 = y - height; /* move the origin to 0, 0*/ o_line_print_dotted(toplevel, fp, x1, y1, x1 + width, y1, color, line_width, length, space, origin_x, origin_y); o_line_print_dotted(toplevel, fp, x1 + width, y1, x1 + width, y1 + height, color, line_width, length, space, origin_x, origin_y); o_line_print_dotted(toplevel, fp, x1 + width, y1 + height, x1, y1 + height, color, line_width, length, space, origin_x, origin_y); o_line_print_dotted(toplevel, fp, x1, y1 + height, x1, y1, color, line_width, length, space, origin_x, origin_y); }
/*! \brief postscript print command for a net object * \par Function Description * This function writes the postscript command of the net object \a o_current * into the FILE \a fp points to. * * \param [in] toplevel The TOPLEVEL object * \param [in] fp pointer to a FILE structure * \param [in] o_current The OBJECT to print * \param [in] origin_x x-coord of the postscript origin * \param [in] origin_y y-coord of the postscript origin */ void o_net_print(TOPLEVEL *toplevel, FILE *fp, OBJECT *o_current, int origin_x, int origin_y) { int net_width; int x1, y1; int x2, y2; if (o_current == NULL) { printf("got null in o_net_print\n"); return; } f_print_set_color(toplevel, fp, o_current->color); net_width = 2; if (toplevel->net_style == THICK) { net_width = NET_WIDTH; } x1 = o_current->line->x[0] - origin_x, y1 = o_current->line->y[0] - origin_y; x2 = o_current->line->x[1] - origin_x, y2 = o_current->line->y[1] - origin_y; fprintf(fp, "%d %d %d %d %d %d line\n", x1,y1,x2,y2,net_width,toplevel->print_output_capstyle); }
/*! \brief postscript print command for a bus object * \par Function Description * This function writes the postscript command of the bus object \a o_current * into the FILE \a fp points to. * * \param [in] toplevel The TOPLEVEL object * \param [in] fp pointer to a FILE structure * \param [in] o_current The OBJECT to print * \param [in] origin_x x-coord of the postscript origin * \param [in] origin_y y-coord of the postscript origin */ void o_bus_print(TOPLEVEL *toplevel, FILE *fp, OBJECT *o_current, int origin_x, int origin_y) { int bus_width; int x1, y1; int x2, y2; if (o_current == NULL) { printf("got null in o_bus_print\n"); return; } f_print_set_color(toplevel, fp, o_current->color); bus_width = 2; if (toplevel->bus_style == THICK) { bus_width = BUS_WIDTH; } x1 = o_current->line->x[0]-origin_x, y1 = o_current->line->y[0]-origin_y; x2 = o_current->line->x[1]-origin_x, y2 = o_current->line->y[1]-origin_y; fprintf(fp, "%d %d %d %d %d %d line\n", x1,y1,x2,y2,bus_width,SQUARE_CAP); }
/*! \brief * \par Function Description * This function prints an arc when a dotted line type is required. * The arc is defined by its center in <B>x</B> and <B>y</B>, its * radius in <B>radius</B> and the start and end angles of the arc on the circle. * The postscript file is defined by the file pointer <B>fp</B>. * The parameter <B>length</B> is ignored whereas <B>arc_width</B> specifies * the diameter of the dots of the printed line and <B>space</B> the distance * between two dots. * * A negative value for <B>space</B> leads to an endless loop. * * All dimensions are in mils, except <B>angle1</B> and <B>angle2</B> in degrees. * * The function sets the color the line will be printed with. * * \param [in] toplevel The TOPLEVEL object. * \param [in] fp FILE pointer to postscript document. * \param [in] x * \param [in] y * \param [in] radius * \param [in] angle1 * \param [in] angle2 * \param [in] color * \param [in] arc_width * \param [in] capstyle * \param [in] length * \param [in] space * \param [in] origin_x * \param [in] origin_y */ void o_arc_print_dotted(TOPLEVEL *toplevel, FILE *fp, int x, int y, int radius, int angle1, int angle2, int color, int arc_width, int capstyle, int length, int space, int origin_x, int origin_y) { int da, d; f_print_set_color(toplevel, fp, color); /*! \note * Depending on the radius of the arc, the <B>space</B> parameter is * changed into a small angle <B>da</B>. * Starting from <B>angle1</B> - the start angle - the dots are printed * along the arc by increments of this new angle. * * As <B>da</B> is rounded as an integer, it can take a null value which * will make the function enter an endless loop. In such a case, the arc * is printed solid. The <B>da</B> variable should never be negative * except if <B>space</B> is negative. */ /* Inverting angle2 if < 0 and changing angle1 accordingly */ /* the loop test assume that da > 0 */ if (angle2 < 0) { angle1 = angle1 + angle2; angle2 = -angle2; } da = (int) ((space * 180) / (M_PI * ((double) radius))); /* If da or db too small for arc to be displayed as dotted, draw a solid arc */ if (da <= 0) { o_arc_print_solid(toplevel, fp, x, y, radius, angle1, angle2, color, arc_width, capstyle, length, space, origin_x, origin_y); return; } fprintf(fp,"["); d = angle1; while (d < (angle2 + angle1)) { /*xa = ((double) x) + ((double) radius) * cos(d * M_PI / 180); ya = ((double) y) + ((double) radius) * sin(d * M_PI / 180); */ fprintf(fp,"[%d] ",d); d = d + da; } fprintf(fp,"] %d %d %d %d %d dashedarc %% dotted\n", x,y, radius, arc_width, capstyle); }
/*! \brief Print a solid pattern circle to Postscript document. * \par Function Description * The function prints a filled circle with a solid pattern. * No outline is printed. * The circle is defined by the coordinates of its center in * (<B>x</B>,<B>y</B>) and its radius given by the <B>radius</B> parameter. * The postscript file is defined by the file pointer <B>fp</B>. * <B>fill_width</B>, <B>angle1</B> and <B>pitch1</B>, <B>angle2</B> * and <B>pitch2</B> parameters are ignored in this functions but * kept for compatibility with other fill functions. * * All dimensions are in mils (except <B>angle1</B> and <B>angle2</B> in degree). * * \param [in] toplevel The TOPLEVEL object. * \param [in] fp FILE pointer to Postscript document. * \param [in] x Center x coordinate of circle. * \param [in] y Center y coordinate of circle. * \param [in] radius Radius of circle. * \param [in] color Circle color. * \param [in] fill_width Circle fill width. (unused). * \param [in] angle1 (unused). * \param [in] pitch1 (unused). * \param [in] angle2 (unused). * \param [in] pitch2 (unused). * \param [in] origin_x Page x coordinate to place circle OBJECT. * \param [in] origin_y Page y coordinate to place circle OBJECT. */ void o_circle_print_filled(TOPLEVEL *toplevel, FILE *fp, int x, int y, int radius, int color, int fill_width, int angle1, int pitch1, int angle2, int pitch2, int origin_x, int origin_y) { f_print_set_color(toplevel, fp, color); fprintf(fp, "%d %d %d dot\n", x-origin_x, y-origin_y, radius); }
/*! \brief Print a solid pattern BOX to Postscript document. * \par Function Description * The function prints a filled box with a solid pattern. No outline is * printed. * The box is defined by the coordinates of its upper left corner in * (<B>x</B>,<B>y</B>) and its width and height given by the <B>width</B> and * <B>height</B> parameters. The postscript file is defined by the file * pointer <B>fp</B>. * <B>fill_width</B>, <B>angle1</B> and <B>pitch1</B>, <B>angle2</B> and <B>pitch2</B> * parameters are ignored in this functions but kept for compatibility * with other fill functions. * * It uses the fbox postscript function defined in the prolog to * specify a filled box. * * All dimensions are in mils. * * \param [in] toplevel The TOPLEVEL object. * \param [in] fp FILE pointer to Postscript document. * \param [in] x Upper x coordinate of BOX. * \param [in] y Upper y coordinate of BOX. * \param [in] width Width of BOX. * \param [in] height Height of BOX. * \param [in] color BOX color. * \param [in] fill_width BOX fill width. (unused). * \param [in] angle1 (unused). * \param [in] pitch1 (unused). * \param [in] angle2 (unused). * \param [in] pitch2 (unused). * \param [in] origin_x Page x coordinate to place BOX OBJECT. * \param [in] origin_y Page y coordinate to place BOX OBJECT. */ void o_box_print_filled(TOPLEVEL *toplevel, FILE *fp, int x, int y, int width, int height, int color, int fill_width, int angle1, int pitch1, int angle2, int pitch2, int origin_x, int origin_y) { int x1, y1; f_print_set_color(toplevel, fp, color); x1 = x; y1 = y-height; /* move the origin to 0, 0*/ fprintf(fp, "%d %d %d %d fbox\n", width, height, x1-origin_x, y1-origin_y); }
/*! \brief * \par Function Description * This function prints an arc when a solid line type is required. * The arc is defined by its center in <B>x</B> and <B>y</B>, its radius * in <B>radius</B> and the start and end angles of the arc on the circle. * The postscript file is defined by the file pointer <B>fp</B>. * * The parameters <B>length</B> and <B>space</B> are ignored * whereas <B>arc_width</B> specifies the width of the printed line. * * All dimensions are in mils, except <B>angle1</B> and <B>angle2</B> in degrees. * * \param [in] toplevel The TOPLEVEL object. * \param [in] fp FILE pointer to postscript document. * \param [in] x * \param [in] y * \param [in] radius * \param [in] angle1 * \param [in] angle2 * \param [in] color * \param [in] arc_width * \param [in] capstyle * \param [in] length * \param [in] space * \param [in] origin_x * \param [in] origin_y */ void o_arc_print_solid(TOPLEVEL *toplevel, FILE *fp, int x, int y, int radius, int angle1, int angle2, int color, int arc_width, int capstyle, int length, int space, int origin_x, int origin_y) { f_print_set_color(toplevel, fp, color); /* inverting angle2 if < 0 and changing angle1 accordingly */ if (angle2 < 0) { angle1 = angle1 + angle2; angle2 = -angle2; } fprintf(fp, "%d %d %d %d %d %d %d darc\n", x,y, radius, angle1, angle1 + angle2, arc_width, capstyle); }
/*! \brief Print a hatch pattern BOX to Postscript document. * \par Function Description * The function prints a hatched box. No outline is printed. The box is * defined by the coordinates of its upper left corner in (<B>x</B>,<B>y</B>) and * its width and height given by the <B>width</B> and <B>height</B> parameters. * The postscript file is defined by the file pointer <B>fp</B>. * <B>fill_width</B>, <B>angle1</B>, <B>pitch1</B> parameters define the way the box * has to be hatched. * <B>angle2</B> and <B>pitch2</B> parameters are unused but kept for compatibility * with other fill functions. * * Negative or null values for <B>pitch1</B> are not allowed as it leads to an * endless loop. * * All dimensions are in mils. * * \param [in] toplevel The TOPLEVEL object. * \param [in] fp FILE pointer to Postscript document. * \param [in] x Upper x coordinate of BOX. * \param [in] y Upper y coordinate of BOX. * \param [in] width Width of BOX. * \param [in] height Height of BOX. * \param [in] color BOX color. * \param [in] fill_width BOX fill width. * \param [in] angle1 Angle of hatch pattern. * \param [in] pitch1 Pitch of hatch pattern. * \param [in] angle2 (unused). * \param [in] pitch2 (unused). * \param [in] origin_x Page x coordinate to place BOX OBJECT. * \param [in] origin_y Page y coordinate to place BOX OBJECT. */ void o_box_print_hatch(TOPLEVEL *toplevel, FILE *fp, int x, int y, int width, int height, int color, int fill_width, int angle1, int pitch1, int angle2, int pitch2, int origin_x, int origin_y) { BOX box; gint index; GArray *lines; g_return_if_fail(toplevel != NULL); g_return_if_fail(fp != NULL); f_print_set_color(toplevel, fp, color); /* Avoid printing line widths too small */ if (fill_width <= 1) fill_width = 2; lines = g_array_new(FALSE, FALSE, sizeof(LINE)); box.upper_x = x; box.upper_y = y; box.lower_x = x + width; box.lower_y = y - height; /* Hmmm... */ m_hatch_box(&box, angle1, pitch1, lines); for(index=0; index<lines->len; index++) { LINE *line = &g_array_index(lines, LINE, index); fprintf(fp,"%d %d %d %d %d line\n", line->x[0], line->y[0], line->x[1], line->y[1], fill_width); } g_array_free(lines, TRUE); }
/*! \brief Print a hatch pattern circle to Postscript document. * \par Function Description * The function prints a hatched circle. No outline is printed. * The circle is defined by the coordinates of its center in * (<B>x</B>,<B>y</B>) and its radius by the <B>radius</B> parameter. * The Postscript document is defined by the file pointer <B>fp</B>. * <B>angle2</B> and <B>pitch2</B> parameters are ignored in this * functions but kept for compatibility with other fill functions. * * The only attribute of line here is its width from the parameter <B>width</B>. * * Negative or null values for <B>pitch1</B> is not allowed as it * leads to an endless loop. * * All dimensions are in mils (except <B>angle1</B> is in degrees). * * \param [in] toplevel The TOPLEVEL object. * \param [in] fp FILE pointer to Postscript document. * \param [in] x Center x coordinate of circle. * \param [in] y Center y coordinate of circle. * \param [in] radius Radius of circle. * \param [in] color Circle color. * \param [in] fill_width Circle fill width. * \param [in] angle1 Angle for hatch pattern. * \param [in] pitch1 Pitch for hatch pattern. * \param [in] angle2 (unused). * \param [in] pitch2 (unused). * \param [in] origin_x Page x coordinate to place circle OBJECT. * \param [in] origin_y Page y coordinate to place circle OBJECT. */ void o_circle_print_hatch(TOPLEVEL *toplevel, FILE *fp, int x, int y, int radius, int color, int fill_width, int angle1, int pitch1, int angle2, int pitch2, int origin_x, int origin_y) { CIRCLE circle; gint index; GArray *lines; g_return_if_fail(toplevel != NULL); g_return_if_fail(fp != NULL); f_print_set_color(toplevel, fp, color); /* Avoid printing line widths too small */ if (fill_width <= 1) fill_width = 2; lines = g_array_new(FALSE, FALSE, sizeof(LINE)); circle.center_x = x; circle.center_y = y; circle.radius = radius; m_hatch_circle(&circle, angle1, pitch1, lines); for(index=0; index<lines->len; index++) { LINE *line = &g_array_index(lines, LINE, index); fprintf(fp,"%d %d %d %d %d line\n", line->x[0], line->y[0], line->x[1], line->y[1], fill_width); } g_array_free(lines, TRUE); }
/*! \brief * \par Function Description * This function prints an arc when a centered line type is required. * The arc is defined by its center in <B>x</B> and <B>y</B>, its radius in * <B>radius</B> and the start and end angles of the arc on the circle. * The postscript file is defined by the file pointer <B>fp</B>. * The parameter <B>arc_width</B> specifies the diameter of the dots and the width of the dashes of the printed line. * * A negative value for <B>space</B> or <B>length</B> leads to an endless loop. * * All dimensions are in mils, except <B>angle1</B> and <B>angle2</B> in degrees. * * The function sets the color in which the line will be printed with. * * \param [in] toplevel The TOPLEVEL object. * \param [in] fp FILE pointer to postscript document. * \param [in] x * \param [in] y * \param [in] radius * \param [in] angle1 * \param [in] angle2 * \param [in] color * \param [in] arc_width * \param [in] capstyle * \param [in] length * \param [in] space * \param [in] origin_x * \param [in] origin_y */ void o_arc_print_center(TOPLEVEL *toplevel, FILE *fp, int x, int y, int radius, int angle1, int angle2, int color, int arc_width, int capstyle, int length, int space, int origin_x, int origin_y) { int da, db, a1, d; f_print_set_color(toplevel, fp, color); /*! \note * Depending on the radius of the arc, the <B>space</B> (resp. <B>length</B>) * parameter is changed into a small angle <B>da</B> (resp. <B>db</B>). * Starting from <B>angle1</B> - the start angle - the dashes are printed * along the arc by increments of these new angles. * * As <B>da</B> (resp. <B>db</B>) is rounded as an integer, it can take a null * value which will make the function enter an endless loop. In such a case, * the arc is printed solid. The <B>da</B> (resp. <B>db</B>) variable should never * be negative except if <B>space</B> (resp. <B>length</B>) is negative. * * It prints as many sets of dash-dot as possible. */ /* Inverting angle2 if < 0 and changing angle1 accordingly */ /* the loop test assume that da > 0 */ if (angle2 < 0) { angle1 = angle1 + angle2; angle2 = -angle2; } da = (int) ((length * 180) / (M_PI * ((double) radius))); db = (int) ((space * 180) / (M_PI * ((double) radius))); /* If da or db too small to be displayed, draw an arc */ if ((da <= 0) || (db <= 0)) { o_arc_print_solid(toplevel, fp, x, y, radius, angle1, angle2, color, arc_width, capstyle, length, space, origin_x, origin_y); return; } fprintf(fp, "["); d = angle1; while ((d + da + 2 * db) < (angle1 + angle2)) { a1 = d; d = d + da; fprintf(fp,"[%d %d] ",(int) a1, (int) a1 + da); d = d + db; /* xa = ((double) x) + ((double) radius) * cos(d * (M_PI / 180)); ya = ((double) y) + ((double) radius) * sin(d * (M_PI / 180)); */ fprintf(fp,"[%d] ",d); d = d + db; } /*! \note * When the above condition is no more satisfied, then it is not * possible to print a dash of length <B>length</B>. However two cases are possible : * <DL> * <DT>*</DT><DD>it is possible to print the dash and the dot * <DT>*</DT><DD>it is possible to print the dash or a part of the original dash * </DL> */ if ((d + da) < (angle1 + angle2)) { a1 = d; d = d + da; } else { a1 = d; d = d + da; } fprintf(fp,"[%d %d] ",(int) a1, (int) a1 + da); if ((d + db) < (angle1 + angle2)) { /* xa = ((double) x) + ((double) radius) * cos(d * (M_PI / 180)); ya = ((double) y) + ((double) radius) * sin(d * (M_PI / 180)); */ fprintf(fp,"[%d] ",d); } fprintf(fp,"] %d %d %d %d %d dashedarc %% center\n", x,y, radius, arc_width, capstyle); }
/*! \brief * \par Function Description * This function prints an arc when a dashed line type is required. * The arc is defined by its center in <B>x</B> and <B>y</B>, its radius * in <B>radius</B> and the start and end angles of the arc on the circle. * The postscript file is defined by the file pointer <B>fp</B>. * The parameter <B>arc_width</B> specifies the diameter of the dots of the printed line. * * A negative value for <B>space</B> or <B>length</B> leads to an endless loop. * * All dimensions are in mils, except <B>angle1</B> and <B>angle2</B> in degrees. * * The function sets the color the line will be printed with. * * \param [in] toplevel The TOPLEVEL object. * \param [in] fp FILE pointer to postscript document. * \param [in] x * \param [in] y * \param [in] radius * \param [in] angle1 * \param [in] angle2 * \param [in] color * \param [in] arc_width * \param [in] length * \param [in] space * \param [in] origin_x * \param [in] origin_y */ void o_arc_print_dashed(TOPLEVEL *toplevel, FILE *fp, int x, int y, int radius, int angle1, int angle2, int color, int arc_width, int length, int space, int origin_x, int origin_y) { int da, db, a1, a2, d; f_print_set_color(toplevel, fp, color); /*! \note * Depending on the radius of the arc, the <B>space</B> (resp. <B>length</B>) * parameter is changed into a small angle <B>da</B> (resp. <B>db</B>). * Starting from <B>angle1</B> - the start angle - the dashes are printed * along the arc by increments of these new angles. * * As <B>da</B> (resp. <B>db</B>) is rounded as an integer, it can take a * null value which will make the function enter an endless loop. In such a case, * the arc is printed solid. The <B>da</B> (resp. <B>db</B>) variable should never * be negative except if <B>space</B> (resp. <B>length</B>) is negative. * * It prints as many dashes of length <B>length</B> as possible. */ /* Inverting angle2 if < 0 and changing angle1 accordingly */ /* the loop test assume that da > 0 */ if (angle2 < 0) { angle1 = angle1 + angle2; angle2 = -angle2; } da = (int) ((length * 180) / (M_PI * ((double) radius))); db = (int) ((space * 180) / (M_PI * ((double) radius))); /* If da or db too small for arc to be displayed as dotted, draw a solid arc */ if ((da <= 0) || (db <= 0)) { o_arc_print_solid(toplevel, fp, x, y, radius, angle1, angle2, color, arc_width, length, space, origin_x, origin_y); return; } fprintf(fp,"["); d = angle1; while ((d + da + db) < (angle1 + angle2)) { a1 = d; d = d + da; fprintf(fp,"[%d %d] ", a1, a1+da); d = d + db; } /*! \note * When the above condition is no more satisfied, then it is not * possible to print a dash of length <B>length</B> and the following <B>space</B>. * However it may be possible to print the complete dash or a shorter one. */ if ((d + da) < (angle1 + angle2)) { a1 = d; a2 = da; } else { a1 = d; a2 = (angle1 + angle2) - d; } fprintf(fp,"[%d %d] ", a1, a1+da); fprintf(fp,"] %d %d %d %d dashedarc %% dashed\n", x,y, radius, arc_width); }