Difference between revisions of "BEAR image compression"
From ScienceZero
| (4 intermediate revisions by the same user not shown) | |||
| Line 1: | Line 1: | ||
| − | BEAR image compression was used on the 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 | + | 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 | Code Operation | ||
| Line 6: | Line 6: | ||
110 - Increase brightness | 110 - Increase brightness | ||
111xxxx - Set pixel to xxxx | 111xxxx - Set pixel to xxxx | ||
| + | |||
(Codes are transmitted from left to right) | (Codes are transmitted from left to right) | ||
| Line 11: | Line 12: | ||
This algorithm ran efficiently on the ARM CPU in the Archimedes but it was fairly slow on the MC68000 CPU in the Amiga. | 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 | ||
| + | } | ||
| + | } | ||
[[Category:Computing]] | [[Category:Computing]] | ||
Latest revision as of 06:37, 18 December 2016
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
}
}