ECCE @ EIC Software
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
G4RTOutBitStream.cc
Go to the documentation of this file. Or view the newest version in sPHENIX GitHub for file G4RTOutBitStream.cc
1 //
2 // ********************************************************************
3 // * License and Disclaimer *
4 // * *
5 // * The Geant4 software is copyright of the Copyright Holders of *
6 // * the Geant4 Collaboration. It is provided under the terms and *
7 // * conditions of the Geant4 Software License, included in the file *
8 // * LICENSE and available at http://cern.ch/geant4/license . These *
9 // * include a list of copyright holders. *
10 // * *
11 // * Neither the authors of this software system, nor their employing *
12 // * institutes,nor the agencies providing financial support for this *
13 // * work make any representation or warranty, express or implied, *
14 // * regarding this software system or assume any liability for its *
15 // * use. Please see the license in the file LICENSE and URL above *
16 // * for the full disclaimer and the limitation of liability. *
17 // * *
18 // * This code implementation is the result of the scientific and *
19 // * technical work of the GEANT4 collaboration. *
20 // * By using, copying, modifying or distributing the software (or *
21 // * any work based on the software) you agree to acknowledge its *
22 // * use in resulting scientific publications, and indicate your *
23 // * acceptance of all terms of the Geant4 Software license. *
24 // ********************************************************************
25 //
26 //
27 //
28 //
29 //
30 
31 #include <string.h>
32 #include "G4RTJpeg.hh"
33 #include "G4RTOutBitStream.hh"
34 
35 
36 
38 {
39  if(size < 1)
40  throw( G4MemoryError( size, "G4OutBitStream" ) );
41 
42  mHeadOfBuf = mBuf = new u_char[size];
43  if( mHeadOfBuf == 0 )
44  throw( G4MemoryError( size, "G4OutBitStream" ) );
45 
46  mEndOfBuf = mBuf + size;
47 
48  memset( mHeadOfBuf, 0, size );
49 
50  mBitPos = 7;
51  mWriteFlag = 1;
52 }
53 
55 {
56  delete mBuf;
57 }
58 
59 void
61 {
62  if( ++mBuf >= mEndOfBuf )
63  mWriteFlag = 0;
64 }
65 
66 
67 
68 void
69 G4OutBitStream::SetBits(int v, int numBits)
70 {
71  if( numBits == 0 )
72  return;
73  if( numBits > 16 )
74  throw( G4BufferError( "SetBits:Max Bit Over" ) );
75  if( numBits > 8 ){
76  Set8Bits( u_char(v>>8), numBits-8 );
77  numBits = 8;
78  }
79  Set8Bits( u_char(v), numBits );
80 }
81 
82 void
84 {
85  v &= BitFullMaskT[numBits-1];
86  *mBuf |= v << (mBitPos + 1 - numBits);
87  if( (mBitPos -= numBits) < 0 ){
88  if( *mBuf == 0xff ){
89  IncBuf();
90  *mBuf = 0;
91  }
92  IncBuf();
93  mBitPos = 7;
94  }
95 }
96 
97 void
99 {
100  v &= BitFullMaskT[numBits-1];
101  int nextBits = numBits - (mBitPos + 1);
102  *mBuf |= ( v >> nextBits ) & BitFullMaskT[mBitPos];
103  if( *mBuf == 0xff ){
104  IncBuf();
105  *mBuf = 0;
106  }
107  IncBuf();
108 
109  *mBuf = v << (8 - nextBits);
110  mBitPos = 7 - nextBits;
111 }
112 
113 void
115 {
116  if( mBitPos + 1 >= numBits )
117  SetFewBits( (u_char)v, numBits );
118  else
119  SetBits2Byte( (u_char)v, numBits );
120 }
121 
122 
123 void
125 {
126  if( mBitPos != 7 )
127  SetFewBits( BitFullMaskT[mBitPos], mBitPos+1 );
128 }
129 
130 void
132 {
133  if( mWriteFlag ){
134  FullBit();
135  *mBuf = dat;
136  IncBuf();
137  return;
138  }
139  throw( G4BufferError( "SetByte" ) );
140 }
141 
142 void
144 {
145  if( mWriteFlag ){
146  FullBit();
147  *mBuf = (dat >> 8) & 0xff;
148  IncBuf();
149  *mBuf = dat & 0xff;
150  IncBuf();
151  return;
152  }
153  throw( G4BufferError( "SetWord" ) );
154 }
155 
156 void
157 G4OutBitStream::CopyByte(const char* src, int n)
158 {
159  if( mBuf+n < mEndOfBuf ){
160  FullBit();
161  memcpy( mBuf, src, n );
162  mBuf += n;
163  return;
164  }
165  throw( G4BufferError( "CopyByte" ) );
166 }
167