Exemple #1
0
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;
}