static void psrenderer_polygon(DiaPsRenderer *renderer, Point *points, gint num_points, Color *line_color, gboolean filled) { gint i; gchar px_buf[DTOSTR_BUF_SIZE]; gchar py_buf[DTOSTR_BUF_SIZE]; lazy_setcolor(renderer, line_color); fprintf(renderer->file, "n %s %s m ", psrenderer_dtostr(px_buf, points[0].x), psrenderer_dtostr(py_buf, points[0].y) ); for (i=1;i<num_points;i++) { fprintf(renderer->file, "%s %s l ", psrenderer_dtostr(px_buf, points[i].x), psrenderer_dtostr(py_buf, points[i].y) ); } if (filled) fprintf(renderer->file, "ef\n"); else fprintf(renderer->file, "cp s\n"); }
static void draw_string(DiaRenderer *self, const char *text, Point *pos, Alignment alignment, Color *color) { DiaPsRenderer *renderer = DIA_PS_RENDERER(self); Point pos_adj; gchar *buffer; if (1 > strlen(text)) return; lazy_setcolor(renderer,color); buffer = ps_convert_string(text, renderer->ctx); fprintf(renderer->file, "(%s) ", buffer); g_free(buffer); pos_adj.x = pos->x; pos_adj.y = pos->y - dia_font_descent("", self->font, self->font_height); put_text_alignment (renderer, alignment, &pos_adj); fprintf(renderer->file, " gs 1 -1 sc sh gr\n"); }
static void psrenderer_bezier(DiaPsRenderer *renderer, BezPoint *points, gint numpoints, Color *color, gboolean filled) { gint i; gchar p1x_buf[DTOSTR_BUF_SIZE]; gchar p1y_buf[DTOSTR_BUF_SIZE]; gchar p2x_buf[DTOSTR_BUF_SIZE]; gchar p2y_buf[DTOSTR_BUF_SIZE]; gchar p3x_buf[DTOSTR_BUF_SIZE]; gchar p3y_buf[DTOSTR_BUF_SIZE]; lazy_setcolor(renderer,color); if (points[0].type != BEZ_MOVE_TO) g_warning("first BezPoint must be a BEZ_MOVE_TO"); fprintf(renderer->file, "n %s %s m", psrenderer_dtostr(p1x_buf, (gdouble) points[0].p1.x), psrenderer_dtostr(p1y_buf, (gdouble) points[0].p1.y) ); for (i = 1; i < numpoints; i++) switch (points[i].type) { case BEZ_MOVE_TO: g_warning("only first BezPoint can be a BEZ_MOVE_TO"); break; case BEZ_LINE_TO: fprintf(renderer->file, " %s %s l", psrenderer_dtostr(p1x_buf, (gdouble) points[i].p1.x), psrenderer_dtostr(p1y_buf, (gdouble) points[i].p1.y) ); break; case BEZ_CURVE_TO: fprintf(renderer->file, " %s %s %s %s %s %s c", psrenderer_dtostr(p1x_buf, (gdouble) points[i].p1.x), psrenderer_dtostr(p1y_buf, (gdouble) points[i].p1.y), psrenderer_dtostr(p2x_buf, (gdouble) points[i].p2.x), psrenderer_dtostr(p2y_buf, (gdouble) points[i].p2.y), psrenderer_dtostr(p3x_buf, (gdouble) points[i].p3.x), psrenderer_dtostr(p3y_buf, (gdouble) points[i].p3.y) ); break; } if (filled) fprintf(renderer->file, " ef\n"); else fprintf(renderer->file, " s\n"); }
static void draw_line(DiaRenderer *self, Point *start, Point *end, Color *line_color) { DiaPsRenderer *renderer = DIA_PS_RENDERER(self); gchar sx_buf[DTOSTR_BUF_SIZE]; gchar sy_buf[DTOSTR_BUF_SIZE]; gchar ex_buf[DTOSTR_BUF_SIZE]; gchar ey_buf[DTOSTR_BUF_SIZE]; lazy_setcolor(renderer,line_color); fprintf(renderer->file, "n %s %s m %s %s l s\n", psrenderer_dtostr(sx_buf, start->x), psrenderer_dtostr(sy_buf, start->y), psrenderer_dtostr(ex_buf, end->x), psrenderer_dtostr(ey_buf, end->y) ); }
static void psrenderer_ellipse(DiaPsRenderer *renderer, Point *center, real width, real height, Color *color, gboolean filled) { gchar cx_buf[DTOSTR_BUF_SIZE]; gchar cy_buf[DTOSTR_BUF_SIZE]; gchar w_buf[DTOSTR_BUF_SIZE]; gchar h_buf[DTOSTR_BUF_SIZE]; lazy_setcolor(renderer,color); fprintf(renderer->file, "n %s %s %s %s 0 360 ellipse %s\n", psrenderer_dtostr(cx_buf, (gdouble) center->x), psrenderer_dtostr(cy_buf, (gdouble) center->y), psrenderer_dtostr(w_buf, (gdouble) width / 2.0), psrenderer_dtostr(h_buf, (gdouble) height / 2.0), filled ? "f" : "cp s" ); }
static void psrenderer_arc(DiaPsRenderer *renderer, Point *center, real width, real height, real angle1, real angle2, Color *color, gboolean filled) { gchar cx_buf[DTOSTR_BUF_SIZE]; gchar cy_buf[DTOSTR_BUF_SIZE]; gchar a1_buf[DTOSTR_BUF_SIZE]; gchar a2_buf[DTOSTR_BUF_SIZE]; gchar w_buf[DTOSTR_BUF_SIZE]; gchar h_buf[DTOSTR_BUF_SIZE]; lazy_setcolor(renderer, color); if (angle2 < angle1) { /* swap for counter-clockwise */ real tmp = angle1; angle1 = angle2; angle2 = tmp; } psrenderer_dtostr(cx_buf, (gdouble) center->x); psrenderer_dtostr(cy_buf, (gdouble) center->y); psrenderer_dtostr(a1_buf, (gdouble) 360.0 - angle1); psrenderer_dtostr(a2_buf, (gdouble) 360.0 - angle2); psrenderer_dtostr(w_buf, (gdouble) width / 2.0); psrenderer_dtostr(h_buf, (gdouble) height / 2.0); fprintf(renderer->file, "n "); if (filled) fprintf(renderer->file, "%s %s m ", cx_buf, cy_buf); fprintf(renderer->file, "%s %s %s %s %s %s ellipse %s\n", cx_buf, cy_buf, w_buf, h_buf, a2_buf, a1_buf, filled ? "f" : "s" ); }
static void draw_polyline(DiaRenderer *self, Point *points, int num_points, Color *line_color) { DiaPsRenderer *renderer = DIA_PS_RENDERER(self); int i; gchar px_buf[DTOSTR_BUF_SIZE]; gchar py_buf[DTOSTR_BUF_SIZE]; lazy_setcolor(renderer,line_color); fprintf(renderer->file, "n %s %s m ", psrenderer_dtostr(px_buf, points[0].x), psrenderer_dtostr(py_buf, points[0].y) ); for (i=1;i<num_points;i++) { fprintf(renderer->file, "%s %s l ", psrenderer_dtostr(px_buf, points[i].x), psrenderer_dtostr(py_buf, points[i].y) ); } fprintf(renderer->file, "s\n"); }
static void draw_text_line(DiaRenderer *self, TextLine *text_line, Point *pos, Alignment alignment, Color *color) { DiaPsFt2Renderer *renderer = DIA_PS_FT2_RENDERER(self); PangoLayout *layout; int line, linecount; double xpos = pos->x, ypos = pos->y; char *text = text_line_get_string(text_line); /* TODO: we could probably pass the alignment down to the PS file? */ xpos -= text_line_get_alignment_adjustment (text_line, alignment); /* Using the global PangoContext does not allow to have renderer specific * different ones. Or it implies the push/pop _context mess. Anyway just * get rid of warnings for now. But the local code may be resurreted * sooner or later... --hb */ #define USE_GLOBAL_CONTEXT #ifndef USE_GLOBAL_CONTEXT PangoAttrList* list; PangoAttribute* attr; guint length; #endif if ((!text)||(text == (const char *)(1))) return; lazy_setcolor(DIA_PS_RENDERER(renderer),color); #define ANNOYING_SCALE_FACTOR 5.9 /* Make sure the letters aren't too wide. */ #ifdef USE_GLOBAL_CONTEXT layout = dia_font_build_layout(text, text_line_get_font(text_line), text_line_get_height(text_line)*ANNOYING_SCALE_FACTOR); #else /* approximately what would be required but w/o dia_font_get_context() */ dia_font_set_height(text_line_get_font(text_line), text_line_get_height(text_line)); layout = pango_layout_new(dia_font_get_context()); length = text ? strlen(text) : 0; pango_layout_set_text(layout,text,length); list = pango_attr_list_new(); attr = pango_attr_font_desc_new(dia_font_get_description(text_line_get_font(text_line))); attr->start_index = 0; attr->end_index = length; pango_attr_list_insert(list,attr); pango_layout_set_attributes(layout,list); pango_attr_list_unref(list); pango_layout_set_indent(layout,0); pango_layout_set_justify(layout,FALSE); #endif pango_layout_set_alignment(layout, PANGO_ALIGN_LEFT); linecount = pango_layout_get_line_count(layout); for (line = 0; line < linecount; line++) { PangoLayoutLine *layoutline = pango_layout_get_line(layout, line); /* Not sure scale is the right one here. */ text_line_adjust_layout_line(text_line, layoutline, ANNOYING_SCALE_FACTOR); postscript_draw_contour(DIA_PS_RENDERER(renderer), DPI, /* dpi_x */ layoutline, xpos, ypos); ypos += 10;/* Some line height thing??? */ } }