00001
00002
00003
00004
00005
00006
00007 #include "ColorConstants.h"
00008 #include "ColorFilter.h"
00009 #include "ColorFilterSettings.h"
00010 #include "EngaugeAssert.h"
00011 #include "Logger.h"
00012 #include <QPainter>
00013 #include <QPixmap>
00014 #include "ViewSegmentFilter.h"
00015
00016 const QColor COLOR_FOR_BRUSH_DISABLED (Qt::gray);
00017
00018 ViewSegmentFilter::ViewSegmentFilter(QWidget *parent) :
00019 QLabel (parent),
00020 m_filterIsDefined (false),
00021 m_rgbBackground (QColor (Qt::white)),
00022 m_enabled (true)
00023 {
00024
00025 }
00026
00027 QColor ViewSegmentFilter::colorFromSetting (ColorFilterMode coloFilterMode,
00028 int foreground,
00029 int hue,
00030 int intensity,
00031 int saturation,
00032 int value) const
00033 {
00034 int r = 0, g = 0, b = 0;
00035
00036 switch (coloFilterMode)
00037 {
00038 case COLOR_FILTER_MODE_FOREGROUND:
00039 {
00040 double s = (double) (foreground - FOREGROUND_MIN) / (double) (FOREGROUND_MAX - FOREGROUND_MIN);
00041 if (qGray (m_rgbBackground.rgb ()) < 127) {
00042
00043 r = s * 255;
00044 g = s * 255;
00045 b = s * 255;
00046 } else {
00047
00048 r = (1.0 - s) * 255;
00049 g = (1.0 - s) * 255;
00050 b = (1.0 - s) * 255;
00051 }
00052 }
00053 break;
00054
00055 case COLOR_FILTER_MODE_HUE:
00056 {
00057
00058
00059 int HUE_THRESHOLD_LOW = 0.666 * HUE_MIN + 0.333 * HUE_MAX;
00060 int HUE_THRESHOLD_HIGH = 0.333 * HUE_MIN + 0.666 * HUE_MAX;
00061
00062 if (hue < HUE_THRESHOLD_LOW) {
00063
00064 double s = (double) (hue - HUE_MIN) / (double) (HUE_THRESHOLD_LOW - HUE_MIN);
00065 r = (1.0 - s) * 255;
00066 g = s * 255;
00067 } else if (hue < HUE_THRESHOLD_HIGH) {
00068
00069 double s = (double) (hue - HUE_THRESHOLD_LOW) / (double) (HUE_THRESHOLD_HIGH - HUE_THRESHOLD_LOW);
00070 g = (1.0 - s) * 255;
00071 b = s * 255;
00072 } else {
00073
00074 double s = (double) (hue - HUE_THRESHOLD_HIGH) / (double) (HUE_MAX - HUE_THRESHOLD_HIGH);
00075 b = (1.0 - s) * 255;
00076 r = s * 255;
00077 }
00078 }
00079 break;
00080
00081 case COLOR_FILTER_MODE_INTENSITY:
00082 {
00083
00084
00085 double s = (double) (intensity - INTENSITY_MIN) / (double) (INTENSITY_MAX - INTENSITY_MIN);
00086 r = s * 255;
00087 g = s * 255;
00088 b = s * 255;
00089 }
00090 break;
00091
00092 case COLOR_FILTER_MODE_SATURATION:
00093 {
00094
00095
00096 double s = (double) (saturation - SATURATION_MIN) / (double) (SATURATION_MAX - SATURATION_MIN);
00097 r = 255;
00098 g = (1.0 - s) * 255;
00099 b = (1.0 - s) * 255;
00100 }
00101 break;
00102
00103 case COLOR_FILTER_MODE_VALUE:
00104 {
00105
00106
00107 double s = (double) (value - VALUE_MIN) / (double) (VALUE_MAX - VALUE_MIN);
00108 r = s * 255;
00109 g = 0;
00110 b = 0;
00111 }
00112 break;
00113
00114 default:
00115 ENGAUGE_ASSERT (false);
00116 }
00117
00118 if (!m_enabled) {
00119
00120
00121 int rgbAverage = (r + g + b) / 3;
00122 r = rgbAverage;
00123 g = rgbAverage;
00124 b = rgbAverage;
00125 }
00126
00127 return QColor (r, g, b);
00128 }
00129
00130 QColor ViewSegmentFilter::colorHigh () const
00131 {
00132 if (m_enabled) {
00133 return colorFromSetting (m_colorFilterSettings.colorFilterMode (),
00134 m_colorFilterSettings.foregroundHigh (),
00135 m_colorFilterSettings.hueHigh (),
00136 m_colorFilterSettings.intensityHigh(),
00137 m_colorFilterSettings.saturationHigh(),
00138 m_colorFilterSettings.valueHigh());
00139 } else {
00140 return QColor (COLOR_FOR_BRUSH_DISABLED);
00141 }
00142 }
00143
00144 QColor ViewSegmentFilter::colorLow () const
00145 {
00146 if (m_enabled) {
00147 return colorFromSetting (m_colorFilterSettings.colorFilterMode (),
00148 m_colorFilterSettings.foregroundLow (),
00149 m_colorFilterSettings.hueLow (),
00150 m_colorFilterSettings.intensityLow(),
00151 m_colorFilterSettings.saturationLow(),
00152 m_colorFilterSettings.valueLow());
00153 } else {
00154 return QColor (COLOR_FOR_BRUSH_DISABLED);
00155 }
00156 }
00157
00158 void ViewSegmentFilter::paintEvent(QPaintEvent * )
00159 {
00160 QPainter painter(this);
00161
00162 if (m_filterIsDefined) {
00163
00164
00165 QLinearGradient gradient (0, height()/2, width(), height()/2);
00166
00167
00168 gradient.setColorAt (0.0, colorLow ());
00169 gradient.setColorAt (1.0, colorHigh ());
00170 painter.setBrush (gradient);
00171
00172
00173 painter.setPen (Qt::NoPen);
00174
00175 painter.drawRect (0, 0, width(), height());
00176
00177 } else {
00178
00179 painter.fillRect (0, 0, width (), height (), QBrush (COLOR_FOR_BRUSH_DISABLED));
00180
00181 }
00182 }
00183
00184 void ViewSegmentFilter::setColorFilterSettings (const ColorFilterSettings &colorFilterSettings,
00185 const QPixmap &pixmap)
00186 {
00187 LOG4CPP_INFO_S ((*mainCat)) << "ViewSegmentFilter::setColorFilterSettings";
00188
00189 m_colorFilterSettings = colorFilterSettings;
00190 m_filterIsDefined = true;
00191
00192
00193 ColorFilter filter;
00194 QImage img = pixmap.toImage();
00195 m_rgbBackground = filter.marginColor(&img);
00196
00197
00198 update();
00199 }
00200
00201 void ViewSegmentFilter::setEnabled (bool enabled)
00202 {
00203 LOG4CPP_INFO_S ((*mainCat)) << "ViewSegmentFilter::setEnabled"
00204 << " enabled=" << (enabled ? "true" : "false");
00205
00206 m_enabled = enabled;
00207
00208
00209 update();
00210 }
00211
00212 void ViewSegmentFilter::unsetColorFilterSettings ()
00213 {
00214 m_filterIsDefined = false;
00215
00216
00217 update();
00218 }