diff options
Diffstat (limited to 'src/main/print-olympus.c')
-rw-r--r-- | src/main/print-olympus.c | 622 |
1 files changed, 458 insertions, 164 deletions
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); |