28 lines
1.6 KiB
C
28 lines
1.6 KiB
C
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <stdint.h>
|
|
#define A B(p=t+Z*b+y*S;l=w*h;for(u=j=0;l&&j<b;p++)X->c[j\
|
|
++]=(p[w*b+h*S]-p[w*b]-p[h*S]+*p+l/2)/l,-),u+=z*z; X->d=u;}
|
|
int main(int c,char**V){while(c==4){struct{uint16_t x,y,w,h;
|
|
#define B(e,f) {int x,Z=X->x,y=X->y,w=X->w,h=X->h;e;for(;h--\
|
|
;y++)for(x=Z;x<w+Z;x++)for(j=0;j<b;j++)z=d[y*s+x*b+j]f X->c[j]
|
|
#define H(W,H,w,h,B,i) for(B=z=i=0;++z<w;u>B?B=u,i=z:0)for(u=j\
|
|
=0;p=t+x*b+y*S+j,j<b;j++)K=p[z*W+h*H]-p[z*W],Q=N->c[j]*h,L=p[w*\
|
|
W+h*H]-p[w*W]-K-Q*(w-z),K-=p[h*H]-*p+Q*z,u+=L<0?-L:L,u+=K<0?-K:K;
|
|
#define W(r,X) if(!(F=fopen(*++V,#r)))break;X(d,s,h,F); fclose(F);
|
|
#define G(n,x,y){for(k=0,n=-x;!k;k=z-' '&&z-'\n'&&z-'\r'&&z-'\t'&\
|
|
&z-EOF?z<'0'||z>'9'||(n=(n<0?0:n*10)+z-'0')>>15?n=-1:0:n>=0||z>>8\
|
|
)for(;z=fgetc(F),k++?z-'\n'&&z-EOF:z=='#';);if(x?y:n-3&&n-6)break;
|
|
uint8_t c[4];int64_t d;}*P,*N,*X,o;void*O,*F;int64_t*p,e,f,u,K,L,*
|
|
t,Q,U=1;uint8_t*d;intptr_t n=atoi(*++V),w,h,s,b=3,S,i=0,j,x=0,y,v,
|
|
q,l,k,z;W(rb,if(fgetc(F)=='P')G(i,0,0)}G(w,1,w<1)}G(h,1,h<1)}G(y,1
|
|
,y-255)}L=n=n<1?1:n>w*h?w*h:n;K=S=(s=w*b)+b;K=sizeof(*X)*L+(u=K*h+
|
|
K)*9;if(K-(L=(size_t)K)||!(t=malloc(K)))break;X=P=O=t+u;d=O=P+n;if
|
|
(i<4)for(;x<s*h;)G(i,1,(d[x++]=i,i>>=8))}else i=h-fread)if(i)break
|
|
;;for(X->x=X->y=j=0;j<b;j++)for(x=j-S,z=j-b;x<S*h;x+=b)t[x+S]=x<0?
|
|
y=0:t[x]+(u=y--?u+d[z+=b]:(y=w,0));;X->w=w;X->h=h;A for(;N=X=P,U&&
|
|
++i<n;){for(U=j=0;j++<i;X++)U=X->d>U?(N=X)->d:U; o=*N;v=o.w;q=o.h;
|
|
x=o.x;y=o.y;H(b,S,v,q,e,k)H(S,b,q,v,f,l)e<f?o.y+=N->h=l,o.h-=l:(o.
|
|
x+=N->w=k,o.w-=k);*X=o;A X=N;A}for(;i--;X++)B(,=);}W(wb,fprintf(F,
|
|
"P6\n%i %i\n255\n",c=w,(int)h);fwrite)free(t);return 0;}return 1;}
|