mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-26 02:00:33 +00:00
[299/906] use libpng to load the normal map instead of using gdkpixbuf
This commit is contained in:
parent
43e574aa8f
commit
3b9456e384
2 changed files with 87 additions and 10 deletions
|
@ -38,6 +38,7 @@
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "gstglbumper.h"
|
#include "gstglbumper.h"
|
||||||
|
#include <png.h>
|
||||||
|
|
||||||
#define GST_CAT_DEFAULT gst_gl_bumper_debug
|
#define GST_CAT_DEFAULT gst_gl_bumper_debug
|
||||||
GST_DEBUG_CATEGORY_STATIC (GST_CAT_DEFAULT);
|
GST_DEBUG_CATEGORY_STATIC (GST_CAT_DEFAULT);
|
||||||
|
@ -138,26 +139,105 @@ static const gchar *bumper_f_src =
|
||||||
" gl_FragColor = vec4(irradiance * textureColor.rgb, textureColor.w);\n"
|
" gl_FragColor = vec4(irradiance * textureColor.rgb, textureColor.w);\n"
|
||||||
"}\n";
|
"}\n";
|
||||||
|
|
||||||
|
#define LOAD_ERROR(msg) { GST_WARNING ("unable to load %s: %s", bumper->location, msg); display->isAlive = FALSE; return; }
|
||||||
|
|
||||||
|
//png reading error handler
|
||||||
|
static void
|
||||||
|
user_warning_fn(png_structp png_ptr, png_const_charp warning_msg)
|
||||||
|
{
|
||||||
|
g_warning("%s\n", warning_msg);
|
||||||
|
}
|
||||||
|
|
||||||
//Called in the gl thread
|
//Called in the gl thread
|
||||||
static void
|
static void
|
||||||
gst_gl_bumper_init_resources (GstGLFilter *filter)
|
gst_gl_bumper_init_resources (GstGLFilter *filter)
|
||||||
{
|
{
|
||||||
GstGLBumper *bumper = GST_GL_BUMPER (filter);
|
GstGLBumper *bumper = GST_GL_BUMPER (filter);
|
||||||
|
GstGLDisplay *display = filter->display;
|
||||||
GError *error = NULL;
|
GError *error = NULL;
|
||||||
//GdkPixbuf *pixbuf = NULL;
|
|
||||||
|
|
||||||
bumper->pixbuf = gdk_pixbuf_new_from_file (bumper->location, &error);
|
png_structp png_ptr;
|
||||||
bumper->bumpmap_width = gdk_pixbuf_get_width (bumper->pixbuf);
|
png_infop info_ptr;
|
||||||
bumper->bumpmap_height = gdk_pixbuf_get_height (bumper->pixbuf);
|
unsigned int sig_read = 0;
|
||||||
|
png_uint_32 width = 0;
|
||||||
|
png_uint_32 height = 0;
|
||||||
|
int bit_depth = 0;
|
||||||
|
int color_type = 0;
|
||||||
|
int interlace_type = 0;
|
||||||
|
png_FILE_p fp = NULL;
|
||||||
|
guint y = 0;
|
||||||
|
guchar *raw_data = NULL;
|
||||||
|
guchar **rows = NULL;
|
||||||
|
|
||||||
|
if (!filter->display)
|
||||||
|
return;
|
||||||
|
|
||||||
|
/* BEGIN load png image file */
|
||||||
|
|
||||||
|
if ((fp = fopen(bumper->location, "rb")) == NULL)
|
||||||
|
LOAD_ERROR ("file not found");
|
||||||
|
|
||||||
|
png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
|
||||||
|
|
||||||
|
if (png_ptr == NULL)
|
||||||
|
{
|
||||||
|
fclose(fp);
|
||||||
|
LOAD_ERROR ("failed to initialize the png_struct");
|
||||||
|
}
|
||||||
|
|
||||||
|
png_set_error_fn (png_ptr, NULL, NULL, user_warning_fn);
|
||||||
|
|
||||||
|
info_ptr = png_create_info_struct(png_ptr);
|
||||||
|
if (info_ptr == NULL)
|
||||||
|
{
|
||||||
|
fclose(fp);
|
||||||
|
png_destroy_read_struct(&png_ptr, png_infopp_NULL, png_infopp_NULL);
|
||||||
|
LOAD_ERROR ("failed to initialize the memory for image information");
|
||||||
|
}
|
||||||
|
|
||||||
|
png_init_io(png_ptr, fp);
|
||||||
|
|
||||||
|
png_set_sig_bytes(png_ptr, sig_read);
|
||||||
|
|
||||||
|
png_read_info(png_ptr, info_ptr);
|
||||||
|
|
||||||
|
png_get_IHDR(png_ptr, info_ptr, &width, &height, &bit_depth, &color_type,
|
||||||
|
&interlace_type, int_p_NULL, int_p_NULL);
|
||||||
|
|
||||||
|
if (color_type != PNG_COLOR_TYPE_RGB)
|
||||||
|
{
|
||||||
|
fclose(fp);
|
||||||
|
png_destroy_read_struct(&png_ptr, png_infopp_NULL, png_infopp_NULL);
|
||||||
|
LOAD_ERROR ("color type is not rgb");
|
||||||
|
}
|
||||||
|
|
||||||
|
raw_data = (guchar*) malloc ( sizeof(guchar) * width * height * 3 );
|
||||||
|
|
||||||
|
rows = (guchar**)malloc(sizeof(guchar*) * height);
|
||||||
|
|
||||||
|
for (y = 0; y < height; ++y)
|
||||||
|
rows[y] = (guchar*) (raw_data + y * width * 3);
|
||||||
|
|
||||||
|
png_read_image(png_ptr, rows);
|
||||||
|
|
||||||
|
free(rows);
|
||||||
|
|
||||||
|
png_read_end(png_ptr, info_ptr);
|
||||||
|
png_destroy_read_struct(&png_ptr, &info_ptr, png_infopp_NULL);
|
||||||
|
fclose(fp);
|
||||||
|
|
||||||
|
/* END load png image file */
|
||||||
|
|
||||||
|
bumper->bumpmap_width = width;
|
||||||
|
bumper->bumpmap_height = height;
|
||||||
|
|
||||||
glGenTextures (1, &bumper->bumpmap);
|
glGenTextures (1, &bumper->bumpmap);
|
||||||
glBindTexture(GL_TEXTURE_RECTANGLE_ARB, bumper->bumpmap);
|
glBindTexture(GL_TEXTURE_RECTANGLE_ARB, bumper->bumpmap);
|
||||||
glTexImage2D (GL_TEXTURE_RECTANGLE_ARB, 0, GL_RGBA,
|
glTexImage2D (GL_TEXTURE_RECTANGLE_ARB, 0, GL_RGBA,
|
||||||
bumper->bumpmap_width, bumper->bumpmap_height, 0,
|
bumper->bumpmap_width, bumper->bumpmap_height, 0,
|
||||||
gdk_pixbuf_get_has_alpha (bumper->pixbuf) ? GL_RGBA : GL_RGB,
|
GL_RGB, GL_UNSIGNED_BYTE, raw_data);
|
||||||
GL_UNSIGNED_BYTE, gdk_pixbuf_get_pixels (bumper->pixbuf));
|
|
||||||
|
|
||||||
|
free (raw_data);
|
||||||
}
|
}
|
||||||
|
|
||||||
//Called in the gl thread
|
//Called in the gl thread
|
||||||
|
@ -211,7 +291,6 @@ gst_gl_bumper_init (GstGLBumper* bumper,
|
||||||
bumper->bumpmap = 0;
|
bumper->bumpmap = 0;
|
||||||
bumper->bumpmap_width = 0;
|
bumper->bumpmap_width = 0;
|
||||||
bumper->bumpmap_height = 0;
|
bumper->bumpmap_height = 0;
|
||||||
bumper->pixbuf = NULL;
|
|
||||||
bumper->location = NULL;
|
bumper->location = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -22,7 +22,6 @@
|
||||||
#define _GST_GL_BUMPER_H_
|
#define _GST_GL_BUMPER_H_
|
||||||
|
|
||||||
#include <gstglfilter.h>
|
#include <gstglfilter.h>
|
||||||
#include <gdk-pixbuf/gdk-pixbuf.h>
|
|
||||||
|
|
||||||
G_BEGIN_DECLS
|
G_BEGIN_DECLS
|
||||||
|
|
||||||
|
@ -43,7 +42,6 @@ struct _GstGLBumper
|
||||||
GLuint bumpmap;
|
GLuint bumpmap;
|
||||||
gint bumpmap_width;
|
gint bumpmap_width;
|
||||||
gint bumpmap_height;
|
gint bumpmap_height;
|
||||||
GdkPixbuf *pixbuf;
|
|
||||||
gchar *location;
|
gchar *location;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue