13 #define REINDEXED_INTERPOLATION_GENERAL_ALGORITHM(INIT, REINDEXED_ACTION, NON_REINDEXED_ACTION) \
18 TPIXEL * dColBgnPtr = dData;\
19 TPIXEL * dColBgnPtrEnd = dColBgnPtr + dWidth;\
21 double firstNoReindexDstIndex = (noReindexFrom - x0) / dx;\
22 firstNoReindexDstIndex = (firstNoReindexDstIndex < 0) ? 0 : firstNoReindexDstIndex + 2;\
24 TPIXEL * dPtrNoReindexFrom = dColBgnPtr + ((int) firstNoReindexDstIndex) * dWidth;\
25 int firstReindexDstIndex = (noReindexTo - x0) / dx + 1;\
26 TPIXEL * dPtrNoReindexTo = dColBgnPtr + firstReindexDstIndex * dWidth;\
27 TPIXEL * dPtrEnd = dColBgnPtr + dWidth * dHeight;\
29 TPIXEL * sPtrRowBgn = sData;\
34 while (dColBgnPtr < dColBgnPtrEnd) {\
37 while (dPtr < dPtrNoReindexFrom) {\
42 while (dPtr < dPtrNoReindexTo) {\
47 while (dPtr < dPtrEnd) {\
52 sPtrRowBgn += sWidth;\
58 template<
typename TPIXEL,
typename TCHANNEL>
60 if (xReindex != NULL) {
63 if (yReindex != NULL) {
68 template<
typename TPIXEL,
typename TCHANNEL>
70 if (srcData == NULL) {
74 TPIXEL *
const dstData = dst.
getData();
75 if (dstData == NULL) {
83 unsigned origWidth = srcWidth;
84 unsigned origHeight = srcHeight;
87 unsigned tmpWidth = srcHeight;
88 unsigned tmpHeight = dstWidth;
90 TPIXEL *
const tmpData = (TPIXEL *) malloc((
unsigned long) (tmpWidth * tmpHeight *
sizeof(TPIXEL)));
91 if (tmpData == NULL) {
95 double xDelta = srcWidth / (double) dstWidth;
96 double xMin = xDelta / 2.0;
97 double yDelta = srcHeight / (double) dstHeight;
98 double yMin = yDelta / 2.0;
101 TPIXEL * sData = srcData;
int sWidth = origWidth;
int sHeight = origHeight; TPIXEL * dData = tmpData;
int dWidth = tmpWidth;
int dHeight = tmpHeight;
double x0 = xMin;
double dx = xDelta;
int * reindexer = xReindex;
double noReindexFrom = xNoReindexFrom;
double noReindexTo = xNoReindexTo; TCHANNEL * px1; TCHANNEL * px2; TCHANNEL * dpx; TCHANNEL p1; TCHANNEL p2;
int X;
double nx;,
103 nx = x + 0.5; X = nx; nx -= X; px1 = (TCHANNEL *)(sPtrRowBgn + reindexer[X++]); px2 = (TCHANNEL *)(sPtrRowBgn + reindexer[X]); dpx = (TCHANNEL *)dPtr;
113 nx = x - 0.5; X = nx; nx -= X; sPtr = sPtrRowBgn + X; px1 = (TCHANNEL *) sPtr++; px2 = (TCHANNEL *) sPtr; dpx = (TCHANNEL *)dPtr;
124 TPIXEL * sData = tmpData;
int sWidth = tmpWidth;
int sHeight = tmpHeight; TPIXEL * dData = dstData;
int dWidth = dstWidth;
int dHeight = dstHeight;
double x0 = yMin;
double dx = yDelta;
int * reindexer = yReindex;
double noReindexFrom = yNoReindexFrom;
double noReindexTo = yNoReindexTo; TCHANNEL * px1; TCHANNEL * px2; TCHANNEL * dpx; TCHANNEL p1; TCHANNEL p2;
int X;
double nx;,
126 nx = x + 0.5; X = nx; nx -= X; px1 = (TCHANNEL *)(sPtrRowBgn + reindexer[X++]); px2 = (TCHANNEL *)(sPtrRowBgn + reindexer[X]); dpx = (TCHANNEL *)dPtr;
136 nx = x - 0.5; X = nx; nx -= X; sPtr = sPtrRowBgn + X; px1 = (TCHANNEL *) sPtr++; px2 = (TCHANNEL *) sPtr; dpx = (TCHANNEL *)dPtr;
151 template<
typename TPIXEL,
typename TCHANNEL>
154 if (srcData == NULL) {
158 TPIXEL *
const dstData = dst.
getData();
159 if (dstData == NULL) {
167 unsigned origWidth = srcWidth;
168 unsigned origHeight = srcHeight;
171 unsigned tmpWidth = srcHeight;
172 unsigned tmpHeight = dstWidth;
174 TPIXEL *
const tmpData = (TPIXEL *) malloc((
unsigned long) (tmpWidth * tmpHeight *
sizeof(TPIXEL)));
175 if (tmpData == NULL) {
179 double xDelta = srcWidth / (double) dstWidth;
180 double xMin = xDelta / 2.0;
181 double yDelta = srcHeight / (double) dstHeight;
182 double yMin = yDelta / 2.0;
185 TPIXEL * sData = srcData;
int sWidth = origWidth;
int sHeight = origHeight; TPIXEL * dData = tmpData;
int dWidth = tmpWidth;
int dHeight = tmpHeight;
double x0 = xMin;
double dx = xDelta;
int * reindexer = xReindex;
double noReindexFrom = xNoReindexFrom;
double noReindexTo = xNoReindexTo; TCHANNEL p1; TCHANNEL p2;
int X;
double nx;,
187 nx = x + 0.5; X = nx; nx -= X; p1 = sPtrRowBgn[reindexer[X++]]; p2 = sPtrRowBgn[reindexer[X]];
INTERPOLATE_LINEAR(p1, p2, nx, *dPtr);,
189 nx = x - 0.5; X = nx; nx -= X; sPtr = sPtrRowBgn + X; p1 = *(sPtr++); p2 = *(sPtr);
INTERPOLATE_LINEAR(p1, p2, nx, *dPtr);)
192 TPIXEL * sData = tmpData;
int sWidth = tmpWidth;
int sHeight = tmpHeight; TPIXEL * dData = dstData;
int dWidth = dstWidth;
int dHeight = dstHeight;
double x0 = yMin;
double dx = yDelta;
int * reindexer = yReindex;
double noReindexFrom = yNoReindexFrom;
double noReindexTo = yNoReindexTo; TCHANNEL p1; TCHANNEL p2;
int X;
double nx;,
194 nx = x + 0.5; X = nx; nx -= X; p1 = sPtrRowBgn[reindexer[X++]]; p2 = sPtrRowBgn[reindexer[X]];
INTERPOLATE_LINEAR(p1, p2, nx, *dPtr);,
196 nx = x - 0.5; X = nx; nx -= X; sPtr = sPtrRowBgn + X; p1 = *(sPtr++); p2 = *(sPtr);
INTERPOLATE_LINEAR(p1, p2, nx, *dPtr);)