diff --git a/.gitignore b/.gitignore index f4c35fb..a9a564c 100644 --- a/.gitignore +++ b/.gitignore @@ -13,6 +13,7 @@ CMakeLists.txt.user* /share/qtcreator/fonts/ /share/qtcreator/generic-highlighter/ /share/qtcreator/qmldesigner/QtProject/ +/build-*/ app_version.h phony.c diff --git a/src/Image/IntelliImage.cpp b/src/Image/IntelliImage.cpp index 74b7891..f5ae7a1 100644 --- a/src/Image/IntelliImage.cpp +++ b/src/Image/IntelliImage.cpp @@ -52,6 +52,16 @@ void IntelliImage::drawPixel(const QPoint &p1, const QColor& color){ painter.drawPoint(p1); } +void IntelliImage::drawPoint(const QPoint &p1, const QColor& color, const int& penWidth){ + // Used to draw on the widget + QPainter painter(&imageData); + + // Set the current settings for the pen + painter.setPen(QPen(color, penWidth, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin)); + // Draw a line from the last registered point to the current + painter.drawPoint(p1); +} + void IntelliImage::drawLine(const QPoint &p1, const QPoint& p2, const QColor& color, const int& penWidth){ // Used to draw on the widget QPainter painter(&imageData); diff --git a/src/Image/IntelliImage.h b/src/Image/IntelliImage.h index 14e9ec2..347cae6 100644 --- a/src/Image/IntelliImage.h +++ b/src/Image/IntelliImage.h @@ -30,6 +30,7 @@ public: //start on top left virtual void drawPixel(const QPoint &p1, const QColor& color); + virtual void drawPoint(const QPoint &p1, const QColor& color, const int& penWidth); virtual void drawLine(const QPoint &p1, const QPoint& p2, const QColor& color, const int& penWidth); virtual void drawPlain(const QColor& color); diff --git a/src/IntelliPhoto.pro b/src/IntelliPhoto.pro index 7d3580d..de708ac 100644 --- a/src/IntelliPhoto.pro +++ b/src/IntelliPhoto.pro @@ -24,6 +24,7 @@ SOURCES += \ IntelliHelper/IntelliHelper.cpp \ Layer/PaintingArea.cpp \ Tool/IntelliTool.cpp \ + Tool/IntelliToolCircle.cpp \ Tool/IntelliToolLine.cpp \ Tool/IntelliToolPen.cpp \ Tool/IntelliToolPlain.cpp \ @@ -38,9 +39,11 @@ HEADERS += \ IntelliHelper/IntelliHelper.h \ Layer/PaintingArea.h \ Tool/IntelliTool.h \ + Tool/IntelliToolCircle.h \ Tool/IntelliToolLine.h \ Tool/IntelliToolPen.h \ - Tool/IntelliToolPlain.h + Tool/IntelliToolPlain.h \ + Tool/intellitoolcircle.h FORMS += \ widget.ui diff --git a/src/Layer/PaintingArea.cpp b/src/Layer/PaintingArea.cpp index 7fff2a9..03f7e9c 100644 --- a/src/Layer/PaintingArea.cpp +++ b/src/Layer/PaintingArea.cpp @@ -13,11 +13,12 @@ #include "Tool/IntelliToolPen.h" #include "Tool/IntelliToolPlain.h" #include "Tool/IntelliToolLine.h" +#include "Tool/IntelliToolCircle.h" PaintingArea::PaintingArea(int maxWidth, int maxHeight, QWidget *parent) :QWidget(parent){ - this->Tool = nullptr; + this->Tool = new IntelliToolCircle(this, &colorPicker); this->setUp(maxWidth, maxHeight); //tetsing this->addLayer(200,200,0,0,ImageType::Shaped_Image); @@ -33,7 +34,7 @@ PaintingArea::PaintingArea(int maxWidth, int maxHeight, QWidget *parent) layerBundle[1].image->drawPlain(QColor(0,255,0,255)); layerBundle[1].alpha=200; - activeLayer=0; + activeLayer=1; } PaintingArea::~PaintingArea(){ diff --git a/src/Tool/IntelliToolCircle.cpp b/src/Tool/IntelliToolCircle.cpp new file mode 100644 index 0000000..7e16e77 --- /dev/null +++ b/src/Tool/IntelliToolCircle.cpp @@ -0,0 +1,80 @@ +#include "IntelliToolCircle.h" +#include "Layer/PaintingArea.h" +#include "QInputDialog" +#include + +IntelliToolCircle::IntelliToolCircle(PaintingArea* Area, IntelliColorPicker* colorPicker) + :IntelliTool(Area, colorPicker){ + this->alphaInner = QInputDialog::getInt(nullptr,"Inner Alpha Value", "Value:", 0,0,255,1); + this->edgeWidth = QInputDialog::getInt(nullptr,"Outer edge width", "Value:", 0,1,255,1); +} + +IntelliToolCircle::~IntelliToolCircle(){ + +} + +void IntelliToolCircle::drawCyrcle(int radius){ + int outer = radius+20; + QColor inner = this->colorPicker->getSecondColor(); + inner.setAlpha(alphaInner); + int yMin, yMax, xMin, xMax; + yMin = Middle.y()-radius; + yMax = Middle.y()+radius; + // x = x0+-sqrt(r2-(y-y0)2) + for(int i=yMin; i<=yMax; i++){ + xMin = Middle.x()-sqrt(pow(radius,2)-pow(i-Middle.y(),2)); + xMax = Middle.x()+sqrt(pow(radius,2)-pow(i-Middle.y(),2)); + this->Canvas->image->drawLine(QPoint(xMin,i), QPoint(xMax,i),inner,1); + } + + //TODO implement circle drawing algorithm + radius = radius +(this->edgeWidth/2.)-0.5; + yMin = (Middle.y()-radius); + yMax = (Middle.y()+radius); + for(int i=yMin; i<=yMax; i++){ + xMin = Middle.x()-sqrt(pow(radius,2)-pow(i-Middle.y(),2)); + xMax = Middle.x()+sqrt(pow(radius,2)-pow(i-Middle.y(),2)); + this->Canvas->image->drawPoint(QPoint(xMin,i), colorPicker->getFirstColor(),edgeWidth); + this->Canvas->image->drawPoint(QPoint(xMax,i), colorPicker->getFirstColor(),edgeWidth); + } + + xMin = (Middle.x()-radius); + xMax = (Middle.x()+radius); + for(int i=xMin; i<=xMax; i++){ + int yMin = Middle.y()-sqrt(pow(radius,2)-pow(i-Middle.x(),2)); + int yMax = Middle.y()+sqrt(pow(radius,2)-pow(i-Middle.x(),2)); + this->Canvas->image->drawPoint(QPoint(i, yMin), colorPicker->getFirstColor(),edgeWidth); + this->Canvas->image->drawPoint(QPoint(i, yMax), colorPicker->getFirstColor(),edgeWidth); + } +} + +void IntelliToolCircle::onMouseRightPressed(int x, int y){ + IntelliTool::onMouseRightPressed(x,y); +} + +void IntelliToolCircle::onMouseRightReleased(int x, int y){ + IntelliTool::onMouseRightReleased(x,y); +} + +void IntelliToolCircle::onMouseLeftPressed(int x, int y){ + IntelliTool::onMouseLeftPressed(x,y); + this->Middle=QPoint(x,y); + int radius = 1; + drawCyrcle(radius); + Canvas->image->calculateVisiblity(); +} + +void IntelliToolCircle::onMouseLeftReleased(int x, int y){ + IntelliTool::onMouseLeftReleased(x,y); +} + +void IntelliToolCircle::onMouseMoved(int x, int y){ + IntelliTool::onMouseMoved(x,y); + if(this->drawing){ + this->Canvas->image->drawPlain(Qt::transparent); + QPoint next(x,y); + int radius = static_cast(sqrt(pow((Middle.x()-x),2)+pow((Middle.y()-y),2))); + drawCyrcle(radius); + } + IntelliTool::onMouseMoved(x,y); +} diff --git a/src/Tool/IntelliToolCircle.h b/src/Tool/IntelliToolCircle.h new file mode 100644 index 0000000..93e7af3 --- /dev/null +++ b/src/Tool/IntelliToolCircle.h @@ -0,0 +1,26 @@ +#ifndef INTELLITOOLCIRCLE_H +#define INTELLITOOLCIRCLE_H +#include "IntelliTool.h" + +#include "QColor" +#include "QPoint" + +class IntelliToolCircle : public IntelliTool{ + void drawCyrcle(int radius); + + QPoint Middle; + int alphaInner; + int edgeWidth; +public: + IntelliToolCircle(PaintingArea* Area, IntelliColorPicker* colorPicker); + virtual ~IntelliToolCircle() override; + + virtual void onMouseRightPressed(int x, int y); + virtual void onMouseRightReleased(int x, int y); + virtual void onMouseLeftPressed(int x, int y); + virtual void onMouseLeftReleased(int x, int y); + + virtual void onMouseMoved(int x, int y); +}; + +#endif // INTELLITOOLCIRCLE_H