void EnhancedPathShape::updatePath(const QSizeF &) { clear(); foreach (EnhancedPathCommand *cmd, m_commands) cmd->execute(); m_viewBound = outline().boundingRect(); m_mirrorMatrix.reset(); m_mirrorMatrix.translate(m_viewBound.center().x(), m_viewBound.center().y()); m_mirrorMatrix.scale(m_mirrorHorizontally ? -1 : 1, m_mirrorVertically ? -1 : 1); m_mirrorMatrix.translate(-m_viewBound.center().x(), -m_viewBound.center().y()); QTransform matrix; matrix.translate(m_viewBoxOffset.x(), m_viewBoxOffset.y()); matrix = m_mirrorMatrix * m_viewMatrix * matrix; KoSubpathList::const_iterator pathIt(m_subpaths.constBegin()); for (; pathIt != m_subpaths.constEnd(); ++pathIt) { KoSubpath::const_iterator it((*pathIt)->constBegin()); for (; it != (*pathIt)->constEnd(); ++it) { (*it)->map(matrix); } } const int handleCount = m_enhancedHandles.count(); QList<QPointF> handles; for (int i = 0; i < handleCount; ++i) handles.append(matrix.map(m_enhancedHandles[i]->position())); setHandles(handles); normalize(); }
void RectangleShape::updateHandles() { QVector<QPointF> handles; handles.reserve(2); handles.append(QPointF(size().width() - m_cornerRadiusX/100.0 * 0.5 * size().width(), 0.0)); handles.append(QPointF(size().width(), m_cornerRadiusY/100.0 * 0.5 * size().height())); setHandles(handles); }
void EnhancedPathShape::evaluateHandles() { const int handleCount = m_enhancedHandles.count(); QList<QPointF> handles; for (int i = 0; i < handleCount; ++i) handles.append(m_enhancedHandles[i]->position()); setHandles(handles); }
RectangleShape::RectangleShape() : m_cornerRadiusX(0) , m_cornerRadiusY(0) { QVector<QPointF> handles; handles.reserve(2); handles.push_back(QPointF(100, 0)); handles.push_back(QPointF(100, 0)); setHandles(handles); QSizeF size(100, 100); updatePath(size); }
void StarShape::updatePath(const QSizeF &size) { Q_UNUSED(size); qreal radianStep = M_PI / static_cast<qreal>(m_cornerCount); createPoints(m_convex ? m_cornerCount : 2*m_cornerCount); KoSubpath &points = *m_subpaths[0]; uint index = 0; for (uint i = 0; i < 2*m_cornerCount; ++i) { uint cornerType = i % 2; if (cornerType == base && m_convex) continue; qreal radian = static_cast<qreal>((i+1)*radianStep) + m_angles[cornerType]; QPointF cornerPoint = QPointF(m_zoomX * m_radius[cornerType] * cos(radian), m_zoomY * m_radius[cornerType] * sin(radian)); points[index]->setPoint(m_center + cornerPoint); points[index]->unsetProperty(KoPathPoint::StopSubpath); points[index]->unsetProperty(KoPathPoint::CloseSubpath); if (m_roundness[cornerType] > 1e-10 || m_roundness[cornerType] < -1e-10) { // normalized cross product to compute tangential vector for handle point QPointF tangentVector(cornerPoint.y()/m_radius[cornerType], -cornerPoint.x()/m_radius[cornerType]); points[index]->setControlPoint2(points[index]->point() - m_roundness[cornerType] * tangentVector); points[index]->setControlPoint1(points[index]->point() + m_roundness[cornerType] * tangentVector); } else { points[index]->removeControlPoint1(); points[index]->removeControlPoint2(); } index++; } // first path starts and closes path points[0]->setProperty(KoPathPoint::StartSubpath); points[0]->setProperty(KoPathPoint::CloseSubpath); // last point stops and closes path points.last()->setProperty(KoPathPoint::StopSubpath); points.last()->setProperty(KoPathPoint::CloseSubpath); normalize(); QList<QPointF> handles; handles.push_back(points.at(tip)->point()); if (! m_convex) handles.push_back(points.at(base)->point()); setHandles(handles); m_center = computeCenter(); }
void Material::initShader() { AC_DEBUG << "Material initShader "<<(void*)this; if (vertexShader_.empty() || fragmentShader_.empty()) { setShader(); } shaderProgram_ = createProgram(vertexShader_, fragmentShader_); if (!shaderProgram_) { AC_ERROR << "Could not create program."; throw ShaderCreationException("problems during shader program creation of " + vertexShader_ + " or/and " + fragmentShader_, PLUS_FILE_LINE); } bindAttributes(); setHandles(); glLinkProgram(shaderProgram_); ASSERT_GL("glLinkProgram", PLUS_FILE_LINE); }
void EnhancedPathShape::reset() { qDeleteAll(m_commands); m_commands.clear(); qDeleteAll(m_enhancedHandles); m_enhancedHandles.clear(); setHandles(QList<QPointF>()); qDeleteAll(m_formulae); m_formulae.clear(); qDeleteAll(m_parameters); m_parameters.clear(); m_modifiers.clear(); m_viewMatrix.reset(); m_viewBoxOffset = QPointF(); clear(); }
void KarbonCalligraphicShape::updatePath(const QSizeF &size) { Q_UNUSED(size); QPointF pos = position(); // remove all points clear(); setPosition(QPoint(0, 0)); foreach(KarbonCalligraphicPoint *p, m_points) appendPointToPath(*p); simplifyPath(); QList<QPointF> handles; foreach(KarbonCalligraphicPoint *p, m_points) handles.append(p->point()); setHandles(handles); setPosition(pos); }
void KarbonCalligraphicShape::appendPoint(const QPointF &point, qreal angle, qreal width) { // convert the point from canvas to shape coordinates QPointF p = point - position(); KarbonCalligraphicPoint *calligraphicPoint = new KarbonCalligraphicPoint(p, angle, width); QList<QPointF> handles = this->handles(); handles.append(p); setHandles(handles); m_points.append(calligraphicPoint); appendPointToPath(*calligraphicPoint); // make the angle of the first point more in line with the actual // direction if (m_points.count() == 4) { m_points[0]->setAngle(angle); m_points[1]->setAngle(angle); m_points[2]->setAngle(angle); } }