00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #include "tonemap.h"
00026 #include "paramset.h"
00027
00028 class ContrastOp : public ToneMap {
00029 public:
00030 ContrastOp(float day) { displayAdaptationY = day; }
00031 void Map(const float *y,
00032 int xRes, int yRes,
00033 float maxDisplayY, float *scale) const;
00034 float displayAdaptationY;
00035 };
00036
00037 void ContrastOp::Map(const float *y, int xRes, int yRes,
00038 float maxDisplayY, float *scale) const {
00039
00040 float Ywa = 0.;
00041 for (int i = 0; i < xRes * yRes; ++i)
00042 if (y[i] > 0) Ywa += logf(y[i]);
00043 Ywa = expf(Ywa / (xRes * yRes));
00044
00045 float s = powf((1.219f + powf(displayAdaptationY, 0.4f)) /
00046 (1.219f + powf(Ywa, 0.4f)), 2.5f);
00047 for (int i = 0; i < xRes*yRes; ++i)
00048 scale[i] = s;
00049 }
00050 extern "C" DLLEXPORT ToneMap *CreateToneMap(const ParamSet &ps) {
00051 float day = ps.FindOneFloat("displayadaptationY", 50.f);
00052 return new ContrastOp(day);
00053 }