@bazzargh @bbcmicrobot I ended up with the same kind of stripy dither you got two posts up when I flipped a +z to -
I'm not smart enough to rewrite your chain routine so I went for a hack-it-till-it-breaks-then-roll-back-and-try-again approach and added an 8x8 bayer dither matrix. I think I've got enough pixels calculated now to avoid any bleed or moire patterns. Starting the pre-calculated angles at 0.5 degrees helped avoid various vertical line issues.