int main(int argc, char **argv) { int i, k; int use_all_page_sizes = 1; if (argc > 1 && !strcmp(argv[1], "-s")) use_all_page_sizes = 0; stp_init(); for (i = 0; i < stp_printer_model_count(); i++) { const stp_printer_t *p = stp_get_printer_by_index(i); const char *driver = stp_printer_get_driver(p); const char *family = stp_printer_get_family(p); stp_vars_t *pv = stp_vars_create_copy(stp_printer_get_defaults(p)); stp_parameter_t desc; int num_opts; int printer_is_color = 0; const stp_param_string_t *opt; int width, height, bottom, left, top, right; if (strcmp(family, "ps") == 0 || strcmp(family, "raw") == 0) continue; 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(p)); stp_describe_parameter(pv, "PageSize", &desc); printf("$defaults{'%s'}{'PageSize'} = '%s';\n", driver, desc.deflt.str); num_opts = stp_string_list_count(desc.bounds.str); for (k = 0; k < num_opts; k++) { const stp_papersize_t *papersize; opt = stp_string_list_param(desc.bounds.str, k); papersize = stp_get_papersize_by_name(opt->name); if (!papersize) { printf("Unable to lookup size %s!\n", opt->name); continue; } if (!use_all_page_sizes && num_opts >= 10 && (papersize->paper_unit == PAPERSIZE_ENGLISH_EXTENDED || papersize->paper_unit == PAPERSIZE_METRIC_EXTENDED)) continue; width = papersize->width; height = papersize->height; stp_set_string_parameter(pv, "PageSize", opt->name); stp_get_media_size(pv, &width, &height); stp_get_maximum_imageable_area(pv, &left, &right, &bottom, &top); if (left < 0) left = 0; if (right > width) right = width; if (bottom > height) bottom = height; if (top < 0) top = 0; bottom = height - bottom; top = height - top; if (strcmp(opt->name, "Custom") == 0) { /* Use relative values for the custom size */ right = width - right; top = height - top; width = 0; height = 0; } printf("$stpdata{'%s'}{'PageSize'}{'%s'} = '%s';", driver, opt->name, opt->text); printf("$imageableareas{'%s'}{'%s'} = {", driver, opt->name); printf("'left'=>'%d',", left); printf("'right'=>'%d',", right); printf("'top'=>'%d',", top); printf("'bottom'=>'%d',", bottom); printf("'width'=>'%d',", width); printf("'height'=>'%d'", height); printf("};\n"); } stp_parameter_description_destroy(&desc); stp_vars_destroy(pv); } return 0; }
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 = stp_vars_create_copy(stp_printer_get_defaults(printer)); 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; /* 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) { printf("$longnames{'%s'}{'%s'} = '%s';\n", driver, desc.name, desc.text); printf("$param_classes{'%s'}{'%s'} = %d;\n", driver, desc.name, desc.p_class); printf("$param_types{'%s'}{'%s'} = %d;\n", driver, desc.name, desc.p_type); printf("$param_levels{'%s'}{'%s'} = %d;\n", driver, desc.name, desc.p_level); if (desc.p_type == STP_PARAMETER_TYPE_STRING_LIST) { count = stp_string_list_count(desc.bounds.str); if (count > 0) { if (desc.is_mandatory) { printf("$defaults{'%s'}{'%s'} = '%s';\n", driver, desc.name, desc.deflt.str); } else { printf("$defaults{'%s'}{'%s'} = '%s';\n", driver, desc.name, "None"); printf("$stpdata{'%s'}{'%s'}{'%s'} = '%s';\n", driver, desc.name, "None", "None"); } for (j = 0; j < count; j++) { const stp_param_string_t *param = stp_string_list_param(desc.bounds.str, j); printf("$stpdata{'%s'}{'%s'}{'%s'} = '%s';\n", driver, desc.name, param->name, param->text); if (strcmp(desc.name, "Resolution") == 0) { int x, y; stp_set_string_parameter(pv, "Resolution", param->name); stp_describe_resolution(pv, &x, &y); if (x > 0 && y > 0) { printf("$stpdata{'%s'}{'%s'}{'%s'} = '%d';\n", driver, "x_resolution", param->name, x); printf("$stpdata{'%s'}{'%s'}{'%s'} = '%d';\n", driver, "y_resolution", param->name, y); } } } } } else if (desc.p_type == STP_PARAMETER_TYPE_BOOLEAN) { if (desc.is_mandatory) { printf("$defaults{'%s'}{'%s'} = '%d';\n", driver, desc.name, desc.deflt.boolean); } else { printf("$defaults{'%s'}{'%s'} = '%s';\n", driver, desc.name, "None"); printf("$stpdata{'%s'}{'%s'}{'%s'} = '%s';\n", driver, desc.name, "None", "None"); } printf("$stpdata{'%s'}{'%s'}{'False'} = 'False';\n", driver, desc.name); printf("$stpdata{'%s'}{'%s'}{'True'} = 'True';\n", driver, desc.name); } 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'}{'MINVAL'}{'%s'} = %.3f;\n", driver, desc.name, desc.bounds.dbl.lower); printf("$stp_float_values{'%s'}{'MAXVAL'}{'%s'} = %.3f;\n", driver, desc.name, desc.bounds.dbl.upper); printf("$stp_float_values{'%s'}{'DEFVAL'}{'%s'} = %.3f;\n", driver, desc.name, desc.deflt.dbl); /* printf("$stp_float_values{'%s'}{'LONG_NAME'}{'%s'} = '%s';\n", driver, desc.name, gettext(desc.text)); */ printf("$stp_float_values{'%s'}{'CATEGORY'}{'%s'} = '%s';\n", driver, desc.name, gettext(desc.category)); printf("$stp_float_values{'%s'}{'HELP'}{'%s'} = q(%s);\n", driver, desc.name, (desc.help ? gettext(desc.help) : "''")); printf("$stp_float_values{'%s'}{'MANDATORY'}{'%s'} = q(%d);\n", driver, desc.name, desc.is_mandatory); } } 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'}{'MINVAL'}{'%s'} = %d;\n", driver, desc.name, desc.bounds.integer.lower); printf("$stp_int_values{'%s'}{'MAXVAL'}{'%s'} = %d;\n", driver, desc.name, desc.bounds.integer.upper); printf("$stp_int_values{'%s'}{'DEFVAL'}{'%s'} = %d;\n", driver, desc.name, desc.deflt.integer); /* printf("$stp_int_values{'%s'}{'LONG_NAME'}{'%s'} = '%s';\n", driver, desc.name, gettext(desc.text)); */ printf("$stp_int_values{'%s'}{'CATEGORY'}{'%s'} = '%s';\n", driver, desc.name, gettext(desc.category)); printf("$stp_int_values{'%s'}{'HELP'}{'%s'} = q(%s);\n", driver, desc.name, (desc.help ? gettext(desc.help) : "''")); printf("$stp_int_values{'%s'}{'MANDATORY'}{'%s'} = q(%d);\n", driver, desc.name, desc.is_mandatory); } } 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'}{'MINVAL'}{'%s'} = %d;\n", driver, desc.name, desc.bounds.dimension.lower); printf("$stp_dimension_values{'%s'}{'MAXVAL'}{'%s'} = %d;\n", driver, desc.name, desc.bounds.dimension.upper); printf("$stp_dimension_values{'%s'}{'DEFVAL'}{'%s'} = %d;\n", driver, desc.name, desc.deflt.dimension); /* printf("$stp_dimension_values{'%s'}{'LONG_NAME'}{'%s'} = '%s';\n", driver, desc.name, gettext(desc.text)); */ printf("$stp_dimension_values{'%s'}{'CATEGORY'}{'%s'} = '%s';\n", driver, desc.name, gettext(desc.category)); printf("$stp_dimension_values{'%s'}{'HELP'}{'%s'} = q(%s);\n", driver, desc.name, (desc.help ? gettext(desc.help) : "''")); printf("$stp_dimension_values{'%s'}{'MANDATORY'}{'%s'} = q(%d);\n", driver, desc.name, desc.is_mandatory); } } tcount += count; } stp_parameter_description_destroy(&desc); } stp_parameter_list_destroy(params); if (tcount > 0) { if (printer_is_color) { printf("$defaults{'%s'}{'%s'} = '%s';\n", driver, "Color", "Color"); printf("$stpdata{'%s'}{'%s'}{'%s'} = '%s';\n", driver, "Color", "Color", "Color"); printf("$stpdata{'%s'}{'%s'}{'%s'} = '%s';\n", driver, "Color", "RawCMYK", "Raw CMYK"); } else printf("$defaults{'%s'}{'%s'} = '%s';\n", driver, "Color", "Grayscale"); printf("$stpdata{'%s'}{'%s'}{'%s'} = '%s';\n", driver, "Color", "Grayscale", "Gray Scale"); printf("$stpdata{'%s'}{'%s'}{'%s'} = '%s';\n", driver, "Color", "BlackAndWhite", "Black and White"); } stp_vars_destroy(pv); } return 0; }