diff options
author | Tor Andersson <tor@ghostscript.com> | 2011-02-23 23:43:55 +0000 |
---|---|---|
committer | Tor Andersson <tor@ghostscript.com> | 2011-02-23 23:43:55 +0000 |
commit | 7aab191974af3c05d8c2d6595378f6c6e7899b3e (patch) | |
tree | 432ad05f56d99b8d258537631b874ebd6bb31dfe /fitz | |
parent | 26eb1c46ea350777e9a6970c576bcfb03abba948 (diff) | |
download | mupdf-7aab191974af3c05d8c2d6595378f6c6e7899b3e.tar.xz |
Add bitstream reader functions.
Diffstat (limited to 'fitz')
-rw-r--r-- | fitz/fitz.h | 34 | ||||
-rw-r--r-- | fitz/stm_open.c | 3 |
2 files changed, 37 insertions, 0 deletions
diff --git a/fitz/fitz.h b/fitz/fitz.h index 685a75f3..bea851fa 100644 --- a/fitz/fitz.h +++ b/fitz/fitz.h @@ -499,6 +499,8 @@ struct fz_stream_s int refs; int dead; int pos; + int avail; + int bits; unsigned char *bp, *rp, *wp, *ep; void *state; int (*read)(fz_stream *stm, unsigned char *buf, int len); @@ -548,6 +550,38 @@ static inline void fz_unreadbyte(fz_stream *stm) stm->rp--; } +static inline unsigned int fz_readbits(fz_stream *stm, int n) +{ + unsigned int x; + + if (n <= stm->avail) + { + stm->avail -= n; + x = (stm->bits >> stm->avail) & ((1 << n) - 1); + } + else + { + x = stm->bits & ((1 << stm->avail) - 1); + n -= stm->avail; + stm->avail = 0; + + while (n > 8) + { + x = (x << 8) | fz_readbyte(stm); + n -= 8; + } + + if (n > 0) + { + stm->bits = fz_readbyte(stm); + stm->avail = 8 - n; + x = (x << n) | (stm->bits >> stm->avail); + } + } + + return x; +} + /* * Data filters. */ diff --git a/fitz/stm_open.c b/fitz/stm_open.c index d59062cc..b81d9176 100644 --- a/fitz/stm_open.c +++ b/fitz/stm_open.c @@ -13,6 +13,9 @@ fz_newstream(void *state, stm->dead = 0; stm->pos = 0; + stm->bits = 0; + stm->avail = 0; + stm->bp = stm->buf; stm->rp = stm->bp; stm->wp = stm->bp; |