+ if(!(buf = malloc(xsz * ysz * sizeof *buf))) {
+ perror("failed to allocate buffer");
+ return 1;
+ }
+ imgrad = sqrt(xsz * xsz + ysz * ysz);
+
+#define UDIV 2048
+#define VDIV 32768
+ prev_r = 0.0f;
+ for(i=0; i<VDIV; i++) {
+ float v = (float)(VDIV - i) / (float)VDIV;
+ float r = 4.0 / v + 16;
+ float z = v * 400.0f;
+
+ /* don't bother drawing rings < 1 pixel apart */
+ if(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 = u;
+ ptr->y = v * 8;
+ }
+ }
+ prev_r = r;
+ }
+