Data Structures | |
struct | stp_curve_point_t |
Point (x,y) for piecewise curve. More... | |
Typedefs | |
typedef stp_curve | stp_curve_t |
The curve opaque data type. | |
Enumerations | |
enum | stp_curve_type_t { STP_CURVE_TYPE_LINEAR, STP_CURVE_TYPE_SPLINE } |
Curve types. More... | |
enum | stp_curve_wrap_mode_t { STP_CURVE_WRAP_NONE, STP_CURVE_WRAP_AROUND } |
Wrapping mode. More... | |
enum | stp_curve_compose_t { STP_CURVE_COMPOSE_ADD, STP_CURVE_COMPOSE_MULTIPLY, STP_CURVE_COMPOSE_EXPONENTIATE } |
Composition types. More... | |
enum | stp_curve_bounds_t { STP_CURVE_BOUNDS_RESCALE, STP_CURVE_BOUNDS_CLIP, STP_CURVE_BOUNDS_ERROR } |
Behaviour when curve exceeds bounds. More... | |
Functions | |
stp_curve_t * | stp_curve_create (stp_curve_wrap_mode_t wrap) |
Create a new curve. | |
stp_curve_t * | stp_curve_create_copy (const stp_curve_t *curve) |
Copy and allocate an curve. | |
void | stp_curve_copy (stp_curve_t *dest, const stp_curve_t *source) |
Copy an curve. | |
void | stp_curve_destroy (stp_curve_t *curve) |
Destroy an curve. | |
int | stp_curve_set_bounds (stp_curve_t *curve, double low, double high) |
Set the lower and upper bounds on a curve. | |
void | stp_curve_get_bounds (const stp_curve_t *curve, double *low, double *high) |
Get the lower and upper bounds on a curve. | |
stp_curve_wrap_mode_t | stp_curve_get_wrap (const stp_curve_t *curve) |
Get the wrapping mode. | |
int | stp_curve_is_piecewise (const stp_curve_t *curve) |
Determine whether the curve is piecewise. | |
void | stp_curve_get_range (const stp_curve_t *curve, double *low, double *high) |
size_t | stp_curve_count_points (const stp_curve_t *curve) |
Get the number of allocated points in the curve. | |
int | stp_curve_set_interpolation_type (stp_curve_t *curve, stp_curve_type_t itype) |
Set the curve interpolation type. | |
stp_curve_type_t | stp_curve_get_interpolation_type (const stp_curve_t *curve) |
Get the curve interpolation type. | |
int | stp_curve_set_data (stp_curve_t *curve, size_t count, const double *data) |
Set all data points of the curve. | |
int | stp_curve_set_data_points (stp_curve_t *curve, size_t count, const stp_curve_point_t *data) |
Set all data points of the curve. | |
int | stp_curve_set_float_data (stp_curve_t *curve, size_t count, const float *data) |
Set the data points in a curve from float values. | |
int | stp_curve_set_long_data (stp_curve_t *curve, size_t count, const long *data) |
Set the data points in a curve from long values. | |
int | stp_curve_set_ulong_data (stp_curve_t *curve, size_t count, const unsigned long *data) |
Set the data points in a curve from unsigned long values. | |
int | stp_curve_set_int_data (stp_curve_t *curve, size_t count, const int *data) |
Set the data points in a curve from integer values. | |
int | stp_curve_set_uint_data (stp_curve_t *curve, size_t count, const unsigned int *data) |
Set the data points in a curve from unsigned integer values. | |
int | stp_curve_set_short_data (stp_curve_t *curve, size_t count, const short *data) |
Set the data points in a curve from short values. | |
int | stp_curve_set_ushort_data (stp_curve_t *curve, size_t count, const unsigned short *data) |
Set the data points in a curve from unsigned short values. | |
stp_curve_t * | stp_curve_get_subrange (const stp_curve_t *curve, size_t start, size_t count) |
Get a curve containing a subrange of data. | |
int | stp_curve_set_subrange (stp_curve_t *curve, const stp_curve_t *range, size_t start) |
const double * | stp_curve_get_data (const stp_curve_t *curve, size_t *count) |
Get a pointer to the curve's raw data. | |
const stp_curve_point_t * | stp_curve_get_data_points (const stp_curve_t *curve, size_t *count) |
Get a pointer to the curve's raw data as points. | |
const float * | stp_curve_get_float_data (const stp_curve_t *curve, size_t *count) |
Get pointer to the curve's raw data as floats. | |
const long * | stp_curve_get_long_data (const stp_curve_t *curve, size_t *count) |
Get pointer to the curve's raw data as longs. | |
const unsigned long * | stp_curve_get_ulong_data (const stp_curve_t *curve, size_t *count) |
Get pointer to the curve's raw data as unsigned longs. | |
const int * | stp_curve_get_int_data (const stp_curve_t *curve, size_t *count) |
Get pointer to the curve's raw data as integers. | |
const unsigned int * | stp_curve_get_uint_data (const stp_curve_t *curve, size_t *count) |
Get pointer to the curve's raw data as unsigned integers. | |
const short * | stp_curve_get_short_data (const stp_curve_t *curve, size_t *count) |
Get pointer to the curve's raw data as shorts. | |
const unsigned short * | stp_curve_get_ushort_data (const stp_curve_t *curve, size_t *count) |
Get pointer to the curve's raw data as unsigned shorts. | |
const stp_sequence_t * | stp_curve_get_sequence (const stp_curve_t *curve) |
Get the underlying stp_sequence_t data structure which stp_curve_t is derived from. | |
int | stp_curve_set_gamma (stp_curve_t *curve, double f_gamma) |
Set the gamma of a curve. | |
double | stp_curve_get_gamma (const stp_curve_t *curve) |
Get the gamma value of the curve. | |
int | stp_curve_set_point (stp_curve_t *curve, size_t where, double data) |
Set a point along the curve. | |
int | stp_curve_get_point (const stp_curve_t *curve, size_t where, double *data) |
Get a point along the curve. | |
int | stp_curve_interpolate_value (const stp_curve_t *curve, double where, double *result) |
Interpolate a point along the curve. | |
int | stp_curve_resample (stp_curve_t *curve, size_t points) |
Resample a curve (change the number of points). | |
int | stp_curve_rescale (stp_curve_t *curve, double scale, stp_curve_compose_t mode, stp_curve_bounds_t bounds_mode) |
Rescale a curve (multiply all points by a scaling constant). | |
int | stp_curve_write (FILE *file, const stp_curve_t *curve) |
Write a curve to a file. | |
char * | stp_curve_write_string (const stp_curve_t *curve) |
Write a curve to a string. | |
stp_curve_t * | stp_curve_create_from_stream (FILE *fp) |
Create a curve from a stream. | |
stp_curve_t * | stp_curve_create_from_file (const char *file) |
Create a curve from a stream. | |
stp_curve_t * | stp_curve_create_from_string (const char *string) |
Create a curve from a string. | |
int | stp_curve_compose (stp_curve_t **retval, stp_curve_t *a, stp_curve_t *b, stp_curve_compose_t mode, int points) |
Compose two curves, creating a third curve. |
curve "inherits" from the sequence data structure (implemented via containment), since the curve data is represented internally as a sequence of numbers, for linear and spline curves. Linear Piecewise Curves (LPCs) should be implemented in the future which represent a curve in a more compact format.
Various operations are supported, including interpolation and composition.
typedef struct stp_curve stp_curve_t |
The curve opaque data type.
enum stp_curve_bounds_t |
enum stp_curve_compose_t |
enum stp_curve_type_t |
int stp_curve_compose | ( | stp_curve_t ** | retval, | |
stp_curve_t * | a, | |||
stp_curve_t * | b, | |||
stp_curve_compose_t | mode, | |||
int | points | |||
) |
Compose two curves, creating a third curve.
Only add and multiply composition is currently supported. If both curves are gamma curves with the same sign, and the operation is multiplication or division, the returned curve is a gamma curve with the appropriate number of points. Both a and b must have the same wraparound type.
retval | a pointer to store the location of the newly-created output curve in. | |
a | the first source curve. | |
b | the second source curve. | |
mode | the composition mode. | |
points | the number of points in the output curve (must not exceed 1048576). It must be at least two, unless the curve is a gamma curve and the operation chosen is multiplication or division. If -1, the resulting number of points will be the least common multiplier of the number of points in the input and output curves (but will not exceed 1048576). |
void stp_curve_copy | ( | stp_curve_t * | dest, | |
const stp_curve_t * | source | |||
) |
Copy an curve.
Both dest and source must be valid curves previously created with stp_curve_create().
dest | the destination curve. | |
source | the source curve. |
size_t stp_curve_count_points | ( | const stp_curve_t * | curve | ) |
Get the number of allocated points in the curve.
curve | the curve to use. |
stp_curve_t* stp_curve_create | ( | stp_curve_wrap_mode_t | wrap | ) |
Create a new curve.
Curves have y=lower..upper. The default bounds are 0..1. The default interpolation type is linear. There are no points allocated, and the gamma is defaulted to 1. The curve is a dense (equally-spaced) curve.
A wrapped curve has the same value at x=0 and x=1. The wrap mode of a curve cannot be changed except by routines that destroy the old curve entirely (e. g. stp_curve_copy, stp_curve_read).
wrap | the wrap mode of the curve. |
stp_curve_t* stp_curve_create_copy | ( | const stp_curve_t * | curve | ) |
Copy and allocate an curve.
dest will be created, and then the contents of source will be copied into it. dest must not have been previously allocated with stp_curve_create().
curve | the source curve. |
stp_curve_t* stp_curve_create_from_file | ( | const char * | file | ) |
Create a curve from a stream.
file | the file to read. |
stp_curve_t* stp_curve_create_from_stream | ( | FILE * | fp | ) |
Create a curve from a stream.
fp | the stream to read. |
stp_curve_t* stp_curve_create_from_string | ( | const char * | string | ) |
Create a curve from a string.
string | the string to read. |
void stp_curve_destroy | ( | stp_curve_t * | curve | ) |
Destroy an curve.
It is an error to destroy the curve more than once.
curve | the curve to destroy. |
void stp_curve_get_bounds | ( | const stp_curve_t * | curve, | |
double * | low, | |||
double * | high | |||
) |
Get the lower and upper bounds on a curve.
curve | the curve to use. | |
low | a pointer to a double to store the lower bound in. | |
high | a pointer to a double to store the upper bound in. |
const double* stp_curve_get_data | ( | const stp_curve_t * | curve, | |
size_t * | count | |||
) |
Get a pointer to the curve's raw data.
curve | the curve to use. | |
count | a pointer to a size_t to store the curve size in. |
const stp_curve_point_t* stp_curve_get_data_points | ( | const stp_curve_t * | curve, | |
size_t * | count | |||
) |
Get a pointer to the curve's raw data as points.
curve | the curve to use. | |
count | a pointer to a size_t to store the curve size in. |
const float* stp_curve_get_float_data | ( | const stp_curve_t * | curve, | |
size_t * | count | |||
) |
Get pointer to the curve's raw data as floats.
curve | the curve to use. | |
count | a pointer to a size_t to store the curve size in. |
double stp_curve_get_gamma | ( | const stp_curve_t * | curve | ) |
Get the gamma value of the curve.
const int* stp_curve_get_int_data | ( | const stp_curve_t * | curve, | |
size_t * | count | |||
) |
Get pointer to the curve's raw data as integers.
curve | the curve to use. | |
count | a pointer to a size_t to store the curve size in. |
stp_curve_type_t stp_curve_get_interpolation_type | ( | const stp_curve_t * | curve | ) |
Get the curve interpolation type.
curve | the curve to use. |
const long* stp_curve_get_long_data | ( | const stp_curve_t * | curve, | |
size_t * | count | |||
) |
Get pointer to the curve's raw data as longs.
curve | the curve to use. | |
count | a pointer to a size_t to store the curve size in. |
int stp_curve_get_point | ( | const stp_curve_t * | curve, | |
size_t | where, | |||
double * | data | |||
) |
Get a point along the curve.
curve | the curve to use. | |
where | the point to get. | |
data | a pointer to a double to store the value of where in. |
void stp_curve_get_range | ( | const stp_curve_t * | curve, | |
double * | low, | |||
double * | high | |||
) |
const stp_sequence_t* stp_curve_get_sequence | ( | const stp_curve_t * | curve | ) |
Get the underlying stp_sequence_t data structure which stp_curve_t is derived from.
This can be used for fast access to the raw data.
curve | the curve to use. |
const short* stp_curve_get_short_data | ( | const stp_curve_t * | curve, | |
size_t * | count | |||
) |
Get pointer to the curve's raw data as shorts.
curve | the curve to use. | |
count | a pointer to a size_t to store the curve size in. |
stp_curve_t* stp_curve_get_subrange | ( | const stp_curve_t * | curve, | |
size_t | start, | |||
size_t | count | |||
) |
Get a curve containing a subrange of data.
If the start or count is invalid, the returned curve will compare equal to NULL (i. e. it will be a null pointer). start and count must not exceed the number of points in the curve, and count must be at least 2. The curve must be a dense (equally-spaced) curve
curve | the curve to use. | |
start | the start of the subrange. | |
count | the number of point starting at start. |
const unsigned int* stp_curve_get_uint_data | ( | const stp_curve_t * | curve, | |
size_t * | count | |||
) |
Get pointer to the curve's raw data as unsigned integers.
curve | the curve to use. | |
count | a pointer to a size_t to store the curve size in. |
const unsigned long* stp_curve_get_ulong_data | ( | const stp_curve_t * | curve, | |
size_t * | count | |||
) |
Get pointer to the curve's raw data as unsigned longs.
curve | the curve to use. | |
count | a pointer to a size_t to store the curve size in. |
const unsigned short* stp_curve_get_ushort_data | ( | const stp_curve_t * | curve, | |
size_t * | count | |||
) |
Get pointer to the curve's raw data as unsigned shorts.
curve | the curve to use. | |
count | a pointer to a size_t to store the curve size in. |
stp_curve_wrap_mode_t stp_curve_get_wrap | ( | const stp_curve_t * | curve | ) |
Get the wrapping mode.
curve | the curve to use. |
int stp_curve_interpolate_value | ( | const stp_curve_t * | curve, | |
double | where, | |||
double * | result | |||
) |
Interpolate a point along the curve.
curve | the curve to use. | |
where | the point to interpolate. | |
result | a pointer to double to store the value of where in. If interpolation would produce a value outside of the allowed range (as could happen with spline interpolation), the value is clipped to the range. |
int stp_curve_is_piecewise | ( | const stp_curve_t * | curve | ) |
Determine whether the curve is piecewise.
curve | the curve to use. |
int stp_curve_resample | ( | stp_curve_t * | curve, | |
size_t | points | |||
) |
Resample a curve (change the number of points).
This does not destroy the gamma value of a curve. Points are interpolated as required; any interpolation that would place points outside of the bounds of the curve will be clipped to the bounds. The resulting curve is always dense (equally-spaced). This is the correct way to convert a piecewise curve to an equally-spaced curve.
curve | the curve to use (must not exceed 1048576). | |
points | the number of points. |
int stp_curve_rescale | ( | stp_curve_t * | curve, | |
double | scale, | |||
stp_curve_compose_t | mode, | |||
stp_curve_bounds_t | bounds_mode | |||
) |
Rescale a curve (multiply all points by a scaling constant).
This also rescales the bounds. Note that this currently destroys the gamma property of the curve.
curve | the curve to use. | |
scale | the scaling factor. | |
mode | the composition mode. | |
bounds_mode | the bounds exceeding mode. |
int stp_curve_set_bounds | ( | stp_curve_t * | curve, | |
double | low, | |||
double | high | |||
) |
Set the lower and upper bounds on a curve.
To change the bounds adjusting data as required, use stp_curve_rescale instead.
curve | the curve to use. | |
low | the lower bound. | |
high | the upper bound. |
int stp_curve_set_data | ( | stp_curve_t * | curve, | |
size_t | count, | |||
const double * | data | |||
) |
Set all data points of the curve.
If any of the data points fall outside the bounds, the operation is not performed and FALSE is returned. This creates a curve with equally-spaced points.
curve | the curve to use. | |
count | the number of points (must be at least two and not more than 1048576). | |
data | a pointer to an array of doubles (must be at least count in size). |
int stp_curve_set_data_points | ( | stp_curve_t * | curve, | |
size_t | count, | |||
const stp_curve_point_t * | data | |||
) |
Set all data points of the curve.
If any of the data points fall outside the bounds, the operation is not performed and FALSE is returned. This creates a piecewise curve.
curve | the curve to use. | |
count | the number of points (must be at least two and not more than 1048576). | |
data | a pointer to an array of points (must be at least count in size). The first point must have X=0, and each point must have an X value at least .000001 greater than the previous point. If the curve is not a wraparound curve, the last point must have X=1. |
int stp_curve_set_float_data | ( | stp_curve_t * | curve, | |
size_t | count, | |||
const float * | data | |||
) |
Set the data points in a curve from float values.
If any of the data points fall outside the bounds, the operation is not performed and FALSE is returned. This creates a curve with equally-spaced points.
curve | the curve to use. | |
count | the number of the number of points (must be at least two and not more than 1048576). | |
data | a pointer to an array of floats (must be at least count in size). |
int stp_curve_set_gamma | ( | stp_curve_t * | curve, | |
double | f_gamma | |||
) |
Set the gamma of a curve.
This replaces all existing points along the curve. The bounds are set to 0..1. If the gamma value is positive, the function is increasing; if negative, the function is decreasing. Count must be either 0 or at least 2. If the count is zero, the gamma of the curve is set for interpolation purposes, but points cannot be assigned to. It is illegal to set gamma on a wrap-mode curve. The resulting curve is treated as a dense (equally-spaced) curve.
curve | the curve to use. | |
f_gamma | the gamma value to set. |
int stp_curve_set_int_data | ( | stp_curve_t * | curve, | |
size_t | count, | |||
const int * | data | |||
) |
Set the data points in a curve from integer values.
If any of the data points fall outside the bounds, the operation is not performed and FALSE is returned. This creates a curve with equally-spaced points.
curve | the curve to use. | |
count | the number of the number of points (must be at least two and not more than 1048576). | |
data | a pointer to an array of integers (must be at least count in size). |
int stp_curve_set_interpolation_type | ( | stp_curve_t * | curve, | |
stp_curve_type_t | itype | |||
) |
Set the curve interpolation type.
curve | the curve to use. | |
itype | the interpolation type. |
int stp_curve_set_long_data | ( | stp_curve_t * | curve, | |
size_t | count, | |||
const long * | data | |||
) |
Set the data points in a curve from long values.
If any of the data points fall outside the bounds, the operation is not performed and FALSE is returned. This creates a curve with equally-spaced points.
curve | the curve to use. | |
count | the number of the number of points (must be at least two and not more than 1048576). | |
data | a pointer to an array of longs (must be at least count in size). |
int stp_curve_set_point | ( | stp_curve_t * | curve, | |
size_t | where, | |||
double | data | |||
) |
Set a point along the curve.
This call destroys any gamma value assigned to the curve.
curve | the curve to use. | |
where | the point to set. | |
data | the value to set where to. |
int stp_curve_set_short_data | ( | stp_curve_t * | curve, | |
size_t | count, | |||
const short * | data | |||
) |
Set the data points in a curve from short values.
If any of the data points fall outside the bounds, the operation is not performed and FALSE is returned. This creates a curve with equally-spaced points.
curve | the curve to use. | |
count | the number of the number of points (must be at least two and not more than 1048576). | |
data | a pointer to an array of shorts (must be at least count in size). |
int stp_curve_set_subrange | ( | stp_curve_t * | curve, | |
const stp_curve_t * | range, | |||
size_t | start | |||
) |
int stp_curve_set_uint_data | ( | stp_curve_t * | curve, | |
size_t | count, | |||
const unsigned int * | data | |||
) |
Set the data points in a curve from unsigned integer values.
If any of the data points fall outside the bounds, the operation is not performed and FALSE is returned. This creates a curve with equally-spaced points.
curve | the curve to use. | |
count | the number of the number of points (must be at least two and not more than 1048576). | |
data | a pointer to an array of unsigned integers (must be at least count in size). |
int stp_curve_set_ulong_data | ( | stp_curve_t * | curve, | |
size_t | count, | |||
const unsigned long * | data | |||
) |
Set the data points in a curve from unsigned long values.
If any of the data points fall outside the bounds, the operation is not performed and FALSE is returned. This creates a curve with equally-spaced points.
curve | the curve to use. | |
count | the number of the number of points (must be at least two and not more than 1048576). | |
data | a pointer to an array of unsigned longs (must be at least count in size). |
int stp_curve_set_ushort_data | ( | stp_curve_t * | curve, | |
size_t | count, | |||
const unsigned short * | data | |||
) |
Set the data points in a curve from unsigned short values.
If any of the data points fall outside the bounds, the operation is not performed and FALSE is returned. This creates a curve with equally-spaced points.
curve | the curve to use. | |
count | the number of the number of points (must be at least two and not more than 1048576). | |
data | a pointer to an array of unsigned shorts (must be at least count in size). |
int stp_curve_write | ( | FILE * | file, | |
const stp_curve_t * | curve | |||
) |
Write a curve to a file.
The printable representation is guaranteed to contain only 7-bit printable ASCII characters, and is null-terminated. The curve will not contain any space, newline, single quote, or comma characters. Furthermore, a printed curve will be read back correctly in all locales. These calls are not guaranteed to provide more than 6 decimal places of precision or +/-0.5e-6 accuracy, whichever is less.
file | the file to write. | |
curve | the curve to use. |
char* stp_curve_write_string | ( | const stp_curve_t * | curve | ) |
Write a curve to a string.
The printable representation is guaranteed to contain only 7-bit printable ASCII characters, and is null-terminated. The curve will not contain any space, newline, or comma characters. Furthermore, a printed curve will be read back correctly in all locales. These calls are not guaranteed to provide more than 6 decimal places of precision or +/-0.5e-6 accuracy, whichever is less.
curve | the curve to use. |