Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download
7639 views
1
#include "mupdf/pdf.h"
2
3
typedef struct pdf_output_processor_s pdf_output_processor;
4
5
struct pdf_output_processor_s
6
{
7
pdf_processor super;
8
fz_output *out;
9
int extgstate;
10
};
11
12
/* general graphics state */
13
14
static void
15
pdf_out_w(fz_context *ctx, pdf_processor *proc, float linewidth)
16
{
17
fz_output *out = ((pdf_output_processor*)proc)->out;
18
if (!((pdf_output_processor*)proc)->extgstate)
19
fz_printf(ctx, out, "%f w\n", linewidth);
20
}
21
22
static void
23
pdf_out_j(fz_context *ctx, pdf_processor *proc, int linejoin)
24
{
25
fz_output *out = ((pdf_output_processor*)proc)->out;
26
if (!((pdf_output_processor*)proc)->extgstate)
27
fz_printf(ctx, out, "%d j\n", linejoin);
28
}
29
30
static void
31
pdf_out_J(fz_context *ctx, pdf_processor *proc, int linecap)
32
{
33
fz_output *out = ((pdf_output_processor*)proc)->out;
34
if (!((pdf_output_processor*)proc)->extgstate)
35
fz_printf(ctx, out, "%d J\n", linecap);
36
}
37
38
static void
39
pdf_out_M(fz_context *ctx, pdf_processor *proc, float a)
40
{
41
fz_output *out = ((pdf_output_processor*)proc)->out;
42
if (!((pdf_output_processor*)proc)->extgstate)
43
fz_printf(ctx, out, "%f M\n", a);
44
}
45
46
static void
47
pdf_out_d(fz_context *ctx, pdf_processor *proc, pdf_obj *array, float phase)
48
{
49
fz_output *out = ((pdf_output_processor*)proc)->out;
50
if (!((pdf_output_processor*)proc)->extgstate)
51
{
52
pdf_output_obj(ctx, out, array, 1);
53
fz_printf(ctx, out, " %f d\n", phase);
54
}
55
}
56
57
static void
58
pdf_out_ri(fz_context *ctx, pdf_processor *proc, const char *intent)
59
{
60
fz_output *out = ((pdf_output_processor*)proc)->out;
61
if (!((pdf_output_processor*)proc)->extgstate)
62
fz_printf(ctx, out, "/%s ri\n", intent);
63
}
64
65
static void
66
pdf_out_i(fz_context *ctx, pdf_processor *proc, float flatness)
67
{
68
fz_output *out = ((pdf_output_processor*)proc)->out;
69
if (!((pdf_output_processor*)proc)->extgstate)
70
fz_printf(ctx, out, "%f i\n", flatness);
71
}
72
73
static void
74
pdf_out_gs_begin(fz_context *ctx, pdf_processor *proc, const char *name, pdf_obj *extgstate)
75
{
76
fz_output *out = ((pdf_output_processor*)proc)->out;
77
((pdf_output_processor*)proc)->extgstate = 1;
78
fz_printf(ctx, out, "/%s gs\n", name);
79
}
80
81
static void
82
pdf_out_gs_end(fz_context *ctx, pdf_processor *proc)
83
{
84
((pdf_output_processor*)proc)->extgstate = 0;
85
}
86
87
/* special graphics state */
88
89
static void
90
pdf_out_q(fz_context *ctx, pdf_processor *proc)
91
{
92
fz_output *out = ((pdf_output_processor*)proc)->out;
93
fz_printf(ctx, out, "q\n");
94
}
95
96
static void
97
pdf_out_Q(fz_context *ctx, pdf_processor *proc)
98
{
99
fz_output *out = ((pdf_output_processor*)proc)->out;
100
fz_printf(ctx, out, "Q\n");
101
}
102
103
static void
104
pdf_out_cm(fz_context *ctx, pdf_processor *proc, float a, float b, float c, float d, float e, float f)
105
{
106
fz_output *out = ((pdf_output_processor*)proc)->out;
107
fz_printf(ctx, out, "%f %f %f %f %f %f cm\n", a, b, c, d, e, f);
108
}
109
110
/* path construction */
111
112
static void
113
pdf_out_m(fz_context *ctx, pdf_processor *proc, float x, float y)
114
{
115
fz_output *out = ((pdf_output_processor*)proc)->out;
116
fz_printf(ctx, out, "%f %f m\n", x, y);
117
}
118
119
static void
120
pdf_out_l(fz_context *ctx, pdf_processor *proc, float x, float y)
121
{
122
fz_output *out = ((pdf_output_processor*)proc)->out;
123
fz_printf(ctx, out, "%f %f l\n", x, y);
124
}
125
126
static void
127
pdf_out_c(fz_context *ctx, pdf_processor *proc, float x1, float y1, float x2, float y2, float x3, float y3)
128
{
129
fz_output *out = ((pdf_output_processor*)proc)->out;
130
fz_printf(ctx, out, "%f %f %f %f %f %f c\n", x1, y1, x2, y2, x3, y3);
131
}
132
133
static void
134
pdf_out_v(fz_context *ctx, pdf_processor *proc, float x2, float y2, float x3, float y3)
135
{
136
fz_output *out = ((pdf_output_processor*)proc)->out;
137
fz_printf(ctx, out, "%f %f %f %f v\n", x2, y2, x3, y3);
138
}
139
140
static void
141
pdf_out_y(fz_context *ctx, pdf_processor *proc, float x1, float y1, float x3, float y3)
142
{
143
fz_output *out = ((pdf_output_processor*)proc)->out;
144
fz_printf(ctx, out, "%f %f %f %f y\n", x1, y1, x3, y3);
145
}
146
147
static void
148
pdf_out_h(fz_context *ctx, pdf_processor *proc)
149
{
150
fz_output *out = ((pdf_output_processor*)proc)->out;
151
fz_printf(ctx, out, "h\n");
152
}
153
154
static void
155
pdf_out_re(fz_context *ctx, pdf_processor *proc, float x, float y, float w, float h)
156
{
157
fz_output *out = ((pdf_output_processor*)proc)->out;
158
fz_printf(ctx, out, "%f %f %f %f re\n", x, y, w, h);
159
}
160
161
/* path painting */
162
163
static void
164
pdf_out_S(fz_context *ctx, pdf_processor *proc)
165
{
166
fz_output *out = ((pdf_output_processor*)proc)->out;
167
fz_printf(ctx, out, "S\n");
168
}
169
170
static void
171
pdf_out_s(fz_context *ctx, pdf_processor *proc)
172
{
173
fz_output *out = ((pdf_output_processor*)proc)->out;
174
fz_printf(ctx, out, "s\n");
175
}
176
177
static void
178
pdf_out_F(fz_context *ctx, pdf_processor *proc)
179
{
180
fz_output *out = ((pdf_output_processor*)proc)->out;
181
fz_printf(ctx, out, "F\n");
182
}
183
184
static void
185
pdf_out_f(fz_context *ctx, pdf_processor *proc)
186
{
187
fz_output *out = ((pdf_output_processor*)proc)->out;
188
fz_printf(ctx, out, "f\n");
189
}
190
191
static void
192
pdf_out_fstar(fz_context *ctx, pdf_processor *proc)
193
{
194
fz_output *out = ((pdf_output_processor*)proc)->out;
195
fz_printf(ctx, out, "f*\n");
196
}
197
198
static void
199
pdf_out_B(fz_context *ctx, pdf_processor *proc)
200
{
201
fz_output *out = ((pdf_output_processor*)proc)->out;
202
fz_printf(ctx, out, "B\n");
203
}
204
205
static void
206
pdf_out_Bstar(fz_context *ctx, pdf_processor *proc)
207
{
208
fz_output *out = ((pdf_output_processor*)proc)->out;
209
fz_printf(ctx, out, "B*\n");
210
}
211
212
static void
213
pdf_out_b(fz_context *ctx, pdf_processor *proc)
214
{
215
fz_output *out = ((pdf_output_processor*)proc)->out;
216
fz_printf(ctx, out, "b\n");
217
}
218
219
static void
220
pdf_out_bstar(fz_context *ctx, pdf_processor *proc)
221
{
222
fz_output *out = ((pdf_output_processor*)proc)->out;
223
fz_printf(ctx, out, "b*\n");
224
}
225
226
static void
227
pdf_out_n(fz_context *ctx, pdf_processor *proc)
228
{
229
fz_output *out = ((pdf_output_processor*)proc)->out;
230
fz_printf(ctx, out, "n\n");
231
}
232
233
/* clipping paths */
234
235
static void
236
pdf_out_W(fz_context *ctx, pdf_processor *proc)
237
{
238
fz_output *out = ((pdf_output_processor*)proc)->out;
239
fz_printf(ctx, out, "W\n");
240
}
241
242
static void
243
pdf_out_Wstar(fz_context *ctx, pdf_processor *proc)
244
{
245
fz_output *out = ((pdf_output_processor*)proc)->out;
246
fz_printf(ctx, out, "W*\n");
247
}
248
249
/* text objects */
250
251
static void
252
pdf_out_BT(fz_context *ctx, pdf_processor *proc)
253
{
254
fz_output *out = ((pdf_output_processor*)proc)->out;
255
fz_printf(ctx, out, "BT\n");
256
}
257
258
static void
259
pdf_out_ET(fz_context *ctx, pdf_processor *proc)
260
{
261
fz_output *out = ((pdf_output_processor*)proc)->out;
262
fz_printf(ctx, out, "ET\n");
263
}
264
265
/* text state */
266
267
static void
268
pdf_out_Tc(fz_context *ctx, pdf_processor *proc, float charspace)
269
{
270
fz_output *out = ((pdf_output_processor*)proc)->out;
271
fz_printf(ctx, out, "%f Tc\n", charspace);
272
}
273
274
static void
275
pdf_out_Tw(fz_context *ctx, pdf_processor *proc, float wordspace)
276
{
277
fz_output *out = ((pdf_output_processor*)proc)->out;
278
fz_printf(ctx, out, "%f Tw\n", wordspace);
279
}
280
281
static void
282
pdf_out_Tz(fz_context *ctx, pdf_processor *proc, float scale)
283
{
284
fz_output *out = ((pdf_output_processor*)proc)->out;
285
fz_printf(ctx, out, "%f Tz\n", scale);
286
}
287
288
static void
289
pdf_out_TL(fz_context *ctx, pdf_processor *proc, float leading)
290
{
291
fz_output *out = ((pdf_output_processor*)proc)->out;
292
fz_printf(ctx, out, "%f TL\n", leading);
293
}
294
295
static void
296
pdf_out_Tf(fz_context *ctx, pdf_processor *proc, const char *name, pdf_font_desc *font, float size)
297
{
298
fz_output *out = ((pdf_output_processor*)proc)->out;
299
if (!((pdf_output_processor*)proc)->extgstate)
300
fz_printf(ctx, out, "/%s %f Tf\n", name, size);
301
}
302
303
static void
304
pdf_out_Tr(fz_context *ctx, pdf_processor *proc, int render)
305
{
306
fz_output *out = ((pdf_output_processor*)proc)->out;
307
fz_printf(ctx, out, "%d Tr\n", render);
308
}
309
310
static void
311
pdf_out_Ts(fz_context *ctx, pdf_processor *proc, float rise)
312
{
313
fz_output *out = ((pdf_output_processor*)proc)->out;
314
fz_printf(ctx, out, "%f Ts\n", rise);
315
}
316
317
/* text positioning */
318
319
static void
320
pdf_out_Td(fz_context *ctx, pdf_processor *proc, float tx, float ty)
321
{
322
fz_output *out = ((pdf_output_processor*)proc)->out;
323
fz_printf(ctx, out, "%f %f Td\n", tx, ty);
324
}
325
326
static void
327
pdf_out_TD(fz_context *ctx, pdf_processor *proc, float tx, float ty)
328
{
329
fz_output *out = ((pdf_output_processor*)proc)->out;
330
fz_printf(ctx, out, "%f %f TD\n", tx, ty);
331
}
332
333
static void
334
pdf_out_Tm(fz_context *ctx, pdf_processor *proc, float a, float b, float c, float d, float e, float f)
335
{
336
fz_output *out = ((pdf_output_processor*)proc)->out;
337
fz_printf(ctx, out, "%f %f %f %f %f %f Tm\n", a, b, c, d, e, f);
338
}
339
340
static void
341
pdf_out_Tstar(fz_context *ctx, pdf_processor *proc)
342
{
343
fz_output *out = ((pdf_output_processor*)proc)->out;
344
fz_printf(ctx, out, "T*\n");
345
}
346
347
/* text showing */
348
349
static void
350
put_string(fz_context *ctx, fz_output *out, const unsigned char *str, int len)
351
{
352
int i;
353
354
for (i = 0; i < len; ++i)
355
if (str[i] < 32 || str[i] >= 127)
356
break;
357
358
if (i < len)
359
{
360
fz_printf(ctx, out, "<");
361
for (i = 0; i < len; ++i)
362
fz_printf(ctx, out, "%02x", str[i]);
363
fz_printf(ctx, out, ">");
364
}
365
else
366
{
367
fz_printf(ctx, out, "(");
368
for (i = 0; i < len; ++i)
369
{
370
unsigned char c = str[i];
371
if (c == '(' || c == ')' || c == '\\')
372
fz_putc(ctx, out, '\\');
373
fz_putc(ctx, out, c);
374
}
375
fz_printf(ctx, out, ")");
376
}
377
}
378
379
static void
380
pdf_out_TJ(fz_context *ctx, pdf_processor *proc, pdf_obj *array)
381
{
382
fz_output *out = ((pdf_output_processor*)proc)->out;
383
pdf_output_obj(ctx, out, array, 1);
384
fz_printf(ctx, out, " TJ\n");
385
}
386
387
static void
388
pdf_out_Tj(fz_context *ctx, pdf_processor *proc, char *str, int len)
389
{
390
fz_output *out = ((pdf_output_processor*)proc)->out;
391
put_string(ctx, out, (const unsigned char *)str, len);
392
fz_printf(ctx, out, " Tj\n");
393
}
394
395
static void
396
pdf_out_squote(fz_context *ctx, pdf_processor *proc, char *str, int len)
397
{
398
fz_output *out = ((pdf_output_processor*)proc)->out;
399
put_string(ctx, out, (const unsigned char *)str, len);
400
fz_printf(ctx, out, " '\n");
401
}
402
403
static void
404
pdf_out_dquote(fz_context *ctx, pdf_processor *proc, float aw, float ac, char *str, int len)
405
{
406
fz_output *out = ((pdf_output_processor*)proc)->out;
407
fz_printf(ctx, out, "%f %f ", aw, ac);
408
put_string(ctx, out, (const unsigned char *)str, len);
409
fz_printf(ctx, out, " \"\n");
410
}
411
412
/* type 3 fonts */
413
414
static void
415
pdf_out_d0(fz_context *ctx, pdf_processor *proc, float wx, float wy)
416
{
417
fz_output *out = ((pdf_output_processor*)proc)->out;
418
fz_printf(ctx, out, "%f %f d0\n", wx, wy);
419
}
420
421
static void
422
pdf_out_d1(fz_context *ctx, pdf_processor *proc, float wx, float wy, float llx, float lly, float urx, float ury)
423
{
424
fz_output *out = ((pdf_output_processor*)proc)->out;
425
fz_printf(ctx, out, "%f %f %f %f %f %f d1\n", wx, wy, llx, lly, urx, ury);
426
}
427
428
/* color */
429
430
static void
431
pdf_out_CS(fz_context *ctx, pdf_processor *proc, const char *name, fz_colorspace *cs)
432
{
433
fz_output *out = ((pdf_output_processor*)proc)->out;
434
fz_printf(ctx, out, "/%s CS\n", name);
435
}
436
437
static void
438
pdf_out_cs(fz_context *ctx, pdf_processor *proc, const char *name, fz_colorspace *cs)
439
{
440
fz_output *out = ((pdf_output_processor*)proc)->out;
441
fz_printf(ctx, out, "/%s cs\n", name);
442
}
443
444
static void
445
pdf_out_SC_pattern(fz_context *ctx, pdf_processor *proc, const char *name, pdf_pattern *pat, int n, float *color)
446
{
447
fz_output *out = ((pdf_output_processor*)proc)->out;
448
int i;
449
for (i = 0; i < n; ++i)
450
fz_printf(ctx, out, "%f ", color[i]);
451
fz_printf(ctx, out, "/%s SCN\n", name);
452
}
453
454
static void
455
pdf_out_sc_pattern(fz_context *ctx, pdf_processor *proc, const char *name, pdf_pattern *pat, int n, float *color)
456
{
457
fz_output *out = ((pdf_output_processor*)proc)->out;
458
int i;
459
for (i = 0; i < n; ++i)
460
fz_printf(ctx, out, "%f ", color[i]);
461
fz_printf(ctx, out, "/%s scn\n", name);
462
}
463
464
static void
465
pdf_out_SC_shade(fz_context *ctx, pdf_processor *proc, const char *name, fz_shade *shade)
466
{
467
fz_output *out = ((pdf_output_processor*)proc)->out;
468
fz_printf(ctx, out, "/%s SCN\n", name);
469
}
470
471
static void
472
pdf_out_sc_shade(fz_context *ctx, pdf_processor *proc, const char *name, fz_shade *shade)
473
{
474
fz_output *out = ((pdf_output_processor*)proc)->out;
475
fz_printf(ctx, out, "/%s scn\n", name);
476
}
477
478
static void
479
pdf_out_SC_color(fz_context *ctx, pdf_processor *proc, int n, float *color)
480
{
481
fz_output *out = ((pdf_output_processor*)proc)->out;
482
int i;
483
for (i = 0; i < n; ++i)
484
fz_printf(ctx, out, "%f ", color[i]);
485
fz_printf(ctx, out, "SCN\n");
486
}
487
488
static void
489
pdf_out_sc_color(fz_context *ctx, pdf_processor *proc, int n, float *color)
490
{
491
fz_output *out = ((pdf_output_processor*)proc)->out;
492
int i;
493
for (i = 0; i < n; ++i)
494
fz_printf(ctx, out, "%f ", color[i]);
495
fz_printf(ctx, out, "scn\n");
496
}
497
498
static void
499
pdf_out_G(fz_context *ctx, pdf_processor *proc, float g)
500
{
501
fz_output *out = ((pdf_output_processor*)proc)->out;
502
fz_printf(ctx, out, "%f G\n", g);
503
}
504
505
static void
506
pdf_out_g(fz_context *ctx, pdf_processor *proc, float g)
507
{
508
fz_output *out = ((pdf_output_processor*)proc)->out;
509
fz_printf(ctx, out, "%f g\n", g);
510
}
511
512
static void
513
pdf_out_RG(fz_context *ctx, pdf_processor *proc, float r, float g, float b)
514
{
515
fz_output *out = ((pdf_output_processor*)proc)->out;
516
fz_printf(ctx, out, "%f %f %f RG\n", r, g, b);
517
}
518
519
static void
520
pdf_out_rg(fz_context *ctx, pdf_processor *proc, float r, float g, float b)
521
{
522
fz_output *out = ((pdf_output_processor*)proc)->out;
523
fz_printf(ctx, out, "%f %f %f rg\n", r, g, b);
524
}
525
526
static void
527
pdf_out_K(fz_context *ctx, pdf_processor *proc, float c, float m, float y, float k)
528
{
529
fz_output *out = ((pdf_output_processor*)proc)->out;
530
fz_printf(ctx, out, "%f %f %f %f K\n", c, m, y, k);
531
}
532
533
static void
534
pdf_out_k(fz_context *ctx, pdf_processor *proc, float c, float m, float y, float k)
535
{
536
fz_output *out = ((pdf_output_processor*)proc)->out;
537
fz_printf(ctx, out, "%f %f %f %f k\n", c, m, y, k);
538
}
539
540
/* shadings, images, xobjects */
541
542
static void
543
pdf_out_BI(fz_context *ctx, pdf_processor *proc, fz_image *img)
544
{
545
fz_output *out = ((pdf_output_processor*)proc)->out;
546
fz_compressed_buffer *cbuf;
547
fz_buffer *buf;
548
int i;
549
550
if (img == NULL)
551
return;
552
cbuf = img->buffer;
553
if (cbuf == NULL)
554
return;
555
buf = cbuf->buffer;
556
if (buf == NULL)
557
return;
558
559
fz_printf(ctx, out, "BI\n");
560
fz_printf(ctx, out, "/W %d\n", img->w);
561
fz_printf(ctx, out, "/H %d\n", img->h);
562
fz_printf(ctx, out, "/BPC %d\n", img->bpc);
563
if (img->imagemask)
564
fz_printf(ctx, out, "/IM true\n");
565
else if (img->colorspace == fz_device_gray(ctx))
566
fz_printf(ctx, out, "/CS/G\n");
567
else if (img->colorspace == fz_device_rgb(ctx))
568
fz_printf(ctx, out, "/CS/RGB\n");
569
else if (img->colorspace == fz_device_cmyk(ctx))
570
fz_printf(ctx, out, "/CS/CMYK\n");
571
else if (fz_colorspace_is_indexed(ctx, img->colorspace))
572
fz_printf(ctx, out, "/CS/I\n");
573
if (img->interpolate)
574
fz_printf(ctx, out, "/I true\n");
575
fz_printf(ctx, out, "/D[");
576
for (i = 0; i < img->n * 2; ++i)
577
{
578
if (i > 0)
579
fz_putc(ctx, out, ' ');
580
fz_printf(ctx, out, "%g", img->decode[i]);
581
}
582
fz_printf(ctx, out, "]\n");
583
584
switch (cbuf->params.type)
585
{
586
default:
587
fz_throw(ctx, FZ_ERROR_GENERIC, "unknown compressed buffer type");
588
break;
589
590
case FZ_IMAGE_JPEG:
591
fz_printf(ctx, out, "/F/DCT\n");
592
if (cbuf->params.u.jpeg.color_transform != -1)
593
fz_printf(ctx, out, "/DP<</ColorTransform %d>>\n",
594
cbuf->params.u.jpeg.color_transform);
595
break;
596
597
case FZ_IMAGE_FAX:
598
fz_printf(ctx, out, "/F/CCF\n");
599
fz_printf(ctx, out, "/DP<<\n");
600
fz_printf(ctx, out, "/K %d\n", cbuf->params.u.fax.k);
601
if (cbuf->params.u.fax.columns != 1728)
602
fz_printf(ctx, out, "/Columns %d\n", cbuf->params.u.fax.columns);
603
if (cbuf->params.u.fax.rows > 0)
604
fz_printf(ctx, out, "/Rows %d\n", cbuf->params.u.fax.rows);
605
if (cbuf->params.u.fax.end_of_line)
606
fz_printf(ctx, out, "/EndOfLine true\n");
607
if (cbuf->params.u.fax.encoded_byte_align)
608
fz_printf(ctx, out, "/EncodedByteAlign true\n");
609
if (!cbuf->params.u.fax.end_of_block)
610
fz_printf(ctx, out, "/EndOfBlock false\n");
611
if (cbuf->params.u.fax.black_is_1)
612
fz_printf(ctx, out, "/BlackIs1 true\n");
613
if (cbuf->params.u.fax.damaged_rows_before_error > 0)
614
fz_printf(ctx, out, "/DamagedRowsBeforeError %d\n",
615
cbuf->params.u.fax.damaged_rows_before_error);
616
fz_printf(ctx, out, ">>\n");
617
break;
618
619
case FZ_IMAGE_RAW:
620
break;
621
622
case FZ_IMAGE_RLD:
623
fz_printf(ctx, out, "/F/RL\n");
624
break;
625
626
case FZ_IMAGE_FLATE:
627
fz_printf(ctx, out, "/F/Fl\n");
628
if (cbuf->params.u.flate.predictor > 1)
629
{
630
fz_printf(ctx, out, "/DP<<\n");
631
fz_printf(ctx, out, "/Predictor %d\n", cbuf->params.u.flate.predictor);
632
if (cbuf->params.u.flate.columns != 1)
633
fz_printf(ctx, out, "/Columns %d\n", cbuf->params.u.flate.columns);
634
if (cbuf->params.u.flate.colors != 1)
635
fz_printf(ctx, out, "/Colors %d\n", cbuf->params.u.flate.colors);
636
if (cbuf->params.u.flate.bpc != 8)
637
fz_printf(ctx, out, "/BitsPerComponent %d\n", cbuf->params.u.flate.bpc);
638
fz_printf(ctx, out, ">>\n");
639
}
640
break;
641
642
case FZ_IMAGE_LZW:
643
fz_printf(ctx, out, "/F/LZW\n");
644
if (cbuf->params.u.lzw.predictor > 1)
645
{
646
fz_printf(ctx, out, "/DP<<\n");
647
fz_printf(ctx, out, "/Predictor %d\n", cbuf->params.u.lzw.predictor);
648
if (cbuf->params.u.lzw.columns != 1)
649
fz_printf(ctx, out, "/Columns %d\n", cbuf->params.u.lzw.columns);
650
if (cbuf->params.u.lzw.colors != 1)
651
fz_printf(ctx, out, "/Colors %d\n", cbuf->params.u.lzw.colors);
652
if (cbuf->params.u.lzw.bpc != 8)
653
fz_printf(ctx, out, "/BitsPerComponent %d\n", cbuf->params.u.lzw.bpc);
654
if (cbuf->params.u.lzw.early_change != 1)
655
fz_printf(ctx, out, "/EarlyChange %d\n", cbuf->params.u.lzw.early_change);
656
fz_printf(ctx, out, ">>\n");
657
}
658
break;
659
}
660
661
fz_printf(ctx, out, "ID\n");
662
fz_write(ctx, out, buf->data, buf->len);
663
fz_printf(ctx, out, "\nEI\n");
664
}
665
666
static void
667
pdf_out_sh(fz_context *ctx, pdf_processor *proc, const char *name, fz_shade *shade)
668
{
669
fz_output *out = ((pdf_output_processor*)proc)->out;
670
fz_printf(ctx, out, "/%s sh\n", name);
671
}
672
673
static void
674
pdf_out_Do_image(fz_context *ctx, pdf_processor *proc, const char *name, fz_image *image)
675
{
676
fz_output *out = ((pdf_output_processor*)proc)->out;
677
fz_printf(ctx, out, "/%s Do\n", name);
678
}
679
680
static void
681
pdf_out_Do_form(fz_context *ctx, pdf_processor *proc, const char *name, pdf_xobject *xobj, pdf_obj *page_resources)
682
{
683
fz_output *out = ((pdf_output_processor*)proc)->out;
684
fz_printf(ctx, out, "/%s Do\n", name);
685
}
686
687
/* marked content */
688
689
static void
690
pdf_out_MP(fz_context *ctx, pdf_processor *proc, const char *tag)
691
{
692
fz_output *out = ((pdf_output_processor*)proc)->out;
693
fz_printf(ctx, out, "/%s MP\n", tag);
694
}
695
696
static void
697
pdf_out_DP(fz_context *ctx, pdf_processor *proc, const char *tag, pdf_obj *properties)
698
{
699
fz_output *out = ((pdf_output_processor*)proc)->out;
700
fz_printf(ctx, out, "/%s ", tag);
701
pdf_output_obj(ctx, out, properties, 1);
702
fz_printf(ctx, out, " DP\n");
703
}
704
705
static void
706
pdf_out_BMC(fz_context *ctx, pdf_processor *proc, const char *tag)
707
{
708
fz_output *out = ((pdf_output_processor*)proc)->out;
709
fz_printf(ctx, out, "/%s BMC\n", tag);
710
}
711
712
static void
713
pdf_out_BDC(fz_context *ctx, pdf_processor *proc, const char *tag, pdf_obj *properties)
714
{
715
fz_output *out = ((pdf_output_processor*)proc)->out;
716
fz_printf(ctx, out, "/%s ", tag);
717
pdf_output_obj(ctx, out, properties, 1);
718
fz_printf(ctx, out, " BDC\n");
719
}
720
721
static void
722
pdf_out_EMC(fz_context *ctx, pdf_processor *proc)
723
{
724
fz_output *out = ((pdf_output_processor*)proc)->out;
725
fz_printf(ctx, out, "EMC\n");
726
}
727
728
/* compatibility */
729
730
static void
731
pdf_out_BX(fz_context *ctx, pdf_processor *proc)
732
{
733
fz_output *out = ((pdf_output_processor*)proc)->out;
734
fz_printf(ctx, out, "BX\n");
735
}
736
737
static void
738
pdf_out_EX(fz_context *ctx, pdf_processor *proc)
739
{
740
fz_output *out = ((pdf_output_processor*)proc)->out;
741
fz_printf(ctx, out, "EX\n");
742
}
743
744
static void
745
pdf_drop_imp_output_processor(fz_context *ctx, pdf_processor *proc)
746
{
747
fz_output *out = ((pdf_output_processor*)proc)->out;
748
fz_drop_output(ctx, out);
749
}
750
751
static pdf_processor *
752
pdf_new_output_processor(fz_context *ctx, fz_output *out)
753
{
754
pdf_output_processor *proc = pdf_new_processor(ctx, sizeof *proc);
755
{
756
proc->super.drop_imp = pdf_drop_imp_output_processor;
757
758
/* general graphics state */
759
proc->super.op_w = pdf_out_w;
760
proc->super.op_j = pdf_out_j;
761
proc->super.op_J = pdf_out_J;
762
proc->super.op_M = pdf_out_M;
763
proc->super.op_d = pdf_out_d;
764
proc->super.op_ri = pdf_out_ri;
765
proc->super.op_i = pdf_out_i;
766
proc->super.op_gs_begin = pdf_out_gs_begin;
767
proc->super.op_gs_end = pdf_out_gs_end;
768
769
/* transparency graphics state */
770
proc->super.op_gs_BM = NULL;
771
proc->super.op_gs_CA = NULL;
772
proc->super.op_gs_ca = NULL;
773
proc->super.op_gs_SMask = NULL;
774
775
/* special graphics state */
776
proc->super.op_q = pdf_out_q;
777
proc->super.op_Q = pdf_out_Q;
778
proc->super.op_cm = pdf_out_cm;
779
780
/* path construction */
781
proc->super.op_m = pdf_out_m;
782
proc->super.op_l = pdf_out_l;
783
proc->super.op_c = pdf_out_c;
784
proc->super.op_v = pdf_out_v;
785
proc->super.op_y = pdf_out_y;
786
proc->super.op_h = pdf_out_h;
787
proc->super.op_re = pdf_out_re;
788
789
/* path painting */
790
proc->super.op_S = pdf_out_S;
791
proc->super.op_s = pdf_out_s;
792
proc->super.op_F = pdf_out_F;
793
proc->super.op_f = pdf_out_f;
794
proc->super.op_fstar = pdf_out_fstar;
795
proc->super.op_B = pdf_out_B;
796
proc->super.op_Bstar = pdf_out_Bstar;
797
proc->super.op_b = pdf_out_b;
798
proc->super.op_bstar = pdf_out_bstar;
799
proc->super.op_n = pdf_out_n;
800
801
/* clipping paths */
802
proc->super.op_W = pdf_out_W;
803
proc->super.op_Wstar = pdf_out_Wstar;
804
805
/* text objects */
806
proc->super.op_BT = pdf_out_BT;
807
proc->super.op_ET = pdf_out_ET;
808
809
/* text state */
810
proc->super.op_Tc = pdf_out_Tc;
811
proc->super.op_Tw = pdf_out_Tw;
812
proc->super.op_Tz = pdf_out_Tz;
813
proc->super.op_TL = pdf_out_TL;
814
proc->super.op_Tf = pdf_out_Tf;
815
proc->super.op_Tr = pdf_out_Tr;
816
proc->super.op_Ts = pdf_out_Ts;
817
818
/* text positioning */
819
proc->super.op_Td = pdf_out_Td;
820
proc->super.op_TD = pdf_out_TD;
821
proc->super.op_Tm = pdf_out_Tm;
822
proc->super.op_Tstar = pdf_out_Tstar;
823
824
/* text showing */
825
proc->super.op_TJ = pdf_out_TJ;
826
proc->super.op_Tj = pdf_out_Tj;
827
proc->super.op_squote = pdf_out_squote;
828
proc->super.op_dquote = pdf_out_dquote;
829
830
/* type 3 fonts */
831
proc->super.op_d0 = pdf_out_d0;
832
proc->super.op_d1 = pdf_out_d1;
833
834
/* color */
835
proc->super.op_CS = pdf_out_CS;
836
proc->super.op_cs = pdf_out_cs;
837
proc->super.op_SC_color = pdf_out_SC_color;
838
proc->super.op_sc_color = pdf_out_sc_color;
839
proc->super.op_SC_pattern = pdf_out_SC_pattern;
840
proc->super.op_sc_pattern = pdf_out_sc_pattern;
841
proc->super.op_SC_shade = pdf_out_SC_shade;
842
proc->super.op_sc_shade = pdf_out_sc_shade;
843
844
proc->super.op_G = pdf_out_G;
845
proc->super.op_g = pdf_out_g;
846
proc->super.op_RG = pdf_out_RG;
847
proc->super.op_rg = pdf_out_rg;
848
proc->super.op_K = pdf_out_K;
849
proc->super.op_k = pdf_out_k;
850
851
/* shadings, images, xobjects */
852
proc->super.op_BI = pdf_out_BI;
853
proc->super.op_sh = pdf_out_sh;
854
proc->super.op_Do_image = pdf_out_Do_image;
855
proc->super.op_Do_form = pdf_out_Do_form;
856
857
/* marked content */
858
proc->super.op_MP = pdf_out_MP;
859
proc->super.op_DP = pdf_out_DP;
860
proc->super.op_BMC = pdf_out_BMC;
861
proc->super.op_BDC = pdf_out_BDC;
862
proc->super.op_EMC = pdf_out_EMC;
863
864
/* compatibility */
865
proc->super.op_BX = pdf_out_BX;
866
proc->super.op_EX = pdf_out_EX;
867
}
868
869
proc->out = out;
870
871
return (pdf_processor*)proc;
872
}
873
874
pdf_processor *
875
pdf_new_buffer_processor(fz_context *ctx, fz_buffer *buffer)
876
{
877
pdf_processor *proc;
878
fz_output *out = fz_new_output_with_buffer(ctx, buffer);
879
fz_try(ctx)
880
{
881
proc = pdf_new_output_processor(ctx, out);
882
}
883
fz_catch(ctx)
884
{
885
fz_drop_output(ctx, out);
886
fz_rethrow(ctx);
887
}
888
return proc;
889
}
890
891