[dia] metapost: optimize draw_polygon/draw_beziergon, dash length tweaking
- From: Hans Breuer <hans src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [dia] metapost: optimize draw_polygon/draw_beziergon, dash length tweaking
- Date: Thu, 1 May 2014 22:17:51 +0000 (UTC)
commit 81bdae5189a952954c37601328ba44a845237a0b
Author: Hans Breuer <hans breuer org>
Date: Fri May 2 00:03:58 2014 +0200
metapost: optimize draw_polygon/draw_beziergon, dash length tweaking
Polygon and Beziergon are now properly closed with draw_*gon() call. Also
the path created is used for fill and stroke.
Dash length was nearly producing completely stroked lines with
render-test.dia now it looks a bit better for most lines.
Hint for testing:
Sorry, I can't find the 'metafun' preload file; will try 'plain'.
I can't find the 'plain' preload file!
-> sudo apt-get install texlive-metapost
It still does not complile unchanged because of unescaped (),
so that text has to be deleted.
plug-ins/metapost/render_metapost.c | 172 ++++++++++++++++++-----------------
1 files changed, 88 insertions(+), 84 deletions(-)
---
diff --git a/plug-ins/metapost/render_metapost.c b/plug-ins/metapost/render_metapost.c
index 98cd085..bb00992 100644
--- a/plug-ins/metapost/render_metapost.c
+++ b/plug-ins/metapost/render_metapost.c
@@ -156,8 +156,12 @@ end_draw_op(MetapostRenderer *renderer)
gchar d1_buf[DTOSTR_BUF_SIZE];
gchar d2_buf[DTOSTR_BUF_SIZE];
gchar d3_buf[DTOSTR_BUF_SIZE];
-
- fprintf(renderer->file, "\n withpen pencircle scaled %sx",
+
+ /* the following pencircle seems not to work well with line caps, but using
+ * renderer->saved_line_cap == LINECAPS_ROUND ? "pencircle" : "pensquare",
+ * doesn't make it anz better
+ */
+ fprintf(renderer->file, "\n withpen pencircle scaled %sx",
g_ascii_formatd(d1_buf, sizeof(d1_buf), "%5.4f", (gdouble) renderer->line_width) );
if (!color_equals(&renderer->color, &color_black))
@@ -184,13 +188,6 @@ set_line_color(MetapostRenderer *renderer,Color *color)
mp_dtostr(blue_buf, (gdouble)color->blue) );
}
-static void
-set_fill_color(MetapostRenderer *renderer,Color *color)
-{
- set_line_color(renderer,color);
-}
-
-
static void
begin_render(DiaRenderer *self, const Rectangle *update)
{
@@ -206,6 +203,30 @@ end_render(DiaRenderer *self)
fclose(renderer->file);
}
+/*!
+ * \brief Advertize special capabilities
+ *
+ * Some objects drawing adapts to capabilities advertized by the respective
+ * renderer. Usually there is a fallback, but generally the real thing should
+ * be better.
+ *
+ * \memberof _MetapostRenderer
+ */
+static gboolean
+is_capable_to (DiaRenderer *renderer, RenderCapability cap)
+{
+ if (RENDER_HOLES == cap)
+ return FALSE; /* maybe with unfill? */
+ else if (RENDER_ALPHA == cap)
+ return FALSE; /* not now */
+ else if (RENDER_AFFINE == cap)
+ return FALSE; /* not now */
+ else if (RENDER_PATTERN == cap)
+ return FALSE; /* might be possible, too */
+ return FALSE;
+}
+
+
static void
set_linewidth(DiaRenderer *self, real linewidth)
{ /* 0 == hairline **/
@@ -314,24 +335,26 @@ draw_with_linestyle(MetapostRenderer *renderer)
dot_lenght_buf, hole_width_buf );
break;
case LINESTYLE_DOTTED:
+ hole_width = renderer->dot_length * 5.0;
mp_dtostr(dot_lenght_buf, renderer->dot_length);
+ mp_dtostr(hole_width_buf, hole_width);
fprintf(renderer->file, "\n dashed dashpattern (on %sx off %sx)",
- dot_lenght_buf, dot_lenght_buf);
+ dot_lenght_buf, hole_width_buf);
break;
}
}
static void
set_dashlength(DiaRenderer *self, real length)
-{ /* dot = 20% of len */
+{ /* dot = 10% of len */
MetapostRenderer *renderer = METAPOST_RENDERER (self);
if (length<0.001)
length = 0.001;
renderer->dash_length = length;
- renderer->dot_length = length*0.05;
+ renderer->dot_length = length * 0.1;
set_linestyle(self, renderer->saved_line_style);
}
@@ -457,44 +480,22 @@ draw_polyline(DiaRenderer *self,
}
static void
-stroke_polygon(DiaRenderer *self,
- Point *points, int num_points,
- Color *line_color)
-{
- MetapostRenderer *renderer = METAPOST_RENDERER (self);
- int i;
- gchar px_buf[DTOSTR_BUF_SIZE];
- gchar py_buf[DTOSTR_BUF_SIZE];
-
- set_line_color(renderer,line_color);
-
- fprintf(renderer->file,
- " draw (%sx,%sy)",
- mp_dtostr(px_buf, points[0].x),
- mp_dtostr(py_buf, points[0].y) );
-
- for (i=1;i<num_points;i++) {
- fprintf(renderer->file, "--(%sx,%sy)",
- mp_dtostr(px_buf, points[i].x),
- mp_dtostr(py_buf, points[i].y) );
- }
- fprintf(renderer->file,"--cycle");
- end_draw_op(renderer);
-}
-
-static void
-fill_polygon(DiaRenderer *self,
+draw_polygon(DiaRenderer *self,
Point *points, int num_points,
- Color *line_color)
+ Color *fill, Color *stroke)
{
MetapostRenderer *renderer = METAPOST_RENDERER (self);
int i;
gchar px_buf[DTOSTR_BUF_SIZE];
gchar py_buf[DTOSTR_BUF_SIZE];
+ gchar red_buf[DTOSTR_BUF_SIZE];
+ gchar green_buf[DTOSTR_BUF_SIZE];
+ gchar blue_buf[DTOSTR_BUF_SIZE];
- set_line_color(renderer,line_color);
+ fprintf(renderer->file, "%% draw_polygon\n");
+ if (stroke)
+ set_line_color(renderer,stroke);
- fprintf(renderer->file, "%% fill_polygon\n");
fprintf(renderer->file,
" path p;\n"
" p = (%sx,%sy)",
@@ -507,19 +508,18 @@ fill_polygon(DiaRenderer *self,
mp_dtostr(py_buf, points[i].y) );
}
fprintf(renderer->file,"--cycle;\n");
- fprintf(renderer->file," fill p ");
- end_draw_op(renderer);
-}
-static void
-draw_polygon(DiaRenderer *self,
- Point *points, int num_points,
- Color *fill, Color *stroke)
-{
- /* XXX: simple port, not optimized */
- if (fill)
- fill_polygon (self, points, num_points, fill);
- if (stroke)
- stroke_polygon (self, points, num_points, stroke);
+
+ if (fill)
+ fprintf(renderer->file,
+ " fill p withcolor (%s,%s,%s);\n",
+ mp_dtostr(red_buf, (gdouble) fill->red),
+ mp_dtostr(green_buf, (gdouble) fill->green),
+ mp_dtostr(blue_buf, (gdouble) fill->blue) );
+
+ if (stroke) {
+ fprintf(renderer->file, " draw p");
+ end_draw_op(renderer);
+ }
}
static void
@@ -727,21 +727,23 @@ draw_beziergon (DiaRenderer *self,
if (points[0].type != BEZ_MOVE_TO)
g_warning("first BezPoint must be a BEZ_MOVE_TO");
- if (!fill) {
- /* XXX: this is not closed */
- draw_bezier (self, points, numpoints, stroke);
- return;
- }
+ if (stroke)
+ set_line_color(renderer,stroke);
fprintf(renderer->file, " path p;\n");
fprintf(renderer->file, " p = (%sx,%sy)",
mp_dtostr(p1x_buf, (gdouble) points[0].p1.x),
mp_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");
+ /* close previous, new move-to - XXX: not working, not used, gives:
+ * Paths don't touch; `&' will be changed to `..'.
+ */
+ fprintf(renderer->file, " ..cycle\n & (%sx,%sy)",
+ mp_dtostr(p1x_buf, (gdouble) points[i].p1.x),
+ mp_dtostr(p1y_buf, (gdouble) points[i].p1.y) );
break;
case BEZ_LINE_TO:
fprintf(renderer->file, "--(%sx,%sy)",
@@ -760,18 +762,17 @@ draw_beziergon (DiaRenderer *self,
}
fprintf(renderer->file, "\n ..cycle;\n");
- fprintf(renderer->file,
- " fill p withcolor (%s,%s,%s);\n",
- mp_dtostr(red_buf, (gdouble) fill->red),
- mp_dtostr(green_buf, (gdouble) fill->green),
- mp_dtostr(blue_buf, (gdouble) fill->blue) );
+ if (fill)
+ fprintf(renderer->file,
+ " fill p withcolor (%s,%s,%s);\n",
+ mp_dtostr(red_buf, (gdouble) fill->red),
+ mp_dtostr(green_buf, (gdouble) fill->green),
+ mp_dtostr(blue_buf, (gdouble) fill->blue) );
- /* XXX: not closing as before draw_beziergon existence
- * It should be possible to reuse the path from above to stroke again or
- * maybe fill and stroke in one step.
- */
- if (stroke)
- draw_bezier (self, points, numpoints, stroke);
+ if (stroke) {
+ fprintf(renderer->file, " draw p");
+ end_draw_op(renderer);
+ }
}
static void
@@ -904,12 +905,21 @@ draw_image(DiaRenderer *self,
gchar d1_buf[DTOSTR_BUF_SIZE];
gchar d2_buf[DTOSTR_BUF_SIZE];
gchar d3_buf[DTOSTR_BUF_SIZE];
-
+ const char *filename = dia_image_filename(image);
MetapostRenderer *renderer = METAPOST_RENDERER (self);
- fprintf(renderer->file, " %% draw_image: %s\n", dia_image_filename(image));
-
-
+ fprintf(renderer->file, " %% draw_image: %s\n", filename);
+#if 0 /* Only working with ConTeXt? */
+ if (g_file_test (filename, G_FILE_TEST_IS_REGULAR)) {
+ /* externalfigure "hacker.png" scaled 5cm shifted (-6cm,0); */
+ fprintf(renderer->file,
+ " externalfigure \"%s\" scaled %scm shifted (%scm,%scm);\n",
+ filename, mp_dtostr(d1_buf, (gdouble) width),
+ mp_dtostr(d2_buf, (gdouble) point->x),
+ mp_dtostr(d3_buf, (gdouble) point->y));
+ return;
+ }
+#endif
img_width = dia_image_width(image);
img_rowstride = dia_image_rowstride(image);
img_height = dia_image_height(image);
@@ -1022,7 +1032,7 @@ metapost_renderer_class_init (MetapostRendererClass *klass)
renderer_class->begin_render = begin_render;
renderer_class->end_render = end_render;
-
+ renderer_class->is_capable_to = is_capable_to;
renderer_class->set_linewidth = set_linewidth;
renderer_class->set_linecaps = set_linecaps;
renderer_class->set_linejoin = set_linejoin;
@@ -1144,12 +1154,6 @@ export_metapost(DiagramData *data, DiaContext *ctx,
initial_color.blue=0.;
initial_color.alpha=1.;
set_line_color(renderer,&initial_color);
-
- initial_color.red=1.;
- initial_color.green=1.;
- initial_color.blue=1.;
- initial_color.alpha=1.;
- set_fill_color(renderer,&initial_color);
data_render(data, DIA_RENDERER(renderer), NULL, NULL, NULL);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]