bumped print plug-in to version 3.0.9

--Sven
This commit is contained in:
Sven Neumann
2000-02-23 13:52:42 +00:00
parent 89177db5ed
commit c7bacaeadb
5 changed files with 643 additions and 644 deletions

View File

@ -1,3 +1,14 @@
Wed Feb 23 14:50:09 CET 2000 Sven Neumann <sven@gimp.org>
* plug-ins/print/print-escp2.c
* plug-ins/print/print-pcl.c
* plug-ins/print/print-util.c
* plug-ins/print/print.c:
Applied patch from Robert L Krawitz <rlk@alum.mit.edu>.
Bumps print plug-in version to 3.0.9 and adds a few nifty
little features. Now all we need is a facelift for the
dialog...
Wed Feb 23 01:15:12 CET 2000 Sven Neumann <sven@gimp.org>
* plug-ins/common/gtm.c: added a warning in the case the user

View File

@ -466,6 +466,17 @@ escp2_print(int model, /* I - Model */
return;
}
}
if (!use_softweave)
{
/*
* In microweave mode, correct for the loss of page height that
* would happen in softweave mode. The divide by 10 is to convert
* lines into points (Epson printers all have 720 ydpi);
*/
int extra_points = ((escp2_nozzles(model) - 1) *
escp2_nozzle_separation(model) + 5) / 10;
top += extra_points;
}
/*
* Compute the output size...
@ -577,11 +588,13 @@ escp2_print(int model, /* I - Model */
x = top;
top = left;
left = x;
left = page_width - x - out_width;
}
if (left < 0)
left = (page_width - out_width) / 2 + page_left;
else
left = left + page_left;
if (top < 0)
top = (page_height + out_height) / 2 + page_bottom;
@ -770,11 +783,11 @@ escp2_print(int model, /* I - Model */
if (output_type == OUTPUT_GRAY)
{
dither_black(out, x, image_height, out_width, black);
if (use_softweave)
escp2_write_weave(prn, length, ydpi, model, out_width, left, xdpi,
cyan, magenta, yellow, black, lcyan, lmagenta);
else
escp2_write(prn, black, length, 0, 0, ydpi, model, out_width, left);
if (use_softweave)
escp2_write_weave(prn, length, ydpi, model, out_width, left, xdpi,
cyan, magenta, yellow, black, lcyan, lmagenta);
else
escp2_write(prn, black, length, 0, 0, ydpi, model, out_width, left);
}
else if (escp2_has_cap(model, MODEL_6COLOR_MASK, MODEL_6COLOR_YES))
{
@ -862,11 +875,11 @@ escp2_print(int model, /* I - Model */
if (output_type == OUTPUT_GRAY)
{
dither_black(out, y, image_width, out_width, black);
if (use_softweave)
escp2_write_weave(prn, length, ydpi, model, out_width, left, xdpi,
cyan, magenta, yellow, black, lcyan, lmagenta);
else
escp2_write(prn, black, length, 0, 0, ydpi, model, out_width, left);
if (use_softweave)
escp2_write_weave(prn, length, ydpi, model, out_width, left, xdpi,
cyan, magenta, yellow, black, lcyan, lmagenta);
else
escp2_write(prn, black, length, 0, 0, ydpi, model, out_width, left);
}
else if (escp2_has_cap(model, MODEL_6COLOR_MASK, MODEL_6COLOR_YES))
{
@ -1635,14 +1648,13 @@ flush_pass(int passno, int model, int width, int hoffset, int ydpi,
fwrite("\033.\001\012\012\001", 6, 1, prn);
break;
case 720 :
if (escp2_has_cap(model, MODEL_6COLOR_MASK, MODEL_6COLOR_YES))
if (escp2_has_cap(model, MODEL_720DPI_MODE_MASK,
MODEL_720DPI_600))
fprintf(prn, "\033.%c%c%c%c", 1, 8 * 5, 5,
*linecount + pass->missingstartrows);
else if (escp2_has_cap(model, MODEL_720DPI_MODE_MASK,
MODEL_720DPI_600))
fwrite("\033.\001\050\005\001", 6, 1, prn);
else
fwrite("\033.\001\005\005\001", 6, 1, prn);
fprintf(prn, "\033.%c%c%c%c", 1, 5, 5,
*linecount + pass->missingstartrows);
break;
}

View File

@ -429,11 +429,13 @@ pcl_print(int model, /* I - Model */
x = top;
top = left;
left = x;
left = page_width - x - out_width;
}
if (left < 0)
left = (page_width - out_width) / 2 + page_left;
else
left = left + page_left;
if (top < 0)
top = (page_height + out_height) / 2 + page_bottom;

View File

@ -44,8 +44,6 @@
#include "print.h"
#include <libgimp/gimp.h>
#include "libgimp/gimpcolorspace.h"
#include <math.h>
/*
@ -126,18 +124,24 @@ dither_black(unsigned short *gray, /* I - Grayscale pixels */
if (k > 32767)
{
*kptr |= bit;
k -= 65535;
k -= 65536;
}
if (ditherbit & bit)
{
kerror1[0] = 5 * k;
ditherk = kerror0[1] + 3 * k;
int tmpk = k;
if (tmpk > 65535)
tmpk = 65535;
kerror1[0] = 5 * tmpk;
ditherk = kerror0[1] + 3 * tmpk;
}
else
{
kerror1[0] = 3 * k;
ditherk = kerror0[1] + 5 * k;
int tmpk = k;
if (tmpk > 65535)
tmpk = 65535;
kerror1[0] = 3 * tmpk;
ditherk = kerror0[1] + 5 * tmpk;
}
if (bit == 1)
@ -185,11 +189,11 @@ dither_black(unsigned short *gray, /* I - Grayscale pixels */
*/
#define NU_C 1
#define DE_C 1
#define DE_C 2
#define NU_M 1
#define DE_M 1
#define DE_M 2
#define NU_Y 1
#define DE_Y 1
#define DE_Y 2
#define I_RATIO_C NU_C / DE_C
#define I_RATIO_C1 NU_C / (DE_C + NU_C)
@ -311,7 +315,7 @@ do { \
{ \
PRINT_D1(r, R, d1, d2); \
DO_PRINT_COLOR(r); \
r -= 65535; \
r -= 65536; \
} \
} \
else \
@ -348,52 +352,41 @@ do { \
if (sub < R##_CONST_0) \
r -= R##_CONST_0; \
else if (sub > 65535) \
r -= 65535; \
r -= 65536; \
else \
r -= sub; \
} \
} \
} while (0)
#if 1
#define UPDATE_DITHER(r, d2, x, width) \
do { \
int offset = (15 - (((o##r & 0xf000) >> 12)) * horizontal_overdensity) \
>> 1; \
if (x < offset) \
offset = x; \
else if (x > dst_width - offset - 1) \
offset = dst_width - x - 1; \
if (ditherbit##d2 & bit) \
{ \
r##error1[-offset] += r; \
r##error1[0] += 3 * r; \
r##error1[offset] += r; \
dither##r = r##error0[direction] + 3 * r; \
} \
else \
{ \
r##error1[-offset] += r; \
r##error1[0] += r; \
r##error1[offset] += r; \
dither##r = r##error0[direction] + 5 * r; \
} \
} while (0)
#else
#define UPDATE_DITHER(r, d2, x, width) \
do { \
if (ditherbit##d2 & bit) \
{ \
r##error1[0] = 5 * r; \
dither##r = r##error0[direction] + 3 * r; \
} \
else \
{ \
r##error1[0] = 3 * r; \
dither##r = r##error0[direction] + 5 * r; \
} \
} while (0)
#endif
#define UPDATE_DITHER(r, d2, x, width) \
do { \
int offset = ((15 - (((o##r & 0xf000) >> 12))) * horizontal_overdensity) \
>> 1; \
int tmp##r = r; \
if (tmp##r > 65535) \
tmp##r = 65535; \
if (x < offset) \
offset = x; \
else if (x > dst_width - offset - 1) \
offset = dst_width - x - 1; \
if (ditherbit##d2 & bit) \
{ \
r##error1[-offset] += tmp##r; \
r##error1[0] += 3 * tmp##r; \
r##error1[offset] += tmp##r; \
if (x > 0 && x < (dst_width - 1)) \
dither##r = r##error0[direction] + 3 * tmp##r; \
} \
else \
{ \
r##error1[-offset] += tmp##r; \
r##error1[0] += tmp##r; \
r##error1[offset] += tmp##r; \
if (x > 0 && x < (dst_width - 1)) \
dither##r = r##error0[direction] + 5 * tmp##r; \
} \
} while (0)
void
dither_cmyk(unsigned short *rgb, /* I - RGB pixels */
@ -731,7 +724,7 @@ dither_cmyk(unsigned short *rgb, /* I - RGB pixels */
(32768 >> K_RANDOMIZER))))
{
DO_PRINT_COLOR(k);
k -= 65535;
k -= 65536;
}
UPDATE_DITHER(k, 1, x, src_width);
@ -936,13 +929,19 @@ dither_black4(unsigned short *gray, /* I - Grayscale pixels */
if (ditherbit & bit)
{
kerror1[0] = 5 * k;
ditherk = kerror0[1] + 3 * k;
int tmpk = k;
if (tmpk > 65535)
tmpk = 65535;
kerror1[0] = 5 * tmpk;
ditherk = kerror0[1] + 3 * tmpk;
}
else
{
kerror1[0] = 3 * k;
ditherk = kerror0[1] + 5 * k;
int tmpk = k;
if (tmpk > 65535)
tmpk = 65535;
kerror1[0] = 3 * tmpk;
ditherk = kerror0[1] + 5 * tmpk;
}
if (bit == 1)
@ -1210,6 +1209,156 @@ dither_cmyk4(unsigned short *rgb, /* I - RGB pixels */
}
}
/* rgb/hsv conversions taken from Gimp common/autostretch_hsv.c */
/* The version in libgimp IS NOT SUITABLE FOR THIS TASK. That version is */
/* 8 bits. We need the 16 bit version! */
static void
calc_rgb_to_hsv(unsigned short *rgb, double *hue, double *sat, double *val)
{
double red, green, blue;
double h, s, v;
double min, max;
double delta;
red = rgb[0] / 65535.0;
green = rgb[1] / 65535.0;
blue = rgb[2] / 65535.0;
h = 0.0; /* Shut up -Wall */
if (red > green)
{
if (red > blue)
max = red;
else
max = blue;
if (green < blue)
min = green;
else
min = blue;
}
else
{
if (green > blue)
max = green;
else
max = blue;
if (red < blue)
min = red;
else
min = blue;
}
v = max;
if (max != 0.0)
s = (max - min) / max;
else
s = 0.0;
if (s == 0.0)
h = 0.0;
else
{
delta = max - min;
if (red == max)
h = (green - blue) / delta;
else if (green == max)
h = 2 + (blue - red) / delta;
else if (blue == max)
h = 4 + (red - green) / delta;
h /= 6.0;
if (h < 0.0)
h += 1.0;
else if (h > 1.0)
h -= 1.0;
}
*hue = h;
*sat = s;
*val = v;
}
static void
calc_hsv_to_rgb(unsigned short *rgb, double h, double s, double v)
{
double hue, saturation, value;
double f, p, q, t;
if (s == 0.0)
{
h = v;
s = v;
v = v; /* heh */
}
else
{
hue = h * 6.0;
saturation = s;
value = v;
if (hue == 6.0)
hue = 0.0;
f = hue - (int) hue;
p = value * (1.0 - saturation);
q = value * (1.0 - saturation * f);
t = value * (1.0 - saturation * (1.0 - f));
switch ((int) hue)
{
case 0:
h = value;
s = t;
v = p;
break;
case 1:
h = q;
s = value;
v = p;
break;
case 2:
h = p;
s = value;
v = t;
break;
case 3:
h = p;
s = q;
v = value;
break;
case 4:
h = t;
s = p;
v = value;
break;
case 5:
h = value;
s = p;
v = q;
break;
}
}
rgb[0] = h*65535;
rgb[1] = s*65535;
rgb[2] = v*65535;
}
/*
* 'gray_to_gray()' - Convert grayscale image data to grayscale (brightness
* adjusted).
@ -1234,7 +1383,14 @@ gray_to_gray(unsigned char *grayin, /* I - RGB pixels */
while (width > 0)
{
*grayout = lut->composite[*grayin];
if (vars->density != 1.0)
{
float t = ((float) *grayout) / 65536.0;
t = (1.0 + ((t - 1.0) * vars->density));
if (t < 0.0)
t = 0.0;
*grayout = (unsigned short) (t * 65536.0);
}
grayin ++;
grayout ++;
width --;
@ -1248,8 +1404,15 @@ gray_to_gray(unsigned char *grayin, /* I - RGB pixels */
while (width > 0)
{
*grayout = lut->composite[grayin[0] * grayin[1] / 255] + 255 - grayin[1];
*grayout = lut->composite[grayin[0] * grayin[1] / 255 + 255 - grayin[1]];
if (vars->density != 1.0)
{
float t = ((float) *grayout) / 65536.0;
t = (1.0 + ((t - 1.0) * vars->density));
if (t < 0.0)
t = 0.0;
*grayout = (unsigned short) (t * 65536.0);
}
grayin += bpp;
grayout ++;
width --;
@ -1290,6 +1453,14 @@ indexed_to_gray(unsigned char *indexed, /* I - Indexed pixels */
while (width > 0)
{
*gray = lut->composite[gray_cmap[*indexed]];
if (vars->density != 1.0)
{
float t = ((float) *gray) / 65536.0;
t = (1.0 + ((t - 1.0) * vars->density));
if (t < 0.0)
t = 0.0;
*gray = (unsigned short) (t * 65536.0);
}
indexed ++;
gray ++;
width --;
@ -1305,6 +1476,14 @@ indexed_to_gray(unsigned char *indexed, /* I - Indexed pixels */
{
*gray = lut->composite[gray_cmap[indexed[0] * indexed[1] / 255] +
255 - indexed[1]];
if (vars->density != 1.0)
{
float t = ((float) *gray) / 65536.0;
t = (1.0 + ((t - 1.0) * vars->density));
if (t < 0.0)
t = 0.0;
*gray = (unsigned short) (t * 65536.0);
}
indexed += bpp;
gray ++;
width --;
@ -1331,22 +1510,28 @@ indexed_to_rgb(unsigned char *indexed, /* I - Indexed pixels */
while (width > 0)
{
double h, s, v;
rgb[0] = lut->red[cmap[*indexed * 3 + 0]];
rgb[1] = lut->green[cmap[*indexed * 3 + 1]];
rgb[2] = lut->blue[cmap[*indexed * 3 + 2]];
if (vars->saturation != 1.0)
{
double h, s, v;
unsigned char rgb1[3];
rgb1[0] = rgb[0];
rgb1[1] = rgb[1];
rgb1[2] = rgb[2];
gimp_rgb_to_hsv4 (rgb1, &h, &s, &v);
calc_rgb_to_hsv(rgb, &h, &s, &v);
s = pow(s, 1.0 / vars->saturation);
gimp_hsv_to_rgb4 (rgb1, h, s, v);
rgb[0] = rgb1[0];
rgb[1] = rgb1[1];
rgb[2] = rgb1[2];
calc_hsv_to_rgb(rgb, h, s, v);
}
if (vars->density != 1.0)
{
float t;
int i;
for (i = 0; i < 3; i++)
{
t = ((float) rgb[i]) / 65536.0;
t = (1.0 + ((t - 1.0) * vars->density));
if (t < 0.0)
t = 0.0;
rgb[i] = (unsigned short) (t * 65536.0);
}
}
rgb += 3;
indexed ++;
@ -1361,6 +1546,7 @@ indexed_to_rgb(unsigned char *indexed, /* I - Indexed pixels */
while (width > 0)
{
double h, s, v;
rgb[0] = lut->red[cmap[indexed[0] * 3 + 0] * indexed[1] / 255 +
255 - indexed[1]];
rgb[1] = lut->green[cmap[indexed[0] * 3 + 1] * indexed[1] / 255 +
@ -1369,17 +1555,22 @@ indexed_to_rgb(unsigned char *indexed, /* I - Indexed pixels */
255 - indexed[1]];
if (vars->saturation != 1.0)
{
double h, s, v;
unsigned char rgb1[3];
rgb1[0] = rgb[0];
rgb1[1] = rgb[1];
rgb1[2] = rgb[2];
gimp_rgb_to_hsv4 (rgb1, &h, &s, &v);
calc_rgb_to_hsv(rgb, &h, &s, &v);
s = pow(s, 1.0 / vars->saturation);
gimp_hsv_to_rgb4 (rgb1, h, s, v);
rgb[0] = rgb1[0];
rgb[1] = rgb1[1];
rgb[2] = rgb1[2];
calc_hsv_to_rgb(rgb, h, s, v);
}
if (vars->density != 1.0)
{
float t;
int i;
for (i = 0; i < 3; i++)
{
t = ((float) rgb[i]) / 65536.0;
t = (1.0 + ((t - 1.0) * vars->density));
if (t < 0.0)
t = 0.0;
rgb[i] = (unsigned short) (t * 65536.0);
}
}
rgb += 3;
indexed += bpp;
@ -1431,7 +1622,7 @@ rgb_to_gray(unsigned char *rgb, /* I - RGB pixels */
*gray = lut->composite[((rgb[0] * LUM_RED +
rgb[1] * LUM_GREEN +
rgb[2] * LUM_BLUE) *
rgb[3] / 25500 + 255 - rgb[3])];
rgb[3] / 255 + 255 - rgb[3])];
gray ++;
rgb += bpp;
width --;
@ -1461,17 +1652,13 @@ rgb_to_rgb(unsigned char *rgbin, /* I - RGB pixels */
while (width > 0)
{
double h, s, v;
rgbout[0] = lut->red[rgbin[0]];
rgbout[1] = lut->green[rgbin[1]];
rgbout[2] = lut->blue[rgbin[2]];
if (vars->saturation != 1.0 || vars->contrast != 100)
{
double h, s, v;
unsigned char rgb1[3];
rgb1[0] = rgbout[0];
rgb1[1] = rgbout[1];
rgb1[2] = rgbout[2];
gimp_rgb_to_hsv4 (rgb1, &h, &s, &v);
calc_rgb_to_hsv(rgbout, &h, &s, &v);
if (vars->saturation != 1.0)
s = pow(s, 1.0 / vars->saturation);
#if 0
@ -1485,10 +1672,7 @@ rgb_to_rgb(unsigned char *rgbin, /* I - RGB pixels */
v = (tv / 2.0) + .5;
}
#endif
gimp_hsv_to_rgb4 (rgb1, h, s, v);
rgbout[0] = rgb1[0];
rgbout[1] = rgb1[1];
rgbout[2] = rgb1[2];
calc_hsv_to_rgb(rgbout, h, s, v);
}
if (vars->density != 1.0)
{
@ -1516,18 +1700,13 @@ rgb_to_rgb(unsigned char *rgbin, /* I - RGB pixels */
while (width > 0)
{
double h, s, v;
rgbout[0] = lut->red[rgbin[0] * rgbin[3] / 255 + 255 - rgbin[3]];
rgbout[1] = lut->green[rgbin[1] * rgbin[3] / 255 + 255 - rgbin[3]];
rgbout[2] = lut->blue[rgbin[2] * rgbin[3] / 255 + 255 - rgbin[3]];
if (vars->saturation != 1.0 || vars->contrast != 100 ||
vars->density != 1.0)
if (vars->saturation != 1.0 || vars->contrast != 100)
{
double h, s, v;
unsigned char rgb1[3];
rgb1[0] = rgbout[0];
rgb1[1] = rgbout[1];
rgb1[2] = rgbout[2];
gimp_rgb_to_hsv4 (rgb1, &h, &s, &v);
calc_rgb_to_hsv(rgbout, &h, &s, &v);
if (vars->saturation != 1.0)
s = pow(s, 1.0 / vars->saturation);
#if 0
@ -1541,10 +1720,7 @@ rgb_to_rgb(unsigned char *rgbin, /* I - RGB pixels */
v = (tv / 2.0) + .5;
}
#endif
gimp_hsv_to_rgb4 (rgb1, h, s, v);
rgbout[0] = rgb1[0];
rgbout[1] = rgb1[1];
rgbout[2] = rgb1[2];
calc_hsv_to_rgb(rgbout, h, s, v);
}
if (vars->density != 1.0)
{
@ -1779,433 +1955,6 @@ default_media_size(int model, /* I - Printer model */
}
}
#ifdef LEFTOVER_8_BIT
/*
* Everything here and below goes away when this is tested on all printers.
*/
#define LEVEL_3 255
#define LEVEL_2 213
#define LEVEL_1 127
#define LEVEL_0 0
void
dither_black4(unsigned char *gray, /* I - Grayscale pixels */
int row, /* I - Current Y coordinate */
int src_width, /* I - Width of input row */
int dst_width, /* I - Width of output rows */
unsigned char *black) /* O - Black bitmap pixels */
{
int x, /* Current X coordinate */
xerror, /* X error count */
xstep, /* X step */
xmod, /* X error modulus */
length; /* Length of output bitmap in bytes */
unsigned char bit, /* Current bit */
*kptr; /* Current black pixel */
int k, /* Current black value */
ditherk, /* Next error value in buffer */
*kerror0, /* Pointer to current error row */
*kerror1; /* Pointer to next error row */
int ditherbit; /* Random dither bitmask */
xstep = src_width / dst_width;
xmod = src_width % dst_width;
length = (dst_width + 7) / 8;
kerror0 = error[row & 1][3];
kerror1 = error[1 - (row & 1)][3];
memset(black, 0, length * 2);
for (x = 0, bit = 128, kptr = black, xerror = 0, ditherbit = rand(),
ditherk = kerror0[0];
x < dst_width;
x ++, kerror0 ++, kerror1 ++)
{
k = 255 - *gray + ditherk / 8;
if (k > ((LEVEL_2 + LEVEL_3) / 2))
{
kptr[0] |= bit;
kptr[length] |= bit;
k -= LEVEL_3;
}
else if (k > ((LEVEL_1 + LEVEL_2) / 2))
{
kptr[length] |= bit;
k -= LEVEL_2;
}
else if (k > ((LEVEL_0 + LEVEL_1) / 2))
{
kptr[0] |= bit;
k -= LEVEL_1;
}
if (ditherbit & bit)
{
kerror1[0] = 5 * k;
ditherk = kerror0[1] + 3 * k;
}
else
{
kerror1[0] = 3 * k;
ditherk = kerror0[1] + 5 * k;
}
if (bit == 1)
{
kptr ++;
bit = 128;
ditherbit = rand();
}
else
bit >>= 1;
gray += xstep;
xerror += xmod;
if (xerror >= dst_width)
{
xerror -= dst_width;
gray ++;
}
}
}
void
dither_cmyk4(unsigned char *rgb, /* I - RGB pixels */
int row, /* I - Current Y coordinate */
int src_width, /* I - Width of input row */
int dst_width, /* I - Width of output rows */
unsigned char *cyan, /* O - Cyan bitmap pixels */
unsigned char *magenta, /* O - Magenta bitmap pixels */
unsigned char *yellow, /* O - Yellow bitmap pixels */
unsigned char *black) /* O - Black bitmap pixels */
{
int x, /* Current X coordinate */
xerror, /* X error count */
xstep, /* X step */
xmod, /* X error modulus */
length; /* Length of output bitmap in bytes */
int c, m, y, k, /* CMYK values */
divk, /* Inverse of K */
diff; /* Average color difference */
unsigned char bit, /* Current bit */
*cptr, /* Current cyan pixel */
*mptr, /* Current magenta pixel */
*yptr, /* Current yellow pixel */
*kptr; /* Current black pixel */
int ditherc, /* Next error value in buffer */
*cerror0, /* Pointer to current error row */
*cerror1; /* Pointer to next error row */
int dithery, /* Next error value in buffer */
*yerror0, /* Pointer to current error row */
*yerror1; /* Pointer to next error row */
int ditherm, /* Next error value in buffer */
*merror0, /* Pointer to current error row */
*merror1; /* Pointer to next error row */
int ditherk, /* Next error value in buffer */
*kerror0, /* Pointer to current error row */
*kerror1; /* Pointer to next error row */
int ditherbit; /* Random dither bitmask */
xstep = 3 * (src_width / dst_width);
xmod = src_width % dst_width;
length = (dst_width + 7) / 8;
cerror0 = error[row & 1][0];
cerror1 = error[1 - (row & 1)][0];
merror0 = error[row & 1][1];
merror1 = error[1 - (row & 1)][1];
yerror0 = error[row & 1][2];
yerror1 = error[1 - (row & 1)][2];
kerror0 = error[row & 1][3];
kerror1 = error[1 - (row & 1)][3];
memset(cyan, 0, length * 2);
memset(magenta, 0, length * 2);
memset(yellow, 0, length * 2);
memset(black, 0, length * 2);
for (x = 0, bit = 128, cptr = cyan, mptr = magenta, yptr = yellow,
kptr = black, xerror = 0, ditherbit = rand(), ditherc = cerror0[0],
ditherm = merror0[0], dithery = yerror0[0], ditherk = kerror0[0];
x < dst_width;
x ++, cerror0 ++, cerror1 ++, merror0 ++, merror1 ++, yerror0 ++,
yerror1 ++, kerror0 ++, kerror1 ++)
{
/*
* First compute the standard CMYK separation color values...
*/
c = 255 - rgb[0];
m = 255 - rgb[1];
y = 255 - rgb[2];
k = MIN(c, MIN(m, y));
/*
* Since we're printing black, adjust the black level based upon
* the amount of color in the pixel (colorful pixels get less black)...
*/
diff = 255 - (abs(c - m) + abs(c - y) + abs(m - y)) / 3;
diff = diff * diff * diff / 65025; /* diff = diff^3 */
k = diff * k / 255;
divk = 255 - k;
if (divk == 0)
c = m = y = 0; /* Grayscale */
else
{
/*
* Full color; update the CMY values for the black value and reduce
* CMY as necessary to give better blues, greens, and reds... :)
*/
c = (255 - rgb[1] / 4) * (c - k) / divk;
m = (255 - rgb[2] / 4) * (m - k) / divk;
y = (255 - rgb[0] / 4) * (y - k) / divk;
}
k += ditherk / 8;
if (k > ((LEVEL_2 + LEVEL_3) / 2))
{
kptr[0] |= bit;
kptr[length] |= bit;
k -= LEVEL_3;
}
else if (k > ((LEVEL_1 + LEVEL_2) / 2))
{
kptr[length] |= bit;
k -= LEVEL_2;
}
else if (k > ((LEVEL_0 + LEVEL_1) / 2))
{
kptr[0] |= bit;
k -= LEVEL_1;
}
if (ditherbit & bit)
{
kerror1[0] = 5 * k;
ditherk = kerror0[1] + 3 * k;
}
else
{
kerror1[0] = 3 * k;
ditherk = kerror0[1] + 5 * k;
}
c += ditherc / 8;
if (c > ((LEVEL_2 + LEVEL_3) / 2))
{
cptr[0] |= bit;
cptr[length] |= bit;
c -= LEVEL_3;
}
else if (c > ((LEVEL_1 + LEVEL_2) / 2))
{
cptr[length] |= bit;
c -= LEVEL_2;
}
else if (c > ((LEVEL_0 + LEVEL_1) / 2))
{
cptr[0] |= bit;
c -= LEVEL_1;
}
if (ditherbit & bit)
{
cerror1[0] = 5 * c;
ditherc = cerror0[1] + 3 * c;
}
else
{
cerror1[0] = 3 * c;
ditherc = cerror0[1] + 5 * c;
}
m += ditherm / 8;
if (m > ((LEVEL_2 + LEVEL_3) / 2))
{
mptr[0] |= bit;
mptr[length] |= bit;
m -= LEVEL_3;
}
else if (m > ((LEVEL_1 + LEVEL_2) / 2))
{
mptr[length] |= bit;
m -= LEVEL_2;
}
else if (m > ((LEVEL_0 + LEVEL_1) / 2))
{
mptr[0] |= bit;
m -= LEVEL_1;
}
if (ditherbit & bit)
{
merror1[0] = 5 * m;
ditherm = merror0[1] + 3 * m;
}
else
{
merror1[0] = 3 * m;
ditherm = merror0[1] + 5 * m;
}
y += dithery / 8;
if (y > ((LEVEL_2 + LEVEL_3) / 2))
{
yptr[0] |= bit;
yptr[length] |= bit;
y -= LEVEL_3;
}
else if (y > ((LEVEL_1 + LEVEL_2) / 2))
{
yptr[length] |= bit;
y -= LEVEL_2;
}
else if (y > ((LEVEL_0 + LEVEL_1) / 2))
{
yptr[0] |= bit;
y -= LEVEL_1;
}
if (ditherbit & bit)
{
yerror1[0] = 5 * y;
dithery = yerror0[1] + 3 * y;
}
else
{
yerror1[0] = 3 * y;
dithery = yerror0[1] + 5 * y;
}
if (bit == 1)
{
cptr ++;
mptr ++;
yptr ++;
kptr ++;
bit = 128;
ditherbit = rand();
}
else
bit >>= 1;
rgb += xstep;
xerror += xmod;
if (xerror >= dst_width)
{
xerror -= dst_width;
rgb += 3;
}
}
}
void
gray_to_gray(unsigned char *grayin, /* I - RGB pixels */
unsigned char *grayout, /* O - RGB pixels */
int width, /* I - Width of row */
int bpp, /* I - Bytes-per-pixel in grayin */
unsigned char *cmap, /* I - Colormap (unused) */
float saturation /* I - Saturation */
)
{
if (bpp == 1)
{
/*
* No alpha in image...
*/
while (width > 0)
{
*grayout = lut->composite[*grayin];
grayin ++;
grayout ++;
width --;
}
}
else
{
/*
* Handle alpha in image...
*/
while (width > 0)
{
*grayout = lut->composite[grayin[0] * grayin[1] / 255] + 255 - grayin[1];
grayin += bpp;
grayout ++;
width --;
}
}
}
void
indexed_to_gray(unsigned char *indexed, /* I - Indexed pixels */
unsigned char *gray, /* O - Grayscale pixels */
int width, /* I - Width of row */
int bpp, /* I - Bytes/pix in indexed */
unsigned char *cmap, /* I - Colormap */
float saturation /* I - Saturation */
)
{
int i; /* Looping var */
unsigned char gray_cmap[256]; /* Grayscale colormap */
for (i = 0; i < 256; i ++, cmap += 3)
gray_cmap[i] = (cmap[0] * LUM_RED +
cmap[1] * LUM_GREEN +
cmap[2] * LUM_BLUE) / 100;
if (bpp == 1)
{
/*
* No alpha in image...
*/
while (width > 0)
{
*gray = lut->composite[gray_cmap[*indexed]];
indexed ++;
gray ++;
width --;
}
}
else
{
/*
* Handle alpha in image...
*/
while (width > 0)
{
*gray = lut->composite[gray_cmap[indexed[0] * indexed[1] / 255] +
255 - indexed[1]];
indexed += bpp;
gray ++;
width --;
}
}
}
#endif
/*
* End of "$Id$".
*/

View File

@ -59,7 +59,7 @@
#include <libgimp/gimpui.h>
#include <libgimp/stdplugins-intl.h>
#define PLUG_IN_VERSION "3.0.6 - 11 Feb 2000"
#define PLUG_IN_VERSION "3.0.9 - 23 Feb 2000"
#define PLUG_IN_NAME "Print"
@ -69,7 +69,7 @@
#define SCALE_WIDTH 64
#define ENTRY_WIDTH 64
#define PREVIEW_SIZE 220 /* Assuming max media size of 22" */
#define PREVIEW_SIZE 240 /* Assuming max media size of 24" */
#define MAX_PLIST 100
@ -124,7 +124,9 @@ static void resolution_callback(GtkWidget *, gint);
static void output_type_callback(GtkWidget *, gint);
static void linear_callback(GtkWidget *, gint);
static void orientation_callback(GtkWidget *, gint);
static void printandsave_callback(void);
static void print_callback(void);
static void save_callback(void);
static void cancel_callback(void);
static void close_callback(void);
@ -142,7 +144,8 @@ static void file_cancel_callback(void);
static void preview_update(void);
static void preview_button_callback(GtkWidget *, GdkEventButton *);
static void preview_motion_callback(GtkWidget *, GdkEventMotion *);
static void top_callback(GtkWidget *);
static void left_callback(GtkWidget *);
/*
* Globals...
@ -240,7 +243,7 @@ printer_t printers[] = /* List of supported printer types */
escp2_parameters, default_media_size, escp2_imageable_area, escp2_print },
{ N_("EPSON Stylus Photo EX"), "escp2-ex", 1, 7, 0.585, 0.646,
escp2_parameters, default_media_size, escp2_imageable_area, escp2_print },
{ N_("EPSON Stylus Photo EX"), "escp2-photo", 1, 8, 0.585, 0.646,
{ N_("EPSON Stylus Photo"), "escp2-photo", 1, 8, 0.585, 0.646,
escp2_parameters, default_media_size, escp2_imageable_area, escp2_print },
};
@ -257,6 +260,7 @@ GtkWidget *print_dialog, /* Print dialog window */
*scaling_entry, /* Text entry widget for scaling */
*scaling_percent, /* Scale by percent */
*scaling_ppi, /* Scale by pixels-per-inch */
*scaling_image, /* Scale to the image */
*brightness_scale, /* Scale for brightness */
*brightness_entry, /* Text entry widget for brightness */
*saturation_scale, /* Scale for saturation */
@ -283,7 +287,12 @@ GtkWidget *print_dialog, /* Print dialog window */
*ppd_button, /* PPD file browse button */
*output_cmd, /* Output command text entry */
*ppd_browser, /* File selection dialog for PPD files */
*file_browser; /* FSD for print files */
*file_browser, /* FSD for print files */
*left_entry,
*right_entry,
*top_entry,
*bottom_entry,
*printandsave_button;
GtkObject *scaling_adjustment, /* Adjustment object for scaling */
*brightness_adjustment, /* Adjustment object for brightness */
@ -320,8 +329,10 @@ int plist_current = 0, /* Current system printer */
plist_count = 0; /* Number of system printers */
plist_t plist[MAX_PLIST]; /* System printers */
int saveme = FALSE; /* True if print should proceed */
int runme = FALSE, /* True if print should proceed */
current_printer = 0; /* Current printer index */
gint32 image_ID; /* image ID */
/*
* 'main()' - Main entry - just call gimp_main()...
@ -365,10 +376,10 @@ query(void)
{ PARAM_INT32, "left", "Left offset (points, -1 = centered)" },
{ PARAM_INT32, "top", "Top offset (points, -1 = centered)" },
{ PARAM_FLOAT, "gamma", "Output gamma (0.1 - 3.0)" },
{ PARAM_INT32, "contrast", "Top offset (points, -1 = centered)" },
{ PARAM_INT32, "red", "Top offset (points, -1 = centered)" },
{ PARAM_INT32, "green", "Top offset (points, -1 = centered)" },
{ PARAM_INT32, "blue", "Top offset (points, -1 = centered)" },
{ PARAM_INT32, "contrast", "Contrast" },
{ PARAM_INT32, "red", "Red level" },
{ PARAM_INT32, "green", "Green level" },
{ PARAM_INT32, "blue", "Blue level" },
{ PARAM_INT32, "linear", "Linear output (0 = normal, 1 = linear)" },
{ PARAM_FLOAT, "saturation", "Saturation (0-1000%)" },
{ PARAM_FLOAT, "density", "Density (0-200%)" },
@ -379,10 +390,10 @@ query(void)
gimp_install_procedure(
"file_print",
"This plug-in prints images from The GIMP.",
"Prints images to PostScript, PCL, or ESC/P2 printers.",
_("This plug-in prints images from The GIMP."),
_("Prints images to PostScript, PCL, or ESC/P2 printers."),
"Michael Sweet <mike@easysw.com> and Robert Krawitz <rlk@alum.mit.edu>",
"Copyright 1997-1999 by Michael Sweet and Robert Krawitz",
"Copyright 1997-2000 by Michael Sweet and Robert Krawitz",
PLUG_IN_VERSION,
N_("<Image>/File/Print..."),
"RGB*,GRAY*,INDEXED*",
@ -438,7 +449,6 @@ run(char *name, /* I - Name of print program. */
#ifdef __EMX__
char *tmpfile; /* temp filename */
#endif
gint32 image_ID; /* image ID */
gint32 drawable_ID; /* drawable ID */
GimpExportReturnType export = EXPORT_CANCEL; /* return value of gimp_export_image() */
@ -801,7 +811,7 @@ do_print_dialog(void)
* Top-level table for dialog...
*/
table = gtk_table_new(17, 4, FALSE);
table = gtk_table_new(20, 4, FALSE);
gtk_container_border_width(GTK_CONTAINER(table), 6);
gtk_table_set_col_spacings(GTK_TABLE(table), 4);
gtk_table_set_row_spacings(GTK_TABLE(table), 8);
@ -833,6 +843,71 @@ do_print_dialog(void)
gtk_widget_set_events((GtkWidget *)preview,
GDK_EXPOSURE_MASK | GDK_BUTTON_MOTION_MASK |
GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK);
label = gtk_label_new(_("Left:"));
gtk_misc_set_alignment(GTK_MISC(label), 1.0, 0.5);
gtk_table_attach(GTK_TABLE(table), label, 0, 1, 8, 9, GTK_FILL, GTK_FILL, 0, 0);
gtk_widget_show(label);
box = gtk_hbox_new(FALSE, 8);
gtk_table_attach(GTK_TABLE(table), box, 1, 2, 8, 9, GTK_FILL, GTK_FILL, 0, 0);
gtk_widget_show(box);
left_entry = entry = gtk_entry_new();
sprintf(s, "%.3f", fabs(vars.left));
gtk_entry_set_text(GTK_ENTRY(entry), s);
gtk_signal_connect(GTK_OBJECT(entry), "activate",
(GtkSignalFunc)left_callback, NULL);
gtk_box_pack_start(GTK_BOX(box), entry, FALSE, FALSE, 0);
gtk_widget_set_usize(entry, 60, 0);
gtk_widget_show(entry);
label = gtk_label_new(_("Top:"));
gtk_misc_set_alignment(GTK_MISC(label), 1.0, 0.5);
gtk_table_attach(GTK_TABLE(table), label, 2, 3, 8, 9, GTK_FILL, GTK_FILL, 0, 0);
gtk_widget_show(label);
box = gtk_hbox_new(FALSE, 8);
gtk_table_attach(GTK_TABLE(table), box, 3, 4, 8, 9, GTK_FILL, GTK_FILL, 0, 0);
gtk_widget_show(box);
top_entry = entry = gtk_entry_new();
sprintf(s, "%.3f", fabs(vars.top));
gtk_entry_set_text(GTK_ENTRY(entry), s);
gtk_signal_connect(GTK_OBJECT(entry), "activate",
(GtkSignalFunc)top_callback, NULL);
gtk_box_pack_start(GTK_BOX(box), entry, FALSE, FALSE, 0);
gtk_widget_set_usize(entry, 60, 0);
gtk_widget_show(entry);
label = gtk_label_new(_("Right:"));
gtk_misc_set_alignment(GTK_MISC(label), 1.0, 0.5);
gtk_table_attach(GTK_TABLE(table), label, 0, 1, 9, 10, GTK_FILL, GTK_FILL, 0, 0);
gtk_widget_show(label);
box = gtk_hbox_new(FALSE, 8);
gtk_table_attach(GTK_TABLE(table), box, 1, 2, 9, 10, GTK_FILL, GTK_FILL, 0, 0);
gtk_widget_show(box);
right_entry = entry = gtk_entry_new();
sprintf(s, "%.3f", fabs(vars.left));
gtk_entry_set_text(GTK_ENTRY(entry), s);
gtk_entry_set_editable(GTK_ENTRY(entry), FALSE);
gtk_box_pack_start(GTK_BOX(box), entry, FALSE, FALSE, 0);
gtk_widget_set_usize(entry, 60, 0);
gtk_widget_show(entry);
label = gtk_label_new(_("Bottom:"));
gtk_misc_set_alignment(GTK_MISC(label), 1.0, 0.5);
gtk_table_attach(GTK_TABLE(table), label, 2, 3, 9, 10, GTK_FILL, GTK_FILL, 0, 0);
gtk_widget_show(label);
box = gtk_hbox_new(FALSE, 8);
gtk_table_attach(GTK_TABLE(table), box, 3, 4, 9, 10, GTK_FILL, GTK_FILL, 0, 0);
gtk_widget_show(box);
bottom_entry = entry = gtk_entry_new();
sprintf(s, "%.3f", fabs(vars.left));
gtk_entry_set_text(GTK_ENTRY(entry), s);
gtk_entry_set_editable(GTK_ENTRY(entry), FALSE);
gtk_box_pack_start(GTK_BOX(box), entry, FALSE, FALSE, 0);
gtk_widget_set_usize(entry, 60, 0);
gtk_widget_show(entry);
/*
* Media size option menu...
@ -934,11 +1009,11 @@ do_print_dialog(void)
label = gtk_label_new(_("Output Type:"));
gtk_misc_set_alignment(GTK_MISC(label), 1.0, 0.5);
gtk_table_attach(GTK_TABLE(table), label, 2, 3, 6, 7, GTK_FILL, GTK_FILL, 0, 0);
gtk_table_attach(GTK_TABLE(table), label, 2, 3, 7, 8, GTK_FILL, GTK_FILL, 0, 0);
gtk_widget_show(label);
box = gtk_hbox_new(FALSE, 8);
gtk_table_attach(GTK_TABLE(table), box, 3, 4, 6, 7, GTK_FILL, GTK_FILL, 0, 0);
gtk_table_attach(GTK_TABLE(table), box, 3, 4, 7, 8, GTK_FILL, GTK_FILL, 0, 0);
gtk_widget_show(box);
output_gray = button = gtk_radio_button_new_with_label(NULL, _("B&W"));
@ -960,13 +1035,13 @@ do_print_dialog(void)
gtk_box_pack_start(GTK_BOX(box), button, FALSE, FALSE, 0);
gtk_widget_show(button);
label = gtk_label_new(_("Density:"));
label = gtk_label_new(_("Output Level:"));
gtk_misc_set_alignment(GTK_MISC(label), 1.0, 0.5);
gtk_table_attach(GTK_TABLE(table), label, 2, 3, 7, 8, GTK_FILL, GTK_FILL, 0, 0);
gtk_table_attach(GTK_TABLE(table), label, 2, 3, 10, 11, GTK_FILL, GTK_FILL, 0, 0);
gtk_widget_show(label);
box = gtk_hbox_new(FALSE, 8);
gtk_table_attach(GTK_TABLE(table), box, 3, 4, 7, 8, GTK_FILL, GTK_FILL, 0, 0);
gtk_table_attach(GTK_TABLE(table), box, 3, 4, 10, 11, GTK_FILL, GTK_FILL, 0, 0);
gtk_widget_show(box);
linear_off = button = gtk_radio_button_new_with_label(NULL, _("Normal scale"));
@ -994,16 +1069,16 @@ do_print_dialog(void)
label = gtk_label_new(_("Scaling:"));
gtk_misc_set_alignment(GTK_MISC(label), 1.0, 0.5);
gtk_table_attach(GTK_TABLE(table), label, 0, 1, 8, 9, GTK_FILL, GTK_FILL, 0, 0);
gtk_table_attach(GTK_TABLE(table), label, 0, 1, 11, 12, GTK_FILL, GTK_FILL, 0, 0);
gtk_widget_show(label);
box = gtk_hbox_new(FALSE, 8);
gtk_table_attach(GTK_TABLE(table), box, 1, 4, 8, 9, GTK_FILL, GTK_FILL, 0, 0);
gtk_table_attach(GTK_TABLE(table), box, 1, 4, 11, 12, GTK_FILL, GTK_FILL, 0, 0);
gtk_widget_show(box);
if (vars.scaling < 0.0)
scaling_adjustment = scale_data =
gtk_adjustment_new(-vars.scaling, 50.0, 1201.0, 1.0, 1.0, 1.0);
gtk_adjustment_new(-vars.scaling, 36.0, 1201.0, 1.0, 1.0, 1.0);
else
scaling_adjustment = scale_data =
gtk_adjustment_new(vars.scaling, 5.0, 101.0, 1.0, 1.0, 1.0);
@ -1044,17 +1119,24 @@ do_print_dialog(void)
gtk_box_pack_start(GTK_BOX(box), button, FALSE, FALSE, 0);
gtk_widget_show(button);
scaling_image = button = gtk_toggle_button_new_with_label(_("Set Image Scale"));
gtk_signal_connect(GTK_OBJECT(button), "clicked",
(GtkSignalFunc)scaling_callback, NULL);
gtk_box_pack_start(GTK_BOX(box), button, FALSE, FALSE, 0);
gtk_widget_show(button);
/*
* Brightness slider...
*/
label = gtk_label_new(_("Brightness:"));
gtk_misc_set_alignment(GTK_MISC(label), 1.0, 0.5);
gtk_table_attach(GTK_TABLE(table), label, 0, 1, 9, 10, GTK_FILL, GTK_FILL, 0, 0);
gtk_table_attach(GTK_TABLE(table), label, 0, 1, 12, 13, GTK_FILL, GTK_FILL, 0, 0);
gtk_widget_show(label);
box = gtk_hbox_new(FALSE, 8);
gtk_table_attach(GTK_TABLE(table), box, 1, 4, 9, 10, GTK_FILL, GTK_FILL, 0, 0);
gtk_table_attach(GTK_TABLE(table), box, 1, 4, 12, 13, GTK_FILL, GTK_FILL, 0, 0);
gtk_widget_show(box);
brightness_adjustment = scale_data =
@ -1085,11 +1167,11 @@ do_print_dialog(void)
label = gtk_label_new(_("Gamma:"));
gtk_misc_set_alignment(GTK_MISC(label), 1.0, 0.5);
gtk_table_attach(GTK_TABLE(table), label, 0, 1, 10, 11, GTK_FILL, GTK_FILL, 0, 0);
gtk_table_attach(GTK_TABLE(table), label, 0, 1, 13, 14, GTK_FILL, GTK_FILL, 0, 0);
gtk_widget_show(label);
box = gtk_hbox_new(FALSE, 8);
gtk_table_attach(GTK_TABLE(table), box, 1, 4, 10, 11, GTK_FILL, GTK_FILL, 0, 0);
gtk_table_attach(GTK_TABLE(table), box, 1, 4, 13, 14, GTK_FILL, GTK_FILL, 0, 0);
gtk_widget_show(box);
gamma_adjustment = scale_data =
@ -1128,10 +1210,10 @@ do_print_dialog(void)
label = gtk_label_new(_("Contrast:"));
gtk_misc_set_alignment(GTK_MISC(label), 1.0, 0.5);
gtk_table_attach(GTK_TABLE(table), label, 0, 1, 11, 12, GTK_FILL, GTK_FILL, 0, 0);
gtk_table_attach(GTK_TABLE(table), label, 0, 1, 14, 15, GTK_FILL, GTK_FILL, 0, 0);
gtk_widget_show(label);
box = gtk_hbox_new(FALSE, 8);
gtk_table_attach(GTK_TABLE(table), box, 1, 4, 11, 12, GTK_FILL, GTK_FILL, 0, 0);
gtk_table_attach(GTK_TABLE(table), box, 1, 4, 14, 15, GTK_FILL, GTK_FILL, 0, 0);
gtk_widget_show(box);
contrast_adjustment = scale_data =
@ -1162,11 +1244,11 @@ do_print_dialog(void)
label = gtk_label_new(_("Red:"));
gtk_misc_set_alignment(GTK_MISC(label), 1.0, 0.5);
gtk_table_attach(GTK_TABLE(table), label, 0, 1, 12, 13, GTK_FILL, GTK_FILL, 0, 0);
gtk_table_attach(GTK_TABLE(table), label, 0, 1, 15, 16, GTK_FILL, GTK_FILL, 0, 0);
gtk_widget_show(label);
box = gtk_hbox_new(FALSE, 8);
gtk_table_attach(GTK_TABLE(table), box, 1, 4, 12, 13, GTK_FILL, GTK_FILL, 0, 0);
gtk_table_attach(GTK_TABLE(table), box, 1, 4, 15, 16, GTK_FILL, GTK_FILL, 0, 0);
gtk_widget_show(box);
red_adjustment = scale_data =
@ -1197,11 +1279,11 @@ do_print_dialog(void)
label = gtk_label_new(_("Green:"));
gtk_misc_set_alignment(GTK_MISC(label), 1.0, 0.5);
gtk_table_attach(GTK_TABLE(table), label, 0, 1, 13, 14, GTK_FILL, GTK_FILL, 0, 0);
gtk_table_attach(GTK_TABLE(table), label, 0, 1, 16, 17, GTK_FILL, GTK_FILL, 0, 0);
gtk_widget_show(label);
box = gtk_hbox_new(FALSE, 8);
gtk_table_attach(GTK_TABLE(table), box, 1, 4, 13, 14, GTK_FILL, GTK_FILL, 0, 0);
gtk_table_attach(GTK_TABLE(table), box, 1, 4, 16, 17, GTK_FILL, GTK_FILL, 0, 0);
gtk_widget_show(box);
green_adjustment = scale_data =
@ -1232,11 +1314,11 @@ do_print_dialog(void)
label = gtk_label_new(_("Blue:"));
gtk_misc_set_alignment(GTK_MISC(label), 1.0, 0.5);
gtk_table_attach(GTK_TABLE(table), label, 0, 1, 14, 15, GTK_FILL, GTK_FILL, 0, 0);
gtk_table_attach(GTK_TABLE(table), label, 0, 1, 17, 18, GTK_FILL, GTK_FILL, 0, 0);
gtk_widget_show(label);
box = gtk_hbox_new(FALSE, 8);
gtk_table_attach(GTK_TABLE(table), box, 1, 4, 14, 15, GTK_FILL, GTK_FILL, 0, 0);
gtk_table_attach(GTK_TABLE(table), box, 1, 4, 17, 18, GTK_FILL, GTK_FILL, 0, 0);
gtk_widget_show(box);
blue_adjustment = scale_data =
@ -1267,15 +1349,15 @@ do_print_dialog(void)
label = gtk_label_new(_("Saturation:"));
gtk_misc_set_alignment(GTK_MISC(label), 1.0, 0.5);
gtk_table_attach(GTK_TABLE(table), label, 0, 1, 15, 16, GTK_FILL, GTK_FILL, 0, 0);
gtk_table_attach(GTK_TABLE(table), label, 0, 1, 18, 19, GTK_FILL, GTK_FILL, 0, 0);
gtk_widget_show(label);
box = gtk_hbox_new(FALSE, 8);
gtk_table_attach(GTK_TABLE(table), box, 1, 4, 15, 16, GTK_FILL, GTK_FILL, 0, 0);
gtk_table_attach(GTK_TABLE(table), box, 1, 4, 18, 19, GTK_FILL, GTK_FILL, 0, 0);
gtk_widget_show(box);
saturation_adjustment = scale_data =
gtk_adjustment_new((float)vars.saturation, 0.1, 10.0, 0.001, 0.01, 1.0);
gtk_adjustment_new((float)vars.saturation, 0.001, 10.0, 0.001, 0.01, 1.0);
gtk_signal_connect(GTK_OBJECT(scale_data), "value_changed",
(GtkSignalFunc)saturation_update, NULL);
@ -1302,11 +1384,11 @@ do_print_dialog(void)
label = gtk_label_new(_("Density:"));
gtk_misc_set_alignment(GTK_MISC(label), 1.0, 0.5);
gtk_table_attach(GTK_TABLE(table), label, 0, 1, 16, 17, GTK_FILL, GTK_FILL, 0, 0);
gtk_table_attach(GTK_TABLE(table), label, 0, 1, 19, 20, GTK_FILL, GTK_FILL, 0, 0);
gtk_widget_show(label);
box = gtk_hbox_new(FALSE, 8);
gtk_table_attach(GTK_TABLE(table), box, 1, 4, 16, 17, GTK_FILL, GTK_FILL, 0, 0);
gtk_table_attach(GTK_TABLE(table), box, 1, 4, 19, 20, GTK_FILL, GTK_FILL, 0, 0);
gtk_widget_show(box);
density_adjustment = scale_data =
@ -1383,13 +1465,30 @@ do_print_dialog(void)
gtk_box_set_homogeneous(GTK_BOX(GTK_DIALOG(dialog)->action_area), FALSE);
gtk_box_set_spacing(GTK_BOX(GTK_DIALOG(dialog)->action_area), 0);
button = printandsave_button =
gtk_button_new_with_label (_("Print And Save Settings"));
GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
gtk_signal_connect (GTK_OBJECT (button), "clicked",
(GtkSignalFunc) printandsave_callback,
NULL);
gtk_box_pack_start (GTK_BOX (hbbox), button, FALSE, FALSE, 0);
gtk_widget_grab_default (button);
gtk_widget_show (button);
button = gtk_button_new_with_label (_("Print"));
GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
gtk_signal_connect (GTK_OBJECT (button), "clicked",
(GtkSignalFunc) print_callback,
NULL);
gtk_box_pack_start (GTK_BOX (hbbox), button, FALSE, FALSE, 0);
gtk_widget_grab_default (button);
gtk_widget_show (button);
button = gtk_button_new_with_label (_("Save Current Settings"));
GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
gtk_signal_connect (GTK_OBJECT (button), "clicked",
(GtkSignalFunc) save_callback,
NULL);
gtk_box_pack_start (GTK_BOX (hbbox), button, FALSE, FALSE, 0);
gtk_widget_show (button);
button = gtk_button_new_with_label (_("Cancel"));
@ -1546,7 +1645,8 @@ do_print_dialog(void)
* Set printrc options...
*/
printrc_save();
if (saveme)
printrc_save();
/*
* Return ok/cancel...
@ -2005,7 +2105,7 @@ scaling_callback(GtkWidget *widget) /* I - Entry widget */
}
else if (widget == scaling_ppi)
{
GTK_ADJUSTMENT(scaling_adjustment)->lower = 50.0;
GTK_ADJUSTMENT(scaling_adjustment)->lower = 36.0;
GTK_ADJUSTMENT(scaling_adjustment)->upper = 1201.0;
GTK_ADJUSTMENT(scaling_adjustment)->value = 72.0;
vars.scaling = 0.0;
@ -2021,8 +2121,48 @@ scaling_callback(GtkWidget *widget) /* I - Entry widget */
plist[plist_current].v.scaling = vars.scaling;
gtk_signal_emit_by_name(scaling_adjustment, "value_changed");
}
else if (widget == scaling_image)
{
double xres, yres;
gimp_image_get_resolution(image_ID, &xres, &yres);
GTK_ADJUSTMENT(scaling_adjustment)->lower = 36.0;
GTK_ADJUSTMENT(scaling_adjustment)->upper = 1201.0;
GTK_ADJUSTMENT(scaling_adjustment)->value = yres;
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(scaling_ppi), TRUE);
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(scaling_image), FALSE);
vars.scaling = 0.0;
plist[plist_current].v.scaling = vars.scaling;
gtk_signal_emit_by_name(scaling_adjustment, "value_changed");
}
}
static void
top_callback(GtkWidget *widget)
{
gfloat new_value = atof(gtk_entry_get_text(GTK_ENTRY(widget)));
if (vars.top != new_value)
{
vars.top = new_value * 72;
if (vars.top < 0)
vars.top = 0;
plist[plist_current].v.top = vars.top;
preview_update();
}
}
static void
left_callback(GtkWidget *widget)
{
gfloat new_value = atof(gtk_entry_get_text(GTK_ENTRY(widget)));
if (vars.left != new_value)
{
vars.left = new_value * 72;
if (vars.left < 0)
vars.left = 0;
plist[plist_current].v.left = vars.left;
preview_update();
}
}
/*
* 'plist_build_menu()' - Build an option menu for the given parameters...
@ -2109,7 +2249,7 @@ do_misc_updates()
float tmp = -plist[plist_current].v.scaling;
plist[plist_current].v.scaling = -plist[plist_current].v.scaling;
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(scaling_ppi), TRUE);
GTK_ADJUSTMENT(scaling_adjustment)->lower = 50.0;
GTK_ADJUSTMENT(scaling_adjustment)->lower = 36.0;
GTK_ADJUSTMENT(scaling_adjustment)->upper = 1201.0;
sprintf(s, "%.1f", tmp);
GTK_ADJUSTMENT(scaling_adjustment)->value = tmp;
@ -2398,6 +2538,26 @@ print_callback(void)
gtk_widget_show(file_browser);
}
static void
printandsave_callback(void)
{
runme = TRUE;
saveme = TRUE;
if (plist_current > 0)
{
gtk_widget_destroy(print_dialog);
}
else
gtk_widget_show(file_browser);
}
static void
save_callback(void)
{
printrc_save();
gtk_widget_grab_default(printandsave_button);
}
/*
* 'cancel_callback()' - Cancel the print...
*/
@ -2560,6 +2720,7 @@ preview_update(void)
width, length; /* Physical width */
static GdkGC *gc = NULL; /* Graphics context */
printer_t *p; /* Current printer driver */
char s[255];
if (preview->widget.window == NULL)
@ -2575,37 +2736,36 @@ preview_update(void)
(*p->imageable_area)(p->model, vars.ppd_file, vars.media_size, &left, &right,
&bottom, &top);
page_width = 10 * (right - left) / 72;
page_height = 10 * (top - bottom) / 72;
page_width = right - left;
page_height = top - bottom;
(*p->media_size)(p->model, vars.ppd_file, vars.media_size, &width, &length);
width = 10 * width / 72;
length = 10 * length / 72;
if (vars.scaling < 0)
{
tw0 = -image_width * 10 / vars.scaling;
tw0 = 72 * -image_width / vars.scaling;
th0 = tw0 * image_height / image_width;
tw1 = tw0;
th1 = th0;
}
else
{
/* Portrait */
tw0 = page_width * vars.scaling / 100;
th0 = tw0 * image_height / image_width;
if (th0 > page_height)
if (th0 > page_height * vars.scaling / 100)
{
th0 = page_height;
th0 = page_height * vars.scaling / 100;
tw0 = th0 * image_width / image_height;
}
ta0 = tw0 * th0;
/* Landscape */
tw1 = page_height * vars.scaling / 100;
th1 = tw1 * image_height / image_width;
if (th1 > page_width)
if (th1 > page_width * vars.scaling / 100)
{
th1 = page_width;
th1 = page_width * vars.scaling / 100;
tw1 = th1 * image_width / image_height;
}
ta1 = tw1 * th1;
@ -2615,18 +2775,42 @@ preview_update(void)
{
if (vars.scaling < 0)
{
if ((th0 > page_height && tw0 <= page_height) ||
(tw0 > page_width && th0 <= page_width))
orient = ORIENT_LANDSCAPE;
else
if ((page_width > page_height && tw0 > th0) ||
(page_height > page_width && th0 > tw0))
{
orient = ORIENT_PORTRAIT;
if (tw0 > page_width)
{
vars.scaling *= (double) page_width / (double) tw0;
th0 = th0 * page_width / tw0;
}
if (th0 > page_height)
{
vars.scaling *= (double) page_height / (double) th0;
tw0 = tw0 * page_height / th0;
}
}
else
{
orient = ORIENT_LANDSCAPE;
if (tw1 > page_height)
{
vars.scaling *= (double) page_height / (double) tw1;
th1 = th1 * page_height / tw1;
}
if (th1 > page_width)
{
vars.scaling *= (double) page_width / (double) th1;
tw1 = tw1 * page_width / th1;
}
}
}
else
{
if (ta0 >= ta1)
orient = ORIENT_PORTRAIT;
orient = ORIENT_PORTRAIT;
else
orient = ORIENT_LANDSCAPE;
orient = ORIENT_LANDSCAPE;
}
}
else
@ -2649,46 +2833,65 @@ preview_update(void)
print_height = th0;
}
page_left = (PREVIEW_SIZE - page_width) / 2;
page_top = (PREVIEW_SIZE - page_height) / 2;
page_left = (PREVIEW_SIZE - 10 * page_width / 72) / 2;
page_top = (PREVIEW_SIZE - 10 * page_height / 72) / 2;
gdk_draw_rectangle(preview->widget.window, gc, 0,
(PREVIEW_SIZE - width) / 2,
(PREVIEW_SIZE - length) / 2,
width, length);
(PREVIEW_SIZE - (10 * width / 72)) / 2,
(PREVIEW_SIZE - (10 * length / 72)) / 2,
10 * width / 72, 10 * length / 72);
if (vars.left < 0)
left = (page_width - print_width) / 2;
else
{
left = 10 * vars.left / 72;
vars.left = (page_width - print_width) / 2;
if (left > (page_width - print_width))
left = vars.left;
if (left > (page_width - print_width))
{
left = page_width - print_width;
vars.left = 72 * left / 10;
vars.left = left;
plist[plist_current].v.left = vars.left;
}
}
if (vars.top < 0)
top = (page_height - print_height) / 2;
else
{
top = 10 * vars.top / 72;
vars.top = (page_height - print_height) / 2;
top = vars.top;
if (top > (page_height - print_height))
if (top > (page_height - print_height))
{
top = page_height - print_height;
vars.top = 72 * top / 10;
vars.top = top;
plist[plist_current].v.top = vars.top;
}
}
sprintf(s, "%.3f", vars.top / 72.0);
gtk_signal_handler_block_by_data(GTK_OBJECT(top_entry), NULL);
gtk_entry_set_text(GTK_ENTRY(top_entry), s);
gtk_signal_handler_unblock_by_data(GTK_OBJECT(top_entry), NULL);
sprintf(s, "%.3f", vars.left / 72.0);
gtk_signal_handler_block_by_data(GTK_OBJECT(left_entry), NULL);
gtk_entry_set_text(GTK_ENTRY(left_entry), s);
gtk_signal_handler_unblock_by_data(GTK_OBJECT(left_entry), NULL);
if (vars.scaling < 0)
sprintf(s, "%.3f",
(vars.top + (image_height * -72.0 / vars.scaling)) / 72.0);
else
sprintf(s, "%.3f", (vars.top + print_height) / 72.0);
gtk_entry_set_text(GTK_ENTRY(bottom_entry), s);
if (vars.scaling < 0)
sprintf(s, "%.3f",
(vars.left + (image_width * -72.0 / vars.scaling)) / 72.0);
else
sprintf(s, "%.3f", (vars.left + print_width) / 72.0);
gtk_entry_set_text(GTK_ENTRY(right_entry), s);
gdk_draw_rectangle(preview->widget.window, gc, 1,
page_left + left, page_top + top,
print_width, print_height);
page_left + 10 * left / 72, page_top + 10 * top / 72,
10 * print_width / 72, 10 * print_height / 72);
gdk_flush();
}
@ -2798,7 +3001,7 @@ printrc_load(void)
int keepgoing = 1;
if (line[0] == '#')
continue; /* Comment */
initialize_printer(&key);
/*
* Read the command-delimited printer definition data. Note that
* we can't use sscanf because %[^,] fails if the string is empty...
@ -3003,18 +3206,40 @@ printrc_load(void)
lineptr = commaptr + 1;
}
if ((p = bsearch(&key, plist + 1, plist_count - 1, sizeof(plist_t),
(int (*)(const void *, const void *))compare_printers)) != NULL)
/*
* The format of the list is the File printer followed by a qsort'ed list
* of system printers. So, if we want to update the file printer, it is
* always first in the list, else call bsearch.
*/
if ((strcmp(key.name, _("File")) == 0) && (strcmp(plist[0].name,
_("File")) == 0))
{
#ifdef DEBUG
printf("Updated File printer directly\n");
#endif
p = &plist[0];
memcpy(p, &key, sizeof(plist_t));
p->active = 1;
}
else if (plist_count < MAX_PLIST - 1)
else
{
p = plist + plist_count;
memcpy(p, &key, sizeof(plist_t));
p->active = 0;
plist_count++;
if ((p = bsearch(&key, plist + 1, plist_count - 1, sizeof(plist_t),
(int (*)(const void *, const void *))compare_printers))
!= NULL)
{
#ifdef DEBUG
printf("Updating printer %s.\n", key.name);
#endif
memcpy(p, &key, sizeof(plist_t));
p->active = 1;
}
else if (plist_count < MAX_PLIST - 1)
{
p = plist + plist_count;
memcpy(p, &key, sizeof(plist_t));
p->active = 0;
plist_count++;
}
}
}
@ -3056,7 +3281,6 @@ printrc_save(void)
* Generate the filename for the current user...
*/
filename = gimp_personal_rc_file ("printrc");
#ifdef __EMX__
_fnslashify(filename);
@ -3074,7 +3298,7 @@ printrc_save(void)
fputs("#PRINTRC " PLUG_IN_VERSION "\n", fp);
for (i = 1, p = plist + 1; i < plist_count; i ++, p ++)
for (i = 0, p = plist; i < plist_count; i ++, p ++)
fprintf(fp, "%s,%s,%s,%s,%d,%s,%s,%s,%s,%d,%.3f,%d,%d,%d,%.3f,%d,%d,%d,%d,%d,%.3f,%.3f\n",
p->name, p->v.output_to, p->v.driver, p->v.ppd_file,
p->v.output_type, p->v.resolution, p->v.media_size,
@ -3109,9 +3333,11 @@ static void
get_printers(void)
{
int i;
char defname[17];
#if defined(LPC_COMMAND) || defined(LPSTAT_COMMAND)
FILE *pfile;
char line[129],
defname[17];
char line[129], name[17];
#endif
#ifdef __EMX__
BYTE pnum;
#endif
@ -3120,18 +3346,19 @@ get_printers(void)
defname[0] = '\0';
memset(plist, 0, sizeof(plist));
plist_count = 1;
strcpy(plist[0].name, _("File"));
plist[0].v.output_to[0] = '\0';
strcpy(plist[0].v.driver, "ps2");
initialize_printer(&plist[0]);
plist_count = 1;
plist[0].v.output_type = OUTPUT_COLOR;
#ifdef LPC_COMMAND
if ((pfile = popen(LPC_COMMAND " status", "r")) != NULL)
if ((pfile = popen(LPC_COMMAND " status < /dev/null", "r")) != NULL)
{
while (fgets(line, sizeof(line), pfile) != NULL &&
plist_count < MAX_PLIST)
if (strchr(line, ':') != NULL && line[0] != ' ' && line[0] != '\t')
if (strchr(line, ':') != NULL && line[0] != ' ' &&
line[0] != '\t' && strncmp(line,"Press RETURN to continue",24))
{
*strchr(line, ':') = '\0';
strcpy(plist[plist_count].name, line);
@ -3148,8 +3375,6 @@ get_printers(void)
#ifdef LPSTAT_COMMAND
if ((pfile = popen(LPSTAT_COMMAND " -d -p", "r")) != NULL)
{
char name[17];
while (fgets(line, sizeof(line), pfile) != NULL &&
plist_count < MAX_PLIST)
{