void GradientTool::drawGradient(MouseState mouse, QImage *image, QColor from, QColor to)
{
    QPainter painter(image);

    QPoint gradVec = mouse.getPos() -  mouse.getClickedAt();
    float length = std::sqrt(gradVec.x() * gradVec.x() + gradVec.y() * gradVec.y());
    float vecX = gradVec.x() / length;
    float vecY = gradVec.y() / length;
    qsrand(0);

    for(int i(0); i < image->width(); ++i){
        for(int j(0); j < image->height(); ++j){
            QPoint point = QPoint(i, j) - mouse.getClickedAt();
            float val = (float)(point.x() * vecX + point.y() * vecY) / length;

            val = std::min(1.f, std::max(0.f, val));

            if(m_dithering->isChecked()){
                painter.setPen(QPen(m_brushes[(int) round(val * std::pow(2, m_ditheringLevel->value() -1)) * std::pow(2, 5-m_ditheringLevel->value())], 1));
            }
            else{
                if(qrand() %128 < val *128)
                    painter.setPen(QPen(to));
                else
                    painter.setPen(QPen(from));
            }

            painter.drawPoint(i, j);
        }
    }
}