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.
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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 ("<program>", 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 ("<program>", bytes);
|
||||
|
||||
program = gsk_sl_compiler_compile (compiler, source);
|
||||
|
||||
g_object_unref (source);
|
||||
|
||||
return program;
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
42
gtk/glsl.c
42
gtk/glsl.c
@@ -29,21 +29,6 @@
|
||||
#include <unistd.h>
|
||||
#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;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user