[gtk-vnc] Added depth color tunning into VncDisplay.
- From: Jonh Wendell <jwendell src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [gtk-vnc] Added depth color tunning into VncDisplay.
- Date: Wed, 30 Sep 2009 15:42:16 +0000 (UTC)
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]