QImage combine(QList<QImage> images) { if (images.length() == 1) return images.first(); genTable(); QSize size = images[0].size(); const int width = size.width(); const int height = size.height(); QImage ret(size, QImage::Format_ARGB32_Premultiplied); for (int y = 0; y < height; ++y) { uchar* __restrict q = ret.scanLine(y); for (int x = 0; x < width; ++x) { u32 sum[4] = {0}; foreach (const QImage& img, images) { QRgb rgb = img.pixel(x, y); sum[0] += rgb & 0xFFu; sum[1] += (rgb >> 8u) & 0xFFu; sum[2] += (rgb >> 16u) & 0xFFu; sum[3] += (rgb >> 24u) & 0xFFu; } const u32 multiplier = table[std::max(sum[3], u32(255u))]; #define PROCESS_PIXEL(i) *q++ = (uchar) ((u64(sum[i] * 255u) * multiplier) >> 32); PROCESS_PIXEL(0) PROCESS_PIXEL(1) PROCESS_PIXEL(2) #undef PROCESS_PIXEL *q++ = (u8) std::min(sum[3], u32(255u)); } }
void Color3WayMain::process_pixel(float *r, float *g, float *b, float r_in, float g_in, float b_in, float x, float y) { float r_factor[SECTIONS]; float g_factor[SECTIONS]; float b_factor[SECTIONS]; float s_factor[SECTIONS]; float v_factor[SECTIONS]; for(int i = 0; i < SECTIONS; i++) { calculate_factors(r_factor + i, g_factor + i, b_factor + i, x, y); CALCULATE_FACTORS(s_factor[i], v_factor[i], 0, 0) } PROCESS_PIXEL(r_in, g_in, b_in); *r = r_in; *g = g_in; *b = b_in; }