+#define UDIV 2048
+#define VDIV 32768
+ prev_r = 0.0f;
+#pragma omp parallel for private(i, j, prev_r, ptr) schedule(dynamic)
+ for(i=0; i<VDIV; i++) {
+ float v = (float)(VDIV - i) / (float)VDIV;
+ float r = 4.0 / v + 16;
+ float z = v * coffs;
+
+ /* don't bother drawing rings < 1 pixel apart */
+ if(r < 0 || fabs(r - prev_r) < 0.05) continue;
+
+ for(j=0; j<UDIV; j++) {
+ float u = (float)j / (float)(UDIV - 1);
+ float theta = 2.0f * u * M_PI;
+
+ int x = (int)(cos(theta) * r - z) + xsz / 2;
+ int y = (int)(sin(theta) * r) + ysz / 2;
+
+ if(x >= 0 && x < xsz && y >= 0 && y < ysz) {
+ ptr = buf + y * xsz + x;
+ ptr->x = (j << 8) / UDIV;
+ ptr->y = ((VDIV - i) << 11) / VDIV;
+ }
+ }
+ prev_r = r;
+ }
+
+ ptr = buf;
+ for(i=0; i<out_nlines; i++) {
+ for(j=0; j<xsz; j++) {
+ int u = ptr->x;
+ int v = ptr->y;
+ int r = (u << 3) & 0xff;
+ int g = (v >> 3) & 0xff;
+
+ /*if(v > 2.0) r = g = b = 0;*/