summaryrefslogtreecommitdiff
path: root/src/cups
diff options
context:
space:
mode:
authorDidier Raboud <odyx@debian.org>2016-10-05 09:16:08 +0200
committerDidier Raboud <odyx@debian.org>2016-10-05 09:16:08 +0200
commitd69d392d8c45cdcc93e58f0e1bdbb2b66d6b9566 (patch)
treefbd96013c3d605249b167a97c8862f38f8a1cdee /src/cups
parent7f5731038556e5b03d2a886163ca2c873c77333d (diff)
New upstream version 5.2.12~pre3
Diffstat (limited to 'src/cups')
-rw-r--r--src/cups/Makefile.in1
-rw-r--r--src/cups/backend_common.c2
-rw-r--r--src/cups/backend_mitsu70x.c451
-rw-r--r--src/cups/backend_mitsu9550.c42
-rw-r--r--src/cups/commandtocanon.c1
-rw-r--r--src/cups/commandtoepson.c1
-rw-r--r--src/cups/genppd.c44
-rw-r--r--src/cups/i18n.c1
-rw-r--r--src/cups/rastertoprinter.c7
-rwxr-xr-xsrc/cups/test-rastertogutenprint.in20
10 files changed, 313 insertions, 257 deletions
diff --git a/src/cups/Makefile.in b/src/cups/Makefile.in
index 94a6dc8..fcb9787 100644
--- a/src/cups/Makefile.in
+++ b/src/cups/Makefile.in
@@ -485,6 +485,7 @@ AUTOHEADER = @AUTOHEADER@
AUTOMAKE = @AUTOMAKE@
AWK = @AWK@
BUILD_CUPS_PPDS = @BUILD_CUPS_PPDS@
+BZIP2 = @BZIP2@
CC = @CC@
CCDEPMODE = @CCDEPMODE@
CFLAGS = @CFLAGS@
diff --git a/src/cups/backend_common.c b/src/cups/backend_common.c
index 171f564..643d738 100644
--- a/src/cups/backend_common.c
+++ b/src/cups/backend_common.c
@@ -713,7 +713,7 @@ void print_help(char *argv0, struct dyesub_backend *backend)
DEBUG("Standalone %s backend version %s\n",
backend->name, backend->version);
DEBUG("\t%s\n", backend->uri_prefix);
- DEBUG("\t[ -D ] [ -G ] [ -S serialnum ] \n");
+ DEBUG("\t[ -D ] [ -G ] \n");
DEBUG("\t[ -V extra_vid ] [ -P extra_pid ] [ -T extra_type ] \n");
if (backend->cmdline_usage)
backend->cmdline_usage();
diff --git a/src/cups/backend_mitsu70x.c b/src/cups/backend_mitsu70x.c
index e0b0587..9a94a32 100644
--- a/src/cups/backend_mitsu70x.c
+++ b/src/cups/backend_mitsu70x.c
@@ -50,6 +50,14 @@
//#define ENABLE_CORRTABLES
+#ifndef CORRTABLE_PATH
+#define CORRTABLE_PATH "D70"
+#endif
+
+#ifdef ENABLE_CORRTABLES
+#include "D70/Mitsu_D70.c"
+#endif
+
/* Private data stucture */
struct mitsu70x_ctx {
struct libusb_device_handle *dev;
@@ -70,11 +78,17 @@ struct mitsu70x_ctx {
uint16_t last_donor_u;
int num_decks;
+ int supports_jobs_query;
+
#ifdef ENABLE_CORRTABLES
- struct mitsu70x_corrdata *corrdata;
- struct mitsu70x_corrdatalens *corrdatalens;
char *laminatefname;
char *lutfname;
+ char *cpcfname;
+
+ struct CColorConv3D lut;
+ struct CPCData cpcdata;
+
+ char *last_cpcfname;
int raw_format;
#endif
@@ -82,9 +96,9 @@ struct mitsu70x_ctx {
/* Printer data structures */
struct mitsu70x_jobstatus {
- uint8_t hdr[4];
- uint16_t jobid;
- uint16_t mecha_no;
+ uint8_t hdr[4]; /* E4 56 31 30 */
+ uint16_t jobid; /* BE */
+ uint16_t mecha_no; /* BE */
uint8_t job_status[4];
uint8_t memory;
uint8_t power;
@@ -95,11 +109,11 @@ struct mitsu70x_jobstatus {
} __attribute__((packed));
struct mitsu70x_jobs {
- uint8_t hdr[4];
+ uint8_t hdr[4]; /* E4 56 31 31 */
uint16_t dummy;
- uint16_t jobid_0;
+ uint16_t jobid_0; /* BE */
uint8_t job0_status[4];
- uint16_t jobid_1;
+ uint16_t jobid_1; /* BE */
uint8_t job1_status[4];
// XXX are there more?
} __attribute__((packed));
@@ -224,8 +238,10 @@ struct mitsu70x_status_ver {
} __attribute__((packed));
struct mitsu70x_printerstatus_resp {
- uint8_t hdr[4];
- uint8_t unk[36];
+ uint8_t hdr[4]; /* E4 56 32 31 */
+ uint8_t memory;
+ uint8_t power;
+ uint8_t unk[34];
int16_t model[6]; /* LE, UTF-16 */
int16_t serno[6]; /* LE, UTF-16 */
struct mitsu70x_status_ver vers[7]; // components are 'LMFTR??'
@@ -235,7 +251,7 @@ struct mitsu70x_printerstatus_resp {
} __attribute__((packed));
struct mitsu70x_memorystatus_resp {
- uint8_t hdr[3];
+ uint8_t hdr[3]; /* E4 56 33 */
uint8_t memory;
uint8_t size;
uint8_t rsvd;
@@ -260,75 +276,13 @@ struct mitsu70x_hdr {
uint8_t zero3[6];
uint8_t multicut;
- uint8_t zero4[15];
+ uint8_t zero4[13];
+ uint8_t mode; /* 0 for cooked YMC planar, 1 for packed BGR */
+ uint8_t use_lut; /* in BGR mode, 0 disables, 1 enables */
uint8_t pad[448];
} __attribute__((packed));
-#ifdef ENABLE_CORRTABLES
-/* Correction data definitions */
-#define CORRDATA_DEF
-struct mitsu70x_corrdata {
- uint16_t liney[2730];
- uint16_t linem[2730];
- uint16_t linec[2730];
- uint16_t gnmby[256]; // B->Y conversion matrix
- uint16_t gnmgm[256]; // G->M conversion matrix
- uint16_t gnmrc[256]; // R->C conversion matrix
- double fm[256];
- double ksp[128];
- double ksm[128];
- double osp[128];
- double osm[128];
- double kp[11];
- double km[11];
- double hk[4];
- uint16_t speed[3];
- double fh[5]; /* only 4 in length on D70 Normal/Superfine */
- double shk[72];
- double uh[101];
- uint16_t rolk[13]; /* Missing on D70x family */
- uint32_t rev[76]; /* Missing on D70x and ASK300 */
-};
-
-struct mitsu70x_corrdatalens {
- size_t liney;
- size_t linem;
- size_t linec;
- size_t gnmby;
- size_t gnmgm;
- size_t gnmrc;
- size_t fm;
- size_t ksp;
- size_t ksm;
- size_t osp;
- size_t osm;
- size_t kp;
- size_t km;
- size_t hk;
- size_t speed;
- size_t fh;
- size_t shk;
- size_t uh;
- size_t rolk;
- size_t rev;
-};
-
-#include "D70/CPD70N01.h" // Normal/Fine
-#include "D70/CPD70S01.h" // Superfine
-#include "D70/CPD70U01.h" // Ultrafine
-//#include "D70/CPD80E01.h" // ???
-#include "D70/CPD80N01.h" // Normal/Fine
-#include "D70/CPD80S01.h" // Superfine
-#include "D70/CPD80U01.h" // Ultrafine
-#include "D70/ASK300T1.h" // Normal/Fine
-#include "D70/ASK300T3.h" // Superfine/Ultrafine
-#include "D70/CPS60T01.h" // Normal/Fine
-#include "D70/CPS60T03.h" // Superfine/Ultrafine
-#include "D70/EK305T01.h" // Normal/Fine
-#include "D70/EK305T03.h" // Superfine/Ultrafine
-#endif
-
/* Error dumps, etc */
static char *mitsu70x_mechastatus(uint8_t *sts)
@@ -382,11 +336,11 @@ static char *mitsu70x_jobstatuses(uint8_t *sts)
case JOB_STATUS1_PRINT_EJECT:
return "Ejecting page";
default:
- return "Unknown 'Print' status1\n";
+ return "Unknown 'Print' status1";
}
break;
case JOB_STATUS0_ASSIGN:
- return "Unknown 'Assignment' status1\n";
+ return "Unknown 'Assignment' status1";
case JOB_STATUS0_END:
switch(sts[1]) {
case JOB_STATUS1_END_OK:
@@ -606,7 +560,14 @@ static void mitsu70x_attach(void *vctx, struct libusb_device_handle *dev,
ctx->type = lookup_printer_type(&mitsu70x_backend,
desc.idVendor, desc.idProduct);
- ctx->last_donor_l = ctx->last_donor_u = 65535;}
+ ctx->last_donor_l = ctx->last_donor_u = 65535;
+
+ if (ctx->type == P_KODAK_305 ||
+ ctx->type == P_MITSU_K60)
+ ctx->supports_jobs_query = 0;
+ else
+ ctx->supports_jobs_query = 1;
+}
static void mitsu70x_teardown(void *vctx) {
struct mitsu70x_ctx *ctx = vctx;
@@ -616,6 +577,7 @@ static void mitsu70x_teardown(void *vctx) {
if (ctx->databuf)
free(ctx->databuf);
+
free(ctx);
}
@@ -623,6 +585,7 @@ static int mitsu70x_read_parse(void *vctx, int data_fd) {
struct mitsu70x_ctx *ctx = vctx;
int i, remain;
struct mitsu70x_hdr mhdr;
+ uint32_t planelen;
if (!ctx)
return CUPS_BACKEND_FAILED;
@@ -663,83 +626,77 @@ repeat:
}
#ifdef ENABLE_CORRTABLES
- ctx->raw_format = 1; // XXX until we define a new spool format for
- // the data. Maybe reuse D90 header?
+ ctx->raw_format = !mhdr.mode;
/* Figure out the correction data table to use */
if (ctx->type == P_MITSU_D70X) {
- ctx->laminatefname = "D70MAT01.raw";
- ctx->lutfname = "CPD70L01.lut";
+ ctx->laminatefname = CORRTABLE_PATH "/D70MAT01.raw";
+ ctx->lutfname = CORRTABLE_PATH "/CPD70L01.lut";
if (mhdr.speed == 3) {
- ctx->corrdata = &CPD70S01_data;
- ctx->corrdatalens = &CPD70S01_lengths;
+ ctx->cpcfname = CORRTABLE_PATH "/CPD70S01.cpc";
} else if (mhdr.speed == 4) {
- ctx->corrdata = &CPD70U01_data;
- ctx->corrdatalens = &CPD70U01_lengths;
+ ctx->cpcfname = CORRTABLE_PATH "/CPD70U01.cpc";
} else {
- ctx->corrdata = &CPD70N01_data;
- ctx->corrdatalens = &CPD70N01_lengths;
+ ctx->cpcfname = CORRTABLE_PATH "/CPD70N01.cpc";
}
} else if (ctx->type == P_MITSU_D80) {
- ctx->laminatefname = "D80MAT01.raw";
- ctx->lutfname = "CPD80L01.lut";
+ ctx->laminatefname = CORRTABLE_PATH "/D80MAT01.raw";
+ ctx->lutfname = CORRTABLE_PATH "/CPD80L01.lut";
if (mhdr.speed == 3) {
- ctx->corrdata = &CPD80S01_data;
- ctx->corrdatalens = &CPD80S01_lengths;
+ ctx->cpcfname = CORRTABLE_PATH "/CPD80S01.cpc";
} else if (mhdr.speed == 4) {
- ctx->corrdata = &CPD80U01_data;
- ctx->corrdatalens = &CPD80U01_lengths;
+ ctx->cpcfname = CORRTABLE_PATH "/CPD80U01.cpc";
} else {
- ctx->corrdata = &CPD80N01_data;
- ctx->corrdatalens = &CPD80N01_lengths;
+ ctx->cpcfname = CORRTABLE_PATH "/CPD80N01.cpc";
}
// XXX what about CPD80**E**01?
} else if (ctx->type == P_MITSU_K60) {
- ctx->laminatefname = "S60MAT02.raw";
- ctx->lutfname = "CPS60L01.lut";
+ ctx->laminatefname = CORRTABLE_PATH "/S60MAT02.raw";
+ ctx->lutfname = CORRTABLE_PATH "/CPS60L01.lut";
if (mhdr.speed == 3 || mhdr.speed == 4) {
- ctx->corrdata = &CPS60T03_data;
- ctx->corrdatalens = &CPS60T03_lengths;
+ mhdr.speed = 4; /* Ultra Fine */
+ ctx->cpcfname = CORRTABLE_PATH "/CPS60T03.cpc";
} else {
- ctx->corrdata = &CPS60T01_data;
- ctx->corrdatalens = &CPS60T01_lengths;
+ ctx->cpcfname = CORRTABLE_PATH "/CPS60T01.cpc";
}
-
} else if (ctx->type == P_KODAK_305) {
- ctx->laminatefname = "EK305MAT.raw"; // Same as K60
- ctx->lutfname = "EK305L01.lut";
+ ctx->laminatefname = CORRTABLE_PATH "/EK305MAT.raw"; // Same as K60
+ ctx->lutfname = CORRTABLE_PATH "/EK305L01.lut";
if (mhdr.speed == 3 || mhdr.speed == 4) {
- ctx->corrdata = &EK305T03_data;
- ctx->corrdatalens = &EK305T03_lengths;
+ mhdr.speed = 4; /* Ultra Fine */
+ ctx->cpcfname = CORRTABLE_PATH "/EK305T03.cpc";
} else {
- ctx->corrdata = &EK305T01_data;
- ctx->corrdatalens = &EK305T01_lengths;
+ ctx->cpcfname = CORRTABLE_PATH "/EK305T01.cpc";
}
- } else if (ctx->type == P_FUJI_ASK300) {
- ctx->laminatefname = "ASK300M2.raw"; // Same as D70
- ctx->lutfname = "CPD70L01.lut"; // XXX guess!
+ } else if (ctx->type == P_FUJI_ASK300) {
+ ctx->laminatefname = CORRTABLE_PATH "/ASK300M2.raw"; // Same as D70
+ ctx->lutfname = CORRTABLE_PATH "/CPD70L01.lut"; // XXX guess, driver did not come with external LUT!
if (mhdr.speed == 3 || mhdr.speed == 4) {
- ctx->corrdata = &ASK300T3_data;
- ctx->corrdatalens = &ASK300T3_lengths;
+ mhdr.speed = 3; /* Super Fine */
+ ctx->cpcfname = CORRTABLE_PATH "/ASK300T3.cpc";
} else {
- ctx->corrdata = &ASK300T1_data;
- ctx->corrdatalens = &ASK300T1_lengths;
+ ctx->cpcfname = CORRTABLE_PATH "/ASK300T1.cpc";
}
}
+ if (!mhdr.use_lut)
+ ctx->lutfname = NULL;
+
+ /* Clean up header back to pristine. */
+ mhdr.use_lut = 0;
+ mhdr.mode = 0;
#endif
- /* Work out printjob size */
+ /* Work out total printjob size */
ctx->cols = be16_to_cpu(mhdr.cols);
ctx->rows = be16_to_cpu(mhdr.rows);
- remain = ctx->rows * ctx->cols * 2;
- remain = (remain + 511) / 512 * 512; /* Round to nearest 512 bytes. */
- remain *= 3; /* One for each plane */
+ planelen = ctx->rows * ctx->cols * 2;
+ planelen = (planelen + 511) / 512 * 512; /* Round to nearest 512 bytes. */
if (!mhdr.laminate && mhdr.laminate_mode) {
i = be16_to_cpu(mhdr.lamcols) * be16_to_cpu(mhdr.lamrows) * 2;
@@ -747,53 +704,143 @@ repeat:
ctx->matte = i;
}
- ctx->databuf = malloc(sizeof(mhdr) + remain + ctx->matte);
+ remain = 3 * planelen + ctx->matte;
+
+ ctx->datalen = 0;
+ ctx->databuf = malloc(sizeof(mhdr) + remain);
if (!ctx->databuf) {
ERROR("Memory allocation failure!\n");
return CUPS_BACKEND_FAILED;
}
- memcpy(ctx->databuf, &mhdr, sizeof(mhdr));
+ memcpy(ctx->databuf + ctx->datalen, &mhdr, sizeof(mhdr));
ctx->datalen += sizeof(mhdr);
-#ifndef ENABLE_CORRTABLES
- /* Read matte from spool... */
- remain += ctx->matte;
+#ifdef ENABLE_CORRTABLES
+ if (ctx->raw_format) { /* RAW MODE */
#endif
+ DEBUG("Reading in %d bytes of 16bpp YMCL data\n", remain);
- /* Read in the spool data */
- while(remain) {
- i = read(data_fd, ctx->databuf + ctx->datalen, remain);
- if (i == 0)
- return CUPS_BACKEND_CANCEL;
- if (i < 0)
- return CUPS_BACKEND_CANCEL;
- ctx->datalen += i;
- remain -= i;
- }
-
+ /* Read in the spool data */
+ while(remain) {
+ i = read(data_fd, ctx->databuf + ctx->datalen, remain);
+ if (i == 0)
+ return CUPS_BACKEND_CANCEL;
+ if (i < 0)
+ return CUPS_BACKEND_CANCEL;
+ ctx->datalen += i;
+ remain -= i;
+ }
#ifdef ENABLE_CORRTABLES
- /* Read matte from matte file */
- if (!ctx->raw_format && ctx->matte) {
- int fd;
- fd = open(ctx->laminatefname, O_RDONLY);
- if (fd < 0) {
- ERROR("Unable to open matte lamination data file '%s'\n", ctx->laminatefname);
- return CUPS_BACKEND_CANCEL;
+ } else { /* RAW MODE OFF */
+ int spoolbuflen = 0;
+ uint8_t *spoolbuf;
+
+ remain = ctx->rows * ctx->cols * 3;
+ DEBUG("Reading in %d bytes of 8bpp BGR data\n", remain);
+
+ spoolbuflen = 0; spoolbuf = malloc(remain);
+ if (!spoolbuf) {
+ ERROR("Memory allocation failure!\n");
+ return CUPS_BACKEND_FAILED;
}
- remain = ctx->matte;
+
+ /* Read in the BGR data */
while (remain) {
- i = read(fd, ctx->databuf + ctx->datalen, remain);
+ i = read(data_fd, spoolbuf + spoolbuflen, remain);
if (i == 0)
return CUPS_BACKEND_CANCEL;
if (i < 0)
return CUPS_BACKEND_CANCEL;
- ctx->datalen += i;
+ spoolbuflen += i;
remain -= i;
}
+
+ /* Run through basic LUT, if present and enabled */
+ if (ctx->lutfname) {
+ DEBUG("Running print data through LUT\n");
+ uint8_t *buf = malloc(LUT_LEN);
+ if (!buf) {
+ ERROR("Memory allocation failure!\n");
+ return CUPS_BACKEND_FAILED;
+ }
+ if (CColorConv3D_Get3DColorTable(buf, ctx->lutfname)) {
+ ERROR("Unable to open LUT file '%s'\n", ctx->lutfname);
+ return CUPS_BACKEND_CANCEL;
+ }
+ CColorConv3D_Load3DColorTable(&ctx->lut, buf);
+ free(buf);
+ CColorConv3D_DoColorConv(&ctx->lut, spoolbuf, ctx->cols, ctx->rows, ctx->cols * 3, 1);
+ // XXX proprietary lib also does gamma+contrast+brightness
+ }
+
+ /* Load in the CPC file, if needed! */
+ if (ctx->cpcfname && ctx->cpcfname != ctx->last_cpcfname) {
+ ctx->last_cpcfname = ctx->cpcfname;
+ if (load_CPCData(&ctx->cpcdata, ctx->cpcfname)) {
+ ERROR("Unable to load CPC file '%s'\n", ctx->cpcfname);
+ return CUPS_BACKEND_CANCEL;
+ }
+ }
+
+ // XXX INSERT ALGORITHM HERE...
+
+ // XXX optionally CreateInkCorrectGammaTable(...)
+
+ /* Convert to YMC using corrtables (aka CImageEffect70::DoGamma) */
+ {
+ uint32_t r, c;
+ uint32_t in = 0, out = 0;
+
+ uint16_t *offset_y = (uint16_t*)(ctx->databuf + ctx->datalen);
+ uint16_t *offset_m = offset_y + planelen/2;
+ uint16_t *offset_c = offset_m + planelen/2;
+// uint16_t *offset_l = offset_c + planelen/2;
+
+ DEBUG("Running print data through BGR->YMC table (crude)\n");
+ for(r = 0 ; r < ctx->rows; r++) {
+ for (c = 0 ; c < ctx->cols ; c++) {
+ offset_y[out] = cpu_to_be16(ctx->cpcdata.GNMby[spoolbuf[in]]);
+ offset_m[out] = cpu_to_be16(ctx->cpcdata.GNMgm[spoolbuf[in + 1]]);
+ offset_c[out] = cpu_to_be16(ctx->cpcdata.GNMrc[spoolbuf[in + 2]]);
+ in += 3;
+ out++;
+ }
+ }
+ }
+ // XXX then call CImageEffect70::DoConv(...) to do the final corrections..
+
+ /* Move up the pointer */
+ ctx->datalen += 3*planelen;
+
+ /* Clean up */
+ free(spoolbuf);
+
+ /* Now that we've filled everything in, read latte from file */
+ if (ctx->matte) {
+ int fd;
+ DEBUG("Reading %d bytes of matte data from disk\n", ctx->matte);
+ fd = open(ctx->laminatefname, O_RDONLY);
+ if (fd < 0) {
+ ERROR("Unable to open matte lamination data file '%s'\n", ctx->laminatefname);
+ return CUPS_BACKEND_CANCEL;
+ }
+ remain = ctx->matte;
+ while (remain) {
+ i = read(fd, ctx->databuf + ctx->datalen, remain);
+ if (i == 0) {
+ /* We hit EOF, restart from beginning */
+ lseek(fd, 0, SEEK_SET);
+ continue;
+ }
+ if (i < 0)
+ return CUPS_BACKEND_CANCEL;
+ ctx->datalen += i;
+ remain -= i;
+ }
+ }
}
#endif
-
return CUPS_BACKEND_OK;
}
@@ -831,7 +878,6 @@ static int mitsu70x_get_jobstatus(struct mitsu70x_ctx *ctx, struct mitsu70x_jobs
return 0;
}
-#ifdef BROKEN_ON_EK305 // XXX broken on EK305
static int mitsu70x_get_jobs(struct mitsu70x_ctx *ctx, struct mitsu70x_jobs *resp)
{
uint8_t cmdbuf[CMDBUF_LEN];
@@ -864,7 +910,6 @@ static int mitsu70x_get_jobs(struct mitsu70x_ctx *ctx, struct mitsu70x_jobs *res
return 0;
}
-#endif
static int mitsu70x_get_memorystatus(struct mitsu70x_ctx *ctx, struct mitsu70x_memorystatus_resp *resp)
{
@@ -952,7 +997,7 @@ static int mitsu70x_cancel_job(struct mitsu70x_ctx *ctx, uint16_t jobid)
cmdbuf[0] = 0x1b;
cmdbuf[1] = 0x44;
cmdbuf[2] = (jobid >> 8) & 0xff;
- cmdbuf[3] = jobid & 0xffl;
+ cmdbuf[3] = jobid & 0xff;
if ((ret = send_data(ctx->dev, ctx->endp_down,
cmdbuf, 4)))
return ret;
@@ -979,13 +1024,31 @@ static int mitsu70x_set_sleeptime(struct mitsu70x_ctx *ctx, uint8_t time)
return 0;
}
-static int mitsu70x_main_loop(void *vctx, int copies) {
+static int mitsu70x_wakeup(struct mitsu70x_ctx *ctx)
+{
+ int ret;
+ uint8_t buf[512];
+
+ memset(buf, 0, sizeof(buf));
+ buf[0] = 0x1b;
+ buf[1] = 0x45;
+ buf[2] = 0x57;
+ buf[3] = 0x55;
+
+ INFO("Waking up printer...\n");
+ if ((ret = send_data(ctx->dev, ctx->endp_down,
+ buf, sizeof(buf))))
+ return CUPS_BACKEND_FAILED;
+
+ return 0;
+}
+
+static int mitsu70x_main_loop(void *vctx, int copies)
+{
struct mitsu70x_ctx *ctx = vctx;
struct mitsu70x_jobstatus jobstatus;
struct mitsu70x_printerstatus_resp resp;
-#ifdef BROKEN_ON_EK305
struct mitsu70x_jobs jobs;
-#endif
struct mitsu70x_hdr *hdr;
int ret;
@@ -1005,18 +1068,10 @@ top:
/* Make sure we're awake! */
if (jobstatus.power) {
- uint8_t buf[512];
-
- memset(buf, 0, sizeof(buf));
- buf[0] = 0x1b;
- buf[1] = 0x45;
- buf[2] = 0x57;
- buf[3] = 0x55;
-
- INFO("Waking up printer...\n");
- if ((ret = send_data(ctx->dev, ctx->endp_down,
- buf, sizeof(buf))))
+ ret = mitsu70x_wakeup(ctx);
+ if (ret)
return CUPS_BACKEND_FAILED;
+
sleep(1);
goto top;
}
@@ -1093,19 +1148,21 @@ skip_status:
}
}
-#ifdef BROKEN_ON_EK305 // XXX broken on K305, at least.
/* Make sure we don't have any jobid collisions */
- ret = mitsu70x_get_jobs(ctx, &jobs);
- if (ret)
- return CUPS_BACKEND_FAILED;
-
- while (ctx->jobid == be16_to_cpu(jobs.jobid_0) ||
- ctx->jobid == be16_to_cpu(jobs.jobid_1)) {
- ctx->jobid++;
- if (!ctx->jobid)
+ if (ctx->supports_jobs_query) {
+ ret = mitsu70x_get_jobs(ctx, &jobs);
+ if (ret)
+ return CUPS_BACKEND_FAILED;
+ while (ctx->jobid == be16_to_cpu(jobs.jobid_0) ||
+ ctx->jobid == be16_to_cpu(jobs.jobid_1)) {
+ ctx->jobid++;
+ if (!ctx->jobid)
+ ctx->jobid++;
+ }
+ } else {
+ while(!ctx->jobid || ctx->jobid == be16_to_cpu(jobstatus.jobid))
ctx->jobid++;
}
-#endif
/* Set jobid */
hdr->jobid = cpu_to_be16(ctx->jobid);
@@ -1287,6 +1344,7 @@ static void mitsu70x_dump_printerstatus(struct mitsu70x_printerstatus_resp *resp
INFO("Lower Prints remaining: %03d/%03d\n",
be16_to_cpu(resp->lower.remain),
be16_to_cpu(resp->lower.capacity));
+// INFO("Lower Lifetime prints: %d\n", be16_to_cpu(resp->lower.prints));
if (resp->upper.mecha_status[0] != MECHA_STATUS_INIT) {
INFO("Upper Mechanical Status: %s\n",
@@ -1310,26 +1368,45 @@ static void mitsu70x_dump_printerstatus(struct mitsu70x_printerstatus_resp *resp
static int mitsu70x_query_status(struct mitsu70x_ctx *ctx)
{
struct mitsu70x_printerstatus_resp resp;
-#ifdef BROKEN_ON_EK305
struct mitsu70x_jobs jobs;
-#endif
+ struct mitsu70x_jobstatus jobstatus;
+
int ret;
+top:
+ ret = mitsu70x_get_jobstatus(ctx, &jobstatus, 0x0000);
+ if (ret)
+ goto done;
+
+ /* Make sure we're awake! */
+ if (jobstatus.power) {
+ ret = mitsu70x_wakeup(ctx);
+ if (ret)
+ return CUPS_BACKEND_FAILED;
+
+ sleep(1);
+ goto top;
+ }
+
ret = mitsu70x_get_printerstatus(ctx, &resp);
if (!ret)
mitsu70x_dump_printerstatus(&resp);
-#ifdef BROKEN_ON_EK305 // XXX broken on EK305, at least
- ret = mitsu70x_get_jobs(ctx, &jobs);
- if (!ret) {
- INFO("JOB0 ID : %06u\n", jobs.jobid_0);
- INFO("JOB0 status : %s\n", mitsu70x_jobstatuses(jobs.job0_status));
- INFO("JOB1 ID : %06u\n", jobs.jobid_1);
- INFO("JOB1 status : %s\n", mitsu70x_jobstatuses(jobs.job1_status));
- // XXX are there more?
+ if (ctx->supports_jobs_query) {
+ ret = mitsu70x_get_jobs(ctx, &jobs);
+ if (!ret) {
+ INFO("JOB0 ID : %06u\n", jobs.jobid_0);
+ INFO("JOB0 status : %s\n", mitsu70x_jobstatuses(jobs.job0_status));
+ INFO("JOB1 ID : %06u\n", jobs.jobid_1);
+ INFO("JOB1 status : %s\n", mitsu70x_jobstatuses(jobs.job1_status));
+ // XXX are there more?
+ }
+ } else {
+ INFO("JOB0 ID : %06u\n", jobstatus.jobid);
+ INFO("JOB0 status : %s\n", mitsu70x_jobstatuses(jobstatus.job_status));
}
-#endif
+done:
return ret;
}
@@ -1399,7 +1476,7 @@ static int mitsu70x_cmdline_arg(void *vctx, int argc, char **argv)
/* Exported */
struct dyesub_backend mitsu70x_backend = {
.name = "Mitsubishi CP-D70/D707/K60/D80",
- .version = "0.41WIP",
+ .version = "0.43WIP",
.uri_prefix = "mitsu70x",
.cmdline_usage = mitsu70x_cmdline,
.cmdline_arg = mitsu70x_cmdline_arg,
diff --git a/src/cups/backend_mitsu9550.c b/src/cups/backend_mitsu9550.c
index d257227..862f5f0 100644
--- a/src/cups/backend_mitsu9550.c
+++ b/src/cups/backend_mitsu9550.c
@@ -66,7 +66,7 @@ struct mitsu9550_ctx {
/* Spool file structures */
struct mitsu9550_hdr1 {
uint8_t cmd[4]; /* 1b 57 20 2e */
- uint8_t unk[10];
+ uint8_t unk[10];
uint16_t cols; /* BE */
uint16_t rows; /* BE */
uint8_t null[32];
@@ -74,25 +74,25 @@ struct mitsu9550_hdr1 {
struct mitsu9550_hdr2 {
uint8_t cmd[4]; /* 1b 57 21 2e */
- uint8_t unk[24];
- uint16_t copies; /* BE, 1-580 */
+ uint8_t unk[24]; /* 00 80 00 22 08 03 00 [...] */
+ uint16_t copies; /* BE, 1-680 */
uint8_t null[2];
uint8_t cut; /* 00 == normal, 83 == 2x6*2 */
uint8_t unkb[5];
uint8_t mode; /* 00 == normal, 80 == fine */
- uint8_t unkc[11];
+ uint8_t unkc[11]; /* 00 [...] 00 01 */
} __attribute__((packed));
struct mitsu9550_hdr3 {
uint8_t cmd[4]; /* 1b 57 22 2e */
- uint8_t unk[7];
+ uint8_t unk[7]; /* 00 40 00 [...] */
uint8_t mode2; /* 00 == normal, 01 == finedeep */
- uint8_t unkb[38];
+ uint8_t null[38];
} __attribute__((packed));
struct mitsu9550_hdr4 {
uint8_t cmd[4]; /* 1b 57 26 2e */
- uint8_t unk[46];
+ uint8_t unk[46]; /* 00 70 00 00 00 00 00 00 01 01 00 [...] */
} __attribute__((packed));
struct mitsu9550_plane {
@@ -124,7 +124,7 @@ struct mitsu9550_status {
uint8_t null[4];
uint8_t sts1; // MM
uint8_t nullb[1];
- uint16_t copies; // NN
+ uint16_t copies; // BE, NN
uint8_t nullc[6];
uint8_t sts3; // QQ
uint8_t sts4; // RR
@@ -347,19 +347,19 @@ static int mitsu9550_get_status(struct mitsu9550_ctx *ctx, uint8_t *resp, int st
static char *mitsu9550_media_types(uint8_t type)
{
- switch (type) {
+ switch (type & 0xf) { /* values can be 0x0? or 0x4? */
case 0x01:
- return "3.5x5";
+ return "CK9035 (3.5x5)";
case 0x02:
- return "4x6";
+ return "CK9046 (4x6)";
case 0x03:
- return "PC";
+ return "CK9046PST (4x6)";
case 0x04:
- return "5x7";
+ return "CK9057 (5x7)";
case 0x05:
- return "6x9";
+ return "CK9069 (6x9)";
case 0x06:
- return "V";
+ return "CK9068 (6x8)";
default:
return "Unknown";
}
@@ -373,7 +373,7 @@ static int validate_media(int type, int cols, int rows) {
return 1;
break;
case 0x02: /* 4x6 */
- case 0x03: /* PC ??? */
+ case 0x03: /* 4x6 postcard */
if (cols != 2152)
return 1;
if (rows != 1416 && rows != 1184 &&
@@ -389,11 +389,15 @@ static int validate_media(int type, int cols, int rows) {
case 0x05: /* 6x9 */
if (cols != 2152)
return 1;
- if (rows != 1416 && rows != 2972 &&
+ if (rows != 1416 && rows != 2792 &&
rows != 2956 && rows != 3146)
return 1;
break;
- case 0x06: /* V */
+ case 0x06: /* V (6x8??) */
+ if (cols != 2152)
+ return 1;
+ if (rows != 1416 && rows != 2792)
+ return 1;
break;
default: /* Unknown */
break;
@@ -781,7 +785,7 @@ static int mitsu9550_cmdline_arg(void *vctx, int argc, char **argv)
/* Exported */
struct dyesub_backend mitsu9550_backend = {
.name = "Mitsubishi CP-9550DW-S",
- .version = "0.16",
+ .version = "0.17",
.uri_prefix = "mitsu9550",
.cmdline_usage = mitsu9550_cmdline,
.cmdline_arg = mitsu9550_cmdline_arg,
diff --git a/src/cups/commandtocanon.c b/src/cups/commandtocanon.c
index b7b7ef2..13d96d7 100644
--- a/src/cups/commandtocanon.c
+++ b/src/cups/commandtocanon.c
@@ -15,6 +15,7 @@
#include <ctype.h>
#include <stdlib.h>
#include <stdio.h>
+#include <strings.h>
/*
diff --git a/src/cups/commandtoepson.c b/src/cups/commandtoepson.c
index 7706a04..0582df2 100644
--- a/src/cups/commandtoepson.c
+++ b/src/cups/commandtoepson.c
@@ -31,6 +31,7 @@
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
+#include <strings.h>
/*
* Macros...
diff --git a/src/cups/genppd.c b/src/cups/genppd.c
index 53b970d..0c8830d 100644
--- a/src/cups/genppd.c
+++ b/src/cups/genppd.c
@@ -55,6 +55,7 @@
#include <ctype.h>
#include <errno.h>
#include <libgen.h>
+#include <strings.h>
#if defined(HAVE_VARARGS_H) && !defined(HAVE_STDARG_H)
#include <varargs.h>
#else
@@ -224,13 +225,6 @@ static int write_ppd(gpFile fp, const stp_printer_t *p,
* 'main()' - Process files on the command-line...
*/
-const char slang_c[] = "LANG=C";
-const char slcall_c[] = "LC_ALL=C";
-const char slcnumeric_c[] = "LC_NUMERIC=C";
-char lang_c[sizeof(slang_c) + 1];
-char lcall_c[sizeof(slcall_c) + 1];
-char lcnumeric_c[sizeof(slcnumeric_c) + 1];
-
int /* O - Exit status */
main(int argc, /* I - Number of command-line arguments */
char *argv[]) /* I - Command-line arguments */
@@ -239,12 +233,9 @@ main(int argc, /* I - Number of command-line arguments */
* Force POSIX locale, since stp_init incorrectly calls setlocale...
*/
- strcpy(lang_c, slang_c);
- strcpy(lcall_c, slcall_c);
- strcpy(lcnumeric_c, slcnumeric_c);
- putenv(lang_c);
- putenv(lcall_c);
- putenv(lcnumeric_c);
+ (void) setenv("LANG", "C", 1);
+ (void) setenv("LC_ALL", "C", 1);
+ (void) setenv("LC_NUMERIC", "C", 1);
/*
* Initialise libgutenprint
@@ -2431,33 +2422,6 @@ write_ppd(
}
stp_parameter_description_destroy(&desc);
- /* Constraints */
- stp_describe_parameter(v, "PPDUIConstraints", &desc);
- if (desc.is_active && desc.p_type == STP_PARAMETER_TYPE_STRING_LIST)
- {
- num_opts = stp_string_list_count(desc.bounds.str);
- if (num_opts > 0)
- {
- gpputs(fp, "*% ===== Constraints ===== \n");
- for (i = 0; i < num_opts; i++)
- {
- char *opt1, *opt2;
- opt = stp_string_list_param(desc.bounds.str, i);
- opt1 = stp_strdup(opt->text);
- opt2 = strrchr(opt1, '*');
- if (opt2)
- {
- opt2[-1] = 0;
- gpprintf(fp, "*%s: %s %s\n", opt->name, opt1, opt2);
- gpprintf(fp, "*%s: %s %s\n", opt->name, opt2, opt1);
- }
- stp_free(opt1);
- }
- gpputs(fp, "\n");
- }
- }
- stp_parameter_description_destroy(&desc);
-
if (!language)
{
/*
diff --git a/src/cups/i18n.c b/src/cups/i18n.c
index afe59a3..7c3351b 100644
--- a/src/cups/i18n.c
+++ b/src/cups/i18n.c
@@ -39,6 +39,7 @@
#include <unistd.h>
#include <errno.h>
#include <iconv.h>
+#include <strings.h>
/*
diff --git a/src/cups/rastertoprinter.c b/src/cups/rastertoprinter.c
index 1a89bc5..e68c90d 100644
--- a/src/cups/rastertoprinter.c
+++ b/src/cups/rastertoprinter.c
@@ -51,6 +51,8 @@
#include <fcntl.h>
#include <errno.h>
#include <sys/times.h>
+#include <strings.h>
+#include <sys/time.h>
#ifdef HAVE_LIMITS_H
#include <limits.h>
#endif
@@ -1092,7 +1094,6 @@ main(int argc, /* I - Number of command-line arguments */
struct tms tms;
long clocks_per_sec;
struct timeval t1, t2;
- struct timezone tz;
char *page_size_name = NULL;
int aborted = 0;
#ifdef ENABLE_CUPS_LOAD_SAVE_OPTIONS
@@ -1120,7 +1121,7 @@ main(int argc, /* I - Number of command-line arguments */
theImage.rep = &cups;
- (void) gettimeofday(&t1, &tz);
+ (void) gettimeofday(&t1, NULL);
stp_init();
version_id = stp_get_version();
default_settings = stp_vars_create();
@@ -1402,7 +1403,7 @@ main(int argc, /* I - Number of command-line arguments */
}
cupsRasterClose(cups.ras);
(void) times(&tms);
- (void) gettimeofday(&t2, &tz);
+ (void) gettimeofday(&t2, NULL);
clocks_per_sec = sysconf(_SC_CLK_TCK);
fprintf(stderr, "DEBUG: Gutenprint: stats %.0fB, %.3fu, %.3fs, %.3fel\n",
total_bytes_printed,
diff --git a/src/cups/test-rastertogutenprint.in b/src/cups/test-rastertogutenprint.in
index 0574704..a8bb6d8 100755
--- a/src/cups/test-rastertogutenprint.in
+++ b/src/cups/test-rastertogutenprint.in
@@ -33,6 +33,12 @@ npages=3
enable_static='@ENABLE_STATIC@'
enable_shared='@ENABLE_SHARED@'
+if [ -r "$sdir/../../src/cups/gutenprint-users-manual.pdf" ] ; then
+ testfile="$sdir/../../src/cups/gutenprint-users-manual.pdf"
+else
+ testfile="$sdir/../../doc/gutenprint-users-manual.pdf"
+fi
+
usage() {
echo "Usage: test-rastertogutenprint [-s] [-v|--valgrind]"
exit 0;
@@ -113,12 +119,12 @@ if [ -n "$postscript" ] ; then
if [ -n "$pdftops" -a ! -x "$cupsdir/cgpdftoraster" ] ; then
tfile=`mktemp`
trap cleanup 1 2 3 6 14 15 30
- "$pdftops" -f 24 -l `expr 24 + $npages - 1` "$sdir/../../doc/gutenprint-users-manual.pdf" $tfile
+ "$pdftops" -f 24 -l `expr 24 + $npages - 1` "$testfile" $tfile
fi
else
tfile=`mktemp`
trap cleanup 1 2 3 6 14 15 30
- "$pdfjam" -q "$sdir/../../doc/gutenprint-users-manual.pdf" "$pages" -o $tfile
+ "$pdfjam" -q "$testfile" "$pages" -o $tfile
fi
if [ -z "$verbose" ] ; then
@@ -250,15 +256,15 @@ if [ -d ppd/C ] ; then
PPD=$f
export PPD
if [ -x "$cupsdir/cgpdftoraster" ] ; then
- output="`($cupsdir/cgpdftoraster 1 1 1 1 $pages < $sdir/../../doc/gutenprint-users-manual.pdf 2>/dev/null | run_rastertogp | do_output) 2>&1 3>&2 `"
+ output="`($cupsdir/cgpdftoraster 1 1 1 1 $pages < "$testfile" 2>/dev/null | run_rastertogp | do_output) 2>&1 3>&2 `"
elif [ -f "$tfile" -a -x "$cupsdir/gstoraster" ] ; then
- output="`($cupsdir/gstoraster 1 1 1 1 \"$cupsargs\" < $tfile 2>/dev/null | run_rastertogp | do_output) 2>&1 3>&2 `"
+ output="`($cupsdir/gstoraster 1 1 1 1 \"$cupsargs\" < "$testfile" 2>/dev/null | run_rastertogp | do_output) 2>&1 3>&2 `"
elif [ -f "$tfile" ] ; then
- output="`($cupsdir/pstops 1 1 1 1 \"$cupsargs\" < $tfile 2>/dev/null | $cupsdir/pstoraster 2>/dev/null | run_rastertogp | do_output) 2>&1 3>&2 `"
+ output="`($cupsdir/pstops 1 1 1 1 \"$cupsargs\" < "$testfile" 2>/dev/null | $cupsdir/pstoraster 2>/dev/null | run_rastertogp | do_output) 2>&1 3>&2 `"
elif [ -x "$cupsdir/pstoraster" ] ; then
- output="`($cupsdir/pdftops 1 1 1 1 \"$pages$cupsargs\" < $sdir/../../doc/gutenprint-users-manual.pdf 2>/dev/null | $cupsdir/pstops 1 1 1 1 \"$pages$cupsargs\" 2>/dev/null | $cupsdir/pstoraster 2>/dev/null | run_rastertogp | do_output) 2>&1 3>&2 `"
+ output="`($cupsdir/pdftops 1 1 1 1 \"$pages$cupsargs\" < "$testfile" 2>/dev/null | $cupsdir/pstops 1 1 1 1 \"$pages$cupsargs\" 2>/dev/null | $cupsdir/pstoraster 2>/dev/null | run_rastertogp | do_output) 2>&1 3>&2 `"
elif [ -x "$cupsdir/gstoraster" ] ; then
- output="`($cupsdir/pdftops 1 1 1 1 \"$pages$cupsargs\" < $sdir/../../doc/gutenprint-users-manual.pdf 2>/dev/null | $cupsdir/gstoraster 1 1 1 1 \"$pages$cupsargs\" 2>/dev/null | run_rastertogp | do_output) 2>&1 3>&2 `"
+ output="`($cupsdir/pdftops 1 1 1 1 \"$pages$cupsargs\" < "$testfile" 2>/dev/null | $cupsdir/gstoraster 1 1 1 1 \"$pages$cupsargs\" 2>/dev/null | run_rastertogp | do_output) 2>&1 3>&2 `"
else
output="`($cupsdir/imagetoraster 1 1 1 1 \"$pages$cupsargs\" < calibrate.ppm 2>/dev/null | run_rastertogp | do_output) 2>&1 3>&2`"
fi