Source Code (Use browser search to find items of interest.)
Class Index
kimageshop'AirBrushTool (./koffice/kimageshop/tools/kis_tool_airbrush.h:30)
class AirBrushTool : public KisTool
{
public:
AirBrushTool(KisDoc *doc, KisView *view, const KisBrush *_brush);
~AirBrushTool();
QString toolName() { return QString("AirBrushTool"); }
void setBrush(const KisBrush *_brush);
bool paint(QPoint pos);
public slots:
virtual void mousePress(QMouseEvent*);
virtual void mouseMove(QMouseEvent*);
virtual void mouseRelease(QMouseEvent*);
protected:
QPoint m_dragStart;
bool m_dragging;
const KisBrush *m_pBrush;
float m_dragdist;
};
kimageshop'AirBrushTool::AirBrushTool() (./koffice/kimageshop/tools/kis_tool_airbrush.cc:29)
AirBrushTool::AirBrushTool(KisDoc *doc, KisView *view, const KisBrush *_brush)
:KisTool(doc, view)
{
m_dragging = false;
m_Cursor = KisCursor::brushCursor();
m_pBrush = _brush;
m_dragdist = 0;
}
kimageshop'AirBrushTool::~AirBrushTool() (./koffice/kimageshop/tools/kis_tool_airbrush.cc:38)
AirBrushTool::~AirBrushTool() {}
kimageshop'AirBrushTool::setBrush() (./koffice/kimageshop/tools/kis_tool_airbrush.cc:40)
void AirBrushTool::setBrush(const KisBrush *_brush)
{
m_pBrush = _brush;
}
kimageshop'AirBrushTool::mousePress() (./koffice/kimageshop/tools/kis_tool_airbrush.cc:45)
void AirBrushTool::mousePress(QMouseEvent *e)
{
KisImage * img = m_pDoc->current();
if (!img)
return;
if (e->button() != QMouseEvent::LeftButton)
return;
if( !img->getCurrentLayer()->visible() )
return;
m_dragging = true;
m_dragStart = e->pos();
m_dragdist = 0;
paint(e->pos());
QRect updateRect(e->pos() - m_pBrush->hotSpot(), m_pBrush->size());
img->markDirty(updateRect);
}
kimageshop'AirBrushTool::paint() (./koffice/kimageshop/tools/kis_tool_airbrush.cc:67)
bool AirBrushTool::paint(QPoint pos)
{
KisImage * img = m_pDoc->current();
KisLayer *lay = img->getCurrentLayer();
if (!img) return false;
if (!lay) return false;
if (!m_pBrush) return false;
// FIXME: Implement this for non-RGB modes.
if (!img->colorMode() == cm_RGB
&& !img->colorMode() == cm_RGBA)
return false;
int startx = (pos - m_pBrush->hotSpot()).x();
int starty = (pos - m_pBrush->hotSpot()).y();
QRect clipRect(startx, starty, m_pBrush->width(), m_pBrush->height());
if (!clipRect.intersects(img->getCurrentLayer()->imageExtents()))
return false;
clipRect = clipRect.intersect(img->getCurrentLayer()->imageExtents());
int sx = clipRect.left() - startx;
int sy = clipRect.top() - starty;
int ex = clipRect.right() - startx;
int ey = clipRect.bottom() - starty;
uchar *sl;
uchar bv, invbv;
uchar r, g, b, a;
int v;
int red = m_pView->fgColor().R();
int green = m_pView->fgColor().G();
int blue = m_pView->fgColor().B();
bool alpha = (img->colorMode() == cm_RGBA);
for (int y = sy; y <= ey; y++)
{
sl = m_pBrush->scanline(y);
for (int x = sx; x <= ex; x++)
{
r = lay->pixel(0, startx + x, starty + y);
g = lay->pixel(1, startx + x, starty + y);
b = lay->pixel(2, startx + x, starty + y);
bv = *(sl + x);
if (bv == 0) continue;
invbv = 255 - bv;
b = ((blue * bv) + (b * invbv))/255;
g = ((green * bv) + (g * invbv))/255;
r = ((red * bv) + (r * invbv))/255;
lay->setPixel(0, startx + x, starty + y, r);
lay->setPixel(1, startx + x, starty + y, g);
lay->setPixel(2, startx + x, starty + y, b);
if (alpha)
{
a= lay->pixel(3, startx + x, starty + y);
v = a + bv;
if (v < 0 ) v = 0;
if (v > 255 ) v = 255;
a = (uchar) v;
lay->setPixel(3, startx + x, starty + y, a);
}
}
}
return true;
}
kimageshop'AirBrushTool::mouseMove() (./koffice/kimageshop/tools/kis_tool_airbrush.cc:144)
void AirBrushTool::mouseMove(QMouseEvent *e)
{
KisImage * img = m_pDoc->current();
if (!img) return;
int spacing = m_pBrush->spacing();
if (spacing <= 0) spacing = 1;
if(m_dragging)
{
if( !img->getCurrentLayer()->visible() )
return;
KisVector end(e->x(), e->y());
KisVector start(m_dragStart.x(), m_dragStart.y());
KisVector dragVec = end - start;
float saved_dist = m_dragdist;
float new_dist = dragVec.length();
float dist = saved_dist + new_dist;
if ((int)dist < spacing)
{
m_dragdist += new_dist; // save for next moveevent
m_dragStart = e->pos();
return;
}
else
m_dragdist = 0; // reset
dragVec.normalize();
KisVector step = start;
while (dist >= spacing)
{
if (saved_dist > 0)
{
step += dragVec * (spacing-saved_dist);
saved_dist -= spacing;
}
else
step += dragVec * spacing;
QPoint p(step.x(), step.y());
if (paint(p))
img->markDirty(QRect(p - m_pBrush->hotSpot(), m_pBrush->size()));
dist -= spacing;
}
if (dist > 0)
m_dragdist = dist; //save for next moveevent
m_dragStart = e->pos();
}
}
kimageshop'AirBrushTool::mouseRelease() (./koffice/kimageshop/tools/kis_tool_airbrush.cc:202)
void AirBrushTool::mouseRelease(QMouseEvent *e)
{
if (e->button() != LeftButton)
return;
m_dragging = false;
}