svgui  1.9
IconLoader.cpp
Go to the documentation of this file.
1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
2 
3 /*
4  Sonic Visualiser
5  An audio file viewer and annotation editor.
6  Centre for Digital Music, Queen Mary, University of London.
7  This file copyright 2007 QMUL.
8 
9  This program is free software; you can redistribute it and/or
10  modify it under the terms of the GNU General Public License as
11  published by the Free Software Foundation; either version 2 of the
12  License, or (at your option) any later version. See the file
13  COPYING included with this distribution for more information.
14 */
15 
16 #include "IconLoader.h"
17 
18 #include <QPixmap>
19 #include <QApplication>
20 #include <QPainter>
21 #include <QPalette>
22 
23 static const char *autoInvertExceptions[] = {
24  // These are the icons that look OK in their default colours, even
25  // in a colour scheme with a black background. (They may also be
26  // icons that would look worse if we tried to auto-invert them.)
27  // If we have icons that look bad when auto-inverted but that are
28  // not suitable for use without being inverted, we'll need to
29  // supply inverted versions -- the loader will load xx_inverse.png
30  // in preference to xx.png if a dark background is found.)
31  "fileclose",
32  "filenew-22",
33  "filenew",
34  "fileopen-22",
35  "fileopen",
36  "fileopenaudio",
37  "fileopensession",
38  "filesave-22",
39  "filesave",
40  "filesaveas-22",
41  "filesaveas",
42  "help",
43  "editcut",
44  "editcopy",
45  "editpaste",
46  "editdelete",
47  "exit",
48  "zoom-fit",
49  "zoom-in",
50  "zoom-out",
51  "zoom"
52 };
53 
54 QIcon
55 IconLoader::load(QString name)
56 {
57  QPixmap pmap(loadPixmap(name));
58  if (pmap.isNull()) return QIcon();
59  else return QIcon(pmap);
60 }
61 
62 QPixmap
64 {
65  QColor bg = QApplication::palette().window().color();
66  if (bg.red() + bg.green() + bg.blue() > 384) { // light background
67  QPixmap pmap(QString(":icons/%1").arg(name));
68  if (pmap.isNull()) {
69  pmap = QPixmap(QString(":icons/%1.png").arg(name));
70  }
71  return pmap;
72  }
73 
74  QPixmap pmap(QString(":icons/%1").arg(name));
75  if (pmap.isNull()) {
76  pmap = QPixmap(QString(":icons/%1_inverse.png").arg(name));
77  if (pmap.isNull()) {
78  pmap = QPixmap(QString(":icons/%1.png").arg(name));
79  }
80  }
81  if (pmap.isNull()) return pmap;
82 
83  for (int i = 0; i < int(sizeof(autoInvertExceptions)/
84  sizeof(autoInvertExceptions[0])); ++i) {
85  if (autoInvertExceptions[i] == name) {
86  return pmap;
87  }
88  }
89 
90  // No suitable inverted icon found for black background; try to
91  // auto-invert the default one
92 
93  QImage img = pmap.toImage().convertToFormat(QImage::Format_ARGB32);
94 
95  for (int y = 0; y < img.height(); ++y) {
96  for (int x = 0; x < img.width(); ++x) {
97 
98  QRgb rgba = img.pixel(x, y);
99  QColor colour = QColor
100  (qRed(rgba), qGreen(rgba), qBlue(rgba), qAlpha(rgba));
101 
102  int alpha = colour.alpha();
103  if (colour.saturation() < 5 && colour.alpha() > 10) {
104  colour.setHsv(colour.hue(),
105  colour.saturation(),
106  255 - colour.value());
107  colour.setAlpha(alpha);
108  img.setPixel(x, y, colour.rgba());
109  }
110  }
111  }
112 
113  pmap = QPixmap::fromImage(img);
114  return pmap;
115 }
116 
static const char * autoInvertExceptions[]
Definition: IconLoader.cpp:23
QPixmap loadPixmap(QString name)
Definition: IconLoader.cpp:63
QIcon load(QString name)
Definition: IconLoader.cpp:55