DYTSrouce/Tool/3rdParty_x64/include/dcmtk/dcmimgle/diovlay.h
2024-11-22 23:19:31 +08:00

478 lines
17 KiB
C++

/*
*
* Copyright (C) 1996-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: DicomOverlay (Header)
*
*/
#ifndef DIOVLAY_H
#define DIOVLAY_H
#include "dcmtk/config/osconfig.h"
#include "dcmtk/ofstd/ofcast.h"
#include "dcmtk/dcmimgle/diobjcou.h"
#include "dcmtk/dcmimgle/diovdat.h"
#include "dcmtk/dcmimgle/diovpln.h"
#include "dcmtk/dcmimgle/diutils.h"
/*------------------------*
* forward declarations *
*------------------------*/
class DiDocument;
class DcmOverlayData;
class DcmLongString;
/*---------------------*
* class declaration *
*---------------------*/
/** Class to handle a set of overlay planes
*/
class DCMTK_DCMIMGLE_EXPORT DiOverlay
: public DiObjectCounter
{
public:
/** constructor
*
** @param docu pointer to dataset (encapsulated)
* @param alloc bits allocated for image pixel data
* @param stored bits stored for image pixel data
* @param high high bit for image pixel data
*/
DiOverlay(const DiDocument *docu = NULL,
const Uint16 alloc = 0,
const Uint16 stored = 0,
const Uint16 high = 0);
/** constructor, clip/scale
*
** @param overlay pointer to reference overlay object
* @param left_pos x-coordinate of new overlay origin (offset for all planes)
* @param top_pos y-coordinate of new overlay origin (offset for all planes)
* @param xfactor scaling factor in x-direction
* @param yfactor scaling factor in y-direction
*/
DiOverlay(const DiOverlay *overlay,
const signed long left_pos,
const signed long top_pos,
const double xfactor,
const double yfactor);
/** constructor, flip
*
** @param overlay pointer to reference overlay object
* @param horz flip horizontally if true
* @param vert flip vertically if true
* @param columns width of the surrounding image
* @param rows height of the surrounding image
*/
DiOverlay(const DiOverlay *overlay,
const int horz,
const int vert,
const Uint16 columns,
const Uint16 rows);
/** constructor, rotate
*
** @param overlay pointer to reference overlay object
* @param degree angle by which the overlay planes should be rotated
* @param columns width of the surrounding image
* @param rows height of the surrounding image
*/
DiOverlay(const DiOverlay *overlay,
const int degree,
const Uint16 columns,
const Uint16 rows);
/** destructor
*/
virtual ~DiOverlay();
/** check whether specified plane is currently visible (not hidden)
*
** @param plane index of plane (starting from 0) or group number (0x6000-0x60ff)
*
** @return true if plane is visible, false otherwise
*/
int isPlaneVisible(unsigned int plane);
/** make specified plane visible
*
** @param plane index of plane (starting from 0) or group number (0x6000-0x60ff)
*
** @return status, true if successful, false otherwise
*/
int showPlane(unsigned int plane);
/** make specified plane visible and set parameters
*
** @param plane index of plane (starting from 0) or group number (0x6000-0x60ff)
* @param fore foreground color for overlay plane (in percent: 0.0-1.0)
* @param thresh threshold value for overlay plane (0.0-1.0)
* @param mode new overlay mode (EMO_Default for stored mode)
*
** @return status, true if successful, false otherwise
*/
int showPlane(unsigned int plane,
const double fore,
const double thresh,
const EM_Overlay mode);
/** make specified plane visible and set p-value.
* Only applicable for bitmap shutters.
*
** @param plane index of plane (starting from 0) or group number (0x6000-0x60ff)
* @param pvalue p-value to be used for the overlay plane (0..65535)
*
** @return status, true if successful, false otherwise
*/
int showPlane(unsigned int plane,
const Uint16 pvalue);
/** make all planes visible
*
** @return status, true if successful, false otherwise
*/
int showAllPlanes();
/** make all planes visible
*
** @param fore foreground color for overlay planes (in percent: 0.0-1.0)
* @param thresh threshold value for overlay planes (in percent: 0.0-1.0)
* @param mode new overlay mode (EMO_Default for stored mode)
*
** @return status, true if successful, false otherwise
*/
int showAllPlanes(const double fore,
const double thresh,
const EM_Overlay mode);
/** make specified plane invisible
*
** @param plane index of plane (starting from 0) or group number (0x6000-0x60ff)
*
** @return status, true if successful, false otherwise
*/
int hidePlane(unsigned int plane);
/** make all planes invisible
*
** @return status, true if successful, false otherwise
*/
int hideAllPlanes();
/** move plane to a new place
*
** @param plane index of plane (starting from 0) or group number (0x6000-0x60ff)
* @param left_pos new x-coordinate of the overlay plane origin
* @param top_pos new y-coordinate of the overlay plane origin
*
** @return status, true if successful, false otherwise
*/
int placePlane(unsigned int plane,
const signed int left_pos,
const signed int top_pos);
/** get group number of specified plane
*
** @param plane index of plane (starting from 0) or group number (0x6000-0x60ff)
*
** @return group number (0x6000-0x60ff) if successful, 0 otherwise
*/
unsigned int getPlaneGroupNumber(unsigned int plane) const;
/** get label of specified plane
*
** @param plane index of plane (starting from 0) or group number (0x6000-0x60ff)
*
** @return plane label if successful, NULL otherwise
*/
const char *getPlaneLabel(unsigned int plane) const;
/** get description of specified plane
*
** @param plane index of plane (starting from 0) or group number (0x6000-0x60ff)
*
** @return plane description if successful, NULL otherwise
*/
const char *getPlaneDescription(unsigned int plane) const;
/** get overlay mode of specified plane
*
** @param plane index of plane (starting from 0) or group number (0x6000-0x60ff)
*
** @return overlay mode if successful, EMO_Default otherwise
*/
EM_Overlay getPlaneMode(unsigned int plane) const;
/** get number of overlay planes
*
** @return number of overlay planes
*/
inline unsigned int getCount() const
{
return (Data != NULL) ? Data->Count : 0;
}
/** get current x-coordinate of overlay origin.
* This value is added to the origin of all overlay planes.
*
** @return x-coordinate of overlay origin
*/
inline signed long getLeft() const
{
return Left;
}
/** get current y-coordinate of overlay origin.
* This value is added to the origin of all overlay planes.
*
** @return y-coordinate of overlay origin
*/
inline signed long getTop() const
{
return Top;
}
/** check whether there are any overlay planes embedded in the pixel data
*
** @return true if there are embedded planes, false otherwise
*/
int hasEmbeddedData() const;
/** add plane to list of additional overlay planes
*
** @param group group number of plane to be added (0x6000-0x60ff).
* If group number already exists in the list of additional planes
* the old one is replaced. If the number exists in the list of
* planes stored in the image dataset the new plane hides it.
* @param left_pos x-coordinate of the plane origin
* @param top_pos y-coordinate of the plane origin
* @param columns width of the overlay plane (in pixels)
* @param rows height of the overlay plane
* @param data element where the plane data is stored
* @param label element where the plane label is stored
* @param description element where the plane description is stored
* @param mode overlay plane mode
*
** @return status, true if successful, false otherwise
*/
int addPlane(const unsigned int group,
const signed int left_pos,
const signed int top_pos,
const unsigned int columns,
const unsigned int rows,
const DcmOverlayData &data,
const DcmLongString &label,
const DcmLongString &description,
const EM_Overlay mode);
/** remove specified plane from list of additional overlay planes
*
** @param group group number of plane to be removed (0x6000-0x60ff)
*
** @return status, true if successful, false otherwise
*/
int removePlane(const unsigned int group);
inline DiOverlayPlane *getPlane(const unsigned int plane) const
{
return ((Data != NULL) && (Data->Planes != NULL) && (plane < Data->Count)) ? Data->Planes[plane] : OFstatic_cast(DiOverlayPlane *, NULL);
}
/** check whether specified plane exists
*
** @param plane index of plane (starting from 0) or group number (0x6000-0x60ff)
* @param visible flag indicating whether plane should be visible or not (default: 0 = ignore)
*
** @return status, true if such a plane exists, false otherwise
*/
inline int hasPlane(unsigned int plane,
const int visible = 0) const
{
return (convertToPlaneNumber(plane, AdditionalPlanes) > 1) && (!visible || Data->Planes[plane]->isVisible());
}
/** get overlay plane data as an array of 1/8/16 bit values.
* Memory isn't handled internally and must therefore be deleted from calling program.
*
** @param frame number of frame
* @param plane index of plane (starting from 0) or group number (0x6000-0x60ff)
* @param left_pos get x-coordinate of the plane origin
* @param top_pos get y-coordinate of the plane origin
* @param width get width of the overlay plane (in pixels)
* @param height get height of the overlay plane
* @param mode get overlay plane mode
* @param columns width of the surrounding image
* @param rows height of the surrounding image
* @param bits number of bits (stored) in the resulting array, default: 8
* @param fore foreground color used for the plane (default: 0xff = white, for 8 bits)
* @param back transparent background color (default: 0x00 = black)
*
** @return pointer to pixel data if successful, NULL otherwise
*/
void *getPlaneData(const unsigned long frame,
unsigned int plane,
unsigned int &left_pos,
unsigned int &top_pos,
unsigned int &width,
unsigned int &height,
EM_Overlay &mode,
const Uint16 columns,
const Uint16 rows,
const int bits = 8,
const Uint16 fore = 0xff,
const Uint16 back = 0x0);
/** get overlay plane data as an array of 1/8/16 bit values.
* Memory isn't handled internally and must therefore be deleted from calling program.
*
** @param frame number of frame
* @param plane index of plane (starting from 0) or group number (0x6000-0x60ff)
* @param width get width of the overlay plane (in pixels)
* @param height get height of the overlay plane
* @param bits number of bits (stored) in the resulting array, default: 8
* @param fore foreground color used for the plane (default: 0xff = white, for 8 bits)
* @param back transparent background color (default: 0x00 = black)
*
** @return pointer to pixel data if successful, NULL otherwise
*/
void *getFullPlaneData(const unsigned long frame,
unsigned int plane,
unsigned int &width,
unsigned int &height,
const int bits = 8,
const Uint16 fore = 0xff,
const Uint16 back = 0x0);
/** create overlay plane data in (6xxx,3000) format.
* (1 bit allocated and stored, foreground color is 1, background color is 0,
* data is 16 bit padded - even length)
* Memory isn't handled internally and must therefore be deleted from calling program.
*
** @param buffer stores pointer to overlay data (memory is allocated internally)
* @param plane number (0..15) or group number (0x60nn) of overlay plane
* @param width returns width of overlay plane (in pixels)
* @param height returns height of overlay plane (in pixels)
* @param frames returns number of frames (multiple overlay frames possible!)
*
** @return number of bytes allocated for the 'buffer' if successful, 0 otherwise
*/
unsigned long create6xxx3000PlaneData(Uint8 *&buffer,
unsigned int plane,
unsigned int &width,
unsigned int &height,
unsigned long &frames);
/// constant defining the maximum number of overlay planes (16)
static const unsigned int MaxOverlayCount;
/// constant defining the group number of the first overlay plane (0x6000)
static const unsigned int FirstOverlayGroup;
protected:
/** initialize new overlay managing object
*
** @param overlay reference object used as a template
*
** @return pointer to a new array of pixel data
*/
Uint16 *Init(const DiOverlay *overlay);
/** convert given plane or group number to a valid plane number
*
** @param plane plane or group number to be converted
* @param mode true or false, see return value
*
** @return status, true if successful, false otherwise.
* (1 = additional plane with the specified group number would be new,
* 2 = additional plane with the specified group number already exists,
* 3 = 'plane' is the number of a valid plane - only if 'mode' us false)
*/
int convertToPlaneNumber(unsigned int &plane,
const int mode) const;
/** convert five plane number to corresponding group number
*
** @param plane index of plane (0..15)
*
** @return group number
*/
unsigned int convertToGroupNumber(const unsigned int plane) const
{
return FirstOverlayGroup + 2 * plane;
}
/** check whether given group number is valid.
* Valid means that the number is even and between 0x6000 and 0x60ff.
*
** @param group group number to be checked
*
** @return status, true if valid, false otherwise
*/
int isValidGroupNumber(const unsigned int group) const;
/** check whether the specified plane is valid. and determine maximum resolution
* and number of frames which are common for all overlay planes so far.
*
** @param plane index of plane (0..15)
* @param mode if true the maximum number of frames is determined, otherwise not
*
** @return status, true if successful, false otherwise
*/
int checkPlane(const unsigned int plane,
const int mode = 1);
private:
/// left offset to all planes
signed long Left;
/// top offset to all planes
signed long Top;
/// maximum width of all planes
Uint16 Width;
/// maximum height of all planes
Uint16 Height;
/// maximum number of frames
unsigned long Frames;
/// status, if true planes are added later with addPlane()
int AdditionalPlanes;
/// points to overlay data (provides shared data)
DiOverlayData *Data;
// --- declarations to avoid compiler warnings
DiOverlay(const DiOverlay &);
DiOverlay &operator=(const DiOverlay &);
};
#endif