diff --git a/CImg.h b/CImg.h index db4c170315426326bff793d1372676896b445a15..052cafe9099ec1da4a4c12e285b8113211560865 100644 --- a/CImg.h +++ b/CImg.h @@ -8046,28 +8046,37 @@ namespace cimg_library_suffixed { template<typename t, typename T> static void _render_resize(const T *ptrs, const unsigned int ws, const unsigned int hs, t *ptrd, const unsigned int wd, const unsigned int hd) { - unsigned int *const offx = new unsigned int[wd], *const offy = new unsigned int[hd + 1], *poffx, *poffy; - float s, curr, old; - s = (float)ws/wd; - poffx = offx; curr = 0; for (unsigned int x = 0; x<wd; ++x) { - old = curr; curr+=s; *(poffx++) = (unsigned int)curr - (unsigned int)old; - } - s = (float)hs/hd; - poffy = offy; curr = 0; for (unsigned int y = 0; y<hd; ++y) { - old = curr; curr+=s; *(poffy++) = ws*((unsigned int)curr - (unsigned int)old); - } - *poffy = 0; - poffy = offy; + typedef typename cimg::last<T,cimg_ulong>::type ulongT; + CImg<ulongT> off_x(wd), off_y(hd + 1); + if (wd==ws) off_x.fill(1); + else { + ulongT *poff_x = off_x._data, curr = 0; + for (unsigned int x = 0; x<wd; ++x) { + const ulongT old = curr; + curr = (ulongT)((x + 1.0)*ws/wd); + *(poff_x++) = curr - old; + } + } + if (hd==hs) off_y.fill(ws); + else { + ulongT *poff_y = off_y._data, curr = 0; + for (unsigned int y = 0; y<hd; ++y) { + const ulongT old = curr; + curr = (ulongT)((y + 1.0)*hs/hd); + *(poff_y++) = ws*(curr - old); + } + *poff_y = 0; + } + ulongT *poff_y = off_y._data; for (unsigned int y = 0; y<hd; ) { const T *ptr = ptrs; - poffx = offx; - for (unsigned int x = 0; x<wd; ++x) { *(ptrd++) = *ptr; ptr+=*(poffx++); } + ulongT *poff_x = off_x._data; + for (unsigned int x = 0; x<wd; ++x) { *(ptrd++) = *ptr; ptr+=*(poff_x++); } ++y; - unsigned int dy = *(poffy++); - for ( ; !dy && y<hd; std::memcpy(ptrd,ptrd - wd,sizeof(t)*wd), ++y, ptrd+=wd, dy = *(poffy++)) {} + ulongT dy = *(poff_y++); + for ( ; !dy && y<hd; std::memcpy(ptrd,ptrd - wd,sizeof(t)*wd), ++y, ptrd+=wd, dy = *(poff_y++)) {} ptrs+=dy; } - delete[] offx; delete[] offy; } //! Set normalization type. @@ -29509,12 +29518,12 @@ namespace cimg_library_suffixed { } ++z; ulongT dz = *(poff_z++); - for ( ; !dz && z<dz; std::memcpy(ptrd,ptrd-sxy,sizeof(T)*sxy), ++z, ptrd+=sxy, dz = *(poff_z++)) {} + for ( ; !dz && z<dz; std::memcpy(ptrd,ptrd - sxy,sizeof(T)*sxy), ++z, ptrd+=sxy, dz = *(poff_z++)) {} ptrz+=dz; } ++c; ulongT dc = *(poff_c++); - for ( ; !dc && c<dc; std::memcpy(ptrd,ptrd-sxyz,sizeof(T)*sxyz), ++c, ptrd+=sxyz, dc = *(poff_c++)) {} + for ( ; !dc && c<dc; std::memcpy(ptrd,ptrd - sxyz,sizeof(T)*sxyz), ++c, ptrd+=sxyz, dc = *(poff_c++)) {} ptrc+=dc; } } break;