diff options
Diffstat (limited to 'digikam/libs/dimg/filters/dimgimagefilters.h')
-rw-r--r-- | digikam/libs/dimg/filters/dimgimagefilters.h | 133 |
1 files changed, 133 insertions, 0 deletions
diff --git a/digikam/libs/dimg/filters/dimgimagefilters.h b/digikam/libs/dimg/filters/dimgimagefilters.h new file mode 100644 index 0000000..71a83dd --- /dev/null +++ b/digikam/libs/dimg/filters/dimgimagefilters.h @@ -0,0 +1,133 @@ +/* ============================================================ + * + * This file is a part of digiKam project + * http://www.digikam.org + * + * Date : 2005-24-01 + * Description : misc image filters + * + * Copyright (C) 2004-2007 by Gilles Caulier <caulier dot gilles at gmail dot com> + * + * This program is free software; you can redistribute it + * and/or modify it under the terms of the GNU General + * Public License as published by the Free Software Foundation; + * either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * ============================================================ */ + +#ifndef DIMGIMAGE_FILTERS_H +#define DIMGIMAGE_FILTERS_H + +#define CLAMP0255(a) QMIN(QMAX(a,0), 255) +#define CLAMP065535(a) QMIN(QMAX(a,0), 65535) +#define CLAMP(x,l,u) ((x)<(l)?(l):((x)>(u)?(u):(x))) +#define ROUND(x) ((int) ((x) + 0.5)) + +// C++ includes. + +#include <cmath> + +// Digikam includes. + +#include "digikam_export.h" + +namespace Digikam +{ + +class DIGIKAM_EXPORT DImgImageFilters +{ +public: + + DImgImageFilters(){}; + ~DImgImageFilters(){}; + +private: // Private structures used internally. + + struct double_packet + { + double red; + double green; + double blue; + double alpha; + }; + + struct int_packet + { + unsigned int red; + unsigned int green; + unsigned int blue; + unsigned int alpha; + }; + + struct NormalizeParam + { + unsigned short *lut; + double min; + double max; + }; + +private: // Private methods used internally. + + // Methods for Channel Mixer. + + inline double CalculateNorm(float RedGain, float GreenGain, float BlueGain, bool bPreserveLum) + { + double lfSum = RedGain + GreenGain + BlueGain; + + if ((lfSum == 0.0) || (bPreserveLum == false)) + return (1.0); + + return( fabs (1.0 / lfSum) ); + }; + + inline unsigned short MixPixel(float RedGain, float GreenGain, float BlueGain, + unsigned short R, unsigned short G, unsigned short B, bool sixteenBit, + double Norm) + { + double lfMix = RedGain * (double)R + GreenGain * (double)G + BlueGain * (double)B; + lfMix *= Norm; + int segment = sixteenBit ? 65535 : 255; + + return( (unsigned short)CLAMP (lfMix, 0, segment) ); + }; + + inline int setPositionAdjusted (int Width, int Height, int X, int Y) + { + X = (X < 0) ? 0 : (X >= Width ) ? Width - 1 : X; + Y = (Y < 0) ? 0 : (Y >= Height) ? Height - 1 : Y; + return (Y*Width*4 + 4*X); + }; + +public: // Public methods. + + void equalizeImage(uchar *data, int w, int h, bool sixteenBit); + void stretchContrastImage(uchar *data, int w, int h, bool sixteenBit); + void normalizeImage(uchar *data, int w, int h, bool sixteenBit); + void autoLevelsCorrectionImage(uchar *data, int w, int h, bool sixteenBit); + void invertImage(uchar *data, int w, int h, bool sixteenBit); + void channelMixerImage(uchar *data, int Width, int Height, bool sixteenBit, + bool bPreserveLum, bool bMonochrome, + float rrGain, float rgGain, float rbGain, + float grGain, float ggGain, float gbGain, + float brGain, float bgGain, float bbGain); + void changeTonality(uchar *data, int width, int height, bool sixteenBit, + int redMask, int greenMask, int blueMask); + void gaussianBlurImage(uchar *data, int width, int height, bool sixteenBit, int radius); + void sharpenImage(uchar *data, int width, int height, bool sixteenBit, int radius); + + void pixelAntiAliasing(uchar *data, int Width, int Height, double X, double Y, + uchar *A, uchar *R, uchar *G, uchar *B); + + void pixelAntiAliasing16(unsigned short *data, int Width, int Height, double X, double Y, + unsigned short *A, unsigned short *R, unsigned short *G, unsigned short *B); +}; + +} // NameSpace Digikam + +#endif /* DIMGIMAGE_FILTERS_H */ |