- // weights for the weighted average are proportional to the inverse of the distance
- const double w1 = 1/d1, w2 = 1/d2, w3 = 1/d3, w4 = 1/d4;
-
- for (int i = 0; i < 3; i++) // repeat calculation for R, G, and B
- {
- result_data[y][x].rgb[i] =
- (unsigned char) ( (w1 * v1.rgb[i] + w2 * v2.rgb[i] +
- w3 * v3.rgb[i] + w4 * v4.rgb[i]) /
- (w1 + w2 + w3 + w4) );
- }
+ // weights for the weighted average are proportional to the inverse of the distance
+ unsigned char *v1 = data[y1] + (3 * x1);
+ unsigned char *v2 = data[y1] + (3 * x2);
+ unsigned char *v3 = data[y2] + (3 * x2);
+ unsigned char *v4 = data[y2] + (3 * x1);
+
+ const double w1 = 1/d1, w2 = 1/d2, w3 = 1/d3, w4 = 1/d4;
+
+ // GRG: Unrolled.
+
+ *(dst++) = (unsigned char)
+ ( (w1 * *(v1++) + w2 * *(v2++) +
+ w3 * *(v3++) + w4 * *(v4++)) /
+ (w1 + w2 + w3 + w4) );
+ *(dst++) = (unsigned char)
+ ( (w1 * *(v1++) + w2 * *(v2++) +
+ w3 * *(v3++) + w4 * *(v4++)) /
+ (w1 + w2 + w3 + w4) );
+ *(dst++) = (unsigned char)
+ ( (w1 * *(v1++) + w2 * *(v2++) +
+ w3 * *(v3++) + w4 * *(v4++)) /
+ (w1 + w2 + w3 + w4) );