00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include "gdcmRLEFramesInfo.h"
00020 #include "gdcmDebug.h"
00021 #include "gdcmUtil.h"
00022
00023 namespace gdcm
00024 {
00025
00026
00027 RLEFramesInfo::~RLEFramesInfo()
00028 {
00029 for(RLEFrameList::iterator it = Frames.begin(); it != Frames.end(); ++it)
00030 {
00031 delete (*it);
00032 }
00033 Frames.clear();
00034 }
00035
00036
00037
00038 void RLEFramesInfo::AddFrame(RLEFrame *frame)
00039 {
00040 Frames.push_back(frame);
00041 }
00042
00043 RLEFrame *RLEFramesInfo::GetFirstFrame()
00044 {
00045 ItFrames = Frames.begin();
00046 if (ItFrames != Frames.end())
00047 return *ItFrames;
00048 return NULL;
00049 }
00050
00051 RLEFrame *RLEFramesInfo::GetNextFrame()
00052 {
00053 gdcmAssertMacro (ItFrames != Frames.end());
00054
00055 ++ItFrames;
00056 if (ItFrames != Frames.end())
00057 return *ItFrames;
00058 return NULL;
00059 }
00060
00073 bool RLEFramesInfo::DecompressRLEFile( std::ifstream *fp , uint8_t *raw,
00074 int xSize, int ySize, int zSize,
00075 int bitsAllocated )
00076 {
00077 uint8_t *subRaw = raw;
00078 long rawSegmentSize = xSize * ySize;
00079
00080
00081 for(RLEFrameList::iterator it = Frames.begin(); it != Frames.end(); ++it)
00082 {
00083 subRaw = (*it)->ReadAndDecompressRLEFrame( subRaw, rawSegmentSize, fp);
00084 }
00085
00086 if ( bitsAllocated == 16 )
00087 {
00088
00089 ConvertRLE16BitsFromRLE8Bits( raw, xSize, ySize, zSize );
00090 }
00091
00092 return true;
00093 }
00094
00105 bool RLEFramesInfo::ConvertRLE16BitsFromRLE8Bits(uint8_t *raw, int xSize,
00106 int ySize, int numberOfFrames)
00107 {
00108 size_t pixelNumber = xSize * ySize;
00109 size_t rawSize = pixelNumber * numberOfFrames * 2;
00110
00111
00112
00113
00114
00115
00116 uint8_t *copyRaw = new uint8_t[rawSize];
00117 memmove( copyRaw, raw, rawSize );
00118
00119 uint8_t *x = raw;
00120 uint8_t *a;
00121 uint8_t *b;
00122
00123
00124
00125 if ( !Util::IsCurrentProcessorBigEndian() )
00126 {
00127 a = copyRaw;
00128 b = a + pixelNumber;
00129 }
00130 else
00131 {
00132 b = copyRaw;
00133 a = b + pixelNumber;
00134 }
00135
00136
00137 for ( int i = 0; i < numberOfFrames; i++ )
00138 {
00139 for ( unsigned int j = 0; j < pixelNumber; j++ )
00140 {
00141 *(x++) = *(b++);
00142 *(x++) = *(a++);
00143 }
00144 }
00145
00146 delete[] copyRaw;
00147
00148 return true;
00149 }
00150
00151
00152
00153
00154
00155
00156
00157
00158
00164 void RLEFramesInfo::Print( std::ostream &os, std::string indent )
00165 {
00166 os << std::endl;
00167 os << indent
00168 << "----------------- RLE frames --------------------------------"
00169 << std::endl;
00170 os << indent
00171 << "Total number of Frames : " << Frames.size()
00172 << std::endl;
00173 int frameNumber = 0;
00174 for(RLEFrameList::iterator it = Frames.begin(); it != Frames.end(); ++it)
00175 {
00176 os << indent
00177 << " frame number :" << frameNumber++
00178 << std::endl;
00179 (*it)->Print( os, indent + " " );
00180 }
00181 }
00182
00183
00184 }