/* * * Dump the per-printer options for Gutenprint * * Copyright 2000-2018 Robert Krawitz (rlk@alum.mit.edu) * * 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 of the License, 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, see . */ #ifdef HAVE_CONFIG_H #include #endif #include #include #include #include int main(int argc, char **argv) { int i, j, k; int first_arg = 1; stp_string_list_t *printer_list = NULL; stp_parameter_level_t max_level = STP_PARAMETER_LEVEL_ADVANCED4; if (argc > 1 && !strcmp(argv[1], "-s")) { max_level = STP_PARAMETER_LEVEL_BASIC; first_arg++; } stp_init(); if (argc > first_arg) { printer_list = stp_string_list_create(); for (i = 1; i < argc; i++) stp_string_list_add_string(printer_list, argv[i], argv[i]); } for (i = 0; i < stp_printer_model_count(); i++) { stp_parameter_list_t params; int nparams; stp_parameter_t desc; const stp_printer_t *printer = stp_get_printer_by_index(i); const char *driver = stp_printer_get_driver(printer); const char *family = stp_printer_get_family(printer); stp_vars_t *pv; int tcount = 0; size_t count; int printer_is_color = 0; if (strcmp(family, "ps") == 0 || strcmp(family, "raw") == 0) continue; if (printer_list && !stp_string_list_is_present(printer_list, driver)) continue; pv = stp_vars_create_copy(stp_printer_get_defaults(printer)); /* Set Job Mode to "Job" as this enables the Duplex option */ stp_set_string_parameter(pv, "JobMode", "Job"); stp_describe_parameter(pv, "PrintingMode", &desc); if (stp_string_list_is_present(desc.bounds.str, "Color")) printer_is_color = 1; stp_parameter_description_destroy(&desc); if (printer_is_color) stp_set_string_parameter(pv, "PrintingMode", "Color"); else stp_set_string_parameter(pv, "PrintingMode", "BW"); stp_set_string_parameter(pv, "ChannelBitDepth", "8"); printf("# Printer model %s, long name `%s'\n", driver, stp_printer_get_long_name(printer)); printf("$families{'%s'} = '%s';\n", driver, family); printf("$models{'%s'} = '%d';\n", driver, stp_get_model_id(pv)); params = stp_get_parameter_list(pv); nparams = stp_parameter_list_count(params); for (k = 0; k < nparams; k++) { const stp_parameter_t *p = stp_parameter_list_param(params, k); if (p->read_only || (p->p_level > max_level && strcmp(p->name, "Resolution") != 0) || (p->p_class != STP_PARAMETER_CLASS_OUTPUT && p->p_class != STP_PARAMETER_CLASS_CORE && p->p_class != STP_PARAMETER_CLASS_FEATURE)) continue; count = 0; stp_describe_parameter(pv, p->name, &desc); if (desc.is_active) { if (desc.p_type == STP_PARAMETER_TYPE_STRING_LIST) { count = stp_string_list_count(desc.bounds.str); if (count > 0) { if (strcmp(desc.name, "Resolution") == 0) { for (j = 0; j < count; j++) { const stp_param_string_t *param = stp_string_list_param(desc.bounds.str, j); stp_resolution_t x, y; stp_set_string_parameter(pv, "Resolution", param->name); stp_describe_resolution(pv, &x, &y); if (x > 0 && y > 0) printf("$resolutions{'%s'}{'%s'} = [%d, %d];\n", driver, param->name, (int) x, (int) y); } stp_clear_string_parameter(pv, "Resolution"); } else { if (strcmp(desc.name, "PageSize") == 0) { stp_dimension_t min_area = 7200 * 7200; stp_dimension_t max_area = 0; const char *min_size_name = NULL; const char *max_size_name = NULL; for (j = 0; j < count; j++) { const stp_param_string_t *param = stp_string_list_param(desc.bounds.str, j); const stp_papersize_t *ps = stp_describe_papersize(pv, param->name); if (ps->width > 0 && ps->height > 0 && (ps->width * ps->height) < min_area) { min_area = ps->width * ps->height; min_size_name = param->name; } if (ps->width > 0 && ps->height > 0 && (ps->width * ps->height) > max_area) { max_area = ps->width * ps->height; max_size_name = param->name; } } if (min_size_name) { printf("$min_page_size{'%s'} = '%s';\n", driver, min_size_name); printf("$max_page_size{'%s'} = '%s';\n", driver, max_size_name); } } printf("$stpdata{'%s'}{'%s'} = [qw(", driver, desc.name); if (!desc.is_mandatory && ! stp_string_list_is_present(desc.bounds.str, "None")) fputs("+None ", stdout); for (j = 0; j < count; j++) { const stp_param_string_t *param = stp_string_list_param(desc.bounds.str, j); printf("%s%s ", (strcmp(desc.deflt.str, param->name)) ? "" : "+", param->name); } fputs(")];\n", stdout); } } } else if (desc.p_type == STP_PARAMETER_TYPE_BOOLEAN) { if (desc.is_mandatory) printf("$stp_bools{'%s'}{'%s'} = %d;\n", driver, desc.name, desc.deflt.boolean); else printf("$stp_bools{'%s'}{'%s'} = %d;\n", driver, desc.name, -1); } else if (desc.p_type == STP_PARAMETER_TYPE_DOUBLE) { if (desc.bounds.dbl.lower <= desc.deflt.dbl && desc.bounds.dbl.upper >= desc.deflt.dbl) printf("$stp_float_values{'%s'}{'%s'} = [%d, %.3f, %.3f, %.3f];\n", driver, desc.name, desc.is_mandatory, desc.deflt.dbl, desc.bounds.dbl.lower, desc.bounds.dbl.upper); } else if (desc.p_type == STP_PARAMETER_TYPE_INT) { if (desc.bounds.integer.lower <= desc.deflt.integer && desc.bounds.integer.upper >= desc.deflt.integer) printf("$stp_int_values{'%s'}{'%s'} = [%d, %d, %d, %d];\n", driver, desc.name, desc.is_mandatory, desc.deflt.integer, desc.bounds.integer.lower, desc.bounds.integer.upper); } else if (desc.p_type == STP_PARAMETER_TYPE_DIMENSION) { if (desc.bounds.dimension.lower <= desc.deflt.dimension && desc.bounds.dimension.upper >= desc.deflt.dimension) printf("$stp_dimension_values{'%s'}{'%s'} = [%d, %.3f, %.3f, %.3f];\n", driver, desc.name, desc.is_mandatory, desc.deflt.dimension, desc.bounds.dimension.lower, desc.bounds.dimension.upper); } tcount += count; } stp_parameter_description_destroy(&desc); } stp_parameter_list_destroy(params); if (tcount > 0) { printf("$stpdata{'%s'}{'Color'} = [qw(", driver); if (printer_is_color) fputs("Color RawCMYK ", stdout); fputs("Grayscale BlackAndWhite)];\n", stdout); } stp_vars_destroy(pv); } if (printer_list) stp_string_list_destroy(printer_list); return 0; }