#include #include #include #include #include #include typedef int _; typedef double f; png_image I; png_bytep D[2]; _ A,N,G,E, *l, *d, s, i, j, c[82], t; f x, y, X, Y, U, V, v[3][2], b[3][6], e[6561][6], Z[6] = {1, 0, 0, 0, 1, 0}; _ k(_ a, char *r) { return printf(a ? a - 1 ? "Error writing %s\n" : "Error reading %s\n" : "%s \n", r); } f R(f r) { return (f)rand() / (RAND_MAX + 1u) * r; } void T(_ h, f *p) { f *a, q[6]; _ r; if( h > 7 ) memcpy(e[t++], p, 6 * sizeof(f)); else for(r = 0; r < 3; T(h + 1, q)) { a = b[r++]; q[0] = a[0] * p[0] + a[1] * p[3]; q[1] = a[0] * p[1] + a[1] * p[4]; q[2] = a[0] * p[2] + a[1] * p[5] + a[2]; q[3] = a[3] * p[0] + a[4] * p[3]; q[4] = a[3] * p[1] + a[4] * p[4]; q[5] = a[3] * p[2] + a[4] * p[5] + a[5]; } } f P(f m, f n, f p, f q, f g, f h) { return fabs((p - m) * (h - n) - (q - n) * (g - m)); } _ main(_ a, char **r) { if( a - 4 ) return k(0, *r); I.version = PNG_IMAGE_VERSION; if( png_image_begin_read_from_file(&I, r[1]) ) { G = I.width; E = I.height; for(I.format = PNG_FORMAT_RGBA; i < 2;) D[i++] = (png_bytep)calloc(s = G * E, 4); A = *D && D[1] && png_image_finish_read(&I, NULL, *D, 0, NULL); } if( !A ) return k(1, r[1]); srand(time(NULL)); for(U = 0; U < 0.4; U = P(v[0][0], v[0][1], v[1][0], v[1][1], v[2][0], v[2][1])) for(i = 0; i < 3; i++) for(j = 0; j < 2;) v[i][j++] = R(0.8) + 0.1; for(i = 0; i < 3; i++) { if( sizeof('c') > 1 ) { b[i][0] = x = R(0.6) + 0.1 * (i + 2); b[i][4] = y = R(0.6) + 0.1 * (i + 2); b[i][1] = b[i][3] = 0.0; b[i][2] = v[i][0] - x * 0.5; b[i][5] = v[i][1] - y * 0.5; } else { for(U = 0; U < 0.3 || U > 0.7; U = P(b[i][0], b[i][1], b[i][2], b[i][3], b[i][4], b[i][5])) for(j = 0; j < 6; j++) b[i][j] = v[i][j % 2] + R(1) - 0.5; X = b[i][2]; Y = b[i][3]; U = b[i][4]; V = b[i][5]; b[i][2] = x = b[i][0]; b[i][5] = y = b[i][1]; b[i][0] = X - x; b[i][3] = Y - y; b[i][1] = U - x; b[i][4] = V - y; } } T(0, Z); for(d = (_*)D[1]; N < s * 80; N += i < 0 || j < 0 || i >= G || j >= E ? 1 : d[j * G + i]++ > 79 ? s * 80 : 0) { x = R(1); y = R(1); for(i = 0; i < 2; i++) { A = R(6561); X = x * e[A][0] + y * e[A][1] + e[A][2]; Y = x * e[A][3] + y * e[A][4] + e[A][5]; x = X; y = Y; } i = round(x * G); j = round(y * E); } for(i = j = 0; i < s;) c[d[i++]]++; for(A = 80; A > 1 && (j += c[A]) < s / 2; A--); l = (_*)*D; for(i = 0; i++ < s; d++, *l++ *= j) *d = (j = *d < A) ? 0 : *l; for(i = 0; i < 2; i++) if( !png_image_write_to_file(&I, r[i + 2], 0, D[i], 0, NULL) ) return k(2, r[i + 2]); return 0; }