+ if (inv_cv) {
+ workc.channel[3] = orig_alpha * inv_cv / 255;
+ i_ppix_norm(im, xc+i, yc+j, &workc);
+ i_ppix_norm(im, xc-i, yc+j, &workc);
+ i_ppix_norm(im, xc+i, yc-j, &workc);
+ i_ppix_norm(im, xc-i, yc-j, &workc);
+
+ if (i != j) {
+ i_ppix_norm(im, xc+j, yc+i, &workc);
+ i_ppix_norm(im, xc-j, yc+i, &workc);
+ i_ppix_norm(im, xc+j, yc-i, &workc);
+ i_ppix_norm(im, xc-j, yc-i, &workc);
+ }
+ }
+ if (cv && i > j) {
+ workc.channel[3] = orig_alpha * cv / 255;
+ i_ppix_norm(im, xc+i-1, yc+j, &workc);
+ i_ppix_norm(im, xc-i+1, yc+j, &workc);
+ i_ppix_norm(im, xc+i-1, yc-j, &workc);
+ i_ppix_norm(im, xc-i+1, yc-j, &workc);
+
+ if (j != i-1) {
+ i_ppix_norm(im, xc+j, yc+i-1, &workc);
+ i_ppix_norm(im, xc-j, yc+i-1, &workc);
+ i_ppix_norm(im, xc+j, yc-i+1, &workc);
+ i_ppix_norm(im, xc-j, yc-i+1, &workc);
+ }
+ }
+ t = d;
+ }
+
+ return 1;
+}
+
+/*
+=item i_arc_out_aa(im, xc, yc, r, d1, d2, col)
+
+=synopsis i_arc_out_aa(im, 50, 50, 45, 45, 125, &color);
+
+Draw a circle arc outline centered at (x,y) with radius r, from angle
+d1 degrees through angle d2 degrees, anti-aliased.
+
+Parameters:
+
+=over
+
+=item *
+
+(xc, yc) - the center of the circle
+
+=item *
+
+r - the radius of the circle in pixels, must be non-negative
+
+=item *
+
+d1, d2 - the range of angle in degrees to draw the arc through. If
+d2-d1 >= 360 a full circle is drawn.
+
+=back
+
+Returns non-zero on success.
+
+=cut
+
+Based on "Fast Anti-Aliased Circle Generation", Xiaolin Wu, Graphics
+Gems.
+
+*/
+
+int
+i_arc_out_aa(i_img *im, i_img_dim xc, i_img_dim yc, i_img_dim r, double d1, double d2, const i_color *col) {
+ i_img_dim i, j;
+ double t;
+ i_color workc = *col;
+ i_img_dim segs[2][2];
+ int seg_count;
+ i_img_dim sin_th;
+ i_img_dim seg_d1, seg_d2;
+ int seg_num;
+ int orig_alpha = col->channel[3];
+ i_img_dim scale = r + 1;
+ i_img_dim seg1 = scale * 2;
+ i_img_dim seg2 = scale * 4;
+ i_img_dim seg3 = scale * 6;
+ i_img_dim seg4 = scale * 8;
+ dIMCTXim(im);
+
+ im_log((aIMCTX,1,"i_arc_out_aa(im %p,centre(" i_DFp "), rad %" i_DF ", d1 %f, d2 %f, col %p)",
+ im, i_DFcp(xc, yc), i_DFc(r), d1, d2, col));
+
+ im_clear_error(aIMCTX);
+ if (r <= 0) {
+ im_push_error(aIMCTX, 0, "arc: radius must be non-negative");
+ return 0;
+ }
+ if (d1 + 360 <= d2)
+ return i_circle_out_aa(im, xc, yc, r, col);