fprintf(stderr, "gfxtool: outline doesn't start with a moveTo");
return;
}
- if(!r || (r[0]<=0 && r[0]>-0.01)) {
+
+ int i;
+ double dashlen=0;
+ for(i=0;r[i]>=0;i++) {
+ dashlen+=r[i];
+ }
+ if(!r || (r[0]<=0 && r[0]>-0.01) || dashlen<0.001) {
// no dashing. just draw the thing
while(line) {
if(line->type == gfx_moveTo) {
return;
}
-
for(;line;line=line->next) {
if(line->type == gfx_moveTo) {
d->moveTo(d, line->x, line->y);
return line;
}
+gfxline_t*gfxline_makecircle(double x,double y,double rx, double ry)
+{
+ double C1 = 0.2930;
+ double C2 = 0.4140;
+ double begin = 0.7070;
+ gfxline_t** line = (gfxline_t**)rfx_calloc(sizeof(gfxline_t*)*9);
+ int t;
+ for(t=0;t<9;t++) {
+ line[t] = rfx_calloc(sizeof(gfxline_t));
+ }
+ line[0]->type = gfx_moveTo;
+ line[0]->x = x+begin*rx;
+ line[0]->y = y+begin*ry;
+ for(t=1;t<9;t++) {
+ line[t-1]->next = line[t];
+ line[t]->type = gfx_splineTo;
+ }
+ line[8]->next = 0;
+#define R(nr,cx,cy,mx,my) \
+ line[nr]->sx = line[nr-1]->x + (cx); \
+ line[nr]->sy = line[nr-1]->y + (cy); \
+ line[nr]->x = line[nr]->sx + (mx); \
+ line[nr]->y = line[nr]->sy + (my);
+ R(1, -C1*rx, C1*ry, -C2*rx, 0);
+ R(2, -C2*rx, 0, -C1*rx, -C1*ry);
+ R(3, -C1*rx, -C1*ry, 0, -C2*ry);
+ R(4, 0, -C2*ry, C1*rx, -C1*ry);
+ R(5, C1*rx, -C1*ry, C2*rx, 0);
+ R(6, C2*rx, 0, C1*rx, C1*ry);
+ R(7, C1*rx, C1*ry, 0, C2*ry);
+ R(8, 0, C2*ry, -C1*rx, C1*ry);
+ gfxline_t*l = line[0];
+ free(line);
+ return l;
+}
+
gfxbbox_t* gfxline_isrectangle(gfxline_t*_l)
{
if(!_l)