void SprayBrush::paintDistanceMap(KisPaintDeviceSP dev, const KisPaintInformation &info, const KoColor &painterColor){ KisRandomAccessor accessor = dev->createRandomAccessor(0, 0); KoColor color = painterColor; qreal posX = info.pos().x(); qreal posY = info.pos().y(); qreal opacity = 255; for (int y = -m_radius; y <= m_radius; y++){ for (int x = -m_radius; x <= m_radius; x++){ //opacity = sqrt(y*y + x*x) / m_radius; opacity = (y*y + x*x) / (m_radius * m_radius); opacity = 1.0 - opacity; opacity *= m_scale; if (opacity < 0) continue; if (opacity > 1.0) opacity = 1.0; if ( (y*y + x*x) <= (m_radius * m_radius) ) { color.setOpacity( opacity * 255); accessor.moveTo(x + posX, y + posY); memcpy( accessor.rawData(), color.data(), dev->colorSpace()->pixelSize() ); } } } }
void CurveBrush::putPixel(QPointF pos, KoColor &color) { int ipx = int (pos.x()); int ipy = int (pos.y()); qreal fx = pos.x() - ipx; qreal fy = pos.y() - ipy; qreal btl = (1 - fx) * (1 - fy); qreal btr = (fx) * (1 - fy); qreal bbl = (1 - fx) * (fy); qreal bbr = (fx) * (fy); color.setOpacity(btl); m_writeAccessor->moveTo(ipx , ipy); if (cs->opacityU8(m_writeAccessor->rawData()) < color.opacityU8()) { memcpy(m_writeAccessor->rawData(), color.data(), m_pixelSize); } color.setOpacity(btr); m_writeAccessor->moveTo(ipx + 1, ipy); if (cs->opacityU8(m_writeAccessor->rawData()) < color.opacityU8()) { memcpy(m_writeAccessor->rawData(), color.data(), m_pixelSize); } color.setOpacity(bbl); m_writeAccessor->moveTo(ipx, ipy + 1); if (cs->opacityU8(m_writeAccessor->rawData()) < color.opacityU8()) { memcpy(m_writeAccessor->rawData(), color.data(), m_pixelSize); } color.setOpacity(bbr); m_writeAccessor->moveTo(ipx + 1, ipy + 1); if (cs->opacityU8(m_writeAccessor->rawData()) < color.opacityU8()) { memcpy(m_writeAccessor->rawData(), color.data(), m_pixelSize); } }
bool pick(KisPaintDeviceSP dev, const QPoint& pos, KoColor *color) { KIS_ASSERT(dev); KoColor pickedColor; dev->pixel(pos.x(), pos.y(), &pickedColor); pickedColor.convertTo(dev->compositionSourceColorSpace()); bool validColorPicked = pickedColor.opacityU8() != OPACITY_TRANSPARENT_U8; if (validColorPicked) { pickedColor.setOpacity(OPACITY_OPAQUE_U8); *color = pickedColor; } return validColorPicked; }
void HairyBrush::opacityDepletion(Bristle* bristle, KoColor& bristleColor, qreal pressure, qreal inkDeplation) { qreal opacity = OPACITY_OPAQUE_F; if (m_properties->useWeights) { opacity = qBound(0.0, (pressure * m_properties->pressureWeight) + (bristle->length() * m_properties->bristleLengthWeight) + (bristle->inkAmount() * m_properties->bristleInkAmountWeight) + ((1.0 - inkDeplation) * m_properties->inkDepletionWeight),1.0); } else { opacity = bristle->length() * bristle->inkAmount(); } bristleColor.setOpacity(opacity); }
void SprayBrush::paintMetaballs(KisPaintDeviceSP dev, const KisPaintInformation &info, const KoColor &painterColor) { // TODO: make adjustable? qreal MIN_TRESHOLD = m_mintresh; qreal MAX_TRESHOLD = m_maxtresh; // dbgPlugins << "MAX " << MAX_TRESHOLD; // dbgPlugins << "MIN " << MIN_TRESHOLD; KoColor color = painterColor; qreal posX = info.pos().x(); qreal posY = info.pos().y(); //int points = m_coverage * (m_radius * m_radius * M_PI); qreal ballRadius = m_width * 0.5; // generate metaballs QList<Metaball> list; for (int i = 0; i < m_particlesCount ; i++){ qreal x = (2 * drand48() * m_radius) - m_radius; qreal y = (2 * drand48() * m_radius) - m_radius; list.append( Metaball( x, y , drand48() * ballRadius) ); } // paint it KisRandomAccessor accessor = dev->createRandomAccessor(0, 0); qreal sum = 0.0; m_computeArea.translate( -qRound(posX), -qRound(posY) ); for (int y = m_computeArea.y(); y <= m_computeArea.height(); y++){ for (int x = m_computeArea.x() ; x <= m_computeArea.width(); x++){ sum = 0.0; for (int i = 0; i < m_particlesCount; i++){ sum += list[i].equation(x, y ); } if (sum >= MIN_TRESHOLD && sum <= MAX_TRESHOLD){ if (sum < 0.0) sum = 0.0; if (sum > 1.0) sum = 1.0; color.setOpacity(OPACITY_OPAQUE * sum); accessor.moveTo( x + posX ,y + posY ); memcpy(accessor.rawData(), color.data(), dev->colorSpace()->pixelSize() ); } } } m_computeArea.translate( qRound(posX), qRound(posY) ); #if 0 KisPainter dabPainter(dev); dabPainter.setFillColor(color); dabPainter.setPaintColor(color); dabPainter.setFillStyle(KisPainter::FillStyleForegroundColor); for (int i = 0; i < m_particlesCount; i++){ qreal x = list[i].x() + posX; qreal y = list[i].y() + posY; dabPainter.paintEllipse(x, y, list[i].radius() * 2,list[i].radius() * 2); } #endif }