void PixmapDial::paintEvent(QPaintEvent*) { QPainter painter(this); if (! m_label.isEmpty()) { painter.setPen(m_color2); painter.setBrush(m_label_gradient); painter.drawRect(m_label_gradient_rect); painter.setPen(m_colorT[isEnabled() ? 0 : 1]); painter.drawText(m_label_pos, m_label); } if (isEnabled()) { float current = value()-minimum(); float divider = maximum()-minimum(); if (divider == 0.0f) return; float value = current/divider; QRectF source, target(0.0f, 0.0f, p_size, p_size); int xpos, ypos, per = (p_count-1)*value; if (m_orientation == HORIZONTAL) { xpos = p_size*per; ypos = 0.0f; } else { xpos = 0.0f; ypos = p_size*per; } source = QRectF(xpos, ypos, p_size, p_size); painter.drawPixmap(target, m_pixmap, source); // Custom knobs (Dry/Wet and Volume) if (m_custom_paint == CUSTOM_PAINT_CARLA_WET || m_custom_paint == CUSTOM_PAINT_CARLA_VOL) { // knob color QColor colorGreen(0x5D, 0xE7, 0x3D, 191 + m_hover_step*7); QColor colorBlue(0x3E, 0xB8, 0xBE, 191 + m_hover_step*7); // draw small circle QRectF ballRect(8.0, 8.0, 15.0, 15.0); QPainterPath ballPath; ballPath.addEllipse(ballRect); //painter.drawRect(ballRect); float tmpValue = (0.375f + 0.75f*value); float ballValue = tmpValue - floorf(tmpValue); QPointF ballPoint(ballPath.pointAtPercent(ballValue)); // draw arc int startAngle = 216*16; int spanAngle = -252*16*value; if (m_custom_paint == CUSTOM_PAINT_CARLA_WET) { painter.setBrush(colorBlue); painter.setPen(QPen(colorBlue, 0)); painter.drawEllipse(QRectF(ballPoint.x(), ballPoint.y(), 2.2, 2.2)); QConicalGradient gradient(15.5, 15.5, -45); gradient.setColorAt(0.0, colorBlue); gradient.setColorAt(0.125, colorBlue); gradient.setColorAt(0.625, colorGreen); gradient.setColorAt(0.75, colorGreen); gradient.setColorAt(0.76, colorGreen); gradient.setColorAt(1.0, colorGreen); painter.setBrush(gradient); painter.setPen(QPen(gradient, 3)); } else { painter.setBrush(colorBlue); painter.setPen(QPen(colorBlue, 0)); painter.drawEllipse(QRectF(ballPoint.x(), ballPoint.y(), 2.2, 2.2)); painter.setBrush(colorBlue); painter.setPen(QPen(colorBlue, 3)); } painter.drawArc(4.0, 4.0, 26.0, 26.0, startAngle, spanAngle); } // Custom knobs (L and R) else if (m_custom_paint == CUSTOM_PAINT_CARLA_L || m_custom_paint == CUSTOM_PAINT_CARLA_R) { // knob color QColor color(0xAD + m_hover_step*5, 0xD5 + m_hover_step*4, 0x4B + m_hover_step*5); // draw small circle QRectF ballRect(7.0, 8.0, 11.0, 12.0); QPainterPath ballPath; ballPath.addEllipse(ballRect); //painter.drawRect(ballRect); float tmpValue = (0.375f + 0.75f*value); float ballValue = tmpValue - floorf(tmpValue); QPointF ballPoint(ballPath.pointAtPercent(ballValue)); painter.setBrush(color); painter.setPen(QPen(color, 0)); painter.drawEllipse(QRectF(ballPoint.x(), ballPoint.y(), 2.0f, 2.0f)); int startAngle, spanAngle; // draw arc if (m_custom_paint == CUSTOM_PAINT_CARLA_L) { startAngle = 216*16; spanAngle = -252.0*16*value; } else if (m_custom_paint == CUSTOM_PAINT_CARLA_R) { startAngle = 324.0*16; spanAngle = 252.0*16*(1.0-value); } else return; painter.setPen(QPen(color, 2)); painter.drawArc(3.5, 4.5, 22.0, 22.0, startAngle, spanAngle); if (HOVER_MIN < m_hover_step && m_hover_step < HOVER_MAX) { m_hover_step += m_hovered ? 1 : -1; QTimer::singleShot(20, this, SLOT(update())); } } if (HOVER_MIN < m_hover_step && m_hover_step < HOVER_MAX) { m_hover_step += m_hovered ? 1 : -1; QTimer::singleShot(20, this, SLOT(update())); } } else { QRectF target(0.0, 0.0, p_size, p_size); painter.drawPixmap(target, m_pixmap, target); } }
bool BallPerceptor::checkBallPoints() { // find "valid" ball points validBallPoints = 0; static const int countOfBallPoints = sizeof(ballPoints) / sizeof(*ballPoints); for(int i = 0; i < countOfBallPoints; ++i) { BallPoint& ballPoint(ballPoints[i]); ballPoint.isValid = !ballPoint.atBorder && ballPoint.point != ballPoint.start; if(ballPoint.isValid) { ++validBallPoints; //DOT("module:BallPerceptor:image", ballPoint.point.x, ballPoint.point.y, ColorRGBA(0, 0xff, 0, 0x70), ColorRGBA(0, 0xff, 0, 0x70)); } } if(validBallPoints < 3) return false; // find duplicated ball points (may occur in small balls) for(int i = 0; i < countOfBallPoints; ++i) { BallPoint& ballPoint(ballPoints[i]); if(ballPoint.isValid) { const BallPoint& nextBallPoint(ballPoints[(i + 1) % countOfBallPoints]); if(nextBallPoint.isValid && ballPoint.point == nextBallPoint.point) { ballPoint.isValid = false; --validBallPoints; } } } if(validBallPoints < 3) return false; // drop mismatching ball points while(validBallPoints > 3) { Vector2<> preCenter; float preRadius; if(!getBallFromBallPoints(preCenter, preRadius)) return false; float minDist = 0; BallPoint* minDistBallPoint = 0; for(int i = 0; i < countOfBallPoints; ++i) { BallPoint& ballPoint(ballPoints[i]); if(ballPoint.isValid) { float dist = (ballPoint.pointf - preCenter).squareAbs(); if(!minDistBallPoint || dist < minDist) { minDist = dist; minDistBallPoint = &ballPoint; } } } minDistBallPoint->isValid = false; --validBallPoints; if((preRadius - (sqrt(minDist) + 2.f)) / preRadius < 0.1f) break; } /* COMPLEX_DRAWING("module:BallPerceptor:image", { for(BallPoint* ballPoint = ballPoints, * end = ballPoints + sizeof(ballPoints) / sizeof(*ballPoints); ballPoint < end; ++ballPoint) if(ballPoint->isValid) { DOT("module:BallPerceptor:image", ballPoint->point.x, ballPoint->point.y, ColorRGBA(0, 0xff, 0), ColorRGBA(0, 0, 0)); } }); */ return true; }
void PixmapDial::paintEvent(QPaintEvent* event) { event->accept(); QPainter painter(this); painter.save(); painter.setRenderHint(QPainter::Antialiasing, true); if (! fLabel.isEmpty()) { if (fCustomPaint == CUSTOM_PAINT_NULL) { painter.setPen(fColor2); painter.setBrush(fLabelGradient); painter.drawRect(fLabelGradientRect); } painter.setFont(fLabelFont); painter.setPen(fColorT[isEnabled() ? 0 : 1]); painter.drawText(fLabelPos, fLabel); } if (isEnabled()) { float current = value()-minimum(); float divider = maximum()-minimum(); if (divider == 0.0f) return; float value = current/divider; QRectF source, target(0.0f, 0.0f, fSize, fSize); int xpos, ypos, per = (fCount-1)*value; if (fOrientation == HORIZONTAL) { xpos = fSize*per; ypos = 0.0f; } else { xpos = 0.0f; ypos = fSize*per; } source = QRectF(xpos, ypos, fSize, fSize); painter.drawPixmap(target, fPixmap, source); // Custom knobs (Dry/Wet and Volume) if (fCustomPaint == CUSTOM_PAINT_CARLA_WET || fCustomPaint == CUSTOM_PAINT_CARLA_VOL) { // knob color QColor colorGreen(0x5D, 0xE7, 0x3D, 191 + fHoverStep*7); QColor colorBlue(0x3E, 0xB8, 0xBE, 191 + fHoverStep*7); // draw small circle QRectF ballRect(8.0f, 8.0f, 15.0f, 15.0f); QPainterPath ballPath; ballPath.addEllipse(ballRect); //painter.drawRect(ballRect); float tmpValue = (0.375f + 0.75f*value); float ballValue = tmpValue - std::floor(tmpValue); QPointF ballPoint(ballPath.pointAtPercent(ballValue)); // draw arc int startAngle = 216*16; int spanAngle = -252*16*value; if (fCustomPaint == CUSTOM_PAINT_CARLA_WET) { painter.setBrush(colorBlue); painter.setPen(QPen(colorBlue, 0)); painter.drawEllipse(QRectF(ballPoint.x(), ballPoint.y(), 2.2f, 2.2f)); QConicalGradient gradient(15.5f, 15.5f, -45); gradient.setColorAt(0.0f, colorBlue); gradient.setColorAt(0.125f, colorBlue); gradient.setColorAt(0.625f, colorGreen); gradient.setColorAt(0.75f, colorGreen); gradient.setColorAt(0.76f, colorGreen); gradient.setColorAt(1.0f, colorGreen); painter.setBrush(gradient); painter.setPen(QPen(gradient, 3)); } else { painter.setBrush(colorBlue); painter.setPen(QPen(colorBlue, 0)); painter.drawEllipse(QRectF(ballPoint.x(), ballPoint.y(), 2.2f, 2.2f)); painter.setBrush(colorBlue); painter.setPen(QPen(colorBlue, 3)); } painter.drawArc(4.0f, 4.0f, 26.0f, 26.0f, startAngle, spanAngle); } // Custom knobs (L and R) else if (fCustomPaint == CUSTOM_PAINT_CARLA_L || fCustomPaint == CUSTOM_PAINT_CARLA_R) { // knob color QColor color(0xAD + fHoverStep*5, 0xD5 + fHoverStep*4, 0x4B + fHoverStep*5); // draw small circle QRectF ballRect(7.0f, 8.0f, 11.0f, 12.0f); QPainterPath ballPath; ballPath.addEllipse(ballRect); //painter.drawRect(ballRect); float tmpValue = (0.375f + 0.75f*value); float ballValue = tmpValue - std::floor(tmpValue); QPointF ballPoint(ballPath.pointAtPercent(ballValue)); painter.setBrush(color); painter.setPen(QPen(color, 0)); painter.drawEllipse(QRectF(ballPoint.x(), ballPoint.y(), 2.0f, 2.0f)); int startAngle, spanAngle; // draw arc if (fCustomPaint == CUSTOM_PAINT_CARLA_L) { startAngle = 216*16; spanAngle = -252.0*16*value; } else if (fCustomPaint == CUSTOM_PAINT_CARLA_R) { startAngle = 324.0*16; spanAngle = 252.0*16*(1.0-value); } else return; painter.setPen(QPen(color, 2)); painter.drawArc(3.5f, 4.5f, 22.0f, 22.0f, startAngle, spanAngle); if (HOVER_MIN < fHoverStep && fHoverStep < HOVER_MAX) { fHoverStep += fHovered ? 1 : -1; QTimer::singleShot(20, this, SLOT(update())); } } if (HOVER_MIN < fHoverStep && fHoverStep < HOVER_MAX) { fHoverStep += fHovered ? 1 : -1; QTimer::singleShot(20, this, SLOT(update())); } } else { QRectF target(0.0f, 0.0f, fSize, fSize); painter.drawPixmap(target, fPixmap, target); } painter.restore(); }