/** * im_buildlut: * @input: input mask * @output: output image * * This operation builds a lookup table from a set of points. Intermediate * values are generated by piecewise linear interpolation. * * For example, consider this 2 x 2 matrix of (x, y) coordinates: * * <tgroup cols='2' align='left' colsep='1' rowsep='1'> * <tbody> * <row> * <entry>0</entry> * <entry>0</entry> * </row> * <row> * <entry>255</entry> * <entry>100</entry> * </row> * </tbody> * </tgroup> * * We then generate: * * <tgroup cols='2' align='left' colsep='1' rowsep='1'> * <thead> * <row> * <entry>Index</entry> * <entry>Value</entry> * </row> * </thead> * <tbody> * <row> * <entry>0</entry> * <entry>0</entry> * </row> * <row> * <entry>1</entry> * <entry>0.4</entry> * </row> * <row> * <entry>...</entry> * <entry>etc. by linear interpolation</entry> * </row> * <row> * <entry>255</entry> * <entry>100</entry> * </row> * </tbody> * </tgroup> * * This is then written as the output image, with the left column giving the * index in the image to place the value. * * The (x, y) points don't need to be sorted: we do that. You can have * several Ys, each becomes a band in the output LUT. You don't need to * start at zero, any integer will do, including negatives. * * See also: im_identity(), im_invertlut(). * * Returns: 0 on success, -1 on error */ int im_buildlut( DOUBLEMASK *input, IMAGE *output ) { State state; if( !input || input->xsize < 2 || input->ysize < 1 ) { im_error( "im_buildlut", "%s", _( "bad input matrix size" ) ); return( -1 ); } if( build_state( &state, input ) || buildlut( &state ) ) { free_state( &state ); return( -1 ); } im_initdesc( output, state.lut_size, 1, input->xsize - 1, IM_BBITS_DOUBLE, IM_BANDFMT_DOUBLE, IM_CODING_NONE, IM_TYPE_HISTOGRAM, 1.0, 1.0, 0, 0 ); if( im_setupout( output ) || im_writeline( 0, output, (PEL *) state.buf ) ) { free_state( &state ); return( -1 ); } free_state( &state ); return( 0 ); }
void fconfig_setgamma(FakerConfig &fc, double gamma) { fc.gamma = gamma; buildlut(fc); }