[3/6] Attach output profiles and build corresponding LUTs

Submitted by Niels Ole Salscheider on Oct. 13, 2014, 5:40 p.m.

Details

Message ID 1413222051-4637-4-git-send-email-niels_ole@salscheider-online.de
State Changes Requested
Headers show

Not browsing as part of any series.

Commit Message

Niels Ole Salscheider Oct. 13, 2014, 5:40 p.m.
This patch allows to attach an ICC profile to each output.

Signed-off-by: Niels Ole Salscheider <niels_ole@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(-)

Patch hide | download patch | download mbox

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 */

Comments

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_ole@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 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
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_ole@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);
> > 
> > +	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