# Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: address@hidden # 1vk44n5efr9b39rq # target_branch: bzr://bzr.sv.gnu.org/pdf/libgnupdf/trunk/ # testament_sha1: f0f86d87054a9ca1ff4b0c5482bb95aa9734123c # timestamp: 2011-12-14 18:56:50 +0100 # base_revision_id: address@hidden # # Begin patch === modified file 'AUTHORS' --- AUTHORS 2011-08-04 13:49:13 +0000 +++ AUTHORS 2011-12-14 17:56:25 +0000 @@ -34,6 +34,7 @@ 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 + torture/unit/base/stm/pdf-stm-rw-filter-jbig2.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-10-11 21:17:52 +0000 +++ ChangeLog 2011-12-14 17:56:25 +0000 @@ -1,3 +1,10 @@ +2011-12-14 Georg Gottleuber + + torture: JBIG2 unit tests added + * torture/unit/base/stm/pdf-stm-rw-filter-jbig2.c: new file + * torture/unit/base/stm/tsuite-stm.c: added JBIG2 unit tests + * torture/unit/Makefile.am: added JBIG2 unit tests + 2011-10-11 Jose E. Marchesi prmgt: converters to html reverted to a previous revision. === modified file 'torture/unit/Makefile.am' --- torture/unit/Makefile.am 2011-08-29 15:17:29 +0000 +++ torture/unit/Makefile.am 2011-12-14 17:56:25 +0000 @@ -76,7 +76,8 @@ base/stm/pdf-stm-rw-filter-a85.c \ base/stm/pdf-stm-rw-filter-flate.c \ base/stm/pdf-stm-rw-filter-v2.c \ - base/stm/pdf-stm-rw-filter-aesv2.c + base/stm/pdf-stm-rw-filter-aesv2.c \ + base/stm/pdf-stm-rw-filter-jbig2.c TEST_SUITE_HASH = base/hash/pdf-hash-new.c \ base/hash/pdf-hash-add.c \ === added file 'torture/unit/base/stm/pdf-stm-rw-filter-jbig2.c' --- torture/unit/base/stm/pdf-stm-rw-filter-jbig2.c 1970-01-01 00:00:00 +0000 +++ torture/unit/base/stm/pdf-stm-rw-filter-jbig2.c 2011-12-14 17:56:25 +0000 @@ -0,0 +1,473 @@ +/* -*- mode: C -*- + * + * File: pdf-stm-rw-filter-jbig2.c + * Date: Fr Dec 9 09:50:09 2011 + * + * GNU PDF Library - Unit tests for JBIG2 decoder filter. + * + */ + +/* Copyright (C) 2011 Free Software Foundation, Inc. */ + +/* This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include + +#include +#include +#include +#include +#include +#include "pdf-stm-test-common.h" + +#define JBIG2_PARAM_GLOBAL_STREAMS_BUFFER "GlobalStreamsBuffer" +#define JBIG2_PARAM_GLOBAL_STREAMS_SIZE "GlobalStreamsSize" + +struct test_strings_s { + pdf_size_t pageseg_size; + const pdf_char_t *pageseg; + + pdf_size_t globalseg_size; + const pdf_char_t *globalseg; + + pdf_size_t bitmap_size; + const pdf_char_t *bitmap; +}; + +static const struct test_strings_s test_strings_with_halftones[] = { + { + /* from ISO/IEC 14492 draft annex H */ + 341, + /* segments 2 to 7 from ISO/IEC 14492 (Huffman & MMR coding) */ + "\x00\x00\x00\x01\x30\x00\x01\x00\x00\x00\x13\x00\x00\x00\x40\x00" + "\x00\x00\x38\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00" + "\x00\x02\x00\x01\x01\x00\x00\x00\x1c\x00\x01\x00\x00\x00\x02\x00" + "\x00\x00\x02\xe5\xcd\xf8\x00\x79\xe0\x84\x10\x81\xf0\x82\x10\x86" + "\x10\x79\xf0\x00\x80\x00\x00\x00\x03\x07\x42\x00\x02\x01\x00\x00" + "\x00\x31\x00\x00\x00\x25\x00\x00\x00\x08\x00\x00\x00\x04\x00\x00" + "\x00\x01\x00\x0c\x09\x00\x10\x00\x00\x00\x05\x01\x10\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0c\x40\x07\x08" + "\x70\x41\xd0\x00\x00\x00\x04\x27\x00\x01\x00\x00\x00\x2c\x00\x00" + "\x00\x36\x00\x00\x00\x2c\x00\x00\x00\x04\x00\x00\x00\x0b\x00\x01" + "\x26\xa0\x71\xce\xa7\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" + "\xff\xff\xff\xff\xff\xff\xff\xff\xf8\xf0\x00\x00\x00\x05\x10\x01" + "\x01\x00\x00\x00\x2d\x01\x04\x04\x00\x00\x00\x0f\x20\xd1\x84\x61" + "\x18\x45\xf2\xf9\x7c\x8f\x11\xc3\x9e\x45\xf2\xf9\x7d\x42\x85\x0a" + "\xaa\x84\x62\x2f\xee\xec\x44\x62\x22\x35\x2a\x0a\x83\xb9\xdc\xee" + "\x77\x80\x00\x00\x00\x06\x17\x20\x05\x01\x00\x00\x00\x57\x00\x00" + "\x00\x20\x00\x00\x00\x24\x00\x00\x00\x10\x00\x00\x00\x0f\x00\x01" + "\x00\x00\x00\x08\x00\x00\x00\x09\x00\x00\x00\x00\x00\x00\x00\x00" + "\x04\x00\x00\x00\xaa\xaa\xaa\xaa\x80\x08\x00\x80\x36\xd5\x55\x6b" + "\x5a\xd4\x00\x40\x04\x2e\xe9\x52\xd2\xd2\xd2\x8a\xa5\x4a\x00\x20" + "\x02\x23\xe0\x95\x24\xb4\x92\x8a\x4a\x92\x54\x92\xd2\x4a\x29\x2a" + "\x49\x40\x04\x00\x40", + 68, + /* segments 1 an 17 from ISO/IEC 14492 */ + "\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x18\x00\x01\x00\x00\x00" + "\x01\x00\x00\x00\x01\xe9\xcb\xf4\x00\x26\xaf\x04\xbf\xf0\x78\x2f" + "\xe0\x00\x40\x00\x00\x00\x10\x00\x01\x00\x00\x00\x00\x16\x08\x00" + "\x02\xff\x00\x00\x00\x01\x00\x00\x00\x01\x4f\xe7\x8d\x68\x1b\x14" + "\x2f\x3f\xff\xac", + 448, + "\x00\x00\x00\x00\x00\x00\x00\x00\x07\x87\x8f\x0f\x0f\x00\x00\x00" + "\x08\x40\x48\x80\x90\x80\x00\x00\x08\x07\xc8\x8f\x90\x00\x00\x00" + "\x08\x08\x48\x90\x90\x00\x00\x00\x08\x48\x4f\x10\x90\x80\x00\x00" + "\x07\x87\xc8\x0f\x8f\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00" + "\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x0f\xff\xff\xff\xff\xff\xff\xc0" + "\x0f\xff\xff\xff\xff\xff\xff\xc0\x0c\x00\x00\x00\x00\x00\x00\xc0" + "\x0c\x00\x00\x00\x00\x00\x00\xc0\x0c\x00\x00\x00\x02\x22\x00\xc0" + "\x0c\x00\x02\x66\x66\xee\x00\xc0\x0c\x00\x00\x02\x66\x66\x00\xc0" + "\x0c\x00\x00\x00\x00\x04\x00\xc0\x0c\x00\x00\x00\x22\x22\x00\xc0" + "\x0c\x00\x26\x66\x6e\xee\x00\xc0\x0c\x00\x00\x26\x66\x67\x00\xc0" + "\x0c\x00\x00\x00\x00\x44\x00\xc0\x0c\x00\x00\x02\x22\x26\x00\xc0" + "\x0c\x00\x66\x66\xee\xee\x00\xc0\x0c\x00\x02\x66\x66\x7f\x00\xc0" + "\x0c\x00\x00\x00\x04\x44\x00\xc0\x0c\x00\x00\x22\x22\x66\x00\xc0" + "\x0c\x00\x66\x6e\xee\xee\x00\xc0\x0c\x00\x26\x66\x67\xff\x00\xc0" + "\x0c\x00\x00\x00\x44\x46\x00\xc0\x0c\x00\x02\x22\x26\x66\x00\xc0" + "\x0c\x00\x66\xee\xee\xef\x00\xc0\x0c\x00\x66\x66\x7f\xff\x00\xc0" + "\x0c\x00\x00\x04\x44\x66\x00\xc0\x0c\x00\x22\x22\x66\x6e\x00\xc0" + "\x0c\x00\x6e\xee\xee\xff\x00\xc0\x0c\x00\x66\x67\xff\xff\x00\xc0" + "\x0c\x00\x00\x44\x46\x66\x00\xc0\x0c\x00\x22\x26\x66\xef\x00\xc0" + "\x0c\x00\xee\xee\xef\xff\x00\xc0\x0c\x00\x66\x7f\xff\xff\x00\xc0" + "\x0c\x00\x04\x44\x66\x66\x00\xc0\x0c\x00\x22\x66\x6e\xff\x00\xc0" + "\x0c\x00\xee\xee\xff\xff\x00\xc0\x0c\x00\x67\xff\xff\xff\x00\xc0" + "\x0c\x00\x44\x46\x66\x67\x00\xc0\x0c\x00\x26\x66\xef\xff\x00\xc0" + "\x0c\x00\xee\xef\xff\xff\x00\xc0\x0c\x00\x7f\xff\xff\xff\x00\xc0" + "\x0c\x00\x44\x66\x66\x7f\x00\xc0\x0c\x00\x00\x00\x00\x00\x00\xc0" + "\x0c\x00\x00\x00\x00\x00\x00\xc0\x0f\xff\xff\xff\xff\xff\xff\xc0" + "\x0f\xff\xff\xff\xff\xff\xff\xc0\x00\x00\x00\x00\x00\x00\x00\x00" + }, + { + 271, + /* segments 8 to 14 from ISO/IEC 14492 (arithmetic coding) */ + "\x00\x00\x00\x08\x30\x00\x01\x00\x00\x00\x13\x00\x00\x00\x40\x00" + "\x00\x00\x38\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00" + "\x00\x09\x00\x01\x01\x00\x00\x00\x1b\x08\x00\x02\xff\x00\x00\x00" + "\x02\x00\x00\x00\x02\x4f\xe7\x8c\x20\x0e\x1d\xc7\xcf\x01\x11\xc4" + "\xb2\x6f\xff\xac\x00\x00\x00\x0a\x07\x40\x00\x09\x01\x00\x00\x00" + "\x1f\x00\x00\x00\x25\x00\x00\x00\x08\x00\x00\x00\x04\x00\x00\x00" + "\x01\x00\x0c\x08\x00\x00\x00\x05\x8d\x6e\x5a\x12\x40\x85\xff\xac" + "\x00\x00\x00\x0b\x27\x00\x01\x00\x00\x00\x23\x00\x00\x00\x36\x00" + "\x00\x00\x2c\x00\x00\x00\x04\x00\x00\x00\x0b\x00\x08\x03\xff\xfd" + "\xff\x02\xfe\xfe\xfe\x04\xee\xed\x87\xfb\xcb\x2b\xff\xac\x00\x00" + "\x00\x0c\x10\x01\x01\x00\x00\x00\x1c\x06\x04\x04\x00\x00\x00\x0f" + "\x90\x71\x6b\x6d\x99\xa7\xaa\x49\x7d\xf2\xe5\x48\x1f\xdc\x68\xbc" + "\x6e\x40\xbb\xff\xac\x00\x00\x00\x0d\x17\x20\x0c\x01\x00\x00\x00" + "\x3e\x00\x00\x00\x20\x00\x00\x00\x24\x00\x00\x00\x10\x00\x00\x00" + "\x0f\x00\x02\x00\x00\x00\x08\x00\x00\x00\x09\x00\x00\x00\x00\x00" + "\x00\x00\x00\x04\x00\x00\x00\x87\xcb\x82\x1e\x66\xa4\x14\xeb\x3c" + "\x4a\x15\xfa\xcc\xd6\xf3\xb1\x6f\x4c\xed\xbf\xa7\xbf\xff\xac", + 68, + /* segments 1 an 17 from ISO/IEC 14492 */ + "\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x18\x00\x01\x00\x00\x00" + "\x01\x00\x00\x00\x01\xe9\xcb\xf4\x00\x26\xaf\x04\xbf\xf0\x78\x2f" + "\xe0\x00\x40\x00\x00\x00\x10\x00\x01\x00\x00\x00\x00\x16\x08\x00" + "\x02\xff\x00\x00\x00\x01\x00\x00\x00\x01\x4f\xe7\x8d\x68\x1b\x14" + "\x2f\x3f\xff\xac", + 448, + "\x00\x00\x00\x00\x00\x00\x00\x00\x07\x87\x8f\x0f\x0f\x00\x00\x00" + "\x08\x40\x48\x80\x90\x80\x00\x00\x08\x07\xc8\x8f\x90\x00\x00\x00" + "\x08\x08\x48\x90\x90\x00\x00\x00\x08\x48\x4f\x10\x90\x80\x00\x00" + "\x07\x87\xc8\x0f\x8f\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00" + "\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x0f\xff\xff\xff\xff\xff\xff\xc0" + "\x0f\xff\xff\xff\xff\xff\xff\xc0\x0c\x00\x00\x00\x00\x00\x00\xc0" + "\x0c\x00\x00\x00\x00\x00\x00\xc0\x0c\x00\x00\x00\x02\x22\x00\xc0" + "\x0c\x00\x02\x66\x66\xee\x00\xc0\x0c\x00\x00\x02\x66\x66\x00\xc0" + "\x0c\x00\x00\x00\x00\x04\x00\xc0\x0c\x00\x00\x00\x22\x22\x00\xc0" + "\x0c\x00\x26\x66\x6e\xee\x00\xc0\x0c\x00\x00\x26\x66\x67\x00\xc0" + "\x0c\x00\x00\x00\x00\x44\x00\xc0\x0c\x00\x00\x02\x22\x26\x00\xc0" + "\x0c\x00\x66\x66\xee\xee\x00\xc0\x0c\x00\x02\x66\x66\x7f\x00\xc0" + "\x0c\x00\x00\x00\x04\x44\x00\xc0\x0c\x00\x00\x22\x22\x66\x00\xc0" + "\x0c\x00\x66\x6e\xee\xee\x00\xc0\x0c\x00\x26\x66\x67\xff\x00\xc0" + "\x0c\x00\x00\x00\x44\x46\x00\xc0\x0c\x00\x02\x22\x26\x66\x00\xc0" + "\x0c\x00\x66\xee\xee\xef\x00\xc0\x0c\x00\x66\x66\x7f\xff\x00\xc0" + "\x0c\x00\x00\x04\x44\x66\x00\xc0\x0c\x00\x22\x22\x66\x6e\x00\xc0" + "\x0c\x00\x6e\xee\xee\xff\x00\xc0\x0c\x00\x66\x67\xff\xff\x00\xc0" + "\x0c\x00\x00\x44\x46\x66\x00\xc0\x0c\x00\x22\x26\x66\xef\x00\xc0" + "\x0c\x00\xee\xee\xef\xff\x00\xc0\x0c\x00\x66\x7f\xff\xff\x00\xc0" + "\x0c\x00\x04\x44\x66\x66\x00\xc0\x0c\x00\x22\x66\x6e\xff\x00\xc0" + "\x0c\x00\xee\xee\xff\xff\x00\xc0\x0c\x00\x67\xff\xff\xff\x00\xc0" + "\x0c\x00\x44\x46\x66\x67\x00\xc0\x0c\x00\x26\x66\xef\xff\x00\xc0" + "\x0c\x00\xee\xef\xff\xff\x00\xc0\x0c\x00\x7f\xff\xff\xff\x00\xc0" + "\x0c\x00\x44\x66\x66\x7f\x00\xc0\x0c\x00\x00\x00\x00\x00\x00\xc0" + "\x0c\x00\x00\x00\x00\x00\x00\xc0\x0f\xff\xff\xff\xff\xff\xff\xc0" + "\x0f\xff\xff\xff\xff\xff\xff\xc0\x00\x00\x00\x00\x00\x00\x00\x00" + }, + { 0, NULL, 0, NULL, 0, NULL } +}; + +static const struct test_strings_s test_strings_without_halftones[] = { + /* from ISO/IEC 14492 draft annex H (but without halftone region) */ + { + 197, + /* segments 8 to 14 from ISO/IEC 14492 (arithmetic coding) + * but without halftone segment */ + "\x00\x00\x00\x08\x30\x00\x01\x00\x00\x00\x13\x00\x00\x00\x40\x00" + "\x00\x00\x38\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00" + "\x00\x09\x00\x01\x01\x00\x00\x00\x1b\x08\x00\x02\xff\x00\x00\x00" + "\x02\x00\x00\x00\x02\x4f\xe7\x8c\x20\x0e\x1d\xc7\xcf\x01\x11\xc4" + "\xb2\x6f\xff\xac\x00\x00\x00\x0a\x07\x40\x00\x09\x01\x00\x00\x00" + "\x1f\x00\x00\x00\x25\x00\x00\x00\x08\x00\x00\x00\x04\x00\x00\x00" + "\x01\x00\x0c\x08\x00\x00\x00\x05\x8d\x6e\x5a\x12\x40\x85\xff\xac" + "\x00\x00\x00\x0b\x27\x00\x01\x00\x00\x00\x23\x00\x00\x00\x36\x00" + "\x00\x00\x2c\x00\x00\x00\x04\x00\x00\x00\x0b\x00\x08\x03\xff\xfd" + "\xff\x02\xfe\xfe\xfe\x04\xee\xed\x87\xfb\xcb\x2b\xff\xac\x00\x00" + "\x00\x0c\x10\x01\x01\x00\x00\x00\x1c\x06\x04\x04\x00\x00\x00\x0f" + "\x90\x71\x6b\x6d\x99\xa7\xaa\x49\x7d\xf2\xe5\x48\x1f\xdc\x68\xbc" + "\x6e\x40\xbb\xff\xac", + 68, + "\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x18\x00\x01\x00\x00\x00" + "\x01\x00\x00\x00\x01\xe9\xcb\xf4\x00\x26\xaf\x04\xbf\xf0\x78\x2f" + "\xe0\x00\x40\x00\x00\x00\x10\x00\x01\x00\x00\x00\x00\x16\x08\x00" + "\x02\xff\x00\x00\x00\x01\x00\x00\x00\x01\x4f\xe7\x8d\x68\x1b\x14" + "\x2f\x3f\xff\xac", + 448, + "\x00\x00\x00\x00\x00\x00\x00\x00\x07\x87\x8f\x0f\x0f\x00\x00\x00" + "\x08\x40\x48\x80\x90\x80\x00\x00\x08\x07\xc8\x8f\x90\x00\x00\x00" + "\x08\x08\x48\x90\x90\x00\x00\x00\x08\x48\x4f\x10\x90\x80\x00\x00" + "\x07\x87\xc8\x0f\x8f\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00" + "\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x0f\xff\xff\xff\xff\xff\xff\xc0" + "\x0f\xff\xff\xff\xff\xff\xff\xc0\x0c\x00\x00\x00\x00\x00\x00\xc0" + "\x0c\x00\x00\x00\x00\x00\x00\xc0\x0c\x00\x00\x00\x00\x00\x00\xc0" + "\x0c\x00\x00\x00\x00\x00\x00\xc0\x0c\x00\x00\x00\x00\x00\x00\xc0" + "\x0c\x00\x00\x00\x00\x00\x00\xc0\x0c\x00\x00\x00\x00\x00\x00\xc0" + "\x0c\x00\x00\x00\x00\x00\x00\xc0\x0c\x00\x00\x00\x00\x00\x00\xc0" + "\x0c\x00\x00\x00\x00\x00\x00\xc0\x0c\x00\x00\x00\x00\x00\x00\xc0" + "\x0c\x00\x00\x00\x00\x00\x00\xc0\x0c\x00\x00\x00\x00\x00\x00\xc0" + "\x0c\x00\x00\x00\x00\x00\x00\xc0\x0c\x00\x00\x00\x00\x00\x00\xc0" + "\x0c\x00\x00\x00\x00\x00\x00\xc0\x0c\x00\x00\x00\x00\x00\x00\xc0" + "\x0c\x00\x00\x00\x00\x00\x00\xc0\x0c\x00\x00\x00\x00\x00\x00\xc0" + "\x0c\x00\x00\x00\x00\x00\x00\xc0\x0c\x00\x00\x00\x00\x00\x00\xc0" + "\x0c\x00\x00\x00\x00\x00\x00\xc0\x0c\x00\x00\x00\x00\x00\x00\xc0" + "\x0c\x00\x00\x00\x00\x00\x00\xc0\x0c\x00\x00\x00\x00\x00\x00\xc0" + "\x0c\x00\x00\x00\x00\x00\x00\xc0\x0c\x00\x00\x00\x00\x00\x00\xc0" + "\x0c\x00\x00\x00\x00\x00\x00\xc0\x0c\x00\x00\x00\x00\x00\x00\xc0" + "\x0c\x00\x00\x00\x00\x00\x00\xc0\x0c\x00\x00\x00\x00\x00\x00\xc0" + "\x0c\x00\x00\x00\x00\x00\x00\xc0\x0c\x00\x00\x00\x00\x00\x00\xc0" + "\x0c\x00\x00\x00\x00\x00\x00\xc0\x0c\x00\x00\x00\x00\x00\x00\xc0" + "\x0c\x00\x00\x00\x00\x00\x00\xc0\x0c\x00\x00\x00\x00\x00\x00\xc0" + "\x0c\x00\x00\x00\x00\x00\x00\xc0\x0c\x00\x00\x00\x00\x00\x00\xc0" + "\x0c\x00\x00\x00\x00\x00\x00\xc0\x0f\xff\xff\xff\xff\xff\xff\xc0" + "\x0f\xff\xff\xff\xff\xff\xff\xc0\x00\x00\x00\x00\x00\x00\x00\x00" + }, + /* same as above but with global and page segments exchanged; + * this should fail because of exchanged global and page streams */ + { + 68, + "\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x18\x00\x01\x00\x00\x00" + "\x01\x00\x00\x00\x01\xe9\xcb\xf4\x00\x26\xaf\x04\xbf\xf0\x78\x2f" + "\xe0\x00\x40\x00\x00\x00\x10\x00\x01\x00\x00\x00\x00\x16\x08\x00" + "\x02\xff\x00\x00\x00\x01\x00\x00\x00\x01\x4f\xe7\x8d\x68\x1b\x14" + "\x2f\x3f\xff\xac", + 197, + "\x00\x00\x00\x08\x30\x00\x01\x00\x00\x00\x13\x00\x00\x00\x40\x00" + "\x00\x00\x38\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00" + "\x00\x09\x00\x01\x01\x00\x00\x00\x1b\x08\x00\x02\xff\x00\x00\x00" + "\x02\x00\x00\x00\x02\x4f\xe7\x8c\x20\x0e\x1d\xc7\xcf\x01\x11\xc4" + "\xb2\x6f\xff\xac\x00\x00\x00\x0a\x07\x40\x00\x09\x01\x00\x00\x00" + "\x1f\x00\x00\x00\x25\x00\x00\x00\x08\x00\x00\x00\x04\x00\x00\x00" + "\x01\x00\x0c\x08\x00\x00\x00\x05\x8d\x6e\x5a\x12\x40\x85\xff\xac" + "\x00\x00\x00\x0b\x27\x00\x01\x00\x00\x00\x23\x00\x00\x00\x36\x00" + "\x00\x00\x2c\x00\x00\x00\x04\x00\x00\x00\x0b\x00\x08\x03\xff\xfd" + "\xff\x02\xfe\xfe\xfe\x04\xee\xed\x87\xfb\xcb\x2b\xff\xac\x00\x00" + "\x00\x0c\x10\x01\x01\x00\x00\x00\x1c\x06\x04\x04\x00\x00\x00\x0f" + "\x90\x71\x6b\x6d\x99\xa7\xaa\x49\x7d\xf2\xe5\x48\x1f\xdc\x68\xbc" + "\x6e\x40\xbb\xff\xac", + 0, + NULL + }, + { 0, NULL, 0, NULL, 0, NULL } +}; + + +static const struct test_params_s tests_params[] = { + /* No Test type Test operation Loop read size Cache size */ + { 1, TEST_TYPE_DECODER, TEST_OP_READ, LOOP_RW_SIZE_ONE, 0 }, + { 2, TEST_TYPE_DECODER, TEST_OP_READ, LOOP_RW_SIZE_TWO, 0 }, + { 3, TEST_TYPE_DECODER, TEST_OP_READ, LOOP_RW_SIZE_HALF, 0 }, + { 4, TEST_TYPE_DECODER, TEST_OP_READ, LOOP_RW_SIZE_EXACT, 0 }, + { 5, TEST_TYPE_DECODER, TEST_OP_READ, LOOP_RW_SIZE_DOUBLE, 0 }, + + { 6, TEST_TYPE_DECODER, TEST_OP_READ, LOOP_RW_SIZE_ONE, 0 }, + { 7, TEST_TYPE_DECODER, TEST_OP_READ, LOOP_RW_SIZE_TWO, 0 }, + { 8, TEST_TYPE_DECODER, TEST_OP_READ, LOOP_RW_SIZE_HALF, 0 }, + { 9, TEST_TYPE_DECODER, TEST_OP_READ, LOOP_RW_SIZE_EXACT, 0 }, + { 10, TEST_TYPE_DECODER, TEST_OP_READ, LOOP_RW_SIZE_DOUBLE, 0 }, + + { 11, TEST_TYPE_DECODER, TEST_OP_WRITE, LOOP_RW_SIZE_ONE, 0 }, + { 12, TEST_TYPE_DECODER, TEST_OP_WRITE, LOOP_RW_SIZE_TWO, 0 }, + { 13, TEST_TYPE_DECODER, TEST_OP_WRITE, LOOP_RW_SIZE_HALF, 0 }, + { 14, TEST_TYPE_DECODER, TEST_OP_WRITE, LOOP_RW_SIZE_EXACT, 0 }, + { 15, TEST_TYPE_DECODER, TEST_OP_WRITE, LOOP_RW_SIZE_DOUBLE, 0 }, + + { 16, TEST_TYPE_DECODER, TEST_OP_WRITE, LOOP_RW_SIZE_ONE, 0 }, + { 17, TEST_TYPE_DECODER, TEST_OP_WRITE, LOOP_RW_SIZE_TWO, 0 }, + { 18, TEST_TYPE_DECODER, TEST_OP_WRITE, LOOP_RW_SIZE_HALF, 0 }, + { 19, TEST_TYPE_DECODER, TEST_OP_WRITE, LOOP_RW_SIZE_EXACT, 0 }, + { 20, TEST_TYPE_DECODER, TEST_OP_WRITE, LOOP_RW_SIZE_DOUBLE, 0 }, +}; + +static void +common_test_jbig2 (const pdf_char_t *function_name, + int test_index, + const struct test_strings_s *test_strings) +{ + int i; + const struct test_params_s *params = &tests_params[test_index - 1]; + pdf_size_t globalseg_size, pageseg_size, bitmap_size; + pdf_char_t *globalseg, *pageseg, *bitmap; + pdf_hash_t *filter_params = NULL; + pdf_error_t *error = NULL; + + /* Sanity check */ + fail_if (test_index != params->idx); + + for (i = 0; test_strings[i].pageseg; i++) + { + /* fill pdf_hash_t with global segment as parameter */ + filter_params = pdf_hash_new (&error); + fail_if (!filter_params); + fail_if (error != NULL); + + fail_if (!pdf_hash_add_size (filter_params, + JBIG2_PARAM_GLOBAL_STREAMS_SIZE, + test_strings[i].globalseg_size, + &error)); + + fail_if (!pdf_hash_add_static_string (filter_params, + JBIG2_PARAM_GLOBAL_STREAMS_BUFFER, + test_strings[i].globalseg, + &error)); + + pdf_stm_test_common (function_name, + params->type, + params->operation, + (params->type == TEST_TYPE_ENCODER ? + PDF_STM_FILTER_JBIG2_ENC : + PDF_STM_FILTER_JBIG2_DEC), + filter_params, + params->stm_cache_size, + params->loop_size, + test_strings[i].bitmap, + test_strings[i].bitmap_size, + test_strings[i].pageseg, + test_strings[i].pageseg_size); + + pdf_hash_destroy (filter_params); + } +} + +/* + * Test: pdf_stm_read_filter_jbig2_dec_001-005 + * Description: + * Test JBIG2 decoder filter with different read loop sizes + * Success condition: + * The read data should be ok. + */ +START_TEST (pdf_stm_read_filter_jbig2_dec_001) +{ + common_test_jbig2 (__FUNCTION__, 1, test_strings_without_halftones); +} END_TEST +START_TEST (pdf_stm_read_filter_jbig2_dec_002) +{ + common_test_jbig2 (__FUNCTION__, 2, test_strings_without_halftones); +} END_TEST +START_TEST (pdf_stm_read_filter_jbig2_dec_003) +{ + common_test_jbig2 (__FUNCTION__, 3, test_strings_without_halftones); +} END_TEST +START_TEST (pdf_stm_read_filter_jbig2_dec_004) +{ + common_test_jbig2 (__FUNCTION__, 4, test_strings_without_halftones); +} END_TEST +START_TEST (pdf_stm_read_filter_jbig2_dec_005) +{ + common_test_jbig2 (__FUNCTION__, 5, test_strings_without_halftones); +} END_TEST + +START_TEST (pdf_stm_read_filter_jbig2_dec_006) +{ + common_test_jbig2 (__FUNCTION__, 6, test_strings_with_halftones); +} END_TEST +START_TEST (pdf_stm_read_filter_jbig2_dec_007) +{ + common_test_jbig2 (__FUNCTION__, 7, test_strings_with_halftones); +} END_TEST +START_TEST (pdf_stm_read_filter_jbig2_dec_008) +{ + common_test_jbig2 (__FUNCTION__, 8, test_strings_with_halftones); +} END_TEST +START_TEST (pdf_stm_read_filter_jbig2_dec_009) +{ + common_test_jbig2 (__FUNCTION__, 9, test_strings_with_halftones); +} END_TEST +START_TEST (pdf_stm_read_filter_jbig2_dec_010) +{ + common_test_jbig2 (__FUNCTION__, 10, test_strings_with_halftones); +} END_TEST + +/* + * Test: pdf_stm_write_filter_jbig2_dec_001-005 + * Description: + * Test JBIG2 decoder filter with different write loop sizes + * Success condition: + * The written data should be ok. + */ +START_TEST (pdf_stm_write_filter_jbig2_dec_001) +{ + common_test_jbig2 (__FUNCTION__, 11, test_strings_without_halftones); +} END_TEST +START_TEST (pdf_stm_write_filter_jbig2_dec_002) +{ + common_test_jbig2 (__FUNCTION__, 12, test_strings_without_halftones); +} END_TEST +START_TEST (pdf_stm_write_filter_jbig2_dec_003) +{ + common_test_jbig2 (__FUNCTION__, 13, test_strings_without_halftones); +} END_TEST +START_TEST (pdf_stm_write_filter_jbig2_dec_004) +{ + common_test_jbig2 (__FUNCTION__, 14, test_strings_without_halftones); +} END_TEST +START_TEST (pdf_stm_write_filter_jbig2_dec_005) +{ + common_test_jbig2 (__FUNCTION__, 15, test_strings_without_halftones); +} END_TEST + +START_TEST (pdf_stm_write_filter_jbig2_dec_006) +{ + common_test_jbig2 (__FUNCTION__, 16, test_strings_with_halftones); +} END_TEST +START_TEST (pdf_stm_write_filter_jbig2_dec_007) +{ + common_test_jbig2 (__FUNCTION__, 17, test_strings_with_halftones); +} END_TEST +START_TEST (pdf_stm_write_filter_jbig2_dec_008) +{ + common_test_jbig2 (__FUNCTION__, 18, test_strings_with_halftones); +} END_TEST +START_TEST (pdf_stm_write_filter_jbig2_dec_009) +{ + common_test_jbig2 (__FUNCTION__, 19, test_strings_with_halftones); +} END_TEST +START_TEST (pdf_stm_write_filter_jbig2_dec_010) +{ + common_test_jbig2 (__FUNCTION__, 20, test_strings_with_halftones); +} END_TEST + +/* + * Test case creation functions + */ +TCase * +test_pdf_stm_rw_filter_jbig2 (void) +{ + TCase *tc = tcase_create ("pdf_stm_rw_filter_jbig2"); + + tcase_add_test (tc, pdf_stm_read_filter_jbig2_dec_001); + tcase_add_test (tc, pdf_stm_read_filter_jbig2_dec_002); + tcase_add_test (tc, pdf_stm_read_filter_jbig2_dec_003); + tcase_add_test (tc, pdf_stm_read_filter_jbig2_dec_004); + tcase_add_test (tc, pdf_stm_read_filter_jbig2_dec_005); + + tcase_add_test (tc, pdf_stm_read_filter_jbig2_dec_006); + tcase_add_test (tc, pdf_stm_read_filter_jbig2_dec_007); + tcase_add_test (tc, pdf_stm_read_filter_jbig2_dec_008); + tcase_add_test (tc, pdf_stm_read_filter_jbig2_dec_009); + tcase_add_test (tc, pdf_stm_read_filter_jbig2_dec_010); + + + tcase_add_test (tc, pdf_stm_write_filter_jbig2_dec_001); + tcase_add_test (tc, pdf_stm_write_filter_jbig2_dec_002); + tcase_add_test (tc, pdf_stm_write_filter_jbig2_dec_003); + tcase_add_test (tc, pdf_stm_write_filter_jbig2_dec_004); + tcase_add_test (tc, pdf_stm_write_filter_jbig2_dec_005); + + tcase_add_test (tc, pdf_stm_write_filter_jbig2_dec_006); + tcase_add_test (tc, pdf_stm_write_filter_jbig2_dec_007); + tcase_add_test (tc, pdf_stm_write_filter_jbig2_dec_008); + tcase_add_test (tc, pdf_stm_write_filter_jbig2_dec_009); + tcase_add_test (tc, pdf_stm_write_filter_jbig2_dec_010); + + + tcase_add_checked_fixture (tc, + pdf_test_setup, + pdf_test_teardown); + return tc; +} + +/* End of pdf-stm-read-filter-jbig2.c */ === modified file 'torture/unit/base/stm/tsuite-stm.c' --- torture/unit/base/stm/tsuite-stm.c 2011-05-17 22:17:31 +0000 +++ torture/unit/base/stm/tsuite-stm.c 2011-12-14 17:56:25 +0000 @@ -45,6 +45,7 @@ extern TCase *test_pdf_stm_rw_filter_flate (void); extern TCase *test_pdf_stm_rw_filter_v2 (void); extern TCase *test_pdf_stm_rw_filter_aesv2 (void); +extern TCase *test_pdf_stm_rw_filter_jbig2 (void); Suite * tsuite_stm () @@ -70,6 +71,7 @@ suite_add_tcase (s, test_pdf_stm_rw_filter_v2 ()); suite_add_tcase (s, test_pdf_stm_rw_filter_aesv2 ()); suite_add_tcase (s, test_pdf_stm_flush ()); + suite_add_tcase (s, test_pdf_stm_rw_filter_jbig2 ()); return s; } # Begin bundle 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