Example #1
0
/**
 * 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;
}
Example #2
0
/**
 * 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;
}
Example #3
0
/**
 * 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;
}
Example #4
0
/**
 * 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;
}
Example #5
0
/**
 * 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;
}