1 /*=========================================================================
4 Module: $RCSfile: gdcmRLEFrame.cxx,v $
6 Date: $Date: 2005/01/31 06:17:22 $
7 Version: $Revision: 1.4 $
9 Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
10 l'Image). All rights reserved. See Doc/License.txt or
11 http://www.creatis.insa-lyon.fr/Public/Gdcm/License.html for details.
13 This software is distributed WITHOUT ANY WARRANTY; without even
14 the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15 PURPOSE. See the above copyright notices for more information.
17 =========================================================================*/
19 #include "gdcmRLEFrame.h"
20 #include "gdcmDebug.h"
27 * @param indent Indentation string to be prepended during printing.
28 * @param os Stream to print to.
30 void RLEFrame::Print( std::ostream &os, std::string indent )
35 for ( unsigned int i = 0; i < NumberOfFragments; i++ )
38 << " offset : " << Offset[i]
39 << " length : " << Length[i]
44 void RLEFrame::SetOffset(unsigned int id,long offset)
46 gdcmAssertMacro(id<15);
50 long RLEFrame::GetOffset(unsigned int id)
52 gdcmAssertMacro(id<15);
56 void RLEFrame::SetLength(unsigned int id,long length)
58 gdcmAssertMacro(id<15);
62 long RLEFrame::GetLength(unsigned int id)
64 gdcmAssertMacro(id<15);
68 uint8_t *RLEFrame::ReadAndDecompressRLEFrame( uint8_t *subRaw,
72 // Loop on the fragments
73 for( unsigned int k = 1; k <= NumberOfFragments; k++ )
75 // First thing need to reset file to proper position:
76 fp->seekg(Offset[k], std::ios::beg);
77 ReadAndDecompressRLEFragment(subRaw, Length[k],
79 subRaw += rawSegmentSize;
86 * \brief Implementation of the RLE decoding algorithm for decompressing
87 * a RLE fragment. [refer to PS 3.5-2003, section G.3.2 p 86]
88 * @param subRaw Sub region of \ref Raw where the decoded fragment
90 * @param fragmentSize The length of the binary fragment as found on the disk.
91 * @param RawSegmentSize The expected length of the fragment ONCE
93 * @param fp File Pointer: on entry the position should be the one of
94 * the fragment to be decoded.
96 bool RLEFrame::ReadAndDecompressRLEFragment( uint8_t *subRaw,
102 long numberOfOutputBytes = 0;
103 long numberOfReadBytes = 0;
106 while( numberOfOutputBytes < rawSegmentSize )
108 fp->read( (char*)&count, 1 );
109 numberOfReadBytes += 1;
111 // Note: count <= 127 comparison is always true due to limited range
112 // of data type int8_t [since the maximum of an exact width
113 // signed integer of width N is 2^(N-1) - 1, which for int8_t
116 fp->read( (char*)subRaw, count + 1);
117 numberOfReadBytes += count + 1;
119 numberOfOutputBytes += count + 1;
123 if ( count <= -1 && count >= -127 )
126 fp->read( (char*)&newByte, 1);
127 numberOfReadBytes += 1;
128 for( int i = 0; i < -count + 1; i++ )
132 subRaw += -count + 1;
133 numberOfOutputBytes += -count + 1;
136 // if count = 128 output nothing
138 if ( numberOfReadBytes > fragmentSize )
140 gdcmVerboseMacro( "Read more bytes than the segment size.");
148 } // end namespace gdcm