forked from mixxxdj/mixxx
-
Notifications
You must be signed in to change notification settings - Fork 2
/
imgsource.h
120 lines (96 loc) · 3.36 KB
/
imgsource.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
#pragma once
#include <QImage>
#include <QColor>
#include <QString>
#include <QRgb>
#include <QtDebug>
class ImgSource {
public:
virtual ~ImgSource() {};
virtual QImage* getImage(const QString& fileName, double scaleFactor) const = 0;
virtual QColor getCorrectColor(const QColor& c) const { return c; }
virtual void correctImageColors(QImage* p) const { (void)p; };
virtual bool willCorrectColors() const { return false; };
};
class ImgProcessor : public ImgSource {
public:
~ImgProcessor() override {};
inline ImgProcessor(ImgSource* parent) : m_parent(parent) {}
virtual QColor doColorCorrection(const QColor& c) const = 0;
QColor getCorrectColor(const QColor& c) const override {
return doColorCorrection(m_parent->getCorrectColor(c));
}
void correctImageColors(QImage* p) const override { (void)p; }
bool willCorrectColors() const override { return false; }
protected:
ImgSource* m_parent;
};
class ImgColorProcessor : public ImgProcessor {
public:
virtual ~ImgColorProcessor() {};
inline ImgColorProcessor(ImgSource* parent) : ImgProcessor(parent) {}
QImage* getImage(const QString& fileName, double scaleFactor) const override {
QImage* i = m_parent->getImage(fileName, scaleFactor);
correctImageColors(i);
return i;
}
void correctImageColors(QImage* i) const override {
if (i == NULL || i->isNull()) {
return;
}
QColor col;
int bytesPerPixel = 4;
switch(i->format()) {
case QImage::Format_Mono:
case QImage::Format_MonoLSB:
case QImage::Format_Indexed8:
bytesPerPixel = 1;
break;
case QImage::Format_RGB16:
case QImage::Format_RGB555:
case QImage::Format_RGB444:
case QImage::Format_ARGB4444_Premultiplied:
bytesPerPixel = 2;
break;
case QImage::Format_ARGB8565_Premultiplied:
case QImage::Format_RGB666:
case QImage::Format_ARGB6666_Premultiplied:
case QImage::Format_ARGB8555_Premultiplied:
case QImage::Format_RGB888:
bytesPerPixel = 3;
break;
case QImage::Format_ARGB32:
case QImage::Format_ARGB32_Premultiplied:
case QImage::Format_RGB32:
bytesPerPixel = 4;
break;
case QImage::Format_Invalid:
default:
bytesPerPixel = 0;
break;
}
//qDebug() << "ImgColorProcessor working on "
// << img << " bpp: "
// << bytesPerPixel << " format: " << i->format();
if (bytesPerPixel < 4) {
// Handling Indexed color or mono colors requires different logic
qDebug() << "ImgColorProcessor aborting on unsupported color format:"
<< i->format();
return;
}
for (int y = 0; y < i->height(); y++) {
QRgb *line = (QRgb*)i->scanLine(y); // cast the returned pointer to QRgb*
if (line == NULL) {
// Image is invalid.
continue;
}
for (int x = 0; x < i->width(); x++) {
col.setRgba(*line);
col = doColorCorrection(col);
*line = col.rgba();
line++;
}
}
}
bool willCorrectColors() const override { return true; }
};