hrev46676 adds 1 changeset to branch 'master' old head: 72921639156c94839ff23ae94477371390e58d2d new head: e3265202413cd402548ba28003e430e08f8acea6 overview: http://cgit.haiku-os.org/haiku/log/?qt=range&q=e326520+%5E7292163 ---------------------------------------------------------------------------- e326520: Fix bitmap scaling Bug introduced in 810f0a42e50b32d17c478f0bdf73b1b34d315ad0. The uint8 cast were also acting as masks for each of the pixel components, moving them out of the multiplications made things go wrong. Use rgb_color instead of messing with bitshifts and masks for better readbility (the colors are out of order, but the processing is the same on each color so the end result is valid). [ Adrien Destugues <pulkomandy@xxxxxxxxxxxxx> ] ---------------------------------------------------------------------------- Revision: hrev46676 Commit: e3265202413cd402548ba28003e430e08f8acea6 URL: http://cgit.haiku-os.org/haiku/commit/?id=e326520 Author: Adrien Destugues <pulkomandy@xxxxxxxxxxxxx> Date: Tue Jan 14 17:46:45 2014 UTC ---------------------------------------------------------------------------- 1 file changed, 15 insertions(+), 15 deletions(-) src/libs/icon/IconUtils.cpp | 30 +++++++++++++++--------------- ---------------------------------------------------------------------------- diff --git a/src/libs/icon/IconUtils.cpp b/src/libs/icon/IconUtils.cpp index bbefa87..229fe6b 100644 --- a/src/libs/icon/IconUtils.cpp +++ b/src/libs/icon/IconUtils.cpp @@ -113,9 +113,9 @@ scale_down(const uint8* srcBits, uint8* dstBits, int32 srcWidth, int32 srcHeight float tmp; float d1, d2, d3, d4; // coefficients - uint32 p1, p2, p3, p4; + rgb_color p1, p2, p3, p4; // nearby pixels - uint8 red, green, blue, alpha; + rgb_color out; // color components for (int32 i = 0; i < dstHeight; i++) { @@ -143,23 +143,23 @@ scale_down(const uint8* srcBits, uint8* dstBits, int32 srcWidth, int32 srcHeight d4 = (1 - t) * u; // nearby pixels - p1 = *((uint32*)srcBits + (l * srcWidth) + c); - p2 = *((uint32*)srcBits + (l * srcWidth) + c + 1); - p3 = *((uint32*)srcBits + ((l + 1)* srcWidth) + c + 1); - p4 = *((uint32*)srcBits + ((l + 1)* srcWidth) + c); + p1 = *((rgb_color*)srcBits + (l * srcWidth) + c); + p2 = *((rgb_color*)srcBits + (l * srcWidth) + c + 1); + p3 = *((rgb_color*)srcBits + ((l + 1)* srcWidth) + c + 1); + p4 = *((rgb_color*)srcBits + ((l + 1)* srcWidth) + c); // color components - blue = (uint8)(p1 * d1 + p2 * d2 + p3 * d3 + p4 * d4); - green = (uint8)((p1 >> 8) * d1 + (p2 >> 8) * d2 - + (p3 >> 8) * d3 + (p4 >> 8) * d4); - red = (uint8)((p1 >> 16) * d1 + (p2 >> 16) * d2 - + (p3 >> 16) * d3 + (p4 >> 16) * d4); - alpha = (uint8)((p1 >> 24) * d1 + (p2 >> 24) * d2 - + (p3 >> 24) * d3 + (p4 >> 24) * d4); + out.blue = (uint8)(p1.blue * d1 + p2.blue * d2 + p3.blue * d3 + + p4.blue * d4); + out.green = (uint8)(p1.green * d1 + p2.green * d2 + p3.green * d3 + + p4.green * d4); + out.red = (uint8)(p1.red * d1 + p2.red * d2 + p3.red * d3 + + p4.red * d4); + out.alpha = (uint8)(p1.alpha * d1 + p2.alpha * d2 + p3.alpha * d3 + + p4.alpha * d4); // destination RGBA pixel - *((uint32*)dstBits + (i * dstWidth) + j) - = (alpha << 24) | (red << 16) | (green << 8) | (blue); + *((rgb_color*)dstBits + (i * dstWidth) + j) = out; } } }