+ i_render_done(&ff.r);
+}
+
+static void
+i_circle_aa_low(i_img *im, double x, double y, double rad, flush_render_t r,
+ void *ctx) {
+ i_color temp;
+ i_img_dim ly;
+ dIMCTXim(im);
+ double ceil_rad = ceil(rad);
+ i_img_dim first_row = floor(y) - ceil_rad;
+ i_img_dim last_row = ceil(y) + ceil_rad;
+ i_img_dim first_col = floor(x) - ceil_rad;
+ i_img_dim last_col = ceil(x) + ceil_rad;
+ double r_sqr = rad * rad;
+ i_img_dim max_width = 2 * ceil(rad) + 1;
+ unsigned char *coverage = NULL;
+ size_t coverage_size;
+ int sub;
+
+ im_log((aIMCTX, 1, "i_circle_aa_low(im %p, centre(" i_DFp "), rad %.2f, r %p, ctx %p)\n",
+ im, i_DFcp(x, y), rad, r, ctx));
+
+ if (first_row < 0)
+ first_row = 0;
+ if (last_row > im->ysize-1)
+ last_row = im->ysize - 1;
+ if (first_col < 0)
+ first_col = 0;
+ if (last_col > im->xsize-1)
+ last_col = im->xsize - 1;
+
+ if (rad <= 0 || last_row < first_row || last_col < first_col) {
+ /* outside the image */
+ return;
+ }
+
+ coverage_size = max_width;
+ coverage = mymalloc(coverage_size);
+
+ for(ly = first_row; ly < last_row; ly++) {
+ frac min_frac_x[16];
+ frac max_frac_x[16];
+ i_img_dim min_frac_left_x = 16 *(ceil(x) + ceil(rad));
+ i_img_dim max_frac_left_x = -1;
+ i_img_dim min_frac_right_x = 16 * (floor(x) - ceil(rad));
+ i_img_dim max_frac_right_x = -1;
+ /* reset work_y each row so the error doesn't build up */
+ double work_y = ly;
+ double dy, dy_sqr;
+
+ for (sub = 0; sub < 16; ++sub) {
+ work_y += 1.0 / 16.0;
+ dy = work_y - y;
+ dy_sqr = dy * dy;
+
+ if (dy_sqr < r_sqr) {
+ double dx = sqrt(r_sqr - dy_sqr);
+ double left_x = x - dx;
+ double right_x = x + dx;
+ frac frac_left_x = float_to_frac(left_x);
+ frac frac_right_x = float_to_frac(right_x);
+
+ if (frac_left_x < min_frac_left_x)
+ min_frac_left_x = frac_left_x;
+ if (frac_left_x > max_frac_left_x)
+ max_frac_left_x = frac_left_x;
+ if (frac_right_x < min_frac_right_x)
+ min_frac_right_x = frac_right_x;
+ if (frac_right_x > max_frac_right_x)
+ max_frac_right_x = frac_right_x;
+ min_frac_x[sub] = frac_left_x;
+ max_frac_x[sub] = frac_right_x;
+ }
+ else {
+ min_frac_x[sub] = max_frac_x[sub] = 0;
+ max_frac_left_x = im->xsize * 16;
+ min_frac_right_x = -1;
+ }