2006-06-06 Matthew Allum <mallum@openedhand.com>

* configure.ac:
        Use pkg-config to check for X. Really Check for GL libs.
        Make gtk binding optional. Cleanup a little.

        * Makefile.am:
        * gtk/Makefile.am:
        Make gtk binding optional

        * clutter/clutter-element.c:
        Cleanup a little, notify on size change.

        * clutter/clutter-texture.c:
        Lots of cleanups. Add waste prop. Add filter quality prop.

        * clutter/clutter-clone-texture.c:
        Make object construction simpler to work better with bindings.

        * clutter/clutter-stage.c:
        * clutter/clutter-timeline.c:
        Minor reformating, cleanups.

        * examples/test-text.c: (main):
        Random experimentation
This commit is contained in:
Matthew Allum 2006-06-06 20:40:40 +00:00
parent 17fedd5997
commit f00e84606c
10 changed files with 233 additions and 175 deletions

View File

@ -1,3 +1,29 @@
2006-06-06 Matthew Allum <mallum@openedhand.com>
* configure.ac:
Use pkg-config to check for X. Really Check for GL libs.
Make gtk binding optional. Cleanup a little.
* Makefile.am:
* gtk/Makefile.am:
Make gtk binding optional
* clutter/clutter-element.c:
Cleanup a little, notify on size change.
* clutter/clutter-texture.c:
Lots of cleanups. Add waste prop. Add filter quality prop.
* clutter/clutter-clone-texture.c:
Make object construction simpler to work better with bindings.
* clutter/clutter-stage.c:
* clutter/clutter-timeline.c:
Minor reformating, cleanups.
* examples/test-text.c: (main):
Random experimentation
2006-06-06 Iain Holmes <iain@openedhand.com>
* gtk/gtk-clutter.c (size_request): Take the size of the widget from

View File

@ -1,4 +1,8 @@
SUBDIRS=clutter gtk bindings doc examples
SUBDIRS=clutter bindings doc examples
if ENABLE_GTK
SUBDIRS += gtk
endif
pcfiles = clutter-@CLUTTER_MAJORMINOR@.pc

View File

@ -129,6 +129,9 @@ clone_texture_render_to_gl_quad (ClutterCloneTexture *ctexture,
qy1 = y1 + lasty;
qy2 = qy1 + ((qheight * actual_h) / pheight );
CLUTTER_DBG("rendering text tile x: %i, y: %i - %ix%i",
x, y, actual_w, actual_h);
glBegin (GL_QUADS);
glTexCoord2f (tx, ty); glVertex2i (qx2, qy2);
glTexCoord2f (0, ty); glVertex2i (qx1, qy2);
@ -167,6 +170,10 @@ clutter_clone_texture_paint (ClutterElement *self)
glColor4ub(255, 255, 255, clutter_element_get_opacity(self));
clutter_element_get_coords (self, &x1, &y1, &x2, &y2);
CLUTTER_DBG("paint to x1: %i, y1: %i x2: %i, y2: %i opacity: %i",
x1, y1, x2, y2, clutter_element_get_opacity(self) );
clone_texture_render_to_gl_quad (CLUTTER_CLONE_TEXTURE(self),
x1, y1, x2, y2);
@ -186,8 +193,18 @@ set_parent_texture (ClutterCloneTexture *ctexture,
priv->parent_texture = NULL;
}
if (texture)
priv->parent_texture = g_object_ref (texture);
if (texture)
{
gint width, height;
priv->parent_texture = g_object_ref (texture);
/* Sync up the size to parent texture base pixbuf size.
*/
clutter_texture_get_base_size (texture, &width, &height);
clutter_element_set_size (CLUTTER_ELEMENT(ctexture), width, height);
}
}
static void
@ -285,22 +302,17 @@ clutter_clone_texture_init (ClutterCloneTexture *self)
* clutter_clone_texture_new:
* @texture: a #ClutterTexture
*
* FIXME
* Creates an efficient 'clone' of a pre-existing texture if which it
* shares the underlying pixbuf data.
*
* Return value: the newly created #ClutterCloneTexture
*/
ClutterElement *
clutter_clone_texture_new (ClutterTexture *texture)
{
gint width, height;
g_return_val_if_fail (CLUTTER_IS_TEXTURE (texture), NULL);
clutter_texture_get_base_size (texture, &width, &height);
return g_object_new (CLUTTER_TYPE_CLONE_TEXTURE,
"parent-texture", texture,
"width", width,
"height", height,
NULL);
}

View File

@ -251,7 +251,7 @@ clutter_element_paint (ClutterElement *self)
glLoadName (clutter_element_get_id (self));
/* FIXME: Less clunky */
/* FIXME: Less clunky ? */
if (self->priv->rzang)
{
@ -319,6 +319,7 @@ clutter_element_request_coords (ClutterElement *self,
ClutterElementBox *box)
{
ClutterElementClass *klass;
gboolean x_change, y_change, width_change, height_change;
klass = CLUTTER_ELEMENT_GET_CLASS (self);
@ -326,15 +327,34 @@ clutter_element_request_coords (ClutterElement *self,
if (klass->request_coords)
klass->request_coords(self, box);
x_change = (self->priv->coords.x1 != box->x1);
y_change = (self->priv->coords.y1 != box->y1);
width_change = (self->priv->coords.x2 - self->priv->coords.x1
!= box->x2 - box->x1);
height_change = (self->priv->coords.y2 - self->priv->coords.y1
!= box->y2 - box->y1);
self->priv->coords.x1 = box->x1;
self->priv->coords.y1 = box->y1;
self->priv->coords.x2 = box->x2;
self->priv->coords.y2 = box->y2;
/* TODO: Fire a signal ? Could be usage for WM resizing stage */
if (CLUTTER_ELEMENT_IS_VISIBLE (self))
clutter_element_queue_redraw (self);
/* FIXME: Below really needed ? If so should add to other _set calls.
*/
if (x_change)
g_object_notify (G_OBJECT (self), "x");
if (y_change)
g_object_notify (G_OBJECT (self), "y");
if (width_change)
g_object_notify (G_OBJECT (self), "width");
if (height_change)
g_object_notify (G_OBJECT (self), "height");
}
/**
@ -342,7 +362,7 @@ clutter_element_request_coords (ClutterElement *self,
* @self: A #ClutterElement
* @box: A location to store the elements #ClutterElementBox co-ordinates
*
* Requests the allocated co-ordinates for the #ClutterElement ralative
* Requests the allocated co-ordinates for the #ClutterElement relative
* to any parent.
*
* This function should not be called directly by applications instead
@ -543,14 +563,6 @@ clutter_element_class_init (ClutterElementClass *klass)
0xff,
G_PARAM_CONSTRUCT | G_PARAM_READWRITE));
/* FIXME: add - as boxed ?
* g_object_class_install_property
* (gobject_class, PROP_CLIP,
* g_param_spec_pointer ("clip",
* "Clip",
* "Clip",
* G_PARAM_READWRITE));
*/
}
static void
@ -935,33 +947,18 @@ clutter_element_get_id (ClutterElement *self)
return self->priv->id;
}
static void
depth_sorter_foreach (ClutterElement *element, gpointer user_data)
{
ClutterElement *element_to_sort = CLUTTER_ELEMENT(user_data);
gint z_copy;
z_copy = element->priv->z;
if (element_to_sort->priv->z > element->priv->z)
{
clutter_element_raise (element_to_sort, element);
element->priv->z = z_copy;
}
}
/**
* clutter_element_set_depth:
* @self: a #ClutterElement
* @depth: FIXME
*
* FIXME
* FIXME ( Basically sets Z value )
*/
void
clutter_element_set_depth (ClutterElement *self,
gint depth)
{
/* Sets Z value.*/
/* Sets Z value. - FIXME: should invert ?*/
self->priv->z = depth;
if (self->priv->parent_element)
@ -1198,7 +1195,6 @@ clutter_element_lower (ClutterElement *self, ClutterElement *above)
g_return_if_fail (CLUTTER_IS_ELEMENT(self));
g_return_if_fail (clutter_element_get_parent (self) != NULL);
/* FIXME: fix Z ordering ? */
if (above != NULL)
{
g_return_if_fail

View File

@ -111,7 +111,6 @@ sync_fullscreen (ClutterStage *stage)
}
else
{
/* FIXME */
if (stage->priv->xwin != None)
XDeleteProperty(clutter_xdisplay(),
stage->priv->xwin, atom_WINDOW_STATE);
@ -367,6 +366,9 @@ clutter_stage_request_coords (ClutterElement *self,
stage = CLUTTER_STAGE (self);
priv = stage->priv;
/* FIXME: some how have X configure_notfiys call this ?
*/
new_width = ABS(box->x2 - box->x1);
new_height = ABS(box->y2 - box->y1);

View File

@ -26,6 +26,7 @@
#include "clutter-texture.h"
#include "clutter-main.h"
#include "clutter-marshal.h"
#include "clutter-util.h"
#include "clutter-private.h" /* for DBG */
#include <GL/glx.h>
@ -39,28 +40,7 @@ G_DEFINE_TYPE (ClutterTexture, clutter_texture, CLUTTER_TYPE_ELEMENT);
#define PIXEL_TYPE GL_UNSIGNED_INT_8_8_8_8_REV
#endif
#define PIXEL_FORMAT GL_RGBA
/* Some code below based on luminocity - copyright Owen Taylor */
/* MAX_WASTE: The maximum dimension of blank area we'll accept
* in a pixmap. Bigger values use less textures, smaller
* values less texture memory. The current value of
* 256 means that the smallest texture we'll split to
* save texture memory is 513x512. (That will be split into
* a 512x512 and, if overlap is 32, a 64x512 texture)
*/
#define MAX_WASTE 64 /* FIXME: Make property */
/*
* OVERLAP: when we divide the full-resolution image into
* tiles to deal with hardware limitations, we overlap
* tiles by this much. This means that we can scale
* down by up to OVERLAP before we start getting
* seems.
*/
#define OVERLAP 0 /* 32 */
#define OVERLAP 0
/* FIXME: actually use */
typedef struct ClutterTextureTileDimention
@ -77,8 +57,9 @@ struct ClutterTexturePrivate
GLenum pixel_type;
gboolean sync_element_size;
gint tile_max_waste;
gboolean repeat_x, repeat_y;
gint max_tile_waste;
guint filter_quality;
gboolean repeat_x, repeat_y; /* non working */
gboolean tiled;
ClutterTextureTileDimention *x_tiles, *y_tiles;
@ -96,7 +77,8 @@ enum
PROP_PIXEL_FORMAT, /* Texture format */
PROP_SYNC_SIZE,
PROP_REPEAT_Y,
PROP_REPEAT_X
PROP_REPEAT_X,
PROP_FILTER_QUALITY
};
enum
@ -111,17 +93,6 @@ static int texture_signals[LAST_SIGNAL] = { 0 };
static void
init_tiles (ClutterTexture *texture);
static int
next_p2 (int a)
{
int rval=1;
while(rval < a)
rval <<= 1;
return rval;
}
static gboolean
can_create (int width,
int height,
@ -147,6 +118,7 @@ can_create (int width,
static int
tile_dimension (int to_fill,
int start_size,
int waste,
ClutterTextureTileDimention *tiles)
{
int pos = 0;
@ -174,7 +146,7 @@ tile_dimension (int to_fill,
{
to_fill -= (size - OVERLAP);
pos += size - OVERLAP;
while (size >= 2 * to_fill || size - to_fill > MAX_WASTE)
while (size >= 2 * to_fill || size - to_fill > waste)
size /= 2;
}
}
@ -190,20 +162,21 @@ init_tiles (ClutterTexture *texture)
priv = texture->priv;
x_pot = next_p2 (priv->width);
y_pot = next_p2 (priv->height);
x_pot = clutter_util_next_p2 (priv->width);
y_pot = clutter_util_next_p2 (priv->height);
if (x_pot - priv->width > MAX_WASTE && y_pot - priv->height > MAX_WASTE)
if (x_pot - priv->width > priv->max_tile_waste
&& y_pot - priv->height > priv->max_tile_waste)
{
while (!(can_create (x_pot, y_pot, priv->pixel_format, priv->pixel_type)
&& (x_pot - priv->width < MAX_WASTE)
&& (y_pot - priv->height < MAX_WASTE)))
&& (x_pot - priv->width < priv->max_tile_waste)
&& (y_pot - priv->height < priv->max_tile_waste)))
{
CLUTTER_DBG("x_pot:%i - width:%i < max_waste:%i",
x_pot, priv->width, MAX_WASTE );
x_pot, priv->width, priv->max_tile_waste);
CLUTTER_DBG("y_pot:%i - height:%i < max_waste:%i",
y_pot, priv->height, MAX_WASTE );
y_pot, priv->height, priv->max_tile_waste);
if (x_pot > y_pot)
x_pot /= 2;
@ -215,20 +188,22 @@ init_tiles (ClutterTexture *texture)
if (priv->x_tiles)
g_free(priv->x_tiles);
priv->n_x_tiles = tile_dimension (priv->width, x_pot, NULL);
priv->n_x_tiles = tile_dimension (priv->width, x_pot,
priv->max_tile_waste, NULL);
priv->x_tiles = g_new (ClutterTextureTileDimention, priv->n_x_tiles);
tile_dimension (priv->width, x_pot, priv->x_tiles);
tile_dimension (priv->width, x_pot, priv->max_tile_waste, priv->x_tiles);
if (priv->y_tiles)
g_free(priv->y_tiles);
priv->n_y_tiles = tile_dimension (priv->height, y_pot, NULL);
priv->n_y_tiles = tile_dimension (priv->height, y_pot,
priv->max_tile_waste, NULL);
priv->y_tiles = g_new (ClutterTextureTileDimention, priv->n_y_tiles);
tile_dimension (priv->height, y_pot, priv->y_tiles);
tile_dimension (priv->height, y_pot, priv->max_tile_waste, priv->y_tiles);
CLUTTER_DBG("x_pot:%i, width:%i, y_pot:%i, height: %i max_waste:%i, "
" n_x_tiles: %i, n_y_tiles: %i",
x_pot, priv->width, y_pot, priv->height, MAX_WASTE,
x_pot, priv->width, y_pot, priv->height, priv->max_tile_waste,
priv->n_x_tiles, priv->n_y_tiles);
}
@ -267,8 +242,8 @@ texture_render_to_gl_quad (ClutterTexture *texture,
{
glBindTexture(GL_TEXTURE_2D, priv->tiles[0]);
tx = (float) priv->width / next_p2 (priv->width);
ty = (float) priv->height / next_p2 (priv->height);
tx = (float) priv->width / clutter_util_next_p2 (priv->width);
ty = (float) priv->height / clutter_util_next_p2 (priv->height);
qx1 = x1; qx2 = x2;
qy1 = y1; qy2 = y2;
@ -407,8 +382,11 @@ clutter_texture_sync_pixbuf (ClutterTexture *texture)
GL_TEXTURE_WRAP_T,
priv->repeat_y ? GL_REPEAT : GL_CLAMP);
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_MAG_FILTER,
priv->filter_quality ? GL_LINEAR : GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
priv->filter_quality ? GL_LINEAR : GL_NEAREST);
glPixelStorei (GL_UNPACK_ROW_LENGTH,
gdk_pixbuf_get_width(priv->pixbuf));
@ -422,8 +400,8 @@ clutter_texture_sync_pixbuf (ClutterTexture *texture)
0,
(gdk_pixbuf_get_n_channels (priv->pixbuf) == 4) ?
GL_RGBA : GL_RGB,
next_p2(priv->width),
next_p2(priv->height),
clutter_util_next_p2(priv->width),
clutter_util_next_p2(priv->height),
0,
priv->pixel_format,
priv->pixel_type,
@ -518,9 +496,13 @@ clutter_texture_sync_pixbuf (ClutterTexture *texture)
GL_TEXTURE_WRAP_T,
priv->repeat_y ? GL_REPEAT : GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,
priv->filter_quality ? GL_LINEAR : GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
priv->filter_quality ? GL_LINEAR : GL_NEAREST);
glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
glPixelStorei (GL_UNPACK_ROW_LENGTH, gdk_pixbuf_get_width(pixtmp));
glPixelStorei (GL_UNPACK_ALIGNMENT,
@ -535,10 +517,6 @@ clutter_texture_sync_pixbuf (ClutterTexture *texture)
GL_RGBA : GL_RGB,
priv->x_tiles[x].size,
priv->y_tiles[y].size,
/*
gdk_pixbuf_get_width(pixtmp),
gdk_pixbuf_get_height(pixtmp),
*/
0,
priv->pixel_format,
priv->pixel_type,
@ -552,10 +530,6 @@ clutter_texture_sync_pixbuf (ClutterTexture *texture)
0, 0,
priv->x_tiles[x].size,
priv->y_tiles[y].size,
/*
gdk_pixbuf_get_width(pixtmp),
gdk_pixbuf_get_height(pixtmp),
*/
priv->pixel_format,
priv->pixel_type,
gdk_pixbuf_get_pixels(pixtmp));
@ -690,7 +664,7 @@ clutter_texture_set_property (GObject *object,
CLUTTER_DBG("Texture is tiled ? %i", priv->tiled);
break;
case PROP_MAX_TILE_WASTE:
priv->tile_max_waste = g_value_get_int (value);
priv->max_tile_waste = g_value_get_int (value);
break;
case PROP_PIXEL_TYPE:
priv->pixel_type = g_value_get_int (value);
@ -707,6 +681,9 @@ clutter_texture_set_property (GObject *object,
case PROP_REPEAT_Y:
priv->repeat_y = g_value_get_boolean (value);
break;
case PROP_FILTER_QUALITY:
priv->filter_quality = g_value_get_int (value);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@ -734,7 +711,7 @@ clutter_texture_get_property (GObject *object,
g_value_set_boolean (value, priv->tiled);
break;
case PROP_MAX_TILE_WASTE:
g_value_set_int (value, priv->tile_max_waste);
g_value_set_int (value, priv->max_tile_waste);
break;
case PROP_PIXEL_TYPE:
g_value_set_int (value, priv->pixel_type);
@ -751,6 +728,9 @@ clutter_texture_get_property (GObject *object,
case PROP_REPEAT_Y:
g_value_set_boolean (value, priv->repeat_y);
break;
case PROP_FILTER_QUALITY:
g_value_set_int (value, priv->filter_quality);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@ -808,7 +788,7 @@ clutter_texture_class_init (ClutterTextureClass *klass)
g_param_spec_boolean ("repeat-x",
"Tile underlying pixbuf in x direction",
"Reapeat underlying pixbuf rather than scale"
"in x direction",
"in x direction. Currently UNWORKING",
FALSE,
G_PARAM_CONSTRUCT | G_PARAM_READWRITE));
@ -817,17 +797,32 @@ clutter_texture_class_init (ClutterTextureClass *klass)
g_param_spec_boolean ("repeat-y",
"Tile underlying pixbuf in y direction",
"Reapeat underlying pixbuf rather than scale"
"in y direction",
"in y direction. Currently UNWORKING",
FALSE,
G_PARAM_CONSTRUCT | G_PARAM_READWRITE));
/* FIXME: non working atm */
/* FIXME: Ideally this option needs to have some kind of global
* overide as to imporve performance.
*/
g_object_class_install_property
(gobject_class, PROP_FILTER_QUALITY,
g_param_spec_int ("filter-quality",
"Quality of filter used when scaling a texture",
"Values 0 and 1 current only supported, with 0"
"being lower quality but fast, 1 being better "
"quality but slower. ( Currently just maps to "
" GL_NEAREST / GL_LINEAR )",
0,
G_MAXINT,
1,
G_PARAM_CONSTRUCT | G_PARAM_READWRITE));
g_object_class_install_property
(gobject_class, PROP_MAX_TILE_WASTE,
g_param_spec_int ("tile-waste",
"Tile dimention to waste",
"The maximum dimension of blank area we'll accept"
"in a pixmap. Bigger values use less textures, "
"Max wastage dimention of a texture when using "
"tiled textures. Bigger values use less textures, "
"smaller values less texture memory. ",
0,
G_MAXINT,
@ -851,7 +846,7 @@ clutter_texture_class_init (ClutterTextureClass *klass)
"GL texture pixel format used",
0,
G_MAXINT,
PIXEL_FORMAT,
GL_RGBA,
G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE));
texture_signals[SIGNAL_SIZE_CHANGE] =
@ -971,27 +966,13 @@ clutter_texture_set_pixbuf (ClutterTexture *texture, GdkPixbuf *pixbuf)
/* Force tiling if pixbuf is too big for single texture */
if (priv->tiled == FALSE
&& texture_dirty
&& !can_create(next_p2(priv->width), next_p2(priv->height),
priv->pixel_format, priv->pixel_type))
&& !can_create(clutter_util_next_p2(priv->width),
clutter_util_next_p2(priv->height),
priv->pixel_format,
priv->pixel_type))
priv->tiled = TRUE;
clutter_threads_leave();
/* FIXME: for priv->tiled = FALSE textures, pixbuf could be
* format we dont like ( ie no alpha ). therfore
* we need to pixbuf_copy it into one that is.
*
* Actually I dont think this is worth worrying about...
* is non tiled textures are being used, texture data
* type can be set at initialisation.
*/
/* reset set if element does not yet have size */
/* FIXME: caller has to handle this via signal, OR
set prop so its always handled automatically OR
always happens and client can resize via signal
if (clutter_element_width (CLUTTER_ELEMENT(texture)) == 0
|| clutter_element_height (CLUTTER_ELEMENT(texture)) == 0)
*/
if (priv->sync_element_size)
clutter_element_set_size (CLUTTER_ELEMENT(texture),
priv->width,

View File

@ -486,7 +486,7 @@ clutter_timeline_is_playing (ClutterTimeline *timeline)
*
* Return Value: a new #ClutterTimeline
*/
ClutterTimeline *
ClutterTimeline*
clutter_timeline_new (guint nframes,
guint fps)
{

View File

@ -9,7 +9,7 @@ m4_define(clutter_version_micro, 1)
AC_INIT([clutter],
clutter_version_major.clutter_version_minor.clutter_version_micro,
[mallum@o-hand.com])
[http://bugzilla.o-hand.com/enter_bug.cgi?product=clutter])
AC_CONFIG_SRCDIR([clutter/clutter.h])
AM_CONFIG_HEADER([config.h])
@ -53,45 +53,40 @@ AC_CHECK_FUNCS([memset munmap strcasecmp strdup])
dnl ========================================================================
# FIXME: redo below
PKG_CHECK_MODULES(X11, x11)
AC_PATH_XTRA
# FIXME: Needed ?
AC_MSG_CHECKING([for XTHREADS in Xlib])
if test "x$have_x" = "xyes"; then
GLX_LIBS="$X_LIBS -lX11 -lGL"
GLX_CFLAGS="$X_CFLAGS"
save_LIBS="$LIBS"
save_CFLAGS="$CFLAGS"
CFLAGS="$CFLAGS $GLX_CFLAGS"
LIBS="$LIBS $GLX_LIBS"
AC_MSG_CHECKING([for XTHREADS in Xlib])
AC_RUN_IFELSE(
AC_RUN_IFELSE(
[AC_LANG_PROGRAM([[#include <X11/Xlib.h>]],
[[return XInitThreads() == 0 ? 0 : 1;]])],
[xthreads=no],
[xthreads=yes],
[xthreads=yes])
AC_MSG_RESULT($xthreads)
AC_MSG_RESULT($xthreads)
LIBS="$save_LIBS"
CFLAGS="$save_CFLAGS"
if test "x$xthreads" = "xyes"
then
GLX_LIBS="$GLX_LIBS -lpthread"
AC_DEFINE([XTHREADS], [], [1])
fi
else
AC_MSG_ERROR([*** Cannot find X + GL ****])
if test "x$xthreads" = "xyes"
then
X11_LIBS="$X11_LIBS -lpthread"
AC_DEFINE([XTHREADS], [], [1])
fi
AC_CHECK_LIB(GL, glXCreateContext, HAVE_LIBGL=yes, HAVE_LIBGL=no)
if test "x$HAVE_LIBGL" = "xno"; then
AC_MSG_ERROR(libGL not found);
else
GLX_LIBS="$X11_LIBS -lGL"
fi
GLX_CFLAGS="$X11_CFLAGS"
dnl ========================================================================
pkg_modules="pangoft2 glib-2.0 >= 2.8 gthread-2.0 gdk-pixbuf-2.0"
PKG_CHECK_MODULES(CLUTTER, [$pkg_modules])
PKG_CHECK_MODULES(CLUTTER_DEPS, [$pkg_modules])
dnl ========================================================================
@ -104,8 +99,14 @@ GST_LIBS="$GST_LIBS -lgstinterfaces-$GST_MAJORMINOR -lgstvideo-$GST_MAJORMINOR -
dnl ========================================================================
pkg_modules="gtk+-2.0"
PKG_CHECK_MODULES(GTK, [$pkg_modules])
AC_ARG_ENABLE(gtk,
[AC_HELP_STRING([--enable-gtk], [Buld Gtk+ Clutter widget])],enable_gtk="$enableval",enable_gtk=no)
if test "x$enable_gtk" = "xyes"; then
PKG_CHECK_MODULES(GTK, [gtk+-2.0])
fi
AM_CONDITIONAL(ENABLE_GTK, test x$enable_gtk = xyes)
dnl ========================================================================
@ -183,8 +184,8 @@ AC_SUBST(GST_LIBS)
AC_SUBST(GTK_CFLAGS)
AC_SUBST(GTK_LIBS)
CLUTTER_CFLAGS="$GLX_CLAGS $CLUTTER_CFLAGS"
CLUTTER_LIBS="$GLX_LIBS $CLUTTER_LIBS"
CLUTTER_CFLAGS="$GLX_CLAGS $CLUTTER_DEPS_CFLAGS"
CLUTTER_LIBS="$GLX_LIBS $CLUTTER_DEPS_LIBS"
AC_SUBST(CLUTTER_CFLAGS)
AC_SUBST(CLUTTER_LIBS)
@ -199,3 +200,16 @@ doc/Makefile
doc/reference/Makefile
clutter.pc
])
dnl ========================================================================
echo ""
echo " Clutter $VERSION"
echo " ==================="
echo ""
echo " prefix: ${prefix}"
echo ""
echo " Python Bindings: ${enable_python}"
echo " GTK+ Widget: ${enable_gtk}"
echo " Documentation: ${enable_gtk_doc}"
echo ""

View File

@ -1,14 +1,27 @@
#include <clutter/clutter.h>
void
frame_cb (ClutterTimeline *timeline,
gint frame_num,
gpointer data)
{
ClutterElement *label = (ClutterElement*)data;
clutter_element_set_depth(label, -400 + (frame_num * 40));
clutter_element_set_opacity (label, 255 - frame_num );
}
int
main (int argc, char *argv[])
{
ClutterElement *label;
ClutterElement *stage;
gchar *text;
gsize size;
ClutterColor stage_color = { 0x00, 0x00, 0x00, 0xff };
ClutterColor label_color = { 0x11, 0xdd, 0x11, 0xaa };
ClutterTimeline *timeline;
ClutterElement *label;
ClutterElement *stage;
gchar *text;
gsize size;
ClutterColor stage_color = { 0x00, 0x00, 0x00, 0xff };
ClutterColor label_color = { 0x11, 0xdd, 0x11, 0xaa };
clutter_init (&argc, &argv);
@ -22,12 +35,21 @@ main (int argc, char *argv[])
label = clutter_label_new_with_text ("Mono 8", text);
clutter_label_set_color (CLUTTER_LABEL (label), &label_color);
/* clutter_label_set_text_extents (CLUTTER_LABEL(label), 200, 0); */
clutter_group_add (CLUTTER_GROUP (stage), label);
clutter_group_show_all (CLUTTER_GROUP (stage));
g_signal_connect (stage, "button-press-event",
timeline = clutter_timeline_new (400, 60); /* num frames, fps */
g_object_set(timeline, "loop", TRUE, 0); /* have it loop */
g_signal_connect(timeline, "new-frame", G_CALLBACK (frame_cb), label);
/* and start it */
clutter_timeline_start (timeline);
g_signal_connect (stage, "key-press-event",
G_CALLBACK (clutter_main_quit), NULL);
g_object_unref (stage);
clutter_main();

View File

@ -3,11 +3,12 @@ INCLUDES = @GCC_FLAGS@ @CLUTTER_CFLAGS@ $(GST_CFLAGS) $(GTK_CFLAGS)
lib_LTLIBRARIES = libgtkclutter-@CLUTTER_MAJORMINOR@.la
libgtkclutter_@CLUTTER_MAJORMINOR@_la_SOURCES = gtk-clutter.c
libgtkclutter_@CLUTTER_MAJORMINOR@_la_LIBADD = @CLUTTER_LIBS@ $(GST_LIBS) $(GTK_LIBS)
libgtkclutter_@CLUTTER_MAJORMINOR@_la_LIBADD = \
@CLUTTER_LIBS@ $(GST_LIBS) $(GTK_LIBS)
libgtkclutter_@CLUTTER_MAJORMINOR@_la_LDFLAGS = @CLUTTER_LT_LDFLAGS@
gtkclutterheadersdir = $(includedir)/gtk-clutter-@CLUTTER_MAJORMINOR@/gtk-clutter
gtkclutterheadersdir = \
$(includedir)/gtk-clutter-@CLUTTER_MAJORMINOR@/gtk-clutter
gtkclutterheaders_DATA = gtk-clutter.h
noinst_PROGRAMS = gtk-clutter-test