altos/draw: Fix clipping far line end
[fw/altos] / src / draw / ao_line.c
index 832a916c76aed9dbe1042f7a024febe071ae93c6..10c071eb4bdbc3cd77931231e937ff3dde39f0d4 100644 (file)
@@ -211,16 +211,20 @@ ao_clip_line(struct ao_cc *c, struct ao_cbox *b)
         */
        int32_t adj_min;
 
-       if (!c->first)
-               adj_min = div_ceil(c->e + adjust_major * c->e1, -c->e3);
-       else
-               adj_min = div_floor_plus_one(c->e + adjust_major * c->e1, -c->e3);
+       if (c->e3) {
+               if (!c->first)
+                       adj_min = div_ceil(c->e + adjust_major * c->e1, -c->e3);
+               else
+                       adj_min = div_floor_plus_one(c->e + adjust_major * c->e1, -c->e3);
+       }
 
        if (adj_min < adjust_minor) {
-               if (c->first)
-                       adjust_major = div_ceil(c->e - adjust_minor * c->e3, c->e1);
-               else
-                       adjust_major = div_floor_plus_one(c->e - adjust_minor * c->e3, c->e1);
+               if (c->e1) {
+                       if (c->first)
+                               adjust_major = div_ceil(c->e - adjust_minor * c->e3, c->e1);
+                       else
+                               adjust_major = div_floor_plus_one(c->e - adjust_minor * c->e3, c->e1);
+               }
        } else {
                adjust_minor = adj_min;
        }
@@ -230,6 +234,7 @@ ao_clip_line(struct ao_cc *c, struct ao_cbox *b)
        c->major = (int16_t) (c->major + c->sign_major * adjust_major);
        c->minor = (int16_t) (c->minor + c->sign_minor * adjust_minor);
 
+       c->first = true;        /* signal to extend len */
        return true;
 }