#include #include int main(int o, char **O) { FILE *x[3]; int y[4], r[4], z[4], C, h, i, n, a, t, s, u[2][3][4] = { { {6, 9, 0, 3}, {1, 10, 4, 7}, {5, 11, 2, 8} }, { {3, 0, 6, 9}, {10, 1, 4, 7}, {8, 2, 5, 11} } }, M, I, R, A, K, U[2], RU[2], N[2]; float f, q[12]; unsigned char p[2][3<<16], d[12], b[256][256]; if( o < 4 ) return !puts(" [odd]"); else { for(h = 0, M = SEEK_SET; h < 2; h++) { if( !(x[h] = fopen(O[h + 1], "rb")) ) goto e; fseek(x[h], 0, M); if( (int)fread(*b, 1, 256, x[h]) < 1 || sscanf((char*)*b, *O = "P6\n%d %d\n%d\n", &U[h], &N[h], &i) - 3 || i - 255 ) goto e; for(i = C = RU[h] = 0; i < 256 && !RU[h]; i++) if( b[0][i] == '\n' ) if( ++C == 3 ) fseek(x[h], RU[h] = i + 1, M); if( !RU[h] || U[h] < 1 || U[h] > (1<<16) ) goto e; } if( *U - U[1] || *N - N[1] ) goto e; for(h = 0; h < 256; h++) for(i = 0; i < 256; b[h][i++] = 0); for(i = 0; i < *N; i++) { for(h = 0; h < 2; h++) if( fread(p[h], 3**U, 1, x[h]) - 1 ) goto e; for(h = 0; h < 3**U; h++) b[p[0][h]][p[1][h]] = 1; } *y = *r = y[2] = r[2] = 64; y[1] = r[1] = y[3] = r[3] = 192; A = (y[1] - *y) * (y[3] - y[2]); for(M = 64; M > 0; M /= 2) { for(t = -1; t < 1; t++) if( (*z = *r + t * M) > -1 ) for(I = -1; I < 1; I++) if( (z[2] = r[2] + I * M) > -1 ) for(s = 1; s > -1; s--) if( (z[1] = r[1] + s * M) < 257 ) for(R = 1; R > -1; R--) if( (z[3] = r[3] + R * M) < 257 ) if( (K = (z[1] - *z) * (z[3] - z[2])) > A ) { for(h = C = 0; h < 256 && C > -1 && C < 256; h++) for(n = h * (z[1] - z[i = 0]) / 256 + *z; i < 256 && C > -1 && C < 256; i++) { a = i * (z[3] - z[2]) / 256 + z[2]; if( b[h][i] ) C = (3 * n - a) / 2; } if( C > -1 && C < 256 ) for(C = 0, A = K; C < 4; C++) y[C] = z[C]; } for(C = 0; C < 4; C++) r[C] = y[C]; } if( !(x[2] = fopen(O[3], "wb+")) ) goto e; else { fprintf(x[2], *O, 2 * *U, 2 * *N, 255); for(h = 0; h < 2; h++) fseek(x[h], RU[h], SEEK_SET); C = o < 5 ? 1 : 0; for(i = 0; i < *N; i++) { for(h = 0; h < 2; h++) if( fread(p[h], 3 * *U, 1, x[h]) - 1 ) goto e; for(M = 0; M < 7; M += 6) for(h = 0; h < *U; h++) { for(n = 0; n < 3; n++) { for(a = 0; a < 2; a++) q[u[C][n][a]] = p[a][h * 3 + n] * (r[a * 2 + 1] - r[a * 2]) / 256.f + r[a * 2]; q[u[C][n][2]] = q[u[C][n][3]] = (3 * q[*u[C][n]] - q[u[C][n][1]]) / 2; } for(n = 0; n < 12; d[n++] = t < 0 ? 0 : (t > 255 ? 255 : t)) { t = q[n]; f = q[n] - t; if( rand() < f * RAND_MAX ) t++; } fwrite(d + M, 6, 1, x[2]); } } } } for(h = 0; h < 3; t = fclose(x[h++])); return t; e: return !puts("error"); }