00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039 #include <stdio.h>
00040 #include "Bitmap8.h"
00041
00042 const int Bitmap8::_lookupTableSize = 0x10000;
00043
00044 int Bitmap8::_countOr = 0;
00045 int Bitmap8::_countAnd = 0;
00046 int Bitmap8::_countCount = 0;
00047 int Bitmap8::_countCreateSBitmap = 0;
00048 int Bitmap8::_countCreateCBitmap = 0;
00049 int* Bitmap8::_countLookupTable = 0;
00050 int* Bitmap8::_sBitmapLookupTable = 0;
00051 int* Bitmap8::_cBitmapLookupTable = 0;
00052
00053 #define DEBUG_BITMAP8COUNT
00054
00055
00056
00057
00058 void Bitmap8::Init()
00059 {
00060 int i, s;
00061 int i1, i2, a1, a2;
00062
00063
00064 _countLookupTable = new int[_lookupTableSize];
00065 memset(_countLookupTable, 0, SIZE_INT*_lookupTableSize);
00066 for (i = 1; i < _lookupTableSize; i++)
00067 {
00068 if (i & 0x00ff)
00069 _countLookupTable[i]++;
00070 if (i & 0xff00)
00071 _countLookupTable[i]++;
00072 assert(1 == _countLookupTable[i] || 2 == _countLookupTable[i]);
00073 }
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083 int Bit8SBitmapLookUp[256];
00084 Bit8SBitmapLookUp[0] = 0;
00085 Bit8SBitmapLookUp[1] = 0;
00086
00087 int curValue = 0;
00088 int curIndex = 1;
00089 for (i = 2; i < 256; i++)
00090 {
00091 if (i % curIndex == 0)
00092 {
00093 curValue = curValue + curIndex;
00094 curIndex *= 2;
00095 }
00096 Bit8SBitmapLookUp[i] = curValue;
00097 }
00098
00099
00100 _sBitmapLookupTable = new int[_lookupTableSize];
00101 memset(_sBitmapLookupTable, 0, SIZE_INT*_lookupTableSize);
00102
00103 s = 0;
00104 for (i1 = 0; i1 < 256; i1++)
00105 {
00106
00107 a1 = Bit8SBitmapLookUp[i1] << 8;
00108
00109 for (i2 = 0; i2 < 256; i2++)
00110 {
00111
00112 a2 = Bit8SBitmapLookUp[i2];
00113
00114
00115 _sBitmapLookupTable[s] = a1 | a2;
00116 s++;
00117
00118 }
00119 }
00120
00121
00122
00123
00124 int Bit8CBitmapLookUp[256];
00125 Bit8CBitmapLookUp[0] = 0;
00126 Bit8CBitmapLookUp[1] = 1;
00127
00128 curValue = 1;
00129 curIndex = 1;
00130 for (i = 2; i < 256; i++)
00131 {
00132 if (i % curIndex == 0)
00133 {
00134 curIndex *= 2;
00135 curValue = curValue + curIndex;
00136 }
00137 Bit8CBitmapLookUp[i] = curValue;
00138 }
00139
00140 _cBitmapLookupTable = new int[_lookupTableSize];
00141 memset(_cBitmapLookupTable, 0, SIZE_INT*_lookupTableSize);
00142
00143
00144 s = 0;
00145
00146 for (i1 = 0; i1 < 256; i1++)
00147 {
00148
00149 a1 = Bit8CBitmapLookUp[i1] << 8;
00150
00151 for (i2 = 0; i2 < 256; i2++)
00152 {
00153
00154 a2 = Bit8CBitmapLookUp[i2];
00155
00156
00157 _cBitmapLookupTable[s] = a1 | a2;
00158 s++;
00159
00160 }
00161 }
00162
00163
00164 }
00165
00166
00167
00168
00169
00170 void Bitmap8::Destroy()
00171 {
00172 if (_countLookupTable != 0)
00173 delete [] _countLookupTable;
00174
00175 if (_sBitmapLookupTable != 0)
00176 delete [] _sBitmapLookupTable;
00177
00178 if (_cBitmapLookupTable != 0)
00179 delete [] _cBitmapLookupTable;
00180 }
00181
00182
00183
00184
00185
00186
00187
00188 void Bitmap8::Or(const Bitmap8 &b1, const Bitmap8 &b2)
00189 {
00190 #ifdef DEBUG_BITMAP8COUNT
00191 _countOr++;
00192 #endif
00193
00194
00195 for (int i = 0; i < b1._memSizeInt; i++)
00196 _memory[i] = b1._memory[i] | b2._memory[i];
00197 }
00198
00199
00200
00201
00202
00203
00204
00205
00206 void Bitmap8::And(const Bitmap8 &b1, const Bitmap8 &b2)
00207 {
00208
00209 #ifdef DEBUG_BITMAP8COUNT
00210 _countAnd++;
00211 #endif
00212
00213
00214 for (int i = 0; i < b1._memSizeInt; i++)
00215 _memory[i] = b1._memory[i] & b2._memory[i];
00216 }
00217
00218
00219
00220
00221
00222
00223
00224 int Bitmap8::Count()
00225 {
00226
00227 #ifdef DEBUG_BITMAP8COUNT
00228 _countCount++;
00229 #endif
00230
00231
00232 unsigned short* ms = reinterpret_cast<unsigned short*>(_memory);
00233 int support = 0;
00234
00235
00236
00237
00238 for (int i = 0; i < _memSizeShort; i++)
00239 support += _countLookupTable[ms[i]];
00240
00241 return support;
00242 }
00243
00244
00245
00246
00247
00248
00249
00250
00251
00252
00253
00254
00255
00256
00257
00258
00259 void Bitmap8::CreateSBitmap(const Bitmap8 &iBitmap)
00260 {
00261
00262 #ifdef DEBUG_BITMAP8COUNT
00263 _countCreateSBitmap++;
00264 #endif
00265
00266 assert(_memory);
00267 assert(_memSizeInt == iBitmap._memSizeInt);
00268
00269
00270
00271
00272
00273 unsigned short* ms = reinterpret_cast<unsigned short*>(_memory);
00274 const unsigned short* msib =
00275 reinterpret_cast<const unsigned short*> (iBitmap._memory);
00276
00277
00278 for (int i = 0; i < _memSizeShort; i++)
00279 ms[i] = _sBitmapLookupTable[msib[i]];
00280 }
00281
00282
00283
00284
00285
00286
00287 void Bitmap8::CreateCBitmap(const Bitmap8 &iBitmap)
00288 {
00289
00290 #ifdef DEBUG_BITMAP8COUNT
00291 _countCreateCBitmap++;
00292 #endif
00293
00294 assert(_memory);
00295 assert(_memSizeInt == iBitmap._memSizeInt);
00296
00297
00298
00299
00300
00301 unsigned short* ms = reinterpret_cast<unsigned short*>(_memory);
00302 const unsigned short* msib =
00303 reinterpret_cast<const unsigned short*> (iBitmap._memory);
00304
00305
00306 for (int i = 0; i < _memSizeShort; i++)
00307 ms[i] = _cBitmapLookupTable[msib[i]];
00308 }
00309