/** * cd_util_set_fix_metadata: **/ static gboolean cd_util_set_fix_metadata (CdUtilPrivate *priv, gchar **values, GError **error) { gchar *coverage_tmp; gdouble coverage; /* check arguments */ if (g_strv_length (values) != 1) { g_set_error_literal (error, 1, 0, "invalid input, expect 'filename'"); return FALSE; } /* get coverages of common spaces */ if (cd_icc_get_colorspace (priv->icc) == CD_COLORSPACE_RGB) { /* get the gamut coverage for sRGB */ coverage = cd_util_get_profile_coverage (priv, CD_STANDARD_SPACE_ADOBE_RGB, error); if (coverage < 0.0) return FALSE; coverage_tmp = g_strdup_printf ("%f", coverage); cd_icc_add_metadata (priv->icc, "GAMUT_coverage(adobe-rgb)", coverage_tmp); g_free (coverage_tmp); g_debug ("coverage of AdobeRGB: %f%%", coverage * 100.0f); /* get the gamut coverage for AdobeRGB */ coverage = cd_util_get_profile_coverage (priv, CD_STANDARD_SPACE_SRGB, error); if (coverage < 0.0) return FALSE; coverage_tmp = g_strdup_printf ("%.2f", coverage); cd_icc_add_metadata (priv->icc, "GAMUT_coverage(srgb)", coverage_tmp); g_free (coverage_tmp); g_debug ("coverage of sRGB: %f%%", coverage * 100.0f); } /* add CMS defines */ cd_icc_add_metadata (priv->icc, CD_PROFILE_METADATA_CMF_VERSION, PACKAGE_VERSION); return TRUE; }
/** * cd_util_icc_set_metadata_coverage: **/ static gboolean cd_util_icc_set_metadata_coverage (CdIcc *icc, GError **error) { const gchar *tmp; gdouble coverage = 0.0f; g_autofree gchar *coverage_tmp = NULL; g_autoptr(CdIcc) icc_srgb = NULL; /* is sRGB? */ tmp = cd_icc_get_metadata_item (icc, CD_PROFILE_METADATA_STANDARD_SPACE); if (g_strcmp0 (tmp, "srgb") == 0) return TRUE; /* calculate coverage (quite expensive to calculate, hence metadata) */ icc_srgb = cd_icc_new (); if (!cd_icc_create_default (icc_srgb, error)) return FALSE; if (!cd_icc_utils_get_coverage (icc_srgb, icc, &coverage, error)) return FALSE; if (coverage > 0.0) { coverage_tmp = g_strdup_printf ("%.2f", coverage); cd_icc_add_metadata (icc, "GAMUT_coverage(srgb)", coverage_tmp); } return TRUE; }
/** * cd_util_init_metadata: **/ static gboolean cd_util_init_metadata (CdUtilPrivate *priv, gchar **values, GError **error) { /* check arguments */ if (g_strv_length (values) != 1) { g_set_error_literal (error, 1, 0, "invalid input, expect 'filename'"); return FALSE; } /* add CMS defines */ cd_icc_add_metadata (priv->icc, CD_PROFILE_METADATA_CMF_PRODUCT, PACKAGE_NAME); cd_icc_add_metadata (priv->icc, CD_PROFILE_METADATA_CMF_BINARY, "cd-fix-profile"); cd_icc_add_metadata (priv->icc, CD_PROFILE_METADATA_CMF_VERSION, PACKAGE_VERSION); return TRUE; }
/** * cd_util_add_metadata: **/ static gboolean cd_util_add_metadata (CdUtilPrivate *priv, gchar **values, GError **error) { /* check arguments */ if (g_strv_length (values) != 3) { g_set_error_literal (error, 1, 0, "invalid input, expect 'filename' 'key' 'value'"); return FALSE; } /* add new entry */ cd_icc_add_metadata (priv->icc, values[1], values[2]); return TRUE; }
/** * cd_util_create_from_xml: **/ static gboolean cd_util_create_from_xml (CdUtilPrivate *priv, const gchar *filename, GError **error) { const GNode *profile; const GNode *tmp; gboolean ret = TRUE; GHashTable *hash; gssize data_len = -1; g_autofree gchar *data = NULL; g_autoptr(CdDom) dom = NULL; /* parse the XML into DOM */ if (!g_file_get_contents (filename, &data, (gsize *) &data_len, error)) return FALSE; dom = cd_dom_new (); if (!cd_dom_parse_xml_data (dom, data, data_len, error)) return FALSE; /* get root */ profile = cd_dom_get_node (dom, NULL, "profile"); if (profile == NULL) { g_set_error_literal (error, 1, 0, "invalid XML, expected profile"); return FALSE; } /* get type */ if (cd_dom_get_node (dom, profile, "primaries") != NULL) { if (!cd_util_create_standard_space (priv, dom, profile, error)) return FALSE; } else if (cd_dom_get_node (dom, profile, "temperature") != NULL) { if (!cd_util_create_temperature (priv, dom, profile, error)) return FALSE; } else if (cd_dom_get_node (dom, profile, "x11_gamma") != NULL) { if (!cd_util_create_x11_gamma (priv, dom, profile, error)) return FALSE; } else if (cd_dom_get_node (dom, profile, "named") != NULL) { if (!cd_util_create_named_color (priv, dom, profile, error)) return FALSE; } else if (cd_dom_get_node (dom, profile, "data_ti3") != NULL) { if (!cd_util_create_colprof (priv, dom, profile, error)) return FALSE; } else { g_set_error_literal (error, 1, 0, "invalid XML, unknown type"); return FALSE; } /* convert into a CdIcc object */ ret = cd_icc_load_handle (priv->icc, priv->lcms_profile, CD_ICC_LOAD_FLAGS_NONE, error); if (!ret) return FALSE; /* also write metadata */ tmp = cd_dom_get_node (dom, profile, "license"); if (tmp != NULL) { cd_icc_add_metadata (priv->icc, CD_PROFILE_METADATA_LICENSE, cd_dom_get_node_data (tmp)); } tmp = cd_dom_get_node (dom, profile, "standard_space"); if (tmp != NULL) { cd_icc_add_metadata (priv->icc, CD_PROFILE_METADATA_STANDARD_SPACE, cd_dom_get_node_data (tmp)); if (!cd_util_icc_set_metadata_coverage (priv->icc, error)) return FALSE; } tmp = cd_dom_get_node (dom, profile, "data_source"); if (tmp != NULL) { cd_icc_add_metadata (priv->icc, CD_PROFILE_METADATA_DATA_SOURCE, cd_dom_get_node_data (tmp)); } /* add CMS defines */ cd_icc_add_metadata (priv->icc, CD_PROFILE_METADATA_CMF_PRODUCT, PACKAGE_NAME); cd_icc_add_metadata (priv->icc, CD_PROFILE_METADATA_CMF_BINARY, "cd-create-profile"); cd_icc_add_metadata (priv->icc, CD_PROFILE_METADATA_CMF_VERSION, PACKAGE_VERSION); /* optional localized keys */ hash = cd_dom_get_node_localized (profile, "description"); if (hash != NULL) cd_icc_set_description_items (priv->icc, hash); hash = cd_dom_get_node_localized (profile, "copyright"); if (hash != NULL) cd_icc_set_copyright_items (priv->icc, hash); hash = cd_dom_get_node_localized (profile, "model"); if (hash != NULL) cd_icc_set_model_items (priv->icc, hash); hash = cd_dom_get_node_localized (profile, "manufacturer"); if (hash != NULL) cd_icc_set_manufacturer_items (priv->icc, hash); return TRUE; }