void PathDeformRenderer::mouseMoveEvent(QMouseEvent *e) { if (!m_mouseDrag && (QLineF(m_mousePress, e->pos()).length() > 25.0) ) m_mouseDrag = true; if (m_mouseDrag) { QRect rectBefore = circle_bounds(m_pos, m_radius, m_fontSize); if (e->type() == QEvent::MouseMove) { QLineF line(m_pos, e->pos() + m_offset); line.setLength(line.length() * .1); QPointF dir(line.dx(), line.dy()); m_direction = (m_direction + dir) / 2; } m_pos = e->pos() + m_offset; #ifdef QT_OPENGL_SUPPORT if (usesOpenGL()) { update(); } else #endif { QRect rectAfter = circle_bounds(m_pos, m_radius, m_fontSize); update(rectBefore | rectAfter); } } }
void PathDeformRenderer::timerEvent(QTimerEvent *e) { if (e->timerId() == m_repaintTimer.timerId()) { if (QLineF(QPointF(0,0), m_direction).length() > 1) m_direction *= 0.995; qreal time = m_repaintTracker.restart(); QRect rectBefore = circle_bounds(m_pos, m_radius, m_fontSize); qreal dx = m_direction.x(); qreal dy = m_direction.y(); if (time > 0) { dx = dx * time * .1; dy = dy * time * .1; } m_pos += QPointF(dx, dy); if (m_pos.x() - m_radius < 0) { m_direction.setX(-m_direction.x()); m_pos.setX(m_radius); } else if (m_pos.x() + m_radius > width()) { m_direction.setX(-m_direction.x()); m_pos.setX(width() - m_radius); } if (m_pos.y() - m_radius < 0) { m_direction.setY(-m_direction.y()); m_pos.setY(m_radius); } else if (m_pos.y() + m_radius > height()) { m_direction.setY(-m_direction.y()); m_pos.setY(height() - m_radius); } #ifdef QT_OPENGL_SUPPORT if (usesOpenGL()) { update(); } else #endif { QRect rectAfter = circle_bounds(m_pos, m_radius, m_fontSize); update(rectAfter | rectBefore); QApplication::syncX(); } } // else if (e->timerId() == m_fpsTimer.timerId()) { // printf("fps: %d\n", m_fpsCounter); // emit frameRate(m_fpsCounter); // m_fpsCounter = 0; // } }
void CompositionRenderer::setCirclePos(const QPointF &pos) { const QRect oldRect = rectangle_around(m_circle_pos).toAlignedRect(); m_circle_pos = pos; const QRect newRect = rectangle_around(m_circle_pos).toAlignedRect(); #if defined(QT_OPENGL_SUPPORT) && !defined(QT_OPENGL_ES) if (usesOpenGL()) update(); else #endif update(oldRect | newRect); }
void PathDeformRenderer::setIntensity(int intensity) { m_intensity = intensity; if (!m_animated) { #ifdef QT_OPENGL_SUPPORT if (usesOpenGL()) { update(); return; } #endif update(circle_bounds(m_pos, m_radius, m_fontSize)); } }
void PathDeformRenderer::setRadius(int radius) { qreal max = qMax(m_radius, (qreal)radius); m_radius = radius; generateLensPixmap(); if (!m_animated || m_radius < max) { #ifdef QT_OPENGL_SUPPORT if (usesOpenGL()){ update(); return; } #endif update(circle_bounds(m_pos, max, m_fontSize)); } }
void CompositionRenderer::paint(QPainter *painter) { #if defined(QT_OPENGL_SUPPORT) && !defined(QT_OPENGL_ES) if (usesOpenGL()) { int new_pbuf_size = m_pbuffer_size; if (size().width() > m_pbuffer_size || size().height() > m_pbuffer_size) new_pbuf_size *= 2; if (size().width() < m_pbuffer_size/2 && size().height() < m_pbuffer_size/2) new_pbuf_size /= 2; if (!m_pbuffer || new_pbuf_size != m_pbuffer_size) { if (m_pbuffer) { m_pbuffer->deleteTexture(m_base_tex); m_pbuffer->deleteTexture(m_compositing_tex); delete m_pbuffer; } m_pbuffer = new QGLPixelBuffer(QSize(new_pbuf_size, new_pbuf_size), QGLFormat::defaultFormat(), glWidget()); m_pbuffer->makeCurrent(); m_base_tex = m_pbuffer->generateDynamicTexture(); m_compositing_tex = m_pbuffer->generateDynamicTexture(); m_pbuffer_size = new_pbuf_size; } if (size() != m_previous_size) { m_previous_size = size(); QPainter p(m_pbuffer); p.setCompositionMode(QPainter::CompositionMode_Source); p.fillRect(QRect(0, 0, m_pbuffer->width(), m_pbuffer->height()), Qt::transparent); drawBase(p); p.end(); m_pbuffer->updateDynamicTexture(m_base_tex); } qreal x_fraction = width()/float(m_pbuffer->width()); qreal y_fraction = height()/float(m_pbuffer->height()); { QPainter p(m_pbuffer); p.setCompositionMode(QPainter::CompositionMode_Source); p.fillRect(QRect(0, 0, m_pbuffer->width(), m_pbuffer->height()), Qt::transparent); p.save(); // Needed when using the GL1 engine p.beginNativePainting(); // Needed when using the GL2 engine glBindTexture(GL_TEXTURE_2D, m_base_tex); glEnable(GL_TEXTURE_2D); glColor4f(1.,1.,1.,1.); glBegin(GL_QUADS); { glTexCoord2f(0, 1.0); glVertex2f(0, 0); glTexCoord2f(x_fraction, 1.0); glVertex2f(width(), 0); glTexCoord2f(x_fraction, 1.0-y_fraction); glVertex2f(width(), height()); glTexCoord2f(0, 1.0-y_fraction); glVertex2f(0, height()); } glEnd(); glDisable(GL_TEXTURE_2D); p.endNativePainting(); // Needed when using the GL2 engine p.restore(); // Needed when using the GL1 engine drawSource(p); p.end(); m_pbuffer->updateDynamicTexture(m_compositing_tex); } painter->beginNativePainting(); // Needed when using the GL2 engine glWidget()->makeCurrent(); // Needed when using the GL1 engine glBindTexture(GL_TEXTURE_2D, m_compositing_tex); glEnable(GL_TEXTURE_2D); glEnable(GL_BLEND); glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); glColor4f(1.,1.,1.,1.); glBegin(GL_QUADS); { glTexCoord2f(0, 1.0); glVertex2f(0, 0); glTexCoord2f(x_fraction, 1.0); glVertex2f(width(), 0); glTexCoord2f(x_fraction, 1.0-y_fraction); glVertex2f(width(), height()); glTexCoord2f(0, 1.0-y_fraction); glVertex2f(0, height()); } glEnd(); glDisable(GL_TEXTURE_2D); painter->endNativePainting(); // Needed when using the GL2 engine } else #endif { // using a QImage if (m_buffer.size() != size()) { m_buffer = QImage(size(), QImage::Format_ARGB32_Premultiplied); m_base_buffer = QImage(size(), QImage::Format_ARGB32_Premultiplied); m_base_buffer.fill(0); QPainter p(&m_base_buffer); drawBase(p); } memcpy(m_buffer.bits(), m_base_buffer.bits(), m_buffer.byteCount()); { QPainter p(&m_buffer); drawSource(p); } painter->drawImage(0, 0, m_buffer); } }