| |
| |
|
|
| |
| |
| |
| void RunsMap::setRunLength(TPixelGR8 *pix, TUINT32 length) { |
| TPixelGR8 *origPix = pix; |
| pix = origPix; |
| |
| TPixelGR8 *pixRev = pix + length - 1; |
| |
| --length; |
| if (length < 3) |
| pix->value = pixRev->value = (length << 6); |
| else { |
| pix->value = pixRev->value = (3 << 6); |
| ++pix, --pixRev; |
| if (length < 255) |
| pix->value = pixRev->value = length; |
| else { |
| pix->value = pixRev->value = 255; |
| ++pix, pixRev -= 4; |
| TUINT32 *l = (TUINT32 *)pix; |
| *l = length; |
| } |
| } |
| |
| assert(runLength(origPix) == (length + 1)); |
| } |
| |
| |
| |
| TUINT32 RunsMap::runLength(const TPixelGR8 *pix, bool reversed) const { |
| int length = pix->value >> 6; |
| if (length >= 3) { |
| pix += (reversed) ? -1 : 1, length = pix->value; |
| if (length >= 255) { |
| pix += (reversed) ? -4 : 1; |
| length = *(TUINT32 *)pix; |
| } |
| } |
| |
| return length + 1; |
| } |
| |