[PATCH 22/25] Remove jpeg_render function and use gdk-pixbuf directly
- From: "Daniel P. Berrange" <berrange redhat com>
- To: gtk-vnc-list gnome org
- Cc: "Daniel P. Berrange" <berrange redhat com>
- Subject: [PATCH 22/25] Remove jpeg_render function and use gdk-pixbuf directly
- Date: Sat, 21 Nov 2009 13:28:11 +0000
---
src/vncconnection.c | 48 +++++++++++++++++++++++-------------------------
src/vncconnection.h | 6 +-----
src/vncdisplay.c | 34 +---------------------------------
3 files changed, 25 insertions(+), 63 deletions(-)
diff --git a/src/vncconnection.c b/src/vncconnection.c
index 0eb3100..aeeaf1f 100644
--- a/src/vncconnection.c
+++ b/src/vncconnection.c
@@ -47,6 +47,7 @@
#include "utils.h"
#include <gnutls/gnutls.h>
#include <gnutls/x509.h>
+#include <gdk-pixbuf/gdk-pixbuf.h>
#if HAVE_SASL
#include <sasl/sasl.h>
@@ -58,7 +59,7 @@
#include <zlib.h>
-#include <gdk/gdkkeysyms.h>
+//#include <gdk/gdkkeysyms.h>
#include "getaddrinfo.h"
#include "dh.h"
@@ -2088,26 +2089,34 @@ static void vnc_connection_tight_update_gradient(VncConnection *conn,
g_free(last_row);
}
-static void jpeg_draw(void *opaque, int x, int y, int w, int h,
- guint8 *data, int stride)
-{
- VncConnection *conn = opaque;
- VncConnectionPrivate *priv = conn->priv;
-
- vnc_framebuffer_rgb24_blt(priv->fb, data, stride, x, y, w, h);
-}
static void vnc_connection_tight_update_jpeg(VncConnection *conn, guint16 x, guint16 y,
guint16 width, guint16 height,
guint8 *data, size_t length)
{
VncConnectionPrivate *priv = conn->priv;
+ GdkPixbufLoader *loader = gdk_pixbuf_loader_new();
+ GdkPixbuf *p;
+ guint8 *pixels;
- if (priv->ops.render_jpeg == NULL)
+ if (!gdk_pixbuf_loader_write(loader, data, length, NULL)) {
+ priv->has_error = TRUE;
return;
+ }
+
+ gdk_pixbuf_loader_close(loader, NULL);
+
+ p = g_object_ref(gdk_pixbuf_loader_get_pixbuf(loader));
+ g_object_unref(loader);
- priv->ops.render_jpeg(priv->ops_data, jpeg_draw, conn,
- x, y, width, height, data, length);
+ pixels = gdk_pixbuf_get_pixels(p);
+
+ vnc_framebuffer_rgb24_blt(priv->fb,
+ gdk_pixbuf_get_pixels(p),
+ gdk_pixbuf_get_rowstride(p),
+ x, y, width, height);
+
+ g_object_unref(p);
}
static void vnc_connection_tight_update(VncConnection *conn,
@@ -3932,21 +3941,10 @@ void vnc_connection_init(VncConnection *fb)
}
-VncConnection *vnc_connection_new(const struct vnc_connection_ops *ops, gpointer ops_data)
+VncConnection *vnc_connection_new(void)
{
- VncConnection *conn;
- VncConnectionPrivate *priv;
-
- conn = VNC_CONNECTION(g_object_new(VNC_TYPE_CONNECTION,
+ return VNC_CONNECTION(g_object_new(VNC_TYPE_CONNECTION,
NULL));
-
- priv = conn->priv;
-
- /* XXX kill this */
- memcpy(&priv->ops, ops, sizeof(*ops));
- priv->ops_data = ops_data;
-
- return conn;
}
void vnc_connection_close(VncConnection *conn)
diff --git a/src/vncconnection.h b/src/vncconnection.h
index b5b52fc..6c9cd11 100644
--- a/src/vncconnection.h
+++ b/src/vncconnection.h
@@ -66,13 +66,9 @@ struct _VncConnectionClass
void (*vnc_auth_choose_subtype)(VncConnection *conn, unsigned int type, GValueArray *subtypes);
};
-typedef void (rgb24_render_func)(void *, int, int, int, int, guint8 *, int);
-
struct vnc_connection_ops
{
gboolean (*set_color_map_entry)(void *, int, int, int, int);
- gboolean (*render_jpeg)(void *, rgb24_render_func *render, void *,
- int, int, int, int, guint8 *, int);
};
@@ -145,7 +141,7 @@ typedef enum
GType vnc_connection_get_type(void) G_GNUC_CONST;
-VncConnection *vnc_connection_new(const struct vnc_connection_ops *ops, gpointer ops_data);
+VncConnection *vnc_connection_new(void);
void vnc_connection_close(VncConnection *conn);
void vnc_connection_shutdown(VncConnection *conn);
diff --git a/src/vncdisplay.c b/src/vncdisplay.c
index 3a45401..197abf5 100644
--- a/src/vncdisplay.c
+++ b/src/vncdisplay.c
@@ -1253,38 +1253,6 @@ static gboolean check_pixbuf_support(const char *name)
return !!(i);
}
-static gboolean on_render_jpeg(void *opaque G_GNUC_UNUSED,
- rgb24_render_func *render, void *render_opaque,
- int x, int y, int w, int h,
- guint8 *data, int size)
-{
- GdkPixbufLoader *loader = gdk_pixbuf_loader_new();
- GdkPixbuf *p;
- guint8 *pixels;
-
- if (!gdk_pixbuf_loader_write(loader, data, size, NULL))
- return FALSE;
-
- gdk_pixbuf_loader_close(loader, NULL);
-
- p = g_object_ref(gdk_pixbuf_loader_get_pixbuf(loader));
- g_object_unref(loader);
-
- pixels = gdk_pixbuf_get_pixels(p);
-
- render(render_opaque, x, y, w, h,
- gdk_pixbuf_get_pixels(p),
- gdk_pixbuf_get_rowstride(p));
-
- g_object_unref(p);
-
- return TRUE;
-}
-
-static const struct vnc_connection_ops vnc_display_ops = {
- .render_jpeg = on_render_jpeg,
-};
-
/* we use an idle function to allow the coroutine to exit before we actually
* unref the object since the coroutine's state is part of the object */
static gboolean delayed_unref_object(gpointer data)
@@ -1969,7 +1937,7 @@ static void vnc_display_init(VncDisplay *display)
*/
priv->preferable_auths = g_slist_append (priv->preferable_auths, GUINT_TO_POINTER (GVNC_AUTH_NONE));
- priv->conn = vnc_connection_new(&vnc_display_ops, obj);
+ priv->conn = vnc_connection_new();
g_signal_connect(G_OBJECT(priv->conn), "vnc-cursor-changed",
G_CALLBACK(on_cursor_changed), display);
--
1.6.5.2
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]