32 #ifndef _D_LINE_ARITH_BIT_H
33 #define _D_LINE_ARITH_BIT_H
36 #include "DBitArray.h"
37 #include "Base/include/private/DLineArith.hpp"
48 inline void copyLine<Bit>(
const typename Image<Bit>::lineType lIn,
const size_t size,
typename Image<Bit>::lineType lOut)
54 if (lIn.index==0 && lOut.index==0)
56 UINT fullNbr = size/BitArray::INT_TYPE_SIZE;
57 UINT bitRes = size - fullNbr*BitArray::INT_TYPE_SIZE;
59 memcpy(lOut.intArray, lIn.intArray, fullNbr*
sizeof(BitArray::INT_TYPE));
62 lOut.intArray[fullNbr] = lIn.intArray[fullNbr];
67 for (
size_t i=0;i<size;i++)
76 fillLine(
BitArray lInOut,
size_t size, Bit value) { this->_exec(lInOut, size, value); }
78 inline void _exec(
BitArray lIn,
size_t size,
BitArray lOut) { copyLine<Bit>(lIn, size, lOut); }
79 inline void _exec(
BitArray lInOut,
size_t size, Bit value)
81 BitArray::INT_TYPE intVal = (bool)value ? BitArray::INT_TYPE_MAX() : BitArray::INT_TYPE_MIN();
82 for (
size_t i=0;i<BitArray::INT_SIZE(size);i++)
83 lInOut.intArray[i] = intVal;
149 inline void bitShiftLeft(
BitArray lIn,
int dx,
size_t lineLen,
BitArray lOut, Bit borderValue)
151 UINT realLen = BitArray::INT_SIZE(lineLen);
152 UINT dxBytes = dx/BitArray::INT_TYPE_SIZE;
154 BitArray::INT_TYPE *bIn = lIn.intArray;
155 BitArray::INT_TYPE *bOut = lOut.intArray;
156 BitArray::INT_TYPE bBorder = (bool)borderValue ? BitArray::INT_TYPE_MAX() : BitArray::INT_TYPE_MIN();
158 if (dx>=(
int)lineLen)
164 for (
int i=0;i<(int)dxBytes;i++,bOut++)
167 UINT lMov = dx%BitArray::INT_TYPE_SIZE;
168 UINT rMov = BitArray::INT_TYPE_SIZE - lMov;
171 *bOut++ = (*bIn++ << lMov) | (bBorder >> rMov);
173 for (
int i=dxBytes+1;i<(int)realLen;i++,bIn++,bOut++)
174 *bOut = (*bIn << lMov) | (*(bIn-1) >> rMov);
177 inline void bitShiftRight(BitArray lIn,
int dx,
size_t lineLen, BitArray lOut, Bit borderValue)
179 UINT realLen = BitArray::INT_SIZE(lineLen);
180 UINT lenDiff = lIn.getBitPadX();
181 UINT dxReal = dx + lenDiff;
183 UINT dxBytes = dxReal/BitArray::INT_TYPE_SIZE;
185 BitArray::INT_TYPE *bIn = lIn.intArray + realLen-1;
186 BitArray::INT_TYPE *bOut = lOut.intArray + realLen-1;
187 BitArray::INT_TYPE bBorder = (bool)borderValue ? BitArray::INT_TYPE_MAX() : BitArray::INT_TYPE_MIN();
189 if (dx>=(
int)lineLen)
191 fillLine<Bit>(lOut, lineLen, borderValue);
195 for (
int i=0;i<(int)dxBytes;i++,bOut--)
198 BitArray::INT_TYPE rMov = dx%BitArray::INT_TYPE_SIZE;
199 BitArray::INT_TYPE lMov = BitArray::INT_TYPE_SIZE - rMov;
202 BitArray::INT_TYPE rightMask = *bIn-- & (BitArray::INT_TYPE_MAX() >> lenDiff);
203 *bOut-- = (rightMask >> rMov) | (bBorder << lMov);
205 if (dxBytes+1<realLen)
206 *bOut-- = (*bIn-- >> rMov) | (rightMask << lMov);
208 for (
int i=dxBytes+2;i<(int)realLen;i++,bIn--,bOut--)
209 *bOut = (*bIn >> rMov) | (*(bIn+1) << lMov);
213 inline void shiftLine<Bit>(
const Image<Bit>::lineType lIn,
int dx,
size_t lineLen, Image<Bit>::lineType lOut, Bit borderValue)
216 copyLine<Bit>(lIn, lineLen, lOut);
218 bitShiftLeft(lIn, dx, lineLen, lOut, borderValue);
220 bitShiftRight(lIn, -dx, lineLen, lOut, borderValue);
229 for (
size_t i=0;i<BitArray::INT_SIZE(size);i++)
230 lOut.intArray[i] = ~(lIn.intArray[i]);
239 for (
size_t i=0;i<BitArray::INT_SIZE(size);i++)
240 lOut.intArray[i] = lIn1.intArray[i] | lIn2.intArray[i];
249 for (
size_t i=0;i<BitArray::INT_SIZE(size);i++)
250 lOut.intArray[i] = lIn1.intArray[i] ^ lIn2.intArray[i];
259 for (
size_t i=0;i<BitArray::INT_SIZE(size);i++)
260 lOut.intArray[i] = lIn1.intArray[i] & ~lIn2.intArray[i];
269 for (
size_t i=0;i<BitArray::INT_SIZE(size);i++)
270 lOut.intArray[i] = lIn1.intArray[i] ^ lIn2.intArray[i];
277 typedef typename Image<Bit>::lineType lineType;
280 for (
size_t i=0;i<BitArray::INT_SIZE(size);i++)
281 lOut.intArray[i] = (lIn1.intArray[i] | lIn2.intArray[i]);
290 for (
size_t i=0;i<BitArray::INT_SIZE(size);i++)
291 lOut.intArray[i] = lIn1.intArray[i] & lIn2.intArray[i];
300 for (
size_t i=0;i<BitArray::INT_SIZE(size);i++)
301 lOut.intArray[i] = lIn1.intArray[i] & ~lIn2.intArray[i];
310 for (
size_t i=0;i<BitArray::INT_SIZE(size);i++)
311 lOut.intArray[i] = lIn1.intArray[i] | ~lIn2.intArray[i];
320 for (
size_t i=0;i<BitArray::INT_SIZE(size);i++)
321 lOut.intArray[i] = ~lIn1.intArray[i] & lIn2.intArray[i];
330 for (
size_t i=0;i<BitArray::INT_SIZE(size);i++)
331 lOut.intArray[i] = ~lIn1.intArray[i] | lIn2.intArray[i];
338 typedef typename Image<Bit>::lineType lineType;
339 inline void _exec(lineType lIn1, lineType lIn2,
size_t size, lineType lOut)
341 for (
size_t i=0;i<BitArray::INT_SIZE(size);i++)
342 lOut.intArray[i] = ~(lIn1.intArray[i] ^ lIn2.intArray[i]);
351 for (
size_t i=0;i<BitArray::INT_SIZE(size);i++)
352 lOut.intArray[i] = lIn1.intArray[i] ^ lIn2.intArray[i];
361 for (
size_t i=0;i<BitArray::INT_SIZE(size);i++)
362 lOut.intArray[i] = lIn1.intArray[i] & lIn2.intArray[i];
371 for (
size_t i=0;i<BitArray::INT_SIZE(size);i++)
372 lOut.intArray[i] = lIn1.intArray[i] & lIn2.intArray[i];
381 for (
size_t i=0;i<BitArray::INT_SIZE(size);i++)
382 lOut.intArray[i] = lIn1.intArray[i] | ~lIn2.intArray[i];
391 for (
size_t i=0;i<BitArray::INT_SIZE(size);i++)
392 lOut.intArray[i] = lIn1.intArray[i] & lIn2.intArray[i];
401 for (
size_t i=0;i<BitArray::INT_SIZE(size);i++)
402 lOut.intArray[i] = lIn1.intArray[i] | lIn2.intArray[i];
411 for (
size_t i=0;i<BitArray::INT_SIZE(size);i++)
412 lOut.intArray[i] = (lIn1.intArray[i] & lIn2.intArray[i]) | (~lIn1.intArray[i] & lIn3.intArray[i]);
Definition: DBitArray.h:46
Definition: DBaseLineOperations.hpp:110
Definition: DLineArith_Bit.h:74
Definition: DBaseImageOperations.hxx:39
Definition: DBaseLineOperations.hpp:187
Definition: DBaseLineOperations.hpp:46