pix = QPixmap(QImageReader(":/mask.png").size()); pix.fill(c); pix.setMask(QPixmap(":/mask.png").mask()); QPainter p(&pix); p.drawPixmap(0,0,QPixmap(":/border.png")); p.end();
inline QRgb mix(const QRgb &c1,const QRgb &c2) { // на первый цвет накладывает второй цвет (оба цвета с произвольной прозрачностью) int c1a(qAlpha(c1)); int c2a(qAlpha(c2)); int a = c2a + (255-c2a)*c1a/255; int r = c2a*qRed(c2) + (255-c2a)*c1a*qRed(c1)/255; int g = c2a*qGreen(c2) + (255-c2a)*c1a*qGreen(c1)/255; int b = c2a*qBlue(c2) + (255-c2a)*c1a*qBlue(c1)/255; return a? qRgba(r/a, g/a, b/a, a): 0; }inline QRgb fillLeftAlpha(const QRgb &src,const QRgb &c) { // залить цветом, оставив альфаканал return (src & 0xFF000000) + (c & RGB_MASK); }//циклfor(int y=0; y<h; ++y) { QRgb *rowData = (QRgb*)img.scanLine(y); QRgb *rowB = (QRgb*)imgBorder.scanLine(y); for(int x=0; x<w; ++x) { QRgb &pixelData = rowData[x]; pixelData = fillLeftAlpha(pixelData, cState[i]); pixelData = mix(pixelData, rowB[x]); }}
inline QRgb mix(const QRgb &c1,const QRgb &c2) { // на первый цвет накладывает второй цвет (оба цвета с произвольной прозрачностью) int c1a(qAlpha(c1)); int c2a(qAlpha(c2)); int a = c2a + (255-c2a)*c1a/255; int r = c2a*qRed(c2) + (255-c2a)*c1a*qRed(c1)/255; int g = c2a*qGreen(c2) + (255-c2a)*c1a*qGreen(c1)/255; int b = c2a*qBlue(c2) + (255-c2a)*c1a*qBlue(c1)/255; return a? qRgba(r/a, g/a, b/a, a): 0; }
int aBack(qAlpha(back)); if(!aBack) return front; int aFront(qAlpha(front)); if(!aFront) return back;