+ else if(use_median)
+ {
+ // negative scale = match median to offset
+
+ fprintf(stderr, "Calculating median...\n");
+
+ float *medianbuf = malloc(sizeof(float) * w * h);
+ float vmed;
+
+ fprintf(stderr, " converting...\n");
+ /* renormalize, find min/max */
+ for(y = 0; y < h; ++y)
+ for(x = 0; x < w; ++x)
+ {
+#ifdef C99
+ v = creal(imgspace1[(w*y+x)]);
+#else
+ v = (imgspace1[(w*y+x)][0]);
+#endif
+ medianbuf[w*y+x] = v;
+ }
+ fprintf(stderr, " sorting...\n");
+ qsort(medianbuf, w*h, sizeof(*medianbuf), floatcmp);
+ fprintf(stderr, " done.\n");
+ if(w*h % 2)
+ vmed = medianbuf[(w*h-1)/2];
+ else
+ vmed = (medianbuf[(w*h)/2] + medianbuf[(w*h-2)/2]) * 0.5;
+
+ // we actually want (v - vmed) * scale + offset
+ offset -= vmed * scale;
+ }