Re: [PATCH 3/6] Attach output profiles and build corresponding LUTs
On Wednesday 15 October 2014, 21:56:53, Bryce Harrington wrote: On Mon, Oct 13, 2014 at 07:40:48PM +0200, Niels Ole Salscheider wrote: 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); error checking on the file open + 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); + } +*/ Is this supposed to be TODO'd out? If so, could use an explanatory statement. Not really... It is implemented now. +} + 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); +
Re: [PATCH 3/6] Attach output profiles and build corresponding LUTs
On Mon, Oct 13, 2014 at 07:40:48PM +0200, Niels Ole Salscheider wrote: 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); error checking on the file open + 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); + } +*/ Is this supposed to be TODO'd out? If so, could use an explanatory statement. +} + 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