BEAR image compression

From ScienceZero
Jump to: navigation, search

BEAR image compression was used on the Commodore Amiga and Acorn Archimedes computers. It was designed for digitized images with 16 levels of grey. It gives a better compression ratio than GIF on continuous tone images and is very simple to implement. The small differences between pixels is coded with short symbols, large differences are coded with 7 bits and loads the absolute value of the pixel.

   Code   Operation
      0 - No change
     10 - Decrease brightness
    110 - Increase brightness
111xxxx - Set pixel to xxxx

(Codes are transmitted from left to right)

Any code that could be replaced by a shorter code or would go outside the range of 0-15 is reserved. These codes were supposed to be used for run-length encoding but this was never implemented.

This algorithm ran efficiently on the ARM CPU in the Archimedes but it was fairly slow on the MC68000 CPU in the Amiga.

C++ implementation of decompression

/*
	Uncompress a sequence of bear compressed images.
	pIn: compressed data
	pOut: output uncompressed data
	nPics: input: number of images
*/
void Bear(u32 *pIn, u8* pOut, u32 nPics) {
#define gnext ((bit>>=1) ? (D & bit) : (bit = 1<<31u, (D=pIn[cnt++]) & 1<<31))
	u32 cnt = 0, pcnt = 0, D;
	u32 bit = 0;
	u8 C = 0;						// start color				
	for (pcnt = 0; pcnt < 160*128 * nPics; pcnt++) {	// pixels in all images
		if (!gnext) pOut[pcnt] = C;			// 0 = same
		else if (!gnext) pOut[pcnt] = ++C;		// 10 = up
		else if (!gnext) pOut[pcnt] = --C;		// 110 = down
		else pOut[pcnt] = C = (!!gnext)<<3 | (!!gnext)<<2 | (!!gnext)<<1 | (!!gnext); // 111 = new color
	}
}