195 uint64 sz_48 = (stepz >> 1) - 1;
196 for (
size_t z = dst.
front; z < dst.
back; z++, sz_48+=stepz) {
201 unsigned int temp =
static_cast<unsigned int>(sz_48 >> 32);
203 temp = (temp > 0x8000)? temp - 0x8000 : 0;
206 float szf = (temp & 0xFFFF) / 65536.f;
208 uint64 sy_48 = (stepy >> 1) - 1;
209 for (
size_t y = dst.
top; y < dst.
bottom; y++, sy_48+=stepy) {
210 temp =
static_cast<unsigned int>(sy_48 >> 32);
211 temp = (temp > 0x8000)? temp - 0x8000 : 0;
214 float syf = (temp & 0xFFFF) / 65536.f;
216 uint64 sx_48 = (stepx >> 1) - 1;
217 for (
size_t x = dst.
left; x < dst.
right; x++, sx_48+=stepx) {
218 temp =
static_cast<unsigned int>(sx_48 >> 32);
219 temp = (temp > 0x8000)? temp - 0x8000 : 0;
222 float sxf = (temp & 0xFFFF) / 65536.f;
225 float accum[4] = { 0.0f, 0.0f, 0.0f, 0.0f };
227#define ACCUM3(x,y,z,factor) \
228 { float f = factor; \
229 size_t off = (x+y*src.rowPitch+z*src.slicePitch)*srcchannels; \
230 accum[0]+=srcdata[off+0]*f; accum[1]+=srcdata[off+1]*f; \
231 accum[2]+=srcdata[off+2]*f; }
233#define ACCUM4(x,y,z,factor) \
234 { float f = factor; \
235 size_t off = (x+y*src.rowPitch+z*src.slicePitch)*srcchannels; \
236 accum[0]+=srcdata[off+0]*f; accum[1]+=srcdata[off+1]*f; \
237 accum[2]+=srcdata[off+2]*f; accum[3]+=srcdata[off+3]*f; }
239 if (srcchannels == 3 || dstchannels == 3) {
241 ACCUM3(sx1,sy1,sz1,(1.0f-sxf)*(1.0f-syf)*(1.0f-szf));
242 ACCUM3(sx2,sy1,sz1, sxf *(1.0f-syf)*(1.0f-szf));
243 ACCUM3(sx1,sy2,sz1,(1.0f-sxf)* syf *(1.0f-szf));
244 ACCUM3(sx2,sy2,sz1, sxf * syf *(1.0f-szf));
245 ACCUM3(sx1,sy1,sz2,(1.0f-sxf)*(1.0f-syf)* szf );
246 ACCUM3(sx2,sy1,sz2, sxf *(1.0f-syf)* szf );
247 ACCUM3(sx1,sy2,sz2,(1.0f-sxf)* syf * szf );
248 ACCUM3(sx2,sy2,sz2, sxf * syf * szf );
252 ACCUM4(sx1,sy1,sz1,(1.0f-sxf)*(1.0f-syf)*(1.0f-szf));
253 ACCUM4(sx2,sy1,sz1, sxf *(1.0f-syf)*(1.0f-szf));
254 ACCUM4(sx1,sy2,sz1,(1.0f-sxf)* syf *(1.0f-szf));
255 ACCUM4(sx2,sy2,sz1, sxf * syf *(1.0f-szf));
256 ACCUM4(sx1,sy1,sz2,(1.0f-sxf)*(1.0f-syf)* szf );
257 ACCUM4(sx2,sy1,sz2, sxf *(1.0f-syf)* szf );
258 ACCUM4(sx1,sy2,sz2,(1.0f-sxf)* syf * szf );
259 ACCUM4(sx2,sy2,sz2, sxf * syf * szf );
262 memcpy(pdst, accum,
sizeof(
float)*dstchannels);