[gtk-vnc] Added depth color tunning into VncDisplay.



commit 0c5803d72d5f5def736d9b0fe599dd8031f62077
Author: Jonh Wendell <jwendell gnome org>
Date:   Wed Sep 30 11:46:16 2009 -0300

    Added depth color tunning into VncDisplay.
    
    Provide a set_depth() in VncDisplay which tunes that setting.
    In gvnc_initialize we always call get_preferred_pixel_format() which
    makes use of that tunning.

 src/gvnc.c       |   12 +++---
 src/vncdisplay.c |  112 ++++++++++++++++++++++++++++++++++++++++++++++++------
 src/vncdisplay.h |   12 ++++++
 3 files changed, 118 insertions(+), 18 deletions(-)
---
diff --git a/src/gvnc.c b/src/gvnc.c
index 0f0e975..f15d0fa 100644
--- a/src/gvnc.c
+++ b/src/gvnc.c
@@ -3575,12 +3575,12 @@ gboolean gvnc_initialize(struct gvnc *gvnc, gboolean shared_flag)
 	if (gvnc_has_error(gvnc))
 		return FALSE;
 
-	if (!gvnc->fmt.true_color_flag && gvnc->ops.get_preferred_pixel_format) {
-		if (gvnc->ops.get_preferred_pixel_format(gvnc->ops_data, &gvnc->fmt))
-			gvnc_set_pixel_format(gvnc, &gvnc->fmt);
-		else
-			goto fail;
-	}
+	if (!gvnc->ops.get_preferred_pixel_format)
+		goto fail;
+	if (gvnc->ops.get_preferred_pixel_format(gvnc->ops_data, &gvnc->fmt))
+		gvnc_set_pixel_format(gvnc, &gvnc->fmt);
+	else
+		goto fail;
 	memset(&gvnc->strm, 0, sizeof(gvnc->strm));
 	/* FIXME what level? */
 	for (i = 0; i < 5; i++)
diff --git a/src/vncdisplay.c b/src/vncdisplay.c
index a8f67d9..05df8d2 100644
--- a/src/vncdisplay.c
+++ b/src/vncdisplay.c
@@ -69,6 +69,7 @@ struct _VncDisplayPrivate
 	struct gvnc *gvnc;
 
 	guint open_id;
+	VncDisplayDepthColor depth;
 
 	gboolean in_pointer_grab;
 	gboolean in_keyboard_grab;
@@ -132,7 +133,8 @@ enum
   PROP_LOSSY_ENCODING,
   PROP_SCALING,
   PROP_SHARED_FLAG,
-  PROP_FORCE_SIZE
+  PROP_FORCE_SIZE,
+  PROP_DEPTH
 };
 
 /* Signals */
@@ -215,6 +217,9 @@ vnc_display_get_property (GObject    *object,
       case PROP_FORCE_SIZE:
         g_value_set_boolean (value, vnc->priv->force_size);
 	break;
+      case PROP_DEPTH:
+        g_value_set_enum (value, vnc->priv->depth);
+	break;
       default:
 	G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
 	break;
@@ -255,6 +260,9 @@ vnc_display_set_property (GObject      *object,
       case PROP_FORCE_SIZE:
         vnc_display_set_force_size (vnc, g_value_get_boolean (value));
         break;
+      case PROP_DEPTH:
+        vnc_display_set_depth (vnc, g_value_get_enum (value));
+        break;
       default:
         G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
         break;
@@ -1019,19 +1027,65 @@ static gboolean on_get_preferred_pixel_format(void *opaque,
 	VncDisplay *obj = VNC_DISPLAY(opaque);
 	GdkVisual *v =  gdk_drawable_get_visual(GTK_WIDGET(obj)->window);
 
-	GVNC_DEBUG("Setting pixel format to true color");
+	switch (obj->priv->depth) {
+	case VNC_DISPLAY_DEPTH_COLOR_DEFAULT:
+		if (fmt->true_color_flag == 1)
+			break;
+	case VNC_DISPLAY_DEPTH_COLOR_FULL:
+		fmt->depth = 24;
+		fmt->bits_per_pixel = 32;
+		fmt->red_max = 255;
+		fmt->green_max = 255;
+		fmt->blue_max = 255;
+		fmt->red_shift = 16;
+		fmt->green_shift = 8;
+		fmt->blue_shift = 0;
+		fmt->true_color_flag = 1;
+		fmt->byte_order = v->byte_order == GDK_LSB_FIRST ? G_BIG_ENDIAN : G_LITTLE_ENDIAN;
+		break;
+	case VNC_DISPLAY_DEPTH_COLOR_MEDIUM:
+		fmt->depth = 15;
+		fmt->bits_per_pixel = 16;
+		fmt->red_max = 31;
+		fmt->green_max = 31;
+		fmt->blue_max = 31;
+		fmt->red_shift = 11;
+		fmt->green_shift = 6;
+		fmt->blue_shift = 1;
+		fmt->true_color_flag = 1;
+		fmt->byte_order = v->byte_order == GDK_LSB_FIRST ? G_BIG_ENDIAN : G_LITTLE_ENDIAN;
+		break;
+	case VNC_DISPLAY_DEPTH_COLOR_LOW:
+		fmt->depth = 8;
+		fmt->bits_per_pixel = 8;
+		fmt->red_max = 7;
+		fmt->green_max = 7;
+		fmt->blue_max = 3;
+		fmt->red_shift = 5;
+		fmt->green_shift = 2;
+		fmt->blue_shift = 0;
+		fmt->true_color_flag = 1;
+		fmt->byte_order = v->byte_order == GDK_LSB_FIRST ? G_BIG_ENDIAN : G_LITTLE_ENDIAN;
+		break;
 
-	fmt->true_color_flag = 1;
-	fmt->depth = v->depth;
-	fmt->bits_per_pixel = v->depth > 16 ? 32 : v->depth;
-	fmt->red_max = v->red_mask >> v->red_shift;
-	fmt->green_max = v->green_mask >> v->green_shift;
-	fmt->blue_max = v->blue_mask >> v->blue_shift;
-	fmt->red_shift = v->red_shift;
-	fmt->green_shift = v->green_shift;
-	fmt->blue_shift = v->blue_shift;
-	fmt->byte_order = v->byte_order == GDK_LSB_FIRST ? G_BIG_ENDIAN : G_LITTLE_ENDIAN;
+	case VNC_DISPLAY_DEPTH_COLOR_ULTRA_LOW:
+		fmt->depth = 3;
+		fmt->bits_per_pixel = 8;
+		fmt->red_max = 1;
+		fmt->green_max = 1;
+		fmt->blue_max = 1;
+		fmt->red_shift = 7;
+		fmt->green_shift = 6;
+		fmt->blue_shift = 5;
+		fmt->true_color_flag = 1;
+		fmt->byte_order = v->byte_order == GDK_LSB_FIRST ? G_BIG_ENDIAN : G_LITTLE_ENDIAN;
+		break;
 
+	default:
+		g_assert_not_reached ();
+	}
+
+	GVNC_DEBUG ("Setting depth color to %d (%d bpp)", fmt->depth, fmt->bits_per_pixel);
 	return TRUE;
 }
 
@@ -1718,6 +1772,19 @@ static void vnc_display_class_init(VncDisplayClass *klass)
 								G_PARAM_STATIC_NICK |
 								G_PARAM_STATIC_BLURB));
 
+	g_object_class_install_property (object_class,
+					 PROP_DEPTH,
+					 g_param_spec_enum    ( "depth",
+								"Depth",
+								"The color depth",
+								VNC_TYPE_DISPLAY_DEPTH_COLOR,
+								VNC_DISPLAY_DEPTH_COLOR_DEFAULT,
+								G_PARAM_READWRITE |
+								G_PARAM_CONSTRUCT |
+								G_PARAM_STATIC_NAME |
+								G_PARAM_STATIC_NICK |
+								G_PARAM_STATIC_BLURB));
+
 	signalCredParam = g_param_spec_enum("credential",
 					    "credential",
 					    "credential",
@@ -2143,6 +2210,27 @@ void vnc_display_set_force_size(VncDisplay *obj, gboolean enabled)
 	obj->priv->force_size = enabled;
 }
 
+void vnc_display_set_depth(VncDisplay *obj, VncDisplayDepthColor depth)
+{
+	g_return_if_fail (VNC_IS_DISPLAY (obj));
+
+	/* Ignore if we are already connected */
+	if (obj->priv->gvnc && gvnc_is_initialized(obj->priv->gvnc))
+		return;
+
+	if (obj->priv->depth == depth)
+		return;
+
+	obj->priv->depth = depth;
+}
+
+VncDisplayDepthColor vnc_display_get_depth(VncDisplay *obj)
+{
+	g_return_val_if_fail (VNC_IS_DISPLAY (obj), 0);
+
+	return obj->priv->depth;
+}
+
 gboolean vnc_display_get_force_size(VncDisplay *obj)
 {
 	g_return_val_if_fail (VNC_IS_DISPLAY (obj), FALSE);
diff --git a/src/vncdisplay.h b/src/vncdisplay.h
index acfd228..3a995eb 100644
--- a/src/vncdisplay.h
+++ b/src/vncdisplay.h
@@ -77,6 +77,15 @@ typedef enum
 	VNC_DISPLAY_KEY_EVENT_CLICK = 3,
 } VncDisplayKeyEvent;
 
+typedef enum
+{
+	VNC_DISPLAY_DEPTH_COLOR_DEFAULT = 0,
+	VNC_DISPLAY_DEPTH_COLOR_FULL,
+	VNC_DISPLAY_DEPTH_COLOR_MEDIUM,
+	VNC_DISPLAY_DEPTH_COLOR_LOW,
+	VNC_DISPLAY_DEPTH_COLOR_ULTRA_LOW
+} VncDisplayDepthColor;
+
 G_BEGIN_DECLS
 
 GType		vnc_display_get_type(void);
@@ -128,6 +137,9 @@ gboolean	vnc_display_get_force_size(VncDisplay *obj);
 void		vnc_display_set_shared_flag(VncDisplay *obj, gboolean shared);
 gboolean	vnc_display_get_shared_flag(VncDisplay *obj);
 
+void			vnc_display_set_depth(VncDisplay *obj, VncDisplayDepthColor depth);
+VncDisplayDepthColor	vnc_display_get_depth(VncDisplay *obj);
+
 void		vnc_display_force_grab(VncDisplay *obj, gboolean enable);
 
 gboolean	vnc_display_is_pointer_absolute(VncDisplay *obj);



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]