00001 #ifndef __COMPRESSOR_H__
00002 #define __COMPRESSOR_H__
00003
00004 #include <stdio.h>
00005 #include <stdlib.h>
00006 #include <stdint.h>
00007 #include <math.h>
00008
00009 #include "utils.h"
00010 #include "image.h"
00011 #include "processor.h"
00012
00013 namespace compressor {
00014
00016 class Compressor : public spectral::Processor
00017 {
00018 public:
00019 Compressor();
00020 virtual ~Compressor();
00021
00022
00023
00024 virtual uint32_t GetInterface(
00025 std::list<std::pair<uint32_t, uint32_t> > &mandatory,
00026 std::list<std::pair<uint32_t, uint32_t> > &optional) const;
00027
00028
00029 virtual bool SetImage(uint32_t type, const spectral::Image *img);
00030
00031
00032 virtual void SetParameters(const spectral::Parameters *);
00033
00034
00035 virtual spectral::Image *Process(void);
00036
00037
00038 virtual void ClearImage(uint32_t type);
00039
00040 protected:
00041
00042
00043 virtual void GetParameters(spectral::Parameters *) const;
00044
00045 private:
00046
00047 float tone_map(float (*cmp)(float, float *),
00048 float *opts,
00049 float clmin,
00050 float clmax,
00051 float ldmax,
00052 float l);
00053
00054 float local_tone_map(float (*cmp)(float, float *),
00055 float *opts,
00056 float clmin,
00057 float clmax,
00058 float ldmax,
00059 float l,
00060 float la,
00061 float contrast = 1.0f);
00062
00063
00064 static float compress_ashikhmin(float l, float *options);
00065 static float compress_exponent(float l, float *options);
00066 static float compress_log(float l, float *options);
00067 static float compress_gamma(float l, float *options);
00068 static float compress_linear(float l, float *options);
00069
00070
00071 const spectral::Image *m_picture, *m_lal;
00072 float m_min_luminance, m_max_luminance;
00073 float m_gamma;
00074 float m_contrast;
00075 float (*m_compression_function)(float, float *);
00076 int m_discard_dark, m_discard_bright;
00077 bool m_normalise;
00078 };
00079
00080 }
00081
00082 #endif