// draw a single paint dab at the given location void BrushTool::paintAt( QPointF point ) { qDebug() << "Made a single dab at " << point; Layer* layer = mEditor->layers()->currentLayer(); if ( layer->type() == Layer::BITMAP ) { qreal opacity = 1.0f; if (properties.pressure == true) { opacity = mCurrentPressure / 2; } mCurrentWidth = properties.width; qreal brushWidth = mCurrentWidth; BlitRect rect; rect.extend( point.toPoint() ); mScribbleArea->drawBrush( point, brushWidth, properties.feather, mEditor->color()->frontColor(), opacity, properties.useFeather ); int rad = qRound( brushWidth ) / 2 + 2; mScribbleArea->refreshBitmap( rect, rad ); } }
void BrushTool::drawStroke() { StrokeTool::drawStroke(); QList<QPointF> p = m_pStrokeManager->interpolateStroke(); Layer* layer = mEditor->layers()->currentLayer(); if ( layer->type() == Layer::BITMAP ) { for ( int i = 0; i < p.size(); i++ ) { p[ i ] = mEditor->view()->mapScreenToCanvas( p[ i ] ); } qreal opacity = 1.0f; if (properties.pressure == true) { opacity = mCurrentPressure / 2; } mCurrentWidth = properties.width; qreal brushWidth = mCurrentWidth; qreal brushStep = (0.5 * brushWidth) - ((properties.feather/100.0) * brushWidth * 0.5); brushStep = qMax( 1.0, brushStep ); BlitRect rect; QPointF a = mLastBrushPoint; QPointF b = getCurrentPoint(); qreal distance = 4 * QLineF( b, a ).length(); int steps = qRound( distance ) / brushStep; for ( int i = 0; i < steps; i++ ) { QPointF point = mLastBrushPoint + ( i + 1 ) * ( brushStep )* ( b - mLastBrushPoint ) / distance; rect.extend( point.toPoint() ); mScribbleArea->drawBrush( point, brushWidth, properties.feather, mEditor->color()->frontColor(), opacity, properties.useFeather ); if ( i == ( steps - 1 ) ) { mLastBrushPoint = point; } } int rad = qRound( brushWidth ) / 2 + 2; mScribbleArea->paintBitmapBufferRect(rect); mScribbleArea->refreshBitmap( rect, rad ); } else if ( layer->type() == Layer::VECTOR ) { qreal brushWidth = properties.width * mCurrentPressure; int rad = qRound( ( brushWidth / 2 + 2 ) * mEditor->view()->scaling() ); QPen pen( mEditor->color()->frontColor(), brushWidth * mEditor->view()->scaling(), Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin ); if ( p.size() == 4 ) { QPainterPath path( p[ 0 ] ); path.cubicTo( p[ 1 ], p[ 2 ], p[ 3 ] ); mScribbleArea->drawPath( path, pen, Qt::NoBrush, QPainter::CompositionMode_Source ); mScribbleArea->refreshVector( path.boundingRect().toRect(), rad ); } } }
void SmudgeTool::drawStroke() { if ( !m_pScribbleArea->isLayerPaintable() ) return; Layer *layer = m_pEditor->getCurrentLayer(); if (layer == NULL) { return; } BitmapImage *targetImage = ((LayerBitmap *)layer)->getLastBitmapImageAtFrame(m_pEditor->m_nCurrentFrameIndex, 0); StrokeTool::drawStroke(); QList<QPointF> p = m_pStrokeManager->interpolateStroke(currentWidth); for (int i = 0; i < p.size(); i++) { p[i] = m_pScribbleArea->pixelToPoint(p[i]); } qreal opacity = 1.0; qreal brushWidth = currentWidth + 0.0 * properties.feather; qreal offset = qMax(0.0, currentWidth - 0.5 * properties.feather) / brushWidth; //opacity = currentPressure; // todo: Probably not interesting?! //brushWidth = brushWidth * opacity; BlitRect rect; QPointF a = lastBrushPoint; QPointF b = getCurrentPoint(); if (toolMode == 0) // default mode = blur smudge { qreal brushStep = 0.5 * ( currentWidth + properties.feather ) / 40.0; qreal distance = QLineF(b, a).length()*2; brushStep = qMax( 1.0, brushStep * opacity ); //brushStep = 2.0; //currentWidth = properties.width; // here ? int steps = qRound(distance / brushStep); int rad = qRound(brushWidth / 2.0) + 2; QPointF sourcePoint = lastBrushPoint; for (int i = 0; i < steps; i++) { QPointF targetPoint = lastBrushPoint + (i + 1) * (brushStep) * (b - lastBrushPoint) / distance; rect.extend(targetPoint.toPoint()); m_pScribbleArea->blurBrush( targetImage, sourcePoint, targetPoint, brushWidth, offset, opacity); if (i == (steps - 1)) { lastBrushPoint = targetPoint; } sourcePoint = targetPoint; m_pScribbleArea->refreshBitmap(rect, rad); m_pScribbleArea->paintBitmapBuffer(); } } else // hard smudge (liquify) { qreal brushStep = 0.5 * ( currentWidth + properties.feather ) / 80.0; qreal distance = QLineF(b, a).length()/4.0; brushStep = qMax( 1.0, brushStep * opacity ); //currentWidth = properties.width; // here ? int steps = qRound(distance / brushStep); int rad = qRound(brushWidth / 2.0) + 2; QPointF sourcePoint = lastBrushPoint; for (int i = 0; i < steps; i++) { QPointF targetPoint = lastBrushPoint + (i + 1) * (brushStep) * (b - lastBrushPoint) / distance; rect.extend(targetPoint.toPoint()); m_pScribbleArea->liquifyBrush( targetImage, sourcePoint, targetPoint, brushWidth, offset, opacity); if (i == (steps - 1)) { lastBrushPoint = targetPoint; } sourcePoint = targetPoint; m_pScribbleArea->refreshBitmap(rect, rad); m_pScribbleArea->paintBitmapBuffer(); } } }
void SmudgeTool::drawStroke() { if ( !mScribbleArea->isLayerPaintable() ) return; Layer* layer = mEditor->layers()->currentLayer(); if (layer == NULL) { return; } BitmapImage *targetImage = ((LayerBitmap *)layer)->getLastBitmapImageAtFrame(mEditor->currentFrame(), 0); StrokeTool::drawStroke(); QList<QPointF> p = m_pStrokeManager->interpolateStroke(); for (int i = 0; i < p.size(); i++) { p[ i ] = mEditor->view()->mapScreenToCanvas( p[ i ] ); } qreal opacity = 1.0; qreal brushWidth = mCurrentWidth + 0.0 * properties.feather; qreal offset = qMax(0.0, mCurrentWidth - 0.5 * properties.feather) / brushWidth; //opacity = currentPressure; // todo: Probably not interesting?! //brushWidth = brushWidth * opacity; BlitRect rect; QPointF a = mLastBrushPoint; QPointF b = getCurrentPoint(); if (toolMode == 0) // liquify hard (default) { qreal brushStep = 2; qreal distance = QLineF(b, a).length()/2.0; int steps = qRound(distance / brushStep); int rad = qRound(brushWidth / 2.0) + 2; QPointF sourcePoint = mLastBrushPoint; for (int i = 0; i < steps; i++) { QPointF targetPoint = mLastBrushPoint + (i + 1) * (brushStep) * (b - mLastBrushPoint) / distance; rect.extend(targetPoint.toPoint()); mScribbleArea->liquifyBrush( targetImage, sourcePoint, targetPoint, brushWidth, offset, opacity); if (i == (steps - 1)) { mLastBrushPoint = targetPoint; } sourcePoint = targetPoint; mScribbleArea->refreshBitmap(rect, rad); mScribbleArea->paintBitmapBuffer(); } } else // liquify smooth { qreal brushStep = 2.0; qreal distance = QLineF(b, a).length(); int steps = qRound(distance / brushStep); int rad = qRound(brushWidth / 2.0) + 2; QPointF sourcePoint = mLastBrushPoint; for (int i = 0; i < steps; i++) { QPointF targetPoint = mLastBrushPoint + (i + 1) * (brushStep) * (b - mLastBrushPoint) / distance; rect.extend(targetPoint.toPoint()); mScribbleArea->blurBrush( targetImage, sourcePoint, targetPoint, brushWidth, offset, opacity); if (i == (steps - 1)) { mLastBrushPoint = targetPoint; } sourcePoint = targetPoint; mScribbleArea->refreshBitmap(rect, rad); mScribbleArea->paintBitmapBuffer(); } } }
void PencilTool::drawStroke() { StrokeTool::drawStroke(); QList<QPointF> p = strokeManager()->interpolateStroke(); Layer* layer = mEditor->layers()->currentLayer(); if (layer->type() == Layer::BITMAP) { qreal pressure = (properties.pressure) ? mCurrentPressure : 1.0; qreal opacity = (properties.pressure) ? (mCurrentPressure * 0.5) : 1.0; qreal brushWidth = properties.width * pressure; mCurrentWidth = brushWidth; qreal fixedBrushFeather = properties.feather; qreal brushStep = qMax(1.0, (0.5 * brushWidth)); BlitRect rect; QPointF a = mLastBrushPoint; QPointF b = getCurrentPoint(); qreal distance = 4 * QLineF(b, a).length(); int steps = qRound(distance / brushStep); for (int i = 0; i < steps; i++) { QPointF point = mLastBrushPoint + (i + 1) * brushStep * (getCurrentPoint() - mLastBrushPoint) / distance; rect.extend(point.toPoint()); mScribbleArea->drawPencil(point, brushWidth, fixedBrushFeather, mEditor->color()->frontColor(), opacity); if (i == (steps - 1)) { mLastBrushPoint = getCurrentPoint(); } } int rad = qRound(brushWidth) / 2 + 2; mScribbleArea->paintBitmapBufferRect(rect); mScribbleArea->refreshBitmap(rect, rad); } else if (layer->type() == Layer::VECTOR) { properties.useFeather = false; mCurrentWidth = 0; // FIXME: WTF? QPen pen(mEditor->color()->frontColor(), 1, Qt::DotLine, Qt::RoundCap, Qt::RoundJoin); int rad = qRound((mCurrentWidth / 2 + 2) * mEditor->view()->scaling()); if (p.size() == 4) { QPainterPath path(p[0]); path.cubicTo(p[1], p[2], p[3]); mScribbleArea->drawPath(path, pen, Qt::NoBrush, QPainter::CompositionMode_Source); mScribbleArea->refreshVector(path.boundingRect().toRect(), rad); } } }
void BrushTool::drawStroke() { StrokeTool::drawStroke(); QList<QPointF> p = m_pStrokeManager->interpolateStroke(currentWidth); Layer *layer = m_pEditor->getCurrentLayer(); if (layer->type == Layer::BITMAP) { for (int i = 0; i < p.size(); i++) { p[i] = m_pScribbleArea->pixelToPoint(p[i]); } qreal opacity = 1.0; qreal brushWidth = currentWidth + 0.5 * properties.feather; qreal offset = qMax(0.0, currentWidth - 0.5 * properties.feather) / brushWidth; opacity = currentPressure; brushWidth = brushWidth * currentPressure; // if (tabletInUse) { opacity = tabletPressure; } // if (usePressure) { brushWidth = brushWidth * tabletPressure; } qreal brushStep = 0.5 * currentWidth + 0.5 * properties.feather; brushStep = brushStep * currentPressure; // if (usePressure) { brushStep = brushStep * tabletPressure; } brushStep = qMax(1.0, brushStep); currentWidth = properties.width; BlitRect rect; QRadialGradient radialGrad(QPointF(0,0), 0.5 * brushWidth); m_pScribbleArea->setGaussianGradient(radialGrad, m_pEditor->colorManager()->frontColor(), opacity, offset); QPointF a = lastBrushPoint; QPointF b = getCurrentPoint(); // foreach (QSegment segment, calculateStroke(brushWidth)) // { // QPointF a = lastBrushPoint; // QPointF b = m_pScribbleArea->pixelToPoint(segment.second); qreal distance = 4 * QLineF(b, a).length(); int steps = qRound(distance) / brushStep; for (int i = 0; i < steps; i++) { QPointF point = lastBrushPoint + (i + 1) * (brushStep) * (b - lastBrushPoint) / distance; rect.extend(point.toPoint()); m_pScribbleArea->drawBrush( point, brushWidth, offset, m_pEditor->colorManager()->frontColor(), opacity); if (i == (steps - 1)) { lastBrushPoint = point; } } // } int rad = qRound(brushWidth) / 2 + 2; m_pScribbleArea->refreshBitmap(rect, rad); } else if (layer->type == Layer::VECTOR) { QPen pen(Qt::gray, 1, Qt::DashLine, Qt::RoundCap, Qt::RoundJoin); int rad = qRound((currentWidth / 2 + 2) * qAbs(m_pScribbleArea->getTempViewScaleX())); // foreach (QSegment segment, calculateStroke(currentWidth)) // { // QPointF a = segment.first; // QPointF b = segment.second; // m_pScribbleArea->drawLine(a, b, pen, QPainter::CompositionMode_SourceOver); // m_pScribbleArea->refreshVector(QRect(a.toPoint(), b.toPoint()), rad); // } if (p.size() == 4) { QSizeF size(2,2); QPainterPath path(p[0]); path.cubicTo(p[1], p[2], p[3]); m_pScribbleArea->drawPath(path, pen, Qt::NoBrush, QPainter::CompositionMode_Source); m_pScribbleArea->refreshVector(path.boundingRect().toRect(), rad); } } }
void BrushTool::drawStroke() { StrokeTool::drawStroke(); QList<QPointF> p = m_pStrokeManager->interpolateStroke(); Layer* layer = mEditor->layers()->currentLayer(); if ( layer->type() == Layer::BITMAP ) { for ( int i = 0; i < p.size(); i++ ) { p[ i ] = mEditor->view()->mapScreenToCanvas( p[ i ] ); } qreal opacity = 1.0; qreal brushWidth = mCurrentWidth + 0.5 * properties.feather; qreal offset = qMax( 0.0, mCurrentWidth - 0.5 * properties.feather ) / brushWidth; opacity = mCurrentPressure; brushWidth = brushWidth * mCurrentPressure; qreal brushStep = 0.5 * mCurrentWidth + 0.5 * properties.feather; brushStep = brushStep * mCurrentPressure; // if (usePressure) { brushStep = brushStep * tabletPressure; } brushStep = qMax( 1.0, brushStep ); mCurrentWidth = properties.width; BlitRect rect; QRadialGradient radialGrad( QPointF( 0, 0 ), 0.5 * brushWidth ); mScribbleArea->setGaussianGradient( radialGrad, mEditor->color()->frontColor(), opacity, offset ); QPointF a = lastBrushPoint; QPointF b = getCurrentPoint(); // foreach (QSegment segment, calculateStroke(brushWidth)) // { // QPointF a = lastBrushPoint; // QPointF b = m_pScribbleArea->pixelToPoint(segment.second); qreal distance = 4 * QLineF( b, a ).length(); int steps = qRound( distance ) / brushStep; for ( int i = 0; i < steps; i++ ) { QPointF point = lastBrushPoint + ( i + 1 ) * ( brushStep )* ( b - lastBrushPoint ) / distance; rect.extend( point.toPoint() ); mScribbleArea->drawBrush( point, brushWidth, offset, mEditor->color()->frontColor(), opacity ); if ( i == ( steps - 1 ) ) { lastBrushPoint = point; } } int rad = qRound( brushWidth ) / 2 + 2; mScribbleArea->refreshBitmap( rect, rad ); } else if ( layer->type() == Layer::VECTOR ) { qreal brushWidth = properties.width * mCurrentPressure; int rad = qRound( ( brushWidth / 2 + 2 ) * mEditor->view()->scaling() ); QPen pen( mEditor->color()->frontColor(), brushWidth * mEditor->view()->scaling(), Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin ); if ( p.size() == 4 ) { QPainterPath path( p[ 0 ] ); path.cubicTo( p[ 1 ], p[ 2 ], p[ 3 ] ); mScribbleArea->drawPath( path, pen, Qt::NoBrush, QPainter::CompositionMode_Source ); mScribbleArea->refreshVector( path.boundingRect().toRect(), rad ); } } }