[gnome-photos/wip/rishi/buffer-decoder: 10/17] Add PhotosGeglBufferLoaderBuilder
- From: Debarshi Ray <debarshir src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-photos/wip/rishi/buffer-decoder: 10/17] Add PhotosGeglBufferLoaderBuilder
- Date: Sat, 19 Jan 2019 23:17:50 +0000 (UTC)
commit 4c5c09c8606548718a947a04b1ab47d86330b065
Author: Debarshi Ray <debarshir gnome org>
Date: Wed Aug 1 17:16:47 2018 +0200
Add PhotosGeglBufferLoaderBuilder
https://gitlab.gnome.org/GNOME/gnome-photos/issues/63
src/Makefile.am | 2 +
src/meson.build | 1 +
src/photos-gegl-buffer-loader-builder.c | 144 ++++++++++++++++++++++++++
src/photos-gegl-buffer-loader-builder.h | 53 ++++++++++
tests/unit/Makefile.am | 18 ++++
tests/unit/meson.build | 3 +
tests/unit/photos-test-gegl-buffer.c | 176 ++++++++++++++++++++++++++++++++
7 files changed, 397 insertions(+)
---
diff --git a/src/Makefile.am b/src/Makefile.am
index f8634e75..4afd6dd4 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -30,6 +30,8 @@ libgnome_photos_la_SOURCES = \
photos-gegl-buffer-codec.h \
photos-gegl-buffer-loader.c \
photos-gegl-buffer-loader.h \
+ photos-gegl-buffer-loader-builder.c \
+ photos-gegl-buffer-loader-builder.h \
photos-jpeg-count.c \
photos-jpeg-count.h \
photos-operation-insta-common.h \
diff --git a/src/meson.build b/src/meson.build
index 629c9e8e..e641a5cb 100644
--- a/src/meson.build
+++ b/src/meson.build
@@ -6,6 +6,7 @@ sources = files(
'photos-gegl.c',
'photos-gegl-buffer-codec.c',
'photos-gegl-buffer-loader.c',
+ 'photos-gegl-buffer-loader-builder.c',
'photos-jpeg-count.c',
'photos-operation-insta-curve.c',
'photos-operation-insta-filter.c',
diff --git a/src/photos-gegl-buffer-loader-builder.c b/src/photos-gegl-buffer-loader-builder.c
new file mode 100644
index 00000000..0146564f
--- /dev/null
+++ b/src/photos-gegl-buffer-loader-builder.c
@@ -0,0 +1,144 @@
+/*
+ * Photos - access, organize and share your photos on GNOME
+ * Copyright © 2018 Red Hat, Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+
+#include "config.h"
+
+#include "photos-gegl-buffer-loader-builder.h"
+
+
+struct _PhotosGeglBufferLoaderBuilder
+{
+ GObject parent_instance;
+ GFile *file;
+ gboolean keep_aspect_ratio;
+ gboolean sealed;
+ gint height;
+ gint width;
+};
+
+
+G_DEFINE_TYPE (PhotosGeglBufferLoaderBuilder, photos_gegl_buffer_loader_builder, G_TYPE_OBJECT);
+
+
+static void
+photos_gegl_buffer_loader_builder_dispose (GObject *object)
+{
+ PhotosGeglBufferLoaderBuilder *self = PHOTOS_GEGL_BUFFER_LOADER_BUILDER (object);
+
+ g_clear_object (&self->file);
+
+ G_OBJECT_CLASS (photos_gegl_buffer_loader_builder_parent_class)->dispose (object);
+}
+
+
+static void
+photos_gegl_buffer_loader_builder_init (PhotosGeglBufferLoaderBuilder *self)
+{
+ self->keep_aspect_ratio = TRUE;
+ self->height = -1;
+ self->width = -1;
+}
+
+
+static void
+photos_gegl_buffer_loader_builder_class_init (PhotosGeglBufferLoaderBuilderClass *class)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (class);
+
+ object_class->dispose = photos_gegl_buffer_loader_builder_dispose;
+}
+
+
+PhotosGeglBufferLoaderBuilder *
+photos_gegl_buffer_loader_builder_new (void)
+{
+ return g_object_new (PHOTOS_TYPE_GEGL_BUFFER_LOADER_BUILDER, NULL);
+}
+
+
+PhotosGeglBufferLoaderBuilder *
+photos_gegl_buffer_loader_builder_set_file (PhotosGeglBufferLoaderBuilder *self, GFile *file)
+{
+ g_return_val_if_fail (PHOTOS_IS_GEGL_BUFFER_LOADER_BUILDER (self), NULL);
+ g_return_val_if_fail (!self->sealed, NULL);
+
+ g_return_val_if_fail (G_IS_FILE (file), NULL);
+
+ g_set_object (&self->file, file);
+ return self;
+}
+
+
+PhotosGeglBufferLoaderBuilder *
+photos_gegl_buffer_loader_builder_set_height (PhotosGeglBufferLoaderBuilder *self, gint height)
+{
+ g_return_val_if_fail (PHOTOS_IS_GEGL_BUFFER_LOADER_BUILDER (self), NULL);
+ g_return_val_if_fail (height >= -1, NULL);
+ g_return_val_if_fail (height != 0, NULL);
+ g_return_val_if_fail (!self->sealed, NULL);
+
+ self->height = height;
+ return self;
+}
+
+
+PhotosGeglBufferLoaderBuilder *
+photos_gegl_buffer_loader_builder_set_keep_aspect_ratio (PhotosGeglBufferLoaderBuilder *self,
+ gboolean keep_aspect_ratio)
+{
+ g_return_val_if_fail (PHOTOS_IS_GEGL_BUFFER_LOADER_BUILDER (self), NULL);
+ g_return_val_if_fail (!self->sealed, NULL);
+
+ self->keep_aspect_ratio = keep_aspect_ratio;
+ return self;
+}
+
+
+PhotosGeglBufferLoaderBuilder *
+photos_gegl_buffer_loader_builder_set_width (PhotosGeglBufferLoaderBuilder *self, gint width)
+{
+ g_return_val_if_fail (PHOTOS_IS_GEGL_BUFFER_LOADER_BUILDER (self), NULL);
+ g_return_val_if_fail (width >= -1, NULL);
+ g_return_val_if_fail (width != 0, NULL);
+ g_return_val_if_fail (!self->sealed, NULL);
+
+ self->width = width;
+ return self;
+}
+
+
+PhotosGeglBufferLoader *
+photos_gegl_buffer_loader_builder_to_loader (PhotosGeglBufferLoaderBuilder *self)
+{
+ PhotosGeglBufferLoader *loader;
+
+ g_return_val_if_fail (PHOTOS_IS_GEGL_BUFFER_LOADER_BUILDER (self), NULL);
+ g_return_val_if_fail (!self->sealed, NULL);
+
+ self->sealed = TRUE;
+ loader = g_object_new (PHOTOS_TYPE_GEGL_BUFFER_LOADER,
+ "file", self->file,
+ "height", self->height,
+ "keep-aspect-ratio", self->keep_aspect_ratio,
+ "width", self->width,
+ NULL);
+
+ g_return_val_if_fail (self->sealed, NULL);
+ return loader;
+}
diff --git a/src/photos-gegl-buffer-loader-builder.h b/src/photos-gegl-buffer-loader-builder.h
new file mode 100644
index 00000000..cfb8aac6
--- /dev/null
+++ b/src/photos-gegl-buffer-loader-builder.h
@@ -0,0 +1,53 @@
+/*
+ * Photos - access, organize and share your photos on GNOME
+ * Copyright © 2018 Red Hat, Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef PHOTOS_GEGL_BUFFER_LOADER_BUILDER_H
+#define PHOTOS_GEGL_BUFFER_LOADER_BUILDER_H
+
+#include <gio/gio.h>
+
+#include "photos-gegl-buffer-loader.h"
+
+G_BEGIN_DECLS
+
+#define PHOTOS_TYPE_GEGL_BUFFER_LOADER_BUILDER (photos_gegl_buffer_loader_builder_get_type ())
+G_DECLARE_FINAL_TYPE (PhotosGeglBufferLoaderBuilder,
+ photos_gegl_buffer_loader_builder,
+ PHOTOS,
+ GEGL_BUFFER_LOADER_BUILDER,
+ GObject);
+
+PhotosGeglBufferLoaderBuilder *photos_gegl_buffer_loader_builder_new (void);
+
+PhotosGeglBufferLoaderBuilder *photos_gegl_buffer_loader_builder_set_file (PhotosGeglBufferLoaderBuilder
*self,
+ GFile *file);
+
+PhotosGeglBufferLoaderBuilder *photos_gegl_buffer_loader_builder_set_height (PhotosGeglBufferLoaderBuilder
*self,
+ gint height);
+
+PhotosGeglBufferLoaderBuilder *photos_gegl_buffer_loader_builder_set_keep_aspect_ratio
(PhotosGeglBufferLoaderBuilder *self,
+ gboolean
keep_aspect_ratio);
+
+PhotosGeglBufferLoaderBuilder *photos_gegl_buffer_loader_builder_set_width (PhotosGeglBufferLoaderBuilder
*self,
+ gint width);
+
+PhotosGeglBufferLoader *photos_gegl_buffer_loader_builder_to_loader (PhotosGeglBufferLoaderBuilder
*self);
+
+G_END_DECLS
+
+#endif /* PHOTOS_GEGL_BUFFER_LOADER_BUILDER_H */
diff --git a/tests/unit/Makefile.am b/tests/unit/Makefile.am
index 4e895b6e..0629c2fa 100644
--- a/tests/unit/Makefile.am
+++ b/tests/unit/Makefile.am
@@ -11,6 +11,7 @@ dist_test_data = \
test_programs = \
photos-test-gegl \
+ photos-test-gegl-buffer \
photos-test-pipeline \
$(NULL)
@@ -33,6 +34,23 @@ photos_test_gegl_LDADD = \
$(top_builddir)/src/libgnome-photos.la \
$(NULL)
+photos_test_gegl_buffer_CPPFLAGS = \
+ $(GDK_PIXBUF_CFLAGS) \
+ $(GEGL_CFLAGS) \
+ $(GIO_CFLAGS) \
+ $(GLIB_CFLAGS) \
+ -I$(top_builddir)/src \
+ -I$(top_srcdir)/src \
+ $(NULL)
+
+photos_test_gegl_buffer_LDADD = \
+ $(GDK_PIXBUF_LIBS) \
+ $(GEGL_LIBS) \
+ $(GIO_LIBS) \
+ $(GLIB_LIBS) \
+ $(top_builddir)/src/libgnome-photos.la \
+ $(NULL)
+
photos_test_pipeline_CPPFLAGS = \
$(GDK_PIXBUF_CFLAGS) \
$(GEGL_CFLAGS) \
diff --git a/tests/unit/meson.build b/tests/unit/meson.build
index 6acbf22b..7ac412f9 100644
--- a/tests/unit/meson.build
+++ b/tests/unit/meson.build
@@ -15,6 +15,9 @@ tests = {
'photos-test-gegl': {
'dependencies': [babl_dep, gdk_pixbuf_dep, gegl_dep, gio_dep, gio_unix_dep, glib_dep,
libgnome_photos_dep]
},
+ 'photos-test-gegl-buffer': {
+ 'dependencies': [gdk_pixbuf_dep, gegl_dep, gio_dep, gio_unix_dep, glib_dep, libgnome_photos_dep]
+ },
'photos-test-pipeline': {
'dependencies': [gdk_pixbuf_dep, gegl_dep, gio_dep, gio_unix_dep, glib_dep, libgnome_photos_dep]
},
diff --git a/tests/unit/photos-test-gegl-buffer.c b/tests/unit/photos-test-gegl-buffer.c
new file mode 100644
index 00000000..03ef5e40
--- /dev/null
+++ b/tests/unit/photos-test-gegl-buffer.c
@@ -0,0 +1,176 @@
+/*
+ * Photos - access, organize and share your photos on GNOME
+ * Copyright © 2018 Red Hat, Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+
+#include "config.h"
+
+#include <locale.h>
+
+#include <gegl.h>
+#include <gio/gio.h>
+#include <glib.h>
+
+#include "photos-debug.h"
+#include "photos-gegl.h"
+#include "photos-gegl-buffer-loader.h"
+#include "photos-gegl-buffer-loader-builder.h"
+
+
+typedef struct _PhotosTestGeglBufferFixture PhotosTestGeglBufferFixture;
+
+struct _PhotosTestGeglBufferFixture
+{
+ GAsyncResult *res;
+ GMainContext *context;
+ GMainLoop *loop;
+};
+
+
+static gchar *
+photos_test_gegl_buffer_filename_to_uri (const gchar *filename)
+{
+ g_autoptr (GFile) file = NULL;
+ g_autofree gchar *path_relative = NULL;
+ gchar *uri = NULL;
+
+ path_relative = g_test_build_filename (G_TEST_DIST, filename, NULL);
+ file = g_file_new_for_path (path_relative);
+ uri = g_file_get_uri (file);
+ return uri;
+}
+
+
+static void
+photos_test_gegl_buffer_setup (PhotosTestGeglBufferFixture *fixture, gconstpointer user_data)
+{
+ fixture->context = g_main_context_new ();
+ g_main_context_push_thread_default (fixture->context);
+ fixture->loop = g_main_loop_new (fixture->context, FALSE);
+}
+
+
+static void
+photos_test_gegl_buffer_teardown (PhotosTestGeglBufferFixture *fixture, gconstpointer user_data)
+{
+ g_clear_object (&fixture->res);
+ g_main_context_pop_thread_default (fixture->context);
+ g_main_context_unref (fixture->context);
+ g_main_loop_unref (fixture->loop);
+}
+
+
+static void
+photos_test_gegl_buffer_async (GObject *source_object, GAsyncResult *res, gpointer user_data)
+{
+ PhotosTestGeglBufferFixture *fixture = (PhotosTestGeglBufferFixture *) user_data;
+
+ g_assert_null (fixture->res);
+ fixture->res = g_object_ref (res);
+ g_main_loop_quit (fixture->loop);
+}
+
+
+static void
+photos_test_gegl_buffer_loader_builder (void)
+{
+ GFile *file_loader;
+ g_autoptr (GFile) file_builder = NULL;
+ GeglBuffer *buffer;
+ g_autoptr (PhotosGeglBufferLoader) loader = NULL;
+ g_autoptr (PhotosGeglBufferLoaderBuilder) builder = NULL;
+ gint height;
+ gint width;
+
+ builder = photos_gegl_buffer_loader_builder_new ();
+
+ file_builder = g_file_new_for_uri ("resource:///org/gnome/Photos/gegl/vignette.png");
+ photos_gegl_buffer_loader_builder_set_file (builder, file_builder);
+
+ photos_gegl_buffer_loader_builder_set_height (builder, 200);
+ photos_gegl_buffer_loader_builder_set_keep_aspect_ratio (builder, FALSE);
+ photos_gegl_buffer_loader_builder_set_width (builder, 300);
+
+ loader = photos_gegl_buffer_loader_builder_to_loader (builder);
+ g_assert_true (PHOTOS_IS_GEGL_BUFFER_LOADER (loader));
+
+ buffer = photos_gegl_buffer_loader_get_buffer (loader);
+ g_assert_null (buffer);
+
+ file_loader = photos_gegl_buffer_loader_get_file (loader);
+ g_assert_true (file_loader == file_builder);
+
+ height = photos_gegl_buffer_loader_get_height (loader);
+ g_assert_cmpint (height, ==, 200);
+
+ g_assert_false (photos_gegl_buffer_loader_get_keep_aspect_ratio (loader));
+
+ width = photos_gegl_buffer_loader_get_width (loader);
+ g_assert_cmpint (width, ==, 300);
+}
+
+
+static void
+photos_test_gegl_buffer_loader_builder_defaults (void)
+{
+ GFile *file = NULL;
+ GeglBuffer *buffer;
+ g_autoptr (PhotosGeglBufferLoader) loader = NULL;
+ g_autoptr (PhotosGeglBufferLoaderBuilder) builder = NULL;
+ gint height;
+ gint width;
+
+ builder = photos_gegl_buffer_loader_builder_new ();
+ loader = photos_gegl_buffer_loader_builder_to_loader (builder);
+ g_assert_true (PHOTOS_IS_GEGL_BUFFER_LOADER (loader));
+
+ buffer = photos_gegl_buffer_loader_get_buffer (loader);
+ g_assert_null (buffer);
+
+ file = photos_gegl_buffer_loader_get_file (loader);
+ g_assert_null (file);
+
+ height = photos_gegl_buffer_loader_get_height (loader);
+ g_assert_cmpint (height, ==, -1);
+
+ g_assert_true (photos_gegl_buffer_loader_get_keep_aspect_ratio (loader));
+
+ width = photos_gegl_buffer_loader_get_width (loader);
+ g_assert_cmpint (width, ==, -1);
+}
+
+
+gint
+main (gint argc, gchar *argv[])
+{
+ gint exit_status;
+
+ setlocale (LC_ALL, "");
+ g_setenv ("GEGL_THREADS", "1", FALSE);
+ g_test_init (&argc, &argv, NULL);
+ photos_debug_init ();
+ photos_gegl_init ();
+ photos_gegl_ensure_builtins ();
+
+ g_test_add_func ("/gegl/buffer/loader-builder", photos_test_gegl_buffer_loader_builder);
+ g_test_add_func ("/gegl/buffer/loader-builder-defaults", photos_test_gegl_buffer_loader_builder_defaults);
+
+ exit_status = g_test_run ();
+
+ gegl_exit ();
+ return exit_status;
+}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]