1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
|
#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>
#include <string.h>
#include <errno.h>
#include <jpeglib.h>
#include "readers.h"
#include "writers.h"
#include "misc.h"
#include <X11/Xlib.h>
#include <X11/Intrinsic.h>
#include <Xm/Xm.h>
#include <Xm/Text.h>
#include <Xm/SelectioB.h>
#include "RegEdit.h"
#include "ida.h"
#include "viewer.h"
/* ---------------------------------------------------------------------- */
/* jpeg writer */
static Widget jpeg_shell;
static Widget jpeg_text;
static int jpeg_quality = 75;
static void
jpeg_button_cb(Widget widget, XtPointer clientdata, XtPointer call_data)
{
XmSelectionBoxCallbackStruct *cb = call_data;
if (XmCR_OK == cb->reason) {
jpeg_quality = atoi(XmTextGetString(jpeg_text));
do_save_print();
}
XtUnmanageChild(jpeg_shell);
}
static int
jpeg_conf(Widget parent, struct ida_image *img)
{
char tmp[32];
if (!jpeg_shell) {
/* build dialog */
jpeg_shell = XmCreatePromptDialog(parent,"jpeg",NULL,0);
XmdRegisterEditres(XtParent(jpeg_shell));
XtUnmanageChild(XmSelectionBoxGetChild(jpeg_shell,XmDIALOG_HELP_BUTTON));
jpeg_text = XmSelectionBoxGetChild(jpeg_shell,XmDIALOG_TEXT);
XtAddCallback(jpeg_shell,XmNokCallback,jpeg_button_cb,NULL);
XtAddCallback(jpeg_shell,XmNcancelCallback,jpeg_button_cb,NULL);
}
sprintf(tmp,"%d",jpeg_quality);
XmTextSetString(jpeg_text,tmp);
XtManageChild(jpeg_shell);
return 0;
}
static int
jpeg_write(FILE *fp, struct ida_image *img)
{
struct jpeg_compress_struct cinfo;
struct jpeg_error_mgr jerr;
unsigned char *line;
unsigned int i;
cinfo.err = jpeg_std_error(&jerr);
jpeg_create_compress(&cinfo);
jpeg_stdio_dest(&cinfo, fp);
cinfo.image_width = img->i.width;
cinfo.image_height = img->i.height;
if (img->i.dpi) {
cinfo.density_unit = 1;
cinfo.X_density = img->i.dpi;
cinfo.Y_density = img->i.dpi;
}
cinfo.input_components = 3;
cinfo.in_color_space = JCS_RGB;
jpeg_set_defaults(&cinfo);
jpeg_set_quality(&cinfo, jpeg_quality, TRUE);
jpeg_start_compress(&cinfo, TRUE);
for (i = 0; i < img->i.height; i++) {
line = ida_image_scanline(img, i);
jpeg_write_scanlines(&cinfo, &line, 1);
}
jpeg_finish_compress(&(cinfo));
jpeg_destroy_compress(&(cinfo));
return 0;
}
struct ida_writer jpeg_writer = {
label: "JPEG",
ext: { "jpg", "jpeg", NULL},
write: jpeg_write,
conf: jpeg_conf,
};
static void __init init_wr(void)
{
write_register(&jpeg_writer);
}
|