[clutter/wip/actor-content: 5/33] image: Implement synchronous loading
- From: Emmanuele Bassi <ebassi src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [clutter/wip/actor-content: 5/33] image: Implement synchronous loading
- Date: Wed, 18 May 2011 11:10:50 +0000 (UTC)
commit 8a64e3cf2affcd2bdc1f20b490e7458c33809820
Author: Emmanuele Bassi <ebassi linux intel com>
Date: Mon Dec 6 18:10:52 2010 +0000
image: Implement synchronous loading
Use the GFile and the ImageLoader synchronous API.
clutter/clutter-image.c | 63 +++++++++++++++++++++++++++++++++++++
tests/conform/Makefile.am | 1 +
tests/conform/test-conform-main.c | 2 +
tests/conform/test-image.c | 34 ++++++++++++++++++++
4 files changed, 100 insertions(+), 0 deletions(-)
---
diff --git a/clutter/clutter-image.c b/clutter/clutter-image.c
index b8ccd1d..7ca97ed 100644
--- a/clutter/clutter-image.c
+++ b/clutter/clutter-image.c
@@ -7,11 +7,14 @@
#include "clutter-image.h"
#include "clutter-debug.h"
+#include "clutter-image-loader.h"
#include "clutter-marshal.h"
#include "clutter-private.h"
struct _ClutterImagePrivate
{
+ ClutterImageLoader *loader;
+
gint image_width;
gint image_height;
@@ -132,6 +135,8 @@ clutter_image_class_init (ClutterImageClass *klass)
gobject_class->get_property = clutter_image_get_property;
g_object_class_install_properties (gobject_class, LAST_PROP, image_props);
+ gobject_class->dispose = clutter_image_dispose;
+
image_signals[SIZE_CHANGED] =
g_signal_new (I_("size-changed"),
G_TYPE_FROM_CLASS (klass),
@@ -221,11 +226,69 @@ clutter_image_load (ClutterImage *image,
gint *height,
GError **error)
{
+ ClutterImagePrivate *priv;
+ GFileInputStream *stream;
+ CoglHandle texture;
+ gboolean res;
+
g_return_val_if_fail (CLUTTER_IS_IMAGE (image), FALSE);
g_return_val_if_fail (G_IS_FILE (gfile), FALSE);
g_return_val_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable),
FALSE);
+ priv = image->priv;
+
+ if (priv->loader == NULL)
+ {
+ priv->loader = _clutter_image_loader_new ();
+ if (priv->loader == NULL)
+ return FALSE;
+
+ CLUTTER_NOTE (MISC, "Image loader type: %s",
+ G_OBJECT_TYPE_NAME (priv->loader));
+ }
+
+ stream = g_file_read (gfile, cancellable, error);
+ if (stream == NULL)
+ return FALSE;
+
+ res = _clutter_image_loader_load_stream (priv->loader,
+ G_INPUT_STREAM (stream),
+ cancellable,
+ error);
+ if (!res)
+ {
+ g_object_unref (stream);
+ return FALSE;
+ }
+
+ _clutter_image_loader_get_image_size (priv->loader,
+ &priv->image_width,
+ &priv->image_height);
+
+ texture = _clutter_image_loader_get_texture_handle (priv->loader);
+ if (texture == COGL_INVALID_HANDLE)
+ {
+ g_object_unref (stream);
+ return FALSE;
+ }
+
+ cogl_material_set_layer (priv->material, 0, texture);
+
+ g_signal_emit (image, image_signals[SIZE_CHANGED], 0,
+ priv->image_width,
+ priv->image_height);
+
+ if (width)
+ *width = priv->image_width;
+
+ if (height)
+ *height = priv->image_height;
+
+ g_object_unref (priv->loader);
+ priv->loader = NULL;
+
+ g_object_unref (stream);
return TRUE;
}
diff --git a/tests/conform/Makefile.am b/tests/conform/Makefile.am
index 0a57ad0..b006375 100644
--- a/tests/conform/Makefile.am
+++ b/tests/conform/Makefile.am
@@ -83,6 +83,7 @@ units_sources += \
test-color.c \
test-model.c \
test-script-parser.c \
+ test-image.c \
$(NULL)
test_conformance_SOURCES = $(common_sources) $(units_sources)
diff --git a/tests/conform/test-conform-main.c b/tests/conform/test-conform-main.c
index 1cc7d5d..19c55c4 100644
--- a/tests/conform/test-conform-main.c
+++ b/tests/conform/test-conform-main.c
@@ -210,6 +210,8 @@ main (int argc, char **argv)
TEST_CONFORM_SIMPLE ("/behaviours", test_behaviours);
+ TEST_CONFORM_SIMPLE ("/image", image_sync_loading);
+
TEST_CONFORM_SIMPLE ("/cogl", test_cogl_object);
TEST_CONFORM_SIMPLE ("/cogl", test_cogl_fixed);
TEST_CONFORM_SIMPLE ("/cogl", test_cogl_backface_culling);
diff --git a/tests/conform/test-image.c b/tests/conform/test-image.c
new file mode 100644
index 0000000..efccd24
--- /dev/null
+++ b/tests/conform/test-image.c
@@ -0,0 +1,34 @@
+#include <clutter/clutter.h>
+#include "test-conform-common.h"
+
+void
+image_sync_loading (void)
+{
+ ClutterImage *image = clutter_image_new ();
+ GError *error;
+ GFile *gfile;
+ gint width, height;
+ gboolean res;
+
+ g_assert (CLUTTER_IS_IMAGE (image));
+
+ gfile = g_file_new_for_path (TESTS_DATADIR "/redhand.png");
+
+ width = height = 0;
+ error = NULL;
+
+ res = clutter_image_load (image, gfile, NULL,
+ &width,
+ &height,
+ &error);
+
+ if (g_test_verbose() && error != NULL)
+ g_print ("Unexpected error: %s\n", error->message);
+
+ g_assert (error == NULL);
+ g_assert (res);
+ g_assert (width > 0 && height > 0);
+
+ g_object_unref (gfile);
+ g_object_unref (image);
+}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]