Vollständiger Gradient

Achtung!!! Sehr Rechenaufwendig und im Fastrenderer noch nicht ordentlich nutzbar
This commit is contained in:
AshBastian
2020-01-25 21:54:25 +01:00
parent 2432bb0568
commit 9f6fe965ec
6 changed files with 122 additions and 19 deletions

View File

@@ -20,6 +20,7 @@ IntelliPhotoGui::IntelliPhotoGui(){
setIntelliStyle();
// Size the app
resize(600,600);
showMaximized();
setDefaultValues();
}
@@ -241,11 +242,13 @@ void IntelliPhotoGui::slotSetActiveLayer(){
void IntelliPhotoGui::slotUpdateRenderSettingsOn(){
paintingArea->setRenderSettings(true);
FastRendererLabel->setText("Fast Render: On");
UpdateGui();
}
void IntelliPhotoGui::slotUpdateRenderSettingsOff(){
paintingArea->setRenderSettings(false);
FastRendererLabel->setText("Fast Render: Off");
UpdateGui();
}
@@ -299,6 +302,11 @@ void IntelliPhotoGui::slotCreateFloodFillTool(){
paintingArea->createFloodFillTool();
}
void IntelliPhotoGui::slotCreateGradientTool(){
GradientButton->setChecked(true);
paintingArea->createGradientTool();
}
// Open an about dialog
void IntelliPhotoGui::slotAboutDialog(){
// Window title and text to display
@@ -520,6 +528,10 @@ void IntelliPhotoGui::createActions(){
connect(actionCreateFloodFillTool, SIGNAL(triggered()), this, SLOT(slotResetTools()));
connect(actionCreateFloodFillTool, SIGNAL(triggered()), this, SLOT(slotCreateFloodFillTool()));
actionCreateGradientTool = new QAction(tr("&Gradient"),this);
connect(actionCreateGradientTool, SIGNAL(triggered()), this, SLOT(slotResetTools()));
connect(actionCreateGradientTool, SIGNAL(triggered()), this, SLOT(slotCreateGradientTool()));
// Create about action and tie to IntelliPhotoGui::about()
actionAboutDialog = new QAction(tr("&About"), this);
actionAboutDialog->setShortcut(Qt::Key_F2);
@@ -539,6 +551,9 @@ void IntelliPhotoGui::createActions(){
connect(FloodFillButton,SIGNAL(pressed()), this, SLOT(slotResetTools()));
connect(FloodFillButton, SIGNAL(clicked()), this, SLOT(slotCreateFloodFillTool()));
connect(GradientButton, SIGNAL(pressed()), this, SLOT(slotResetTools()));
connect(GradientButton, SIGNAL(clicked()), this, SLOT(slotCreateGradientTool()));
connect(LineButton,SIGNAL(pressed()), this, SLOT(slotResetTools()));
connect(LineButton, SIGNAL(clicked()), this, SLOT(slotCreateLineTool()));
@@ -621,7 +636,8 @@ void IntelliPhotoGui::createMenus(){
//Attach all Tool Creation Actions
toolCreationMenu = new QMenu(tr("&Drawingtools"), this);
toolCreationMenu->addAction(actionCreateCircleTool);
toolCreationMenu->addAction(actionCreateFloodFillTool);
toolCreationMenu->addAction(actionCreateFloodFillTool);
toolCreationMenu->addAction(actionCreateGradientTool);
toolCreationMenu->addAction(actionCreateLineTool);
toolCreationMenu->addAction(actionCreatePenTool);
toolCreationMenu->addAction(actionCreatePlainTool);
@@ -689,6 +705,13 @@ void IntelliPhotoGui::createGui(){
FloodFillButton->setIconSize(Buttonsize);
FloodFillButton->setCheckable(true);
preview = QPixmap(":/Icons/Buttons/icons/icon.png");
GradientButton = new QPushButton();
GradientButton->setFixedSize(Buttonsize);
GradientButton->setIcon(preview);
GradientButton->setIconSize(Buttonsize);
GradientButton->setCheckable(true);
preview = QPixmap(":/Icons/Buttons/icons/line-tool.svg");
LineButton = new QPushButton();
LineButton->setFixedSize(Buttonsize);
@@ -787,6 +810,10 @@ void IntelliPhotoGui::createGui(){
QString String = QString("%1x%2").arg(paintingArea->Canvas->width()).arg(paintingArea->Canvas->height());
dimCanvas->setText(String);
FastRendererLabel = new QLabel();
FastRendererLabel->setFixedSize(Buttonsize.width() * 2 + 15,(Buttonsize.height() * 2) / 3);
FastRendererLabel->setText("Fast Render: On");
ScrollArea = new QScrollArea(this);
ScrollArea->setBackgroundRole(QPalette::Dark);
ScrollArea->setWidget(paintingArea);
@@ -802,6 +829,7 @@ void IntelliPhotoGui::createGui(){
mainLayout->addWidget(PlainButton,3,2,1,1);
mainLayout->addWidget(PolygonButton,3,3,1,1);
mainLayout->addWidget(RectangleButton,4,2,1,1);
mainLayout->addWidget(GradientButton,4,3,1,1);
mainLayout->addWidget(WidthLine,5,2,1,2);
mainLayout->addWidget(EditLineWidth,6,2,1,2);
mainLayout->addWidget(innerAlphaLine,7,2,1,2);
@@ -813,6 +841,7 @@ void IntelliPhotoGui::createGui(){
mainLayout->addWidget(ActiveLayerImageLabel,12,2,1,2);
mainLayout->addWidget(dimActive,13,2,1,2);
mainLayout->addWidget(dimCanvas,14,2,1,2);
mainLayout->addWidget(FastRendererLabel,15,2,1,2);
mainLayout->setHorizontalSpacing(0);
}

View File

@@ -85,6 +85,7 @@ void slotCreateRectangleTool();
void slotCreateCircleTool();
void slotCreatePolygonTool();
void slotCreateFloodFillTool();
void slotCreateGradientTool();
void slotAboutDialog();
@@ -128,6 +129,7 @@ const QSize Buttonsize = QSize(35,35);
//buttons used for gui
QPushButton* CircleButton;
QPushButton* FloodFillButton;
QPushButton* GradientButton;
QPushButton* LineButton;
QPushButton* PenButton;
QPushButton* PlainButton;
@@ -144,6 +146,7 @@ QLabel* WidthLine;
QLabel* innerAlphaLine;
QLabel* ActiveLayerLine;
QLabel* ActiveLayerImageLabel;
QLabel* FastRendererLabel;
//scroll area to display canvas
QScrollArea* ScrollArea;
@@ -192,6 +195,7 @@ QAction* actionCreateRectangleTool;
QAction* actionCreateCircleTool;
QAction* actionCreatePolygonTool;
QAction* actionCreateFloodFillTool;
QAction* actionCreateGradientTool;
// dimension actions
QAction* actionChangeDim;

View File

@@ -39,7 +39,7 @@ LayerObject::LayerObject(const LayerObject& layer){
PaintingArea::PaintingArea(int maxWidth, int maxHeight, QWidget*parent)
: QLabel(parent){
this->Tool = new IntelliToolGradient(this,&colorPicker,&Toolsettings);
this->Tool = nullptr;
this->setLayerDimensions(maxWidth, maxHeight);
activeLayer = -1;
}
@@ -275,6 +275,11 @@ void PaintingArea::createFloodFillTool(){
Tool = new IntelliToolFloodFill(this, &colorPicker, &Toolsettings);
}
void PaintingArea::createGradientTool(){
delete this->Tool;
Tool = new IntelliToolGradient(this, &colorPicker, &Toolsettings);
}
int PaintingArea::getWidthOfActive(){
return this->layerBundle[static_cast<size_t>(activeLayer)].width;
}

View File

@@ -183,6 +183,7 @@ void createRectangleTool();
void createCircleTool();
void createPolygonTool();
void createFloodFillTool();
void createGradientTool();
/*!
* \brief The getWidthOfActive gets the horizontal dimensions of the active layer

View File

@@ -1,15 +1,12 @@
#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->LineColor = QColor(0,0,0,255);
this->hasMoved = false;
A = QPoint(0,0);
B = QPoint(0,3);
VectorAB = QPoint(0,3);
computePixelColor(QPoint(2,1));
}
IntelliToolGradient::~IntelliToolGradient(){
@@ -18,11 +15,14 @@ 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 = QPoint(0,0);
//Canvas->image->drawPlain(colorPicker->getFirstColor);
//Canvas->image->drawPixel(A,LineColor);
VectorAB[0] = 0;
VectorAB[1] = 0;
Canvas->image->drawPlain(colorPicker->getFirstColor());
Canvas->image->drawPixel(A,LineColor);
}
void IntelliToolGradient::onMouseRightPressed(int x, int y){
@@ -30,8 +30,12 @@ void IntelliToolGradient::onMouseRightPressed(int x, int y){
}
void IntelliToolGradient::onMouseLeftReleased(int x, int y){
if(!hasMoved && A != B){
//Canvas->image->drawPlain(colorPicker->getFirstColor);
if(hasMoved && A != B){
for(int i = 0; i < activeLayer->height; i++){
for(int j = 0; j < activeLayer->width; j++){
computePixelColor(QPoint(i,j));
}
}
}
IntelliTool::onMouseLeftReleased(x,y);
}
@@ -43,6 +47,15 @@ void IntelliToolGradient::onMouseRightReleased(int x, int y){
void IntelliToolGradient::onMouseMoved(int x, int y){
hasMoved = true;
B = QPoint(x,y);
VectorAB[0] = static_cast<float>(B.x() - A.x());
VectorAB[1] = static_cast<float>(B.y() - A.y());
this->Canvas->image->drawPlain(Qt::transparent);
for(int i = 0; i < activeLayer->height; i++){
for(int j = 0; j < activeLayer->width; j++){
computePixelColor(QPoint(i,j));
}
}
Canvas->image->drawLine(A,B,LineColor,1);
IntelliTool::onMouseMoved(x,y);
}
@@ -51,11 +64,59 @@ void IntelliToolGradient::onWheelScrolled(int value){
}
void IntelliToolGradient::computePixelColor(QPoint Point){
QPoint NormalVector = QPoint(VectorAB.y(),(-1*VectorAB.x()));
Point = Point - (dotProduct((Point - A),NormalVector) / dotProduct(NormalVector,NormalVector)) * NormalVector;
qDebug() << Point.y();
double NormalVector[2];
NormalVector[0] = VectorAB[1];
NormalVector[1] = (-1*VectorAB[0]);
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];
double Perpendicular[2];
double PointSubADotNormal = dotProduct(doublePointSubA,NormalVector);
double NormalDotNormal = dotProduct(NormalVector,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]);
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);
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);
}
float IntelliToolGradient::dotProduct(QPoint Vector1, QPoint Vector2){
return static_cast<float>(Vector1.x()*Vector2.x()+Vector1.y()*Vector2.y());
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>((std::sqrt(Vector[0] * Vector[0] + Vector[1] * Vector[1])));
}

View File

@@ -6,7 +6,8 @@ class IntelliToolGradient : public IntelliTool{
private:
QPoint A;
QPoint B;
QPoint VectorAB;
double VectorAB[2];
double doubleA[2];
QColor LineColor;
bool hasMoved;
@@ -58,7 +59,9 @@ public:
void computePixelColor(QPoint Point);
float dotProduct(QPoint Vector1, QPoint Vector2);
double dotProduct(double Vector1[2], double Vector2[2]);
double lenghtVector(double Vector[2]);
};
#endif // INTELLITOOLGRADIENT_H