diff options
Diffstat (limited to 'src')
48 files changed, 1304 insertions, 560 deletions
diff --git a/src/Makefile.in b/src/Makefile.in index feacab6..19d2f2a 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -193,6 +193,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/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 diff --git a/src/escputil/Makefile.in b/src/escputil/Makefile.in index da27b47..838b6c6 100644 --- a/src/escputil/Makefile.in +++ b/src/escputil/Makefile.in @@ -185,6 +185,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/escputil/d4lib.c b/src/escputil/d4lib.c index 5c99409..aef85be 100644 --- a/src/escputil/d4lib.c +++ b/src/escputil/d4lib.c @@ -47,6 +47,7 @@ #include <errno.h> #include <string.h> #include <ctype.h> +#include <time.h> #include "d4lib.h" @@ -183,6 +184,14 @@ static errorMessage_t errorMessage[] = sig = signal(SIGALRM, sigAlarm); \ } +static int d4USleep(long usec) +{ + struct timespec t; + t.tv_sec = 0; + t.tv_nsec = 1000l * usec; + return nanosleep(&t, NULL); +} + /*******************************************************************/ /* Function printHexValues */ /* */ @@ -275,7 +284,7 @@ int SafeWrite(int fd, const void *data, int len) { status = write(fd, data, len); if(status < len) - usleep(d4WrTimeout); + d4USleep(d4WrTimeout); retries--; } while ((status < len) && (retries > 0)); @@ -405,7 +414,7 @@ static int writeCmd(int fd, unsigned char *cmd, int len) /* according to Glen Steward, this will solve problems */ /* for the cartridge exchange with the Stylus Color 580 */ - usleep(d4MicroTimeout); + d4USleep(d4MicroTimeout); timeoutGot = 0; errno = 0; @@ -464,7 +473,7 @@ int readAnswer(int fd, unsigned char *buf, int len, int allowExtra) int first_read = 1; int excess = 0; /* wait a little bit before reading an answer */ - usleep(d4RdTimeout); + d4USleep(d4RdTimeout); /* for error handling in case of timeout */ timeoutGot = 0; @@ -542,7 +551,7 @@ int readAnswer(int fd, unsigned char *buf, int len, int allowExtra) } } } - usleep(d4RdTimeout); + d4USleep(d4RdTimeout); } if (debugD4) printf("\n"); @@ -563,7 +572,7 @@ int readAnswer(int fd, unsigned char *buf, int len, int allowExtra) else retry_count = 0; if (status < bytes) - usleep(d4RdTimeout); + d4USleep(d4RdTimeout); if (debugD4) printHexValues("waste", (const unsigned char *) wastebuf, status); excess -= status; @@ -600,7 +609,7 @@ static void _flushData(int fd) char buf[1024]; int len = 1023; int count = 200; - usleep(d4RdTimeout); + d4USleep(d4RdTimeout); /* for error handling in case of timeout */ timeoutGot = 0; @@ -613,7 +622,7 @@ static void _flushData(int fd) printf("+++flush data: length: %i\n", len); do { - usleep(d4RdTimeout); + d4USleep(d4RdTimeout); SET_TIMER(ti,oti, d4RdTimeout); rd = read(fd, buf, len); if (debugD4) @@ -1144,7 +1153,7 @@ int askForCredit(int fd, unsigned char socketID, int *sndSize, int *rcvSize) while (credit == 0 && retries-- >= 0 ) { while((credit=CreditRequest(fd,socketID)) == 0 && count < MAX_CREDIT_REQUEST && retries-- >= 0) - usleep(d4RdTimeout); + d4USleep(d4RdTimeout); if ( credit == -1 ) { @@ -1281,7 +1290,7 @@ int readData(int fd, unsigned char socketID, unsigned char *buf, int len) if ( Credit(fd, socketID, 1) == 1 ) { /* wait a little bit */ - usleep(d4RdDataTimeout); + d4USleep(d4RdDataTimeout); ret = _readData(fd, buf, len); return ret; } @@ -1332,7 +1341,7 @@ int writeAndReadData(int fd, unsigned char socketID, /* wait a little bit */ do { - usleep(d4RdDataTimeout); + d4USleep(d4RdDataTimeout); ret = _readData(fd, buf, len); if (ret < 0) return ret; @@ -1366,7 +1375,7 @@ void flushData(int fd, unsigned char socketID) if ( Credit(fd, socketID, 1) == 1 ) { /* wait a little bit */ - usleep(d4RdDataTimeout); + d4USleep(d4RdDataTimeout); _flushData(fd); } } diff --git a/src/escputil/escputil.c b/src/escputil/escputil.c index 8f4ae9e..76c5fc8 100644 --- a/src/escputil/escputil.c +++ b/src/escputil/escputil.c @@ -31,6 +31,7 @@ #include <signal.h> #include <sys/wait.h> #include <ctype.h> +#include <time.h> #if defined(HAVE_VARARGS_H) && !defined(HAVE_STDARG_H) #include <varargs.h> #else @@ -577,7 +578,8 @@ read_from_printer(int fd, char *buf, int bufsize, int quiet) status = read(fd, buf, bufsize - 1); if (status == 0 || (status < 0 && errno == EAGAIN)) { - usleep(2000); + struct timespec tm = {0, 2000000}; + nanosleep(&tm, &tm); status = 0; /* not an error (read would have blocked) */ } } diff --git a/src/gimp2/Makefile.in b/src/gimp2/Makefile.in index e91ae1d..e0bf142 100644 --- a/src/gimp2/Makefile.in +++ b/src/gimp2/Makefile.in @@ -190,6 +190,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/gutenprintui2/Makefile.in b/src/gutenprintui2/Makefile.in index 50b86f8..453273a 100644 --- a/src/gutenprintui2/Makefile.in +++ b/src/gutenprintui2/Makefile.in @@ -246,6 +246,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/gutenprintui2/plist.c b/src/gutenprintui2/plist.c index 577d549..bbc4eed 100644 --- a/src/gutenprintui2/plist.c +++ b/src/gutenprintui2/plist.c @@ -32,8 +32,10 @@ #include <ctype.h> #include <stdio.h> #include <string.h> +#include <strings.h> #include <errno.h> #include <locale.h> +#include <stdlib.h> #include <sys/types.h> #include <signal.h> diff --git a/src/main/Makefile.in b/src/main/Makefile.in index 47a0c41..1e89eb9 100644 --- a/src/main/Makefile.in +++ b/src/main/Makefile.in @@ -340,6 +340,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/main/canon-media-mode.h b/src/main/canon-media-mode.h index da2f9e3..b2b088e 100644 --- a/src/main/canon-media-mode.h +++ b/src/main/canon-media-mode.h @@ -186,6 +186,7 @@ DECLARE_MODEUSES(canon_BJC_240); /* ----------------------------------- Canon BJC 2000 ----------------------------------- */ /* TODO: mode-media correlation */ +/* static const char* canon_BJC_2000_modeuses_plain[] = { "360x360dpi", "180x180dpi", @@ -208,6 +209,58 @@ static const canon_modeuse_t canon_BJC_2000_modeuses[] = { }; DECLARE_MODEUSES(canon_BJC_2000); +*/ + +/* ----------------------------------- Canon BJC 2100 ----------------------------------- */ + +static const char* canon_BJC_2100_modeuses_plain[] = { + "360x360dmt_high", + "360x360dpi_high", + "360x360dpi", + "720x360dpi", + "360x360dpi_draft", + "180x180dpi", + /* Photo */ + "360x360dmt_photo", + NULL +}; + +static const char* canon_BJC_2100_modeuses_PPgloss[] = { + "360x360dmt_high", + "360x360dpi_high", + "360x360dpi", + /* Photo */ + "360x360dmt_photo", + NULL +}; + +static const char* canon_BJC_2100_modeuses_coated[] = { + "360x360dmt_high", + "360x360dpi_high", + "360x360dpi", + "720x360dpi", + "360x360dpi_draft", + /* Photo */ + "360x360dmt_photo", + NULL +}; + +static const canon_modeuse_t canon_BJC_2100_modeuses[] = { + { "Plain", canon_BJC_2100_modeuses_plain, INKSET_BLACK_SUPPORT | INKSET_PHOTO_SUPPORT | INKSET_PHOTO_MODEREPL }, + { "Transparency", canon_BJC_2100_modeuses_PPgloss, INKSET_BLACK_SUPPORT }, + { "BackPrint", canon_BJC_2100_modeuses_PPgloss, INKSET_BLACK_SUPPORT }, + { "Fabric", canon_BJC_2100_modeuses_PPgloss, INKSET_BLACK_SUPPORT }, + { "Envelope", canon_BJC_2100_modeuses_plain, INKSET_BLACK_SUPPORT | INKSET_PHOTO_SUPPORT | INKSET_PHOTO_MODEREPL }, + { "Coated", canon_BJC_2100_modeuses_coated, INKSET_BLACK_SUPPORT | INKSET_PHOTO_SUPPORT | INKSET_PHOTO_MODEREPL }, + { "TShirt", canon_BJC_2100_modeuses_PPgloss, INKSET_BLACK_SUPPORT }, + { "GlossyFilm", canon_BJC_2100_modeuses_PPgloss, INKSET_BLACK_SUPPORT }, + { "GlossyPaper", canon_BJC_2100_modeuses_PPgloss, INKSET_BLACK_SUPPORT | INKSET_PHOTO_SUPPORT | INKSET_PHOTO_MODEREPL }, + { "GlossyCard", canon_BJC_2100_modeuses_PPgloss, INKSET_BLACK_SUPPORT | INKSET_PHOTO_SUPPORT | INKSET_PHOTO_MODEREPL }, + { "GlossyPro", canon_BJC_2100_modeuses_PPgloss, INKSET_BLACK_SUPPORT | INKSET_PHOTO_SUPPORT | INKSET_PHOTO_MODEREPL },/*untested*/ + { "Other", canon_BJC_2100_modeuses_plain, INKSET_BLACK_SUPPORT | INKSET_PHOTO_SUPPORT | INKSET_PHOTO_MODEREPL }, +}; + +DECLARE_MODEUSES(canon_BJC_2100); /* ----------------------------------- Canon BJC 3000 ----------------------------------- */ diff --git a/src/main/canon-media.h b/src/main/canon-media.h index 2b37391..62c641e 100644 --- a/src/main/canon-media.h +++ b/src/main/canon-media.h @@ -311,6 +311,23 @@ static const canon_paper_t canon_default_papers[] = { /* }; DECLARE_PAPERS(canon_default); +static const canon_paper_t canon_BJC_2100_papers[] = { + /* Name Text (c (l (P (w Density k_upper lum_adj */ + { "Plain", N_ ("Plain Paper"), 0x00,0x00,0x00,0x00,0.50, 0.25, 0.500, 0, 0, 0 }, + { "Transparency", N_ ("Transparencies"), 0x02,0x02,0x00,0x00,1.00, 1.00, 0.900, 0, 0, 0 }, + { "BackPrint", N_ ("Back Print Film"), 0x03,0x03,0x00,0x00,1.00, 1.00, 0.900, 0, 0, 0 }, + { "Fabric", N_ ("Fabric Sheets"), 0x04,0x05,0x00,0x00,0.50, 0.25, 0.500, 0, 0, 0 }, + { "Envelope", N_ ("Envelope"), 0x08,0x08,0x00,0x00,0.50, 0.25, 0.500, 0, 0, 0 }, + { "Coated", N_ ("High Resolution Paper"), 0x07,0x0b,0x00,0x00,0.78, 0.25, 0.500, 0, 0, 0 }, + { "TShirt", N_ ("T-Shirt Transfers"), 0x03,0x03,0x00,0x00,0.50, 0.25, 0.500, 0, 0, 0 }, + { "GlossyFilm", N_ ("High Gloss Film"), 0x06,0x07,0x00,0x00,1.00, 1.00, 0.999, 0, 0, 0 }, + { "GlossyPaper", N_ ("Glossy Photo Paper"), 0x05,0x06,0x00,0x00,1.00, 1.00, 0.999, 0, 0, 0 }, + { "GlossyCard", N_ ("Glossy Photo Cards"), 0x05,0x0c,0x00,0x00,1.00, 1.00, 0.999, 0, 0, 0 }, + { "GlossyPro", N_ ("Photo Paper Pro"), 0x09,0x09,0x00,0x00,1.00, 1.00, 0.999, 0, 0, 0 }, + { "Other", N_ ("Other"), 0x01,0x09,0x00,0x00,0.50, 0.25, 0.500, 0, 0, 0 }, +}; +DECLARE_PAPERS(canon_BJC_2100); + static const canon_paper_t canon_PIXMA_iP4000_papers[] = { { "Plain", N_ ("Plain Paper"), 0x00,0x00,0x00,0x00,1.00, 0.25, 0.500, 0, 0, 0 }, { "Transparency", N_ ("Transparencies"), 0x02,0x02,0x00,0x00,0.78, 0.25, 0.500, 0, 0, 0 }, diff --git a/src/main/canon-modes.h b/src/main/canon-modes.h index bb9ed09..41bb12e 100644 --- a/src/main/canon-modes.h +++ b/src/main/canon-modes.h @@ -180,12 +180,29 @@ static const canon_mode_t canon_BJC_240_modes[] = { }; DECLARE_MODES(canon_BJC_240,0); - -static const canon_mode_t canon_BJC_2000_modes[] = { +/* BJC-2000 has same modes as BJC-2100, hence the below are outmoded */ +/* + * static const canon_mode_t canon_BJC_2000_modes[] = { { 360, 360,CANON_INK_CMYK,"360x360dpi",N_("360x360 DPI"),INKSET(4_C2M2Y2K2),8,0,NULL,1.0,1.0,NULL,NULL,NULL,2}, { 180, 180,CANON_INK_CMYK,"180x180dpi",N_("180x180 DPI"),INKSET(4_C2M2Y2K2),8,0,NULL,1.0,1.0,NULL,NULL,NULL,2}, }; DECLARE_MODES(canon_BJC_2000,0); +*/ + +/* these printers only have K and CMYK */ +/* using color (CMYK) cartridge, all media use CMYK */ +/* some modes use ESC (t 0x02 0x80 0x09 which implies bits per ink > 1, but how to know how many? guess 2 bits */ +/* added MODE_FLAG_PHOTO as a means to set ESC (t to 0x02 0x80 0x0a --- no idea if 1 bit or 2 bits here */ +static const canon_mode_t canon_BJC_2100_modes[] = { + { 360, 360,CANON_INK_K | CANON_INK_CMYK,"360x360dmt_high",N_("360x360 DMT HIGH (plain/Env/PPgloss/HR/HGF/GPC/TST/BPF/TPY/O)"),INKSET(4_C4M4Y4K4),8,0,NULL,1.0,1.0,NULL,NULL,NULL,1},/* 0x02 0x80 0x9 */ + { 360, 360,CANON_INK_K | CANON_INK_CMYK,"360x360dpi_high",N_("360x360 DPI (high legacy)"),INKSET(4_C2M2Y2K2),8,0,NULL,1.0,1.0,NULL,NULL,NULL,2}, + { 360, 360,CANON_INK_K | CANON_INK_CMYK,"360x360dpi",N_("360x360 DPI (plain ud2/PPgloss std/Env/HR/HGF/GPC/TST/BPF/TPY/O)"),INKSET(4_C2M2Y2K2),8,0,NULL,1.0,1.0,NULL,NULL,NULL,1}, + { 720, 360,CANON_INK_K | CANON_INK_CMYK,"720x360dpi",N_("720x360 DPI (plain ud3/Env/HR/O)"),INKSET(4_C2M2Y2K2),8,0,NULL,1.0,1.0,NULL,NULL,NULL,0}, + { 360, 360,CANON_INK_K | CANON_INK_CMYK,"360x360dpi_draft",N_("360x360 DPI DRAFT (plain std/Env/HR/O)"),INKSET(4_C2M2Y2K2),8,0,NULL,1.0,1.0,NULL,NULL,NULL,0}, + { 180, 180,CANON_INK_K | CANON_INK_CMYK,"180x180dpi",N_("180x180 DPI (plain fast/Env/O)"),INKSET(4_C2M2Y2K2),8,0,NULL,1.0,1.0,NULL,NULL,NULL,2}, + { 360, 360,CANON_INK_CMYK,"360x360dmt_photo",N_("360x360 DMT PHOTO CARTRIDGE"),INKSET(4_C4M4Y4K4),8,MODE_FLAG_PHOTO,NULL,1.0,1.0,NULL,NULL,NULL,1}, +}; +DECLARE_MODES(canon_BJC_2100,1); /* these printers only have CMYK, so CcMmYK is not required I think */ /* using color (CMYK) cartridge, some media use CMYK, others only use CMY --- need to check this as my test image lacked Y apparently */ @@ -207,7 +224,7 @@ DECLARE_MODES(canon_BJC_3000,1); /* some modes use ESC (t 0x2 0x80 0x9 which implies bits per ink > 1, but how to know how many? */ /* added MODE_FLAG_PHOTO as a means to set ESC (t */ static const canon_mode_t canon_BJC_4300_modes[] = { - { 760, 360,CANON_INK_K | CANON_INK_CMYK,"720x360dpi",N_("720x360 DPI"),INKSET(4_C4M4Y4K4),8,0,NULL,1.0,1.0,NULL,NULL,NULL,0}, + { 720, 360,CANON_INK_K | CANON_INK_CMYK,"720x360dpi",N_("720x360 DPI"),INKSET(4_C4M4Y4K4),8,0,NULL,1.0,1.0,NULL,NULL,NULL,0}, { 360, 360,CANON_INK_K | CANON_INK_CMYK,"360x360dpi_high",N_("360x360 DPI HIGH"),INKSET(4_C2M2Y2K2),8,0,NULL,1.0,1.0,NULL,NULL,NULL,1},/* different code */ { 360, 360,CANON_INK_K | CANON_INK_CMYK,"360x360dpi",N_("360x360 DPI"),INKSET(4_C2M2Y2K2),8,0,NULL,1.0,1.0,NULL,NULL,NULL,1}, { 360, 360,CANON_INK_K | CANON_INK_CMYK,"360x360dmt",N_("360x360 DMT"),INKSET(4_C4M4Y4K4),8,0,NULL,1.0,1.0,NULL,NULL,NULL,1}, diff --git a/src/main/canon-printers.h b/src/main/canon-printers.h index fae13b9..91bfaac 100644 --- a/src/main/canon-printers.h +++ b/src/main/canon-printers.h @@ -631,6 +631,25 @@ static const canon_cap_t canon_model_capabilities[] = NULL }, + { /* Canon BJC 2100 *//* heads: BC-20 (black), BC-21e (color/black), BC-22e (photo) (also IS-22 color scanner cartridge) */ + /* 720 (hor) x 360 dpi (vert) */ + "2100", 1, + 618, 980, /* 8.58" x 13.61" different per paper size, and banner (max 70") */ + 10, 10, 9, 20, /* for A4 from user manual */ + &canon_default_slotlist, + CANON_CAP_STD0 | CANON_CAP_a | CANON_CAP_cart,0, + 2,0, + 0, /* Upper/Lower Cassette option */ + NULL,/* only SetTime */ + &canon_BJC_2100_modelist, + &canon_BJC_2100_paperlist, + &canon_BJC_2100_modeuselist, + NULL, + NULL, + NULL, + NULL + }, + { /* Canon BJC 4300 *//* heads: BC-20 BC-21 BC-22 BC-29 */ "4300", 1, 618, 936, /* 8.58" x 13 " */ @@ -835,13 +854,13 @@ static const canon_cap_t canon_model_capabilities[] = 842, INCH(17), 11, 9, 10, 18, /* unconfirmed */ &canon_default_slotlist, - CANON_CAP_STD0 | CANON_CAP_a,0, + CANON_CAP_STD0 | CANON_CAP_a | CANON_CAP_cart,0, 2,0, 0, /* Upper/Lower Cassette option */ NULL, - &canon_BJC_2000_modelist, - &canon_default_paperlist, - &canon_BJC_2000_modeuselist, + &canon_BJC_2100_modelist, + &canon_BJC_2100_paperlist, + &canon_BJC_2100_modeuselist, NULL, NULL, NULL, diff --git a/src/main/curve.c b/src/main/curve.c index 8425c05..9c0795e 100644 --- a/src/main/curve.c +++ b/src/main/curve.c @@ -36,6 +36,7 @@ #include <unistd.h> #include <sys/types.h> #include <sys/stat.h> +#include <strings.h> #ifdef __GNUC__ #define inline __inline__ diff --git a/src/main/escp2-papers.c b/src/main/escp2-papers.c index c96d42f..5eebc49 100644 --- a/src/main/escp2-papers.c +++ b/src/main/escp2-papers.c @@ -26,6 +26,7 @@ #include <gutenprint/gutenprint.h> #include "gutenprint-internal.h" #include <gutenprint/gutenprint-intl-internal.h> +#include <strings.h> #include "print-escp2.h" static stp_mxml_node_t * diff --git a/src/main/print-canon.c b/src/main/print-canon.c index 6d27060..3a76c01 100644 --- a/src/main/print-canon.c +++ b/src/main/print-canon.c @@ -4942,7 +4942,7 @@ canon_init_setImage(const stp_vars_t *v, const canon_privdata_t *init) generic condition based on CANON_INK_CMY */ if (init->used_inks == CANON_INK_CMY) arg_74_3= 0x02; /* for BC-06 cartridge!!! */ /* example of better way: for BJC-3000 series */ - if (!strcmp(init->caps->name,"3000") || !strcmp(init->caps->name,"4300")) { + if ( !strcmp(init->caps->name,"3000") || !strcmp(init->caps->name,"4300")) { /* but if photo cartridge selection, set differently again */ if (init->mode->flags & MODE_FLAG_PHOTO) arg_74_3= 0x0a; @@ -4953,6 +4953,15 @@ canon_init_setImage(const stp_vars_t *v, const canon_privdata_t *init) /* other media */ arg_74_3= 0x09; /* return to default after broken code above */ } + if ( (!strcmp(init->caps->name,"2000")) || (!strcmp(init->caps->name,"2100")) ) { + /* but if photo cartridge selection, set differently again */ + if (init->mode->flags & MODE_FLAG_PHOTO) + arg_74_3= 0x0a; + else + /* other media */ + arg_74_3= 0x09; /* return to default after broken code above */ + } + } /* workaround for the bjc8200 in 6color mode - not really understood */ diff --git a/src/main/print-olympus.c b/src/main/print-olympus.c index 5af9d28..ad26726 100644 --- a/src/main/print-olympus.c +++ b/src/main/print-olympus.c @@ -232,9 +232,12 @@ typedef struct /* printer specific parameters */ const char *adj_yellow; const laminate_list_t *laminate; const dyesub_media_list_t *media; - const dyesub_stringlist_t *uiconstraints; void (*job_start_func)(stp_vars_t *); void (*job_end_func)(stp_vars_t *); + const stp_parameter_t *parameters; + int parameter_count; + int (*load_parameters)(const stp_vars_t *, const char *name, stp_parameter_t *); + void (*parse_parameters)(stp_vars_t *); } dyesub_cap_t; @@ -2279,7 +2282,7 @@ static void kodak_8500_printer_init(stp_vars_t *v) /* Number of copies */ stp_putc(0x1b, v); stp_putc(0x4e, v); - stp_putc(1, v); /* XXX always 1 for now, up to 50 */ + stp_putc(1, v); /* 1-50 */ dyesub_nputc(v, 0x00, 61); /* Paper type. Fixed. */ stp_putc(0x1b, v); @@ -2317,7 +2320,6 @@ static void kodak_8500_printer_init(stp_vars_t *v) stp_putc(0x47, v); dyesub_nputc(v, 0x00, 61); - /* Data header */ stp_putc(0x1b, v); stp_putc(0x5a, v); @@ -2382,7 +2384,7 @@ static void mitsu_cp3020d_printer_init(stp_vars_t *v) /* Number of copies */ stp_putc(0x1b, v); stp_putc(0x4e, v); - stp_putc(1, v); /* XXX always 1 for now, up to 50 */ + stp_putc(1, v); /* 1-50 */ dyesub_nputc(v, 0x00, 61); /* Unknown */ stp_putc(0x1b, v); @@ -2529,7 +2531,7 @@ static const dyesub_pagesize_t mitsu_cp9550_page[] = DYESUB_LANDSCAPE}, { "w288h432-div2", "2x6*2", PT(1416,346)+1, PT(2152,346)+1, 0, 0, 0, 0, DYESUB_LANDSCAPE}, - { "w360h504", "5x7", PT(1812,346)+1, PT(2402,346)+1, 0, 0, 0, 0, + { "w360h504", "5x7", PT(1812,346)+1, PT(2452,346)+1, 0, 0, 0, 0, DYESUB_PORTRAIT}, { "w432h576", "6x8", PT(2152,346)+1, PT(2792,346)+1, 0, 0, 0, 0, DYESUB_PORTRAIT}, @@ -2537,6 +2539,8 @@ static const dyesub_pagesize_t mitsu_cp9550_page[] = DYESUB_PORTRAIT}, { "w432h648", "6x9", PT(2152,346)+1, PT(3146,346)+1, 0, 0, 0, 0, DYESUB_PORTRAIT}, + /* XXX also 3.3x6 and 3.5x6! + XXX also 4x6*2, 4.4*6*2, 3x6*3, 2x6*4! (Built on 6x9 media) */ }; LIST(dyesub_pagesize_list_t, mitsu_cp9550_page_list, dyesub_pagesize_t, mitsu_cp9550_page); @@ -2546,7 +2550,7 @@ static const dyesub_printsize_t mitsu_cp9550_printsize[] = { "346x346", "B7", 1240, 1812}, { "346x346", "w288h432", 1416, 2152}, { "346x346", "w288h432-div2", 1416, 2152}, - { "346x346", "w360h504", 1812, 2402}, + { "346x346", "w360h504", 1812, 2452}, { "346x346", "w432h576", 2152, 2792}, { "346x346", "w432h612", 2152, 2956}, { "346x346", "w432h648", 2152, 3146}, @@ -2580,7 +2584,7 @@ static void mitsu_cp9550_printer_init(stp_vars_t *v) stp_putc(0x08, v); stp_putc(0x03, v); dyesub_nputc(v, 0x00, 19); - stp_putc(0x01, v); /* This is Copies on other models.. */ + stp_putc(0x01, v); /* Copies */ dyesub_nputc(v, 0x00, 2); if (strcmp(privdata.pagesize,"w288h432-div2") == 0) stp_putc(0x83, v); @@ -2622,6 +2626,101 @@ static void mitsu_cp9550_printer_end(stp_vars_t *v) stp_putc(0x00, v); } +/* Mitsubishi 9600D/DW */ +static const dyesub_resolution_t res_mitsu9600_dpi[] = +{ + { "300x300", 300, 300}, + { "600x600", 600, 600}, +}; + +LIST(dyesub_resolution_list_t, res_mitsu9600_dpi_list, dyesub_resolution_t, res_mitsu9600_dpi); + +static const dyesub_pagesize_t mitsu_cp9600_page[] = +{ + { "B7", "3.5x5", PT(1076,300)+1, PT(1572,300)+1, 0, 0, 0, 0, + DYESUB_LANDSCAPE}, + { "w288h432", "4x6", PT(1228,300)+1, PT(1868,300)+1, 0, 0, 0, 0, + DYESUB_LANDSCAPE}, + { "w360h504", "5x7", PT(1572,300)+1, PT(2128,300)+1, 0, 0, 0, 0, + DYESUB_PORTRAIT}, + { "w432h576", "6x8", PT(1868,300)+1, PT(2442,300)+1, 0, 0, 0, 0, + DYESUB_PORTRAIT}, + { "w432h612", "6x8.5", PT(1868,300)+1, PT(2564,300)+1, 0, 0, 0, 0, + DYESUB_PORTRAIT}, + { "w432h648", "6x9", PT(1868,300)+1, PT(2730,300)+1, 0, 0, 0, 0, + DYESUB_PORTRAIT}, +}; + +LIST(dyesub_pagesize_list_t, mitsu_cp9600_page_list, dyesub_pagesize_t, mitsu_cp9600_page); + +static const dyesub_printsize_t mitsu_cp9600_printsize[] = +{ + { "300x300", "B7", 1076, 1572}, + { "600x600", "B7", 2152, 3144}, + { "300x300", "w288h432", 1228, 1868}, + { "600x600", "w288h432", 2458, 3736}, + { "300x300", "w360h504", 1572, 2128}, + { "600x600", "w360h504", 3144, 4256}, + { "300x300", "w432h576", 1868, 2442}, + { "600x600", "w432h576", 3736, 4846}, + { "300x300", "w432h612", 1868, 2564}, + { "600x600", "w432h612", 3736, 5130}, + { "300x300", "w432h648", 1868, 2730}, + { "600x600", "w432h648", 3736, 5462}, +}; + +LIST(dyesub_printsize_list_t, mitsu_cp9600_printsize_list, dyesub_printsize_t, mitsu_cp9600_printsize); + +static void mitsu_cp9600_printer_init(stp_vars_t *v) +{ + /* Parameters 1 */ + stp_putc(0x1b, v); + stp_putc(0x57, v); + stp_putc(0x21, v); + stp_putc(0x2e, v); + stp_putc(0x00, v); + stp_putc(0x80, v); + stp_putc(0x00, v); + stp_putc(0x22, v); + stp_putc(0x00, v); + stp_putc(0x03, v); + dyesub_nputc(v, 0x00, 19); + stp_putc(0x01, v); /* Copies */ + dyesub_nputc(v, 0x00, 19); + stp_putc(0x01, v); + /* Parameters 2 */ + stp_putc(0x1b, v); + stp_putc(0x57, v); + stp_putc(0x20, v); + stp_putc(0x2e, v); + stp_putc(0x00, v); + stp_putc(0x0a, v); + stp_putc(0x10, v); + dyesub_nputc(v, 0x00, 7); + stp_put16_be(privdata.w_size, v); + stp_put16_be(privdata.h_size, v); + dyesub_nputc(v, 0x00, 32); + /* Parameters 3 */ + stp_putc(0x1b, v); + stp_putc(0x57, v); + stp_putc(0x26, v); + stp_putc(0x2e, v); + stp_putc(0x00, v); + stp_putc(0x60, v); + dyesub_nputc(v, 0x00, 6); + stp_putc(0x01, v); + dyesub_nputc(v, 0x00, 37); +} + +static void mitsu_cp9600_printer_end(stp_vars_t *v) +{ + /* Page Footer */ + stp_putc(0x1b, v); + stp_putc(0x50, v); + stp_putc(0x48, v); + stp_putc(0x00, v); +} + /* Mitsubishi 9810D/DW */ static const dyesub_pagesize_t mitsu_cp9810_page[] = { @@ -2805,8 +2904,100 @@ static const laminate_t mitsu_cpd70x_laminate[] = LIST(laminate_list_t, mitsu_cpd70x_laminate_list, laminate_t, mitsu_cpd70x_laminate); +/* This list is *not* translated */ +static const dyesub_stringitem_t mitsu70x_uiconstraints[] = { + /* PPD generation handles constraint reciprocation */ + /* Basically, exclude Matte and "Fine" quality */ + {"UIConstraints", "*StpLaminate Matte *StpPrintSpeed Fine"}, +}; +LIST(dyesub_stringlist_t, mitsu70x_uiconstraints_list, dyesub_stringitem_t, mitsu70x_uiconstraints); + +typedef struct +{ + const char *quality; + int laminate_offset; +} mitsu70x_privdata_t; + +static mitsu70x_privdata_t mitsu70x_privdata; + +static const dyesub_stringitem_t mitsu70x_qualities[] = +{ + { "Fine", N_ ("Fine") }, + { "SuperFine", N_ ("Super Fine") }, + { "UltraFine", N_ ("Ultra Fine") } +}; +LIST(dyesub_stringlist_t, mitsu70x_quality_list, dyesub_stringitem_t, mitsu70x_qualities); + +static const stp_parameter_t mitsu70x_parameters[] = +{ + { + "PrintSpeed", N_("Print Speed"), "Color=No,Category=Advanced Printer Setup", + N_("Print Speed"), + STP_PARAMETER_TYPE_STRING_LIST, STP_PARAMETER_CLASS_FEATURE, + STP_PARAMETER_LEVEL_BASIC, 1, 1, STP_CHANNEL_NONE, 1, 0 + }, +}; +#define mitsu70x_parameter_count (sizeof(mitsu70x_parameters) / sizeof(const stp_parameter_t)) + +static int +mitsu70x_load_parameters(const stp_vars_t *v, const char *name, + stp_parameter_t *description) +{ + int i; + const dyesub_cap_t *caps = dyesub_get_model_capabilities( + stp_get_model_id(v)); + + if (caps->parameter_count && caps->parameters) + { + for (i = 0; i < caps->parameter_count; i++) + if (strcmp(name, caps->parameters[i].name) == 0) + { + stp_fill_parameter_settings(description, &(caps->parameters[i])); + break; + } + } + + if (strcmp(name, "PrintSpeed") == 0) + { + description->bounds.str = stp_string_list_create(); + + const dyesub_stringlist_t *mlist = &mitsu70x_quality_list; + for (i = 0; i < mlist->n_items; i++) + { + const dyesub_stringitem_t *m = &(mlist->item[i]); + stp_string_list_add_string(description->bounds.str, + m->name, m->text); /* Do *not* want this translated, otherwise use gettext(m->text) */ + } + description->deflt.str = stp_string_list_param(description->bounds.str, 0)->name; + description->is_active = 1; + } + else + { + return 0; + } + return 1; +} + +static void mitsu70x_parse_parameters(stp_vars_t *v) +{ + mitsu70x_privdata.quality = stp_get_string_parameter(v, "PrintSpeed"); +} + static void mitsu_cpd70k60_printer_init(stp_vars_t *v, unsigned char model) { + int quality; + + /* Parse options */ + if (strcmp(mitsu70x_privdata.quality, "SuperFine") == 0) { + quality = 3; + } else if (strcmp(mitsu70x_privdata.quality, "UltraFine") == 0) { + quality = 4; + } else if (strcmp(mitsu70x_privdata.quality, "Fine") == 0) { + quality = 0; + } else { + quality = 0; + } + /* Printer wakeup */ stp_putc(0x1b, v); stp_putc(0x45, v); @@ -2818,30 +3009,32 @@ static void mitsu_cpd70k60_printer_init(stp_vars_t *v, unsigned char model) stp_putc(0x1b, v); stp_putc(0x5a, v); stp_putc(0x54, v); - stp_putc(model, v); /* k60 == x02, 305 == x90, d70x == x01 */ + stp_putc(model, v); /* k60 == x02, 305 == x90, d70x/d80 == x01 */ dyesub_nputc(v, 0x00, 12); stp_put16_be(privdata.w_size, v); stp_put16_be(privdata.h_size, v); if (*((const char*)((privdata.laminate->seq).data)) != 0x00) { - /* Laminate a slightly larger boundary in Matte mode */ stp_put16_be(privdata.w_size, v); - stp_put16_be(privdata.h_size + 12, v); if (model == 0x02 || model == 0x90) { - stp_putc(0x04, v); /* Matte Lamination forces UltraFine on K60 or K305 */ + mitsu70x_privdata.laminate_offset = 0; + quality = 4; /* Matte Lamination forces UltraFine on K60 or K305 */ } else { - stp_putc(0x03, v); /* Matte Lamination forces Superfine (or UltraFine) */ + /* Laminate a slightly larger boundary in Matte mode */ + mitsu70x_privdata.laminate_offset = 12; + quality = 3; /* Matte Lamination forces Superfine (or UltraFine) */ } + stp_put16_be(privdata.h_size + mitsu70x_privdata.laminate_offset, v); } else { /* Glossy lamination here */ stp_put16_be(0, v); - stp_put16_be(0, v); - stp_putc(0x00, v); /* ...and just use fine mode. XXX (optional?) */ + stp_put16_be(0, v); } + stp_putc(quality, v); dyesub_nputc(v, 0x00, 7); if (model != 0x01) { - stp_putc(0x00, v); /* D70x: 0x00 Auto deck selection, 0x01 for Lower, 0x02 for Upper */ + stp_putc(0x00, v); /* D70x: 0x00 Auto deck selection, 0x01 for Lower, 0x02 for Upper. */ } else { stp_putc(0x01, v); /* All others have a single "lower" deck */ } @@ -2852,7 +3045,7 @@ static void mitsu_cpd70k60_printer_init(stp_vars_t *v, unsigned char model) (privdata.laminate->seq).bytes, v); /* Lamination mode */ dyesub_nputc(v, 0x00, 6); - /* Multi-cut controlx */ + /* Multi-cut control */ if (strcmp(privdata.pagesize,"w432h576-div2") == 0) { stp_putc(0x01, v); } else if (strcmp(privdata.pagesize,"w360h504-div2") == 0) { @@ -2869,7 +3062,7 @@ static void mitsu_cpd70k60_printer_init(stp_vars_t *v, unsigned char model) static void mitsu_cpd70x_printer_init(stp_vars_t *v) { - mitsu_cpd70k60_printer_init(v, 0x01); + mitsu_cpd70k60_printer_init(v, 0x01); } static void mitsu_cpd70x_printer_end(stp_vars_t *v) @@ -2877,54 +3070,32 @@ static void mitsu_cpd70x_printer_end(stp_vars_t *v) /* If Matte lamination is enabled, generate a lamination plane */ if (*((const char*)((privdata.laminate->seq).data)) != 0x00) { - /* The Windows drivers generate a lamination pattern consisting of - three values: 0xe84b, 0x286a, 0x6c22 */ - - int r, c; - unsigned long seed = 1; - - /* Now generate lamination pattern */ - for (c = 0 ; c < privdata.w_size ; c++) { - for (r = 0 ; r < privdata.h_size + 12 ; r++) { - int i = xrand(&seed) & 0x3f; - if (i < 42) - stp_put16_be(0xe84b, v); - else if (i < 62) - stp_put16_be(0x286a, v); - else - stp_put16_be(0x6c22, v); - } - } - /* Pad up to a 512-byte block */ - dyesub_nputc(v, 0x00, 512 - ((privdata.w_size * (privdata.h_size + 12) * 2) % 512)); - } -} - -static void mitsu_cpk60_printer_end(stp_vars_t *v) -{ - /* If Matte lamination is enabled, generate a lamination plane */ - if (*((const char*)((privdata.laminate->seq).data)) != 0x00) { - - /* The Windows drivers generate a lamination pattern consisting of - three values: 0x9d00, 0x6500, 0x2900 */ - int r, c; unsigned long seed = 1; /* Now generate lamination pattern */ for (c = 0 ; c < privdata.w_size ; c++) { - for (r = 0 ; r < privdata.h_size + 12 ; r++) { + for (r = 0 ; r < privdata.h_size + mitsu70x_privdata.laminate_offset ; r++) { int i = xrand(&seed) & 0x3f; - if (i < 42) - stp_put16_be(0x9d00, v); - else if (i < 62) - stp_put16_be(0x2900, v); - else - stp_put16_be(0x6500, v); + if (mitsu70x_privdata.laminate_offset) { /* D70x uses 0x384b, 0x286a, 0x6c22 */ + if (i < 42) + stp_put16_be(0xe84b, v); + else if (i < 62) + stp_put16_be(0x286a, v); + else + stp_put16_be(0x6c22, v); + } else { /* K60 and EK305 use 0x9d00, 0x6500, 0x2900 */ + if (i < 42) + stp_put16_be(0x9d00, v); + else if (i < 62) + stp_put16_be(0x2900, v); + else + stp_put16_be(0x6500, v); + } } } /* Pad up to a 512-byte block */ - dyesub_nputc(v, 0x00, 512 - ((privdata.w_size * (privdata.h_size + 12) * 2) % 512)); + dyesub_nputc(v, 0x00, 512 - ((privdata.w_size * (privdata.h_size + mitsu70x_privdata.laminate_offset) * 2) % 512)); } } @@ -2977,6 +3148,53 @@ static void mitsu_cpk60_printer_init(stp_vars_t *v) mitsu_cpd70k60_printer_init(v, 0x02); } +/* Identical to the D70 except for one fewer quality mode */ +static const dyesub_stringitem_t mitsu_k60_qualities[] = +{ + { "Fine", N_ ("Fine") }, + { "UltraFine", N_ ("Ultra Fine") } +}; +LIST(dyesub_stringlist_t, mitsu_k60_quality_list, dyesub_stringitem_t, mitsu_k60_qualities); + +static int +mitsu_k60_load_parameters(const stp_vars_t *v, const char *name, + stp_parameter_t *description) +{ + int i; + const dyesub_cap_t *caps = dyesub_get_model_capabilities( + stp_get_model_id(v)); + + if (caps->parameter_count && caps->parameters) + { + for (i = 0; i < caps->parameter_count; i++) + if (strcmp(name, caps->parameters[i].name) == 0) + { + stp_fill_parameter_settings(description, &(caps->parameters[i])); + break; + } + } + + if (strcmp(name, "PrintSpeed") == 0) + { + description->bounds.str = stp_string_list_create(); + + const dyesub_stringlist_t *mlist = &mitsu_k60_quality_list; + for (i = 0; i < mlist->n_items; i++) + { + const dyesub_stringitem_t *m = &(mlist->item[i]); + stp_string_list_add_string(description->bounds.str, + m->name, m->text); /* Do *not* want this translated, otherwise use gettext(m->text) */ + } + description->deflt.str = stp_string_list_param(description->bounds.str, 0)->name; + description->is_active = 1; + } + else + { + return 0; + } + return 1; +} + static const dyesub_pagesize_t mitsu_cpd80_page[] = { { "w288h432", "4x6", PT(1228,300)+1, PT(1864,300)+1, 0, 0, 0, 0, @@ -3010,7 +3228,6 @@ static const dyesub_printsize_t mitsu_cpd80_printsize[] = LIST(dyesub_printsize_list_t, mitsu_cpd80_printsize_list, dyesub_printsize_t, mitsu_cpd80_printsize); - /* Kodak 305 */ static const dyesub_pagesize_t kodak305_page[] = { @@ -3427,10 +3644,10 @@ static void shinko_chcs1245_printer_init(stp_vars_t *v) ((const unsigned char*)(privdata.laminate->seq).data)[0] == 0x03) { stp_put32_le(0x07fffffff, v); /* Glossy */ } else { - stp_put32_le(0x0, v); /* XXX -25>0>+25 */ + stp_put32_le(0x0, v); /* XXX matte intensity -25>0>+25 */ } - stp_put32_le(0x00, v); /* XXX 0x00 printer default, 0x02 for "dust removal" on, 0x01 for off. */ + stp_put32_le(0x00, v); /* XXX "dust removal mode" -- 0x00 printer default, 0x02 on, 0x01 for off. */ stp_put32_le(privdata.w_size, v); /* Columns */ stp_put32_le(privdata.h_size, v); /* Rows */ stp_put32_le(0x01, v); /* Copies */ @@ -3987,31 +4204,12 @@ static const dyesub_media_t dnpds80dx_medias[] = LIST(dyesub_media_list_t, dnpds80dx_media_list, dyesub_media_t, dnpds80dx_medias); -/* This list is *not* translated */ -static const dyesub_stringitem_t dnpds80dx_uiconstraints[] = -{ - /* PPD generation handles constraint reciprocation */ - {"UIConstraints", "*Duplex *MediaType Roll"}, - {"UIConstraints", "*PageSize A4 *MediaType Sheet"}, - {"UIConstraints", "*PageSize w576h792-w576h432_w576h360 *MediaType Sheet"}, - {"UIConstraints", "*PageSize w576h648-w576h360_w576h288 *MediaType Sheet"}, - {"UIConstraints", "*PageSize c8x10-w576h432_w576h288 *MediaType Sheet"}, - {"UIConstraints", "*PageSize w576h864-w576h576_w576h288 *MediaType Sheet"}, - {"UIConstraints", "*PageSize w576h864-div3 *MediaType Sheet"}, - {"UIConstraints", "*PageSize w576h864-div3sheet *MediaType Roll"}, - {"UIConstraints", "*PageSize w576h774-w576h756 *MediaType Roll"}, - {"UIConstraints", "*PageSize w576h774 *MediaType Roll"}, -}; - -LIST(dyesub_stringlist_t, dnpds80dx_uiconstraints_list, dyesub_stringitem_t, dnpds80dx_uiconstraints); - /* This is the same as the DS80, except with 10.5" and 10.75" sizes only meant for sheet media. Duplex is *only* supported on sheet media. Also, 8x4*3 differs depending on if you're using sheet or roll media, hence the almost-duplicated definition. - See the constraints list for the illegal combinations */ static const dyesub_pagesize_t dnpds80dx_page[] = @@ -4458,8 +4656,9 @@ static const dyesub_cap_t dyesub_model_capabilities[] = NULL, NULL, &p10_block_init_func, NULL, NULL, NULL, NULL, /* color profile/adjustment is built into printer */ - &p10_laminate_list, NULL, NULL, + &p10_laminate_list, NULL, NULL, NULL, + NULL, 0, NULL, NULL, }, { /* Olympus P-200 */ 4, @@ -4474,8 +4673,9 @@ static const dyesub_cap_t dyesub_model_capabilities[] = &p200_plane_init_func, NULL, NULL, NULL, p200_adj_any, p200_adj_any, p200_adj_any, - NULL, NULL, NULL, NULL, NULL, + NULL, NULL, + NULL, 0, NULL, NULL, }, { /* Olympus P-300 */ 0, @@ -4490,8 +4690,9 @@ static const dyesub_cap_t dyesub_model_capabilities[] = NULL, &p300_plane_end_func, &p300_block_init_func, NULL, p300_adj_cyan, p300_adj_magenta, p300_adj_yellow, - NULL, NULL, NULL, + NULL, NULL, NULL, NULL, + NULL, 0, NULL, NULL, }, { /* Olympus P-400 */ 1, @@ -4506,8 +4707,9 @@ static const dyesub_cap_t dyesub_model_capabilities[] = &p400_plane_init_func, &p400_plane_end_func, &p400_block_init_func, NULL, p400_adj_cyan, p400_adj_magenta, p400_adj_yellow, - NULL, NULL, NULL, NULL, NULL, + NULL, NULL, + NULL, 0, NULL, NULL, }, { /* Olympus P-440 */ 3, @@ -4521,8 +4723,9 @@ static const dyesub_cap_t dyesub_model_capabilities[] = NULL, NULL, &p440_block_init_func, &p440_block_end_func, NULL, NULL, NULL, /* color profile/adjustment is built into printer */ - &p10_laminate_list, NULL, NULL, + &p10_laminate_list, NULL, NULL, NULL, + NULL, 0, NULL, NULL, }, { /* Olympus P-S100 */ 20, @@ -4536,8 +4739,9 @@ static const dyesub_cap_t dyesub_model_capabilities[] = NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* color profile/adjustment is built into printer */ - NULL, NULL, NULL, NULL, NULL, + NULL, NULL, + NULL, 0, NULL, NULL, }, { /* Canon CP-10 */ 1002, @@ -4553,8 +4757,9 @@ static const dyesub_cap_t dyesub_model_capabilities[] = &cpx00_plane_init_func, NULL, NULL, NULL, cpx00_adj_cyan, cpx00_adj_magenta, cpx00_adj_yellow, - NULL, NULL, NULL, NULL, NULL, + NULL, NULL, + NULL, 0, NULL, NULL, }, { /* Canon CP-100, CP-200, CP-300 */ 1000, @@ -4570,8 +4775,9 @@ static const dyesub_cap_t dyesub_model_capabilities[] = &cpx00_plane_init_func, NULL, NULL, NULL, cpx00_adj_cyan, cpx00_adj_magenta, cpx00_adj_yellow, - NULL, NULL, NULL, NULL, NULL, + NULL, NULL, + NULL, 0, NULL, NULL, }, { /* Canon CP-220, CP-330, SELPHY CP400, SELPHY CP500, SELPHY CP510, SELPHY CP520, SELPHY CP530, SELPHY CP600, SELPHY CP710, @@ -4590,8 +4796,9 @@ static const dyesub_cap_t dyesub_model_capabilities[] = &cpx00_plane_init_func, NULL, NULL, NULL, cpx00_adj_cyan, cpx00_adj_magenta, cpx00_adj_yellow, - NULL, NULL, NULL, NULL, NULL, + NULL, NULL, + NULL, 0, NULL, NULL, }, { /* Canon SELPHY ES1 */ 1003, @@ -4607,8 +4814,9 @@ static const dyesub_cap_t dyesub_model_capabilities[] = &es1_plane_init_func, NULL, NULL, NULL, cpx00_adj_cyan, cpx00_adj_magenta, cpx00_adj_yellow, - NULL, NULL, NULL, NULL, NULL, + NULL, NULL, + NULL, 0, NULL, NULL, }, { /* Canon SELPHY ES2, SELPHY ES20 */ 1005, @@ -4624,8 +4832,9 @@ static const dyesub_cap_t dyesub_model_capabilities[] = &es2_plane_init_func, NULL, NULL, NULL, cpx00_adj_cyan, cpx00_adj_magenta, cpx00_adj_yellow, - NULL, NULL, NULL, NULL, NULL, + NULL, NULL, + NULL, 0, NULL, NULL, }, { /* Canon SELPHY ES3, SELPHY ES30 */ 1006, @@ -4641,8 +4850,9 @@ static const dyesub_cap_t dyesub_model_capabilities[] = &es2_plane_init_func, NULL, NULL, NULL, cpx00_adj_cyan, cpx00_adj_magenta, cpx00_adj_yellow, - NULL, NULL, NULL, NULL, NULL, + NULL, NULL, + NULL, 0, NULL, NULL, }, { /* Canon SELPHY ES40 */ 1007, @@ -4658,8 +4868,9 @@ static const dyesub_cap_t dyesub_model_capabilities[] = &es2_plane_init_func, NULL, NULL, NULL, cpx00_adj_cyan, cpx00_adj_magenta, cpx00_adj_yellow, - NULL, NULL, NULL, NULL, NULL, + NULL, NULL, + NULL, 0, NULL, NULL, }, { /* Canon SELPHY CP790 */ 1008, @@ -4675,8 +4886,9 @@ static const dyesub_cap_t dyesub_model_capabilities[] = &es2_plane_init_func, NULL, NULL, NULL, cpx00_adj_cyan, cpx00_adj_magenta, cpx00_adj_yellow, - NULL, NULL, NULL, NULL, NULL, + NULL, NULL, + NULL, 0, NULL, NULL, }, { /* Canon SELPHY CP800 */ 1009, @@ -4692,8 +4904,9 @@ static const dyesub_cap_t dyesub_model_capabilities[] = &cpx00_plane_init_func, NULL, NULL, NULL, cpx00_adj_cyan, cpx00_adj_magenta, cpx00_adj_yellow, - NULL, NULL, NULL, NULL, NULL, + NULL, NULL, + NULL, 0, NULL, NULL, }, { /* Canon SELPHY CP900 */ 1010, @@ -4709,8 +4922,9 @@ static const dyesub_cap_t dyesub_model_capabilities[] = &cpx00_plane_init_func, NULL, NULL, NULL, cpx00_adj_cyan, cpx00_adj_magenta, cpx00_adj_yellow, - NULL, NULL, NULL, NULL, NULL, + NULL, NULL, + NULL, 0, NULL, NULL, }, { /* Canon CP820, CP910 */ 1011, @@ -4726,8 +4940,9 @@ static const dyesub_cap_t dyesub_model_capabilities[] = NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* Printer handles color correction! */ - NULL, NULL, NULL, NULL, NULL, + NULL, NULL, + NULL, 0, NULL, NULL, }, { /* Sony UP-DP10 */ 2000, @@ -4742,8 +4957,9 @@ static const dyesub_cap_t dyesub_model_capabilities[] = NULL, NULL, NULL, NULL, updp10_adj_cyan, updp10_adj_magenta, updp10_adj_yellow, - &updp10_laminate_list, NULL, NULL, + &updp10_laminate_list, NULL, NULL, NULL, + NULL, 0, NULL, NULL, }, { /* Sony UP-DR150 */ 2001, @@ -4757,8 +4973,9 @@ static const dyesub_cap_t dyesub_model_capabilities[] = NULL, NULL, NULL, NULL, NULL, NULL, NULL, - &updp10_laminate_list, NULL, NULL, + &updp10_laminate_list, NULL, NULL, NULL, + NULL, 0, NULL, NULL, }, { /* Sony DPP-EX5, DPP-EX7 */ 2002, @@ -4773,8 +4990,9 @@ static const dyesub_cap_t dyesub_model_capabilities[] = NULL, NULL, &dppex5_block_init, NULL, NULL, NULL, NULL, - &dppex5_laminate_list, NULL, NULL, + &dppex5_laminate_list, NULL, NULL, NULL, + NULL, 0, NULL, NULL, }, { /* Sony UP-DR100 */ 2003, @@ -4788,8 +5006,9 @@ static const dyesub_cap_t dyesub_model_capabilities[] = NULL, NULL, NULL, NULL, NULL, NULL, NULL, - &updr100_laminate_list, NULL, NULL, + &updr100_laminate_list, NULL, NULL, NULL, + NULL, 0, NULL, NULL, }, { /* Sony UP-DR200 */ 2004, @@ -4803,8 +5022,9 @@ static const dyesub_cap_t dyesub_model_capabilities[] = NULL, NULL, NULL, NULL, NULL, NULL, NULL, - &updr200_laminate_list, NULL, NULL, + &updr200_laminate_list, NULL, NULL, NULL, + NULL, 0, NULL, NULL, }, { /* Sony UP-CR10L / DNP SL10 */ 2005, @@ -4818,8 +5038,9 @@ static const dyesub_cap_t dyesub_model_capabilities[] = NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, + NULL, NULL, + NULL, 0, NULL, NULL, }, { /* Fujifilm Printpix CX-400 */ 3000, @@ -4834,8 +5055,9 @@ static const dyesub_cap_t dyesub_model_capabilities[] = NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* color profile/adjustment is built into printer */ - NULL, NULL, NULL, NULL, NULL, + NULL, NULL, + NULL, 0, NULL, NULL, }, { /* Fujifilm Printpix CX-550 */ 3001, @@ -4850,8 +5072,9 @@ static const dyesub_cap_t dyesub_model_capabilities[] = NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* color profile/adjustment is built into printer */ - NULL, NULL, NULL, NULL, NULL, + NULL, NULL, + NULL, 0, NULL, NULL, }, { /* Fujifilm FinePix NX-500 */ 3002, @@ -4865,8 +5088,9 @@ static const dyesub_cap_t dyesub_model_capabilities[] = NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* color profile/adjustment is built into printer */ - NULL, NULL, NULL, NULL, NULL, + NULL, NULL, + NULL, 0, NULL, NULL, }, { /* Kodak Easyshare Dock family */ 4000, @@ -4881,8 +5105,9 @@ static const dyesub_cap_t dyesub_model_capabilities[] = &kodak_dock_plane_init, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, + NULL, NULL, + NULL, 0, NULL, NULL, }, { /* Kodak Photo Printer 6800 */ 4001, @@ -4896,8 +5121,9 @@ static const dyesub_cap_t dyesub_model_capabilities[] = NULL, NULL, /* No plane funcs */ NULL, NULL, /* No block funcs */ NULL, NULL, NULL, /* color profile/adjustment is built into printer */ - &kodak_6800_laminate_list, NULL, NULL, + &kodak_6800_laminate_list, NULL, NULL, NULL, + NULL, 0, NULL, NULL, }, { /* Kodak Photo Printer 6850 */ 4002, @@ -4911,8 +5137,9 @@ static const dyesub_cap_t dyesub_model_capabilities[] = NULL, NULL, /* No plane funcs */ NULL, NULL, /* No block funcs */ NULL, NULL, NULL, /* color profile/adjustment is built into printer */ - &kodak_6800_laminate_list, NULL, NULL, + &kodak_6800_laminate_list, NULL, NULL, NULL, + NULL, 0, NULL, NULL, }, { /* Kodak Photo Printer 605 */ 4003, @@ -4926,8 +5153,9 @@ static const dyesub_cap_t dyesub_model_capabilities[] = NULL, NULL, /* No plane funcs */ NULL, NULL, /* No block funcs */ NULL, NULL, NULL, /* color profile/adjustment is built into printer */ - &kodak_605_laminate_list, NULL, NULL, + &kodak_605_laminate_list, NULL, NULL, NULL, + NULL, 0, NULL, NULL, }, { /* Kodak Professional 1400 */ 4004, @@ -4943,8 +5171,9 @@ static const dyesub_cap_t dyesub_model_capabilities[] = NULL, NULL, NULL, NULL, NULL, NULL, NULL, - &kodak_6800_laminate_list, &kodak_1400_media_list, NULL, + &kodak_6800_laminate_list, &kodak_1400_media_list, NULL, NULL, + NULL, 0, NULL, NULL, }, { /* Kodak Photo Printer 805 */ 4005, @@ -4960,8 +5189,9 @@ static const dyesub_cap_t dyesub_model_capabilities[] = NULL, NULL, /* No plane funcs */ NULL, NULL, /* No block funcs */ NULL, NULL, NULL, /* color profile/adjustment is built into printer */ - &kodak_6800_laminate_list, NULL, NULL, + &kodak_6800_laminate_list, NULL, NULL, NULL, + NULL, 0, NULL, NULL, }, { /* Kodak Professional 9810 */ 4006, @@ -4976,8 +5206,9 @@ static const dyesub_cap_t dyesub_model_capabilities[] = &kodak_9810_plane_init, NULL, NULL, NULL, /* No block funcs */ NULL, NULL, NULL, /* color profile/adjustment is built into printer */ - &kodak_9810_laminate_list, NULL, NULL, + &kodak_9810_laminate_list, NULL, NULL, NULL, + NULL, 0, NULL, NULL, }, { /* Kodak 8810 */ 4007, @@ -4992,8 +5223,9 @@ static const dyesub_cap_t dyesub_model_capabilities[] = NULL, NULL, NULL, NULL, /* No block funcs */ NULL, NULL, NULL, /* color profile/adjustment is built into printer */ - &kodak_8810_laminate_list, NULL, NULL, + &kodak_8810_laminate_list, NULL, NULL, NULL, + NULL, 0, NULL, NULL, }, { /* Kodak 7000/7010 */ 4008, @@ -5008,8 +5240,9 @@ static const dyesub_cap_t dyesub_model_capabilities[] = NULL, NULL, NULL, NULL, /* No block funcs */ NULL, NULL, NULL, /* color profile/adjustment is built into printer */ - &kodak_7000_laminate_list, NULL, NULL, + &kodak_7000_laminate_list, NULL, NULL, NULL, + NULL, 0, NULL, NULL, }, { /* Kodak 7015 */ 4009, @@ -5024,8 +5257,9 @@ static const dyesub_cap_t dyesub_model_capabilities[] = NULL, NULL, NULL, NULL, /* No block funcs */ NULL, NULL, NULL, /* color profile/adjustment is built into printer */ - &kodak_7000_laminate_list, NULL, NULL, + &kodak_7000_laminate_list, NULL, NULL, NULL, + NULL, 0, NULL, NULL, }, { /* Kodak Professional 8500 */ 4100, @@ -5039,8 +5273,9 @@ static const dyesub_cap_t dyesub_model_capabilities[] = NULL, NULL, /* No plane funcs */ NULL, NULL, /* No block funcs */ NULL, NULL, NULL, /* color profile/adjustment is built into printer */ - &kodak_8500_laminate_list, &kodak_8500_media_list, NULL, + &kodak_8500_laminate_list, &kodak_8500_media_list, NULL, NULL, + NULL, 0, NULL, NULL, }, { /* Mitsubishi CP3020D/DU/DE */ 4101, @@ -5055,8 +5290,9 @@ static const dyesub_cap_t dyesub_model_capabilities[] = &mitsu_cp3020d_plane_init, &mitsu_cp3020d_plane_end, NULL, NULL, /* No block funcs */ NULL, NULL, NULL, /* color profile/adjustment is built into printer */ - NULL, NULL, NULL, NULL, NULL, + NULL, NULL, + NULL, 0, NULL, NULL, }, { /* Mitsubishi CP3020DA/DAE */ 4102, @@ -5071,8 +5307,9 @@ static const dyesub_cap_t dyesub_model_capabilities[] = &mitsu_cp3020da_plane_init, NULL, NULL, NULL, /* No block funcs */ NULL, NULL, NULL, /* color profile/adjustment is built into printer */ - NULL, NULL, NULL, NULL, NULL, + NULL, NULL, + NULL, 0, NULL, NULL, }, { /* Mitsubishi CP9550D */ 4103, @@ -5087,8 +5324,9 @@ static const dyesub_cap_t dyesub_model_capabilities[] = &mitsu_cp3020da_plane_init, NULL, NULL, NULL, /* No block funcs */ NULL, NULL, NULL, /* color profile/adjustment is built into printer */ - NULL, NULL, NULL, NULL, NULL, + NULL, NULL, + NULL, 0, NULL, NULL, }, { /* Mitsubishi CP9810D */ 4104, @@ -5104,8 +5342,9 @@ static const dyesub_cap_t dyesub_model_capabilities[] = &mitsu_cp3020da_plane_init, NULL, NULL, NULL, /* No block funcs */ NULL, NULL, NULL, /* color profile/adjustment is built into printer */ - &mitsu_cp9810_laminate_list, NULL, NULL, + &mitsu_cp9810_laminate_list, NULL, NULL, NULL, + NULL, 0, NULL, NULL, }, { /* Mitsubishi CPD70D/CPD707D */ 4105, @@ -5121,8 +5360,12 @@ static const dyesub_cap_t dyesub_model_capabilities[] = NULL, &mitsu_cpd70x_plane_end, NULL, NULL, /* No block funcs */ NULL, NULL, NULL, /* color profile/adjustment is built into printer */ - &mitsu_cpd70x_laminate_list, NULL, NULL, + &mitsu_cpd70x_laminate_list, NULL, NULL, NULL, + mitsu70x_parameters, + mitsu70x_parameter_count, + mitsu70x_load_parameters, + mitsu70x_parse_parameters, }, { /* Mitsubishi CPK60D */ 4106, @@ -5134,12 +5377,16 @@ static const dyesub_cap_t dyesub_model_capabilities[] = DYESUB_FEATURE_FULL_WIDTH | DYESUB_FEATURE_FULL_HEIGHT | DYESUB_FEATURE_PLANE_INTERLACE | DYESUB_FEATURE_16BPP | DYESUB_FEATURE_BIGENDIAN, - &mitsu_cpk60_printer_init, &mitsu_cpk60_printer_end, + &mitsu_cpk60_printer_init, &mitsu_cpd70x_printer_end, NULL, &mitsu_cpd70x_plane_end, NULL, NULL, /* No block funcs */ NULL, NULL, NULL, /* color profile/adjustment is built into printer */ - &mitsu_cpd70x_laminate_list, NULL, NULL, + &mitsu_cpd70x_laminate_list, NULL, NULL, NULL, + mitsu70x_parameters, + mitsu70x_parameter_count, + mitsu_k60_load_parameters, + mitsu70x_parse_parameters, }, { /* Mitsubishi CPD80D */ 4107, @@ -5155,8 +5402,12 @@ static const dyesub_cap_t dyesub_model_capabilities[] = NULL, &mitsu_cpd70x_plane_end, NULL, NULL, /* No block funcs */ NULL, NULL, NULL, /* color profile/adjustment is built into printer */ - &mitsu_cpd70x_laminate_list, NULL, NULL, + &mitsu_cpd70x_laminate_list, NULL, NULL, NULL, + mitsu70x_parameters, + mitsu70x_parameter_count, + mitsu70x_load_parameters, + mitsu70x_parse_parameters, }, { /* Kodak 305 */ 4108, @@ -5168,12 +5419,16 @@ static const dyesub_cap_t dyesub_model_capabilities[] = DYESUB_FEATURE_FULL_WIDTH | DYESUB_FEATURE_FULL_HEIGHT | DYESUB_FEATURE_PLANE_INTERLACE | DYESUB_FEATURE_16BPP | DYESUB_FEATURE_BIGENDIAN, - &kodak305_printer_init, &mitsu_cpk60_printer_end, + &kodak305_printer_init, &mitsu_cpd70x_printer_end, NULL, &mitsu_cpd70x_plane_end, NULL, NULL, /* No block funcs */ NULL, NULL, NULL, /* color profile/adjustment is built into printer */ - &mitsu_cpd70x_laminate_list, NULL, NULL, + &mitsu_cpd70x_laminate_list, NULL, NULL, NULL, + mitsu70x_parameters, + mitsu70x_parameter_count, + mitsu_k60_load_parameters, + mitsu70x_parse_parameters, }, { /* Mitsubishi CPD90D */ 4109, @@ -5187,8 +5442,43 @@ static const dyesub_cap_t dyesub_model_capabilities[] = NULL, NULL, NULL, NULL, /* No block funcs */ NULL, NULL, NULL, /* color profile/adjustment is built into printer */ - &mitsu_cpd70x_laminate_list, NULL, NULL, + &mitsu_cpd70x_laminate_list, NULL, + NULL, NULL, + NULL, 0, NULL, NULL, + }, + { /* Mitsubishi CP9600D */ + 4110, + &bgr_ink_list, + &res_mitsu9600_dpi_list, + &mitsu_cp9600_page_list, + &mitsu_cp9600_printsize_list, + SHRT_MAX, + DYESUB_FEATURE_FULL_WIDTH | DYESUB_FEATURE_FULL_HEIGHT + | DYESUB_FEATURE_PLANE_INTERLACE, + &mitsu_cp9600_printer_init, &mitsu_cp9600_printer_end, + &mitsu_cp3020da_plane_init, NULL, + NULL, NULL, /* No block funcs */ + NULL, NULL, NULL, /* color profile/adjustment is built into printer */ + NULL, NULL, + NULL, NULL, + NULL, 0, NULL, NULL, + }, + { /* Mitsubishi CP9550DW-S */ + 4111, + &rgb_ink_list, /* Identical to 9550D except it's rgb instead of bgr */ + &res_346dpi_list, + &mitsu_cp9550_page_list, + &mitsu_cp9550_printsize_list, + SHRT_MAX, + DYESUB_FEATURE_FULL_WIDTH | DYESUB_FEATURE_FULL_HEIGHT + | DYESUB_FEATURE_PLANE_INTERLACE, + &mitsu_cp9550_printer_init, &mitsu_cp9550_printer_end, + &mitsu_cp3020da_plane_init, NULL, + NULL, NULL, /* No block funcs */ + NULL, NULL, NULL, /* color profile/adjustment is built into printer */ NULL, NULL, + NULL, NULL, + NULL, 0, NULL, NULL, }, { /* Shinko CHC-S9045 (experimental) */ 5000, @@ -5202,8 +5492,9 @@ static const dyesub_cap_t dyesub_model_capabilities[] = NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, + NULL, NULL, NULL, NULL, + NULL, 0, NULL, NULL, }, { /* Shinko/Sinfonia CHC-S2145 */ 5001, @@ -5217,8 +5508,9 @@ static const dyesub_cap_t dyesub_model_capabilities[] = NULL, NULL, /* No planes */ NULL, NULL, /* No blocks */ NULL, NULL, NULL, /* Color correction in printer */ - &shinko_chcs2145_laminate_list, NULL, NULL, + &shinko_chcs2145_laminate_list, NULL, NULL, NULL, + NULL, 0, NULL, NULL, }, { /* Shinko/Sinfonia CHC-S1245 */ 5002, @@ -5232,7 +5524,9 @@ static const dyesub_cap_t dyesub_model_capabilities[] = NULL, NULL, /* No planes */ NULL, NULL, /* No blocks */ NULL, NULL, NULL, /* Color correction in printer */ - &shinko_chcs1245_laminate_list, NULL, NULL, + &shinko_chcs1245_laminate_list, NULL, + NULL, NULL, + NULL, 0, NULL, NULL, }, { /* Shinko/Sinfonia CHC-S6245 */ 5003, @@ -5246,8 +5540,9 @@ static const dyesub_cap_t dyesub_model_capabilities[] = NULL, NULL, /* No planes */ NULL, NULL, /* No blocks */ NULL, NULL, NULL, /* Color correction in printer */ - &shinko_chcs6245_laminate_list, NULL, NULL, + &shinko_chcs6245_laminate_list, NULL, NULL, NULL, + NULL, 0, NULL, NULL, }, { /* Shinko/Sinfonia CHC-S6145 */ 5004, @@ -5261,8 +5556,9 @@ static const dyesub_cap_t dyesub_model_capabilities[] = NULL, NULL, /* No planes */ NULL, NULL, /* No blocks */ NULL, NULL, NULL, /* Color correction in printer */ - &shinko_chcs6145_laminate_list, NULL, NULL, + &shinko_chcs6145_laminate_list, NULL, NULL, NULL, + NULL, 0, NULL, NULL, }, { /* CIAAT Brava 21 (aka CHC-S6145D) */ 5005, @@ -5276,8 +5572,9 @@ static const dyesub_cap_t dyesub_model_capabilities[] = NULL, NULL, /* No planes */ NULL, NULL, /* No blocks */ NULL, NULL, NULL, /* Color correction in printer */ - &shinko_chcs6145_laminate_list, NULL, NULL, + &shinko_chcs6145_laminate_list, NULL, NULL, NULL, + NULL, 0, NULL, NULL, }, { /* Dai Nippon Printing DS40 */ 6000, @@ -5292,8 +5589,9 @@ static const dyesub_cap_t dyesub_model_capabilities[] = &dnpds40_plane_init, NULL, NULL, NULL, NULL, NULL, NULL, - &dnpds40_laminate_list, NULL, NULL, + &dnpds40_laminate_list, NULL, NULL, NULL, + NULL, 0, NULL, NULL, }, { /* Dai Nippon Printing DS80 */ 6001, @@ -5308,8 +5606,9 @@ static const dyesub_cap_t dyesub_model_capabilities[] = &dnpds40_plane_init, NULL, NULL, NULL, NULL, NULL, NULL, - &dnpds40_laminate_list, NULL, NULL, + &dnpds40_laminate_list, NULL, NULL, NULL, + NULL, 0, NULL, NULL, }, { /* Dai Nippon Printing DSRX1 */ 6002, @@ -5324,8 +5623,9 @@ static const dyesub_cap_t dyesub_model_capabilities[] = &dnpds40_plane_init, NULL, NULL, NULL, NULL, NULL, NULL, - &dnpds40_laminate_list, NULL, NULL, + &dnpds40_laminate_list, NULL, NULL, NULL, + NULL, 0, NULL, NULL, }, { /* Dai Nippon Printing DS620 */ 6003, @@ -5340,8 +5640,9 @@ static const dyesub_cap_t dyesub_model_capabilities[] = &dnpds40_plane_init, NULL, NULL, NULL, NULL, NULL, NULL, - &dnpds620_laminate_list, NULL, NULL, + &dnpds620_laminate_list, NULL, NULL, NULL, + NULL, 0, NULL, NULL, }, { /* Citizen CW-01 */ 6005, @@ -5356,8 +5657,9 @@ static const dyesub_cap_t dyesub_model_capabilities[] = &citizen_cw01_plane_init, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, + NULL, NULL, NULL, NULL, + NULL, 0, NULL, NULL, }, { /* Dai Nippon Printing DS80DX */ 6006, @@ -5372,8 +5674,9 @@ static const dyesub_cap_t dyesub_model_capabilities[] = &dnpds40_plane_init, NULL, NULL, NULL, NULL, NULL, NULL, - &dnpds40_laminate_list, &dnpds80dx_media_list, &dnpds80dx_uiconstraints_list, + &dnpds40_laminate_list, &dnpds80dx_media_list, NULL, NULL, + NULL, 0, NULL, NULL, }, }; @@ -5443,12 +5746,6 @@ static const stp_parameter_t the_parameters[] = STP_PARAMETER_TYPE_STRING_LIST, STP_PARAMETER_CLASS_FEATURE, STP_PARAMETER_LEVEL_BASIC, 1, 1, STP_CHANNEL_NONE, 1, 0 }, - { - "PPDUIConstraints", N_("PPD User Interface Constraints"), "Color=No,Category=Advanced Printer Functionality", - N_("PPD UIConstraints List"), - STP_PARAMETER_TYPE_STRING_LIST, STP_PARAMETER_CLASS_FEATURE, - STP_PARAMETER_LEVEL_INTERNAL, 0, 0, STP_CHANNEL_NONE, 0, 1 - }, }; static int the_parameter_count = @@ -5602,6 +5899,8 @@ dyesub_feature(const dyesub_cap_t *caps, int feature) static stp_parameter_list_t dyesub_list_parameters(const stp_vars_t *v) { + const dyesub_cap_t *caps = dyesub_get_model_capabilities(stp_get_model_id(v)); + stp_parameter_list_t *ret = stp_parameter_list_create(); int i; @@ -5609,6 +5908,10 @@ dyesub_list_parameters(const stp_vars_t *v) stp_parameter_list_add_param(ret, &(the_parameters[i])); for (i = 0; i < float_parameter_count; i++) stp_parameter_list_add_param(ret, &(float_parameters[i].param)); + if (caps->parameter_count && caps->parameters) + for (i = 0; i < caps->parameter_count ; i++) + stp_parameter_list_add_param(ret, &(caps->parameters[i])); + return ret; } @@ -5641,6 +5944,12 @@ dyesub_parameters(const stp_vars_t *v, const char *name, stp_fill_parameter_settings(description, &(the_parameters[i])); break; } + if (caps->load_parameters) /* do *NOT* use dyesub_exec() here */ + { + if (caps->load_parameters(v, name, description)) + return; /* Ie parameter handled */ + } + if (strcmp(name, "PageSize") == 0) { int default_specified = 0; @@ -5746,24 +6055,6 @@ dyesub_parameters(const stp_vars_t *v, const char *name, description->deflt.str = stp_string_list_param(description->bounds.str, 0)->name; } - else if (strcmp(name, "PPDUIConstraints") == 0) - { - description->bounds.str = stp_string_list_create(); - if (caps->uiconstraints) { - const dyesub_stringlist_t *mlist = caps->uiconstraints; - for (i = 0; i < mlist->n_items; i++) - { - const dyesub_stringitem_t *m = &(mlist->item[i]); - stp_string_list_add_string(description->bounds.str, - m->name, m->text); /* Do *not* want this translated */ - } - description->deflt.str = - stp_string_list_param(description->bounds.str, 0)->name; - description->is_active = 1; - } else { - description->is_active = 0; - } - } else if (strcmp(name, "Duplex") == 0) { int offer_duplex=0; @@ -5782,7 +6073,7 @@ dyesub_parameters(const stp_vars_t *v, const char *name, else offer_duplex=1; - if (offer_duplex && (caps->features & DYESUB_FEATURE_DUPLEX)) + if (offer_duplex && dyesub_feature(caps, DYESUB_FEATURE_DUPLEX)) { description->deflt.str = duplex_types[0].name; for (i=0; i < NUM_DUPLEX; i++) @@ -6329,6 +6620,9 @@ dyesub_do_print(stp_vars_t *v, stp_image_t *image) stp_describe_resolution(v, &w_dpi, &h_dpi); dyesub_printsize(v, &max_print_px_width, &max_print_px_height); + /* Parse any per-printer parameters */ + dyesub_exec(v, caps->parse_parameters, "caps->parse_parameters"); + /* Duplex processing -- Rotate even pages for DuplexNoTumble */ privdata.duplex_mode = stp_get_string_parameter(v, "Duplex"); privdata.page_number = stp_get_int_parameter(v, "PageNumber"); @@ -6426,7 +6720,7 @@ dyesub_do_print(stp_vars_t *v, stp_image_t *image) pv.byteswap = !dyesub_feature(caps, DYESUB_FEATURE_BIGENDIAN); #else #error "Unable to determine endianness, aborting compilation!" -#endif +#endif } pv.image_data = dyesub_read_image(v, &pv, image); diff --git a/src/main/print-ps.c b/src/main/print-ps.c index 3596e01..6a4a85f 100644 --- a/src/main/print-ps.c +++ b/src/main/print-ps.c @@ -39,6 +39,7 @@ #endif #include <stdio.h> #include <unistd.h> +#include <strings.h> #include "xmlppd.h" #ifdef _MSC_VER diff --git a/src/main/xmlppd.c b/src/main/xmlppd.c index 0ee9dc9..27bd6b8 100644 --- a/src/main/xmlppd.c +++ b/src/main/xmlppd.c @@ -26,6 +26,7 @@ #include <gutenprint/util.h> #include <gutenprint/string-list.h> #include <stdlib.h> +#include <strings.h> #include "xmlppd.h" typedef struct diff --git a/src/testpattern/Makefile.am b/src/testpattern/Makefile.am index b02ac4a..8e3089d 100644 --- a/src/testpattern/Makefile.am +++ b/src/testpattern/Makefile.am @@ -33,7 +33,7 @@ TESTS = run-testpattern-1 run-testpattern-2 if BUILD_TESTPATTERN bin_PROGRAMS = testpattern noinst_PROGRAMS = printers printer_options -noinst_SCRIPTS = run-testpattern-2 compare-checksums +noinst_SCRIPTS = run-testpattern-2 compare-checksums compress-checksums uncompress-checksums endif AM_LFLAGS = -i @@ -55,10 +55,25 @@ if INSTALL_SAMPLES pkgdata_DATA = testpattern.sample extended.sample endif +## Generate checksums + +if BUILD_TESTPATTERN +checksums: testpattern run-testpattern-2 ./compress-checksums + $(MKDIR_P) Checksums + ./run-testpattern-2 -q -M Checksums/sums.@GUTENPRINT_VERSION@.in + ./compress-checksums < Checksums/sums.@GUTENPRINT_VERSION@.in |$(BZIP2) -c > Checksums/sums.@GUTENPRINT_VERSION@.bz2 + rm -f Checksums/sums.@GUTENPRINT_VERSION@.in +endif ## Clean MAINTAINERCLEANFILES = Makefile.in testpatternl.c testpatterny.c testpatterny.h -EXTRA_DIST = testpatterny.h $(pkgdata_DATA) run-testpattern run-testpattern-1 compare-checksums.in - +EXTRA_DIST = \ + testpatterny.h \ + $(pkgdata_DATA) \ + run-testpattern \ + run-testpattern-1 \ + compare-checksums.in \ + compress-checksums.in \ + uncompress-checksums.in diff --git a/src/testpattern/Makefile.in b/src/testpattern/Makefile.in index 9003446..9b44a91 100644 --- a/src/testpattern/Makefile.in +++ b/src/testpattern/Makefile.in @@ -86,8 +86,9 @@ build_triplet = @build@ host_triplet = @host@ DIST_COMMON = $(top_srcdir)/scripts/global.mk $(srcdir)/Makefile.in \ $(srcdir)/Makefile.am $(srcdir)/run-testpattern-2.in \ - $(srcdir)/compare-checksums.in testpatterny.h testpatterny.c \ - testpatternl.c $(top_srcdir)/scripts/depcomp \ + $(srcdir)/compare-checksums.in $(srcdir)/compress-checksums.in \ + $(srcdir)/uncompress-checksums.in testpatterny.h \ + testpatterny.c testpatternl.c $(top_srcdir)/scripts/depcomp \ $(top_srcdir)/scripts/ylwrap $(top_srcdir)/scripts/test-driver @BUILD_TESTPATTERN_TRUE@bin_PROGRAMS = testpattern$(EXEEXT) @BUILD_TESTPATTERN_TRUE@noinst_PROGRAMS = printers$(EXEEXT) \ @@ -108,7 +109,8 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h -CONFIG_CLEAN_FILES = run-testpattern-2 compare-checksums +CONFIG_CLEAN_FILES = run-testpattern-2 compare-checksums \ + compress-checksums uncompress-checksums CONFIG_CLEAN_VPATH_FILES = am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(pkgdatadir)" PROGRAMS = $(bin_PROGRAMS) $(noinst_PROGRAMS) @@ -424,6 +426,7 @@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BUILD_CUPS_PPDS = @BUILD_CUPS_PPDS@ +BZIP2 = @BZIP2@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ @@ -631,7 +634,7 @@ top_srcdir = @top_srcdir@ AM_CPPFLAGS = -I$(top_srcdir)/include -I$(top_builddir)/include $(LOCAL_CPPFLAGS) $(GNUCFLAGS) GUTENPRINTUI_LIBS = $(top_builddir)/src/gutenprintui/libgutenprintui.la TESTS = run-testpattern-1 run-testpattern-2 -@BUILD_TESTPATTERN_TRUE@noinst_SCRIPTS = run-testpattern-2 compare-checksums +@BUILD_TESTPATTERN_TRUE@noinst_SCRIPTS = run-testpattern-2 compare-checksums compress-checksums uncompress-checksums AM_LFLAGS = -i AM_YFLAGS = -d testpattern_SOURCES = testpattern.c testpatterny.y testpatternl.l testpattern.h @@ -640,7 +643,15 @@ printers_LDADD = $(GUTENPRINT_LIBS) printer_options_LDADD = $(GUTENPRINT_LIBS) @INSTALL_SAMPLES_TRUE@pkgdata_DATA = testpattern.sample extended.sample MAINTAINERCLEANFILES = Makefile.in testpatternl.c testpatterny.c testpatterny.h -EXTRA_DIST = testpatterny.h $(pkgdata_DATA) run-testpattern run-testpattern-1 compare-checksums.in +EXTRA_DIST = \ + testpatterny.h \ + $(pkgdata_DATA) \ + run-testpattern \ + run-testpattern-1 \ + compare-checksums.in \ + compress-checksums.in \ + uncompress-checksums.in + all: all-am .SUFFIXES: @@ -680,6 +691,10 @@ run-testpattern-2: $(top_builddir)/config.status $(srcdir)/run-testpattern-2.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ compare-checksums: $(top_builddir)/config.status $(srcdir)/compare-checksums.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ +compress-checksums: $(top_builddir)/config.status $(srcdir)/compress-checksums.in + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ +uncompress-checksums: $(top_builddir)/config.status $(srcdir)/uncompress-checksums.in + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ @@ -1226,6 +1241,12 @@ $(top_builddir)/src/gutenprintui2/libgutenprintui2.la: testpatternl.o: testpatterny.o testpattern.o: testpatterny.o +@BUILD_TESTPATTERN_TRUE@checksums: testpattern run-testpattern-2 ./compress-checksums +@BUILD_TESTPATTERN_TRUE@ $(MKDIR_P) Checksums +@BUILD_TESTPATTERN_TRUE@ ./run-testpattern-2 -q -M Checksums/sums.@GUTENPRINT_VERSION@.in +@BUILD_TESTPATTERN_TRUE@ ./compress-checksums < Checksums/sums.@GUTENPRINT_VERSION@.in |$(BZIP2) -c > Checksums/sums.@GUTENPRINT_VERSION@.bz2 +@BUILD_TESTPATTERN_TRUE@ rm -f Checksums/sums.@GUTENPRINT_VERSION@.in + # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: diff --git a/src/testpattern/compare-checksums.in b/src/testpattern/compare-checksums.in index c27ffdf..1d7e1ea 100755 --- a/src/testpattern/compare-checksums.in +++ b/src/testpattern/compare-checksums.in @@ -1,4 +1,19 @@ #!@PERL@ +## Copyright (C) 2016 Robert Krawitz +## +## This program is free software; you can redistribute it and/or modify +## it under the terms of the GNU General Public License as published by +## the Free Software Foundation; either version 2, or (at your option) +## any later version. +## +## This program is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU General Public License for more details. +## +## You should have received a copy of the GNU General Public License +## along with this program; if not, write to the Free Software +## Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. use strict; @@ -14,9 +29,6 @@ if ($#ARGV != 1) { die "Usage: $0 old_checksum_file new_checksum_file\n"; } -open(OLD, $ARGV[0]) or die("Can't open old checksum file $ARGV[0]: $!\n"); -open(NEW, $ARGV[1]) or die("Can't open new checksum file $ARGV[1]: $!\n"); - sub get_printer($) { my ($mode) = @_; $mode =~ s/_PrintingMode.*//; @@ -29,25 +41,53 @@ sub get_mode($) { return $mode; } -while (<OLD>) { - chomp; - my ($sum, $mode) = split(/ +[*]?/); - $mode =~ s/\.prn$//; - $old_modes{$mode} = $sum; - my ($printer) = get_printer($mode); - $old_printers{$printer} = 1; +sub load_file($\%\%) { + my ($file, $modes, $printers) = @_; + if ($file =~ /\.bz2$/) { + open(IN, "bunzip2 -c $file|") or die("Can't open checksum file $file: $!\n"); + } elsif ($file =~ /.gz$/) { + open(IN, "gunzip -c $file|") or die("Can't open checksum file $file: $!\n"); + } else { + open(IN, "$file") or die("Can't open checksum file $file: $!\n"); + } + my ($inline); + while ($inline = <IN>) { + chomp $inline; + my ($sum, @okeys) = split(/ /, $inline); + my @keys = map { + s/\.prn$//; + s/^\*//; + $_; + } @okeys; + my (@pchunks) = (); + foreach my $k (@keys) { + $k =~ s/=/________/g; + $k =~ s/!/_______/g; + $k =~ s/"/______/g; + $k =~ s/,/_____/g; + $k =~ s/'/____/g; + $k =~ s/%/___/g; + $k =~ s/>/__/g; + my (@chunks) = split(/_/, $k, -1); + foreach my $i (0..$#chunks) { + if ($chunks[$i] eq '') { + $chunks[$i] = $pchunks[$i]; + } elsif ($chunks[$i] =~ /^([0-9]+)\+(.*)/) { + $chunks[$i] = substr($pchunks[$i], 0, $1) . $2; + } + } + my ($val) = join('_', @chunks); + $val =~ s/(^[^:]*)_:(.*)/$2_$1/; + $$modes{$val} = $sum; + $$printers{get_printer($val)} = 1; + @pchunks = @chunks; + } + } + close IN; } -close OLD; - -while (<NEW>) { - chomp; - my ($sum, $mode) = split(/ +[*]?/); - $mode =~ s/\.prn$//; - $new_modes{$mode} = $sum; - my ($printer) = get_printer($mode); - $new_printers{$printer} = 1; -} +load_file($ARGV[0], %old_modes, %old_printers); +load_file($ARGV[1], %new_modes, %new_printers); my (%only_old_printers, %only_new_printers); diff --git a/src/testpattern/compress-checksums.in b/src/testpattern/compress-checksums.in new file mode 100644 index 0000000..5ecfee3 --- /dev/null +++ b/src/testpattern/compress-checksums.in @@ -0,0 +1,121 @@ +#!@PERL@ +## Copyright (C) 2016 Robert Krawitz +## +## This program is free software; you can redistribute it and/or modify +## it under the terms of the GNU General Public License as published by +## the Free Software Foundation; either version 2, or (at your option) +## any later version. +## +## This program is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU General Public License for more details. +## +## You should have received a copy of the GNU General Public License +## along with this program; if not, write to the Free Software +## Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +use strict; + +my (%checksums); + +while (<>) { + chomp; + my ($sum, @keys) = split; + my (@pchunks) = (); + foreach my $k (@keys) { + my (@chunks) = split(/_/, $k, -1); + foreach my $i (0..$#chunks) { + if ($chunks[$i] eq '') { + $chunks[$i] = $pchunks[$i]; + } elsif ($chunks[$i] =~ /^([0-9]+)\+(.*)/) { + $chunks[$i] = substr($pchunks[$i], 0, $1) . $2; + } + } + my $key = join('_', @chunks), '.prn'; + if (! defined $checksums{$sum}) { + $checksums{$sum} = []; + } + push @{$checksums{$sum}}, $key; + } +} + +sub min($$) { + my ($a, $b) = @_; + if ($a < $b) { + return $a; + } else { + return $b; + } +} + +sub get_printer($) { + my ($mode) = @_; + $mode =~ s/_PrintingMode.*//; + return $mode; +} + +sub get_mode($) { + my ($mode) = @_; + $mode =~ s/.*_PrintingMode/PrintingMode/; + return $mode; +} + +foreach my $sum (sort keys %checksums) { + my ($out) = $sum; + my ($prun) = ""; + my (@pchunks) = (); + my ($plen) = 0; + my (@runs) = sort map { + s/^\*//; + s/\.prn$//; + my ($printer) = get_printer($_); + my ($mode) = get_mode($_); + "${mode}_:$printer" + } @{$checksums{$sum}}; + foreach my $run (@runs) { + my (@chunks) = split(/_/, $run); + my ($mchunks) = min(scalar @pchunks, scalar @chunks); + my ($i) = 0; + $out .= " "; + while ($i < $mchunks) { + if ($i > 0) { + $out .= '_'; + } + if ($chunks[$i] ne $pchunks[$i]) { + my ($plen) = length $pchunks[$i]; + my ($len) = length $chunks[$i]; + my ($maxc) = min($len, $plen); + my ($dup) = 0; + while ($dup < $maxc) { + last if (substr($pchunks[$i], $dup, 1) ne + substr($chunks[$i], $dup, 1)); + $dup++; + } + if ($dup > 2) { + $out .= "$dup+" . substr($chunks[$i], $dup); + } else { + $out .= "$chunks[$i]"; + } + } else { + $out .= ""; + } + $i++; + } + if ($i < scalar @chunks) { + if ($i > 0) { + $out .= '_'; + } + $out .= join("_", @chunks[$i..$#chunks]); + } + $out =~ s/________/=/g; + $out =~ s/_______/!/g; + $out =~ s/______/"/g; + $out =~ s/_____/,/g; + $out =~ s/____/'/g; + $out =~ s/___/%/g; + $out =~ s/__/>/g; + @pchunks = @chunks; + } + print "$out\n"; +} diff --git a/src/testpattern/run-testpattern-2.in b/src/testpattern/run-testpattern-2.in index 48d84d2..8df73b8 100644 --- a/src/testpattern/run-testpattern-2.in +++ b/src/testpattern/run-testpattern-2.in @@ -8,6 +8,7 @@ use strict; my $valgrind = 0; my $callgrind = 0; my $gdb_attach = 0; +my $compress_checksums = 0; my $csum_file = undef; my $csum_dir = undef; my $csum_type = 'sha512'; diff --git a/src/testpattern/testpatternl.c b/src/testpattern/testpatternl.c index 3a6e90e..c042918 100644 --- a/src/testpattern/testpatternl.c +++ b/src/testpattern/testpatternl.c @@ -804,7 +804,7 @@ c_strstrip(char *s) return sn; } else - return strdup(s); + return stp_strdup(s); } #define DBG(x) \ diff --git a/src/testpattern/testpatternl.l b/src/testpattern/testpatternl.l index 21f1530..a340ce6 100644 --- a/src/testpattern/testpatternl.l +++ b/src/testpattern/testpatternl.l @@ -52,7 +52,7 @@ c_strstrip(char *s) return sn; } else - return strdup(s); + return stp_strdup(s); } #define DBG(x) \ diff --git a/src/testpattern/testpatterny.c b/src/testpattern/testpatterny.c index 47bd3bf..da90dcc 100644 --- a/src/testpattern/testpatterny.c +++ b/src/testpattern/testpatterny.c @@ -71,6 +71,7 @@ #endif #include <string.h> +#include <strings.h> #include <stdio.h> #include <stdlib.h> #include "testpattern.h" @@ -131,7 +132,7 @@ find_color(const char *name) /* Line 371 of yacc.c */ -#line 135 "testpatterny.c" +#line 136 "testpatterny.c" # ifndef YY_NULL # if defined __cplusplus && 201103L <= __cplusplus @@ -292,7 +293,7 @@ int yyparse (); /* Copy the second part of user declarations. */ /* Line 390 of yacc.c */ -#line 296 "testpatterny.c" +#line 297 "testpatterny.c" #ifdef short # undef short @@ -628,20 +629,20 @@ static const yytype_int8 yyrhs[] = /* YYRLINE[YYN] -- source line where rule number YYN was defined. */ static const yytype_uint16 yyrline[] = { - 0, 143, 143, 143, 148, 158, 168, 178, 188, 198, - 208, 218, 218, 218, 218, 218, 218, 218, 221, 229, - 229, 232, 235, 245, 254, 264, 273, 280, 287, 294, - 303, 312, 321, 321, 324, 334, 343, 352, 361, 375, - 375, 375, 375, 375, 377, 384, 391, 398, 405, 412, - 419, 426, 426, 426, 426, 428, 430, 437, 444, 452, - 460, 475, 475, 478, 478, 481, 484, 498, 511, 511, - 514, 514, 517, 517, 520, 520, 523, 538, 541, 556, - 567, 584, 591, 591, 594, 597, 607, 613, 613, 616, - 620, 624, 624, 624, 624, 624, 624, 625, 625, 625, - 625, 625, 625, 625, 626, 626, 626, 626, 626, 626, - 627, 627, 627, 627, 630, 634, 634, 634, 634, 637, - 641, 641, 644, 648, 648, 651, 651, 654, 654, 659, - 658 + 0, 144, 144, 144, 149, 159, 169, 179, 189, 199, + 209, 219, 219, 219, 219, 219, 219, 219, 222, 230, + 230, 233, 236, 246, 255, 265, 274, 281, 288, 295, + 304, 313, 322, 322, 325, 335, 344, 353, 362, 376, + 376, 376, 376, 376, 378, 385, 392, 399, 406, 413, + 420, 427, 427, 427, 427, 429, 431, 438, 445, 453, + 461, 476, 476, 479, 479, 482, 485, 499, 512, 512, + 515, 515, 518, 518, 521, 521, 524, 539, 542, 557, + 568, 585, 592, 592, 595, 598, 608, 614, 614, 617, + 621, 625, 625, 625, 625, 625, 625, 626, 626, 626, + 626, 626, 626, 626, 627, 627, 627, 627, 627, 627, + 628, 628, 628, 628, 631, 635, 635, 635, 635, 638, + 642, 642, 645, 649, 649, 652, 652, 655, 655, 660, + 659 }; #endif @@ -1682,14 +1683,14 @@ yyreduce: { case 3: /* Line 1792 of yacc.c */ -#line 144 "testpatterny.y" +#line 145 "testpatterny.y" { } break; case 4: /* Line 1792 of yacc.c */ -#line 149 "testpatterny.y" +#line 150 "testpatterny.y" { if (getenv("STP_TESTPATTERN_DEBUG")) fprintf(stderr, ">>>cmykspec\n"); @@ -1701,7 +1702,7 @@ yyreduce: case 5: /* Line 1792 of yacc.c */ -#line 159 "testpatterny.y" +#line 160 "testpatterny.y" { if (getenv("STP_TESTPATTERN_DEBUG")) fprintf(stderr, ">>>kcmyspec\n"); @@ -1713,7 +1714,7 @@ yyreduce: case 6: /* Line 1792 of yacc.c */ -#line 169 "testpatterny.y" +#line 170 "testpatterny.y" { if (getenv("STP_TESTPATTERN_DEBUG")) fprintf(stderr, ">>>rgbspec\n"); @@ -1725,7 +1726,7 @@ yyreduce: case 7: /* Line 1792 of yacc.c */ -#line 179 "testpatterny.y" +#line 180 "testpatterny.y" { if (getenv("STP_TESTPATTERN_DEBUG")) fprintf(stderr, ">>>cmyspec\n"); @@ -1737,7 +1738,7 @@ yyreduce: case 8: /* Line 1792 of yacc.c */ -#line 189 "testpatterny.y" +#line 190 "testpatterny.y" { if (getenv("STP_TESTPATTERN_DEBUG")) fprintf(stderr, ">>>grayspec\n"); @@ -1749,7 +1750,7 @@ yyreduce: case 9: /* Line 1792 of yacc.c */ -#line 199 "testpatterny.y" +#line 200 "testpatterny.y" { if (getenv("STP_TESTPATTERN_DEBUG")) fprintf(stderr, ">>>whitespec\n"); @@ -1761,7 +1762,7 @@ yyreduce: case 10: /* Line 1792 of yacc.c */ -#line 209 "testpatterny.y" +#line 210 "testpatterny.y" { if (getenv("STP_TESTPATTERN_DEBUG")) fprintf(stderr, ">>>extendedspec %d\n", (yyvsp[(2) - (2)].ival)); @@ -1773,7 +1774,7 @@ yyreduce: case 18: /* Line 1792 of yacc.c */ -#line 222 "testpatterny.y" +#line 223 "testpatterny.y" { if (getenv("STP_TESTPATTERN_DEBUG")) fprintf(stderr, ">>>modespec2 %d\n", (yyvsp[(2) - (2)].ival)); @@ -1784,7 +1785,7 @@ yyreduce: case 22: /* Line 1792 of yacc.c */ -#line 236 "testpatterny.y" +#line 237 "testpatterny.y" { int channel = find_color((yyvsp[(2) - (3)].sval)); if (getenv("STP_TESTPATTERN_DEBUG")) @@ -1796,7 +1797,7 @@ yyreduce: case 23: /* Line 1792 of yacc.c */ -#line 246 "testpatterny.y" +#line 247 "testpatterny.y" { if (getenv("STP_TESTPATTERN_DEBUG")) fprintf(stderr, ">>>channel_level %d %f\n", (yyvsp[(2) - (3)].ival), (yyvsp[(3) - (3)].dval)); @@ -1807,7 +1808,7 @@ yyreduce: case 24: /* Line 1792 of yacc.c */ -#line 255 "testpatterny.y" +#line 256 "testpatterny.y" { int channel = find_color((yyvsp[(2) - (3)].sval)); if (getenv("STP_TESTPATTERN_DEBUG")) @@ -1819,7 +1820,7 @@ yyreduce: case 25: /* Line 1792 of yacc.c */ -#line 265 "testpatterny.y" +#line 266 "testpatterny.y" { if (getenv("STP_TESTPATTERN_DEBUG")) fprintf(stderr, ">>>channel_gamma %d %f\n", (yyvsp[(2) - (3)].ival), (yyvsp[(3) - (3)].dval)); @@ -1830,7 +1831,7 @@ yyreduce: case 26: /* Line 1792 of yacc.c */ -#line 274 "testpatterny.y" +#line 275 "testpatterny.y" { if (getenv("STP_TESTPATTERN_DEBUG")) fprintf(stderr, ">>>global_gamma %f\n", (yyvsp[(2) - (2)].dval)); @@ -1840,7 +1841,7 @@ yyreduce: case 27: /* Line 1792 of yacc.c */ -#line 281 "testpatterny.y" +#line 282 "testpatterny.y" { if (getenv("STP_TESTPATTERN_DEBUG")) fprintf(stderr, ">>>steps %d\n", (yyvsp[(2) - (2)].ival)); @@ -1850,7 +1851,7 @@ yyreduce: case 28: /* Line 1792 of yacc.c */ -#line 288 "testpatterny.y" +#line 289 "testpatterny.y" { if (getenv("STP_TESTPATTERN_DEBUG")) fprintf(stderr, ">>>ink_limit %f\n", (yyvsp[(2) - (2)].dval)); @@ -1860,18 +1861,18 @@ yyreduce: case 29: /* Line 1792 of yacc.c */ -#line 295 "testpatterny.y" +#line 296 "testpatterny.y" { if (getenv("STP_TESTPATTERN_DEBUG")) fprintf(stderr, ">>>printer %s\n", (yyvsp[(2) - (2)].sval)); - global_printer = strdup((yyvsp[(2) - (2)].sval)); + global_printer = stp_strdup((yyvsp[(2) - (2)].sval)); free((yyvsp[(2) - (2)].sval)); } break; case 30: /* Line 1792 of yacc.c */ -#line 304 "testpatterny.y" +#line 305 "testpatterny.y" { if (getenv("STP_TESTPATTERN_DEBUG")) fprintf(stderr, ">>>page_size_name %s\n", (yyvsp[(2) - (2)].sval)); @@ -1882,7 +1883,7 @@ yyreduce: case 31: /* Line 1792 of yacc.c */ -#line 313 "testpatterny.y" +#line 314 "testpatterny.y" { if (getenv("STP_TESTPATTERN_DEBUG")) fprintf(stderr, ">>>page_size_custom %d %d\n", (yyvsp[(2) - (3)].ival), (yyvsp[(3) - (3)].ival)); @@ -1893,7 +1894,7 @@ yyreduce: case 34: /* Line 1792 of yacc.c */ -#line 325 "testpatterny.y" +#line 326 "testpatterny.y" { if (getenv("STP_TESTPATTERN_DEBUG")) fprintf(stderr, ">>>parameter_string %s %s\n", (yyvsp[(2) - (3)].sval), (yyvsp[(3) - (3)].sval)); @@ -1905,7 +1906,7 @@ yyreduce: case 35: /* Line 1792 of yacc.c */ -#line 335 "testpatterny.y" +#line 336 "testpatterny.y" { if (getenv("STP_TESTPATTERN_DEBUG")) fprintf(stderr, ">>>parameter_int %s %d\n", (yyvsp[(2) - (3)].sval), (yyvsp[(3) - (3)].ival)); @@ -1916,7 +1917,7 @@ yyreduce: case 36: /* Line 1792 of yacc.c */ -#line 344 "testpatterny.y" +#line 345 "testpatterny.y" { if (getenv("STP_TESTPATTERN_DEBUG")) fprintf(stderr, ">>>parameter_bool %s %d\n", (yyvsp[(2) - (3)].sval), (yyvsp[(3) - (3)].ival)); @@ -1927,7 +1928,7 @@ yyreduce: case 37: /* Line 1792 of yacc.c */ -#line 353 "testpatterny.y" +#line 354 "testpatterny.y" { if (getenv("STP_TESTPATTERN_DEBUG")) fprintf(stderr, ">>>parameter_float %s %f\n", (yyvsp[(2) - (3)].sval), (yyvsp[(3) - (3)].dval)); @@ -1938,7 +1939,7 @@ yyreduce: case 38: /* Line 1792 of yacc.c */ -#line 362 "testpatterny.y" +#line 363 "testpatterny.y" { stp_curve_t *curve = stp_curve_create_from_string((yyvsp[(3) - (3)].sval)); if (getenv("STP_TESTPATTERN_DEBUG")) @@ -1954,7 +1955,7 @@ yyreduce: case 44: /* Line 1792 of yacc.c */ -#line 378 "testpatterny.y" +#line 379 "testpatterny.y" { if (getenv("STP_TESTPATTERN_DEBUG")) fprintf(stderr, ">>>density %f\n", (yyvsp[(2) - (2)].dval)); @@ -1964,7 +1965,7 @@ yyreduce: case 45: /* Line 1792 of yacc.c */ -#line 385 "testpatterny.y" +#line 386 "testpatterny.y" { if (getenv("STP_TESTPATTERN_DEBUG")) fprintf(stderr, ">>>top %f\n", (yyvsp[(2) - (2)].dval)); @@ -1974,7 +1975,7 @@ yyreduce: case 46: /* Line 1792 of yacc.c */ -#line 392 "testpatterny.y" +#line 393 "testpatterny.y" { if (getenv("STP_TESTPATTERN_DEBUG")) fprintf(stderr, ">>>left %f\n", (yyvsp[(2) - (2)].dval)); @@ -1984,7 +1985,7 @@ yyreduce: case 47: /* Line 1792 of yacc.c */ -#line 399 "testpatterny.y" +#line 400 "testpatterny.y" { if (getenv("STP_TESTPATTERN_DEBUG")) fprintf(stderr, ">>>relative size\n"); @@ -1994,7 +1995,7 @@ yyreduce: case 48: /* Line 1792 of yacc.c */ -#line 406 "testpatterny.y" +#line 407 "testpatterny.y" { if (getenv("STP_TESTPATTERN_DEBUG")) fprintf(stderr, ">>>size inches\n"); @@ -2004,7 +2005,7 @@ yyreduce: case 49: /* Line 1792 of yacc.c */ -#line 413 "testpatterny.y" +#line 414 "testpatterny.y" { if (getenv("STP_TESTPATTERN_DEBUG")) fprintf(stderr, ">>>size pt\n"); @@ -2014,7 +2015,7 @@ yyreduce: case 50: /* Line 1792 of yacc.c */ -#line 420 "testpatterny.y" +#line 421 "testpatterny.y" { if (getenv("STP_TESTPATTERN_DEBUG")) fprintf(stderr, ">>>size mm\n"); @@ -2024,7 +2025,7 @@ yyreduce: case 56: /* Line 1792 of yacc.c */ -#line 431 "testpatterny.y" +#line 432 "testpatterny.y" { if (getenv("STP_TESTPATTERN_DEBUG")) fprintf(stderr, ">>>hsize %f\n", (yyvsp[(2) - (2)].dval)); @@ -2034,7 +2035,7 @@ yyreduce: case 57: /* Line 1792 of yacc.c */ -#line 438 "testpatterny.y" +#line 439 "testpatterny.y" { if (getenv("STP_TESTPATTERN_DEBUG")) fprintf(stderr, ">>>vsize %f\n", (yyvsp[(2) - (2)].dval)); @@ -2044,7 +2045,7 @@ yyreduce: case 58: /* Line 1792 of yacc.c */ -#line 445 "testpatterny.y" +#line 446 "testpatterny.y" { if (getenv("STP_TESTPATTERN_DEBUG")) fprintf(stderr, ">>>blackline %d\n", (yyvsp[(2) - (2)].ival)); @@ -2054,7 +2055,7 @@ yyreduce: case 59: /* Line 1792 of yacc.c */ -#line 453 "testpatterny.y" +#line 454 "testpatterny.y" { if (getenv("STP_TESTPATTERN_DEBUG")) fprintf(stderr, ">>>noscale %d\n", (yyvsp[(2) - (2)].ival)); @@ -2064,7 +2065,7 @@ yyreduce: case 60: /* Line 1792 of yacc.c */ -#line 461 "testpatterny.y" +#line 462 "testpatterny.y" { if (getenv("STP_TESTPATTERN_DEBUG")) fprintf(stderr, ">>>color_block1 %f %f %f (%d)\n", (yyvsp[(1) - (3)].dval), (yyvsp[(2) - (3)].dval), (yyvsp[(3) - (3)].dval), @@ -2081,7 +2082,7 @@ yyreduce: case 66: /* Line 1792 of yacc.c */ -#line 485 "testpatterny.y" +#line 486 "testpatterny.y" { int channel = find_color((yyvsp[(1) - (4)].sval)); if (getenv("STP_TESTPATTERN_DEBUG")) @@ -2097,7 +2098,7 @@ yyreduce: case 67: /* Line 1792 of yacc.c */ -#line 499 "testpatterny.y" +#line 500 "testpatterny.y" { if (getenv("STP_TESTPATTERN_DEBUG")) fprintf(stderr, ">>>color_block2b %d %f %f %f\n", (yyvsp[(2) - (5)].ival), (yyvsp[(3) - (5)].dval), (yyvsp[(4) - (5)].dval), (yyvsp[(5) - (5)].dval)); @@ -2112,7 +2113,7 @@ yyreduce: case 76: /* Line 1792 of yacc.c */ -#line 524 "testpatterny.y" +#line 525 "testpatterny.y" { if (getenv("STP_TESTPATTERN_DEBUG")) fprintf(stderr, ">>>patvars %f %f %f %f %f\n", (yyvsp[(1) - (5)].dval), (yyvsp[(2) - (5)].dval), (yyvsp[(3) - (5)].dval), (yyvsp[(4) - (5)].dval), (yyvsp[(5) - (5)].dval)); @@ -2129,7 +2130,7 @@ yyreduce: case 78: /* Line 1792 of yacc.c */ -#line 542 "testpatterny.y" +#line 543 "testpatterny.y" { if (getenv("STP_TESTPATTERN_DEBUG")) fprintf(stderr, ">>>xpattern\n"); @@ -2146,7 +2147,7 @@ yyreduce: case 79: /* Line 1792 of yacc.c */ -#line 557 "testpatterny.y" +#line 558 "testpatterny.y" { if (getenv("STP_TESTPATTERN_DEBUG")) fprintf(stderr, ">>>grid %d\n", (yyvsp[(2) - (2)].ival)); @@ -2159,7 +2160,7 @@ yyreduce: case 80: /* Line 1792 of yacc.c */ -#line 568 "testpatterny.y" +#line 569 "testpatterny.y" { if (getenv("STP_TESTPATTERN_DEBUG")) fprintf(stderr, ">>>image %d %d\n", (yyvsp[(2) - (3)].ival), (yyvsp[(3) - (3)].ival)); @@ -2178,7 +2179,7 @@ yyreduce: case 81: /* Line 1792 of yacc.c */ -#line 585 "testpatterny.y" +#line 586 "testpatterny.y" { fprintf(stderr,"%s",(yyvsp[(1) - (1)].sval)); free((yyvsp[(1) - (1)].sval)); @@ -2187,7 +2188,7 @@ yyreduce: case 85: /* Line 1792 of yacc.c */ -#line 598 "testpatterny.y" +#line 599 "testpatterny.y" { close_output(); if (global_output) @@ -2199,7 +2200,7 @@ yyreduce: case 86: /* Line 1792 of yacc.c */ -#line 608 "testpatterny.y" +#line 609 "testpatterny.y" { global_output = (yyvsp[(2) - (2)].sval); } @@ -2207,43 +2208,43 @@ yyreduce: case 89: /* Line 1792 of yacc.c */ -#line 617 "testpatterny.y" +#line 618 "testpatterny.y" { start_job = 1; } break; case 90: /* Line 1792 of yacc.c */ -#line 621 "testpatterny.y" +#line 622 "testpatterny.y" { end_job = 1; } break; case 114: /* Line 1792 of yacc.c */ -#line 631 "testpatterny.y" +#line 632 "testpatterny.y" { global_did_something = 1; } break; case 119: /* Line 1792 of yacc.c */ -#line 638 "testpatterny.y" +#line 639 "testpatterny.y" { global_did_something = 1; } break; case 122: /* Line 1792 of yacc.c */ -#line 645 "testpatterny.y" +#line 646 "testpatterny.y" { global_did_something = 1; } break; case 128: /* Line 1792 of yacc.c */ -#line 655 "testpatterny.y" +#line 656 "testpatterny.y" { return 0; } break; case 129: /* Line 1792 of yacc.c */ -#line 659 "testpatterny.y" +#line 660 "testpatterny.y" { current_testpattern = get_next_testpattern(); } @@ -2251,7 +2252,7 @@ yyreduce: /* Line 1792 of yacc.c */ -#line 2255 "testpatterny.c" +#line 2256 "testpatterny.c" default: break; } /* User semantic actions sometimes alter yychar, and that requires @@ -2483,5 +2484,5 @@ yyreturn: /* Line 2055 of yacc.c */ -#line 665 "testpatterny.y" +#line 666 "testpatterny.y" diff --git a/src/testpattern/testpatterny.y b/src/testpattern/testpatterny.y index 4f921e6..3b89160 100644 --- a/src/testpattern/testpatterny.y +++ b/src/testpattern/testpatterny.y @@ -26,6 +26,7 @@ #endif #include <string.h> +#include <strings.h> #include <stdio.h> #include <stdlib.h> #include "testpattern.h" @@ -295,7 +296,7 @@ printer: PRINTER tSTRING { if (getenv("STP_TESTPATTERN_DEBUG")) fprintf(stderr, ">>>printer %s\n", $2); - global_printer = strdup($2); + global_printer = stp_strdup($2); free($2); } ; diff --git a/src/testpattern/uncompress-checksums.in b/src/testpattern/uncompress-checksums.in new file mode 100644 index 0000000..e97fe25 --- /dev/null +++ b/src/testpattern/uncompress-checksums.in @@ -0,0 +1,47 @@ +#!@PERL@ +## Copyright (C) 2016 Robert Krawitz +## +## This program is free software; you can redistribute it and/or modify +## it under the terms of the GNU General Public License as published by +## the Free Software Foundation; either version 2, or (at your option) +## any later version. +## +## This program is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU General Public License for more details. +## +## You should have received a copy of the GNU General Public License +## along with this program; if not, write to the Free Software +## Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +use strict; + +my (%checksums); + +while (<>) { + chomp; + my ($sum, @keys) = split; + my (@pchunks) = (); + foreach my $k (@keys) { + $k =~ s/=/________/g; + $k =~ s/!/_______/g; + $k =~ s/"/______/g; + $k =~ s/,/_____/g; + $k =~ s/'/____/g; + $k =~ s/%/___/g; + $k =~ s/>/__/g; + my (@chunks) = split(/_/, $k, -1); + foreach my $i (0..$#chunks) { + if ($chunks[$i] eq '') { + $chunks[$i] = $pchunks[$i]; + } elsif ($chunks[$i] =~ /^([0-9]+)\+(.*)/) { + $chunks[$i] = substr($pchunks[$i], 0, $1) . $2; + } + } + my ($answer) = join('_', @chunks); + $answer =~ s/(^[^:]*)_:(.*)/$2_$1/; + print "$sum *$answer.prn\n"; + @pchunks = @chunks; + } +} diff --git a/src/xml/Makefile.in b/src/xml/Makefile.in index 5b5c1d5..1816f06 100644 --- a/src/xml/Makefile.in +++ b/src/xml/Makefile.in @@ -255,6 +255,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/xml/escp2/Makefile.in b/src/xml/escp2/Makefile.in index f0f8623..e6075d0 100644 --- a/src/xml/escp2/Makefile.in +++ b/src/xml/escp2/Makefile.in @@ -193,6 +193,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/xml/escp2/inks/Makefile.in b/src/xml/escp2/inks/Makefile.in index ab0cfff..0999d8c 100644 --- a/src/xml/escp2/inks/Makefile.in +++ b/src/xml/escp2/inks/Makefile.in @@ -163,6 +163,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/xml/escp2/inputslots/Makefile.in b/src/xml/escp2/inputslots/Makefile.in index c323768..9d96498 100644 --- a/src/xml/escp2/inputslots/Makefile.in +++ b/src/xml/escp2/inputslots/Makefile.in @@ -163,6 +163,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/xml/escp2/media/Makefile.in b/src/xml/escp2/media/Makefile.in index 5cda659..f4fb48d 100644 --- a/src/xml/escp2/media/Makefile.in +++ b/src/xml/escp2/media/Makefile.in @@ -163,6 +163,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/xml/escp2/mediasizes/Makefile.in b/src/xml/escp2/mediasizes/Makefile.in index 78215ca..f8d0142 100644 --- a/src/xml/escp2/mediasizes/Makefile.in +++ b/src/xml/escp2/mediasizes/Makefile.in @@ -163,6 +163,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/xml/escp2/model/Makefile.in b/src/xml/escp2/model/Makefile.in index 36147cd..6a575ae 100644 --- a/src/xml/escp2/model/Makefile.in +++ b/src/xml/escp2/model/Makefile.in @@ -163,6 +163,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/xml/escp2/qualitypresets/Makefile.in b/src/xml/escp2/qualitypresets/Makefile.in index 4b88e4d..c1e6569 100644 --- a/src/xml/escp2/qualitypresets/Makefile.in +++ b/src/xml/escp2/qualitypresets/Makefile.in @@ -163,6 +163,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/xml/escp2/weaves/Makefile.in b/src/xml/escp2/weaves/Makefile.in index d541297..9975a0a 100644 --- a/src/xml/escp2/weaves/Makefile.in +++ b/src/xml/escp2/weaves/Makefile.in @@ -163,6 +163,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/xml/printers.xml b/src/xml/printers.xml index 3fbdac3..45826f1 100644 --- a/src/xml/printers.xml +++ b/src/xml/printers.xml @@ -103,8 +103,8 @@ <printer translate="name" name="Canon BJC-1000" deviceid="MFG:Canon;MDL:BJC-1000;DES:Canon BJC-1000;CMD:BJL,BJRaster,BSCC,TXT01;" driver="bjc-1000" manufacturer="Canon" model="1000" parameters="density_800_params" /> <printer translate="name" name="Canon BJC-2000" driver="bjc-2000" manufacturer="Canon" model="2000" parameters="density_800_params" /> <printer translate="name" name="Canon BJC-2010" driver="bjc-2010" manufacturer="Canon" model="2000" parameters="density_800_params" /> - <printer translate="name" name="Canon BJC-2100" deviceid="MFG:Canon;MDL:BJC-2100;DES:Canon BJC-2100;" driver="bjc-2100" manufacturer="Canon" model="4300" parameters="gamma_750_params" /> - <printer translate="name" name="Canon BJC-2110" driver="bjc-2110" manufacturer="Canon" model="2000" parameters="density_800_params" /> + <printer translate="name" name="Canon BJC-2100" deviceid="MFG:Canon;MDL:BJC-2100;DES:Canon BJC-2100;" driver="bjc-2100" manufacturer="Canon" model="2100" parameters="gamma_750_params" /> + <printer translate="name" name="Canon BJC-2110" driver="bjc-2110" manufacturer="Canon" model="2100" parameters="density_800_params" /> <printer translate="name" name="Canon BJC-3000" deviceid="MFG:Canon;MDL:BJC-3000;DES:Canon BJC-3000;CMD:BJL,BJRaster3,BSCC,TXT01,BJScan2;" driver="bjc-3000" manufacturer="Canon" model="3000" parameters="density_800_params" /> <printer translate="name" name="Canon BJC-4000" driver="bjc-4000" manufacturer="Canon" model="4300" parameters="gamma_750_params" /> <printer translate="name" name="Canon BJC-4300" deviceid="MFG:Canon;MDL:BJC-4300;DES:Canon BJC-4300;CMD:BJ,LQ,BJL,BJRaster,BSCC;" driver="bjc-4300" manufacturer="Canon" model="4300" parameters="gamma_750_params" /> @@ -1285,19 +1285,19 @@ <parameter type="float" name="Gamma">1.000</parameter> <parameter type="float" name="Density">1.000</parameter> </parameters> - <printer translate="name" name="Datamax-O'Neil I4212e Mark II" deviceid="MFG:Datamax-O'Neil;CMD:DPL;MDL:I4212e Mark II;" color="false" driver="datamax_oneil_I4212e" manufacturer="Datamax O'Neil" model="10017" parameters="dpl_params" /> - <printer translate="name" name="Datamax-O'Neil I4310e Mark II" deviceid="MFG:Datamax-O'Neil;CMD:DPL;MDL:I4310e Mark II;" color="false" driver="datamax_oneil_I4310e" manufacturer="Datamax O'Neil" model="10018" parameters="dpl_params" /> - <printer translate="name" name="Datamax-O'Neil I4606e Mark II" deviceid="MFG:Datamax-O'Neil;CMD:DPL;MDL:I4606e Mark II;" color="false" driver="datamax_oneil_I4606e" manufacturer="Datamax O'Neil" model="10020" parameters="dpl_params" /> - <printer translate="name" name="Datamax-O'Neil E4204B Mark III" deviceid="MFG:Datamax-O'Neil;CMD:DPL;MDL:E4204B Mark III;" color="false" driver="datamax_oneil_E4204B" manufacturer="Datamax O'Neil" model="10021" parameters="dpl_params" /> - <printer translate="name" name="Datamax-O'Neil E4304B Mark III" deviceid="MFG:Datamax-O'Neil;CMD:DPL;MDL:E4304B Mark III;" color="false" driver="datamax_oneil_E4304B" manufacturer="Datamax O'Neil" model="10022" parameters="dpl_params" /> - <printer translate="name" name="Datamax-O'Neil E4205A Mark III" deviceid="MFG:Datamax-O'Neil;CMD:DPL;MDL:E4205A Mark III;" color="false" driver="datamax_oneil_E4205A" manufacturer="Datamax O'Neil" model="10023" parameters="dpl_params" /> - <printer translate="name" name="Datamax-O'Neil E4305A Mark III" deviceid="MFG:Datamax-O'Neil;CMD:DPL;MDL:E4305A Mark III;" color="false" driver="datamax_oneil_E4305A" manufacturer="Datamax O'Neil" model="10024" parameters="dpl_params" /> - <printer translate="name" name="Datamax-O'Neil E4206P Mark III" deviceid="MFG:Datamax-O'Neil;CMD:DPL;MDL:E4206P Mark III;" color="false" driver="datamax_oneil_E4206P" manufacturer="Datamax O'Neil" model="10025" parameters="dpl_params" /> - <printer translate="name" name="Datamax-O'Neil E4305P Mark III" deviceid="MFG:Datamax-O'Neil;CMD:DPL;MDL:E4305P Mark III;" color="false" driver="datamax_oneil_E4305P" manufacturer="Datamax O'Neil" model="10026" parameters="dpl_params" /> - <printer translate="name" name="Datamax-O'Neil E4206L Mark III" deviceid="MFG:Datamax-O'Neil;CMD:DPL;MDL:E4206L Mark III;" color="false" driver="datamax_oneil_E4206L" manufacturer="Datamax O'Neil" model="10027" parameters="dpl_params" /> - <printer translate="name" name="Datamax-O'Neil E4305L Mark III" deviceid="MFG:Datamax-O'Neil;CMD:DPL;MDL:E4305L Mark III;" color="false" driver="datamax_oneil_E4305L" manufacturer="Datamax O'Neil" model="10028" parameters="dpl_params" /> - <printer translate="name" name="Datamax-O'Neil RL3e" deviceid="MFG:Datamax-O'Neil;CMD:DPL;MDL:RL3e;" color="false" driver="datamax_oneil_RL3e" manufacturer="Datamax O'Neil" model="10029" parameters="dpl_params" /> - <printer translate="name" name="Datamax-O'Neil RL4e" deviceid="MFG:Datamax-O'Neil;CMD:DPL;MDL:RL4e;" color="false" driver="datamax_oneil_RL4e" manufacturer="Datamax O'Neil" model="10030" parameters="dpl_params" /> + <printer translate="name" name="Datamax-ONeil I4212e Mark II" deviceid="MFG:Datamax-O'Neil;CMD:DPL;MDL:I4212e Mark II;" color="false" driver="datamax_oneil_I4212e" manufacturer="DatamaxONeil" model="10017" parameters="dpl_params" /> + <printer translate="name" name="Datamax-ONeil I4310e Mark II" deviceid="MFG:Datamax-O'Neil;CMD:DPL;MDL:I4310e Mark II;" color="false" driver="datamax_oneil_I4310e" manufacturer="DatamaxONeil" model="10018" parameters="dpl_params" /> + <printer translate="name" name="Datamax-ONeil I4606e Mark II" deviceid="MFG:Datamax-O'Neil;CMD:DPL;MDL:I4606e Mark II;" color="false" driver="datamax_oneil_I4606e" manufacturer="DatamaxONeil" model="10020" parameters="dpl_params" /> + <printer translate="name" name="Datamax-ONeil E4204B Mark III" deviceid="MFG:Datamax-O'Neil;CMD:DPL;MDL:E4204B Mark III;" color="false" driver="datamax_oneil_E4204B" manufacturer="DatamaxONeil" model="10021" parameters="dpl_params" /> + <printer translate="name" name="Datamax-ONeil E4304B Mark III" deviceid="MFG:Datamax-O'Neil;CMD:DPL;MDL:E4304B Mark III;" color="false" driver="datamax_oneil_E4304B" manufacturer="DatamaxONeil" model="10022" parameters="dpl_params" /> + <printer translate="name" name="Datamax-ONeil E4205A Mark III" deviceid="MFG:Datamax-O'Neil;CMD:DPL;MDL:E4205A Mark III;" color="false" driver="datamax_oneil_E4205A" manufacturer="DatamaxONeil" model="10023" parameters="dpl_params" /> + <printer translate="name" name="Datamax-ONeil E4305A Mark III" deviceid="MFG:Datamax-O'Neil;CMD:DPL;MDL:E4305A Mark III;" color="false" driver="datamax_oneil_E4305A" manufacturer="DatamaxONeil" model="10024" parameters="dpl_params" /> + <printer translate="name" name="Datamax-ONeil E4206P Mark III" deviceid="MFG:Datamax-O'Neil;CMD:DPL;MDL:E4206P Mark III;" color="false" driver="datamax_oneil_E4206P" manufacturer="DatamaxONeil" model="10025" parameters="dpl_params" /> + <printer translate="name" name="Datamax-ONeil E4305P Mark III" deviceid="MFG:Datamax-O'Neil;CMD:DPL;MDL:E4305P Mark III;" color="false" driver="datamax_oneil_E4305P" manufacturer="DatamaxONeil" model="10026" parameters="dpl_params" /> + <printer translate="name" name="Datamax-ONeil E4206L Mark III" deviceid="MFG:Datamax-O'Neil;CMD:DPL;MDL:E4206L Mark III;" color="false" driver="datamax_oneil_E4206L" manufacturer="DatamaxONeil" model="10027" parameters="dpl_params" /> + <printer translate="name" name="Datamax-ONeil E4305L Mark III" deviceid="MFG:Datamax-O'Neil;CMD:DPL;MDL:E4305L Mark III;" color="false" driver="datamax_oneil_E4305L" manufacturer="DatamaxONeil" model="10028" parameters="dpl_params" /> + <printer translate="name" name="Datamax-ONeil RL3e" deviceid="MFG:Datamax-O'Neil;CMD:DPL;MDL:RL3e;" color="false" driver="datamax_oneil_RL3e" manufacturer="DatamaxONeil" model="10029" parameters="dpl_params" /> + <printer translate="name" name="Datamax-ONeil RL4e" deviceid="MFG:Datamax-O'Neil;CMD:DPL;MDL:RL4e;" color="false" driver="datamax_oneil_RL4e" manufacturer="DatamaxONeil" model="10030" parameters="dpl_params" /> </family> <family name="escp2"> <parameters name="standard_params"> @@ -2947,8 +2947,6 @@ <printer translate="name" name="Mitsubishi CP-3020DAE" driver="mitsubishi-3020dae" manufacturer="Mitsubishi" model="4102">EXPERIMENTAL</printer> <printer translate="name" name="Mitsubishi CP-9550D" deviceid="MFG:MITSUBISHI;CMD:MEL;MDL:CP9550D ;CLS:PRINTER;DES:MITSUBISHI CP9550D" driver="mitsubishi-9550d" manufacturer="Mitsubishi" model="4103" parameters="nativecopies" /> <printer translate="name" name="Mitsubishi CP-9550DW" driver="mitsubishi-9550dw" manufacturer="Mitsubishi" model="4103" parameters="nativecopies" /> - <printer translate="name" name="Mitsubishi CP-9550DZ" deviceid="MFG:MITSUBISHI;CMD:MEL;MDL:CP9550DZ;CLS:PRINTER;DES:MITSUBISHI CP9550DZ;" driver="mitsubishi-9550dz" manufacturer="Mitsubishi" model="4103" parameters="nativecopies">EXPERIMENTAL</printer> - <printer translate="name" name="Mitsubishi CP-9550DW-S" driver="mitsubishi-9550dw-s" manufacturer="Mitsubishi" model="4103" parameters="nativecopies">EXPERIMENTAL</printer> <printer translate="name" name="Mitsubishi CP-9810D" driver="mitsubishi-9810d" manufacturer="Mitsubishi" model="4104" /> <printer translate="name" name="Mitsubishi CP-9810DW" driver="mitsubishi-9810dw" manufacturer="Mitsubishi" model="4104" /> <printer translate="name" name="Mitsubishi CP-D70DW" deviceid="MFG:MITSUBISHI;CMD:MEL;MDL:CP60D70D707D;CLS:PRINTER;DES:MITSUBISHI CP60D70D707D" driver="mitsubishi-d70dw" manufacturer="Mitsubishi" model="4105" parameters="nativecopies">EXPERIMENTAL</printer> @@ -2957,6 +2955,9 @@ <printer translate="name" name="Mitsubishi CP-D80DW" driver="mitsubishi-d80dw" manufacturer="Mitsubishi" model="4107" parameters="nativecopies">EXPERIMENTAL</printer> <printer translate="name" name="Kodak 305" deviceid="MFG:KODAK;CMD:KODAK305;MDL:305 Photo Printer;CLS:PRINTER;DES:KODAK 305 Photo Printer" driver="kodak-305" manufacturer="Kodak" model="4108" parameters="nativecopies">EXPERIMENTAL</printer> <printer translate="name" name="Mitsubishi CP-D90DW" driver="mitsubishi-d90dw" manufacturer="Mitsubishi" model="4109" parameters="nativecopies">EXPERIMENTAL</printer> + <printer translate="name" name="Mitsubishi CP-9600DW" driver="mitsubishi-9600dw" manufacturer="Mitsubishi" model="4110" parameters="nativecopies">EXPERIMENTAL</printer> + <printer translate="name" name="Mitsubishi CP-9550DZ" deviceid="MFG:MITSUBISHI;CMD:MEL;MDL:CP9550DZ;CLS:PRINTER;DES:MITSUBISHI CP9550DZ;" driver="mitsubishi-9550dz" manufacturer="Mitsubishi" model="4111" parameters="nativecopies" /> + <printer translate="name" name="Mitsubishi CP-9550DW-S" driver="mitsubishi-9550dw-s" manufacturer="Mitsubishi" model="4111" parameters="nativecopies" /> <printer translate="name" name="Shinko CHC-S9045" driver="shinko-chcs9045" manufacturer="Shinko" model="5000" /> <printer translate="name" name="Shinko CHC-S2145" deviceid="MFG:SHINKO;CMD:SUPCC;MDL:CHC-S2145;CLS:PRINTER;DES:SHINKO CHC-S2145;" driver="shinko-chcs2145" manufacturer="Shinko" model="5001" parameters="nativecopies" /> <printer translate="name" name="Sinfonia S2145/S2" driver="sinfonia-chcs2145" manufacturer="Sinfonia" model="5001" parameters="nativecopies" /> |