Files
2026-08-20 20:28:40 +01:00

124 lines
4.1 KiB
C

#ifndef MCV_H
#define MCV_H
/*
* Argyll Color Management System
* Monotonic curve class for display calibration.
*
* Author: Graeme W. Gill
* Date: 30/10/2005
*
* Copyright 2005 Graeme W. Gill
* All rights reserved.
* This material is licenced under the GNU AFFERO GENERAL PUBLIC LICENSE Version 3 :-
* see the License.txt file for licencing details.
*
* This is based on the monotonic curve equations used elsewhere,
* but currently intended to support the display calibration process.
* moncurve is not currently general, missing input scaling :-
* the input range is fixed at 0.0 .. 1.0.
*
*/
/* A test patch value */
typedef struct {
double p; /* Position */
double v; /* Value */
double w; /* Weighting, nominally 1.0 */
} mcvco;
struct _mcv {
/* Public: */
void (*del)(struct _mcv *p);
/* Fit the curve to the given points */
void (*fit) (struct _mcv *p,
int verb, /* Vebosity level, 0 = none */
int order, /* Number of curve orders, 1..MCV_MAXORDER */
mcvco *d, /* Array holding scattered initialisation data */
int ndp, /* Number of data points */
double smooth /* Degree of smoothing, 1.0 = normal */
);
/* Offset the the output so that the value for input 0.0, */
/* is the given value. Don't change the 1.0 output */
void (*force_0) (struct _mcv *p,
double target /* Target output value */
);
/* Scale the the output so that the value for input 1.0, */
/* is the given value. Don't change the 0.0 output */
void (*force_1) (struct _mcv *p,
double target /* Target output value */
);
/* Scale the the output so that the value for input 1.0, */
/* is the given target value. Scale the value for 0.0 too. */
void (*force_scale) (struct _mcv *p,
double target /* Target output value */
);
/* Return the number of parameters and the parameters in */
/* an allocated array. free() when done. */
/* The parameters are the offset, scale, (optionally slope) then all the other parameters */
int (*get_params)(struct _mcv *p, double **rp);
/* Translate a value through the current curve */
double (*interp) (struct _mcv *p,
double in); /* Input value */
/* Translate a value backwards through the current curve */
/* (Invalid for general curve) */
double (*inv_interp) (struct _mcv *p,
double in); /* Input value */
/* Translate a value given the parametrs */
double (*interp_p) (struct _mcv *p,
double *pms, double in); /* Input value */
/* return the shaper parameters normalising weight */
double (*shweight_p)(struct _mcv *p, double *v, double smooth);
/* Translate a value given the parametrs, with partial derivatives */
double (*dinterp_p) (struct _mcv *p, double *pms, double *dv, double vv);
/* return the shaper parameters normalising weight, with partial derivatives */
double (*dshweight_p)(struct _mcv *p, double *v, double *dv, double smooth);
/* Private: */
int verb; /* Verbose */
int noos; /* flag, 2 = offset and scale not fitted, fixed at 0 & 1 */
int luord; /* Number of params including offset, scale and (optionally) slope */
int fitmin; /* Index of first fit parameter in full param array */
int nfitp; /* Number of parameters to fit */
int cvemin; /* Index of first curve parameter in full param array */
int fitcvemin; /* Index of first curve parameter in fit array */
double *pms; /* Allocated curve parameters */
double *dv; /* Work space for dv's during optimisation */
double resid; /* Residual fit error */
mcvco *d; /* Array holding scattered initialisation data */
int ndp; /* Number of data points */
double dra; /* Data range */
double smooth; /* Smoothing factor */
}; typedef struct _mcv mcv;
/* Create a new, uninitialised mcv that will fit with offset and scale */
mcv *new_mcv(void);
/* Create a new mcv initiated with the given curve parameters */
mcv *new_mcv_p(double *pp, int np);
/* Create a new, uninitialised mcv with offset and scale not to be fitted, */
/* with these defaulting to 0.0 and 1.0 */
mcv *new_mcv_noos(void);
#endif /* MCV */