This patch allows to attach an ICC profile to each output. Signed-off-by: Niels Ole Salscheider <niels_...@salscheider-online.de> --- src/cms-colord.c | 4 +++- src/cms-helper.c | 16 +++++++++++++++- src/cms-helper.h | 3 ++- src/cms-static.c | 1 + src/compositor.c | 18 ++++++++++++++++++ src/compositor.h | 2 ++ 6 files changed, 41 insertions(+), 3 deletions(-)
diff --git a/src/cms-colord.c b/src/cms-colord.c index 4ff3aac..5696ea3 100644 --- a/src/cms-colord.c +++ b/src/cms-colord.c @@ -155,8 +155,9 @@ colord_update_output_from_device (struct cms_output *ocms) gint percentage; /* old profile is no longer valid */ - weston_cms_destroy_profile(ocms->p); + weston_cms_destroy_profile(ocms->o, ocms->p); ocms->p = NULL; + wl_signal_emit(&ocms->o->profile_signal, ocms->o); ret = cd_device_connect_sync(ocms->device, NULL, &error); if (!ret) { @@ -384,6 +385,7 @@ colord_dispatch_all_pending(int fd, uint32_t mask, void *data) } weston_cms_set_color_profile(ocms->o, ocms->p); + wl_signal_emit(&ocms->o->profile_signal, ocms->o); } g_list_free (cms->pending); cms->pending = NULL; diff --git a/src/cms-helper.c b/src/cms-helper.c index c063c77..4e20f28 100644 --- a/src/cms-helper.c +++ b/src/cms-helper.c @@ -25,6 +25,8 @@ #include <stdlib.h> #include <string.h> #include <stdio.h> +#include <fcntl.h> +#include <unistd.h> #ifdef HAVE_LCMS #include <lcms2.h> @@ -63,6 +65,13 @@ weston_cms_set_color_profile(struct weston_output *o, uint16_t *red = NULL; uint16_t *green = NULL; uint16_t *blue = NULL; + int fd; + + fd = open(p->filename, 0); + o->colorspace = weston_colorspace_from_fd(fd , 0, o->compositor); + close(fd); + if (o->colorspace == NULL) + o->colorspace = &o->compositor->srgb_colorspace; if (!o->set_gamma) return; @@ -96,13 +105,18 @@ weston_cms_set_color_profile(struct weston_output *o, } void -weston_cms_destroy_profile(struct weston_color_profile *p) +weston_cms_destroy_profile(struct weston_output *o, + struct weston_color_profile *p) { if (!p) return; #ifdef HAVE_LCMS cmsCloseProfile(p->lcms_handle); #endif + + weston_colorspace_destroy(o->colorspace); + o->colorspace = &o->compositor->srgb_colorspace; + free(p->filename); free(p); } diff --git a/src/cms-helper.h b/src/cms-helper.h index 6e5594d..3fd17b3 100644 --- a/src/cms-helper.h +++ b/src/cms-helper.h @@ -67,6 +67,7 @@ weston_cms_create_profile(const char *filename, struct weston_color_profile * weston_cms_load_profile(const char *filename); void -weston_cms_destroy_profile(struct weston_color_profile *p); +weston_cms_destroy_profile(struct weston_output *o, + struct weston_color_profile *p); #endif diff --git a/src/cms-static.c b/src/cms-static.c index ad54fd1..c7dce58 100644 --- a/src/cms-static.c +++ b/src/cms-static.c @@ -58,6 +58,7 @@ cms_output_created(struct cms_static *cms, struct weston_output *o) weston_log("cms-static: loading %s for %s\n", profile, o->name); weston_cms_set_color_profile(o, p); + wl_signal_emit(&o->profile_signal, o); } } diff --git a/src/compositor.c b/src/compositor.c index 4f959a4..61b70e7 100644 --- a/src/compositor.c +++ b/src/compositor.c @@ -3516,6 +3516,20 @@ weston_compositor_remove_output(struct weston_compositor *compositor, } } +static void +weston_output_notifier_profile(struct wl_listener *listener, void *data) +{ +/* TODO: + struct weston_output *output = (struct weston_output *) data; + struct weston_compositor *ec = output->compositor; + struct weston_resource *resource; + + for each wl_cms resource { + wl_cms_send_output_colorspace_changed(resource, output); + } +*/ +} + WL_EXPORT void weston_output_destroy(struct weston_output *output) { @@ -3736,10 +3750,14 @@ weston_output_init(struct weston_output *output, struct weston_compositor *c, wl_signal_init(&output->frame_signal); wl_signal_init(&output->destroy_signal); + wl_signal_init(&output->profile_signal); wl_list_init(&output->animation_list); wl_list_init(&output->resource_list); wl_list_init(&output->feedback_list); + output->profile_listener.notify = weston_output_notifier_profile; + wl_signal_add(&output->profile_signal, &output->profile_listener); + output->id = ffs(~output->compositor->output_id_pool) - 1; output->compositor->output_id_pool |= 1 << output->id; diff --git a/src/compositor.h b/src/compositor.h index 5f198a9..419a56a 100644 --- a/src/compositor.h +++ b/src/compositor.h @@ -224,6 +224,8 @@ struct weston_output { int dirty; struct wl_signal frame_signal; struct wl_signal destroy_signal; + struct wl_signal profile_signal; + struct wl_listener profile_listener; int move_x, move_y; uint32_t frame_time; /* presentation timestamp in milliseconds */ uint64_t msc; /* media stream counter */ -- 2.1.2 _______________________________________________ wayland-devel mailing list wayland-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/wayland-devel