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