text: 
  
  #include "runsmap.h"
  
  //---------------------------------------------------------------------------------------------
  
  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;
  }
  