2
* --- Print bitmap in several graphics formats
4
* by Hirotsugu Kakugawa (h.kakugawa@computer.org)
8
* Copyright (C) 1996, 1997, 1998 Hirotsugu Kakugawa.
11
* This file is part of the VFlib Library. This library is free
12
* software; you can redistribute it and/or modify it under the terms of
13
* the GNU Library General Public License as published by the Free
14
* Software Foundation; either version 2 of the License, or (at your
15
* option) any later version. This library is distributed in the hope
16
* that it will be useful, but WITHOUT ANY WARRANTY; without even the
17
* implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
18
* PURPOSE. See the GNU Library General Public License for more details.
19
* You should have received a copy of the GNU Library General Public
20
* License along with this library; if not, write to the Free Software
21
* Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
30
#include "VFlib-3_6.h"
36
Private void culc_margins(int bm_w, int bm_h,
37
int image_width, int image_height,
38
int position_x, int position_y,
39
int *margin_l, int *margin_r,
40
int *margin_t, int *margin_b);
42
Private unsigned char bits[] = {
43
0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01};
48
** VF_ImageOut_PBMAscii()
53
VF_ImageOut_PBMAscii(VF_BITMAP bm, FILE *fp,
54
int image_width, int image_height,
55
int position_x, int position_y,
56
int margin_l, int margin_r, int margin_t, int margin_b,
57
int reverse, int shrink,
58
char *prog, char *title)
63
#define PBM_ASCII_BITS_PER_LINE 25
65
culc_margins(bm->bbx_width, bm->bbx_height,
66
image_width, image_height, position_x, position_y,
67
&margin_l, &margin_r, &margin_t, &margin_b);
81
fprintf(fp, "%d %d\n",
82
margin_l + bm->bbx_width + margin_r,
83
margin_t + bm->bbx_height + margin_b);
86
fprintf(fp, "# Created by %s\n", prog);
87
fprintf(fp, "# %s\n", title);
93
for (y = 0; y < margin_t; y++){
94
for (x = 0; x < margin_l + bm->bbx_width + margin_r; x++){
95
fprintf(fp, "%c ", pix0);
96
if (++n >= PBM_ASCII_BITS_PER_LINE){
103
for (y = 0; y < bm->bbx_height; y++){
105
for (x = 0; x < margin_l; x++)
106
fprintf(fp, "%c ", pix0);
108
for (x = 0; x < bm->bbx_width; x++){
110
fprintf(fp, "%c ", ((w&bits[x%8])==0)?pix0:pix1);
111
if (++n >= PBM_ASCII_BITS_PER_LINE){
117
for (x = 0; x < margin_r; x++){
118
fprintf(fp, "%c ", pix0);
119
if (++n >= PBM_ASCII_BITS_PER_LINE){
129
for (y = 0; y < margin_b; y++){
130
for (x = 0; x < margin_l + bm->bbx_width + margin_r; x++){
131
fprintf(fp, "%c ", pix0);
132
if (++n >= PBM_ASCII_BITS_PER_LINE){
145
** VF_ImageOut_PGMAscii()
149
VF_ImageOut_PGMAscii(VF_BITMAP bm, FILE *fp,
150
int image_width, int image_height,
151
int position_x, int position_y,
152
int margin_l, int margin_r, int margin_t, int margin_b,
153
int reverse, int shrink,
154
char *prog, char *title)
159
int w, h, y2, max_val;
160
#define PGM_ASCII_BITS_PER_LINE 15
161
#define PGM_BIT(x) (reverse==1) ? ((255*(x))/max_val) \
162
: (255 - ((255*(x))/max_val))
166
max_val = shrink * shrink;
167
w = (bm->bbx_width + shrink - 1) / shrink;
168
h = (bm->bbx_height + shrink - 1) / shrink;
169
if ((buff = calloc(w, sizeof(int))) == NULL){
170
vf_error = VF_ERR_NO_MEMORY;
174
culc_margins(w, h, image_width, image_height, position_x, position_y,
175
&margin_l, &margin_r, &margin_t, &margin_b);
180
fprintf(fp, "# Created by %s\n", prog);
181
fprintf(fp, "# %s\n", title);
182
fprintf(fp, "%d %d\n", margin_l + w + margin_l, margin_t + h + margin_b);
183
fprintf(fp, "%d\n", 255);
188
for (y = 0; y < margin_t; y++){
189
for (x = 0; x < margin_l + w + margin_r; x++){
190
fprintf(fp, "%d ", PGM_BIT(0));
191
if (++n >= PGM_ASCII_BITS_PER_LINE){
198
for (y = 0; y < h; y++){
200
for (x = 0; x < margin_l; x++)
201
fprintf(fp, "%d ", PGM_BIT(0));
203
for (x = 0; x < w; x++)
205
p = &bm->bitmap[y * shrink * bm->raster];
206
s = ((bm->bbx_height/shrink) == y) ? (bm->bbx_height % shrink) : shrink;
207
for (y2 = 0; y2 < s; y2++){
208
for (x = 0; x < bm->bbx_width; x++){
209
if ((p[x/8] & bits[x%8]) != 0)
215
for (x = 0; x < w; x++){
216
fprintf(fp, "%d ", PGM_BIT(buff[x]));
217
if (++n >= PGM_ASCII_BITS_PER_LINE){
223
for (x = 0; x < margin_r; x++){
224
fprintf(fp, "%d ", PGM_BIT(0));
225
if (++n >= PGM_ASCII_BITS_PER_LINE){
233
for (y = 0; y < margin_b; y++){
234
for (x = 0; x < margin_l + w + margin_r; x++){
235
fprintf(fp, "%d ", PGM_BIT(0));
236
if (++n >= PGM_ASCII_BITS_PER_LINE){
250
** VF_ImageOut_PGMRaw()
254
VF_ImageOut_PGMRaw(VF_BITMAP bm, FILE *fp,
255
int image_width, int image_height,
256
int position_x, int position_y,
257
int margin_l, int margin_r, int margin_t, int margin_b,
258
int reverse, int shrink,
259
char *prog, char *title)
264
int w, h, s, y2, max_val;
265
#define PGM_BIT(x) (reverse==1) ? ((255*(x))/max_val) \
266
: (255 - ((255*(x))/max_val))
270
max_val = shrink * shrink;
271
w = (bm->bbx_width + shrink - 1) / shrink;
272
h = (bm->bbx_height + shrink - 1) / shrink;
273
if ((buff = calloc(w, sizeof(int))) == NULL){
274
vf_error = VF_ERR_NO_MEMORY;
278
culc_margins(w, h, image_width, image_height, position_x, position_y,
279
&margin_l, &margin_r, &margin_t, &margin_b);
282
fprintf(fp, "# Created by %s\n", prog);
283
fprintf(fp, "# %s\n", title);
284
fprintf(fp, "%d %d\n",
285
margin_l + w + margin_r, margin_t + h + margin_b);
286
fprintf(fp, "%d\n", 255);
289
for (y = 0; y < margin_t; y++){
290
for (x = 0; x < margin_l + w + margin_r; x++){
291
fprintf(fp, "%c", (unsigned char)PGM_BIT(0));
295
for (y = 0; y < h; y++){
297
for (x = 0; x < margin_l; x++)
298
fprintf(fp, "%c", (unsigned char)PGM_BIT(0));
300
for (x = 0; x < w; x++)
302
p = &bm->bitmap[y * shrink * bm->raster];
303
s = ((bm->bbx_height/shrink) == y) ? (bm->bbx_height % shrink) : shrink;
304
for (y2 = 0; y2 < s; y2++){
305
for (x = 0; x < bm->bbx_width; x++){
306
if ((p[x/8] & bits[x%8]) != 0)
312
for (x = 0; x < w; x++)
313
fprintf(fp, "%c", (unsigned char)PGM_BIT(buff[x]));
315
for (x = 0; x < margin_r; x++)
316
fprintf(fp, "%c", (unsigned char)PGM_BIT(0));
320
for (y = 0; y < margin_b; y++){
321
for (x = 0; x < margin_l + w + margin_r; x++)
322
fprintf(fp, "%c", (unsigned char)PGM_BIT(0));
335
VF_ImageOut_EPS(VF_BITMAP bm, FILE *fp,
336
int image_width, int image_height,
337
int position_x, int position_y,
338
int margin_l, int margin_r, int margin_t, int margin_b,
339
int reverse, int shrink,
340
char *prog, char *title,
341
double ptsize, int pixsize)
346
int w, h, y2, s, max_val;
347
int eps_w, eps_h, bbxx, bbxy, n;
348
#define EPS_SIZE(s) \
349
((ptsize <= 0) ? (12.0*(s)*shrink/16.0) \
350
: (ptsize*(s)*shrink/(double)pixsize))
352
((reverse==1) ? ((255*(x))/max_val) : (255 - ((255*(x))/max_val)))
353
#define EPS_PUT_PIX(b) \
354
{ fprintf(fp,"%02x",b); if (++n > 32){ fprintf(fp,"\n"); n=0;} }
358
max_val = shrink * shrink;
359
w = (bm->bbx_width + shrink - 1) / shrink;
360
h = (bm->bbx_height + shrink - 1) / shrink;
361
if ((buff = calloc(w, sizeof(int))) == NULL){
362
vf_error = VF_ERR_NO_MEMORY;
366
culc_margins(w, h, image_width, image_height, position_x, position_y,
367
&margin_l, &margin_r, &margin_t, &margin_b);
369
eps_w = margin_l + w + margin_r;
370
eps_h = margin_t + h + margin_b;
373
bbxy = 792 - EPS_SIZE(h);
375
fprintf(fp, "%%!PS-Adobe-2.0 EPSF-2.0\n");
376
fprintf(fp, "%%%%Creator: %s\n", prog);
377
fprintf(fp, "%%%%Title: %s\n", title);
378
fprintf(fp, "%%%%Pages: 1\n");
379
fprintf(fp, "%%%%BoundingBox: %.3f %.3f %.3f %.3f\n",
380
(double)bbxx, (double)bbxy,
381
bbxx+EPS_SIZE(eps_w), bbxy+EPS_SIZE(eps_h));
382
fprintf(fp, "%%%%EndComments\n");
383
fprintf(fp, "/readstr {\n");
384
fprintf(fp, " currentfile exch readhexstring pop\n");
385
fprintf(fp, "} bind def\n");
386
fprintf(fp, "/picstr %d string def\n", eps_w);
387
fprintf(fp, "%%%%EndProlog\n");
388
fprintf(fp, "%%%%Page: 1 1\n");
389
fprintf(fp, "gsave\n");
390
fprintf(fp, "%d %d translate\n", bbxx, bbxy);
391
fprintf(fp, "%.3f %.3f scale\n", EPS_SIZE(eps_w), EPS_SIZE(eps_h));
392
fprintf(fp, "%d %d 8\n", eps_w, eps_h);
393
fprintf(fp, "[ %d 0 0 -%d 0 %d ]\n", eps_w, eps_h, eps_h);
394
fprintf(fp, "{ picstr readstr }\n");
395
fprintf(fp, "bind image\n");
399
for (y = 0; y < margin_t; y++){
400
for (x = 0; x < margin_l + w + margin_r; x++)
401
EPS_PUT_PIX(EPS_PIX(0));
404
for (y = 0; y < h; y++){
406
for (x = 0; x < margin_l; x++)
407
EPS_PUT_PIX(EPS_PIX(0));
409
for (x = 0; x < w; x++)
411
s = ((bm->bbx_height/shrink) == y) ? (bm->bbx_height % shrink) : shrink;
412
for (y2 = 0; y2 < s; y2++){
413
for (x = 0; x < bm->bbx_width; x++){
414
if ((p[x/8] & bits[x%8]) != 0)
420
for (x = 0; x < w; x++)
421
EPS_PUT_PIX(EPS_PIX(buff[x]));
423
for (x = 0; x < margin_r; x++)
424
EPS_PUT_PIX(EPS_PIX(0));
427
for (y = 0; y < margin_b; y++){
428
for (x = 0; x < margin_l + w + margin_r; x++)
429
EPS_PUT_PIX(EPS_PIX(0));
434
fprintf(fp, "grestore\n");
435
fprintf(fp, "showpage\n");
436
fprintf(fp, "%%%%Trailer\n");
443
** VF_ImageOut_ASCIIArt()
444
** --- ASCII Art (Horizontal)
447
VF_ImageOut_ASCIIArt(VF_BITMAP bm, FILE *fp,
448
int image_width, int image_height,
449
int position_x, int position_y,
450
int margin_l, int margin_r, int margin_t, int margin_b,
451
int reverse, int shrink)
453
int x, y, w, h, y2, s, max_val, j;
457
char *chspec = " ****";
462
max_val = shrink * shrink;
463
w = (bm->bbx_width + shrink - 1) / shrink;
464
h = (bm->bbx_height + shrink - 1) / shrink;
465
if ((buff = (int*)calloc(w, sizeof(int))) == NULL){
466
vf_error = VF_ERR_NO_MEMORY;
470
culc_margins(w, h, image_width, image_height, position_x, position_y,
471
&margin_l, &margin_r, &margin_t, &margin_b);
473
if ((pixs = (char*)malloc(max_val+1)) == NULL){
474
vf_error = VF_ERR_NO_MEMORY;
478
speclen = strlen(chspec);
480
for (j = 0; j <= max_val; j++)
481
pixs[j] = chspec[(speclen * j) / (max_val+1)];
484
for (j = 0; j <= max_val; j++)
485
pixs[max_val - j] = chspec[(speclen * j) / (max_val+1)];
486
pixs[max_val] = chspec[0];
492
for (y = 0; y < margin_t; y++){
493
for (x = 0; x < margin_l + w + margin_r; x++)
494
fprintf(fp, "%c", pixs[0]);
498
for (y = 0; y < h; y++){
500
for (x = 0; x < margin_l; x++)
501
fprintf(fp, "%c", pixs[0]);
503
for (x = 0; x < w; x++)
505
p = &bm->bitmap[y * shrink * bm->raster];
506
s = ((bm->bbx_height/shrink) == y) ? (bm->bbx_height % shrink) : shrink;
507
for (y2 = 0; y2 < s; y2++){
508
for (x = 0; x < bm->bbx_width; x++){
509
if ((p[x/8] & bits[x%8]) != 0)
515
for (x = 0; x < w; x++)
516
fprintf(fp, "%c", pixs[buff[x]]);
518
for (x = 0; x < margin_r; x++)
519
fprintf(fp, "%c", pixs[0]);
524
for (y = 0; y < margin_b; y++){
525
for (x = 0; x < margin_l + w + margin_r; x++)
526
fprintf(fp, "%c", pixs[0]);
537
** VF_ImageOut_ASCIIArtV()
538
** --- ASCII Art (Vertical)
541
VF_ImageOut_ASCIIArtV(VF_BITMAP bm, FILE *fp,
542
int image_width, int image_height,
543
int position_x, int position_y,
544
int margin_l, int margin_r, int margin_t, int margin_b,
545
int reverse, int shrink)
547
int x, y, w, h, x2, s, max_val, j;
551
char *chspec = " ****";
556
max_val = shrink * shrink;
557
w = (bm->bbx_width + shrink - 1) / shrink;
558
h = (bm->bbx_height + shrink - 1) / shrink;
559
if ((buff = (int*)calloc(h, sizeof(int))) == NULL){
560
vf_error = VF_ERR_NO_MEMORY;
564
culc_margins(w, h, image_width, image_height, position_x, position_y,
565
&margin_l, &margin_r, &margin_t, &margin_b);
567
if ((pixs = (char*)malloc(max_val+1)) == NULL){
568
vf_error = VF_ERR_NO_MEMORY;
571
speclen = strlen(chspec);
573
for (j = 0; j <= max_val; j++)
574
pixs[j] = chspec[(speclen * j) / (max_val+1)];
577
for (j = 0; j <= max_val; j++)
578
pixs[max_val - j] = chspec[(speclen * j) / (max_val+1)];
579
pixs[max_val] = chspec[0];
583
for (x = 0; x < margin_l; x++){
584
for (y = margin_b-1; y >= 0; --y)
585
fprintf(fp, "%c", pixs[0]);
586
for (y = h-1; y >= 0; --y)
587
fprintf(fp, "%c", pixs[0]);
588
for (y = margin_t-1; y >= 0; --y)
589
fprintf(fp, "%c", pixs[0]);
594
for (x = 0; x < w; x++){
596
for (y = margin_b; y > 0; --y)
597
fprintf(fp, "%c", pixs[0]);
599
for (y = 0; y < h; y++)
602
for (y = 0; y < bm->bbx_height; y++){
603
s = ((bm->bbx_width/shrink) == x) ? (bm->bbx_width % shrink) : shrink;
604
for (x2 = 0; x2 < s; x2++){
605
if ((p[(x * shrink + x2)/8] & bits[(x * shrink + x2)%8]) != 0)
611
for (y = h-1; y >= 0; --y)
612
fprintf(fp, "%c", pixs[buff[y]]);
614
for (y = margin_t; y > 0; --y)
615
fprintf(fp, "%c", pixs[0]);
620
for (x = 0; x < margin_r; x++){
621
for (y = margin_b-1; y >= 0; --y)
622
fprintf(fp, "%c", pixs[0]);
623
for (y = h-1; y >= 0; --y)
624
fprintf(fp, "%c", pixs[0]);
625
for (y = margin_t-1; y >= 0; --y)
626
fprintf(fp, "%c", pixs[0]);
639
culc_margins(int bm_w, int bm_h,
640
int image_width, int image_height,
641
int position_x, int position_y,
642
int *margin_l, int *margin_r, int *margin_t, int *margin_b)
644
/* top and bottom margins */
645
if (image_height < 0){
648
image_height += *margin_t;
652
image_height += *margin_b;
655
} else /* image_height >= 0 */ {
658
case VF_IMAGEOUT_POSITION_NONE:
659
case VF_IMAGEOUT_POSITION_TOP:
662
*margin_b = image_height - *margin_t - bm_h;
664
case VF_IMAGEOUT_POSITION_BOTTOM:
666
*margin_b = image_height - bm_h;
667
*margin_t = image_height - bm_h - *margin_b;
669
case VF_IMAGEOUT_POSITION_CENTER:
670
*margin_t = (image_height - bm_h) / 2;
671
*margin_b = image_height - *margin_t - bm_h;
676
fprintf(stderr, "VFlib Warning: page height is small. (>=%d)\n",
681
fprintf(stderr, "VFlib Warning: page height is small. (>=%d)\n",
686
/* left and right margins */
687
if (image_width < 0){
690
image_width += *margin_l;
694
image_width += *margin_r;
697
} else /* image_width >= 0 */ {
700
case VF_IMAGEOUT_POSITION_NONE:
701
case VF_IMAGEOUT_POSITION_LEFT:
704
*margin_r = image_width - *margin_l - bm_w;
706
case VF_IMAGEOUT_POSITION_RIGHT:
708
*margin_r = image_width - bm_w;
709
*margin_l = image_width - bm_w - *margin_l;
711
case VF_IMAGEOUT_POSITION_CENTER:
712
*margin_l = (image_width - bm_w) / 2;
713
*margin_r = image_width - *margin_l - bm_w;
718
fprintf(stderr, "VFlib Warning: page width is small. (>=%d)\n",
723
fprintf(stderr, "VFlib Warning: page width is small. (>=%d)\n",