File indexing completed on 2024-04-28 04:18:52

0001 /*
0002 Gwenview: an image viewer
0003 Copyright 2007 Aurélien Gâteau <agateau@kde.org>
0004 
0005 This program is free software; you can redistribute it and/or
0006 modify it under the terms of the GNU General Public License
0007 as published by the Free Software Foundation; either version 2
0008 of the License, or (at your option) any later version.
0009 
0010 This program is distributed in the hope that it will be useful,
0011 but WITHOUT ANY WARRANTY; without even the implied warranty of
0012 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
0013 GNU General Public License for more details.
0014 
0015 You should have received a copy of the GNU General Public License
0016 along with this program; if not, write to the Free Software
0017 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
0018 
0019 */
0020 #include "paintutils.h"
0021 
0022 // STL
0023 #include <cmath>
0024 
0025 // Qt
0026 #include <QPainter>
0027 #include <QPainterPath>
0028 #include <QPixmap>
0029 #include <QRectF>
0030 
0031 namespace Gwenview
0032 {
0033 namespace PaintUtils
0034 {
0035 // Copied from KFileItemDelegate
0036 QPainterPath roundedRectangle(const QRectF &rect, qreal radius)
0037 {
0038     QPainterPath path(QPointF(rect.left(), rect.top() + radius));
0039     path.quadTo(rect.left(), rect.top(), rect.left() + radius, rect.top()); // Top left corner
0040     path.lineTo(rect.right() - radius, rect.top()); // Top side
0041     path.quadTo(rect.right(), rect.top(), rect.right(), rect.top() + radius); // Top right corner
0042     path.lineTo(rect.right(), rect.bottom() - radius); // Right side
0043     path.quadTo(rect.right(), rect.bottom(), rect.right() - radius, rect.bottom()); // Bottom right corner
0044     path.lineTo(rect.left() + radius, rect.bottom()); // Bottom side
0045     path.quadTo(rect.left(), rect.bottom(), rect.left(), rect.bottom() - radius); // Bottom left corner
0046     path.closeSubpath();
0047 
0048     return path;
0049 }
0050 
0051 QPixmap generateFuzzyRect(const QSize &size, const QColor &color, int radius)
0052 {
0053     QPixmap pix(size);
0054     const QColor transparent(0, 0, 0, 0);
0055     pix.fill(transparent);
0056 
0057     QPainter painter(&pix);
0058     painter.setRenderHint(QPainter::Antialiasing, true);
0059 
0060     // Fill middle
0061     painter.fillRect(pix.rect().adjusted(radius, radius, -radius, -radius), color);
0062 
0063     // Corners
0064     QRadialGradient gradient;
0065     gradient.setColorAt(0, color);
0066     gradient.setColorAt(1, transparent);
0067     gradient.setRadius(radius);
0068     QPoint center;
0069 
0070     // Top Left
0071     center = QPoint(radius, radius);
0072     gradient.setCenter(center);
0073     gradient.setFocalPoint(center);
0074     painter.fillRect(0, 0, radius, radius, gradient);
0075 
0076     // Top right
0077     center = QPoint(size.width() - radius, radius);
0078     gradient.setCenter(center);
0079     gradient.setFocalPoint(center);
0080     painter.fillRect(center.x(), 0, radius, radius, gradient);
0081 
0082     // Bottom left
0083     center = QPoint(radius, size.height() - radius);
0084     gradient.setCenter(center);
0085     gradient.setFocalPoint(center);
0086     painter.fillRect(0, center.y(), radius, radius, gradient);
0087 
0088     // Bottom right
0089     center = QPoint(size.width() - radius, size.height() - radius);
0090     gradient.setCenter(center);
0091     gradient.setFocalPoint(center);
0092     painter.fillRect(center.x(), center.y(), radius, radius, gradient);
0093 
0094     // Borders
0095     QLinearGradient linearGradient;
0096     linearGradient.setColorAt(0, color);
0097     linearGradient.setColorAt(1, transparent);
0098 
0099     // Top
0100     linearGradient.setStart(0, radius);
0101     linearGradient.setFinalStop(0, 0);
0102     painter.fillRect(radius, 0, size.width() - 2 * radius, radius, linearGradient);
0103 
0104     // Bottom
0105     linearGradient.setStart(0, size.height() - radius);
0106     linearGradient.setFinalStop(0, size.height());
0107     painter.fillRect(radius, int(linearGradient.start().y()), size.width() - 2 * radius, radius, linearGradient);
0108 
0109     // Left
0110     linearGradient.setStart(radius, 0);
0111     linearGradient.setFinalStop(0, 0);
0112     painter.fillRect(0, radius, radius, size.height() - 2 * radius, linearGradient);
0113 
0114     // Right
0115     linearGradient.setStart(size.width() - radius, 0);
0116     linearGradient.setFinalStop(size.width(), 0);
0117     painter.fillRect(int(linearGradient.start().x()), radius, radius, size.height() - 2 * radius, linearGradient);
0118     return pix;
0119 }
0120 
0121 QColor adjustedHsv(const QColor &color, int deltaH, int deltaS, int deltaV)
0122 {
0123     int hue, saturation, value;
0124     color.getHsv(&hue, &saturation, &value);
0125     return QColor::fromHsv(qBound(0, hue + deltaH, 359), qBound(0, saturation + deltaS, 255), qBound(0, value + deltaV, 255));
0126 }
0127 
0128 QColor alphaAdjustedF(const QColor &color, qreal alphaF)
0129 {
0130     QColor tmp = color;
0131     tmp.setAlphaF(alphaF);
0132     return tmp;
0133 }
0134 
0135 } // namespace
0136 } // namespace