#include <stdio.h>#include <stddef.h>#include <math.h>#include <ctype.h>#include <string.h>
Go to the source code of this file.
Defines | |
| #define | BYTE char |
| #define | WORD short int |
| #define | LONG int |
| #define | PACKIDENTIFIER "\nCCP4 packed image, X: %04d, Y: %04d\n" |
| #define | PACKBUFSIZ BUFSIZ |
| #define | DIFFBUFSIZ 16384L |
| #define | max(x, y) (((x) > (y)) ? (x) : (y)) |
| #define | min(x, y) (((x) < (y)) ? (x) : (y)) |
| #define | abs(x) (((x) < 0) ? (-(x)) : (x)) |
| #define | shift_left(x, n) (((x) & setbits[32 - (n)]) << (n)) |
| #define | shift_right(x, n) (((x) >> (n)) & setbits[32 - (n)]) |
Functions | |
| LONG * | diff_words (WORD *, int, int, LONG *, LONG) |
| void | get_pck (FILE *, WORD *) |
| int | put_pck (WORD *, int, int, int) |
| static int | pack_chunk () |
| static void | unpack_word (FILE *, int, int, WORD *) |
| static void | pack_longs () |
| static int | bits () |
| static int | bits (LONG *chunk, int n) |
| static int | pack_chunk (LONG *lng, int nmbr, int bitsize, int fdesc) |
| static void | pack_longs (LONG *lng, int n, BYTE **target, int *bit, int size) |
Variables | |
| const LONG | setbits [33] |
| #define abs | ( | x | ) | (((x) < 0) ? (-(x)) : (x)) |
Definition at line 28 of file pck.c.
Referenced by bits(), MarHW::mar_move_phi(), and MarHW::marTask().
| #define BYTE char |
Definition at line 19 of file pck.c.
Referenced by pack_chunk(), and pack_longs().
| #define DIFFBUFSIZ 16384L |
Definition at line 25 of file pck.c.
Referenced by diff_words(), and put_pck().
| #define LONG int |
Definition at line 21 of file pck.c.
Referenced by diff_words(), pack_chunk(), pack_longs(), put_pck(), and unpack_word().
| #define max | ( | x, | |
| y | |||
| ) | (((x) > (y)) ? (x) : (y)) |
| #define PACKBUFSIZ BUFSIZ |
Definition at line 24 of file pck.c.
Referenced by pack_chunk().
| #define PACKIDENTIFIER "\nCCP4 packed image, X: %04d, Y: %04d\n" |
| #define shift_left | ( | x, | |
| n | |||
| ) | (((x) & setbits[32 - (n)]) << (n)) |
Definition at line 38 of file pck.c.
Referenced by pack_longs(), and unpack_word().
| #define shift_right | ( | x, | |
| n | |||
| ) | (((x) >> (n)) & setbits[32 - (n)]) |
Definition at line 39 of file pck.c.
Referenced by pack_longs(), and unpack_word().
| #define WORD short int |
Definition at line 20 of file pck.c.
Referenced by unpack_word().
| static int bits | ( | ) | [static] |
Referenced by cbf_check_digest(), cbf_compare_bitcodes(), cbf_compress_canonical(), cbf_compress_none(), cbf_decompress_canonical(), cbf_decompress_packed(), cbf_generate_canonicalcodes(), cbf_get_binary(), cbf_get_table(), cbf_initialise_compressdata(), cbf_lex(), cbf_mime_temp(), cbf_pack_nextchunk(), cbf_put_code(), cbf_set_binary(), cbf_write_binary(), MD5Final(), and put_pck().
| static int bits | ( | LONG * | chunk, |
| int | n | ||
| ) | [static] |
Definition at line 116 of file pck.c.
{
int size, maxsize, i;
for (i = 1, maxsize = abs(chunk[0]); i < n; ++i)
maxsize = max(maxsize, abs(chunk[i]));
if (maxsize == 0)
size = 0;
else if (maxsize < 8)
size = 4 * n;
else if (maxsize < 16)
size = 5 * n;
else if (maxsize < 32)
size = 6 * n;
else if (maxsize < 64)
size = 7 * n;
else if (maxsize < 128)
size = 8 * n;
else if (maxsize < 65536)
size = 16 * n;
else
size = 32 * n;
return(size);
}
| LONG * diff_words | ( | WORD * | word, |
| int | x, | ||
| int | y, | ||
| LONG * | diffs, | ||
| LONG | done | ||
| ) |
Definition at line 187 of file pck.c.
References DIFFBUFSIZ, i, and LONG.
Referenced by put_pck().
{
LONG i = 0;
LONG tot = x * y;
if(done == 0)
{
*diffs = word[0];
++diffs;
++done;
++i;
}
while((done <= x) && (i < DIFFBUFSIZ))
{
*diffs = word[done] - word[done - 1];
++diffs;
++done;
++i;
}
while ((done < tot) && (i < DIFFBUFSIZ))
{
*diffs = word[done] - (word[done - 1] + word[done - x + 1] +
word[done - x] + word[done - x - 1] + 2) / 4;
++diffs;
++done;
++i;
}
return(--diffs);
}
| void get_pck | ( | FILE * | fp, |
| WORD * | img | ||
| ) |
Definition at line 271 of file pck.c.
References i, PACKIDENTIFIER, and unpack_word().
{
int x = 0, y = 0, i = 0, c = 0;
char header[BUFSIZ];
if ( fp == NULL ) return;
rewind ( fp );
header[0] = '\n';
header[1] = 0;
while ((c != EOF) && ((x == 0) || (y == 0))) {
c = i = x = y = 0;
while ((++i < BUFSIZ) && (c != EOF) && (c != '\n') && (x==0) && (y==0))
if ((header[i] = c = getc(fp)) == '\n')
sscanf(header, PACKIDENTIFIER, &x, &y);
}
unpack_word(fp, x, y, img);
}
| static int pack_chunk | ( | ) | [static] |
Referenced by put_pck().
| static int pack_chunk | ( | LONG * | lng, |
| int | nmbr, | ||
| int | bitsize, | ||
| int | fdesc | ||
| ) | [static] |
Definition at line 145 of file pck.c.
References BYTE, i, j, LONG, pack_longs(), and PACKBUFSIZ.
{
static LONG bitsize_encode[33] = {0, 0, 0, 0, 1, 2, 3, 4, 5, 0, 0,
0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7};
LONG descriptor[2], i, j;
static BYTE *buffer = NULL;
static BYTE *buffree = NULL;
static int bitmark;
if(buffer == NULL) {
buffree = buffer = (BYTE *) malloc(PACKBUFSIZ);
bitmark = 0;
}
if(lng != NULL) {
for (i = nmbr, j = 0; i > 1; i /= 2, ++j);
descriptor[0] = j;
descriptor[1] = bitsize_encode[bitsize];
if((buffree - buffer) > (PACKBUFSIZ - (130 * 4))) {
if( write(fdesc, buffer,buffree - buffer) == -1 )
return( 0 );
buffer[0] = buffree[0];
buffree = buffer;
}
pack_longs(descriptor, 2, &buffree, &bitmark, 3);
pack_longs(lng, nmbr, &buffree, &bitmark, bitsize);
}
else {
if( write(fdesc,buffer,(buffree - buffer) + 1) == -1 )
return( 0 );
free((void *) buffer);
buffer = NULL;
}
return( 1 );
}
| static void pack_longs | ( | LONG * | lng, |
| int | n, | ||
| BYTE ** | target, | ||
| int * | bit, | ||
| int | size | ||
| ) | [static] |
Definition at line 221 of file pck.c.
References bit, BYTE, i, LONG, setbits, shift_left, and shift_right.
{
LONG mask, window;
int valids, i, temp;
int temp_bit = *bit;
BYTE *temp_target = *target;
if (size > 0)
{
mask = setbits[size];
for(i = 0; i < n; ++i)
{
window = lng[i] & mask;
valids = size;
if(temp_bit == 0)
*temp_target = (BYTE) window;
else
{
temp = shift_left(window, temp_bit);
*temp_target |= temp;
}
window = shift_right(window, 8 - temp_bit);
valids = valids - (8 - temp_bit);
if(valids < 0)
temp_bit += size;
else
{
while (valids > 0)
{
*++temp_target = (BYTE) window;
window = shift_right(window, 8);
valids -= 8;
}
temp_bit = 8 + valids;
}
if(valids == 0)
{
temp_bit = 0;
++temp_target;
}
}
*target = temp_target;
*bit = (*bit + (size * n)) % 8;
}
}
| static void pack_longs | ( | ) | [static] |
Referenced by pack_chunk().
| int put_pck | ( | WORD * | img, |
| int | x, | ||
| int | y, | ||
| int | fdesc | ||
| ) |
Definition at line 59 of file pck.c.
References bits(), diff_words(), DIFFBUFSIZ, LONG, max, and pack_chunk().
{
int chunksiz, packsiz, nbits, next_nbits, tot_nbits;
LONG buffer[DIFFBUFSIZ];
LONG *diffs = buffer;
LONG *end = diffs - 1;
LONG done = 0;
while(done < (x * y)) {
end = diff_words(img, x, y, buffer, done);
done += (end - buffer) + 1;
diffs = buffer;
while(diffs <= end) {
packsiz = 0;
chunksiz = 1;
nbits = bits(diffs, 1);
while(packsiz == 0) {
if(end <= (diffs + chunksiz * 2))
packsiz = chunksiz;
else {
next_nbits = bits(diffs + chunksiz, chunksiz);
tot_nbits = 2 * max(nbits, next_nbits);
if(tot_nbits >= (nbits + next_nbits + 6))
packsiz = chunksiz;
else {
nbits = tot_nbits;
if(chunksiz == 64)
packsiz = 128;
else
chunksiz *= 2;
}
}
}
if ( pack_chunk(diffs, packsiz, nbits / packsiz, fdesc) == 0)
return( 0 );
diffs += packsiz;
}
}
if ( pack_chunk(NULL, 0, 0, fdesc) == 0 );
return( 1 );
return( 1 );
}
| static void unpack_word | ( | FILE * | packfile, |
| int | x, | ||
| int | y, | ||
| WORD * | img | ||
| ) | [static] |
Definition at line 296 of file pck.c.
References LONG, setbits, shift_left, shift_right, and WORD.
Referenced by get_pck().
{
int valids = 0, spillbits = 0, usedbits, total = x * y;
LONG window = 0L, spill, pixel = 0, nextint, bitnum, pixnum;
static int bitdecode[8] = {0, 4, 5, 6, 7, 8, 16, 32};
while (pixel < total) {
if (valids < 6) {
if (spillbits > 0) {
window |= shift_left(spill, valids);
valids += spillbits;
spillbits = 0;
}
else {
spill = (LONG) getc(packfile);
spillbits = 8;
}
}
else {
pixnum = 1 << (window & setbits[3]);
window = shift_right(window, 3);
bitnum = bitdecode[window & setbits[3]];
window = shift_right(window, 3);
valids -= 6;
while ((pixnum > 0) && (pixel < total)) {
if (valids < bitnum) {
if (spillbits > 0) {
window |= shift_left(spill, valids);
if ((32 - valids) > spillbits) {
valids += spillbits;
spillbits = 0;
}
else {
usedbits = 32 - valids;
spill = shift_right(spill, usedbits);
spillbits -= usedbits;
valids = 32;
}
}
else {
spill = (LONG) getc(packfile);
spillbits = 8;
}
}
else {
--pixnum;
if (bitnum == 0)
nextint = 0;
else {
nextint = window & setbits[bitnum];
valids -= bitnum;
window = shift_right(window, bitnum);
if ((nextint & (1 << (bitnum - 1))) != 0)
nextint |= ~setbits[bitnum];}
if (pixel > x) {
img[pixel] = (WORD) (nextint +
(img[pixel-1] + img[pixel-x+1] +
img[pixel-x] + img[pixel-x-1] + 2) / 4);
++pixel;
}
else if (pixel != 0) {
img[pixel] = (WORD) (img[pixel - 1] + nextint);
++pixel;
}
else
img[pixel++] = (WORD) nextint;
}
}
}
}
}
| const LONG setbits[33] |
{0x00000000L, 0x00000001L, 0x00000003L, 0x00000007L,
0x0000000FL, 0x0000001FL, 0x0000003FL, 0x0000007FL,
0x000000FFL, 0x000001FFL, 0x000003FFL, 0x000007FFL,
0x00000FFFL, 0x00001FFFL, 0x00003FFFL, 0x00007FFFL,
0x0000FFFFL, 0x0001FFFFL, 0x0003FFFFL, 0x0007FFFFL,
0x000FFFFFL, 0x001FFFFFL, 0x003FFFFFL, 0x007FFFFFL,
0x00FFFFFFL, 0x01FFFFFFL, 0x03FFFFFFL, 0x07FFFFFFL,
0x0FFFFFFFL, 0x1FFFFFFFL, 0x3FFFFFFFL, 0x7FFFFFFFL,
0xFFFFFFFFL}
Definition at line 29 of file pck.c.
Referenced by pack_longs(), and unpack_word().
1.7.3