summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Hughes <richard@hughsie.com>2017-07-20 13:46:29 +0100
committerRichard Hughes <richard@hughsie.com>2017-07-26 13:09:12 +0100
commit8e2e16015269ce98e34dd829e2a1dfd9bca54568 (patch)
tree5d6f198eecbd8cff0b50a4cd8ac41e925ca4657a
parent79d19adf91f4d3823fc75364cc7530678c13f8a7 (diff)
downloadcolord-8e2e16015269ce98e34dd829e2a1dfd9bca54568.tar.gz
Correctly build the ICC transfer curve for Rec709
Also, abort with an error if the transfer curve was invalid.
-rw-r--r--client/cd-create-profile.c32
-rw-r--r--contrib/colord.spec.in1
-rw-r--r--data/profiles/Makefile.am5
3 files changed, 29 insertions, 9 deletions
diff --git a/client/cd-create-profile.c b/client/cd-create-profile.c
index b4ef3b7..1dfc95c 100644
--- a/client/cd-create-profile.c
+++ b/client/cd-create-profile.c
@@ -414,7 +414,7 @@ cd_util_create_x11_gamma (CdUtilPrivate *priv,
* Values taken from lcms2.
**/
static cmsToneCurve *
-cd_util_build_srgb_gamma (void)
+cd_util_build_srgb_gamma (CdUtilPrivate *priv)
{
cmsFloat64Number params[5];
params[0] = 2.4;
@@ -422,14 +422,14 @@ cd_util_build_srgb_gamma (void)
params[2] = 0.055 / 1.055;
params[3] = 1. / 12.92;
params[4] = 0.04045;
- return cmsBuildParametricToneCurve (NULL, 4, params);
+ return cmsBuildParametricToneCurve (cd_icc_get_context (priv->icc), 4, params);
}
/**
* cd_util_build_lstar_gamma:
**/
static cmsToneCurve *
-cd_util_build_lstar_gamma (void)
+cd_util_build_lstar_gamma (CdUtilPrivate *priv)
{
cmsFloat64Number params[5];
params[0] = 3.000000;
@@ -437,14 +437,14 @@ cd_util_build_lstar_gamma (void)
params[2] = 0.137924;
params[3] = 0.110703;
params[4] = 0.080002;
- return cmsBuildParametricToneCurve (NULL, 4, params);
+ return cmsBuildParametricToneCurve (cd_icc_get_context (priv->icc), 4, params);
}
/**
* cd_util_build_rec709_gamma:
**/
static cmsToneCurve *
-cd_util_build_rec709_gamma (void)
+cd_util_build_rec709_gamma (CdUtilPrivate *priv)
{
cmsFloat64Number params[5];
params[0] = 1.0 / 0.45;
@@ -452,7 +452,8 @@ cd_util_build_rec709_gamma (void)
params[2] = 0.099;
params[3] = 4.500;
params[4] = 0.018;
- return cmsBuildParametricToneCurve (NULL, LCMS_CURVE_PLUGIN_TYPE_REC709, params);
+ return cmsBuildParametricToneCurve (cd_icc_get_context (priv->icc),
+ LCMS_CURVE_PLUGIN_TYPE_REC709, params);
}
/**
@@ -482,15 +483,15 @@ cd_util_create_standard_space (CdUtilPrivate *priv,
}
data = cd_dom_get_node_data (tmp);
if (g_strcmp0 (data, "sRGB") == 0) {
- transfer[0] = cd_util_build_srgb_gamma ();
+ transfer[0] = cd_util_build_srgb_gamma (priv);
transfer[1] = transfer[0];
transfer[2] = transfer[0];
} else if (g_strcmp0 (data, "L*") == 0) {
- transfer[0] = cd_util_build_lstar_gamma ();
+ transfer[0] = cd_util_build_lstar_gamma (priv);
transfer[1] = transfer[0];
transfer[2] = transfer[0];
} else if (g_strcmp0 (data, "Rec709") == 0) {
- transfer[0] = cd_util_build_rec709_gamma ();
+ transfer[0] = cd_util_build_rec709_gamma (priv);
transfer[1] = transfer[0];
transfer[2] = transfer[0];
} else {
@@ -506,6 +507,13 @@ cd_util_create_standard_space (CdUtilPrivate *priv,
transfer[1] = transfer[0];
transfer[2] = transfer[0];
}
+ if (transfer[0] == NULL) {
+ ret = FALSE;
+ g_set_error (error, 1, 0,
+ "failed to set transfer function for %s",
+ data);
+ goto out;
+ }
/* values taken from https://en.wikipedia.org/wiki/Standard_illuminant */
tmp = cd_dom_get_node (dom, root, "whitepoint");
@@ -587,6 +595,12 @@ cd_util_create_standard_space (CdUtilPrivate *priv,
&white,
&primaries,
transfer);
+ if (priv->lcms_profile == NULL) {
+ ret = FALSE;
+ g_set_error_literal (error, 1, 0,
+ "Failed to create profile");
+ goto out;
+ }
ret = TRUE;
out:
cmsFreeToneCurve (transfer[0]);
diff --git a/contrib/colord.spec.in b/contrib/colord.spec.in
index ab80d2a..0fbfc93 100644
--- a/contrib/colord.spec.in
+++ b/contrib/colord.spec.in
@@ -213,6 +213,7 @@ glib-compile-schemas %{_datadir}/glib-2.0/schemas &> /dev/null || :
%dir %{_icccolordir}/colord
%{_icccolordir}/colord/AdobeRGB1998.icc
%{_icccolordir}/colord/ProPhotoRGB.icc
+%{_icccolordir}/colord/Rec709.icc
%{_icccolordir}/colord/SMPTE-C-RGB.icc
%{_icccolordir}/colord/sRGB.icc
diff --git a/data/profiles/Makefile.am b/data/profiles/Makefile.am
index 6b90ed1..9fe5792 100644
--- a/data/profiles/Makefile.am
+++ b/data/profiles/Makefile.am
@@ -57,6 +57,7 @@ generatedprofiles = \
NTSC-RGB.icc \
PAL-RGB.icc \
ProPhotoRGB.icc \
+ Rec709.icc \
SMPTE-C-RGB.icc \
sRGB.icc \
WideGamutRGB.icc \
@@ -144,6 +145,10 @@ ProPhotoRGB.icc: ProPhotoRGB.xml
$(AM_V_GEN) $(CD_CREATE_PROFILE) \
--output $@ \
$(builddir)/ProPhotoRGB.xml
+Rec709.icc: Rec709.xml
+ $(AM_V_GEN) $(CD_CREATE_PROFILE) \
+ --output $@ \
+ $(builddir)/Rec709.xml
SMPTE-C-RGB.icc: SMPTE-C-RGB.xml
$(AM_V_GEN) $(CD_CREATE_PROFILE) \
--output $@ \