# Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: address@hidden # p1a9tytqat96wrej # target_branch: bzr://bzr.savannah.gnu.org/pdf/libgnupdf/trunk/ # testament_sha1: 328db2d9f92c507f10249aa637666c3d379918ed # timestamp: 2011-09-17 15:44:09 +0200 # base_revision_id: address@hidden # # Begin patch === modified file 'AUTHORS' --- AUTHORS 2011-08-04 13:49:13 +0000 +++ AUTHORS 2011-09-17 13:43:08 +0000 @@ -33,7 +33,8 @@ Franck Lesage: changed pdf-hash-helper.c pdf-hash-helper.h gnupdf.texi -Georg Gottleuber: changed pdf-filter.c pdf-stm-f-pred.c pdf-stm-f-pred.h +Georg Gottleuber: changed pdf-filter.c pdf-stm-f-pred.c pdf-stm-f-pred.h + src/base/pdf-stm-f-lzw.c torture/unit/base/stm/pdf-stm-rw-filter-lzw.c Gerardo E. Gidoni: changed gnupdf.texi pdf-stm-read.c gnupdf-tsd.texi pdf-stm-write.c configure.ac pdf-filter.c pdf-stm-f-flate.h === modified file 'ChangeLog' --- ChangeLog 2011-09-01 13:32:22 +0000 +++ ChangeLog 2011-09-17 13:43:08 +0000 @@ -1,3 +1,14 @@ +2011-09-17 Georg Gottleuber
+ + base,stm,torture: fixes bugs in lzw filter + added testfiles and unit test for lzw filter + * src/base/pdf-stm-f-lzw.c: some bug fixes + * torture/testdata/TD00006: new file + * torture/testdata/TD00007: new file + * torture/testdata/TD00008: new file + * torture/testdata/TD00009: new file + * torture/unit/base/stm/pdf-stm-rw-filter-lzw.c: new file + 2011-08-29 Aleksander Morgado doc: documented the new initialization API === modified file 'src/base/pdf-stm-f-lzw.c' --- src/base/pdf-stm-f-lzw.c 2011-08-29 15:34:31 +0000 +++ src/base/pdf-stm-f-lzw.c 2011-09-17 13:43:08 +0000 @@ -56,7 +56,7 @@ #define LZW_CACHE_SIZE (sizeof (lzw_code_t) << 3) #define LZW_MIN_BITSIZE 9 #define LZW_MAX_BITSIZE 12 -#define LZW_MAX_DICTSIZE (1 << LZW_MAX_BITSIZE) +#define LZW_MAX_DICTSIZE ((1 << LZW_MAX_BITSIZE) + 1) #define LZW_NULL_INDEX ~0U enum lzw_special_codes_e { @@ -407,6 +407,8 @@ if (st->must_reset) { lzw_buffer_put_code (&st->buffer, LZW_RESET_CODE); + lzw_buffer_set_bitsize (&st->buffer, LZW_MIN_BITSIZE); + lzw_dict_reset (&st->dict); st->must_reset = PDF_FALSE; } @@ -419,7 +421,7 @@ lzw_buffer_put_code (&st->buffer, st->string.prefix); st->string.prefix = st->string.suffix; - if (st->buffer.maxval - st->early_change == st->dict.size) + if (st->buffer.maxval - st->early_change + 2 == st->dict.size) { if (!lzw_buffer_inc_bitsize (&st->buffer)) { @@ -434,7 +436,7 @@ if (finish) { lzw_buffer_put_code (&st->buffer, st->string.prefix); - if ((st->buffer.maxval - st->early_change) == st->dict.size) + if ((st->buffer.maxval + st->early_change) == st->dict.size) { lzw_buffer_inc_bitsize (&st->buffer); } @@ -530,7 +532,7 @@ lzw_buffer_init (&filter_state->buffer, LZW_MIN_BITSIZE); lzw_dict_init (&filter_state->dict); filter_state->old_code = LZW_NULL_INDEX; - filter_state->decoded = filter_state->dec_buf + (LZW_MAX_DICTSIZE-2); + filter_state->decoded = filter_state->dec_buf + (LZW_MAX_DICTSIZE - 3); filter_state->dec_size = 0; filter_state->state_pos = LZWDEC_STATE_START; filter_state->tmp_error = NULL; @@ -664,7 +666,7 @@ while (st->new_code != LZW_EOD_CODE && st->new_code != LZW_RESET_CODE) { - st->decoded = st->dec_buf + (LZW_MAX_DICTSIZE - 2); + st->decoded = st->dec_buf + (LZW_MAX_DICTSIZE - 3); /* Is new code in the dict? */ if (st->new_code < st->dict.size) @@ -687,7 +689,7 @@ if (!lzwdec_put_decoded (st, out)) return PDF_STM_FILTER_APPLY_STATUS_NO_OUTPUT; /* No more output */ - if (st->dict.size == st->buffer.maxval - 1 - st->early_change) + if (st->dict.size == st->buffer.maxval + 1 - st->early_change) { lzw_buffer_inc_bitsize (&st->buffer); /* break; We must wait for the reset code, don't reset yet. */ === added file 'torture/testdata/TD00006' --- torture/testdata/TD00006 1970-01-01 00:00:00 +0000 +++ torture/testdata/TD00006 2011-09-17 13:43:08 +0000 @@ -0,0 +1,81 @@ +' I¤â]4K¤ÒiTrQ#GÄQ8¢'>GÉò