summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/xsane-device-preferences.c14
-rw-r--r--src/xsane-multipage-project.c4
-rw-r--r--src/xsane-preferences.c2
-rw-r--r--src/xsane-preferences.h2
-rw-r--r--src/xsane-save.c306
-rw-r--r--src/xsane-save.h15
-rw-r--r--src/xsane-scan.c42
-rw-r--r--src/xsane-setup.c15
-rw-r--r--src/xsane-text.h2
-rw-r--r--src/xsane.h3
10 files changed, 255 insertions, 150 deletions
diff --git a/src/xsane-device-preferences.c b/src/xsane-device-preferences.c
index 41293e6..ce05cae 100644
--- a/src/xsane-device-preferences.c
+++ b/src/xsane-device-preferences.c
@@ -440,7 +440,10 @@ void xsane_device_preferences_load_file(char *filename)
xsane.negative = 0;
xsane.show_preview = 1;
+ xsane.enable_color_management = 0;
+
fd = open(filename, O_RDONLY);
+
if (fd >= 0)
{
/* prepare wire */
@@ -562,6 +565,17 @@ void xsane_device_preferences_load_file(char *filename)
}
}
}
+
+ if (!xsane.scanner_default_color_icm_profile)
+ {
+ xsane.scanner_default_color_icm_profile = strdup("");
+ }
+
+ if (!xsane.scanner_default_gray_icm_profile)
+ {
+ xsane.scanner_default_gray_icm_profile = strdup("");
+ }
+
gtk_window_move(GTK_WINDOW(xsane.dialog), xsane.dialog_posx, xsane.dialog_posy);
gtk_window_set_default_size(GTK_WINDOW(xsane.dialog), xsane.dialog_width, xsane.dialog_height);
diff --git a/src/xsane-multipage-project.c b/src/xsane-multipage-project.c
index 3721faa..7d6a565 100644
--- a/src/xsane-multipage-project.c
+++ b/src/xsane-multipage-project.c
@@ -968,7 +968,7 @@ static void xsane_multipage_save_file()
if (output_format == XSANE_PS)
{
- xsane_save_ps_create_document_header(outfile, pages, preferences.save_ps_flatedecoded);
+ xsane_save_ps_create_document_header(outfile, pages, 0, 0, 72.0*9, 72.0*12, 0 /* portrait top left */, preferences.save_ps_flatedecoded);
}
else if (output_format == XSANE_PDF)
{
@@ -1088,7 +1088,7 @@ static void xsane_multipage_save_file()
imagefile, &image_info, imagewidth, imageheight,
0, 0, imagewidth, imageheight, 0 /* portrait top left */,
preferences.save_ps_flatedecoded,
- NULL /* hTransform */, 0 /* embed_scanner_icm_profile */,
+ NULL /* hTransform */, 0 /* embed_scanner_icm_profile */, 0 /* embed CSA */, NULL, /* CSA profile */ 0 /* intent */,
xsane.project_progress_bar, &cancel_save);
}
else if (output_format == XSANE_PDF)
diff --git a/src/xsane-preferences.c b/src/xsane-preferences.c
index 2705477..9747404 100644
--- a/src/xsane-preferences.c
+++ b/src/xsane-preferences.c
@@ -302,7 +302,7 @@ desc_printer[] =
{"printer-ps-flatedecoded", xsane_rc_pref_int, PRTOFFSET(ps_flatedecoded)},
{"printer-embed-csa", xsane_rc_pref_int, PRTOFFSET(embed_csa)},
{"printer-embed-crd", xsane_rc_pref_int, PRTOFFSET(embed_crd)},
- {"printer-bpc", xsane_rc_pref_int, PRTOFFSET(blackpointcompensation)}
+ {"printer-cms-bpc", xsane_rc_pref_int, PRTOFFSET(cms_bpc)}
};
/* --------------------------------------------------------------------- */
diff --git a/src/xsane-preferences.h b/src/xsane-preferences.h
index 916df37..228548e 100644
--- a/src/xsane-preferences.h
+++ b/src/xsane-preferences.h
@@ -52,7 +52,7 @@ typedef struct
int ps_flatedecoded; /* flatedecode (zlib compression), ps level 3 */
int embed_csa; /* CSA = scanner ICM profile for postscript files */
int embed_crd; /* CRD = printer ICM profile for postscript files */
- int blackpointcompensation; /* bpc */
+ int cms_bpc; /* bpc */
}
Preferences_printer_t;
diff --git a/src/xsane-save.c b/src/xsane-save.c
index cc5f934..0109a2c 100644
--- a/src/xsane-save.c
+++ b/src/xsane-save.c
@@ -2387,10 +2387,30 @@ int xsane_save_rotate_image(FILE *outfile, FILE *imagefile, Image_info *image_in
/* ---------------------------------------------------------------------------------------------------------------------- */
-void xsane_save_ps_create_document_header(FILE *outfile, int pages, int flatedecode)
+void xsane_save_ps_create_document_header(FILE *outfile, int pages,
+ int paper_left_margin, int paper_bottom_margin,
+ int paper_width, int paper_height,
+ int paper_orientation, int flatedecode)
{
+ int box_left, box_bottom, box_right, box_top;
+
DBG(DBG_proc, "xsane_save_ps_create_document_header\n");
+ if (paper_orientation >= 8) /* rotate with 90 degrees - landscape mode */
+ {
+ box_left = paper_width - paper_left_margin - paper_height;
+ box_bottom = paper_bottom_margin;
+ box_right = box_left + ceil(paper_height);
+ box_top = box_bottom + ceil(paper_width);
+ }
+ else /* do not rotate, portrait mode */
+ {
+ box_left = paper_left_margin;
+ box_bottom = paper_bottom_margin;
+ box_right = box_left + ceil(paper_width);
+ box_top = box_bottom + ceil(paper_height);
+ }
+
fprintf(outfile, "%%!PS-Adobe-3.0\n");
fprintf(outfile, "%%%%Creator: XSane version %s (sane %d.%d) - by Oliver Rauch\n", VERSION,
SANE_VERSION_MAJOR(xsane.sane_backend_versioncode),
@@ -2405,6 +2425,8 @@ void xsane_save_ps_create_document_header(FILE *outfile, int pages, int flatedec
fprintf(outfile, "%%%%LanguageLevel: 2\n");
}
+ fprintf(outfile, "%%%%BoundingBox: %d %d %d %d\n", box_left, box_bottom, box_right, box_top);
+
if (pages)
{
fprintf(outfile, "%%%%Pages: %d\n", pages);
@@ -2415,8 +2437,9 @@ void xsane_save_ps_create_document_header(FILE *outfile, int pages, int flatedec
}
fprintf(outfile, "%%%%EndComments\n");
+ fprintf(outfile, "%%%%BeginDocument: xsane.ps\n");
fprintf(outfile, "\n");
- fprintf(outfile, "/origstate save def\n");
+// fprintf(outfile, "/origstate save def\n");
fprintf(outfile, "20 dict begin\n");
}
@@ -2427,7 +2450,7 @@ void xsane_save_ps_create_document_trailer(FILE *outfile, int pages)
DBG(DBG_proc, "xsane_save_ps_create_document_trailer\n");
fprintf(outfile, "end\n");
- fprintf(outfile, "origstate restore\n");
+// fprintf(outfile, "origstate restore\n");
if (pages)
{
@@ -2436,102 +2459,21 @@ void xsane_save_ps_create_document_trailer(FILE *outfile, int pages)
}
fprintf(outfile, "%%%%EOF\n");
+ fprintf(outfile, "%%%%EndDocument\n");
fprintf(outfile, "\n");
}
/* ---------------------------------------------------------------------------------------------------------------------- */
-/* page = [1 .. pages] */
-static void xsane_save_ps_create_page_header(FILE *outfile, int page,
- Image_info *image_info,
- float width, float height,
- int paper_left_margin, int paper_bottom_margin,
- int paper_width, int paper_height,
- int paper_orientation, int flatedecode,
- GtkProgressBar *progress_bar)
+static void xsane_save_ps_create_image_header(FILE *outfile,
+ Image_info *image_info,
+ float width, float height,
+ int degree, int position_left, int position_bottom,
+ int box_left, int box_bottom, int box_right, int box_top,
+ int flatedecode)
{
- int degree, position_left, position_bottom, box_left, box_bottom, box_right, box_top, depth;
- int left, bottom;
-
- DBG(DBG_proc, "xsane_save_ps_create_page_header\n");
-
- switch (paper_orientation)
- {
- default:
- case 0: /* top left portrait */
- left = 0.0;
- bottom = paper_height - height;
- break;
-
- case 1: /* top right portrait */
- left = paper_width - width;
- bottom = paper_height - height;
- break;
-
- case 2: /* bottom right portrait */
- left = paper_width - width;
- bottom = 0.0;
- break;
-
- case 3: /* bottom left portrait */
- left = 0.0;
- bottom = 0.0;
- break;
-
- case 4: /* center portrait */
- left = paper_width / 2.0 - width / 2.0;
- bottom = paper_height / 2.0 - height / 2.0;
- break;
-
-
- case 8: /* top left landscape */
- left = 0.0;
- bottom = paper_width - height;
- break;
-
- case 9: /* top right landscape */
- left = paper_height - width;
- bottom = paper_width - height;
- break;
-
- case 10: /* bottom right landscape */
- left = paper_height - width;
- bottom = 0.0;
- break;
-
- case 11: /* bottom left landscape */
- left = 0.0;
- bottom = 0.0;
- break;
-
- case 12: /* center landscape */
- left = paper_height / 2.0 - width / 2.0;
- bottom = paper_width / 2.0 - height / 2.0;
- break;
- }
-
-
- if (paper_orientation >= 8) /* rotate with 90 degrees - landscape mode */
- {
- degree = 90;
- position_left = left + paper_bottom_margin;
- position_bottom = bottom - paper_width - paper_left_margin;
- box_left = paper_width - paper_left_margin - bottom - height;
- box_bottom = left + paper_bottom_margin;
- box_right = box_left + ceil(height);
- box_top = box_bottom + ceil(width);
- }
- else /* do not rotate, portrait mode */
- {
- degree = 0;
- position_left = left + paper_left_margin;
- position_bottom = bottom + paper_bottom_margin;
- box_left = left + paper_left_margin;
- box_bottom = bottom + paper_bottom_margin;
- box_right = box_left + ceil(width);
- box_top = box_bottom + ceil(height);
- }
+ int depth;
depth = image_info->depth;
@@ -2540,10 +2482,6 @@ static void xsane_save_ps_create_page_header(FILE *outfile, int page,
depth = 12;
}
- fprintf(outfile, "\n");
- fprintf(outfile, "%%%%Page: %d %d\n", page, page);
- fprintf(outfile, "%%%%PageBoundingBox: %d %d %d %d\n", box_left, box_bottom, box_right, box_top);
-
if (depth == 1)
{
fprintf(outfile, "/grays %d string def\n", image_info->image_width);
@@ -2554,12 +2492,20 @@ static void xsane_save_ps_create_page_header(FILE *outfile, int page,
fprintf(outfile, "%d rotate\n", degree);
fprintf(outfile, "%d %d translate\n", position_left, position_bottom);
fprintf(outfile, "%f %f scale\n", width, height);
+
fprintf(outfile, "<<\n");
fprintf(outfile, " /ImageType 1\n");
fprintf(outfile, " /Width %d\n", image_info->image_width);
fprintf(outfile, " /Height %d\n", image_info->image_height);
fprintf(outfile, " /BitsPerComponent %d\n", depth);
- fprintf(outfile, " /Decode [0 1 0 1 0 1]\n");
+ if (image_info->channels == 3)
+ {
+ fprintf(outfile, " /Decode [0 1 0 1 0 1]\n");
+ }
+ else
+ {
+ fprintf(outfile, " /Decode [0 1]\n");
+ }
fprintf(outfile, " /ImageMatrix [%d %d %d %d %d %d]\n", image_info->image_width, 0, 0, -image_info->image_height, 0, image_info->image_height);
fprintf(outfile, " /DataSource currentfile /ASCII85Decode filter");
#ifdef HAVE_LIBZ
@@ -3033,7 +2979,7 @@ static int xsane_write_CSA(FILE *outfile, char *input_profile, int intent)
/* ---------------------------------------------------------------------------------------------------------------------- */
-static int xsane_write_CRD(FILE *outfile, char *output_profile, int intent, int blackpointcompensation)
+static int xsane_write_CRD(FILE *outfile, char *output_profile, int intent, int cms_bpc)
{
cmsHPROFILE hProfile;
size_t n;
@@ -3046,7 +2992,7 @@ static int xsane_write_CRD(FILE *outfile, char *output_profile, int intent, int
return -1;
}
- if (blackpointcompensation)
+ if (cms_bpc)
{
flags |= cmsFLAGS_BLACKPOINTCOMPENSATION;
}
@@ -3128,10 +3074,12 @@ static int xsane_save_ps_pdf_bw(FILE *outfile, FILE *imagefile, Image_info *imag
ret = xsane_write_compressed_a85(outfile, line, bytes_per_line, (y == image_info->image_height - 1));
}
}
+#ifdef HAVE_LIBZ
else if (flatedecode)
{
ret = xsane_write_flatedecode(outfile, line, bytes_per_line, (y == image_info->image_height - 1));
}
+#endif
else
{
fwrite(line, bytes_per_line, 1, outfile);
@@ -3230,10 +3178,12 @@ static int xsane_save_ps_pdf_gray(FILE *outfile, FILE *imagefile, Image_info *im
ret = xsane_write_compressed_a85(outfile, line, image_info->image_width, (y == image_info->image_height - 1));
}
}
+#ifdef HAVE_LIBZ
else if (flatedecode)
{
ret = xsane_write_flatedecode(outfile, line, image_info->image_width, (y == image_info->image_height - 1));
}
+#endif
else
{
fwrite(line, image_info->image_width, 1, outfile);
@@ -3477,10 +3427,12 @@ static int xsane_save_ps_pdf_color(FILE *outfile, FILE *imagefile, Image_info *i
ret = xsane_write_compressed_a85(outfile, line, bytes_per_line, (y == image_info->image_height - 1));
}
}
+#ifdef HAVE_LIBZ
else if (flatedecode)
{
ret = xsane_write_flatedecode(outfile, line, bytes_per_line, (y == image_info->image_height - 1));
}
+#endif
else
{
fwrite(line, bytes_per_line, 1, outfile);
@@ -3533,18 +3485,119 @@ static int xsane_save_ps_pdf_color(FILE *outfile, FILE *imagefile, Image_info *i
int xsane_save_ps_page(FILE *outfile, int page,
FILE *imagefile, Image_info *image_info, float width, float height,
- int paper_left_margin, int paper_bottom_margin, int paperwidth, int paperheight, int paper_orientation,
+ int paper_left_margin, int paper_bottom_margin, int paper_width, int paper_height, int paper_orientation,
int flatedecode,
- cmsHTRANSFORM hTransform, int do_transform,
+ cmsHTRANSFORM hTransform, int apply_ICM_profile, int embed_CSA, char *CSA_profile, int intent,
GtkProgressBar *progress_bar, int *cancel_save)
{
+ int degree, position_left, position_bottom, box_left, box_bottom, box_right, box_top;
+ int left, bottom;
+
DBG(DBG_proc, "xsane_save_ps_page\n");
- xsane_save_ps_create_page_header(outfile, page,
- image_info, width, height,
- paper_left_margin, paper_bottom_margin, paperwidth, paperheight, paper_orientation,
- flatedecode,
- progress_bar);
+ switch (paper_orientation)
+ {
+ default:
+ case 0: /* top left portrait */
+ left = 0.0;
+ bottom = paper_height - height;
+ break;
+
+ case 1: /* top right portrait */
+ left = paper_width - width;
+ bottom = paper_height - height;
+ break;
+
+ case 2: /* bottom right portrait */
+ left = paper_width - width;
+ bottom = 0.0;
+ break;
+
+ case 3: /* bottom left portrait */
+ left = 0.0;
+ bottom = 0.0;
+ break;
+
+ case 4: /* center portrait */
+ left = paper_width / 2.0 - width / 2.0;
+ bottom = paper_height / 2.0 - height / 2.0;
+ break;
+
+
+ case 8: /* top left landscape */
+ left = 0.0;
+ bottom = paper_width - height;
+ break;
+
+ case 9: /* top right landscape */
+ left = paper_height - width;
+ bottom = paper_width - height;
+ break;
+
+ case 10: /* bottom right landscape */
+ left = paper_height - width;
+ bottom = 0.0;
+ break;
+
+ case 11: /* bottom left landscape */
+ left = 0.0;
+ bottom = 0.0;
+ break;
+
+ case 12: /* center landscape */
+ left = paper_height / 2.0 - width / 2.0;
+ bottom = paper_width / 2.0 - height / 2.0;
+ break;
+ }
+
+
+ if (paper_orientation >= 8) /* rotate with 90 degrees - landscape mode */
+ {
+ degree = 90;
+ position_left = left + paper_bottom_margin;
+ position_bottom = bottom - paper_width - paper_left_margin;
+ box_left = paper_width - paper_left_margin - bottom - height;
+ box_bottom = left + paper_bottom_margin;
+ box_right = box_left + ceil(height);
+ box_top = box_bottom + ceil(width);
+ }
+ else /* do not rotate, portrait mode */
+ {
+ degree = 0;
+ position_left = left + paper_left_margin;
+ position_bottom = bottom + paper_bottom_margin;
+ box_left = left + paper_left_margin;
+ box_bottom = bottom + paper_bottom_margin;
+ box_right = box_left + ceil(width);
+ box_top = box_bottom + ceil(height);
+ }
+
+ fprintf(outfile, "\n");
+ fprintf(outfile, "%%%%Page: %d %d\n", page, page);
+ fprintf(outfile, "%%%%PageBoundingBox: %d %d %d %d\n", box_left, box_bottom, box_right, box_top);
+
+#ifdef HAVE_LIBLCMS
+ if ((apply_ICM_profile) && (embed_CSA))
+ {
+ xsane_write_CSA(outfile, CSA_profile, intent); /* write scanner profile to ps file */
+ }
+ else
+#endif
+ {
+ if (image_info->channels == 1) /* lineart, halftone, grayscale */
+ {
+ fprintf(outfile, "/DeviceGray setcolorspace\n");
+ }
+ else
+ {
+ fprintf(outfile, "/DeviceRGB setcolorspace\n");
+ }
+ }
+
+ xsane_save_ps_create_image_header(outfile, image_info, width, height,
+ degree, position_left, position_bottom,
+ box_left, box_bottom, box_right, box_top,
+ flatedecode);
if (image_info->channels == 1) /* lineart, halftone, grayscale */
{
@@ -3554,12 +3607,12 @@ int xsane_save_ps_page(FILE *outfile, int page,
}
else /* grayscale */
{
- xsane_save_ps_pdf_gray(outfile, imagefile, image_info, TRUE, flatedecode, hTransform, do_transform, progress_bar, cancel_save);
+ xsane_save_ps_pdf_gray(outfile, imagefile, image_info, TRUE, flatedecode, hTransform, apply_ICM_profile && (!embed_CSA), progress_bar, cancel_save);
}
}
else /* color RGB */
{
- xsane_save_ps_pdf_color(outfile, imagefile, image_info, TRUE, flatedecode, hTransform, do_transform, progress_bar, cancel_save);
+ xsane_save_ps_pdf_color(outfile, imagefile, image_info, TRUE, flatedecode, hTransform, apply_ICM_profile && (!embed_CSA), progress_bar, cancel_save);
}
xsane_save_ps_create_page_trailer(outfile);
@@ -3580,47 +3633,32 @@ int xsane_save_ps_page(FILE *outfile, int page,
/* ---------------------------------------------------------------------------------------------------------------------- */
int xsane_save_ps(FILE *outfile, FILE *imagefile, Image_info *image_info, float width, float height,
- int paper_left_margin, int paper_bottom_margin, int paperwidth, int paperheight, int paper_orientation,
+ int paper_left_margin, int paper_bottom_margin, int paper_width, int paper_height, int paper_orientation,
int flatedecode,
cmsHTRANSFORM hTransform, int apply_ICM_profile, int embed_CSA, char *CSA_profile,
- int embed_CRD, char *CRD_profile, int blackpointcompensation, int intent,
+ int embed_CRD, char *CRD_profile, int cms_bpc, int intent,
GtkProgressBar *progress_bar, int *cancel_save)
{
DBG(DBG_proc, "xsane_save_ps\n");
*cancel_save = 0;
- xsane_save_ps_create_document_header(outfile, 1 /* pages */, flatedecode);
+ xsane_save_ps_create_document_header(outfile, 1 /* pages */, paper_left_margin, paper_bottom_margin, paper_width, paper_height, paper_orientation, flatedecode);
#ifdef HAVE_LIBLCMS
if ((apply_ICM_profile) && (embed_CRD))
{
- xsane_write_CRD(outfile, CRD_profile, intent, blackpointcompensation); /* write printer profile to ps file */
+ xsane_write_CRD(outfile, CRD_profile, intent, cms_bpc); /* write printer profile to ps file */
}
+#endif
- if ((apply_ICM_profile) && (embed_CSA))
- {
- xsane_write_CSA(outfile, CSA_profile, intent); /* write scanner profile to ps file */
- }
- else
-#endif
- {
- if (image_info->channels == 1) /* lineart, halftone, grayscale */
- {
- fprintf(outfile, "/DeviceGray setcolorspace\n");
- }
- else
- {
- fprintf(outfile, "/DeviceRGB setcolorspace\n");
- }
- }
xsane_save_ps_page(outfile, 1 /* page */,
imagefile, image_info, width, height,
- paper_left_margin, paper_bottom_margin, paperwidth, paperheight, paper_orientation,
+ paper_left_margin, paper_bottom_margin, paper_width, paper_height, paper_orientation,
flatedecode,
- hTransform, (apply_ICM_profile && (!embed_CSA) && (!embed_CRD)) /* do_transform */,
+ hTransform, apply_ICM_profile, embed_CSA, CSA_profile, intent,
progress_bar, cancel_save);
xsane_save_ps_create_document_trailer(outfile, 0 /* we defined pages at beginning */);
@@ -4020,7 +4058,7 @@ static void xsane_save_pdf_create_page_trailer(FILE *outfile, struct pdf_xref *x
int xsane_save_pdf_page(FILE *outfile, struct pdf_xref *xref, int page,
FILE *imagefile, Image_info *image_info, float width, float height,
- int paper_left_margin, int paper_bottom_margin, int paperwidth, int paperheight, int paper_orientation,
+ int paper_left_margin, int paper_bottom_margin, int paper_width, int paper_height, int paper_orientation,
int flatedecode,
cmsHTRANSFORM hTransform, int do_transform, int icc_object,
GtkProgressBar *progress_bar, int *cancel_save)
@@ -4030,7 +4068,7 @@ int xsane_save_pdf_page(FILE *outfile, struct pdf_xref *xref, int page,
xsane_save_pdf_create_page_header(outfile, xref, page,
image_info, width, height,
- paper_left_margin, paper_bottom_margin, paperwidth, paperheight, paper_orientation,
+ paper_left_margin, paper_bottom_margin, paper_width, paper_height, paper_orientation,
flatedecode, icc_object,
progress_bar);
@@ -4068,7 +4106,7 @@ int xsane_save_pdf_page(FILE *outfile, struct pdf_xref *xref, int page,
/* ---------------------------------------------------------------------------------------------------------------------- */
int xsane_save_pdf(FILE *outfile, FILE *imagefile, Image_info *image_info, float width, float height,
- int paper_left_margin, int paper_bottom_margin, int paperwidth, int paperheight, int paper_orientation,
+ int paper_left_margin, int paper_bottom_margin, int paper_width, int paper_height, int paper_orientation,
int flatedecode,
cmsHTRANSFORM hTransform, int apply_ICM_profile, int cms_function,
GtkProgressBar *progress_bar, int *cancel_save)
@@ -4093,7 +4131,7 @@ int xsane_save_pdf(FILE *outfile, FILE *imagefile, Image_info *image_info, float
xsane_save_pdf_page(outfile, &xref, 1,
imagefile, image_info, width, height,
- paper_left_margin, paper_bottom_margin, paperwidth, paperheight, paper_orientation,
+ paper_left_margin, paper_bottom_margin, paper_width, paper_height, paper_orientation,
flatedecode,
hTransform, apply_ICM_profile && ((cms_function != XSANE_CMS_FUNCTION_EMBED_SCANNER_ICM_PROFILE)) /* do_transform */, icc_object,
progress_bar, cancel_save);
diff --git a/src/xsane-save.h b/src/xsane-save.h
index f94fe7c..64db676 100644
--- a/src/xsane-save.h
+++ b/src/xsane-save.h
@@ -68,17 +68,20 @@ extern int xsane_save_scaled_image(FILE *outfile, FILE *imagefile, Image_info *i
extern int xsane_save_despeckle_image(FILE *outfile, FILE *imagefile, Image_info *image_info, int radius, GtkProgressBar *progress_bar, int *cancel_save);
extern int xsane_save_blur_image(FILE *outfile, FILE *imagefile, Image_info *image_info, float radius, GtkProgressBar *progress_bar, int *cancel_save);
extern int xsane_save_rotate_image(FILE *outfile, FILE *imagefile, Image_info *image_info, int rotation, GtkProgressBar *progress_bar, int *cancel_save);
-extern void xsane_save_ps_create_document_header(FILE *outfile, int pages, int flatedecode);
+extern void xsane_save_ps_create_document_header(FILE *outfile, int pages,
+ int paper_left_margin, int paper_bottom_margin,
+ int paper_width, int paper_height,
+ int paper_orientation, int flatedecode);
extern void xsane_save_ps_create_document_trailer(FILE *outfile, int pages);
extern int xsane_save_ps_page(FILE *outfile, int page,
FILE *imagefile, Image_info *image_info, float width, float height,
- int paper_left_margin, int paper_bottom_margin, int paperwidth, int paperheight, int paper_orientation,
+ int paper_left_margin, int paper_bottom_margin, int paper_width, int paper_height, int paper_orientation,
int flatedecode,
- cmsHTRANSFORM hTransform, int embed_scanner_icm_profile,
+ cmsHTRANSFORM hTransform, int apply_ICM_profile, int embed_CSA, char *CSA_profile, int intent,
GtkProgressBar *progress_bar, int *cancel_save);
extern int xsane_save_ps(FILE *outfile, FILE *imagefile, Image_info *image_info,
float width, float height,
- int paper_left_margin, int paper_bottom_margin, int paperwidth, int paperheight, int paper_orientation,
+ int paper_left_margin, int paper_bottom_margin, int paper_width, int paper_height, int paper_orientation,
int flatedecode,
cmsHTRANSFORM hTransform, int apply_ICM_profile, int embed_CSA, char *CSA_profile,
int embed_CRD, char *CRD_profile, int blackpointcompensation, int intent,
@@ -87,13 +90,13 @@ extern void xsane_save_pdf_create_document_header(FILE *outfile, struct pdf_xref
extern void xsane_save_pdf_create_document_trailer(FILE *outfile, struct pdf_xref *xref, int pages);
extern int xsane_save_pdf_page(FILE *outfile, struct pdf_xref *xref, int page,
FILE *imagefile, Image_info *image_info, float width, float height,
- int paper_left_margin, int paper_bottom_margin, int paperwidth, int paperheight, int paper_orientation,
+ int paper_left_margin, int paper_bottom_margin, int paper_width, int paper_height, int paper_orientation,
int flatedecode,
cmsHTRANSFORM hTransform, int embed__scanner_icm_profile, int icc_object,
GtkProgressBar *progress_bar, int *cancel_save);
extern int xsane_save_pdf(FILE *outfile, FILE *imagefile, Image_info *image_info,
float width, float height,
- int paper_left_margin, int paper_bottom_margin, int paperwidth, int paperheight, int paper_orientation,
+ int paper_left_margin, int paper_bottom_margin, int paper_width, int paper_height, int paper_orientation,
int flatedecode,
cmsHTRANSFORM hTransform, int apply_ICM_profile, int cms_function,
GtkProgressBar *progress_bar, int *cancel_save);
diff --git a/src/xsane-scan.c b/src/xsane-scan.c
index 9cc9ffb..11aff3e 100644
--- a/src/xsane-scan.c
+++ b/src/xsane-scan.c
@@ -1090,7 +1090,23 @@ void xsane_scan_done(SANE_Status status)
image_info.cms_intent = preferences.cms_intent;
image_info.cms_bpc = preferences.cms_bpc;
- strncpy(image_info.icm_profile, xsane.scanner_default_color_icm_profile, sizeof(image_info.icm_profile));
+ image_info.icm_profile[0] = 0; /* empty string */
+
+ if (image_info.channels == 1)
+ {
+ if (xsane.scanner_default_gray_icm_profile)
+ {
+ strncpy(image_info.icm_profile, xsane.scanner_default_gray_icm_profile, sizeof(image_info.icm_profile));
+ }
+ }
+ else
+ {
+ if (xsane.scanner_default_color_icm_profile)
+ {
+ strncpy(image_info.icm_profile, xsane.scanner_default_color_icm_profile, sizeof(image_info.icm_profile));
+ }
+ }
+
xsane_write_pnm_header(xsane.out, &image_info, 0);
}
@@ -1349,13 +1365,13 @@ void xsane_scan_done(SANE_Status status)
imagewidth, imageheight,
preferences.printer[preferences.printernr]->leftoffset * 72.0/MM_PER_INCH, /* paper_left_margin */
preferences.printer[preferences.printernr]->bottomoffset * 72.0/MM_PER_INCH, /* paper_bottom_margin */
- preferences.printer[preferences.printernr]->width * 72.0/MM_PER_INCH, /* usable paperwidth */
- preferences.printer[preferences.printernr]->height * 72.0/MM_PER_INCH, /* usable paperheight */
+ preferences.printer[preferences.printernr]->width * 72.0/MM_PER_INCH, /* usable paper_width */
+ preferences.printer[preferences.printernr]->height * 72.0/MM_PER_INCH, /* usable paper_height */
preferences.paper_orientation,
preferences.printer[preferences.printernr]->ps_flatedecoded, /* ps level 3 */
NULL /* hTransform */, xsane.enable_color_management,
preferences.printer[preferences.printernr]->embed_csa, xsane.scanner_default_color_icm_profile,
- preferences.printer[preferences.printernr]->embed_crd, preferences.printer[preferences.printernr]->icm_profile, preferences.printer[preferences.printernr]->blackpointcompensation,
+ preferences.printer[preferences.printernr]->embed_crd, preferences.printer[preferences.printernr]->icm_profile, preferences.printer[preferences.printernr]->cms_bpc,
0 /* intent */,
xsane.progress_bar,
&xsane.cancel_save);
@@ -1769,7 +1785,23 @@ static void xsane_start_scan(void)
image_info.cms_intent = preferences.cms_intent;
image_info.cms_bpc = preferences.cms_bpc;
- strncpy(image_info.icm_profile, xsane.scanner_default_color_icm_profile, sizeof(image_info.icm_profile));
+
+ image_info.icm_profile[0] = 0; /* empty string */
+
+ if (image_info.channels == 1)
+ {
+ if (xsane.scanner_default_gray_icm_profile)
+ {
+ strncpy(image_info.icm_profile, xsane.scanner_default_gray_icm_profile, sizeof(image_info.icm_profile));
+ }
+ }
+ else
+ {
+ if (xsane.scanner_default_color_icm_profile)
+ {
+ strncpy(image_info.icm_profile, xsane.scanner_default_color_icm_profile, sizeof(image_info.icm_profile));
+ }
+ }
xsane_write_pnm_header(xsane.out, &image_info, 0);
diff --git a/src/xsane-setup.c b/src/xsane-setup.c
index 677c375..1078604 100644
--- a/src/xsane-setup.c
+++ b/src/xsane-setup.c
@@ -141,6 +141,7 @@ void xsane_new_printer(void)
preferences.printer[preferences.printernr]->icm_profile = NULL;
preferences.printer[preferences.printernr]->embed_csa = 1;
preferences.printer[preferences.printernr]->embed_crd = 0;
+ preferences.printer[preferences.printernr]->cms_bpc = 0;
preferences.printer[preferences.printernr]->ps_flatedecoded = 1;
}
else
@@ -294,6 +295,7 @@ static void xsane_setup_printer_update()
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(xsane_setup.printer_embed_csa_button), preferences.printer[preferences.printernr]->embed_csa);
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(xsane_setup.printer_embed_crd_button), preferences.printer[preferences.printernr]->embed_crd);
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(xsane_setup.printer_cms_bpc_button), preferences.printer[preferences.printernr]->cms_bpc);
#endif
#ifdef HAVE_LIBZ
@@ -383,6 +385,7 @@ static void xsane_setup_printer_apply_changes(GtkWidget *widget, gpointer data)
preferences.printer[preferences.printernr]->icm_profile = strdup(gtk_entry_get_text(GTK_ENTRY(xsane_setup.printer_icm_profile_entry)));
xsane_update_bool(xsane_setup.printer_embed_csa_button, &preferences.printer[preferences.printernr]->embed_csa);
xsane_update_bool(xsane_setup.printer_embed_crd_button, &preferences.printer[preferences.printernr]->embed_crd);
+ xsane_update_bool(xsane_setup.printer_cms_bpc_button, &preferences.printer[preferences.printernr]->cms_bpc);
#endif
#ifdef HAVE_LIBZ
@@ -1451,6 +1454,18 @@ static void xsane_printer_notebook(GtkWidget *notebook)
gtk_widget_show(button);
gtk_widget_show(hbox);
xsane_setup.printer_embed_crd_button = button;
+
+ /* black point compensation */
+ hbox = gtk_hbox_new(/* homogeneous */ FALSE, 0);
+ gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 2);
+ button = gtk_check_button_new_with_label(TEXT_SETUP_PRINTER_CMS_BPC);
+ xsane_back_gtk_set_tooltip(xsane.tooltips, button, DESC_PRINTER_CMS_BPC);
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), preferences.printer[preferences.printernr]->cms_bpc);
+ gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, TRUE, 2);
+ gtk_widget_show(button);
+ gtk_widget_show(hbox);
+ xsane_setup.printer_cms_bpc_button = button;
+
#endif
#ifdef HAVE_LIBZ
diff --git a/src/xsane-text.h b/src/xsane-text.h
index c271956..59c6317 100644
--- a/src/xsane-text.h
+++ b/src/xsane-text.h
@@ -287,6 +287,7 @@
#define TEXT_SETUP_PRINTER_GAMMA_BLUE _("Printer gamma blue:")
#define TEXT_SETUP_PRINTER_EMBED_CSA _("Embed scanner ICM profile as CSA")
#define TEXT_SETUP_PRINTER_EMBED_CRD _("Embed printer ICM profile as CRD")
+#define TEXT_SETUP_PRINTER_CMS_BPC _("Apply black point compensation")
#define TEXT_SETUP_PRINTER_PS_FLATEDECODED _("Create zlib compressed postscript image (ps level 3) for printing")
#define TEXT_SETUP_TMP_PATH _("Temporary directory")
#define TEXT_SETUP_IMAGE_PERMISSION _("Image-file permissions")
@@ -578,6 +579,7 @@
#define DESC_PRINTER_GAMMA_BLUE _("Additional gamma value for blue component for photocopy")
#define DESC_PRINTER_EMBED_CSA _("Creates a postsciptfile that contains the ICM profile of the scanner")
#define DESC_PRINTER_EMBED_CRD _("Creates a postsciptfile that contains the ICM profile of the printer")
+#define DESC_PRINTER_CMS_BPC _("Applies black point compensation")
#define DESC_PRINTER_PS_FLATEDECODED _("Create zlib compressed postscript image for printer (flatedecode).\n" \
"The printer has to understand postscript level 3!")
#define DESC_TMP_PATH _("Path to temp directory")
diff --git a/src/xsane.h b/src/xsane.h
index 4e4ddd8..5cde44a 100644
--- a/src/xsane.h
+++ b/src/xsane.h
@@ -91,7 +91,7 @@
/* ---------------------------------------------------------------------------------------------------------------------- */
-#define XSANE_VERSION "0.993"
+#define XSANE_VERSION "0.994"
#define XSANE_AUTHOR "Oliver Rauch"
#define XSANE_COPYRIGHT "Oliver Rauch"
#define XSANE_DATE "1998-2007"
@@ -1010,6 +1010,7 @@ typedef struct XsaneSetup
GtkWidget *printer_icm_profile_entry;
GtkWidget *printer_embed_csa_button;
GtkWidget *printer_embed_crd_button;
+ GtkWidget *printer_cms_bpc_button;
GtkWidget *printer_width_entry;
GtkWidget *printer_height_entry;
GtkWidget *printer_ps_flatedecoded_button;