diff options
author | Didier Raboud <odyx@debian.org> | 2016-10-05 09:16:08 +0200 |
---|---|---|
committer | Didier Raboud <odyx@debian.org> | 2016-10-05 09:16:08 +0200 |
commit | d69d392d8c45cdcc93e58f0e1bdbb2b66d6b9566 (patch) | |
tree | fbd96013c3d605249b167a97c8862f38f8a1cdee /src/cups | |
parent | 7f5731038556e5b03d2a886163ca2c873c77333d (diff) |
New upstream version 5.2.12~pre3
Diffstat (limited to 'src/cups')
-rw-r--r-- | src/cups/Makefile.in | 1 | ||||
-rw-r--r-- | src/cups/backend_common.c | 2 | ||||
-rw-r--r-- | src/cups/backend_mitsu70x.c | 451 | ||||
-rw-r--r-- | src/cups/backend_mitsu9550.c | 42 | ||||
-rw-r--r-- | src/cups/commandtocanon.c | 1 | ||||
-rw-r--r-- | src/cups/commandtoepson.c | 1 | ||||
-rw-r--r-- | src/cups/genppd.c | 44 | ||||
-rw-r--r-- | src/cups/i18n.c | 1 | ||||
-rw-r--r-- | src/cups/rastertoprinter.c | 7 | ||||
-rwxr-xr-x | src/cups/test-rastertogutenprint.in | 20 |
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 = ∪︀ - (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 |