summaryrefslogtreecommitdiff
path: root/src/xsane-save.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/xsane-save.c')
-rw-r--r--src/xsane-save.c306
1 files changed, 172 insertions, 134 deletions
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);