static void load_channel(stp_mxml_node_t *node, stp_mxml_node_t *root, ink_channel_t *icl) { const char *name; stp_mxml_node_t *child = node->child; int count = 0; while (child) { if (child->type == STP_MXML_ELEMENT && !strcmp(child->value.element.name, "subchannel")) count++; child = child->next; } name = stp_mxmlElementGetAttr(node, "name"); if (name) icl->name = stp_strdup(name); icl->n_subchannels = count; icl->subchannels = stp_zalloc(sizeof(physical_subchannel_t) * count); count = 0; child = node->child; while (child) { if (child->type == STP_MXML_ELEMENT) { if (!strcmp(child->value.element.name, "subchannel")) load_subchannel(child, root, &(icl->subchannels[count++])); else if (!strcmp(child->value.element.name, "HueCurve")) { stp_mxml_node_t *cchild = child->child; stp_curve_t *curve; const char *cref = stp_mxmlElementGetAttr(child, "ref"); if (cref) { cchild = stp_mxmlFindElement(root, root, "curve", "name", cref, STP_MXML_DESCEND); STPI_ASSERT(cchild, NULL); } else { while (cchild && cchild->type != STP_MXML_ELEMENT) cchild = cchild->next; STPI_ASSERT(cchild, NULL); } curve = stp_curve_create_from_xmltree(cchild); icl->hue_curve = curve; } else if (!strcmp(child->value.element.name, "HueCurveParam")) { name = stp_mxmlElementGetAttr(child, "name"); if (name) icl->hue_curve_name = stp_strdup(name); } } child = child->next; } }
static inkgroup_t * load_inkgroup(const char *name) { stp_list_t *dirlist = stpi_data_path(); stp_list_item_t *item; inkgroup_t *igl = NULL; item = stp_list_get_start(dirlist); while (item) { const char *dn = (const char *) stp_list_item_get_data(item); char *ffn = stpi_path_merge(dn, name); stp_mxml_node_t *inkgroup = stp_mxmlLoadFromFile(NULL, ffn, STP_MXML_NO_CALLBACK); stp_free(ffn); if (inkgroup) { int count = 0; stp_mxml_node_t *node = stp_mxmlFindElement(inkgroup, inkgroup, "escp2InkGroup", NULL, NULL, STP_MXML_DESCEND); if (node) { stp_mxml_node_t *child = node->child; igl = stp_zalloc(sizeof(inkgroup_t)); while (child) { if (child->type == STP_MXML_ELEMENT && !strcmp(child->value.element.name, "InkList")) count++; child = child->next; } igl->n_inklists = count; if (stp_mxmlElementGetAttr(node, "name")) igl->name = stp_strdup(stp_mxmlElementGetAttr(node, "name")); else igl->name = stp_strdup(name); igl->inklists = stp_zalloc(sizeof(inklist_t) * count); child = node->child; count = 0; while (child) { if (child->type == STP_MXML_ELEMENT && !strcmp(child->value.element.name, "InkList")) load_inklist(child, node, &(igl->inklists[count++])); child = child->next; } } stp_mxmlDelete(inkgroup); break; } item = stp_list_item_next(item); } stp_list_destroy(dirlist); return igl; }
/* * Find a node in an XML tree. This function takes an xmlNodePtr, * followed by a NULL-terminated list of nodes which are required. * For example stp_xml_get_node(myroot, "gimp-print", "dither") will * return the first dither node in the tree. Additional dither nodes * cannot be accessed with this function. */ stp_mxml_node_t * stp_xml_get_node(stp_mxml_node_t *xmlroot, ...) { stp_mxml_node_t *child; va_list ap; const char *target = NULL; va_start(ap, xmlroot); child = xmlroot; target = va_arg(ap, const char *); while (target && child) { child = stp_mxmlFindElement(child, child, target, NULL, NULL, STP_MXML_DESCEND); target = va_arg(ap, const char *); } va_end(ap); return child; }
void stp_escp2_load_model(const stp_vars_t *v, int model) { stp_list_t *dirlist = stpi_data_path(); stp_list_item_t *item; char buf[1024]; int found = 0; stp_xml_init(); sprintf(buf, "escp2/model/model_%d.xml", model); item = stp_list_get_start(dirlist); while (item) { const char *dn = (const char *) stp_list_item_get_data(item); char *fn = stpi_path_merge(dn, buf); stp_mxml_node_t *doc = stp_mxmlLoadFromFile(NULL, fn, STP_MXML_NO_CALLBACK); stp_free(fn); if (doc) { stp_mxml_node_t *node = stp_mxmlFindElement(doc, doc, "escp2:model", NULL, NULL, STP_MXML_DESCEND); if (node) { const char *stmp = stp_mxmlElementGetAttr(node, "id"); STPI_ASSERT(stmp && stp_xmlstrtol(stmp) == model, v); load_model_from_file(v, node, model); found = 1; } stp_mxmlDelete(doc); if (found) break; } item = stp_list_item_next(item); } stp_xml_exit(); stp_list_destroy(dirlist); STPI_ASSERT(found, v); }
static stp_array_t * stpi_dither_array_create_from_xmltree(stp_mxml_node_t *dm) /* Dither matrix node */ { const char *stmp; stp_mxml_node_t *child; int x_aspect, y_aspect; /* Dither matrix size */ /* Get x-size */ stmp = stp_mxmlElementGetAttr(dm, "x-aspect"); if (stmp) { x_aspect = (int) stp_xmlstrtoul(stmp); } else { stp_erprintf("stpi_dither_array_create_from_xmltree: \"x-aspect\" missing\n"); goto error; } /* Get y-size */ stmp = stp_mxmlElementGetAttr(dm, "y-aspect"); if (stmp) { y_aspect = (int) stp_xmlstrtoul(stmp); } else { stp_erprintf("stpi_dither_array_create_from_xmltree: \"y-aspect\" missing\n"); goto error; } /* Now read in the array */ child = stp_mxmlFindElement(dm, dm, "array", NULL, NULL, STP_MXML_DESCEND); if (child) return stp_array_create_from_xmltree(child); else stp_erprintf("stpi_dither_array_create_from_xmltree: cannot find root\n"); error: return NULL; }
stp_curve_t * stp_curve_create_from_xmltree(stp_mxml_node_t *curve) /* The curve node */ { const char *stmp; /* Temporary string */ stp_mxml_node_t *child; /* Child sequence node */ stp_curve_t *ret = NULL; /* Curve to return */ stp_curve_type_t curve_type; /* Type of curve */ stp_curve_wrap_mode_t wrap_mode; /* Curve wrap mode */ double fgamma; /* Gamma value */ stp_sequence_t *seq = NULL; /* Sequence data */ double low, high; /* Sequence bounds */ int piecewise = 0; stp_xml_init(); /* Get curve type */ stmp = stp_mxmlElementGetAttr(curve, "type"); if (stmp) { if (!strcmp(stmp, "linear")) curve_type = STP_CURVE_TYPE_LINEAR; else if (!strcmp(stmp, "spline")) curve_type = STP_CURVE_TYPE_SPLINE; else { stp_deprintf(STP_DBG_CURVE_ERRORS, "stp_curve_create_from_xmltree: %s: \"type\" invalid\n", stmp); goto error; } } else { stp_deprintf(STP_DBG_CURVE_ERRORS, "stp_curve_create_from_xmltree: \"type\" missing\n"); goto error; } /* Get curve wrap mode */ stmp = stp_mxmlElementGetAttr(curve, "wrap"); if (stmp) { if (!strcmp(stmp, "nowrap")) wrap_mode = STP_CURVE_WRAP_NONE; else if (!strcmp(stmp, "wrap")) { wrap_mode = STP_CURVE_WRAP_AROUND; } else { stp_deprintf(STP_DBG_CURVE_ERRORS, "stp_curve_create_from_xmltree: %s: \"wrap\" invalid\n", stmp); goto error; } } else { stp_deprintf(STP_DBG_CURVE_ERRORS, "stp_curve_create_from_xmltree: \"wrap\" missing\n"); goto error; } /* Get curve gamma */ stmp = stp_mxmlElementGetAttr(curve, "gamma"); if (stmp) { fgamma = stp_xmlstrtod(stmp); } else { stp_deprintf(STP_DBG_CURVE_ERRORS, "stp_curve_create_from_xmltree: \"gamma\" missing\n"); goto error; } /* If gamma is set, wrap_mode must be STP_CURVE_WRAP_NONE */ if (fgamma && wrap_mode != STP_CURVE_WRAP_NONE) { stp_deprintf(STP_DBG_CURVE_ERRORS, "stp_curve_create_from_xmltree: " "gamma set and \"wrap\" is not STP_CURVE_WRAP_NONE\n"); goto error; } stmp = stp_mxmlElementGetAttr(curve, "piecewise"); if (stmp && strcmp(stmp, "true") == 0) piecewise = 1; /* Set up the curve */ ret = stp_curve_create(wrap_mode); stp_curve_set_interpolation_type(ret, curve_type); child = stp_mxmlFindElement(curve, curve, "sequence", NULL, NULL, STP_MXML_DESCEND); if (child) seq = stp_sequence_create_from_xmltree(child); if (seq == NULL) { stp_deprintf(STP_DBG_CURVE_ERRORS, "stp_curve_create_from_xmltree: sequence read failed\n"); goto error; } /* Set curve bounds */ stp_sequence_get_bounds(seq, &low, &high); stp_curve_set_bounds(ret, low, high); if (fgamma) stp_curve_set_gamma(ret, fgamma); else /* Not a gamma curve, so set points */ { size_t seq_count; const double* data; stp_sequence_get_data(seq, &seq_count, &data); if (piecewise) { if ((seq_count % 2) != 0) { stp_deprintf(STP_DBG_CURVE_ERRORS, "stp_curve_create_from_xmltree: invalid data count %ld\n", (long)seq_count); goto error; } if (stp_curve_set_data_points(ret, seq_count / 2, (const stp_curve_point_t *) data) == 0) { stp_deprintf(STP_DBG_CURVE_ERRORS, "stp_curve_create_from_xmltree: failed to set curve data points\n"); goto error; } } else { if (stp_curve_set_data(ret, seq_count, data) == 0) { stp_deprintf(STP_DBG_CURVE_ERRORS, "stp_curve_create_from_xmltree: failed to set curve data\n"); goto error; } } } if (seq) { stp_sequence_destroy(seq); seq = NULL; } /* Validate curve */ if (stpi_curve_check_parameters(ret, stp_curve_count_points(ret)) == 0) { stp_deprintf(STP_DBG_CURVE_ERRORS, "stp_curve_create_from_xmltree: parameter check failed\n"); goto error; } stp_xml_exit(); return ret; error: stp_deprintf(STP_DBG_CURVE_ERRORS, "stp_curve_create_from_xmltree: error during curve read\n"); if (ret) stp_curve_destroy(ret); stp_xml_exit(); return NULL; }
stp_array_t * stp_array_create_from_xmltree(stp_mxml_node_t *array) /* The array node */ { const char *stmp; /* Temporary string */ stp_mxml_node_t *child; /* Child sequence node */ int x_size, y_size; size_t count; stp_sequence_t *seq = NULL; stp_array_t *ret = NULL; stmp = stp_mxmlElementGetAttr(array, "x-size"); if (stmp) { x_size = (int) strtoul(stmp, NULL, 0); } else { stp_erprintf("stp_array_create_from_xmltree: \"x-size\" missing\n"); goto error; } /* Get y-size */ stmp = stp_mxmlElementGetAttr(array, "y-size"); if (stmp) { y_size = (int) strtoul(stmp, NULL, 0); } else { stp_erprintf("stp_array_create_from_xmltree: \"y-size\" missing\n"); goto error; } /* Get the sequence data */ child = stp_mxmlFindElement(array, array, "sequence", NULL, NULL, STP_MXML_DESCEND); if (child) seq = stp_sequence_create_from_xmltree(child); if (seq == NULL) goto error; ret = stp_array_create(x_size, y_size); if (ret->data) stp_sequence_destroy(ret->data); ret->data = seq; count = stp_sequence_get_size(seq); if (count != (x_size * y_size)) { stp_erprintf("stp_array_create_from_xmltree: size mismatch between array and sequence\n"); goto error; } return ret; error: stp_erprintf("stp_array_create_from_xmltree: error during array read\n"); if (ret) stp_array_destroy(ret); return NULL; }