1 /*=========================================================================
4 Module: $RCSfile: gdcmRLEFrame.cxx,v $
6 Date: $Date: 2005/02/05 01:37:09 $
7 Version: $Revision: 1.7 $
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"
24 //-------------------------------------------------------------------------
25 // Constructor / Destructor
27 //-----------------------------------------------------------------------------
29 void RLEFrame::SetOffset(unsigned int id,long offset)
31 gdcmAssertMacro(id<15);
35 long RLEFrame::GetOffset(unsigned int id)
37 gdcmAssertMacro(id<15);
41 void RLEFrame::SetLength(unsigned int id,long length)
43 gdcmAssertMacro(id<15);
47 long RLEFrame::GetLength(unsigned int id)
49 gdcmAssertMacro(id<15);
53 uint8_t *RLEFrame::ReadAndDecompressRLEFrame( uint8_t *subRaw,
57 // Loop on the fragments
58 for( unsigned int k = 1; k <= NumberOfFragments; k++ )
60 // First thing need to reset file to proper position:
61 fp->seekg(Offset[k], std::ios::beg);
62 ReadAndDecompressRLEFragment(subRaw, Length[k],
64 subRaw += rawSegmentSize;
71 * \brief Implementation of the RLE decoding algorithm for decompressing
72 * a RLE fragment. [refer to PS 3.5-2003, section G.3.2 p 86]
73 * @param subRaw Sub region where the decoded fragment should be placed.
74 * @param fragmentSize The length of the binary fragment as found on the disk.
75 * @param rawSegmentSize The expected length of the fragment ONCE Raw.
76 * @param fp File Pointer: on entry the position should be the one of
77 * the fragment to be decoded.
79 bool RLEFrame::ReadAndDecompressRLEFragment( uint8_t *subRaw,
85 long numberOfOutputBytes = 0;
86 long numberOfReadBytes = 0;
89 while( numberOfOutputBytes < rawSegmentSize )
91 fp->read( (char*)&count, 1 );
92 numberOfReadBytes += 1;
94 // Note: count <= 127 comparison is always true due to limited range
95 // of data type int8_t [since the maximum of an exact width
96 // signed integer of width N is 2^(N-1) - 1, which for int8_t
99 fp->read( (char*)subRaw, count + 1);
100 numberOfReadBytes += count + 1;
102 numberOfOutputBytes += count + 1;
106 if ( count <= -1 && count >= -127 )
109 fp->read( (char*)&newByte, 1);
110 numberOfReadBytes += 1;
111 for( int i = 0; i < -count + 1; i++ )
115 subRaw += -count + 1;
116 numberOfOutputBytes += -count + 1;
119 // if count = 128 output nothing
121 if ( numberOfReadBytes > fragmentSize )
123 gdcmWarningMacro( "Read more bytes than the segment size.");
130 //-----------------------------------------------------------------------------
133 //-----------------------------------------------------------------------------
136 //-----------------------------------------------------------------------------
140 * @param indent Indentation string to be prepended during printing.
141 * @param os Stream to print to.
143 void RLEFrame::Print( std::ostream &os, std::string indent )
148 for ( unsigned int i = 0; i < NumberOfFragments; i++ )
151 << " offset : " << Offset[i]
152 << " length : " << Length[i]
157 //-----------------------------------------------------------------------------
158 } // end namespace gdcm