#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <algorithm>

typedef unsigned char uint8;
uint8 img[576][768][3];

const int X1 = 127;
const int Y1 = 108;
const int X2 = 624;
const int Y2 = 464;

int main() {
	FILE *f = fopen("e:\\pal.bmp", "rb");

	fseek(f, -768*576*3, SEEK_END);
	fread(img, 768*576*3, 1, f);

	float ang[16][16];

	for(int i=0; i<16; ++i) {
		for(int j=0; j<16; ++j) {
			int rsum = 0;
			int gsum = 0;
			int bsum = 0;

			const int x = X1 + ((X2 - X1) * j + 7) / 15;
			const int y = Y1 + ((Y2 - Y1) * i + 7) / 15;

			for(int y2=0; y2<8; ++y2) {
				for(int x2=0; x2<8; ++x2) {
					const uint8 *px = img[575 - y - 8 + y2][x - 4 + x2];
					rsum += px[2];
					gsum += px[1];
					bsum += px[0];
				}
			}

			float r = (float)rsum / 64.0f;
			float g = (float)gsum / 64.0f;
			float b = (float)bsum / 64.0f;
			float cy = r * 0.299f + g * 0.587f + b * 0.114f;
			float cu = r * -0.147f - g * 0.289f + b * 0.436f;
			float cv = r * 0.615f - g * 0.515f - b * 0.100f;

			ang[i][j] = atan2f(cv, cu) * 180.0f / 3.1415926535f;
			printf("%4.0f ", ang[i][j]);
		}

		printf("\n");
	}

	printf("\n");

	float ang2[16] = {0};
	float adif[16] = {0};

	for(int i=1; i<16; ++i) {
		float angbase = ang[i][8];

		for(int j=6; j<11; ++j) {
			float a = ang[i][j];

			if (a < angbase - 180.0f)
				a += 360.0f;
			else if (a > angbase + 180.0f)
				a -= 360.0f;

			ang2[i] += a / 5.0f;
		}

		if (ang2[i] < ang2[i - 1] - 180.0f)
			ang2[i] += 360.0f;
		else if (ang2[i] > ang2[i - 1] + 180.0f)
			ang2[i] -= 360.0f;

		adif[i] = ang2[i] - ang2[i - 1];

		printf("%5.1f %5.1f\n", ang2[i], ang2[i] - ang2[i - 1]);
	}

	float adif2[16];
	memcpy(adif2, adif, sizeof adif2);

	std::sort(adif2, adif2 + 16);
	float mdif = adif2[7]*0.25f + adif2[8]*0.5f + adif2[9] * 0.25f;

	printf("\nmdif = %.1f\n\n", mdif);

	for(int i=1; i<16; ++i) {
		float step = adif[i] / mdif;
		float tap1 = (ang2[i] - ang2[5]) / mdif;
		float tap2 = (ang2[i] - ang2[15]) / mdif;

		printf("%.1f  %.1f  %.1f  %.1f\n", step, floorf(step * 2 + 0.5f) / 2.0f, tap1, tap2);
	}
}
