Пример #1
0
void SmudgeTool::mouseReleaseEvent(QMouseEvent *event)
{
    Layer *layer = m_pEditor->getCurrentLayer();
    if (layer == NULL) {
        return;
    }

    if (event->button() == Qt::LeftButton)
    {
        if (layer->type == Layer::BITMAP)
        {
            drawStroke();
            m_pScribbleArea->paintBitmapBuffer();
            m_pScribbleArea->setAllDirty();
            endStroke();
        }
        else if (layer->type == Layer::VECTOR)
        {
            VectorImage *vectorImage = ((LayerVector *)layer)->getLastVectorImageAtFrame(m_pEditor->m_nCurrentFrameIndex, 0);
            vectorImage->applySelectionTransformation();
            m_pScribbleArea->selectionTransformation.reset();
            for (int k = 0; k < m_pScribbleArea->vectorSelection.curve.size(); k++)
            {
                int curveNumber = m_pScribbleArea->vectorSelection.curve.at(k);
                vectorImage->curve[curveNumber].smoothCurve();
            }
            m_pScribbleArea->setModified(m_pEditor->m_nCurrentLayerIndex, m_pEditor->m_nCurrentFrameIndex);
        }
    }
}
void KisToolPolylineBase::beginPrimaryDoubleClickAction(KoPointerEvent *event)
{
    endStroke();

    // this action will have no continuation
    event->ignore();
}
Пример #3
0
void EraserTool::mouseReleaseEvent(QMouseEvent *event)
{
    Layer *layer = m_pEditor->getCurrentLayer();

    if (event->button() == Qt::LeftButton)
    {
        if (m_pScribbleArea->isLayerPaintable())
        {
            drawStroke();
        }

        if (layer->type == Layer::BITMAP)
        {
            m_pScribbleArea->paintBitmapBuffer();
            m_pScribbleArea->setAllDirty();
        }
        else if (layer->type == Layer::VECTOR)
        {
            VectorImage *vectorImage = ((LayerVector *)layer)->getLastVectorImageAtFrame(m_pEditor->m_nCurrentFrameIndex, 0);
            // Clear the area containing the last point
            //vectorImage->removeArea(lastPoint);
            // Clear the temporary pixel path
            m_pScribbleArea->clearBitmapBuffer();
            vectorImage->deleteSelectedPoints();
            //update();
            m_pScribbleArea->setModified(m_pEditor->m_nCurrentLayerIndex, m_pEditor->m_nCurrentFrameIndex);
            m_pScribbleArea->setAllDirty();
        }
    }

    endStroke();
}
void KisToolPolylineBase::beginAlternateAction(KoPointerEvent *event, AlternateAction action)
{
    if (action != ChangeSize || !m_dragging) {
        KisToolPaint::beginAlternateAction(event, action);
    }

    if (m_closeSnappingActivated) {
        m_points.append(m_points.first());
    }
    endStroke();
}
Пример #5
0
void BrushTool::mouseReleaseEvent( QMouseEvent *event )
{
    Layer* layer = mEditor->layers()->currentLayer();

    if ( event->button() == Qt::LeftButton )
    {
        if ( mScribbleArea->isLayerPaintable() )
        {
            if (getCurrentPoint()==mMouseDownPoint)
            {
                paintAt(mMouseDownPoint);
            }
            else
            {
                drawStroke();
            }
        }

        if ( layer->type() == Layer::BITMAP )
        {
            mScribbleArea->paintBitmapBuffer();
            mScribbleArea->setAllDirty();
            mScribbleArea->clearBitmapBuffer();
        }
        else if ( layer->type() == Layer::VECTOR && mStrokePoints.size() > -1 )
        {
            // Clear the temporary pixel path
            mScribbleArea->clearBitmapBuffer();
            qreal tol = mScribbleArea->getCurveSmoothing() / mEditor->view()->scaling();
            BezierCurve curve( mStrokePoints, mStrokePressures, tol );
            curve.setWidth( properties.width );
            curve.setFeather( properties.feather );
            curve.setInvisibility( false );
            curve.setVariableWidth( properties.pressure );
            curve.setColourNumber( mEditor->color()->frontColorNumber() );

            auto pLayerVector = static_cast< LayerVector* >( layer );
            VectorImage* vectorImage = pLayerVector->getLastVectorImageAtFrame( mEditor->currentFrame(), 0 );
            vectorImage->insertCurve( 0, curve, mEditor->view()->scaling(), false );

            mScribbleArea->setModified( mEditor->layers()->currentLayerIndex(), mEditor->currentFrame() );
            mScribbleArea->setAllDirty();
        }
    }

    endStroke();
}
Пример #6
0
void KisScratchPad::slotMouseRelease(KoPointerEvent *event)
{
    if (m_toolMode == PAINTING) {
        endStroke(event);
        m_toolMode = HOVERING;
        event->accept();
    }
    else if (m_toolMode == PANNING) {
        endPan(event);
        m_toolMode = HOVERING;
        event->accept();
    }
    else if (m_toolMode == PICKING) {
        event->accept();
        m_toolMode = HOVERING;
    }
}
Пример #7
0
void PencilTool::pointerReleaseEvent(PointerEvent*)
{
    mEditor->backup(typeName());
    qreal distance = QLineF(getCurrentPoint(), mMouseDownPoint).length();
    if (distance < 1)
    {
        paintAt(mMouseDownPoint);
    }
    else
    {
        drawStroke();
    }
    
    Layer* layer = mEditor->layers()->currentLayer();
    if (layer->type() == Layer::BITMAP)
        paintBitmapStroke();
    else if (layer->type() == Layer::VECTOR)
        paintVectorStroke(layer);
    endStroke();
}
void KisToolPolylineBase::beginPrimaryAction(KoPointerEvent *event)
{
    Q_UNUSED(event);

    if ((m_type == PAINT && (!nodeEditable() || nodePaintAbility() == NONE)) ||
        (m_type == SELECT && !selectionEditable())) {

        event->ignore();
        return;
    }

    setMode(KisTool::PAINT_MODE);

    if(m_dragging && m_closeSnappingActivated) {
        m_points.append(m_points.first());
        endStroke();
    } else {
        m_dragging = true;
    }
}
Пример #9
0
void BrushTool::mouseReleaseEvent(QMouseEvent *event)
{
    Layer *layer = m_pEditor->getCurrentLayer();

    if (event->button() == Qt::LeftButton)
    {
        if (m_pScribbleArea->isLayerPaintable())
        {
            drawStroke();
        }

        if (layer->type == Layer::BITMAP)
        {
            m_pScribbleArea->paintBitmapBuffer();
            m_pScribbleArea->setAllDirty();
        }
        else if (layer->type == Layer::VECTOR)
        {
        }
    }

    endStroke();
}
void
CGnuPlotStyleBoxErrorBars::
draw2D(CGnuPlotPlot *plot, CGnuPlotRenderer *renderer)
{
  CGnuPlotBoxErrorBarsStyleValue *value =
    CGnuPlotStyleValueMgrInst->getValue<CGnuPlotBoxErrorBarsStyleValue>(plot);

  if (! value) {
    value = plot->app()->device()->createBoxErrorBarsStyleValue(plot);

    value->init();

    CGnuPlotStyleValueMgrInst->setValue<CGnuPlotBoxErrorBarsStyleValue>(plot, value);
  }

  //---

  const CGnuPlotLineStyle &lineStyle = plot->lineStyle();

  CGnuPlotFill   fill  (plot);
  CGnuPlotStroke stroke(plot);

  bool isCalcColor = lineStyle.isCalcColor();

  CBBox2D bbox = plot->bbox2D();

  double ymin = bbox.getYMin();

  double y2 = std::max(0.0, ymin);

  double bw = value->getSpacing();

  //---

  if (! renderer->isPseudo())
    plot->updateBoxBarCacheSize(plot->getPoints2D().size());

  //---

  int i = 0;

  for (const auto &point : plot->getPoints2D()) {
    std::vector<double> reals;

    (void) point.getReals(reals);

    COptReal colorVal;

    if (isCalcColor && ! reals.empty()) {
      colorVal = reals.back();

      reals.pop_back();
    }

    while (reals.size() < 3)
      reals.push_back(0.0);

    double x  = reals[0];
    double y  = reals[1];
    double dx = bw;
    double dy = 0.0;
    double yl = y;
    double yh = y;

    // x y ydelta
    if      (reals.size() == 3) {
      dy = reals[2];

      yl = y - dy;
      yh = y + dy;
    }
    else if (reals.size() == 4) {
      // x y ydelta xdelta
      if (! value->isAutoWidth()) {
        dx = reals[2];
        dy = reals[3];

        yl = y - dy;
        yh = y + dy;
      }
      // x y ylow yhigh
      else {
        yl = reals[2];
        yh = reals[3];
      }
    }
    // x y ylow yhigh xdelta
    else if (reals.size() >= 5) {
      yl = reals[2];
      yh = reals[3];
      dx = reals[4];
    }

    //---

    COptRGBA lc;

    if (colorVal.isValid()) {
      if (renderer->isPseudo())
        renderer->setCBValue(colorVal.getValue());
      else
        lc = lineStyle.calcColor(plot, colorVal.getValue());
    }

    //---

    CBBox2D bbox(x - dx/2, y2, x + dx/2, y);

    CPoint2D p1(x, yl);
    CPoint2D p2(x, yh);

    if (! renderer->isPseudo()) {
      CGnuPlotBoxBarObject *bar = plot->boxBarObjects()[i];

      bar->setBBox(bbox);

      bar->setValues(x, y);

      bar->setVertical(true);

      if (! bar->testAndSetUsed()) {
        CGnuPlotFillP   fill  (bar->fill  ()->dup());
        CGnuPlotStrokeP stroke(bar->stroke()->dup());

        bar->setFill  (fill  );
        bar->setStroke(stroke);

        //---

        bar->clearEndBars();

        CGnuPlotEndBarP endBar = bar->addEndBar(p1, p2);

        endBar->setStartLine(true);
        endBar->setEndLine  (true);
        endBar->setEndWidth (dx/2);

        CGnuPlotStrokeP endStroke(bar->stroke()->dup());

        endBar->setStroke(endStroke);
      }
    }
    else {
      CGnuPlotStroke stroke;

      stroke.setEnabled(true);

      renderer->strokeRect(bbox, stroke);

      renderer->strokeClipLine(p1, p2, stroke);

      double w = dx/2;

      renderer->strokeClipLine(p1 - CPoint2D(w/2, 0), p1 + CPoint2D(w/2, 0), stroke);
      renderer->strokeClipLine(p2 - CPoint2D(w/2, 0), p2 + CPoint2D(w/2, 0), stroke);
    }

    ++i;
  }

  if (! renderer->isPseudo()) {
    for (const auto &bar : plot->boxBarObjects())
      bar->draw(renderer);
  }
}
Пример #11
0
void BucketTool::mouseReleaseEvent( QMouseEvent *event )
{
    Layer* layer = mEditor->layers()->currentLayer();
    if ( layer == NULL ) { return; }

    if ( event->button() == Qt::LeftButton )
    {
        if ( layer->type() == Layer::BITMAP )
        {
            BitmapImage *sourceImage = ( ( LayerBitmap * )layer )->getLastBitmapImageAtFrame( mEditor->currentFrame(), 0 );
            Layer *targetLayer = layer; // by default
            int layerNumber = mEditor->layers()->currentLayerIndex(); // by default
            if ( mEditor->layers()->currentLayerIndex() > 0 )
            {
                Layer *layer2 = mEditor->layers()->currentLayer( -1 );
                if ( layer2->type() == Layer::BITMAP )
                {
                    targetLayer = layer2;
                    layerNumber = layerNumber - 1;
                }
            }
            BitmapImage *targetImage = ( ( LayerBitmap * )targetLayer )->getLastBitmapImageAtFrame( mEditor->currentFrame(), 0 );

            BitmapImage::floodFill( sourceImage,
                                    targetImage,
                                    getLastPoint().toPoint(),
                                    qRgba( 0, 0, 0, 0 ),
                                    mEditor->color()->frontColor().rgba(),
                                    10 * 10,
                                    true );

            mScribbleArea->setModified( layerNumber, mEditor->currentFrame() );
            mScribbleArea->setAllDirty();
        }
        else if ( layer->type() == Layer::VECTOR )
        {
            mScribbleArea->clearBitmapBuffer();
            VectorImage *vectorImage = ( ( LayerVector * )layer )->getLastVectorImageAtFrame( mEditor->currentFrame(), 0 );

            if ( event->modifiers() == Qt::AltModifier )
            {
                vectorImage->removeArea( getLastPoint() );
            }
            else
            {
                QList<QPointF> path = mStrokePoints;
                if (path.size() < 10) {
                    vectorImage->fill( getLastPoint(),
                                       mEditor->color()->frontColorNumber(),
                                       3.0 / mEditor->view()->scaling() );
                }
                else {
                    vectorImage->fill( path,
                                       mEditor->color()->frontColorNumber(),
                                       10.0 / mEditor->view()->scaling() );
                }
            }
            mScribbleArea->setModified( mEditor->layers()->currentLayerIndex(), mEditor->currentFrame() );
            mScribbleArea->setAllDirty();
        }
    }
    endStroke();
}
void KisToolPolylineBase::requestStrokeEnd()
{
    endStroke();
}
Пример #13
0
    void Stroker::generateStrokeOutlines(SubPath* subPath,
                                         const AffineMatrix& transform)
    {
        if(subPath->getNumberOfPoints() == 0)
            return;

        // Iterate over all segments in subpath
        Segment* segment = subPath->beginSegmentIteration();

        const Path::Segment* pathSegment = segment->getSegment();

        // Clear state varibles and helper paths for this subpath
        numSegments_ = 0;

        innerPoints_.clear();
        outerPoints_.clear();

        // Store transform
        pathTransform_ = transform;
        inversePathTransform_ = transform;
        inversePathTransform_.invert();

        float xScale;
        float yScale;

        pathTransform_.getScale(xScale,yScale);

        scale_.makeIdentity();
        scale_.scale(xScale,yScale);

        inverseScale_ = scale_;
        inverseScale_.invert();

        // Handle the case where we start with
        // a move to separetely for now
        if(pathSegment->command_ == Path::cMoveToAbs ||
            pathSegment->command_ == Path::cMoveToRel)
        {
            updateCurrentPoint(pathSegment);

            firstPoint_ = prevPoint_ = currentPoint_;

            segment = subPath->getNextSegment();
            pathSegment = segment->getSegment();
        }

        // Iterate over sub path and handle all segments
        const Path::Segment* lastSegment = pathSegment;

        while(subPath->hasMoreSegments())
        {

            if(pathSegment->command_ < Path::cQuadBezierToAbs)
                handleLineSegment(segment);

            else if(pathSegment->command_ > Path::cSmoothCubicBezierToRel)
                handleArcSegment(segment);
            else
                handleBezierSegment(segment);

            ++numSegments_;

            segment = subPath->getNextSegment();
            lastSegment = pathSegment;
            pathSegment = segment->getSegment();
        }

        // Join or add ends
        if(lastSegment->command_ == Path::cClosePath)
            joiner_(this,firstPoint_,prevNormal_,firstNormal_);

        else
            endStroke();

    }