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;
}