--- /dev/null
+#include <inttypes.h>
+#include <stdio.h>
+
+inline int8_t hue_div(unsigned max, unsigned min, unsigned a, unsigned b) {
+ int p, q;
+
+ q = max - min;
+ p = a - b;
+ p *= 85; /* 120 deg. angle (85=255/3) */
+ p += q;
+ q += q;
+ return (int8_t)(p/q);
+}
+
+inline uint8_t rgb2hue(unsigned r, unsigned g, unsigned b) {
+ if ((r == g) && (g == b))
+ return 0;
+ if (r > g) {
+ if (r > b)
+ return (uint8_t)hue_div(r, (g < b) ? g : b, g, b);
+ return (uint8_t)(2*85 + hue_div(b, g, r, g));
+ }
+ if (g > b)
+ return (uint8_t)(85 + hue_div(g, (r < b) ? r : b, b, r));
+ return (uint8_t)(2*85 + hue_div(b, r, r, g));
+}
+
+void image_hue(uint8_t *rgb, uint8_t *hue, unsigned length) {
+ unsigned i, j, k, r, g, b;
+
+ for (i = j = 0, k = 3; i < length; i++, j += 3, k += 3) {
+ r = rgb[j++] + rgb[k++];
+ g = rgb[j++] + rgb[k++];
+ b = rgb[j++] + rgb[k++];
+ hue[i] = rgb2hue(r, g, b);
+ }
+}
+
+void image_threshold(uint8_t *img, char *bitmap, unsigned length,
+ uint8_t t1, uint8_t t2)
+{
+ unsigned ip, ib;
+ uint8_t b;
+
+ for (ip = ib = 0; ip < length; ib++) {
+ bitmap[ib] = 0;
+ for (b = 1<<7; b; b >>= 1, ip++)
+ if ((img[ip] < t1) || (img[ip] > t2))
+ bitmap[ib] += b;
+ }
+}
+
+#if 0
+int main() {
+ uint8_t rgb[640*480*3], hue[320*480], bitmap[320*480/8];
+
+ fread(rgb, 640*480*3, 1, stdin);
+ image_hue(rgb, hue, 320*480);
+ image_threshold(hue, bitmap, 320*480, 106, 235);
+ printf("P4\n320 480\n");
+ fwrite(bitmap, 320*480, 1, stdout);
+
+ return 0;
+}
+#endif