added more comments

This commit is contained in:
Sonaion
2020-01-28 10:42:32 +01:00
parent 3a13904eea
commit 2dd527ca27
8 changed files with 170 additions and 729 deletions

View File

@@ -4,7 +4,9 @@
//for unit testing
class UnitTest;
/*!
* \brief The IntelliRenderSettings class which manages the render Settings.
*/
class IntelliRenderSettings
{
friend UnitTest;
@@ -23,6 +25,9 @@ void setFastRendering(bool Updatedsetting);
bool isFastRenderering() const;
private:
/*!
* \brief fastRenderering the state of the project, in relation the the render setting.
*/
bool fastRenderering = true;
};

View File

@@ -1,34 +0,0 @@
#ifndef INTELLIRENDERSETTINGS_H
#define INTELLIRENDERSETTINGS_H
//for unit testing
class UnitTest;
/*!
* \brief The IntelliRenderSettings class which manages the render Settings.
*/
class IntelliRenderSettings
{
friend UnitTest;
public:
IntelliRenderSettings();
/*!
* \brief setFastRendering sets fastRendering to Updatedsetting.
* \param Updatedsetting - Represents the new value for the Fast Rendering Flag.
*/
void setFastRendering(bool Updatedsetting);
/*!
* \brief The getfastRenderer gets the value of the flag for the fastRenderer setting.
* \return Returns true if fastRenderer is active else false
*/
bool isFastRenderering() const;
private:
/*!
* \brief fastRenderering the state of the project, in relation the the render setting.
*/
bool fastRenderering = true;
};
#endif

View File

@@ -3,21 +3,56 @@
//for unit testing
class UnitTest;
/*!
* \brief The IntelliToolsettings class managing the settings of the tools, independent of an existing tool.
*/
class IntelliToolsettings {
friend UnitTest;
public:
/*!
* \brief IntelliToolsettings - basic constructor of the IntelliToolsettings, initializing the basics.
*/
IntelliToolsettings();
/*!
* \brief ~IntelliToolsettings - basic destructor.
*/
virtual ~IntelliToolsettings();
/*!
* \brief getLineWidth returns the width attribute of the line.
* \return returns the width attribute as integer.
*/
int getLineWidth() const;
/*!
* \brief setLineWidth sets the width attribute of the line.
* \param LineWidth - the future width of the line
*/
void setLineWidth(int LineWidth);
/*!
* \brief getInnerAlpha returns the inner alpha value.
* \return returns the inner alpha attribute as integer.
*/
int getInnerAlpha() const;
/*!
* \brief setInnerAlpha sets the inner alpha attribute of the Tool.
* \param innerAlpha - the future inner alpha of the Tool.
*/
void setInnerAlpha(int innerAlpha);
private:
/*!
* \brief lineWidth attribute of a Tool.
*/
int lineWidth;
/*!
* \brief innerAlpha aattribute of a Tool.
*/
int innerAlpha;
};

View File

@@ -1,59 +0,0 @@
#ifndef INTELLITOOLSETTINGS_H
#define INTELLITOOLSETTINGS_H
//for unit testing
class UnitTest;
/*!
* \brief The IntelliToolsettings class managing the settings of the tools, independent of an existing tool.
*/
class IntelliToolsettings {
friend UnitTest;
public:
/*!
* \brief IntelliToolsettings - basic constructor of the IntelliToolsettings, initializing the basics.
*/
IntelliToolsettings();
/*!
* \brief ~IntelliToolsettings - basic destructor.
*/
virtual ~IntelliToolsettings();
/*!
* \brief getLineWidth returns the width attribute of the line.
* \return returns the width attribute as integer.
*/
int getLineWidth() const;
/*!
* \brief setLineWidth sets the width attribute of the line.
* \param LineWidth - the future width of the line
*/
void setLineWidth(int LineWidth);
/*!
* \brief getInnerAlpha returns the inner alpha value.
* \return returns the inner alpha attribute as integer.
*/
int getInnerAlpha() const;
/*!
* \brief setInnerAlpha sets the inner alpha attribute of the Tool.
* \param innerAlpha - the future inner alpha of the Tool.
*/
void setInnerAlpha(int innerAlpha);
private:
/*!
* \brief lineWidth attribute of a Tool.
*/
int lineWidth;
/*!
* \brief innerAlpha aattribute of a Tool.
*/
int innerAlpha;
};
#endif

View File

@@ -326,48 +326,154 @@ void slotActivateLayer(int a);
void slotDeleteActiveLayer();
protected:
/*!
* \brief mousePressEvent handles a mouse pressed event.
* \param event - the specific mouse event.
*/
void mousePressEvent(QMouseEvent*event) override;
/*!
* \brief mouseMoveEvent handles a mouse moved event
* \param event - the specific mouse event.
*/
void mouseMoveEvent(QMouseEvent*event) override;
/*!
* \brief mouseReleaseEvent handles a mouse released event
* \param event - the specific mouse event.
*/
void mouseReleaseEvent(QMouseEvent*event) override;
/*!
* \brief wheelEvent handles a mouse wheel event
* \param event - the specific mouse event.
*/
void wheelEvent(QWheelEvent*event) override;
/*!
* \brief paintEvent handles a painting event
* \param event - the specific paint event.
*/
void paintEvent(QPaintEvent*event) override;
private:
//offset for the displayable
/*!
* \brief offsetXDimension - Offset for drawing the image.
*/
int offsetXDimension;
/*!
* \brief offsetYDimension - Offset for drawing the image.
*/
int offsetYDimension;
/*!
* \brief selectLayerUp moves the active Layer one Up.
*/
void selectLayerUp();
/*!
* \brief selectLayerDown moves the active Layer one Down.
*/
void selectLayerDown();
/*!
* \brief copyActiveTool copys the activ tool [allocated].
* \return returns a allocates copy of the current tool.
*/
IntelliTool* copyActiveTool();
/*!
* \brief Canvas the underlying Image to display on.
*/
QImage* Canvas;
/*!
* \brief ScaledCanvas the Canvas saved for output
*/
QImage ScaledCanvas;
/*!
* \brief maxWidth is the width of the canvas
*/
int maxWidth;
/*!
* \brief maxHeight is the height of the canvas
*/
int maxHeight;
/*!
* \brief isSettingPolygon for checking the state of the drawing.
*/
bool isSettingPolygon = false;
/*!
* \brief renderSettings a class to manage the render settings.
*/
IntelliRenderSettings renderSettings;
/*!
* \brief Tool a class to manage the Tool.
*/
IntelliTool* Tool;
/*!
* \brief guiReference to manage communication with the gui.
*/
IntelliPhotoGui* guiReference;
/*!
* \brief layerBundle a container to save all layers.
*/
std::vector<LayerObject> layerBundle;
/*!
* \brief activeLayer the index of the active Layer.
*/
int activeLayer = -1;
/*!
* \brief drawLayers draws the Layers to the Canvas
* \param forSaving an indecate if drawing for saving.
*/
void drawLayers(bool forSaving = false);
/*!
* \brief createTempTopLayer creates a temporary Layer on top of the Layer.
* \param idx - the Layer which should get a temp Layer.
* \return True if it workes, false otherwise.
*/
bool createTempTopLayer(int idx);
/*!
* \brief updateTools resets the Tools.
*/
void updateTools();
/*!
* \brief history - an array out of containers to save history actions.
*/
std::vector<LayerObject> history[100] = {layerBundle};
/*!
* \brief historyMaxPast a indicator how many steps you can go into the past.
*/
int historyMaxPast = 0;
/*!
* \brief historyMaxPast a indicator how many steps you can go into the future.
*/
int historyMaxFuture = 0;
/*!
* \brief historyPresent a indicator where the present is.
*/
int historyPresent = 0;
/*!
* \brief historyadd adds an past version to the history
*/
void historyadd();
};

View File

@@ -1,481 +0,0 @@
#ifndef PaintingArea_H
#define PaintingArea_H
#include <QColor>
#include <QImage>
#include <QPoint>
#include <QWidget>
#include <QList>
#include <QLabel>
#include "Image/IntelliImage.h"
#include "Image/IntelliRasterImage.h"
#include "Image/IntelliShapedImage.h"
#include "Tool/IntelliTool.h"
#include "IntelliHelper/IntelliColorPicker.h"
//for unit testing
class UnitTest;
class IntelliPhotoGui;
/*!
* \brief The LayerObject struct holds all the information needed to construct a layer
*/
struct LayerObject {
/*!
* \brief image - Stores the imageData of the current LayerObject.
*/
IntelliImage* image;
/*!
* \brief width - Stores the width of a layer in pixels.
*/
int width;
/*!
* \brief height - Stores the height of a layer in pixels.
*/
int height;
/*!
* \brief widthOffset - Stores the number of pixles from the left side of the painting area.
*/
int widthOffset;
/*!
* \brief heightOffset - Stores the number of pixles from the top of the painting area.
*/
int heightOffset;
/*!
* \brief alpha - Stores the alpha value of the layer (default=255).
*/
int alpha = 255;
LayerObject();
LayerObject(const LayerObject& layer);
};
/*!
* \brief The PaintingArea class manages the methods and stores information about the current painting area, which is the currently opened project
*/
class PaintingArea : public QLabel
{
friend UnitTest;
// Declares our class as a QObject which is the base class
// for all Qt objects
// QObjects handle events
Q_OBJECT
friend IntelliTool;
friend IntelliPhotoGui;
public:
/*!
* \brief PaintingArea is the constructor of the PaintingArea class, which initiates the working environment
* \param maxWidth - The maximum amount of pixles that are inside painting area from left to right (default=600px)
* \param maxHeight - The maximum amount of pixles that are inside painting area from top to bottom (default=600px)
* \param parent - The parent window of the main window (default=nullptr)
*/
PaintingArea(int maxWidth = 600, int maxHeight = 600, QWidget*parent = nullptr);
/*!
* \brief This deconstructor is used to clear up the memory and remove the currently active window
*/
~PaintingArea() override;
/*!
* \brief setRenderSettings updates all Images to the new Rendersetting.
* \param isFastRenderingOn is the new given flag for the FastRenderer.
*/
void setRenderSettings(bool isFastRenderingOn);
/*!
* \brief getRenderSettings updates all Images to the new Rendersetting.
* \param isFastRenderingOn is the new given flag for the FastRenderer.
*/
bool getRenderSettings();
/*!
* \brief The open method is used for loading a picture into the current layer.
* \param filePath - Path and Name which are used to determine where the to-be-opened file is stored.
* \return Returns a boolean variable whether the file was successfully opened or not.
*/
bool open(const QString &filePath);
/*!
* \brief The save method is used for exporting the current project as one picture
* \param filePath - Specifies the path and name of the file to create.
* \param fileFormat - Specifies the format of the file to create.
* \return Returns a boolean variable, true if the file was saved successfully, false if not
*/
bool save(const QString &filePath, const char*fileFormat);
/*!
* \brief deleteAllLayers deletes all layers
*/
void deleteAllLayers();
/*!
* \brief The addLayer adds a layer to the current project/ painting area
* \param width - Width of the layer in pixles
* \param height - Height of the layer in pixles
* \param widthOffset - Offset of the layer measured to the left border of the painting area in pixles
* \param heightOffset - Offset of the layer measured to the top border of the painting area in pixles
* \param alpha - Transparence of the layer
* \param type - Defining the ImageType of the new layer
* \return Returns the number of layers in the project
*/
int addLayer(int width, int height, int widthOffset = 0, int heightOffset = 0, int alpha = 255, ImageType type = ImageType::RASTERIMAGE);
/*!
* \brief The addLayerAt adds a layer to the current project/ painting area at a specific position in the layer stack
* \param idx - Index of the position the new layer should be added
* \param width - Width of the layer in pixles
* \param height - Height of the layer in pixles
* \param widthOffset - Offset of the layer measured to the left border of the painting area in pixles
* \param heightOffset - Offset of the layer measured to the top border of the painting area in pixles
* \param type - Defining the ImageType of the new layer
* \return Returns the id of the layer position
*/
int addLayerAt(int idx, int width, int height, int widthOffset = 0, int heightOffset = 0, ImageType type = ImageType::RASTERIMAGE);
/*!
* \brief The deleteLayer method removes a layer at a given idx
* \param idx - The index of the layer to be removed
* \param isTool - Is the flag for when a tool uses this function.
*/
void deleteLayer(int idx, bool isTool = false);
/*!
* \brief The setLayerToActive method marks a specific layer as active
* \param idx - The index of the layer to be active
*/
void setLayerActive(int idx);
/*!
* \brief The setAlphaOfLayer method sets the alpha value of a specific layer
* \param idx - The index of the layer where the change should be applied
* \param alpha - New alpha value of the layer
*/
void setLayerAlpha(int idx, int alpha);
/*!
* \brief setPolygon is used for setting polygondata, it only works on RASTER images
* \param idx - represents the number of the layer with should be transformed
*/
void setPolygon(int idx);
/*!
* \brief The movePositionActive method moves the active layer to certain position
* \param x - The x value the new center of the layer should be at
* \param y - The y value the new center of the layer should be at
*/
void movePositionActive(int x, int y);
/*!
* \brief The moveActiveLayer moves the active layer to a specific position in the layer stack
* \param idx - The index of the new position the layer should be in
*/
void moveActiveLayer(int idx);
/*!
* \brief The colorPickerSetFirstColor calls the QTColorPicker to determine the primary drawing color
*/
void colorPickerSetFirstColor();
/*!
* \brief The colorPickerSetSecondColor calls the QTColorPicker to determine the secondary drawing color
*/
void colorPickerSetSecondColor();
/*!
* \brief The colorPickerSwitchColor swaps the primary color with the secondary drawing color
*/
void colorPickerSwapColors();
/*!
* \brief createPenTool creates a Pen Tool.
*/
void createPenTool();
/*!
* \brief createPlainTool creates a Plain Tool.
*/
void createPlainTool();
/*!
* \brief createLineTool creates a Line Tool.
*/
void createLineTool();
/*!
* \brief createRectangleTool creates a Rectangle Tool.
*/
void createRectangleTool();
/*!
* \brief createCircleTool creates a Circle Tool.
*/
void createCircleTool();
/*!
* \brief createPolygonTool creates a Polygon Tool.
*/
void createPolygonTool();
/*!
* \brief createFloodFillTool creates a Floodfill Tool.
*/
void createFloodFillTool();
/*!
* \brief createGradientTool creates a Gradient Tool.
*/
void createGradientTool();
/*!
* \brief The getWidthOfActive gets the horizontal dimensions of the active layer.
* \return Returns the horizontal pixle count of the active layer.
*/
int getWidthOfActive();
/*!
* \brief The getHeightOfActive gets the vertical dimensions of the active layer.
* \return Returns the vertical pixle count of the active layer.
*/
int getHeightOfActive();
/*!
* \brief getMaxWidth gets the max width of the Canvas.
* \return return the width of the Canvas.
*/
int getMaxWidth();
/*!
* \brief getMaxHeight gets the max height of the Canvas.
* \return return the height of the Canvas.
*/
int getMaxHeight();
/*!
* \brief getTypeOfImageActiveLayer get the type of the active Layer.
* \return returns the image type of the active layer.
*/
ImageType getTypeOfImageActiveLayer();
/*!
* \brief getPolygonDataOfActiveLayer get the polygon data of the active Layer.
* \return return the polygon data of the active Layer.
*/
std::vector<QPoint> getPolygonDataOfActiveLayer();
/*!
* \brief getIndexOfActiveLayer returns the index of athe active Layer.
* \return return the index of the active Layer.
*/
int getIndexOfActiveLayer();
/*!
* \brief getImageOfActiveLayer returns the image of the active Layer.
* \return return the image of the active Layer.
*/
IntelliImage* getImageOfActiveLayer();
/*!
* \brief getImageDataOfActiveLayer used to get the currents active imageData (if there isn't any active layer it return a 10*10 white picture)
* \return return the image as an rgba32bit qImage
*/
QImage getImageDataOfActiveLayer();
/*!
* \brief getLayerBundle returns the real active layerbundle (care!)
* \return the reference of the currentLayerBundle
*/
std::vector<LayerObject>* getLayerBundle();
/*!
* \brief Toolsettings - a class to manage Tool settings.
*/
IntelliToolsettings Toolsettings;
/*!
* \brief colorPicker a class to manage Tool color.
*/
IntelliColorPicker colorPicker;
/*!
* \brief historyGoBack a function to return the previous state of the project.
*/
void historyGoBack();
/*!
* \brief historyGoForward a function to undo the return of the previous state of the project.
*/
void historyGoForward();
/*!
* \brief setCanvasDimensions sets the dimension of the Canvas
* \param maxWidth - the width of the Canvas.
* \param maxHeight - the height of the Canvas.
*/
void setCanvasDimensions(int maxWidth, int maxHeight);
/*!
* \brief drawPixelOntoActive draws a pixel onto the image data of the active Layer.
* \param color - the color of the Pixel, which should be created.
* \param point - the Pixelposition.
*/
void drawPixelOntoActive(QColor color, QPoint point);
/*!
* \brief setPolygonDataToActive sets polygondata to the active Layer.
* \param points - the points of the polygon data.
*/
void setPolygonDataToActive(std::vector<QPoint> points);
public slots:
/*!
* \brief The slotActivateLayer method handles the event of selecting one layer as active
* \param a - idx of the layer to be active
*/
void slotActivateLayer(int a);
/*!
* \brief The slotDeleteActiveLayer method handles the deletion of the active layer
*/
void slotDeleteActiveLayer();
protected:
/*!
* \brief mousePressEvent handles a mouse pressed event.
* \param event - the specific mouse event.
*/
void mousePressEvent(QMouseEvent*event) override;
/*!
* \brief mouseMoveEvent handles a mouse moved event
* \param event - the specific mouse event.
*/
void mouseMoveEvent(QMouseEvent*event) override;
/*!
* \brief mouseReleaseEvent handles a mouse released event
* \param event - the specific mouse event.
*/
void mouseReleaseEvent(QMouseEvent*event) override;
/*!
* \brief wheelEvent handles a mouse wheel event
* \param event - the specific mouse event.
*/
void wheelEvent(QWheelEvent*event) override;
/*!
* \brief paintEvent handles a painting event
* \param event - the specific paint event.
*/
void paintEvent(QPaintEvent*event) override;
private:
/*!
* \brief offsetXDimension - Offset for drawing the image.
*/
int offsetXDimension;
/*!
* \brief offsetYDimension - Offset for drawing the image.
*/
int offsetYDimension;
/*!
* \brief selectLayerUp moves the active Layer one Up.
*/
void selectLayerUp();
/*!
* \brief selectLayerDown moves the active Layer one Down.
*/
void selectLayerDown();
/*!
* \brief copyActiveTool copys the activ tool [allocated].
* \return returns a allocates copy of the current tool.
*/
IntelliTool* copyActiveTool();
/*!
* \brief Canvas the underlying Image to display on.
*/
QImage* Canvas;
/*!
* \brief ScaledCanvas the Canvas saved for output
*/
QImage ScaledCanvas;
/*!
* \brief maxWidth is the width of the canvas
*/
int maxWidth;
/*!
* \brief maxHeight is the height of the canvas
*/
int maxHeight;
/*!
* \brief isSettingPolygon for checking the state of the drawing.
*/
bool isSettingPolygon = false;
/*!
* \brief renderSettings a class to manage the render settings.
*/
IntelliRenderSettings renderSettings;
/*!
* \brief Tool a class to manage the Tool.
*/
IntelliTool* Tool;
/*!
* \brief guiReference to manage communication with the gui.
*/
IntelliPhotoGui* guiReference;
/*!
* \brief layerBundle a container to save all layers.
*/
std::vector<LayerObject> layerBundle;
/*!
* \brief activeLayer the index of the active Layer.
*/
int activeLayer = -1;
/*!
* \brief drawLayers draws the Layers to the Canvas
* \param forSaving an indecate if drawing for saving.
*/
void drawLayers(bool forSaving = false);
/*!
* \brief createTempTopLayer creates a temporary Layer on top of the Layer.
* \param idx - the Layer which should get a temp Layer.
* \return True if it workes, false otherwise.
*/
bool createTempTopLayer(int idx);
/*!
* \brief updateTools resets the Tools.
*/
void updateTools();
/*!
* \brief history - an array out of containers to save history actions.
*/
std::vector<LayerObject> history[100] = {layerBundle};
/*!
* \brief historyMaxPast a indicator how many steps you can go into the past.
*/
int historyMaxPast = 0;
/*!
* \brief historyMaxPast a indicator how many steps you can go into the future.
*/
int historyMaxFuture = 0;
/*!
* \brief historyPresent a indicator where the present is.
*/
int historyPresent = 0;
/*!
* \brief historyadd adds an past version to the history
*/
void historyadd();
};
#endif

View File

@@ -16,13 +16,13 @@ IntelliToolGradient::~IntelliToolGradient(){
void IntelliToolGradient::onMouseLeftPressed(int x, int y){
IntelliTool::onMouseLeftPressed(x,y);
doubleA[0] = static_cast<double>(x);
doubleA[1] = static_cast<double>(y);
A = QPoint(x,y);
B = QPoint(x,y);
VectorAB[0] = 0;
VectorAB[1] = 0;
Canvas->image->drawPixel(A,LineColor);
startPoint_double[0] = static_cast<double>(x);
startPoint_double[1] = static_cast<double>(y);
startPoint = QPoint(x,y);
endPoint = QPoint(x,y);
endPoint_double[0] = 0;
endPoint_double[1] = 0;
Canvas->image->drawPixel(startPoint,LineColor);
}
void IntelliToolGradient::onMouseRightPressed(int x, int y){
@@ -43,15 +43,15 @@ void IntelliToolGradient::onMouseRightReleased(int x, int y){
void IntelliToolGradient::onMouseMoved(int x, int y){
if(this->isDrawing){
hasMoved = true;
B = QPoint(x,y);
VectorAB[0] = static_cast<float>(B.x() - A.x());
VectorAB[1] = static_cast<float>(B.y() - A.y());
NormalVector[0] = VectorAB[1];
NormalVector[1] = (-1*VectorAB[0]);
endPoint = QPoint(x,y);
endPoint_double[0] = static_cast<float>(endPoint.x() - startPoint.x());
endPoint_double[1] = static_cast<float>(endPoint.y() - startPoint.y());
NormalVector[0] = endPoint_double[1];
NormalVector[1] = (-1*endPoint_double[0]);
NormalDotNormal = dotProduct(NormalVector,NormalVector);
this->Canvas->image->drawPlain(Qt::transparent);
computeGradientLayer();
Canvas->image->drawLine(A,B,LineColor,1);
Canvas->image->drawLine(startPoint,endPoint,LineColor,1);
}
IntelliTool::onMouseMoved(x,y);
}
@@ -60,23 +60,23 @@ void IntelliToolGradient::onWheelScrolled(int value){
IntelliTool::onWheelScrolled(value);
}
void IntelliToolGradient::computePixelColor(QPoint Point){
void IntelliToolGradient::computeAndDrawPixelColor(QPoint Point){
double doublePoint[2];
doublePoint[0] = static_cast<double>(Point.x());
doublePoint[1] = static_cast<double>(Point.y());
double doublePointSubA[2];
doublePointSubA[0] = doublePoint[0] - doubleA[0];
doublePointSubA[1] = doublePoint[1] - doubleA[1];
doublePointSubA[0] = doublePoint[0] - startPoint_double[0];
doublePointSubA[1] = doublePoint[1] - startPoint_double[1];
double Perpendicular[2];
double PointSubADotNormal = dotProduct(doublePointSubA,NormalVector);
Perpendicular[0] = doublePoint[0] - (PointSubADotNormal / NormalDotNormal) * NormalVector[0];
Perpendicular[1] = doublePoint[1] - (PointSubADotNormal / NormalDotNormal) * NormalVector[1];
double VectorAPoint[2];
VectorAPoint[0] = static_cast<double>(Perpendicular[0] - doubleA[0]);
VectorAPoint[1] = static_cast<double>(Perpendicular[1] - doubleA[1]);
VectorAPoint[0] = static_cast<double>(Perpendicular[0] - startPoint_double[0]);
VectorAPoint[1] = static_cast<double>(Perpendicular[1] - startPoint_double[1]);
double ratio;
if(((VectorAPoint[0] < 0 && VectorAB[0] < 0) || (VectorAPoint[0] > 0 && VectorAB[0] > 0)) && ((VectorAPoint[1] < 0 && VectorAB[1] < 0) || (VectorAPoint[1] > 0 && VectorAB[1] > 0)))
ratio = lenghtVector(VectorAPoint)/lenghtVector(VectorAB);
if(((VectorAPoint[0] < 0 && endPoint_double[0] < 0) || (VectorAPoint[0] > 0 && endPoint_double[0] > 0)) && ((VectorAPoint[1] < 0 && endPoint_double[1] < 0) || (VectorAPoint[1] > 0 && endPoint_double[1] > 0)))
ratio = lenghtVector(VectorAPoint)/lenghtVector(endPoint_double);
else{
ratio = -1;
}
@@ -122,7 +122,7 @@ void IntelliToolGradient::computeGradientLayer(){
}
for(int i = 0; i < activeLayer->height; i++){
for(int j = 0; j < activeLayer->width; j++){
computePixelColor(QPoint(j,i));
computeAndDrawPixelColor(QPoint(j,i));
}
}
if(switched){

View File

@@ -1,131 +0,0 @@
#include "IntelliToolGradient.h"
#include "Layer/PaintingArea.h"
#include "math.h"
#include <QDebug>
IntelliToolGradient::IntelliToolGradient(PaintingArea* Area, IntelliColorPicker* colorPicker, IntelliToolsettings* Toolsettings)
: IntelliTool(Area, colorPicker, Toolsettings){
this->ActiveType = Tooltype::GRADIENT;
this->LineColor = QColor(0,0,0,255);
this->hasMoved = false;
}
IntelliToolGradient::~IntelliToolGradient(){
IntelliTool::onMouseRightPressed(0,0);
}
void IntelliToolGradient::onMouseLeftPressed(int x, int y){
IntelliTool::onMouseLeftPressed(x,y);
startPoint_double[0] = static_cast<double>(x);
startPoint_double[1] = static_cast<double>(y);
startPoint = QPoint(x,y);
endPoint = QPoint(x,y);
endPoint_double[0] = 0;
endPoint_double[1] = 0;
Canvas->image->drawPixel(startPoint,LineColor);
}
void IntelliToolGradient::onMouseRightPressed(int x, int y){
IntelliTool::onMouseRightPressed(x,y);
}
void IntelliToolGradient::onMouseLeftReleased(int x, int y){
if(hasMoved && this->isDrawing){
computeGradientLayer();
IntelliTool::onMouseLeftReleased(x,y);
}
}
void IntelliToolGradient::onMouseRightReleased(int x, int y){
IntelliTool::onMouseRightReleased(x,y);
}
void IntelliToolGradient::onMouseMoved(int x, int y){
if(this->isDrawing){
hasMoved = true;
endPoint = QPoint(x,y);
endPoint_double[0] = static_cast<float>(endPoint.x() - startPoint.x());
endPoint_double[1] = static_cast<float>(endPoint.y() - startPoint.y());
NormalVector[0] = endPoint_double[1];
NormalVector[1] = (-1*endPoint_double[0]);
NormalDotNormal = dotProduct(NormalVector,NormalVector);
this->Canvas->image->drawPlain(Qt::transparent);
computeGradientLayer();
Canvas->image->drawLine(startPoint,endPoint,LineColor,1);
}
IntelliTool::onMouseMoved(x,y);
}
void IntelliToolGradient::onWheelScrolled(int value){
IntelliTool::onWheelScrolled(value);
}
void IntelliToolGradient::computeAndDrawPixelColor(QPoint Point){
double doublePoint[2];
doublePoint[0] = static_cast<double>(Point.x());
doublePoint[1] = static_cast<double>(Point.y());
double doublePointSubA[2];
doublePointSubA[0] = doublePoint[0] - startPoint_double[0];
doublePointSubA[1] = doublePoint[1] - startPoint_double[1];
double Perpendicular[2];
double PointSubADotNormal = dotProduct(doublePointSubA,NormalVector);
Perpendicular[0] = doublePoint[0] - (PointSubADotNormal / NormalDotNormal) * NormalVector[0];
Perpendicular[1] = doublePoint[1] - (PointSubADotNormal / NormalDotNormal) * NormalVector[1];
double VectorAPoint[2];
VectorAPoint[0] = static_cast<double>(Perpendicular[0] - startPoint_double[0]);
VectorAPoint[1] = static_cast<double>(Perpendicular[1] - startPoint_double[1]);
double ratio;
if(((VectorAPoint[0] < 0 && endPoint_double[0] < 0) || (VectorAPoint[0] > 0 && endPoint_double[0] > 0)) && ((VectorAPoint[1] < 0 && endPoint_double[1] < 0) || (VectorAPoint[1] > 0 && endPoint_double[1] > 0)))
ratio = lenghtVector(VectorAPoint)/lenghtVector(endPoint_double);
else{
ratio = -1;
}
QColor computedColor;
if(ratio < 0){
computedColor = colorPicker->getFirstColor();
}
else if(ratio > 1){
computedColor = colorPicker->getSecondColor();
}
else{
int red;
int green;
int blue;
int alpha;
int red2;
int green2;
int blue2;
int alpha2;
colorPicker->getFirstColor().getRgb(&red,&green,&blue,&alpha);
colorPicker->getSecondColor().getRgb(&red2,&green2,&blue2,&alpha2);
computedColor.setRed(static_cast<int>(ratio * red2 + (1 - ratio) * red));
computedColor.setGreen(static_cast<int>(ratio * green2 + (1 - ratio) * green));
computedColor.setBlue(static_cast<int>(ratio * blue2 + (1 - ratio) * blue));
computedColor.setAlpha(static_cast<int>(ratio * alpha2 + (1 - ratio) * alpha));
}
Canvas->image->drawPixel(Point,computedColor);
}
double IntelliToolGradient::dotProduct(double Vector1[2], double Vector2[2]){
return static_cast<double>(Vector1[0]*Vector2[0]+Vector1[1]*Vector2[1]);
}
double IntelliToolGradient::lenghtVector(double Vector[2]){
return static_cast<double>((sqrt(Vector[0] * Vector[0] + Vector[1] * Vector[1])));
}
void IntelliToolGradient::computeGradientLayer(){
bool switched = false;
if(Canvas->image->isFastRendering()){
switched = true;
Canvas->image->updateRendererSetting(false);
}
for(int i = 0; i < activeLayer->height; i++){
for(int j = 0; j < activeLayer->width; j++){
computeAndDrawPixelColor(QPoint(j,i));
}
}
if(switched){
Canvas->image->updateRendererSetting(true);
}
}