Image DownScale(const Image& img, int nx, int ny) { ASSERT(nx > 0 && ny > 0); Size ssz = img.GetSize(); Size tsz = Size((ssz.cx + nx - 1) / nx, (ssz.cy + ny - 1) / ny); int div = nx * ny; Buffer<RGBAV> b(tsz.cx); ImageBuffer ib(tsz); RGBA *it = ~ib; int scx0 = ssz.cx / nx * nx; for(int yy = 0; yy < ssz.cy; yy += ny) { for(int i = 0; i < tsz.cx; i++) b[i].Clear(); for(int yi = 0; yi < ny; yi++) { int y = yy + yi; if(y < ssz.cy) { const RGBA *s = img[y]; const RGBA *e = s + scx0; const RGBA *e2 = s + ssz.cx; RGBAV *t = ~b; while(s < e) { for(int n = nx; n--;) t->Put(*s++); t++; } while(s < e2) t->Put(*s++); ASSERT(s <= ~img + img.GetLength()); } } const RGBAV *s = ~b; for(int x = 0; x < tsz.cx; x++) *it++ = (s++)->Get(div); } return ib; }
Report message to a moderator