DYT/Tool/3rdParty_x64/include/dcmtk/dcmimgle/digsdfn.h

228 lines
8.0 KiB
C
Raw Normal View History

2024-11-22 15:19:31 +00:00
/*
*
* Copyright (C) 1998-2014, OFFIS e.V.
* All rights reserved. See COPYRIGHT file for details.
*
* This software and supporting documentation were developed by
*
* OFFIS e.V.
* R&D Division Health
* Escherweg 2
* D-26121 Oldenburg, Germany
*
*
* Module: dcmimgle
*
* Author: Joerg Riesmeier
*
* Purpose: DicomGSDFunction (Header)
*
*/
#ifndef DIGSDFN_H
#define DIGSDFN_H
#include "dcmtk/config/osconfig.h"
#include "dcmtk/dcmimgle/didispfn.h"
#define INCLUDE_CSTDDEF /* For NULL */
#include "dcmtk/ofstd/ofstdinc.h"
/*---------------------*
* class declaration *
*---------------------*/
/** Class to manage GSDF LUTs (for calibration)
*/
class DCMTK_DCMIMGLE_EXPORT DiGSDFunction
: public DiDisplayFunction
{
public:
/** constructor, read device characteristics file.
* Keywords: "max" for maximum DDL (Digital Driving Level, required at first position)
* "amb" for ambient light and "lum" for illumination (both optional)
* "ord" for the order of the polynomial curve fitting algorithm used to interpolate
* the given base points (0 or absent = use cubic spline interpolation)
*
** @param filename name of the characteristics file (luminance/OD for each DDL)
* @param deviceType type of the output device (default: monitor)
* @param ord order of the polynomial curve fitting algorithm used to interpolate
* the given base points (-1 = use file setting, 0 = cubic spline)
*/
DiGSDFunction(const char *filename,
const E_DeviceType deviceType = EDT_Monitor,
const signed int ord = -1);
/** constructor, use given array of luminance/OD values. UNTESTED
* Values must be sorted and complete (i.e. there must be an entry for each DDL).
* The given arrays are copied internally.
*
** @param val_tab pointer to array with luminance/OD values
* @param count number of array elements (should be equal to 'max + 1')
* @param max maximum DDL (digital driving level)
* @param deviceType type of the output device (default: monitor)
* @param ord order of the polynomial curve fitting algorithm used to interpolate
* the given base points (0 or negative = use cubic spline interpolation)
*/
DiGSDFunction(const double *val_tab,
const unsigned long count,
const Uint16 max = 255,
const E_DeviceType deviceType = EDT_Monitor,
const signed int ord = 0);
/** constructor, use given array of DDL and luminance/OD values. UNTESTED
* Values will be automatically sorted and missing values will be interpolated.
* The given arrays are copied internally.
*
** @param ddl_tab pointer to array with DDL values (must be with the interval 0..max)
* @param val_tab pointer to array with luminance/OD values
* @param count number of array elements (2..65536)
* @param max maximum DDL (digital driving level)
* @param deviceType type of the output device (default: monitor)
* @param ord order of the polynomial curve fitting algorithm used to interpolate
* the given base points (0 or negative = use cubic spline interpolation)
*/
DiGSDFunction(const Uint16 *ddl_tab,
const double *val_tab,
const unsigned long count,
const Uint16 max = 255,
const E_DeviceType deviceType = EDT_Monitor,
const signed int ord = 0);
/** constructor, compute luminance/OD values automatically within the specified range.
*
** @param val_min minimum luminance/OD value
* @param val_max maximum luminance/OD value
* @param count number of DDLs (digital driving level, 1..65536))
* @param deviceType type of the output device (default: monitor)
* @param ord order of the polynomial curve fitting algorithm used to interpolate
* the given base points (0 or negative = use cubic spline interpolation)
*/
DiGSDFunction(const double val_min,
const double val_max,
const unsigned long count = 256,
const E_DeviceType deviceType = EDT_Monitor,
const signed int ord = 0);
/** destructor
*/
virtual ~DiGSDFunction();
/** write curve data to a text file
*
** @param filename name of the text file to which the data should be written
* @param mode write CC and PSC to file if OFTrue
*
** @return status, true if successful, false otherwise
*/
int writeCurveData(const char *filename,
const OFBool mode = OFTrue);
/** set (reflected) ambient light value.
* measured in cd/m^2. applicable to softcopy and hardcopy devices.
* typical values: 0.5-5 for softcopy devices, 10 for transmissive hardcopy
* printer and 0 for reflective hardcopy printers.
*
** @param value ambient light value to be set (>= 0)
*
** @return status, true if successful, false otherwise
*/
int setAmbientLightValue(const double value);
/** set illumination value.
* measured in cd/m^2. applicable to hardcopy devices only.
* typical values: 2000 for transmissive hardcopy printer and 150 for
* reflective hardcopy printers.
*
** @param value illumination value to be set (>= 0)
*
** @return status, true if successful, false otherwise
*/
int setIlluminationValue(const double value);
/** set minimum optical density value "Dmin".
* measured in optical density (OD). applicable to printers only.
* typical value: 0.2
*
** @param value Dmin value to be set (or < 0 to unset)
*
** @return status, true if successful (1 = Dmax set, 2 = Dmax unset), false otherwise
*/
int setMinDensityValue(const double value);
/** set maximum optical density value "Dmax".
* measured in optical density (OD). applicable to printers only.
* typical value: 3.0
*
** @param value Dmax value to be set (or < 0 to unset)
*
** @return status, true if successful (1 = Dmax set, 2 = Dmax unset), false otherwise
*/
int setMaxDensityValue(const double value);
/** calculate the JND index for a given luminance value
*
** @param lum luminance value
*
** @return JND index if successful, -1 otherwise
*/
static double getJNDIndex(const double lum);
protected:
/** create GSDF LUT with specified number of entries
*
** @param count number of LUT entries
*
** @return pointer to created LUT if successful, NULL otherwise
*/
DiDisplayLUT *getDisplayLUT(unsigned long count);
/** calculate GSDF (array of 1023 luminance/OD values)
*
** @return status, true if successful, false otherwise
*/
int calculateGSDF();
/** calculate helper function for GSDF interpolation
*
** @return status, true if successful, false otherwise
*/
int calculateGSDFSpline();
/** calculate 'JNDMin' and 'JNDMax' for the given luminance/OD range
*
** @return status, true if successful, false otherwise
*/
int calculateJNDBoundaries();
private:
/// minimum JND index value for the given display system
double JNDMin;
/// maximum JND index value for the given display system
double JNDMax;
/// constant defining the number JND indexes for the maximum luminance/OD range (1023)
static const unsigned int GSDFCount;
/// array of luminance/OD values defining the GSDF
double *GSDFValue;
/// array of values used for the interpolation of the GSDF
double *GSDFSpline;
// --- declarations to avoid compiler warnings
DiGSDFunction(const DiGSDFunction &);
DiGSDFunction &operator=(const DiGSDFunction &);
};
#endif