krita

kis_basic_histogram_producers.h

00001 /*
00002  *  Copyright (c) 2005 Bart Coppens <kde@bartcoppens.be>
00003  *
00004  *  This program is free software; you can redistribute it and/or modify
00005  *  it under the terms of the GNU General Public License as published by
00006  *  the Free Software Foundation; either version 2 of the License, or
00007  *  (at your option) any later version.
00008  *
00009  *  This program is distributed in the hope that it will be useful,
00010  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
00011  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00012  *  GNU General Public License for more details.
00013  *
00014  *  You should have received a copy of the GNU General Public License
00015  *  along with this program; if not, write to the Free Software
00016  *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
00017  */
00018 
00019 #ifndef _KIS_BASIC_HISTOGRAM_PRODUCERS_
00020 #define _KIS_BASIC_HISTOGRAM_PRODUCERS_
00021 
00022 #include <qvaluevector.h>
00023 #include <klocale.h>
00024 
00025 #include "config.h"
00026 
00027 #include "kis_histogram_producer.h"
00028 #include "kis_colorspace.h"
00029 #include "kis_id.h"
00030 
00031 class KisLabColorSpace;
00032 
00033 class KisBasicHistogramProducer : public KisHistogramProducer {
00034 public:
00035     KisBasicHistogramProducer(const KisID& id, int channels, int nrOfBins, KisColorSpace *colorSpace);
00036     virtual ~KisBasicHistogramProducer() {}
00037 
00038     virtual void clear();
00039 
00040     virtual void setView(double from, double size) { m_from = from; m_width = size; }
00041 
00042     virtual const KisID& id() const { return m_id; }
00043     virtual QValueVector<KisChannelInfo *> channels() { return m_colorSpace->channels(); }
00044     virtual Q_INT32 numberOfBins() { return m_nrOfBins; }
00045     virtual double viewFrom() const { return m_from; }
00046     virtual double viewWidth() const { return m_width; }
00047 
00048     virtual Q_INT32 count() { return m_count; }
00049 
00050     virtual Q_INT32 getBinAt(int channel, int position)
00051         { return m_bins.at(externalToInternal(channel)).at(position); }
00052 
00053     virtual Q_INT32 outOfViewLeft(int channel)
00054         { return m_outLeft.at(externalToInternal(channel)); }
00055 
00056     virtual Q_INT32 outOfViewRight(int channel)
00057         { return m_outRight.at(externalToInternal(channel)); }
00058 
00059 protected:
00067     virtual int externalToInternal(int ext) {
00068         if (channels().count() > 0 && m_external.count() == 0) // Set up the translation table
00069             makeExternalToInternal();
00070         return m_external.at(ext);
00071     }
00072     // not virtual since that is useless: we call it from constructor
00073     void makeExternalToInternal();
00074     typedef QValueVector<Q_UINT32> vBins;
00075     QValueVector<vBins> m_bins;
00076     vBins m_outLeft, m_outRight;
00077     double m_from, m_width;
00078     Q_INT32 m_count;
00079     int m_channels, m_nrOfBins;
00080     KisColorSpace *m_colorSpace;
00081     KisID m_id;
00082     QValueVector<Q_INT32> m_external;
00083 };
00084 
00085 class KisBasicU8HistogramProducer : public KisBasicHistogramProducer {
00086 public:
00087     KisBasicU8HistogramProducer(const KisID& id, KisColorSpace *colorSpace);
00088     virtual void addRegionToBin(Q_UINT8 * pixels, Q_UINT8 * selectionMask, Q_UINT32 nPixels, KisColorSpace *colorSpace);
00089     virtual QString positionToString(double pos) const;
00090     virtual double maximalZoom() const { return 1.0; }
00091 };
00092 
00093 class KisBasicU16HistogramProducer : public KisBasicHistogramProducer {
00094 public:
00095     KisBasicU16HistogramProducer(const KisID& id, KisColorSpace *colorSpace);
00096     virtual void addRegionToBin(Q_UINT8 * pixels, Q_UINT8 * selectionMask, Q_UINT32 nPixels, KisColorSpace *colorSpace);
00097     virtual QString positionToString(double pos) const;
00098     virtual double maximalZoom() const;
00099 };
00100 
00101 class KisBasicF32HistogramProducer : public KisBasicHistogramProducer {
00102 public:
00103     KisBasicF32HistogramProducer(const KisID& id, KisColorSpace *colorSpace);
00104     virtual void addRegionToBin(Q_UINT8 * pixels, Q_UINT8 * selectionMask, Q_UINT32 nPixels, KisColorSpace *colorSpace);
00105     virtual QString positionToString(double pos) const;
00106     virtual double maximalZoom() const;
00107 };
00108 
00109 #ifdef HAVE_OPENEXR
00110 class KisBasicF16HalfHistogramProducer : public KisBasicHistogramProducer {
00111 public:
00112     KisBasicF16HalfHistogramProducer(const KisID& id, KisColorSpace *colorSpace);
00113     virtual void addRegionToBin(Q_UINT8 * pixels, Q_UINT8 * selectionMask, Q_UINT32 nPixels, KisColorSpace *colorSpace);
00114     virtual QString positionToString(double pos) const;
00115     virtual double maximalZoom() const;
00116 };
00117 #endif
00118 
00125 template<class T> class KisBasicHistogramProducerFactory : public KisHistogramProducerFactory {
00126 public:
00127     KisBasicHistogramProducerFactory(const KisID& id, KisColorSpace *colorSpace)
00128         : KisHistogramProducerFactory(id), m_cs(colorSpace) {}
00129     virtual ~KisBasicHistogramProducerFactory() {}
00130     virtual KisHistogramProducerSP generate() { return new T(id(), m_cs); }
00131     virtual bool isCompatibleWith(KisColorSpace* colorSpace) const { return colorSpace->id() == m_cs->id(); }
00132     virtual float preferrednessLevelWith(KisColorSpace* /*colorSpace*/) const { return 1.0; }
00133 protected:
00134     KisColorSpace *m_cs;
00135 };
00136 
00143 class KisGenericRGBHistogramProducer : public KisBasicHistogramProducer {
00144 public:
00145     KisGenericRGBHistogramProducer();
00146     virtual void addRegionToBin(Q_UINT8 * pixels, Q_UINT8 * selectionMask, Q_UINT32 nPixels, KisColorSpace *colorSpace);
00147     virtual QString positionToString(double pos) const;
00148     virtual double maximalZoom() const;
00149     virtual QValueVector<KisChannelInfo *> channels();
00150 protected:
00151     QValueVector<KisChannelInfo *> m_channelsList;
00152 };
00153 
00155 class KisGenericRGBHistogramProducerFactory : public KisHistogramProducerFactory {
00156 public:
00157     KisGenericRGBHistogramProducerFactory()
00158         : KisHistogramProducerFactory(KisID("GENRGBHISTO", i18n("Generic RGB Histogram"))) {}
00159     virtual ~KisGenericRGBHistogramProducerFactory() {}
00160     virtual KisHistogramProducerSP generate() { return new KisGenericRGBHistogramProducer(); }
00161     virtual bool isCompatibleWith(KisColorSpace*) const { return true; }
00162     virtual float preferrednessLevelWith(KisColorSpace*) const { return 0.0; }
00163 };
00164 
00165 
00171 class KisGenericLabHistogramProducer : public KisBasicHistogramProducer {
00172     public:
00173         KisGenericLabHistogramProducer();
00174         virtual ~KisGenericLabHistogramProducer();
00175         virtual void addRegionToBin(Q_UINT8 * pixels, Q_UINT8 * selectionMask, Q_UINT32 nPixels, KisColorSpace *colorSpace);
00176         virtual QString positionToString(double pos) const;
00177         virtual double maximalZoom() const;
00178         virtual QValueVector<KisChannelInfo *> channels();
00179     protected:
00180         QValueVector<KisChannelInfo *> m_channelsList;
00181     private:
00182         static KisLabColorSpace* m_labCs;
00183 };
00184 
00186 class KisGenericLabHistogramProducerFactory : public KisHistogramProducerFactory {
00187     public:
00188         KisGenericLabHistogramProducerFactory()
00189     : KisHistogramProducerFactory(KisID("GENLABHISTO", i18n("Generic L*a*b* Histogram"))) {}
00190         virtual ~KisGenericLabHistogramProducerFactory() {}
00191         virtual KisHistogramProducerSP generate() { return new KisGenericLabHistogramProducer(); }
00192         virtual bool isCompatibleWith(KisColorSpace*) const { return true; }
00193         virtual float preferrednessLevelWith(KisColorSpace*) const { return 0.0; }
00194 };
00195 
00196 
00197 #endif // _KIS_BASIC_HISTOGRAM_PRODUCERS_
KDE Home | KDE Accessibility Home | Description of Access Keys