#ifndef GDCMRLECODEC_H
#define GDCMRLECODEC_H
#include "gdcmImageCodec.h"
namespace gdcm
{
class Fragment;
class RLEInternals;
class GDCM_EXPORT RLECodec : public ImageCodec
{
friend class ImageRegionReader;
public:
RLECodec();
~RLECodec() override;
bool CanCode(TransferSyntax const &ts) const override;
bool CanDecode(TransferSyntax const &ts) const override;
bool Decode(DataElement const &is, DataElement &os) override;
unsigned long GetBufferLength() const { return BufferLength; }
void SetBufferLength(unsigned long l) { BufferLength = l; }
bool Code(DataElement const &in, DataElement &out) override;
bool GetHeaderInfo(std::istream &is, TransferSyntax &ts) override;
ImageCodec * Clone() const override;
protected:
bool DecodeExtent(
char *buffer,
unsigned int XMin, unsigned int XMax,
unsigned int YMin, unsigned int YMax,
unsigned int ZMin, unsigned int ZMax,
std::istream & is
);
bool DecodeByStreams(std::istream &is, std::ostream &os) override;
public:
void SetLength(unsigned long l)
{
Length = l;
}
protected:
bool StartEncode( std::ostream & ) override;
bool IsRowEncoder() override;
bool IsFrameEncoder() override;
bool AppendRowEncode( std::ostream & out, const char * data, size_t datalen ) override;
bool AppendFrameEncode( std::ostream & out, const char * data, size_t datalen ) override;
bool StopEncode( std::ostream & ) override;
private:
bool DecodeByStreamsCommon(std::istream &is, std::ostream &os);
RLEInternals *Internals;
unsigned long Length;
unsigned long BufferLength;
size_t DecodeFragment(Fragment const & frag, char *buffer, size_t llen);
};
}
#endif