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 <iostream>
00040 #include "Bitmap4.h"
00041
00042 const int Bitmap4::_lookupTableSize = 0x10000;
00043
00044 int Bitmap4::_countOr = 0;
00045 int Bitmap4::_countAnd = 0;
00046 int Bitmap4::_countCount = 0;
00047 int Bitmap4::_countCreateSBitmap = 0;
00048 int Bitmap4::_countCreateCBitmap = 0;
00049 int* Bitmap4::_countLookupTable = 0;
00050 int* Bitmap4::_sBitmapLookupTable = 0;
00051 int* Bitmap4::_cBitmapLookupTable = 0;
00052
00053 #define DEBUG_BITMAP4COUNT
00054
00055
00056
00057
00058 void Bitmap4::Init()
00059 {
00060 int i, s;
00061 int i1, i2, i3, i4, a1, a2, a3, a4;
00062
00063
00064 _countLookupTable = new int[_lookupTableSize];
00065 memset(_countLookupTable, 0, SIZE_INT*_lookupTableSize);
00066
00067 for (i = 1; i < _lookupTableSize; i++)
00068 {
00069 if (i & 0x000f)
00070 _countLookupTable[i]++;
00071 if (i & 0x00f0)
00072 _countLookupTable[i]++;
00073 if (i & 0x0f00)
00074 _countLookupTable[i]++;
00075 if (i & 0xf000)
00076 _countLookupTable[i]++;
00077
00078 assert(1 == _countLookupTable[i] || 2 == _countLookupTable[i] ||
00079 3 == _countLookupTable[i] || 4 == _countLookupTable[i]);
00080 }
00081
00082
00083
00084
00085
00086
00087
00088
00089 int Bit4SBitmapLookUp[16];
00090 Bit4SBitmapLookUp[0] = 0;
00091 Bit4SBitmapLookUp[1] = 0;
00092
00093 int curValue = 0;
00094 int curIndex = 1;
00095 for (i = 2; i < 16; i++)
00096 {
00097 if (i % curIndex == 0)
00098 {
00099 curValue = curValue + curIndex;
00100 curIndex *= 2;
00101 }
00102 Bit4SBitmapLookUp[i] = curValue;
00103 }
00104
00105
00106 _sBitmapLookupTable = new int[_lookupTableSize];
00107 memset(_sBitmapLookupTable, 0, SIZE_INT*_lookupTableSize);
00108
00109
00110 s = 0;
00111
00112 for (i1 = 0; i1 < 16; i1++)
00113 {
00114
00115 a1 = Bit4SBitmapLookUp[i1] << 12;
00116
00117 for (i2 = 0; i2 < 16; i2++)
00118 {
00119
00120 a2 = Bit4SBitmapLookUp[i2] << 8;
00121
00122 for (i3 = 0; i3 < 16; i3++)
00123 {
00124
00125 a3 = Bit4SBitmapLookUp[i3] << 4;
00126
00127 for (i4 = 0;i4 < 16;i4++)
00128 {
00129
00130 a4 = Bit4SBitmapLookUp[i4];
00131
00132
00133 _sBitmapLookupTable[s] = a1 | a2 | a3 | a4;
00134 s++;
00135
00136 }
00137 }
00138 }
00139 }
00140
00141
00142
00143
00144 int Bit4CBitmapLookUp[16] =
00145 {0, 1, 3, 3, 7, 7, 7, 7, 15, 15, 15, 15, 15, 15, 15, 15};
00146
00147 _cBitmapLookupTable = new int[_lookupTableSize];
00148 memset(_cBitmapLookupTable, 0, SIZE_INT*_lookupTableSize);
00149
00150 s = 0;
00151
00152 for (i1 = 0; i1 < 16; i1++)
00153 {
00154
00155 a1 = Bit4CBitmapLookUp[i1] << 12;
00156
00157 for (i2 = 0; i2 < 16; i2++)
00158 {
00159
00160 a2 = Bit4CBitmapLookUp[i2] << 8;
00161
00162 for (i3 = 0; i3 < 16; i3++)
00163 {
00164
00165 a3 = Bit4CBitmapLookUp[i3] << 4;
00166
00167 for (i4 = 0;i4 < 16;i4++)
00168 {
00169
00170 a4 = Bit4CBitmapLookUp[i4];
00171
00172
00173 _cBitmapLookupTable[s] = a1 | a2 | a3 | a4;
00174 s++;
00175
00176 }
00177 }
00178 }
00179 }
00180
00181 }
00182
00183
00184
00185
00186 void Bitmap4::Destroy()
00187 {
00188 if (_countLookupTable != 0)
00189 delete [] _countLookupTable;
00190
00191 if (_sBitmapLookupTable != 0)
00192 delete [] _sBitmapLookupTable;
00193
00194 if (_cBitmapLookupTable != 0)
00195 delete [] _cBitmapLookupTable;
00196 }
00197
00198
00199
00200
00201
00202
00203
00204 void Bitmap4::Or(const Bitmap4 &b1, const Bitmap4 &b2)
00205 {
00206
00207 #ifdef DEBUG_BITMAP4COUNT
00208 _countOr++;
00209 #endif
00210
00211
00212 for (int i = 0; i < b1._memSizeInt; i++)
00213 _memory[i] = b1._memory[i] | b2._memory[i];
00214 }
00215
00216
00217
00218
00219
00220
00221
00222
00223 void Bitmap4::And(const Bitmap4 &b1, const Bitmap4 &b2)
00224 {
00225 #ifdef DEBUG_BITMAP4COUNT
00226 _countAnd++;
00227 #endif
00228
00229
00230 for (int i = 0; i < b1._memSizeInt; i++)
00231 _memory[i] = b1._memory[i] & b2._memory[i];
00232
00233 }
00234
00235
00236
00237
00238
00239
00240
00241 int Bitmap4::Count()
00242 {
00243
00244 #ifdef DEBUG_BITMAP4COUNT
00245 _countCount++;
00246 #endif
00247
00248
00249
00250
00251 unsigned short* ms = reinterpret_cast<unsigned short*>(_memory);
00252 int support = 0;
00253
00254
00255
00256
00257 for (int i = 0; i < _memSizeShort; i++)
00258 support += _countLookupTable[ms[i]];
00259
00260 return support;
00261 }
00262
00263
00264
00265
00266
00267
00268
00269
00270
00271
00272
00273
00274
00275
00276
00277
00278
00279 void Bitmap4::CreateSBitmap(const Bitmap4 &iBitmap)
00280 {
00281
00282 #ifdef DEBUG_BITMAP4COUNT
00283 _countCreateSBitmap++;
00284 #endif
00285
00286 assert(_memory);
00287 assert(_memSizeInt == iBitmap._memSizeInt);
00288
00289
00290
00291
00292
00293
00294 unsigned short* ms = reinterpret_cast<unsigned short*>(_memory);
00295 const unsigned short* msib =
00296 reinterpret_cast<const unsigned short*> (iBitmap._memory);
00297
00298
00299 for (int i = 0; i < _memSizeShort; i++)
00300 ms[i] = _sBitmapLookupTable[msib[i]];
00301 }
00302
00303
00304
00305
00306
00307
00308 void Bitmap4::CreateCBitmap(const Bitmap4 &iBitmap)
00309 {
00310 assert(_memory);
00311 assert(_memSizeInt == iBitmap._memSizeInt);
00312
00313 #ifdef DEBUG_BITMAP4COUNT
00314
00315 _countCreateCBitmap++;
00316 #endif
00317
00318
00319
00320
00321
00322
00323 unsigned short* ms = reinterpret_cast<unsigned short*>(_memory);
00324 const unsigned short* msib =
00325 reinterpret_cast<const unsigned short*> (iBitmap._memory);
00326
00327
00328 for (int i = 0; i < _memSizeShort; i++)
00329 ms[i] = _cBitmapLookupTable[msib[i]];
00330 }
00331