SmartPDF - lightweight pdf viewer app for rosapps
[reactos.git] / rosapps / smartpdf / fitz / stream / filt_jpxd.c
1 #include "fitz-base.h"
2 #include "fitz-stream.h"
3
4 /* TODO: bpc */
5
6 /*
7 * We use the Jasper JPEG2000 coder for now.
8 */
9
10 #include <jasper/jasper.h>
11
12 static char *colorspacename(jas_clrspc_t clrspc)
13 {
14 switch (jas_clrspc_fam(clrspc))
15 {
16 case JAS_CLRSPC_FAM_UNKNOWN: return "Unknown";
17 case JAS_CLRSPC_FAM_XYZ: return "XYZ";
18 case JAS_CLRSPC_FAM_LAB: return "Lab";
19 case JAS_CLRSPC_FAM_GRAY: return "Gray";
20 case JAS_CLRSPC_FAM_RGB: return "RGB";
21 case JAS_CLRSPC_FAM_YCBCR: return "YCbCr";
22 }
23 return "Unknown";
24 }
25
26 typedef struct fz_jpxd_s fz_jpxd;
27
28 struct fz_jpxd_s
29 {
30 fz_filter super;
31 jas_stream_t *stream;
32 jas_image_t *image;
33 int offset;
34 int stage;
35 };
36
37 fz_error *
38 fz_newjpxd(fz_filter **fp, fz_obj *params)
39 {
40 int err;
41
42 FZ_NEWFILTER(fz_jpxd, d, jpxd);
43
44 err = jas_init();
45 if (err) {
46 fz_free(d);
47 return fz_throw("ioerror in jpxd: jas_init()");
48 }
49
50 d->stream = jas_stream_memopen(nil, 0);
51 if (!d->stream) {
52 fz_free(d);
53 return fz_throw("ioerror in jpxd: jas_stream_memopen()");
54 }
55
56 d->image = nil;
57 d->offset = 0;
58 d->stage = 0;
59
60 return nil;
61 }
62
63 void
64 fz_dropjpxd(fz_filter *filter)
65 {
66 fz_jpxd *d = (fz_jpxd*)filter;
67 if (d->stream) jas_stream_close(d->stream);
68 if (d->image) jas_image_destroy(d->image);
69 }
70
71 fz_error *
72 fz_processjpxd(fz_filter *filter, fz_buffer *in, fz_buffer *out)
73 {
74 fz_jpxd *d = (fz_jpxd*)filter;
75 int n, bpc, w, h;
76 int i, x, y;
77
78 switch (d->stage)
79 {
80 case 0: goto input;
81 case 1: goto decode;
82 case 2: goto output;
83 }
84
85 input:
86 while (in->rp < in->wp) {
87 n = jas_stream_write(d->stream, in->rp, in->wp - in->rp);
88 in->rp += n;
89 }
90
91 if (!in->eof)
92 return fz_ioneedin;
93
94 d->stage = 1;
95
96 decode:
97 jas_stream_seek(d->stream, 0, 0);
98
99 d->image = jas_image_decode(d->stream, -1, 0);
100 if (!d->image)
101 return fz_throw("ioerror in jpxd: unable to decode image data");
102
103 fprintf(stderr, "P%c\n# JPX %d x %d n=%d bpc=%d colorspace=%04x %s\n%d %d\n%d\n",
104 jas_image_numcmpts(d->image) == 1 ? '5' : '6',
105
106 jas_image_width(d->image),
107 jas_image_height(d->image),
108 jas_image_numcmpts(d->image),
109 jas_image_cmptprec(d->image, 0),
110 jas_image_clrspc(d->image),
111 colorspacename(jas_image_clrspc(d->image)),
112
113 jas_image_width(d->image),
114 jas_image_height(d->image),
115 (1 << jas_image_cmptprec(d->image, 0)) - 1);
116
117 d->stage = 2;
118
119 output:
120 w = jas_image_width(d->image);
121 h = jas_image_height(d->image);
122 n = jas_image_numcmpts(d->image);
123 bpc = jas_image_cmptprec(d->image, 0); /* use precision of first component for all... */
124
125 while (d->offset < w * h)
126 {
127 y = d->offset / w;
128 x = d->offset - y * w;
129
130 /* FIXME bpc != 8 */
131
132 if (out->wp + n >= out->ep)
133 return fz_ioneedout;
134
135 for (i = 0; i < n; i++)
136 *out->wp++ = jas_image_readcmptsample(d->image, i, x, y);
137
138 d->offset ++;
139 }
140
141 out->eof = 1;
142 return fz_iodone;
143 }
144