Reworked color functions 2

see issue 1052
This commit is contained in:
Oliver Duis
2012-07-11 22:51:57 +02:00
parent f7112ac0f0
commit 752e1562b3
6 changed files with 24 additions and 67 deletions

View File

@@ -695,28 +695,4 @@ namespace rtengine {
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
LUTf CurveFactory::gammatab;
LUTf CurveFactory::igammatab_srgb;
LUTf CurveFactory::gammatab_srgb;
void CurveFactory::init () {
gammatab(65536,0);
igammatab_srgb(65536,0);
gammatab_srgb(65536,0);
for (int i=0; i<65536; i++)
gammatab_srgb[i] = (65535.0 * gamma2 (i/65535.0));
for (int i=0; i<65536; i++)
igammatab_srgb[i] = (65535.0 * igamma2 (i/65535.0));
for (int i=0; i<65536; i++)
gammatab[i] = (65535.0 * pow (i/65535.0, 0.454545));
/* FILE* f = fopen ("c.txt", "wt");
for (int i=0; i<256; i++)
fprintf (f, "%g %g\n", i/255.0, clower (i/255.0, 2.0, 1.0));
fclose (f);*/
}
}

View File

@@ -45,12 +45,6 @@ class CurveFactory {
protected:
// look-up tables for the standard srgb gamma and its inverse (filled by init())
static LUTf igammatab_srgb;
static LUTf gammatab_srgb;
// look-up tables for the simple exponential gamma
static LUTf gammatab;
// functions calculating the parameters of the contrast curve based on the desired slope at the center
static double solve_upper (double m, double c, double deriv);
static double solve_lower (double m, double c, double deriv);
@@ -151,9 +145,6 @@ class CurveFactory {
}
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
static void init ();
static void cleanup ();
static inline double centercontrast (double x, double b, double m);
// standard srgb gamma and its inverse
@@ -171,17 +162,6 @@ class CurveFactory {
return (x <= start*slope ? x/slope : exp(log((x+add)/mul)*gamma) );
}
// gamma functions on [0,65535] based on look-up tables
static inline float gamma_srgb (int x) { return gammatab_srgb[x]; }
static inline float gamma (int x) { return gammatab[x]; }
static inline float igamma_srgb (int x) { return igammatab_srgb[x]; }
static inline float gamma_srgb (float x) { return gammatab_srgb[x]; }
static inline float gamma (float x) { return gammatab[x]; }
static inline float igamma_srgb (float x) { return igammatab_srgb[x]; }
//static inline float gamma_srgb (double x) { return gammatab_srgb[x]; }
//static inline float gamma (double x) { return gammatab[x]; }
//static inline float igamma_srgb (double x) { return igammatab_srgb[x]; }
static inline float hlcurve (const float exp_scale, const float comp, const float hlrange, float level)
{
if (comp>0.0) {

View File

@@ -21,7 +21,6 @@
#include "dcp.h"
#include "improcfun.h"
#include "improccoordinator.h"
#include "curves.h"
#include "dfmanager.h"
#include "ffmanager.h"
#include "rtthumbnail.h"
@@ -43,7 +42,7 @@ int init (const Settings* s, Glib::ustring baseDir) {
profileStore.init ();
ProcParams::init ();
CurveFactory::init ();
Color::init();
ImProcFunctions::initMunsell();
ImProcFunctions::initCache ();
Thumbnail::initGamma ();
@@ -57,6 +56,7 @@ int init (const Settings* s, Glib::ustring baseDir) {
void cleanup () {
ProcParams::cleanup ();
Color::cleanup ();
ImProcFunctions::cleanupCache ();
Thumbnail::cleanupGamma ();
}

View File

@@ -2298,29 +2298,29 @@ void RawImageSource::getRAWHistogram (LUTu & histRedRaw, LUTu & histGreenRaw, LU
if (ri->isBayer()) {
for (int j=start; j<end; j++) {
if (ri->ISGREEN(i,j)) {
if(i &1) idx = CLIP((int)CurveFactory::gamma(mult*(ri->data[i][j]-(cblacksom[1]/*+black_lev[1]*/))));// green 1
if(i &1) idx = CLIP((int)Color::gamma(mult*(ri->data[i][j]-(cblacksom[1]/*+black_lev[1]*/))));// green 1
else
idx = CLIP((int)CurveFactory::gamma(mult*(ri->data[i][j]-(cblacksom[3]/*+black_lev[3]*/))));//green 2
idx = CLIP((int)Color::gamma(mult*(ri->data[i][j]-(cblacksom[3]/*+black_lev[3]*/))));//green 2
histGreenRaw[idx>>8]++;
} else if (ri->ISRED(i,j)) {
idx = CLIP((int)CurveFactory::gamma(mult*(ri->data[i][j]-(cblacksom[0]/*+black_lev[0]*/))));
idx = CLIP((int)Color::gamma(mult*(ri->data[i][j]-(cblacksom[0]/*+black_lev[0]*/))));
histRedRaw[idx>>8]++;
} else if (ri->ISBLUE(i,j)) {
idx = CLIP((int)CurveFactory::gamma(mult*(ri->data[i][j]-(cblacksom[2]/*+black_lev[2]*/))));
idx = CLIP((int)Color::gamma(mult*(ri->data[i][j]-(cblacksom[2]/*+black_lev[2]*/))));
histBlueRaw[idx>>8]++;
}
}
} else {
for (int j=start; j<3*end; j++) {
idx = CLIP((int)CurveFactory::gamma(mult*(ri->data[i][j]-cblack[0])));
idx = CLIP((int)Color::gamma(mult*(ri->data[i][j]-cblack[0])));
histRedRaw[idx>>8]++;
idx = CLIP((int)CurveFactory::gamma(mult*(ri->data[i][j+1]-cblack[1])));
idx = CLIP((int)Color::gamma(mult*(ri->data[i][j+1]-cblack[1])));
histGreenRaw[idx>>8]++;
idx = CLIP((int)CurveFactory::gamma(mult*(ri->data[i][j+2]-cblack[2])));
idx = CLIP((int)Color::gamma(mult*(ri->data[i][j+2]-cblack[2])));
histBlueRaw[idx>>8]++;
}
}

View File

@@ -110,9 +110,9 @@ Thumbnail* Thumbnail::loadFromImage (const Glib::ustring& fname, int &w, int &h,
tpp->aeHistogram.clear();
int ix = 0;
for (int i=0; i<img->height*img->width; i++) {
int rtmp=CurveFactory::igamma_srgb (img->data[ix++]);
int gtmp=CurveFactory::igamma_srgb (img->data[ix++]);
int btmp=CurveFactory::igamma_srgb (img->data[ix++]);
int rtmp=Color::igamma_srgb (img->data[ix++]);
int gtmp=Color::igamma_srgb (img->data[ix++]);
int btmp=Color::igamma_srgb (img->data[ix++]);
tpp->aeHistogram[rtmp>>tpp->aeHistCompression]++;
tpp->aeHistogram[gtmp>>tpp->aeHistCompression]+=2;
@@ -502,9 +502,9 @@ void Thumbnail::initGamma () {
igammatab = new unsigned short[256];
gammatab = new unsigned char[65536];
for (int i=0; i<256; i++)
igammatab[i] = (unsigned short)(255.0*pow((double)i/255.0,CurveFactory::sRGBGamma));
igammatab[i] = (unsigned short)(255.0*pow((double)i/255.0,Color::sRGBGamma));
for (int i=0; i<65536; i++)
gammatab[i] = (unsigned char)(255.0*pow((double)i/65535.0,1.f/CurveFactory::sRGBGamma));
gammatab[i] = (unsigned char)(255.0*pow((double)i/65535.0,1.f/Color::sRGBGamma));
}
void Thumbnail::cleanupGamma () {
@@ -693,7 +693,7 @@ IImage8* Thumbnail::processImage (const procparams::ProcParams& params, int rhei
ipf.setScale (sqrt(double(fw*fw+fh*fh))/sqrt(double(thumbImg->width*thumbImg->width+thumbImg->height*thumbImg->height))*scale);
LUTu hist16 (65536);
double gamma = isRaw ? CurveFactory::sRGBGamma : 0; // usually in ImageSource, but we don't have that here
double gamma = isRaw ? Color::sRGBGamma : 0; // usually in ImageSource, but we don't have that here
ipf.firstAnalysis (baseImg, &params, hist16, gamma);
// perform transform
@@ -876,7 +876,7 @@ void Thumbnail::getSpotWB (const procparams::ProcParams& params, int xp, int yp,
// calculate spot wb (copy & pasted from stdimagesource)
unsigned short igammatab[256];
for (int i=0; i<256; i++)
igammatab[i] = (unsigned short)(255.0*pow(i/255.0,CurveFactory::sRGBGamma));
igammatab[i] = (unsigned short)(255.0*pow(i/255.0,Color::sRGBGamma));
int x; int y;
double reds = 0, greens = 0, blues = 0;
int rn = 0, gn = 0, bn = 0;

View File

@@ -20,6 +20,7 @@
#include "mytime.h"
#include "iccstore.h"
#include "curves.h"
#include "color.h"
#undef THREAD_PRIORITY_NORMAL
@@ -228,9 +229,9 @@ void StdImageSource::getImage_ (ColorTemp ctemp, int tran, Imagefloat* image, Pr
for (int m=0; m<skip; m++)
for (int n=0; n<skip; n++)
{
rtot += CurveFactory::igamma_srgb(img->r[i+m][jx+n]);
gtot += CurveFactory::igamma_srgb(img->g[i+m][jx+n]);
btot += CurveFactory::igamma_srgb(img->b[i+m][jx+n]);
rtot += Color::igamma_srgb(img->r[i+m][jx+n]);
gtot += Color::igamma_srgb(img->g[i+m][jx+n]);
btot += Color::igamma_srgb(img->b[i+m][jx+n]);
}
line_red[j] = rtot;
line_green[j] = gtot;
@@ -238,7 +239,7 @@ void StdImageSource::getImage_ (ColorTemp ctemp, int tran, Imagefloat* image, Pr
}
// covert back to gamma and clip
#define GCLIP( x ) CurveFactory::gamma_srgb(CLIP(x))
#define GCLIP( x ) Color::gamma_srgb(CLIP(x))
if ((mtran & TR_ROT) == TR_R180)
for (int j=0; j<imwidth; j++) {
@@ -437,9 +438,9 @@ void StdImageSource::getAutoExpHistogram (LUTu & histogram, int& histcompr) {
for (int i=0; i<img->height; i++)
for (int j=0; j<img->width; j++) {
histogram[(int)CurveFactory::igamma_srgb (img->r[i][j])>>histcompr]++;
histogram[(int)CurveFactory::igamma_srgb (img->g[i][j])>>histcompr]++;
histogram[(int)CurveFactory::igamma_srgb (img->b[i][j])>>histcompr]++;
histogram[(int)Color::igamma_srgb (img->r[i][j])>>histcompr]++;
histogram[(int)Color::igamma_srgb (img->g[i][j])>>histcompr]++;
histogram[(int)Color::igamma_srgb (img->b[i][j])>>histcompr]++;
}
}