From 35476639c4456cb38d76e7edb34ca6512ef8d0d3 Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Mon, 2 Oct 2017 02:32:04 +0200 Subject: [PATCH] gskslcompiler: Provide a way to compile files And use it from gtk-glsl. A neat side effect is that we now get the actual file printed in error messages. --- gsk/gskpixelshader.c | 2 +- gsk/gskslcompiler.c | 42 ++++++++++++++++++++++++++++++++++++++---- gsk/gskslcompiler.h | 7 +++++-- gtk/glsl.c | 42 ++++++++---------------------------------- 4 files changed, 52 insertions(+), 41 deletions(-) diff --git a/gsk/gskpixelshader.c b/gsk/gskpixelshader.c index 6debd854a6..a0cadd509c 100644 --- a/gsk/gskpixelshader.c +++ b/gsk/gskpixelshader.c @@ -151,7 +151,7 @@ gsk_pixel_shader_new_for_data (GBytes *source, g_return_val_if_fail (source != NULL, NULL); compiler = gsk_sl_compiler_new (); - program = gsk_sl_compiler_compile (compiler, source); + program = gsk_sl_compiler_compile_bytes (compiler, source); g_object_unref (compiler); if (program == NULL) return NULL; diff --git a/gsk/gskslcompiler.c b/gsk/gskslcompiler.c index 1c0b9c6d31..aa001f3d7d 100644 --- a/gsk/gskslcompiler.c +++ b/gsk/gskslcompiler.c @@ -189,16 +189,14 @@ gsk_sl_compiler_copy_defines (GskSlCompiler *compiler) return copy; } -GskSlProgram * +static GskSlProgram * gsk_sl_compiler_compile (GskSlCompiler *compiler, - GBytes *bytes) + GskCodeSource *source) { GskSlPreprocessor *preproc; - GskCodeSource *source; GskSlProgram *program; program = g_object_new (GSK_TYPE_SL_PROGRAM, NULL); - source = gsk_code_source_new_for_bytes ("", bytes); preproc = gsk_sl_preprocessor_new (compiler, source); @@ -211,8 +209,44 @@ gsk_sl_compiler_compile (GskSlCompiler *compiler, } gsk_sl_preprocessor_unref (preproc); + + return program; +} + +GskSlProgram * +gsk_sl_compiler_compile_file (GskSlCompiler *compiler, + GFile *file) +{ + GskSlProgram *program; + GskCodeSource *source; + + g_return_val_if_fail (GSK_IS_SL_COMPILER (compiler), NULL); + g_return_val_if_fail (G_IS_FILE (file), NULL); + + source = gsk_code_source_new_for_file (file); + + program = gsk_sl_compiler_compile (compiler, source); + g_object_unref (source); return program; } +GskSlProgram * +gsk_sl_compiler_compile_bytes (GskSlCompiler *compiler, + GBytes *bytes) +{ + GskSlProgram *program; + GskCodeSource *source; + + g_return_val_if_fail (GSK_IS_SL_COMPILER (compiler), NULL); + g_return_val_if_fail (bytes != NULL, NULL); + + source = gsk_code_source_new_for_bytes ("", bytes); + + program = gsk_sl_compiler_compile (compiler, source); + + g_object_unref (source); + + return program; +} diff --git a/gsk/gskslcompiler.h b/gsk/gskslcompiler.h index 6f0d741791..58c9e3ad84 100644 --- a/gsk/gskslcompiler.h +++ b/gsk/gskslcompiler.h @@ -71,8 +71,11 @@ void gsk_sl_compiler_remove_define (GskSlCompiler const char *name); GDK_AVAILABLE_IN_3_92 -GskSlProgram * gsk_sl_compiler_compile (GskSlCompiler *compiler, - GBytes *source); +GskSlProgram * gsk_sl_compiler_compile_file (GskSlCompiler *compiler, + GFile *file); +GDK_AVAILABLE_IN_3_92 +GskSlProgram * gsk_sl_compiler_compile_bytes (GskSlCompiler *compiler, + GBytes *bytes); G_END_DECLS diff --git a/gtk/glsl.c b/gtk/glsl.c index 04e8b0ff62..033be8afeb 100644 --- a/gtk/glsl.c +++ b/gtk/glsl.c @@ -29,21 +29,6 @@ #include #endif -static GBytes * -bytes_new_from_file (const char *filename, - GError **error) -{ - gchar *data; - gsize length; - - if (!g_file_get_contents (filename, - &data, &length, - error)) - return FALSE; - - return g_bytes_new_take (data, length); -} - static gboolean compile (GskSlCompiler *compiler, GOutputStream *output, @@ -52,17 +37,12 @@ compile (GskSlCompiler *compiler, GBytes *bytes; GskSlProgram *program; GError *error = NULL; + GFile *file; - bytes = bytes_new_from_file (filename, &error); - if (bytes == NULL) - { - g_print (error->message); - g_error_free (error); - return FALSE; - } + file = g_file_new_for_commandline_arg (filename); - program = gsk_sl_compiler_compile (compiler, bytes); - g_bytes_unref (bytes); + program = gsk_sl_compiler_compile_file (compiler, file); + g_object_unref (file); if (program == NULL) return FALSE; @@ -87,21 +67,15 @@ dump (GskSlCompiler *compiler, GOutputStream *output, const char *filename) { - GBytes *bytes; GString *string; GskSlProgram *program; GError *error = NULL; + GFile *file; - bytes = bytes_new_from_file (filename, &error); - if (bytes == NULL) - { - g_print (error->message); - g_error_free (error); - return FALSE; - } + file = g_file_new_for_commandline_arg (filename); - program = gsk_sl_compiler_compile (compiler, bytes); - g_bytes_unref (bytes); + program = gsk_sl_compiler_compile_file (compiler, file); + g_object_unref (file); if (program == NULL) return FALSE;