summaryrefslogtreecommitdiffstats
path: root/src/image.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/image.cpp')
-rw-r--r--src/image.cpp116
1 files changed, 116 insertions, 0 deletions
diff --git a/src/image.cpp b/src/image.cpp
index d63e14c..66c281c 100644
--- a/src/image.cpp
+++ b/src/image.cpp
@@ -21,6 +21,7 @@
//#include "gifenc.h"
#include <qfile.h>
#include "lodepng.h"
+#include <math.h>
typedef unsigned char Byte;
@@ -393,3 +394,118 @@ bool Image::save(const char *fileName,int mode)
return TRUE;
}
+//----------------------------------------------------------------
+
+void ColoredImage::hsl2rgb(double h,double s,double l,
+ double *pRed,double *pGreen,double *pBlue)
+{
+ double v;
+ double r,g,b;
+
+ r = l; // default to gray
+ g = l;
+ b = l;
+ v = (l <= 0.5) ? (l * (1.0 + s)) : (l + s - l * s);
+ if (v > 0)
+ {
+ double m;
+ double sv;
+ int sextant;
+ double fract, vsf, mid1, mid2;
+
+ m = l + l - v;
+ sv = (v - m ) / v;
+ h *= 6.0;
+ sextant = (int)h;
+ fract = h - sextant;
+ vsf = v * sv * fract;
+ mid1 = m + vsf;
+ mid2 = v - vsf;
+ switch (sextant)
+ {
+ case 0:
+ r = v;
+ g = mid1;
+ b = m;
+ break;
+ case 1:
+ r = mid2;
+ g = v;
+ b = m;
+ break;
+ case 2:
+ r = m;
+ g = v;
+ b = mid1;
+ break;
+ case 3:
+ r = m;
+ g = mid2;
+ b = v;
+ break;
+ case 4:
+ r = mid1;
+ g = m;
+ b = v;
+ break;
+ case 5:
+ r = v;
+ g = m;
+ b = mid2;
+ break;
+ }
+ }
+ *pRed = r;
+ *pGreen = g;
+ *pBlue = b;
+}
+
+ColoredImage::ColoredImage(int width,int height,
+ const uchar *greyLevels,const uchar *alphaLevels,
+ int saturation,int hue,int gamma)
+{
+ m_hasAlpha = alphaLevels!=0;
+ m_width = width;
+ m_height = height;
+ m_data = (uchar*)malloc(width*height*4);
+ int i;
+ for (i=0;i<width*height;i++)
+ {
+ uchar r,g,b,a;
+ double red,green,blue;
+ hsl2rgb(hue/360.0, // hue
+ saturation/255.0, // saturation
+ pow(greyLevels[i]/255.0,gamma/100.0), // luma (gamma corrected)
+ &red,&green,&blue);
+ r = (int)(red *255.0);
+ g = (int)(green*255.0);
+ b = (int)(blue *255.0);
+ a = alphaLevels ? alphaLevels[i] : 255;
+ m_data[i*4+0]=r;
+ m_data[i*4+1]=g;
+ m_data[i*4+2]=b;
+ m_data[i*4+3]=a;
+ }
+}
+
+ColoredImage::~ColoredImage()
+{
+ free(m_data);
+}
+
+bool ColoredImage::save(const char *fileName)
+{
+ uchar *buffer;
+ size_t bufferSize;
+ LodePNG_Encoder encoder;
+ LodePNG_Encoder_init(&encoder);
+ encoder.infoPng.color.colorType = m_hasAlpha ? 6 : 2; // 2=RGB 24 bit, 6=RGBA 32 bit
+ encoder.infoRaw.color.colorType = 6; // 6=RGBA 32 bit
+ LodePNG_encode(&encoder, &buffer, &bufferSize, m_data, m_width, m_height);
+ LodePNG_saveFile(buffer, bufferSize, fileName);
+ LodePNG_Encoder_cleanup(&encoder);
+ free(buffer);
+ return TRUE;
+}
+
+