- uint16_t out = ((uint16_t)(u * 255.0f) & 0xff) |
- (((uint16_t)(v * 255.0f) & 0xff) << 8);
- fwrite(&out, sizeof out, 1, stdout);
+#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(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;
+ }