Fix colorizing sparse images.

This commit is contained in:
John Preston 2022-03-18 20:40:27 +04:00
parent af680714ff
commit 1027fb5dff

View file

@ -1127,20 +1127,25 @@ QImage Colored(QImage &&image, QColor add) {
const auto ca = int(add.alphaF() * 0xFF); const auto ca = int(add.alphaF() * 0xFF);
const auto cr = int(add.redF() * 0xFF); const auto cr = int(add.redF() * 0xFF);
const auto cg = int(add.greenF() * 0xFF); const auto cg = int(add.greenF() * 0xFF);
const auto cb = int(add .blueF() * 0xFF); const auto cb = int(add.blueF() * 0xFF);
const auto w = image.width(); const auto w = image.width();
const auto h = image.height(); const auto h = image.height();
const auto size = w * h * 4; const auto size = w * h * 4;
for (auto i = index_type(); i != size; i += 4) { const auto add = image.bytesPerLine() - (w * 4);
const auto b = pix[i]; auto i = index_type();
const auto g = pix[i + 1]; for (auto y = 0; y != h; ++y) {
const auto r = pix[i + 2]; for (auto to = i + (w * 4); i != to; i += 4) {
const auto a = pix[i + 3]; const auto b = pix[i];
const auto aca = a * ca; const auto g = pix[i + 1];
pix[i + 0] = uchar(b + ((aca * (cb - b)) >> 16)); const auto r = pix[i + 2];
pix[i + 1] = uchar(g + ((aca * (cg - g)) >> 16)); const auto a = pix[i + 3];
pix[i + 2] = uchar(r + ((aca * (cr - r)) >> 16)); const auto aca = a * ca;
pix[i + 3] = uchar(a + ((aca * (0xFF - a)) >> 16)); pix[i + 0] = uchar(b + ((aca * (cb - b)) >> 16));
pix[i + 1] = uchar(g + ((aca * (cg - g)) >> 16));
pix[i + 2] = uchar(r + ((aca * (cr - r)) >> 16));
pix[i + 3] = uchar(a + ((aca * (0xFF - a)) >> 16));
}
i += add;
} }
} }
return std::move(image); return std::move(image);