mirror of
https://github.com/brl/mutter.git
synced 2025-02-17 21:54:10 +00:00
video improvements + other tweaks
This commit is contained in:
parent
26decbdb97
commit
64355c0e48
25
ChangeLog
25
ChangeLog
@ -1,3 +1,28 @@
|
|||||||
|
2005-04-27 mallum,,, <mallum@openedhand.com>
|
||||||
|
|
||||||
|
* clutter/Makefile.am:
|
||||||
|
* clutter/cltr-button.c: (cltr_button_new):
|
||||||
|
* clutter/cltr-label.c:
|
||||||
|
* clutter/cltr-label.h:
|
||||||
|
* clutter/cltr-photo-grid.c: (cltr_photo_grid_paint):
|
||||||
|
* clutter/cltr-texture.c: (cltr_texture_realize),
|
||||||
|
(cltr_texture_new), (cltr_texture_unref),
|
||||||
|
(cltr_texture_no_tile_new):
|
||||||
|
* clutter/cltr-texture.h:
|
||||||
|
* clutter/cltr-video.c: (cltr_video_got_time_tick), (caps_set),
|
||||||
|
(cltr_video_new), (cltr_video_idler), (cltr_video_set_source),
|
||||||
|
(cltr_video_play), (cltr_video_pause), (cltr_video_show),
|
||||||
|
(cltr_video_hide), (cltr_video_handle_xevent), (cltr_video_paint):
|
||||||
|
* clutter/cltr.h:
|
||||||
|
* clutter/fonts.c: (font_new), (draw_layout_on_pixbuf),
|
||||||
|
(font_draw):
|
||||||
|
* clutter/fonts.h:
|
||||||
|
* clutter/pixbuf.c: (pixbuf_set_pixel), (pixbuf_get_pixel):
|
||||||
|
* examples/photos.c: (photo_grid_populate), (main):
|
||||||
|
* examples/player.c: (main):
|
||||||
|
Improve video widget, use playbin rather than gst_play
|
||||||
|
Lots of misc tweaks.
|
||||||
|
|
||||||
2005-04-26 mallum,,, <mallum@openedhand.com>
|
2005-04-26 mallum,,, <mallum@openedhand.com>
|
||||||
|
|
||||||
* clutter/Makefile.am:
|
* clutter/Makefile.am:
|
||||||
|
@ -10,6 +10,7 @@ source_h = pixbuf.h util.h fonts.h \
|
|||||||
cltr-video.h \
|
cltr-video.h \
|
||||||
cltr-list.h \
|
cltr-list.h \
|
||||||
cltr-overlay.h \
|
cltr-overlay.h \
|
||||||
|
cltr-label.h \
|
||||||
cltr-button.h \
|
cltr-button.h \
|
||||||
cltr-scratch.h
|
cltr-scratch.h
|
||||||
|
|
||||||
@ -24,6 +25,7 @@ source_c = pixbuf.c util.c fonts.c \
|
|||||||
cltr-video.c \
|
cltr-video.c \
|
||||||
cltr-list.c \
|
cltr-list.c \
|
||||||
cltr-overlay.c \
|
cltr-overlay.c \
|
||||||
|
cltr-label.c \
|
||||||
cltr-button.c \
|
cltr-button.c \
|
||||||
cltr-scratch.c
|
cltr-scratch.c
|
||||||
|
|
||||||
|
@ -4,6 +4,9 @@
|
|||||||
struct CltrButton
|
struct CltrButton
|
||||||
{
|
{
|
||||||
CltrWidget widget;
|
CltrWidget widget;
|
||||||
|
char *label;
|
||||||
|
Pixbuf *pixb;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -34,6 +37,23 @@ cltr_button_new(int width, int height)
|
|||||||
return CLTR_WIDGET(button);
|
return CLTR_WIDGET(button);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CltrWidget*
|
||||||
|
cltr_button_new_with_label(const char *label,
|
||||||
|
CltrFont *font,
|
||||||
|
PixbufPixel *col)
|
||||||
|
{
|
||||||
|
CltrButton *button = NULL;
|
||||||
|
int label_width, label_height;
|
||||||
|
|
||||||
|
if (font == NULL)
|
||||||
|
{
|
||||||
|
/* XXXX grab default font */
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
return CLTR_WIDGET(button);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
cltr_button_show(CltrWidget *widget)
|
cltr_button_show(CltrWidget *widget)
|
||||||
{
|
{
|
||||||
|
133
clutter/cltr-label.c
Normal file
133
clutter/cltr-label.c
Normal file
@ -0,0 +1,133 @@
|
|||||||
|
#include "cltr-label.h"
|
||||||
|
#include "cltr-private.h"
|
||||||
|
|
||||||
|
struct CltrLabel
|
||||||
|
{
|
||||||
|
CltrWidget widget;
|
||||||
|
|
||||||
|
char *text;
|
||||||
|
Pixbuf *pixb;
|
||||||
|
PixbufPixel *col;
|
||||||
|
CltrFont *font;
|
||||||
|
CltrTexture *texture;
|
||||||
|
};
|
||||||
|
|
||||||
|
static void
|
||||||
|
cltr_label_show(CltrWidget *widget);
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
cltr_label_handle_xevent (CltrWidget *widget, XEvent *xev);
|
||||||
|
|
||||||
|
static void
|
||||||
|
cltr_label_paint(CltrWidget *widget);
|
||||||
|
|
||||||
|
|
||||||
|
CltrWidget*
|
||||||
|
cltr_label_new(const char *text,
|
||||||
|
CltrFont *font,
|
||||||
|
PixbufPixel *col)
|
||||||
|
{
|
||||||
|
CltrLabel *label;
|
||||||
|
int width,height;
|
||||||
|
|
||||||
|
label = g_malloc0(sizeof(CltrLabel));
|
||||||
|
|
||||||
|
font_get_pixel_size (font, text, &width, &height);
|
||||||
|
|
||||||
|
if (width && height)
|
||||||
|
{
|
||||||
|
PixbufPixel bg = { 0xff, 0x0, 0x0, 0xff };
|
||||||
|
|
||||||
|
label->text = strdup(text);
|
||||||
|
label->pixb = pixbuf_new(width, height);
|
||||||
|
|
||||||
|
pixbuf_fill_rect(label->pixb, 0, 0, -1, -1, &bg);
|
||||||
|
|
||||||
|
/*
|
||||||
|
font_draw(font,
|
||||||
|
label->pixb,
|
||||||
|
label->text,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
col);
|
||||||
|
*/
|
||||||
|
label->texture = cltr_texture_new(label->pixb);
|
||||||
|
}
|
||||||
|
|
||||||
|
label->font = font; /* XXX Ref The font XXX*/
|
||||||
|
label->col = col; /* XXX Ref The Col XXX*/
|
||||||
|
|
||||||
|
label->widget.width = width;
|
||||||
|
label->widget.height = height;
|
||||||
|
|
||||||
|
label->widget.show = cltr_label_show;
|
||||||
|
label->widget.paint = cltr_label_paint;
|
||||||
|
|
||||||
|
label->widget.xevent_handler = cltr_label_handle_xevent;
|
||||||
|
|
||||||
|
return CLTR_WIDGET(label);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
cltr_label_set_text(CltrLabel *label)
|
||||||
|
{
|
||||||
|
if (label->texture)
|
||||||
|
cltr_texture_unref(label->texture);
|
||||||
|
|
||||||
|
if (label->pixb)
|
||||||
|
cltr_texture_unref(label->pixb);
|
||||||
|
|
||||||
|
if (label->text)
|
||||||
|
free(label->text);
|
||||||
|
|
||||||
|
/* XXX TODO */
|
||||||
|
}
|
||||||
|
|
||||||
|
const char*
|
||||||
|
cltr_label_get_text(CltrLabel *label)
|
||||||
|
{
|
||||||
|
return label->text;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
cltr_label_show(CltrWidget *widget)
|
||||||
|
{
|
||||||
|
;
|
||||||
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
cltr_label_handle_xevent (CltrWidget *widget, XEvent *xev)
|
||||||
|
{
|
||||||
|
;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
cltr_label_paint(CltrWidget *widget)
|
||||||
|
{
|
||||||
|
CltrLabel *label = CLTR_LABEL(widget);
|
||||||
|
|
||||||
|
if (label->text)
|
||||||
|
{
|
||||||
|
glPushMatrix();
|
||||||
|
|
||||||
|
glEnable(GL_TEXTURE_2D);
|
||||||
|
|
||||||
|
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
||||||
|
glEnable(GL_BLEND);
|
||||||
|
|
||||||
|
glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_BLEND);
|
||||||
|
|
||||||
|
/* glColor4ub(100, 200, 50, 100); */
|
||||||
|
|
||||||
|
cltr_texture_render_to_gl_quad(label->texture,
|
||||||
|
widget->x,
|
||||||
|
widget->y,
|
||||||
|
widget->x + widget->width ,
|
||||||
|
widget->y + widget->height);
|
||||||
|
|
||||||
|
glDisable(GL_BLEND);
|
||||||
|
glDisable(GL_TEXTURE_2D);
|
||||||
|
|
||||||
|
glPopMatrix();
|
||||||
|
}
|
||||||
|
}
|
16
clutter/cltr-label.h
Normal file
16
clutter/cltr-label.h
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
#ifndef _HAVE_CLTR_LABEL_H
|
||||||
|
#define _HAVE_CLTR_LABEL_H
|
||||||
|
|
||||||
|
#include "cltr.h"
|
||||||
|
|
||||||
|
typedef struct CltrLabel CltrLabel;
|
||||||
|
|
||||||
|
#define CLTR_LABEL(w) ((CltrLabel*)(w))
|
||||||
|
|
||||||
|
CltrWidget*
|
||||||
|
cltr_label_new(const char *text,
|
||||||
|
CltrFont *font,
|
||||||
|
PixbufPixel *col);
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
@ -1,29 +1,6 @@
|
|||||||
#include "cltr-photo-grid.h"
|
#include "cltr-photo-grid.h"
|
||||||
#include "cltr-private.h"
|
#include "cltr-private.h"
|
||||||
|
|
||||||
/*
|
|
||||||
TODO
|
|
||||||
|
|
||||||
- image cache !!
|
|
||||||
|
|
||||||
- change idle_cb to timeouts, reduce tearing + inc interactivity on
|
|
||||||
image load
|
|
||||||
|
|
||||||
- Split events into seperate file ( break up ctrl.c )
|
|
||||||
|
|
||||||
- offset zoom a little to give border around picture grid
|
|
||||||
|
|
||||||
- figure out highlighting selected cell
|
|
||||||
|
|
||||||
- tape on pictures ?
|
|
||||||
|
|
||||||
- tidy this code here + document !
|
|
||||||
- fix threads, lower priority ?
|
|
||||||
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
struct CltrPhotoGridCell
|
struct CltrPhotoGridCell
|
||||||
{
|
{
|
||||||
Pixbuf *pixb;
|
Pixbuf *pixb;
|
||||||
@ -432,88 +409,6 @@ cltr_photo_grid_activate_cell(CltrPhotoGrid *grid)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0
|
|
||||||
gpointer
|
|
||||||
cltr_photo_grid_populate(gpointer data)
|
|
||||||
{
|
|
||||||
CltrPhotoGrid *grid = (CltrPhotoGrid *)data;
|
|
||||||
GDir *dir;
|
|
||||||
GError *error;
|
|
||||||
const gchar *entry = NULL;
|
|
||||||
gchar *fullpath = NULL;
|
|
||||||
int n_pixb = 0, i =0;
|
|
||||||
ClutterFont *font = NULL;
|
|
||||||
PixbufPixel font_col = { 255, 255, 255, 255 };
|
|
||||||
|
|
||||||
font = font_new("Sans Bold 96");
|
|
||||||
|
|
||||||
if ((dir = g_dir_open (grid->img_path, 0, &error)) == NULL)
|
|
||||||
{
|
|
||||||
/* handle this much better */
|
|
||||||
fprintf(stderr, "failed to open '%s'\n", grid->img_path);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
while ((entry = g_dir_read_name (dir)) != NULL)
|
|
||||||
{
|
|
||||||
if (!strcasecmp(&entry[strlen(entry)-4], ".png")
|
|
||||||
|| !strcasecmp(&entry[strlen(entry)-4], ".jpg")
|
|
||||||
|| !strcasecmp(&entry[strlen(entry)-5], ".jpeg"))
|
|
||||||
n_pixb++;
|
|
||||||
}
|
|
||||||
|
|
||||||
CLTR_DBG("estamited %i pixb's\n", n_pixb);
|
|
||||||
|
|
||||||
g_dir_rewind (dir);
|
|
||||||
|
|
||||||
while ((entry = g_dir_read_name (dir)) != NULL)
|
|
||||||
{
|
|
||||||
Pixbuf *pixb = NULL;
|
|
||||||
fullpath = g_strconcat(grid->img_path, "/", entry, NULL);
|
|
||||||
|
|
||||||
pixb = pixbuf_new_from_file(fullpath);
|
|
||||||
|
|
||||||
if (pixb)
|
|
||||||
{
|
|
||||||
CltrPhotoGridCell *cell;
|
|
||||||
gchar buf[24];
|
|
||||||
Pixbuf *tmp_pixb;
|
|
||||||
|
|
||||||
cell = cltr_photo_grid_cell_new(grid, pixb);
|
|
||||||
|
|
||||||
g_snprintf(&buf[0], 24, "%i", i);
|
|
||||||
font_draw(font, cell->pixb, buf, 10, 10, &font_col);
|
|
||||||
|
|
||||||
g_mutex_lock(Mutex_GRID);
|
|
||||||
|
|
||||||
cell->texture = cltr_texture_new(cell->pixb);
|
|
||||||
|
|
||||||
if (!grid->cell_active)
|
|
||||||
grid->cell_active = g_list_first(grid->cells_tail);
|
|
||||||
|
|
||||||
cltr_photo_grid_append_cell(grid, cell);
|
|
||||||
|
|
||||||
g_mutex_unlock(Mutex_GRID);
|
|
||||||
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
|
|
||||||
g_free(fullpath);
|
|
||||||
}
|
|
||||||
|
|
||||||
g_dir_close (dir);
|
|
||||||
|
|
||||||
g_mutex_lock(Mutex_GRID);
|
|
||||||
|
|
||||||
grid->is_populated = TRUE;
|
|
||||||
|
|
||||||
g_mutex_unlock(Mutex_GRID);
|
|
||||||
|
|
||||||
cltr_widget_queue_paint(CLTR_WIDGET(grid));
|
|
||||||
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
cltr_photo_grid_update_visual_state(CltrPhotoGrid *grid)
|
cltr_photo_grid_update_visual_state(CltrPhotoGrid *grid)
|
||||||
@ -679,6 +574,9 @@ cltr_photo_grid_paint(CltrWidget *widget)
|
|||||||
* - multisample ?
|
* - multisample ?
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
if (!grid->paint_cell_item)
|
||||||
|
cltr_photo_grid_update_visual_state(grid);
|
||||||
|
|
||||||
glEnable(GL_BLEND);
|
glEnable(GL_BLEND);
|
||||||
|
|
||||||
glHint(GL_POLYGON_SMOOTH_HINT, GL_NICEST); /* needed */
|
glHint(GL_POLYGON_SMOOTH_HINT, GL_NICEST); /* needed */
|
||||||
|
@ -292,7 +292,7 @@ cltr_texture_realize(CltrTexture *texture)
|
|||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
||||||
glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
|
glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
|
||||||
|
|
||||||
glTexImage2D(GL_TEXTURE_2D, 0, /*GL_COMPRESSED_RGBA_ARB*/ GL_RGBA,
|
glTexImage2D(GL_TEXTURE_2D, 0, /*GL_COMPRESSED_RGBA_ARB*/ GL_RGBA,
|
||||||
texture->width,
|
texture->width,
|
||||||
@ -360,13 +360,17 @@ cltr_texture_realize(CltrTexture *texture)
|
|||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
||||||
glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
|
/* glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_); */
|
||||||
|
|
||||||
|
/* glPixelStorei (GL_UNPACK_ALIGNMENT, 4); */
|
||||||
|
/* glPixelStorei (GL_UNPACK_ROW_LENGTH, texture->tile_x_size[x]); */
|
||||||
|
|
||||||
glTexImage2D(GL_TEXTURE_2D, 0, /*GL_COMPRESSED_RGBA_ARB*/ GL_RGBA,
|
glTexImage2D(GL_TEXTURE_2D, 0, /*GL_COMPRESSED_RGBA_ARB*/ GL_RGBA,
|
||||||
pixtmp->width,
|
pixtmp->width,
|
||||||
pixtmp->height,
|
pixtmp->height,
|
||||||
0, GL_RGBA,
|
0, GL_RGBA,
|
||||||
GL_UNSIGNED_INT_8_8_8_8,
|
GL_UNSIGNED_INT_8_8_8_8,
|
||||||
|
/* GL_UNSIGNED_BYTE, */
|
||||||
pixtmp->data);
|
pixtmp->data);
|
||||||
|
|
||||||
CLTR_GLERR();
|
CLTR_GLERR();
|
||||||
@ -402,13 +406,32 @@ cltr_texture_new(Pixbuf *pixb)
|
|||||||
|
|
||||||
pixbuf_ref(pixb);
|
pixbuf_ref(pixb);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
init_tiles (texture);
|
init_tiles (texture);
|
||||||
|
|
||||||
|
cltr_texture_ref(texture);
|
||||||
|
|
||||||
return texture;
|
return texture;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
cltr_texture_ref(CltrTexture *texture)
|
||||||
|
{
|
||||||
|
texture->refcnt++;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
cltr_texture_unref(CltrTexture *texture)
|
||||||
|
{
|
||||||
|
texture->refcnt--;
|
||||||
|
|
||||||
|
if (texture->refcnt <= 0)
|
||||||
|
{
|
||||||
|
cltr_texture_unrealize(texture);
|
||||||
|
g_free(texture);
|
||||||
|
pixbuf_unref(texture->pixb);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
CltrTexture*
|
CltrTexture*
|
||||||
cltr_texture_no_tile_new(Pixbuf *pixb)
|
cltr_texture_no_tile_new(Pixbuf *pixb)
|
||||||
{
|
{
|
||||||
@ -432,6 +455,7 @@ cltr_texture_no_tile_new(Pixbuf *pixb)
|
|||||||
texture->mutex = g_mutex_new();
|
texture->mutex = g_mutex_new();
|
||||||
|
|
||||||
pixbuf_ref(pixb);
|
pixbuf_ref(pixb);
|
||||||
|
cltr_texture_ref(texture);
|
||||||
|
|
||||||
return texture;
|
return texture;
|
||||||
}
|
}
|
||||||
|
@ -28,6 +28,12 @@ struct CltrTexture
|
|||||||
CltrTexture*
|
CltrTexture*
|
||||||
cltr_texture_new(Pixbuf *pixb);
|
cltr_texture_new(Pixbuf *pixb);
|
||||||
|
|
||||||
|
void
|
||||||
|
cltr_texture_ref(CltrTexture *texture);
|
||||||
|
|
||||||
|
void
|
||||||
|
cltr_texture_unref(CltrTexture *texture);
|
||||||
|
|
||||||
CltrTexture*
|
CltrTexture*
|
||||||
cltr_texture_no_tile_new(Pixbuf *pixb);
|
cltr_texture_no_tile_new(Pixbuf *pixb);
|
||||||
|
|
||||||
|
@ -5,8 +5,7 @@ struct CltrVideo
|
|||||||
{
|
{
|
||||||
CltrWidget widget;
|
CltrWidget widget;
|
||||||
|
|
||||||
GstPlay *play;
|
GstElement *play, *data_src, *video_sink, *audio_sink, *vis_element;
|
||||||
GstElement *data_src, *video_sink, *audio_sink, *vis_element;
|
|
||||||
|
|
||||||
GAsyncQueue *queue;
|
GAsyncQueue *queue;
|
||||||
|
|
||||||
@ -82,9 +81,11 @@ cltr_video_got_time_tick (GstPlay *play,
|
|||||||
gint64 time_nanos,
|
gint64 time_nanos,
|
||||||
CltrVideo *video)
|
CltrVideo *video)
|
||||||
{
|
{
|
||||||
CltrVideoSignal *signal;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
CltrVideoSignal *signal;
|
||||||
|
|
||||||
signal = g_new0 (CltrVideoSignal, 1);
|
signal = g_new0 (CltrVideoSignal, 1);
|
||||||
signal->signal_id = CLTR_VIDEO_ASYNC_FOUND_TAG;
|
signal->signal_id = CLTR_VIDEO_ASYNC_FOUND_TAG;
|
||||||
signal->signal_data.found_tag.source = source;
|
signal->signal_data.found_tag.source = source;
|
||||||
@ -161,12 +162,15 @@ caps_set (GObject *obj,
|
|||||||
GParamSpec *pspec,
|
GParamSpec *pspec,
|
||||||
CltrVideo *video)
|
CltrVideo *video)
|
||||||
{
|
{
|
||||||
|
#if 0
|
||||||
GstPad *pad = GST_PAD (obj);
|
GstPad *pad = GST_PAD (obj);
|
||||||
GstStructure *s;
|
GstStructure *s;
|
||||||
|
|
||||||
if (!GST_PAD_CAPS (pad))
|
if (!GST_PAD_CAPS (pad))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
s = gst_caps_get_structure (GST_PAD_CAPS (pad), 0);
|
s = gst_caps_get_structure (GST_PAD_CAPS (pad), 0);
|
||||||
|
|
||||||
if (s) {
|
if (s) {
|
||||||
@ -191,8 +195,10 @@ caps_set (GObject *obj,
|
|||||||
|
|
||||||
got_video_size (bvw->priv->play, bvw->priv->video_width,
|
got_video_size (bvw->priv->play, bvw->priv->video_width,
|
||||||
bvw->priv->video_height, bvw);
|
bvw->priv->video_height, bvw);
|
||||||
|
|
||||||
}
|
}
|
||||||
*/
|
#endif
|
||||||
|
|
||||||
/* and disable ourselves */
|
/* and disable ourselves */
|
||||||
//g_signal_handlers_disconnect_by_func (pad, caps_set, bvw);
|
//g_signal_handlers_disconnect_by_func (pad, caps_set, bvw);
|
||||||
}
|
}
|
||||||
@ -216,6 +222,91 @@ cltr_video_new(int width, int height)
|
|||||||
|
|
||||||
/* Creating the GstPlay object */
|
/* Creating the GstPlay object */
|
||||||
|
|
||||||
|
video->play = gst_element_factory_make ("playbin", "play");
|
||||||
|
if (!video->play) {
|
||||||
|
g_error ("Could not make playbin element");
|
||||||
|
/* XXX Error */
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
video->audio_sink = gst_gconf_get_default_audio_sink ();
|
||||||
|
|
||||||
|
if (!GST_IS_ELEMENT (video->audio_sink))
|
||||||
|
g_error ("Could not get default audio sink from GConf");
|
||||||
|
|
||||||
|
video->video_sink = gst_element_factory_make ("cltrimagesink", "cltr-output");
|
||||||
|
|
||||||
|
if (!GST_IS_ELEMENT (video->video_sink))
|
||||||
|
g_error ("Could not get clutter video sink");
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
sig1 = g_signal_connect (video_sink, "error", G_CALLBACK (out_error), err);
|
||||||
|
sig2 = g_signal_connect (audio_sink, "error", G_CALLBACK (out_error), err);
|
||||||
|
if (gst_element_set_state (video_sink,
|
||||||
|
GST_STATE_READY) != GST_STATE_SUCCESS ||
|
||||||
|
gst_element_set_state (audio_sink,
|
||||||
|
GST_STATE_READY) != GST_STATE_SUCCESS) {
|
||||||
|
if (err && !*err) {
|
||||||
|
g_set_error (err, 0, 0,
|
||||||
|
"Failed to intialize %s output; check your configuration",
|
||||||
|
GST_STATE (video_sink) == GST_STATE_NULL ?
|
||||||
|
"video" : "audio");
|
||||||
|
}
|
||||||
|
gst_object_unref (GST_OBJECT (video_sink));
|
||||||
|
gst_object_unref (GST_OBJECT (audio_sink));
|
||||||
|
g_object_unref (G_OBJECT (bvw));
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
/* somehow, alsa hangs? */
|
||||||
|
gst_element_set_state (video->audio_sink, GST_STATE_NULL);
|
||||||
|
g_signal_handler_disconnect (video->video_sink, sig1);
|
||||||
|
g_signal_handler_disconnect (video->audio_sink, sig2);
|
||||||
|
#endif
|
||||||
|
g_object_set (G_OBJECT (video->play), "video-sink",
|
||||||
|
video->video_sink, NULL);
|
||||||
|
g_object_set (G_OBJECT (video->play), "audio-sink",
|
||||||
|
video->audio_sink, NULL);
|
||||||
|
|
||||||
|
/* Needed ? */
|
||||||
|
#if 0
|
||||||
|
g_signal_connect (GST_PAD_REALIZE (gst_element_get_pad (audio_sink, "sink")),
|
||||||
|
"fixate", G_CALLBACK (cb_audio_fixate), (gpointer) bvw);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
g_signal_connect (G_OBJECT (video->play), "eos",
|
||||||
|
G_CALLBACK (cltr_video_got_eos), (gpointer) video);
|
||||||
|
/*
|
||||||
|
g_signal_connect (G_OBJECT (video->play), "state-change",
|
||||||
|
G_CALLBACK (state_change), (gpointer) video);
|
||||||
|
*/
|
||||||
|
g_signal_connect (G_OBJECT (video->play), "found_tag",
|
||||||
|
G_CALLBACK (cltr_video_got_found_tag), (gpointer) video);
|
||||||
|
|
||||||
|
/*
|
||||||
|
g_signal_connect (G_OBJECT (video->play), "error",
|
||||||
|
G_CALLBACK (got_error), (gpointer) video);
|
||||||
|
|
||||||
|
g_signal_connect (G_OBJECT (video->play), "buffering",
|
||||||
|
G_CALLBACK (got_buffering), (gpointer) video);
|
||||||
|
|
||||||
|
g_signal_connect (G_OBJECT (video->play), "notify::source",
|
||||||
|
G_CALLBACK (got_source), (gpointer) video);
|
||||||
|
g_signal_connect (G_OBJECT (video->play), "notify::stream-info",
|
||||||
|
G_CALLBACK (stream_info_set), (gpointer) video);
|
||||||
|
g_signal_connect (G_OBJECT (video->play), "group-switch",
|
||||||
|
G_CALLBACK (group_switch), (gpointer) video);
|
||||||
|
g_signal_connect (G_OBJECT (video->play), "got-redirect",
|
||||||
|
G_CALLBACK (got_redirect), (gpointer) video);
|
||||||
|
*/
|
||||||
|
|
||||||
|
video->queue = g_async_queue_new ();
|
||||||
|
|
||||||
|
gst_element_set(video->video_sink, "queue", video->queue, NULL);
|
||||||
|
|
||||||
|
|
||||||
|
return CLTR_WIDGET(video);
|
||||||
|
|
||||||
|
#if 0
|
||||||
video->play = gst_play_new (&error);
|
video->play = gst_play_new (&error);
|
||||||
|
|
||||||
if (error)
|
if (error)
|
||||||
@ -275,7 +366,7 @@ cltr_video_new(int width, int height)
|
|||||||
g_signal_connect (G_OBJECT (video->video_sink), "notify::caps",
|
g_signal_connect (G_OBJECT (video->video_sink), "notify::caps",
|
||||||
G_CALLBACK (caps_set), video);
|
G_CALLBACK (caps_set), video);
|
||||||
|
|
||||||
|
#endif
|
||||||
/*
|
/*
|
||||||
g_object_set (G_OBJECT (video->play), "volume",
|
g_object_set (G_OBJECT (video->play), "volume",
|
||||||
(gdouble) (1. * 0 / 100), NULL);
|
(gdouble) (1. * 0 / 100), NULL);
|
||||||
@ -336,8 +427,9 @@ cltr_video_idler (CltrVideo *video)
|
|||||||
gboolean
|
gboolean
|
||||||
cltr_video_set_source(CltrVideo *video, char *location)
|
cltr_video_set_source(CltrVideo *video, char *location)
|
||||||
{
|
{
|
||||||
if (!gst_play_set_location (video->play, location))
|
/* if (!gst_play_set_location (video->play, location)) */
|
||||||
return FALSE;
|
|
||||||
|
g_object_set (G_OBJECT (video->play), "uri", location, NULL);
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
@ -390,11 +482,24 @@ cltr_video_paint(CltrWidget *widget)
|
|||||||
glPushMatrix();
|
glPushMatrix();
|
||||||
|
|
||||||
if (video->frame_texture
|
if (video->frame_texture
|
||||||
|
/*
|
||||||
&& video->video_height
|
&& video->video_height
|
||||||
&& video->video_width)
|
&& video->video_width
|
||||||
|
*/)
|
||||||
{
|
{
|
||||||
int dis_x, dis_y, dis_height, dis_width;
|
int dis_x, dis_y, dis_height, dis_width;
|
||||||
|
|
||||||
|
/* Hack */
|
||||||
|
|
||||||
|
if (!video->video_height || !video->video_width )
|
||||||
|
{
|
||||||
|
Pixbuf *pixb = cltr_texture_get_pixbuf(video->frame_texture);
|
||||||
|
|
||||||
|
video->video_height = pixb->height;
|
||||||
|
video->video_width = pixb->width;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
if (video->video_width > video->video_height)
|
if (video->video_width > video->video_height)
|
||||||
{
|
{
|
||||||
dis_width = widget->width;
|
dis_width = widget->width;
|
||||||
@ -408,6 +513,10 @@ cltr_video_paint(CltrWidget *widget)
|
|||||||
|
|
||||||
glEnable(GL_TEXTURE_2D);
|
glEnable(GL_TEXTURE_2D);
|
||||||
|
|
||||||
|
glDisable(GL_BLEND);
|
||||||
|
|
||||||
|
glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
|
||||||
|
|
||||||
cltr_texture_lock(video->frame_texture);
|
cltr_texture_lock(video->frame_texture);
|
||||||
|
|
||||||
cltr_texture_render_to_gl_quad(video->frame_texture,
|
cltr_texture_render_to_gl_quad(video->frame_texture,
|
||||||
|
@ -54,6 +54,7 @@ typedef struct CltrTexture CltrTexture;
|
|||||||
#include "cltr-widget.h"
|
#include "cltr-widget.h"
|
||||||
#include "cltr-window.h"
|
#include "cltr-window.h"
|
||||||
#include "cltr-overlay.h"
|
#include "cltr-overlay.h"
|
||||||
|
#include "cltr-label.h"
|
||||||
#include "cltr-button.h"
|
#include "cltr-button.h"
|
||||||
#include "cltr-photo-grid.h"
|
#include "cltr-photo-grid.h"
|
||||||
#include "cltr-video.h"
|
#include "cltr-video.h"
|
||||||
|
@ -22,6 +22,8 @@ font_new (const char *face)
|
|||||||
|
|
||||||
pango_font_description_free (desc);
|
pango_font_description_free (desc);
|
||||||
|
|
||||||
|
cltr_font_ref(font);
|
||||||
|
|
||||||
return font;
|
return font;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -116,6 +118,11 @@ draw_layout_on_pixbuf (PangoLayout *layout,
|
|||||||
int tr1, tg1, tb1, tr2, tg2, tb2;
|
int tr1, tg1, tb1, tr2, tg2, tb2;
|
||||||
int a = (*b * color->a + 0x80) >> 8;
|
int a = (*b * color->a + 0x80) >> 8;
|
||||||
|
|
||||||
|
/*
|
||||||
|
if (!a)
|
||||||
|
{ b++; continue; }
|
||||||
|
*/
|
||||||
|
|
||||||
pixbuf_get_pixel (pixb, i, j, &pixel);
|
pixbuf_get_pixel (pixb, i, j, &pixel);
|
||||||
|
|
||||||
tr1 = (255 - a) * pixel.r + 0x80;
|
tr1 = (255 - a) * pixel.r + 0x80;
|
||||||
@ -128,6 +135,7 @@ draw_layout_on_pixbuf (PangoLayout *layout,
|
|||||||
tb2 = a * color->b + 0x80;
|
tb2 = a * color->b + 0x80;
|
||||||
pixel.b = ((tb1 + (tb1 >> 8)) >> 8) + ((tb2 + (tb2 >> 8)) >> 8);
|
pixel.b = ((tb1 + (tb1 >> 8)) >> 8) + ((tb2 + (tb2 >> 8)) >> 8);
|
||||||
|
|
||||||
|
|
||||||
pixbuf_set_pixel (pixb, i, j, &pixel);
|
pixbuf_set_pixel (pixb, i, j, &pixel);
|
||||||
b++;
|
b++;
|
||||||
}
|
}
|
||||||
@ -154,6 +162,8 @@ font_draw(ClutterFont *font,
|
|||||||
|
|
||||||
layout = pango_layout_new (font->context);
|
layout = pango_layout_new (font->context);
|
||||||
|
|
||||||
|
pango_layout_set_width(layout, pixb->width - x );
|
||||||
|
|
||||||
pango_layout_set_text (layout, text, -1);
|
pango_layout_set_text (layout, text, -1);
|
||||||
|
|
||||||
pango_layout_get_pixel_size (layout,
|
pango_layout_get_pixel_size (layout,
|
||||||
@ -166,4 +176,41 @@ font_draw(ClutterFont *font,
|
|||||||
y,
|
y,
|
||||||
pixb->width - x,
|
pixb->width - x,
|
||||||
pixb->height - y);
|
pixb->height - y);
|
||||||
|
|
||||||
|
g_object_unref(G_OBJECT(layout));
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
font_get_pixel_size (ClutterFont *font,
|
||||||
|
const char *text,
|
||||||
|
int *width,
|
||||||
|
int *height)
|
||||||
|
{
|
||||||
|
PangoLayout *layout;
|
||||||
|
|
||||||
|
layout = pango_layout_new (font->context);
|
||||||
|
|
||||||
|
pango_layout_set_text (layout, text, -1);
|
||||||
|
|
||||||
|
pango_layout_get_pixel_size (layout, width, height);
|
||||||
|
|
||||||
|
g_object_unref(G_OBJECT(layout));
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
cltr_font_ref(CltrFont *font)
|
||||||
|
{
|
||||||
|
font->refcnt++;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
cltr_font_unref(CltrFont *font)
|
||||||
|
{
|
||||||
|
font->refcnt--;
|
||||||
|
|
||||||
|
if (font->refcnt <= 0)
|
||||||
|
{
|
||||||
|
/* XXX free up pango stuff */
|
||||||
|
g_free(font);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -14,11 +14,19 @@ struct ClutterFont
|
|||||||
{
|
{
|
||||||
PangoFontMap *font_map;
|
PangoFontMap *font_map;
|
||||||
PangoContext *context;
|
PangoContext *context;
|
||||||
|
int refcnt;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
typedef ClutterFont CltrFont ; /* Tsk Tsk .. */
|
||||||
|
|
||||||
ClutterFont*
|
ClutterFont*
|
||||||
font_new (const char *face);
|
font_new (const char *face);
|
||||||
|
|
||||||
|
void
|
||||||
|
cltr_font_ref(CltrFont *font);
|
||||||
|
|
||||||
|
void
|
||||||
|
cltr_font_unref(CltrFont *font);
|
||||||
|
|
||||||
void
|
void
|
||||||
font_draw(ClutterFont *font,
|
font_draw(ClutterFont *font,
|
||||||
@ -28,5 +36,10 @@ font_draw(ClutterFont *font,
|
|||||||
int y,
|
int y,
|
||||||
PixbufPixel *p);
|
PixbufPixel *p);
|
||||||
|
|
||||||
|
void
|
||||||
|
font_get_pixel_size (ClutterFont *font,
|
||||||
|
const char *text,
|
||||||
|
int *width,
|
||||||
|
int *height);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -519,7 +519,12 @@ pixbuf_set_pixel(Pixbuf *pixb, int x, int y, PixbufPixel *p)
|
|||||||
/* ARGB_32 MSB */
|
/* ARGB_32 MSB */
|
||||||
|
|
||||||
// *offset = (p->r << 0) | (p->g << 8) | (p->b << 16) | (p->a << 24);
|
// *offset = (p->r << 0) | (p->g << 8) | (p->b << 16) | (p->a << 24);
|
||||||
*offset = (p->r << 24) | (p->g << 16) | (p->b << 8) | (p->a);
|
*offset = ( (p->r << 24) | (p->g << 16) | (p->b << 8) | (p->a) );
|
||||||
|
|
||||||
|
/*
|
||||||
|
printf("set %i,%i,%i,%i\n", p->r, p->g, p->b, p->a);
|
||||||
|
printf("Looks like %i %x\n", *offset, *offset);
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@ -529,7 +534,7 @@ pixbuf_get_pixel(Pixbuf *pixb, int x, int y, PixbufPixel *p)
|
|||||||
|
|
||||||
/* ARGB_32 MSB */
|
/* ARGB_32 MSB */
|
||||||
|
|
||||||
p->r = (*offset >> 24) & 0xff;
|
p->r = (*offset >> 24) & 0xff;
|
||||||
p->g = (*offset >> 16) & 0xff;
|
p->g = (*offset >> 16) & 0xff;
|
||||||
p->b = (*offset >> 8) & 0xff;
|
p->b = (*offset >> 8) & 0xff;
|
||||||
p->a = *offset & 0xff;
|
p->a = *offset & 0xff;
|
||||||
|
@ -19,7 +19,7 @@ photo_grid_populate(gpointer data)
|
|||||||
gchar *fullpath = NULL;
|
gchar *fullpath = NULL;
|
||||||
int n_pixb = 0, i =0;
|
int n_pixb = 0, i =0;
|
||||||
ClutterFont *font = NULL;
|
ClutterFont *font = NULL;
|
||||||
PixbufPixel font_col = { 255, 255, 255, 255 };
|
PixbufPixel font_col = { 255, 0, 0, 255 };
|
||||||
|
|
||||||
font = font_new("Sans Bold 96");
|
font = font_new("Sans Bold 96");
|
||||||
|
|
||||||
@ -130,12 +130,12 @@ main(int argc, char **argv)
|
|||||||
usage(argv[0]);
|
usage(argv[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
win = cltr_window_new(800, 600);
|
win = cltr_window_new(640, 480);
|
||||||
|
|
||||||
if (want_fullscreen)
|
if (want_fullscreen)
|
||||||
cltr_window_set_fullscreen(CLTR_WINDOW(win));
|
cltr_window_set_fullscreen(CLTR_WINDOW(win));
|
||||||
|
|
||||||
grid = cltr_photo_grid_new(800, 600, cols, cols, ImgPath);
|
grid = cltr_photo_grid_new(640, 480, cols, cols, ImgPath);
|
||||||
|
|
||||||
cltr_window_focus_widget(CLTR_WINDOW(win), grid);
|
cltr_window_focus_widget(CLTR_WINDOW(win), grid);
|
||||||
|
|
||||||
|
@ -22,7 +22,11 @@
|
|||||||
int
|
int
|
||||||
main (int argc, char *argv[])
|
main (int argc, char *argv[])
|
||||||
{
|
{
|
||||||
CltrWidget *win, *video, *test;
|
CltrWidget *win, *video, *label;
|
||||||
|
CltrFont *font;
|
||||||
|
PixbufPixel col = { 0xff, 0xff, 0xff, 0x66 };
|
||||||
|
|
||||||
|
pixel_set_vals(&col, 0xff, 0x00, 0x00, 0xff);
|
||||||
|
|
||||||
cltr_init (&argc, &argv);
|
cltr_init (&argc, &argv);
|
||||||
|
|
||||||
@ -31,17 +35,19 @@ main (int argc, char *argv[])
|
|||||||
exit (-1);
|
exit (-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
win = cltr_window_new(800, 600);
|
font = font_new("Sans bold 96");
|
||||||
|
|
||||||
video = cltr_video_new(800, 600);
|
win = cltr_window_new(1400, 1050);
|
||||||
|
|
||||||
|
video = cltr_video_new(1400, 1050);
|
||||||
|
|
||||||
cltr_video_set_source(CLTR_VIDEO(video), argv[1]);
|
cltr_video_set_source(CLTR_VIDEO(video), argv[1]);
|
||||||
|
|
||||||
cltr_widget_add_child(win, video, 0, 0);
|
cltr_widget_add_child(win, video, 0, 0);
|
||||||
|
|
||||||
test = cltr_scratch_new(300, 300);
|
label = cltr_label_new("hello world", font, &col);
|
||||||
|
|
||||||
cltr_widget_add_child(win, test, 100, 100);
|
cltr_widget_add_child(win, label, 100, 100);
|
||||||
|
|
||||||
cltr_widget_show_all(win);
|
cltr_widget_show_all(win);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user