Fennel: /home/pub/open/dev/fennel/lucidera/bitmap/LbmSegment.cpp Source File (original) (raw)

00001 00002 00003 00004 00005 00006 00007 00008 00009 00010 00011 00012 00013 00014 00015 00016 00017 00018 00019 00020 00021 00022 #include "fennel/common/CommonPreamble.h" 00023 #include "fennel/lucidera/bitmap/LbmSegment.h" 00024 00025 FENNEL_BEGIN_CPPFILE("$Id: //open/dev/fennel/lucidera/bitmap/LbmSegment.cpp#8 $"); 00026 00027 uint LbmSegment::byteArray2Value(PBuffer array, uint arraySize) 00028 { 00029 uint value = 0; 00030 while (arraySize > 0) { 00031 value = value * (uint)(1 << LbmOneByteSize) + array[arraySize - 1]; 00032 arraySize --; 00033 } 00034 return value; 00035 } 00036 00037 00038 uint LbmSegment::value2ByteArray(uint value, PBuffer array, uint arraySize) 00039 { 00040 assert(value != 0); 00041 00042 uint size = 0; 00043 00044 while (value > 0 && size < arraySize) { 00045 array[size] = (uint8_t)(value & 0xff); 00046 value = value >> LbmOneByteSize; 00047 size ++; 00048 } 00049
00050 00051 00052 00053 if (value > 0) { 00054 size = 0; 00055 } 00056 00057 return size; 00058 } 00059 00060 uint LbmSegment::computeSpaceForZeroBytes(uint nZeroBytes) 00061 { 00062 if (nZeroBytes <= LbmZeroLengthCompact) { 00063 return 0; 00064 } 00065 00066 uint size = 0; 00067 while (nZeroBytes > 0) { 00068 nZeroBytes = nZeroBytes >> LbmOneByteSize; 00069 size++; 00070 } 00071 00072 return size; 00073 } 00074 00075 void LbmSegment::readSegDescAndAdvance( 00076 PBuffer &pSegDesc, uint &bmSegLen, uint &zeroBytes) 00077 { 00078
00079
00080 assert(pSegDesc != NULL); 00081 bmSegLen = (*pSegDesc >> LbmHalfByteSize) + 1; 00082 uint zeroLen = (*pSegDesc & LbmZeroLengthMask); 00083 00084
00085 pSegDesc++; 00086 00087 if (zeroLen <= LbmZeroLengthCompact) { 00088 zeroBytes = zeroLen; 00089 } else { 00090 zeroBytes = 00091 byteArray2Value(pSegDesc, zeroLen - LbmZeroLengthCompact); 00092 pSegDesc += zeroLen - LbmZeroLengthCompact; 00093 } 00094 } 00095 00096 uint LbmSegment::computeSegDescLength(PBuffer segDesc) 00097 { 00098 uint segDescLength = 0; 00099 00100 while (segDesc < pSegDescEnd) { 00101 uint segBytes; 00102 uint zeroBytes; 00103 readSegDescAndAdvance(segDesc, segBytes, zeroBytes); 00104 segDescLength += computeSpaceForZeroBytes(zeroBytes) + 1; 00105 } 00106 00107 return segDescLength; 00108 } 00109 00110 uint LbmSegment::computeSegLength(PBuffer segDesc) 00111 { 00112 uint segLength = 0; 00113 00114 while (segDesc < pSegDescEnd) { 00115 uint segBytes; 00116 uint zeroBytes; 00117 readSegDescAndAdvance(segDesc, segBytes, zeroBytes); 00118 segLength += segBytes; 00119 } 00120 00121 return segLength; 00122 } 00123 00124 uint LbmSegment::countSegments() 00125 { 00126 uint count = 0; 00127 00128 PBuffer segDesc = pSegDescStart; 00129 while (segDesc < pSegDescEnd) { 00130 uint segBytes; 00131 uint zeroBytes; 00132 readSegDescAndAdvance(segDesc, segBytes, zeroBytes); 00133 count++; 00134 } 00135 00136 return count; 00137 } 00138 00139 FENNEL_END_CPPFILE("$Id: //open/dev/fennel/lucidera/bitmap/LbmSegment.cpp#8 $"); 00140 00141