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

252 lines
8.9 KiB
C
Raw Normal View History

2024-11-22 15:19:31 +00:00
/*
*
* Copyright (C) 1996-2011, 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: DicomLookupTable (Header)
*
*/
#ifndef DILUPTAB_H
#define DILUPTAB_H
#include "dcmtk/config/osconfig.h"
#include "dcmtk/dcmdata/dctagkey.h"
#include "dcmtk/dcmimgle/dibaslut.h"
#include "dcmtk/dcmimgle/diobjcou.h"
/*------------------------*
* forward declarations *
*------------------------*/
class DcmObject;
class DcmUnsignedShort;
class DcmLongString;
class DiDocument;
class DcmItem;
/*---------------------*
* class declaration *
*---------------------*/
/** Class to handle color palette look-up tables
*/
class DCMTK_DCMIMGLE_EXPORT DiLookupTable
: public DiBaseLUT,
public DiObjectCounter
{
public:
/** constructor
*
** @param docu pointer to dataset (encapsulated)
* @param descriptor tag key containing the LUT descriptor
* @param data tag key containing the LUT data
* @param explanation tag key containing the LUT explanation
* @param descripMode mode specifying the use of the bits per table entry value
* @param status pointer to image status variable (optional)
*/
DiLookupTable(const DiDocument *docu,
const DcmTagKey &descriptor,
const DcmTagKey &data,
const DcmTagKey &explanation,
const EL_BitsPerTableEntry descripMode = ELM_UseValue,
EI_Status *status = NULL);
/** constructor
*
** @param docu pointer to dataset (encapsulated)
* @param sequence tag key containing the LUT sequence
* @param descriptor tag key containing the LUT descriptor
* @param data tag key containing the LUT data
* @param explanation tag key containing the LUT explanation
* @param descripMode mode specifying the use of the bits per table entry value
* @param pos position in the LUT sequence which should be used (optional)
* @param card pointer to storage area where the number of sequence entries
* should be stored (optional)
*/
DiLookupTable(const DiDocument *docu,
const DcmTagKey &sequence,
const DcmTagKey &descriptor,
const DcmTagKey &data,
const DcmTagKey &explanation,
const EL_BitsPerTableEntry descripMode = ELM_UseValue,
const unsigned long pos = 0,
unsigned long *card = NULL);
/** constructor
*
** @param data element containing the LUT data
* @param descriptor element containing the LUT descriptor
* @param explanation element containing the LUT explanation (optional)
* @param descripMode mode specifying the use of the bits per table entry value
* @param first expected value for "first input value mapped" (optional)
* @param status pointer to image status variable (optional)
*/
DiLookupTable(const DcmUnsignedShort &data,
const DcmUnsignedShort &descriptor,
const DcmLongString *explanation = NULL,
const EL_BitsPerTableEntry descripMode = ELM_UseValue,
const signed long first = -1,
EI_Status *status = NULL);
/** constructor
*
** @param buffer pointer to array with LUT entries
* @param count number of LUT entries
* @param bits number of bits per entry
*/
DiLookupTable(Uint16 *buffer,
const Uint32 count,
const Uint16 bits);
/** destructor
*/
virtual ~DiLookupTable();
/** invert all LUT values.
* (new_value = max_value - old_value, e.g. used for presentation LUTs)
*
** @param flag if bit 0 is set (0x1, default) the internal copy of the LUT data is modified
* or a copy of the original data is created (if not already existing),
* if bit 1 is set (0x2) the original LUT data is modified,
* a combination of both modes is also supported.
*
** @return status true if successful (0x1 if internal data modified, 0x2 if original data, 0x3 if both),
* false otherwise
*/
int invertTable(const int flag = 0x1);
/** mirror the order of all LUT entries.
* i.e. the last one becomes the first etc.
* (value[i] = value[last - i], e.g. used for presentation LUTs)
*
** @param flag if bit 0 is set (0x1, default) the internal copy of the LUT data is modified
* or a copy of the original data is created (if not already existing),
* if bit 1 is set (0x2) the original LUT data is modified,
* a combination of both modes is also supported.
*
** @return status true if successful (0x1 if internal data modified, 0x2 if original data, 0x3 if both),
* false otherwise
*/
int mirrorTable(const int flag = 0x1);
/** create an inverse copy of the current LUT.
* (input values become output values and vice versa)
* This function is used for DICOM print (mainly 8<->12 bit).
*
** @return pointer to inverse LUT
*/
DiLookupTable *createInverseLUT() const;
/** compares current LUT with specified LUT
*
** @param data element containing the LUT data
* @param descriptor element containing the LUT descriptor
*
** @return true if LUTs are not equal (1 = invalid LUT / memory error,
* 2 = descriptor differs,
* 3 = data differs)
* false (0) otherwise
*/
int compareLUT(const DcmUnsignedShort &data,
const DcmUnsignedShort &descriptor);
/** compares current LUT with specified LUT
*
** @param lut LUT to be compared with the current one
*
** @return OFTrue if LUTs are equal, OFFalse otherwise
*/
virtual OFBool operator==(const DiBaseLUT &lut);
/** compares current LUT with specified LUT
*
** @param lut LUT to be compared with the current one
*
** @return OFTrue if LUTs are equal, OFFalse otherwise
*/
virtual OFBool operator==(const DiLookupTable &lut);
protected:
/** initialize lookup table
*
** @param docu pointer to dataset (encapsulated)
* @param item pointer to item in dataset where to start (maybe NULL)
* @param descriptor tag key containing the LUT descriptor
* @param data tag key containing the LUT data
* @param explanation tag key containing the LUT explanation
* @param descripMode mode specifying the use of the bits per table entry value
* @param status pointer to image status variable (optional)
*/
void Init(const DiDocument *docu,
DcmItem *item,
const DcmTagKey &descriptor,
const DcmTagKey &data,
const DcmTagKey &explanation,
const EL_BitsPerTableEntry descripMode = ELM_UseValue,
EI_Status *status = NULL);
/** check (and possibly correct) lookup table for consistency
*
** @param count number of LUT entries
* @param bits bits per LUT entry
* @param descripMode mode specifying the use of the bits per table entry value
* @param status pointer to image status variable (optional)
*/
void checkTable(unsigned long count,
Uint16 bits,
const EL_BitsPerTableEntry descripMode = ELM_UseValue,
EI_Status *status = NULL);
/** check (and possibly correct) value for bits per LUT entry.
* Be very lenient with the value stored in the LUT descriptor and
* therefore perform some addition (heuristical tests) to assume the
* most probable value.
*
** @param bits actual value for bits per entry
* @param rightBits right value (8 or 16)
* @param wrongBits wrong value (8 or 16)
* @param descripMode mode specifying the use of the bits per table entry value
*/
void checkBits(const Uint16 bits,
const Uint16 rightBits,
const Uint16 wrongBits = 0,
const EL_BitsPerTableEntry descripMode = ELM_UseValue);
private:
/// number of bits originally allocated for a LUT entry
int OriginalBitsAllocated;
/// pointer to original data buffer (where the LUT data is created from)
void *OriginalData;
// --- declarations to avoid compiler warnings
DiLookupTable(const DiLookupTable &);
DiLookupTable &operator=(const DiLookupTable &);
};
#endif