moved kdeaccessibility kdeaddons kdeadmin kdeartwork kdebindings kdeedu kdegames...
[kdeedu.git] / kstars / kstars / conbridlg.cpp
blob57bb84c7a3e2ca4981873bea3040c27db2f0b9d7
1 /***************************************************************************
2 conbridlg.h - Contrast/Brightness Dialog
3 -------------------
4 begin : Fri Feb 6th 2004
5 copyright : (C) 2004 by Jasem Mutlaq
6 email : mutlaqja@ikarustech.com
7 ***************************************************************************/
9 /***************************************************************************
10 * *
11 * This program is free software; you can redistribute it and/or modify *
12 * it under the terms of the GNU General Public License as published by *
13 * the Free Software Foundation; either version 2 of the License, or *
14 * (at your option) any later version. *
15 * *
16 * *
17 ***************************************************************************/
19 #include <klocale.h>
20 #include <kimageeffect.h>
21 #include <kdebug.h>
23 #include <qslider.h>
24 #include <qimage.h>
25 #include <qdatetime.h>
26 #include <knuminput.h>
28 #include <stdlib.h>
30 #include "contrastbrightnessgui.h"
31 #include "conbridlg.h"
32 #include "fitsviewer.h"
33 #include "fitsimage.h"
35 #define REFRESH 500
37 //TODO find a better and faster way to implement this, this operation can be memory and CPU intensive.
39 ContrastBrightnessDlg::ContrastBrightnessDlg(QWidget *parent) :
40 KDialogBase(KDialogBase::Plain, i18n( "Brightness/Contrast" ), Ok|Cancel, Ok, parent )
43 float pixdiff, datadiff;
44 contrast = brightness = 0;
45 viewer = (FITSViewer *) parent;
46 displayImage = viewer->image->displayImage;
47 tempImage = new QImage(displayImage->copy());
48 width = displayImage->width();
49 height = displayImage->height();
51 datadiff = 255;
52 pixdiff = viewer->stats.max - viewer->stats.min;
53 offs = - (viewer->stats.min * datadiff / pixdiff);
54 scale = datadiff / pixdiff;
56 ConBriDlg = new ConBriForm(this);
57 if (!ConBriDlg) return;
59 localImgBuffer = (float *) malloc (width * height * sizeof(float));
60 if (!localImgBuffer)
62 kdDebug() << "Not enough memory for local image buffer" << endl;
63 return;
66 memcpy(localImgBuffer, viewer->imgBuffer, width * height * sizeof(float));
68 setMainWidget(ConBriDlg);
69 show();
71 connect(ConBriDlg->conSlider, SIGNAL( valueChanged(int)), this, SLOT (setContrast(int )));
72 connect(ConBriDlg->briSlider, SIGNAL( valueChanged(int)), this, SLOT (setBrightness(int)));
76 ContrastBrightnessDlg::~ContrastBrightnessDlg()
78 delete (tempImage);
81 void ContrastBrightnessDlg::range(int min, int max, int & num)
83 if (num < min) num = min;
84 else if (num > max) num = max;
87 void ContrastBrightnessDlg::range(float min, float max, float & num)
89 if (num < min) num = min;
90 else if (num > max) num = max;
94 #include <math.h>
96 void ContrastBrightnessDlg::setContrast(int contrastValue)
98 int val = 0, index=0, totalPix = width * height;
99 int min = (int) viewer->imgBuffer[0], max = 0;
100 if (!viewer) return;
101 QColor myCol;
102 contrast = contrastValue;
105 // Apply Contrast and brightness
106 for (int i=0 ; i < height ; i++)
107 for (int j=0; j < width; j++)
109 val = (int) *(viewer->image->templateImage->scanLine(i) + j);
111 if (contrast)
113 if (val < 128)
115 val -= contrast;
116 range(0, 127, val);
118 else
120 val += contrast;
121 range(128, 255, val);
124 if (brightness)
126 myCol.setRgb(val,val,val);
127 if ( brightness < 0 )
128 val += brightness;
129 else
131 myCol = myCol.light(100+(brightness));
132 val = myCol.red();
135 range(0, 255, val);
138 localImgBuffer[(height - i - 1) * width + j] = (val - offs) / scale;
143 for (int i=0; i < totalPix; i++)
145 if (localImgBuffer[i] < min) min = (int) localImgBuffer[i];
146 else if (localImgBuffer[i] > max) max = (int) localImgBuffer[i];
149 float pixdiff_b = max - min;
150 float offs_b = - (min * 255 / pixdiff_b);
151 float scale_b = 255 / pixdiff_b;
153 for (int i=0; i < height; i++)
154 for (int j=0; j < width; j++)
156 index = i * width + j;
157 val = (int) (localImgBuffer[index] * scale_b + offs_b);
158 range(0, 255, val);
159 displayImage->setPixel(j, height - i - 1, val);
162 viewer->image->zoomToCurrent();
165 void ContrastBrightnessDlg::setBrightness(int brightnessValue)
167 int val = 0, index=0, totalPix = width * height;
168 int min = (int) viewer->imgBuffer[0], max = 0;
169 if (!viewer) return;
170 QColor myCol;
171 brightness = brightnessValue;
173 // Apply Contrast and brightness
174 for (int i=0 ; i < height ; i++)
175 for (int j=0; j < width; j++)
177 val = (int) *(viewer->image->templateImage->scanLine(i) + j);
179 if (contrast)
181 if (val < 128)
183 val -= contrast;
184 range(0, 127, val);
186 else
188 val += contrast;
189 range(128, 255, val);
192 if (brightness)
194 myCol.setRgb(val,val,val);
195 if ( brightness < 0 )
196 val += brightness;
197 else
199 myCol = myCol.light(100+(brightness));
200 val = myCol.red();
203 range(0, 255, val);
206 localImgBuffer[(height - i - 1) * width + j] = (val - offs) / scale;
211 for (int i=0; i < totalPix; i++)
213 if (localImgBuffer[i] < min) min = (int) localImgBuffer[i];
214 else if (localImgBuffer[i] > max) max = (int) localImgBuffer[i];
217 float pixdiff_b = max - min;
218 float offs_b = - (min * 255 / pixdiff_b);
219 float scale_b = 255 / pixdiff_b;
221 for (int i=0; i < height; i++)
222 for (int j=0; j < width; j++)
224 index = i * width + j;
225 val = (int) (localImgBuffer[index] * scale_b + offs_b);
226 range(0, 255, val);
227 displayImage->setPixel(j, height - i - 1, val);
230 viewer->image->zoomToCurrent();
234 QSize ContrastBrightnessDlg::sizeHint() const
236 return QSize(400,130);
239 #include "conbridlg.moc"