7 resample(Memimage *dst, Rectangle r, Memimage *src, Rectangle sr)
12 uchar *pdst0, *pdst, *psrc0, *psrc;
13 ulong s00, s01, s10, s11;
16 ssize = subpt(subpt(sr.max, sr.min), Pt(1,1));
17 dsize = subpt(subpt(r.max, r.min), Pt(1,1));
18 pdst0 = byteaddr(dst, r.min);
20 bpl = src->width*sizeof(int);
24 qp.x = (ssize.x<<12)/dsize.x;
26 qp.y = (ssize.y<<12)/dsize.y;
29 for(dp.y=0; dp.y<=dsize.y; dp.y++){
34 psrc0 = byteaddr(src, sp);
36 for(dp.x=0; dp.x<=dsize.x; dp.x++){
39 psrc = psrc0 + sp.x*bpp;
40 s00 = (0x1000-tx)*(0x1000-ty);
46 pdst[3] = (s11*psrc[bpl+bpp+3] +
51 pdst[2] = (s11*psrc[bpl+bpp+2] +
55 pdst[1] = (s11*psrc[bpl+bpp+1] +
60 pdst[0] = (s11*psrc[bpl+bpp] +
68 pdst0 += dst->width*sizeof(int);
82 v = strtol(s, &s, 10) & ~PERCENT;
91 sysfatal("Usage: %s [ -x width ] [ -y height ] [ file ]\n", argv0);
95 main(int argc, char **argv)
105 xsize = ysize = getsize(EARGF(usage()));
108 xsize = getsize(EARGF(usage()));
111 ysize = getsize(EARGF(usage()));
118 fd = open(*argv, OREAD);
120 sysfatal("open: %r");
123 if((im = readmemimage(fd)) == nil)
124 sysfatal("readmemimage: %r");
126 xsize = ((xsize & ~PERCENT) * Dx(im->r)) / 100;
128 ysize = ((ysize & ~PERCENT) * Dy(im->r)) / 100;
131 ysize = (xsize * Dy(im->r)) / Dx(im->r);
133 xsize = (ysize * Dx(im->r)) / Dy(im->r);
137 sysfatal("can't handle channel type %s", chantostr(buf, ochan));
157 if((nim = allocmemimage(im->r, tchan)) == nil)
158 sysfatal("allocimage: %r");
159 memimagedraw(nim, nim->r, im, im->r.min, nil, ZP, S);
163 if((nim = allocmemimage(Rect(im->r.min.x, im->r.min.y, xsize, ysize), tchan)) == nil)
164 sysfatal("addocmemimage: %r");
165 resample(nim, nim->r, im, im->r);
169 if((im = allocmemimage(nim->r, ochan)) == nil)
170 sysfatal("allocimage: %r");
171 memimagedraw(im, im->r, nim, nim->r.min, nil, ZP, S);
175 if(writememimage(1, im) < 0)
176 sysfatal("writememimage: %r");