aboutsummaryrefslogtreecommitdiffstats
path: root/src/libgamma-facade.c
diff options
context:
space:
mode:
authorMattias Andrée <maandree@operamail.com>2014-05-21 07:43:09 +0200
committerMattias Andrée <maandree@operamail.com>2014-05-21 07:43:09 +0200
commit35444bf35a56805029a090a408d5a51464803cae (patch)
tree4bd2c51ebfba4ab4a7ef6e47f034941146de9afb /src/libgamma-facade.c
parentreorder functions (diff)
downloadlibgamma-35444bf35a56805029a090a408d5a51464803cae.tar.gz
libgamma-35444bf35a56805029a090a408d5a51464803cae.tar.bz2
libgamma-35444bf35a56805029a090a408d5a51464803cae.tar.xz
m + add gamma sets with mapping function rather than lookup tables
Signed-off-by: Mattias Andrée <maandree@operamail.com>
Diffstat (limited to 'src/libgamma-facade.c')
-rw-r--r--src/libgamma-facade.c267
1 files changed, 267 insertions, 0 deletions
diff --git a/src/libgamma-facade.c b/src/libgamma-facade.c
index e957fc2..ed23e9f 100644
--- a/src/libgamma-facade.c
+++ b/src/libgamma-facade.c
@@ -1302,6 +1302,273 @@ int libgamma_crtc_set_gamma_rampsd(libgamma_crtc_state_t* restrict this,
}
+
+/**
+ * Set the gamma ramps for a CRTC, 16-bit gamma-depth function version
+ *
+ * Note that this will probably involve the library allocating temporary data
+ *
+ * @param this The CRTC state
+ * @parma ramps The gamma ramps to apply
+ * @return Zero on success, otherwise (negative) the value of an
+ * error identifier provided by this library
+ */
+int libgamma_crtc_set_gamma_ramps_f(libgamma_crtc_state_t* restrict this,
+ libgamma_gamma_ramps_fun* red_function,
+ libgamma_gamma_ramps_fun* green_function,
+ libgamma_gamma_ramps_fun* blue_function)
+{
+ libgamma_crtc_information_t info;
+ libgamma_gamma_ramps_t ramps;
+ size_t i, n;
+ int e;
+
+ if (libgamma_get_crtc_information(&info, this, CRTC_INFO_GAMMA_SIZE))
+ {
+ e = info.gamma_size_error;
+ if (e < 0)
+ return e;
+ return errno = e, LIBGAMMA_ERRNO_SET;
+ }
+
+ n = ramps. red_size = info. red_gamma_size;
+ n += ramps.green_size = info.green_gamma_size;
+ n += ramps. blue_size = info. blue_gamma_size;
+
+ ramps. red = malloc(n * sizeof(uint16_t));
+ ramps.green = ramps. red + ramps. red_size;
+ ramps. blue = ramps.green + ramps.green_size;
+ if (ramps.red == NULL)
+ return LIBGAMMA_ERRNO_SET;
+
+ for (i = 0, n = ramps.red_size; i < n; i++)
+ ramps.red[i] = red_function((float)i / (float)(n - 1));
+
+ for (i = 0, n = ramps.green_size; i < n; i++)
+ ramps.green[i] = green_function((float)i / (float)(n - 1));
+
+ for (i = 0, n = ramps.blue_size; i < n; i++)
+ ramps.blue[i] = blue_function((float)i / (float)(n - 1));
+
+ e = libgamma_crtc_set_gamma_ramps(this, ramps);
+ free(ramps.red);
+ return e;
+}
+
+
+/**
+ * Set the gamma ramps for a CRTC, 32-bit gamma-depth function version
+ *
+ * Note that this will probably involve the library allocating temporary data
+ *
+ * @param this The CRTC state
+ * @parma ramps The gamma ramps to apply
+ * @return Zero on success, otherwise (negative) the value of an
+ * error identifier provided by this library
+ */
+int libgamma_crtc_set_gamma_ramps32_f(libgamma_crtc_state_t* restrict this,
+ libgamma_gamma_ramps32_fun* red_function,
+ libgamma_gamma_ramps32_fun* green_function,
+ libgamma_gamma_ramps32_fun* blue_function)
+{
+ libgamma_crtc_information_t info;
+ libgamma_gamma_ramps32_t ramps;
+ size_t i, n;
+ int e;
+
+ if (libgamma_get_crtc_information(&info, this, CRTC_INFO_GAMMA_SIZE))
+ {
+ e = info.gamma_size_error;
+ if (e < 0)
+ return e;
+ return errno = e, LIBGAMMA_ERRNO_SET;
+ }
+
+ n = ramps. red_size = info. red_gamma_size;
+ n += ramps.green_size = info.green_gamma_size;
+ n += ramps. blue_size = info. blue_gamma_size;
+
+ ramps. red = malloc(n * sizeof(uint32_t));
+ ramps.green = ramps. red + ramps. red_size;
+ ramps. blue = ramps.green + ramps.green_size;
+ if (ramps.red == NULL)
+ return LIBGAMMA_ERRNO_SET;
+
+ for (i = 0, n = ramps.red_size; i < n; i++)
+ ramps.red[i] = red_function((float)i / (float)(n - 1));
+
+ for (i = 0, n = ramps.green_size; i < n; i++)
+ ramps.green[i] = green_function((float)i / (float)(n - 1));
+
+ for (i = 0, n = ramps.blue_size; i < n; i++)
+ ramps.blue[i] = blue_function((float)i / (float)(n - 1));
+
+ e = libgamma_crtc_set_gamma_ramps32(this, ramps);
+ free(ramps.red);
+ return e;
+}
+
+
+/**
+ * Set the gamma ramps for a CRTC, 64-bit gamma-depth function version
+ *
+ * Note that this will probably involve the library allocating temporary data
+ *
+ * @param this The CRTC state
+ * @parma ramps The gamma ramps to apply
+ * @return Zero on success, otherwise (negative) the value of an
+ * error identifier provided by this library
+ */
+int libgamma_crtc_set_gamma_ramps64_f(libgamma_crtc_state_t* restrict this,
+ libgamma_gamma_ramps64_fun* red_function,
+ libgamma_gamma_ramps64_fun* green_function,
+ libgamma_gamma_ramps64_fun* blue_function)
+{
+ libgamma_crtc_information_t info;
+ libgamma_gamma_ramps64_t ramps;
+ size_t i, n;
+ int e;
+
+ if (libgamma_get_crtc_information(&info, this, CRTC_INFO_GAMMA_SIZE))
+ {
+ e = info.gamma_size_error;
+ if (e < 0)
+ return e;
+ return errno = e, LIBGAMMA_ERRNO_SET;
+ }
+
+ n = ramps. red_size = info. red_gamma_size;
+ n += ramps.green_size = info.green_gamma_size;
+ n += ramps. blue_size = info. blue_gamma_size;
+
+ ramps. red = malloc(n * sizeof(uint64_t));
+ ramps.green = ramps. red + ramps. red_size;
+ ramps. blue = ramps.green + ramps.green_size;
+ if (ramps.red == NULL)
+ return LIBGAMMA_ERRNO_SET;
+
+ for (i = 0, n = ramps.red_size; i < n; i++)
+ ramps.red[i] = red_function((float)i / (float)(n - 1));
+
+ for (i = 0, n = ramps.green_size; i < n; i++)
+ ramps.green[i] = green_function((float)i / (float)(n - 1));
+
+ for (i = 0, n = ramps.blue_size; i < n; i++)
+ ramps.blue[i] = blue_function((float)i / (float)(n - 1));
+
+ e = libgamma_crtc_set_gamma_ramps64(this, ramps);
+ free(ramps.red);
+ return e;
+}
+
+
+/**
+ * Set the gamma ramps for a CRTC, `float` function version
+ *
+ * Note that this will probably involve the library allocating temporary data
+ *
+ * @param this The CRTC state
+ * @parma ramps The gamma ramps to apply
+ * @return Zero on success, otherwise (negative) the value of an
+ * error identifier provided by this library
+ */
+int libgamma_crtc_set_gamma_rampsf_f(libgamma_crtc_state_t* restrict this,
+ libgamma_gamma_rampsf_fun* red_function,
+ libgamma_gamma_rampsf_fun* green_function,
+ libgamma_gamma_rampsf_fun* blue_function)
+{
+ libgamma_crtc_information_t info;
+ libgamma_gamma_rampsf_t ramps;
+ size_t i, n;
+ int e;
+
+ if (libgamma_get_crtc_information(&info, this, CRTC_INFO_GAMMA_SIZE))
+ {
+ e = info.gamma_size_error;
+ if (e < 0)
+ return e;
+ return errno = e, LIBGAMMA_ERRNO_SET;
+ }
+
+ n = ramps. red_size = info. red_gamma_size;
+ n += ramps.green_size = info.green_gamma_size;
+ n += ramps. blue_size = info. blue_gamma_size;
+
+ ramps. red = malloc(n * sizeof(float));
+ ramps.green = ramps. red + ramps. red_size;
+ ramps. blue = ramps.green + ramps.green_size;
+ if (ramps.red == NULL)
+ return LIBGAMMA_ERRNO_SET;
+
+ for (i = 0, n = ramps.red_size; i < n; i++)
+ ramps.red[i] = red_function((float)i / (float)(n - 1));
+
+ for (i = 0, n = ramps.green_size; i < n; i++)
+ ramps.green[i] = green_function((float)i / (float)(n - 1));
+
+ for (i = 0, n = ramps.blue_size; i < n; i++)
+ ramps.blue[i] = blue_function((float)i / (float)(n - 1));
+
+ e = libgamma_crtc_set_gamma_rampsf(this, ramps);
+ free(ramps.red);
+ return e;
+}
+
+
+/**
+ * Set the gamma ramps for a CRTC, `double` function version
+ *
+ * Note that this will probably involve the library allocating temporary data
+ *
+ * @param this The CRTC state
+ * @parma ramps The gamma ramps to apply
+ * @return Zero on success, otherwise (negative) the value of an
+ * error identifier provided by this library
+ */
+int libgamma_crtc_set_gamma_rampsd_f(libgamma_crtc_state_t* restrict this,
+ libgamma_gamma_rampsd_fun* red_function,
+ libgamma_gamma_rampsd_fun* green_function,
+ libgamma_gamma_rampsd_fun* blue_function)
+{
+ libgamma_crtc_information_t info;
+ libgamma_gamma_rampsd_t ramps;
+ size_t i, n;
+ int e;
+
+ if (libgamma_get_crtc_information(&info, this, CRTC_INFO_GAMMA_SIZE))
+ {
+ e = info.gamma_size_error;
+ if (e < 0)
+ return e;
+ return errno = e, LIBGAMMA_ERRNO_SET;
+ }
+
+ n = ramps. red_size = info. red_gamma_size;
+ n += ramps.green_size = info.green_gamma_size;
+ n += ramps. blue_size = info. blue_gamma_size;
+
+ ramps. red = malloc(n * sizeof(double));
+ ramps.green = ramps. red + ramps. red_size;
+ ramps. blue = ramps.green + ramps.green_size;
+ if (ramps.red == NULL)
+ return LIBGAMMA_ERRNO_SET;
+
+ for (i = 0, n = ramps.red_size; i < n; i++)
+ ramps.red[i] = red_function((double)i / (double)(n - 1));
+
+ for (i = 0, n = ramps.green_size; i < n; i++)
+ ramps.green[i] = green_function((double)i / (double)(n - 1));
+
+ for (i = 0, n = ramps.blue_size; i < n; i++)
+ ramps.blue[i] = blue_function((double)i / (double)(n - 1));
+
+ e = libgamma_crtc_set_gamma_rampsd(this, ramps);
+ free(ramps.red);
+ return e;
+}
+
+
+
#ifdef HAVE_NO_GAMMA_METHODS
# pragma GCC diagnostic pop
#endif