summaryrefslogtreecommitdiff
path: root/Build/source/texk/web2c/luatexdir/image/writejbig2.w
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/texk/web2c/luatexdir/image/writejbig2.w')
-rw-r--r--Build/source/texk/web2c/luatexdir/image/writejbig2.w265
1 files changed, 130 insertions, 135 deletions
diff --git a/Build/source/texk/web2c/luatexdir/image/writejbig2.w b/Build/source/texk/web2c/luatexdir/image/writejbig2.w
index 7b676fb6e87..d1ed0a408d4 100644
--- a/Build/source/texk/web2c/luatexdir/image/writejbig2.w
+++ b/Build/source/texk/web2c/luatexdir/image/writejbig2.w
@@ -20,7 +20,6 @@
% with LuaTeX; if not, see <http://www.gnu.org/licenses/>.
@
-
This is experimental JBIG2 image support to pdfTeX. JBIG2 image decoding
is part of Adobe PDF-1.4, and requires Acroread 5.0 or later.
@@ -80,8 +79,6 @@ object exists, reference it. Else create fresh one.
09 Dec. 2002: JBIG2 seg. page numbers > 0 are now set to 1, see PDF Ref.
@ @c
-
-
#undef DEBUG
#include "ptexlib.h"
@@ -120,7 +117,7 @@ typedef enum { INITIAL, HAVEINFO, WRITEPDF } PHASE;
typedef struct _LITEM {
struct _LITEM *prev;
struct _LITEM *next;
- void *d; /* data */
+ void *d; /* data */
} LITEM;
typedef struct _LIST {
@@ -133,26 +130,26 @@ typedef struct _SEGINFO {
unsigned long segnum;
boolean isrefered;
boolean refers;
- unsigned int seghdrflags; /* set by readseghdr() */
- boolean pageassocsizeflag; /* set by readseghdr() */
- unsigned int reftosegcount; /* set by readseghdr() */
- unsigned int countofrefered; /* set by readseghdr() */
- unsigned int fieldlen; /* set by readseghdr() */
- unsigned int segnumwidth; /* set by readseghdr() */
- long segpage; /* set by readseghdr() */
- unsigned long segdatalen; /* set by readseghdr() */
- unsigned long hdrstart; /* set by readseghdr() */
- unsigned long hdrend; /* set by readseghdr() */
+ unsigned int seghdrflags; /* set by readseghdr() */
+ boolean pageassocsizeflag; /* set by readseghdr() */
+ unsigned int reftosegcount; /* set by readseghdr() */
+ unsigned int countofrefered; /* set by readseghdr() */
+ unsigned int fieldlen; /* set by readseghdr() */
+ unsigned int segnumwidth; /* set by readseghdr() */
+ long segpage; /* set by readseghdr() */
+ unsigned long segdatalen; /* set by readseghdr() */
+ unsigned long hdrstart; /* set by readseghdr() */
+ unsigned long hdrend; /* set by readseghdr() */
unsigned long datastart;
unsigned long dataend;
- boolean endofstripeflag; /* set by checkseghdrflags() */
- boolean endofpageflag; /* set by checkseghdrflags() */
- boolean pageinfoflag; /* set by checkseghdrflags() */
- boolean endoffileflag; /* set by checkseghdrflags() */
+ boolean endofstripeflag; /* set by checkseghdrflags() */
+ boolean endofpageflag; /* set by checkseghdrflags() */
+ boolean pageinfoflag; /* set by checkseghdrflags() */
+ boolean endoffileflag; /* set by checkseghdrflags() */
} SEGINFO;
typedef struct _PAGEINFO {
- LIST segments; /* segments associated with page */
+ LIST segments; /* segments associated with page */
unsigned long pagenum;
unsigned int width;
unsigned int height;
@@ -167,12 +164,12 @@ typedef struct _FILEINFO {
FILE *file;
char *filepath;
long filesize;
- LIST pages; /* not including page0 */
+ LIST pages; /* not including page0 */
LIST page0;
- unsigned int filehdrflags; /* set by readfilehdr() */
- boolean sequentialaccess; /* set by readfilehdr() */
- unsigned long numofpages; /* set by readfilehdr() */
- unsigned long streamstart; /* set by |get_jbig2_info()| */
+ unsigned int filehdrflags; /* set by readfilehdr() */
+ boolean sequentialaccess; /* set by readfilehdr() */
+ unsigned long numofpages; /* set by readfilehdr() */
+ unsigned long streamstart; /* set by |get_jbig2_info()| */
unsigned long pdfpage0objnum;
PHASE phase;
} FILEINFO;
@@ -183,22 +180,19 @@ static struct avl_table *file_tree = NULL;
static int comp_file_entry(const void *pa, const void *pb, void *p)
{
(void) p;
- return strcmp(((const FILEINFO *) pa)->filepath,
- ((const FILEINFO *) pb)->filepath);
+ return strcmp(((const FILEINFO *) pa)->filepath,((const FILEINFO *) pb)->filepath);
}
static int comp_page_entry(const void *pa, const void *pb, void *p)
{
(void) p;
- return (int) (((const PAGEINFO *) pa)->pagenum -
- ((const PAGEINFO *) pb)->pagenum);
+ return (int) (((const PAGEINFO *) pa)->pagenum - ((const PAGEINFO *) pb)->pagenum);
}
static int comp_segment_entry(const void *pa, const void *pb, void *p)
{
(void) p;
- return (int) (((const SEGINFO *) pa)->segnum -
- ((const SEGINFO *) pb)->segnum);
+ return (int) (((const SEGINFO *) pa)->segnum - ((const SEGINFO *) pb)->segnum);
}
@ @c
@@ -207,9 +201,9 @@ static int ygetc(FILE * stream)
int c = getc(stream);
if (c < 0) {
if (c == EOF)
- luatex_fail("getc() failed; premature end of JBIG2 image file");
+ normal_error("readjbig2","premature end file");
else
- luatex_fail("getc() failed (can't happen)");
+ normal_error("readjbig2","can't happen");
}
return c;
}
@@ -382,8 +376,7 @@ static void readfilehdr(FILEINFO * fip)
xfseek(fip->file, 0, SEEK_SET, fip->filepath);
for (i = 0; i < 8; i++)
if (ygetc(fip->file) != jbig2_id[i])
- luatex_fail
- ("readfilehdr(): reading JBIG2 image file failed: ID string missing");
+ normal_error("readjbig2","ID string missing");
/* Annex D.4.2 File header flags */
fip->filehdrflags = (unsigned int) ygetc(fip->file);
fip->sequentialaccess = (fip->filehdrflags & 0x01) ? true : false;
@@ -407,41 +400,40 @@ static void checkseghdrflags(SEGINFO * sip)
sip->endoffileflag = false;
/* 7.3 Segment types */
switch (sip->seghdrflags & 0x3f) {
- case M_SymbolDictionary:
- case M_IntermediateTextRegion:
- case M_ImmediateTextRegion:
- case M_ImmediateLosslessTextRegion:
- case M_PatternDictionary:
- case M_IntermediateHalftoneRegion:
- case M_ImmediateHalftoneRegion:
- case M_ImmediateLosslessHalftoneRegion:
- case M_IntermediateGenericRegion:
- case M_ImmediateGenericRegion:
- case M_ImmediateLosslessGenericRegion:
- case M_IntermediateGenericRefinementRegion:
- case M_ImmediateGenericRefinementRegion:
- case M_ImmediateLosslessGenericRefinementRegion:
- break;
- case M_PageInformation:
- sip->pageinfoflag = true;
- break;
- case M_EndOfPage:
- sip->endofpageflag = true;
- break;
- case M_EndOfStripe:
- sip->endofstripeflag = true;
- break;
- case M_EndOfFile:
- sip->endoffileflag = true;
- break;
- case M_Profiles:
- case M_Tables:
- case M_Extension:
- break;
- default:
- luatex_fail
- ("checkseghdrflags(): unknown segment type in JBIG2 image file");
- break;
+ case M_SymbolDictionary:
+ case M_IntermediateTextRegion:
+ case M_ImmediateTextRegion:
+ case M_ImmediateLosslessTextRegion:
+ case M_PatternDictionary:
+ case M_IntermediateHalftoneRegion:
+ case M_ImmediateHalftoneRegion:
+ case M_ImmediateLosslessHalftoneRegion:
+ case M_IntermediateGenericRegion:
+ case M_ImmediateGenericRegion:
+ case M_ImmediateLosslessGenericRegion:
+ case M_IntermediateGenericRefinementRegion:
+ case M_ImmediateGenericRefinementRegion:
+ case M_ImmediateLosslessGenericRefinementRegion:
+ break;
+ case M_PageInformation:
+ sip->pageinfoflag = true;
+ break;
+ case M_EndOfPage:
+ sip->endofpageflag = true;
+ break;
+ case M_EndOfStripe:
+ sip->endofstripeflag = true;
+ break;
+ case M_EndOfFile:
+ sip->endoffileflag = true;
+ break;
+ case M_Profiles:
+ case M_Tables:
+ case M_Extension:
+ break;
+ default:
+ normal_error("readjbig2","unknown segment type file");
+ break;
}
}
@@ -454,19 +446,10 @@ static boolean readseghdr(FILEINFO * fip, SEGINFO * sip)
sip->hdrstart = xftell(fip->file, fip->filepath);
if (fip->sequentialaccess && sip->hdrstart == (unsigned) fip->filesize)
return false; /* no endoffileflag is ok for sequentialaccess */
-#ifdef DEBUG
- printf("\nhdrstart %d\n", sip->hdrstart);
-#endif
/* 7.2.2 Segment number */
sip->segnum = read4bytes(fip->file);
-#ifdef DEBUG
- printf(" segnum %d\n", sip->segnum);
-#endif
/* 7.2.3 Segment header flags */
sip->seghdrflags = (unsigned int) ygetc(fip->file);
-#ifdef DEBUG
- printf(" hdrflags %d\n", sip->seghdrflags & 0x3f);
-#endif
checkseghdrflags(sip);
if (fip->sequentialaccess && sip->endoffileflag) /* accept shorter segment, */
return true; /* makes it compliant with Example 3.4 of PDFRef. 5th ed. */
@@ -489,15 +472,15 @@ static boolean readseghdr(FILEINFO * fip, SEGINFO * sip)
sip->segnumwidth = 4;
for (i = 0; i < sip->countofrefered; i++) {
switch (sip->segnumwidth) {
- case 1:
- (void) ygetc(fip->file);
- break;
- case 2:
- (void) read2bytes(fip->file);
- break;
- case 4:
- (void) read4bytes(fip->file);
- break;
+ case 1:
+ (void) ygetc(fip->file);
+ break;
+ case 2:
+ (void) read2bytes(fip->file);
+ break;
+ case 4:
+ (void) read4bytes(fip->file);
+ break;
}
}
/* 7.2.6 Segment page association */
@@ -543,22 +526,22 @@ static void writeseghdr(PDF pdf, FILEINFO * fip, SEGINFO * sip)
/* 7.2.5 Referred-to segment numbers */
for (i = 0; i < sip->countofrefered; i++) {
switch (sip->segnumwidth) {
- case 1:
- referedseg = (unsigned long) ygetc(fip->file);
- pdf_out(pdf, referedseg);
- break;
- case 2:
- referedseg = read2bytes(fip->file);
- pdf_out(pdf, (referedseg >> 8) & 0xff);
- pdf_out(pdf, referedseg & 0xff);
- break;
- case 4:
- referedseg = read4bytes(fip->file);
- pdf_out(pdf, (referedseg >> 24) & 0xff);
- pdf_out(pdf, (referedseg >> 16) & 0xff);
- pdf_out(pdf, (referedseg >> 8) & 0xff);
- pdf_out(pdf, referedseg & 0xff);
- break;
+ case 1:
+ referedseg = (unsigned long) ygetc(fip->file);
+ pdf_out(pdf, referedseg);
+ break;
+ case 2:
+ referedseg = read2bytes(fip->file);
+ pdf_out(pdf, (referedseg >> 8) & 0xff);
+ pdf_out(pdf, referedseg & 0xff);
+ break;
+ case 4:
+ referedseg = read4bytes(fip->file);
+ pdf_out(pdf, (referedseg >> 24) & 0xff);
+ pdf_out(pdf, (referedseg >> 16) & 0xff);
+ pdf_out(pdf, (referedseg >> 8) & 0xff);
+ pdf_out(pdf, referedseg & 0xff);
+ break;
}
if (fip->page0.last != NULL && !sip->refers)
markpage0seg(fip, referedseg);
@@ -592,15 +575,15 @@ static void checkseghdr(FILEINFO * fip, SEGINFO * sip)
/* 7.2.5 Referred-to segment numbers */
for (i = 0; i < sip->countofrefered; i++) {
switch (sip->segnumwidth) {
- case 1:
- referedseg = (unsigned long) ygetc(fip->file);
- break;
- case 2:
- referedseg = read2bytes(fip->file);
- break;
- case 4:
- referedseg = read4bytes(fip->file);
- break;
+ case 1:
+ referedseg = (unsigned long) ygetc(fip->file);
+ break;
+ case 2:
+ referedseg = read2bytes(fip->file);
+ break;
+ case 4:
+ referedseg = read4bytes(fip->file);
+ break;
}
if (!sip->refers)
markpage0seg(fip, referedseg);
@@ -620,8 +603,8 @@ static void checkseghdr(FILEINFO * fip, SEGINFO * sip)
static unsigned long findstreamstart(FILEINFO * fip)
{
SEGINFO tmp;
- assert(!fip->sequentialaccess); /* D.2 Random-access organisation */
- do /* find random-access stream start */
+ assert(!fip->sequentialaccess); /* D.2 Random-access organisation */
+ do /* find random-access stream start */
(void) readseghdr(fip, &tmp);
while (!tmp.endoffileflag);
fip->streamstart = tmp.hdrend;
@@ -632,8 +615,8 @@ static unsigned long findstreamstart(FILEINFO * fip)
@ @c
static void rd_jbig2_info(FILEINFO * fip)
{
- unsigned long seekdist = 0; /* for sequential-access only */
- unsigned long streampos = 0; /* for random-access only */
+ unsigned long seekdist = 0; /* for sequential-access only */
+ unsigned long streampos = 0; /* for random-access only */
unsigned long currentpage = 0;
boolean sipavail = false;
PAGEINFO *pip;
@@ -732,16 +715,14 @@ static void wr_jbig2(PDF pdf, image_dict * idict, FILEINFO * fip,
pdf_dict_add_int(pdf, "Height", pip->height);
pdf_dict_add_name(pdf, "ColorSpace", "DeviceGray");
pdf_dict_add_int(pdf, "BitsPerComponent", 1);
- pdf_dict_add_int(pdf, "Length",
- getstreamlen(pip->segments.first, true));
+ pdf_dict_add_int(pdf, "Length", getstreamlen(pip->segments.first, true));
pdf_add_name(pdf, "Filter");
pdf_begin_array(pdf);
pdf_add_name(pdf, "JBIG2Decode");
pdf_end_array(pdf);
if (fip->page0.last != NULL) {
if (fip->pdfpage0objnum == 0) {
- fip->pdfpage0objnum =
- (unsigned long) pdf_create_obj(pdf, obj_type_others, 0);
+ fip->pdfpage0objnum = (unsigned long) pdf_create_obj(pdf, obj_type_others, 0);
}
pdf_add_name(pdf, "DecodeParms");
pdf_begin_array(pdf);
@@ -757,8 +738,7 @@ static void wr_jbig2(PDF pdf, image_dict * idict, FILEINFO * fip,
assert(pip != NULL);
pdf_begin_obj(pdf, (int) fip->pdfpage0objnum, OBJSTM_NEVER);
pdf_begin_dict(pdf);
- pdf_dict_add_int(pdf, "Length",
- getstreamlen(pip->segments.first, false));
+ pdf_dict_add_int(pdf, "Length", getstreamlen(pip->segments.first, false));
pdf_end_dict(pdf);
}
pdf_begin_stream(pdf);
@@ -780,28 +760,43 @@ static void wr_jbig2(PDF pdf, image_dict * idict, FILEINFO * fip,
}
@ @c
+boolean supported_jbig2(image_dict * idict)
+{
+ if (img_pdfminorversion(idict) < 4) {
+ normal_error("readjbig2","you need to generate at least PDF 1.4");
+ return false;
+ } else {
+ return true;
+ }
+}
+
+@ @c
+void flush_jbig2_info(image_dict * idict)
+{
+ /* todo */
+}
+
+@ @c
void read_jbig2_info(image_dict * idict)
{
FILEINFO *fip, tmp;
PAGEINFO *pip;
- void **aa;
- assert(idict != NULL);
- img_type(idict) = IMG_TYPE_JBIG2;
- if (img_pagenum(idict) < 1)
- luatex_fail
- ("read_jbig2_info(): page %d not in JBIG2 image file; page must be > 0",
- (int) img_pagenum(idict));
+ img_type(idict) = IMG_TYPE_JBIG2; /* already set probably, see other read_... */
+ if (! supported_jbig2(idict)) {
+ /* already an error done */
+ }
+ if (img_pagenum(idict) < 1) {
+ normal_error("readjbig2","page must be > 0");
+ }
if (file_tree == NULL) {
file_tree = avl_create(comp_file_entry, NULL, &avl_xallocator);
- assert(file_tree != NULL);
}
tmp.filepath = img_filepath(idict);
fip = (FILEINFO *) avl_find(file_tree, &tmp);
if (fip == NULL) {
fip = new_fileinfo();
fip->filepath = xstrdup(img_filepath(idict));
- aa = avl_probe(file_tree, fip);
- assert(aa != NULL);
+ avl_probe(file_tree, fip);
}
if (fip->phase == INITIAL) {
rd_jbig2_info(fip);
@@ -813,9 +808,9 @@ void read_jbig2_info(image_dict * idict)
}
}
pip = find_pageinfo(&(fip->pages), (unsigned long) img_pagenum(idict));
- if (pip == NULL)
- luatex_fail("read_jbig2_info(): page %d not found in JBIG2 image file",
- (int) img_pagenum(idict));
+ if (pip == NULL) {
+ formatted_error("readjbig2","page %d not found in image file",(int) img_pagenum(idict));
+ }
img_totalpages(idict) = (int) fip->numofpages;
img_xsize(idict) = (int) pip->width;
img_ysize(idict) = (int) pip->height;