Take a look at the basic code and recount the line generators.
D'oh. There's only two. One is re-used for the third line.
Separate out the steps involved in setting up and running each of the line generators.
1) Order the lines so that the two line generators run on the first and third lines, with one line stopping and that line generator then drawing the second line.
2) Each line is setup by calculating its bounding box's width and height
3) Signs are calculated for the stepping increments according to the direction of the line
4) Key values are assigned to magic, errd and is_done to allow the line generator to run
5) Line generators are run, filling in horizontal raster lines between the two lines being drawn if fill mode is on
Step #1 is more like the first linegen is the tallest vertical line.
Line #2 begins by touching the top of line #1.
Increment a Y pixel at a time for each line.
If there is empty space, draw a line (will be the linegen3 engine) between the X coordinates of linegen #1 and #2.
Loop around until lingen2 ends, the reset linegen2 with the lat 2 points on the triangle.
Currently, we have a dumb linegen3, but, we might as well replace it with a normal smart one.
Ok, what you said is ok, but, what we want is the order of operations before we start drawing, IE the setup, and what instructions to send to the linegens.
This organization step is important as with a variable setup and control, our triple linegen engine with the right setup controls will also replace our single linegen as well as out box, box-fill, 4 point polygon & fill, + ellipse.