typedef struct arrowtype_t {
int type;
double lenfact; /* ratio of length of this arrow type to standards arrow */
- void (*gen) (GVJ_t * job, pointf p, pointf u, int flag); /* generator function for type */
+ void (*gen) (GVJ_t * job, pointf p, pointf u, double wscale, int flag); /* generator function for type */
} arrowtype_t;
/* forward declaration of functions used in Arrowtypes[] */
-static void arrow_type_normal(GVJ_t * job, pointf p, pointf u, int flag);
-static void arrow_type_crow(GVJ_t * job, pointf p, pointf u, int flag);
-static void arrow_type_tee(GVJ_t * job, pointf p, pointf u, int flag);
-static void arrow_type_box(GVJ_t * job, pointf p, pointf u, int flag);
-static void arrow_type_diamond(GVJ_t * job, pointf p, pointf u, int flag);
-static void arrow_type_dot(GVJ_t * job, pointf p, pointf u, int flag);
+static void arrow_type_normal(GVJ_t * job, pointf p, pointf u, double wscale, int flag);
+static void arrow_type_crow(GVJ_t * job, pointf p, pointf u, double wscale, int flag);
+static void arrow_type_tee(GVJ_t * job, pointf p, pointf u, double wscale, int flag);
+static void arrow_type_box(GVJ_t * job, pointf p, pointf u, double wscale, int flag);
+static void arrow_type_diamond(GVJ_t * job, pointf p, pointf u, double wscale, int flag);
+static void arrow_type_dot(GVJ_t * job, pointf p, pointf u, double wscale, int flag);
static arrowtype_t Arrowtypes[] = {
{ARR_TYPE_NORM, 1.0, arrow_type_normal},
return startp;
}
-static void arrow_type_normal(GVJ_t * job, pointf p, pointf u, int flag)
+static void arrow_type_normal(GVJ_t * job, pointf p, pointf u, double wscale, int flag)
{
pointf q, v, a[5];
- v.x = -u.y * 0.35;
- v.y = u.x * 0.35;
+ v.x = -u.y * 0.35 * wscale;
+ v.y = u.x * 0.35 * wscale;
q.x = p.x + u.x;
q.y = p.y + u.y;
if (flag & ARR_MOD_INV) {
gvrender_polygon(job, &a[1], 3, !(flag & ARR_MOD_OPEN));
}
-static void arrow_type_crow(GVJ_t * job, pointf p, pointf u, int flag)
+static void arrow_type_crow(GVJ_t * job, pointf p, pointf u, double wscale, int flag)
{
pointf m, n, q, v, a[7];
gvrender_polygon(job, a, 7, 1);
}
-static void arrow_type_tee(GVJ_t * job, pointf p, pointf u, int flag)
+static void arrow_type_tee(GVJ_t * job, pointf p, pointf u, double wscale, int flag)
{
pointf m, n, q, v, a[4];
gvrender_polyline(job, a, 2);
}
-static void arrow_type_box(GVJ_t * job, pointf p, pointf u, int flag)
+static void arrow_type_box(GVJ_t * job, pointf p, pointf u, double wscale, int flag)
{
pointf m, q, v, a[4];
gvrender_polyline(job, a, 2);
}
-static void arrow_type_diamond(GVJ_t * job, pointf p, pointf u, int flag)
+static void arrow_type_diamond(GVJ_t * job, pointf p, pointf u, double wscale, int flag)
{
pointf q, r, v, a[5];
gvrender_polygon(job, a, 4, !(flag & ARR_MOD_OPEN));
}
-static void arrow_type_dot(GVJ_t * job, pointf p, pointf u, int flag)
+static void arrow_type_dot(GVJ_t * job, pointf p, pointf u, double wscale, int flag)
{
double r;
pointf AF[2];
gvrender_ellipse(job, AF, 2, !(flag & ARR_MOD_OPEN));
}
-static pointf arrow_gen_type(GVJ_t * job, pointf p, pointf u, int flag)
+static pointf arrow_gen_type(GVJ_t * job, pointf p, pointf u, double wscale, int flag)
{
int f;
arrowtype_t *arrowtype;
if (f == arrowtype->type) {
u.x *= arrowtype->lenfact;
u.y *= arrowtype->lenfact;
- (arrowtype->gen) (job, p, u, flag);
+ (arrowtype->gen) (job, p, u, wscale, flag);
p.x = p.x + u.x;
p.y = p.y + u.y;
break;
return bb;
}
-void arrow_newgen(GVJ_t * job, emit_state_t emit_state, pointf p, pointf u, double scale, int flag)
+void arrow_newgen(GVJ_t * job, emit_state_t emit_state, pointf p, pointf u, double scale, double wscale, int flag)
{
obj_state_t *obj = job->obj;
double s;
/* arrow head closest to node */
f = flag & ((1 << 16) - 1);
- p = arrow_gen_type(job, p, u, f);
+ p = arrow_gen_type(job, p, u, wscale, f);
/* arrow head furthest from node */
/* start where first one ended */
f = (flag >> 16) & ((1 << 16) - 1);
- arrow_gen_type(job, p, u, f);
+ arrow_gen_type(job, p, u, wscale, f);
gvrender_end_context(job);
}
/* FIXME emit.c and output.c require wrapper for int point coords */
-void arrow_gen(GVJ_t * job, emit_state_t emit_state, point p, point u, double scale, int flag)
+void arrow_gen(GVJ_t * job, emit_state_t emit_state, point p, point u, double scale, double wscale, int flag)
{
pointf P, U;
P2PF(p, P);
P2PF(u, U);
- arrow_newgen(job, emit_state, P, U, scale, flag);
+ arrow_newgen(job, emit_state, P, U, scale, wscale, flag);
}
bezierf bzf;
splinesf offspl, tmpspl;
pointf pf0, pf1, pf2 = { 0, 0 }, pf3, *offlist, *tmplist;
- double scale, numc2;
+ double scale, wscale = 1., numc2;
char* p;
#define SEP 2.0
color = late_string(e, E_color, "");
if (job->obj->penwidth > 4)
- scale *= job->obj->penwidth / 4;
+ wscale = job->obj->penwidth / 4;
/* need to know how many colors separated by ':' */
for (p = color; *p; p++)
}
}
arrow_gen(job, EMIT_TDRAW, bz.sp, bz.list[0],
- scale, bz.sflag);
+ scale, wscale, bz.sflag);
}
if (bz.eflag) {
if (color != headcolor) {
}
}
arrow_gen(job, EMIT_HDRAW, bz.ep, bz.list[bz.size - 1],
- scale, bz.eflag);
+ scale, wscale, bz.eflag);
}
free(colors);
for (i = 0; i < offspl.size; i++) {
FALSE, FALSE);
if (bz.sflag) {
arrow_gen(job, EMIT_TDRAW, bz.sp, bz.list[0],
- scale, bz.sflag);
+ scale, wscale, bz.sflag);
}
if (bz.eflag) {
arrow_gen(job, EMIT_HDRAW, bz.ep, bz.list[bz.size - 1],
- scale, bz.eflag);
+ scale, wscale, bz.eflag);
}
/* arrow_gen resets the job style
* If we have more splines to do, restore the old one.