Clutter (biblioteca)

Biblioteca de objetos gráficos para sistemas con aceleración por hardware

Clutter es una biblioteca gráfica para la creación de interfaces de usuario aceleradas por hardware, escrito en C y de código abierto. Se basa en OpenGL (1.4+) o OpenGL ES (1.1 o 2.0) para la representación de gráficos, puede ser compilado en diferentes plataformas (X11, Wayland, Darwin y Win32) y tiene enlaces a varios lenguajes de programación (incluidos Mono, Perl, Python, Ruby, Vala y C++ ). También soporta la reproducción de contenidos multimedia usando GStreamer, y de procesamiento de gráficos en 2D usando Cairo.[2]

Clutter
Información general
Tipo de programa Biblioteca Gráfica en OpenGL
Desarrollador Intel Corporation
Lanzamiento inicial 22 de junio de 2006
Licencia LGPL
Estado actual En desarrollo
Idiomas inglés
Información técnica
Programado en C
Versiones
Última versión estable 1.8.0[1]( 19 de septiembre de 2011 (13 años, 3 meses y 9 días))
Enlaces

Clutter fue creado por OpenedHand Ltd, que ahora es parte de Intel y está licenciado bajo LGPL 2.1, Clutter es Software Libre y de Código Abierto.

Lenguajes de programación

editar

Clutter está escrito en el C con un diseño basado en GObject. Existen enlaces para los siguientes lenguajes de programación:

Plataformas

editar

Clutter se desarrolla en el sistema de ventanas X utilizando la extensión GLX.[3]​ También se busca facilitar su uso en sistemas empotrados, ya sea usando X o la memoria de video nativa. A partir de la versión 0.6, tiene soporte nativo para Mac OS X.[4]​ Una implementación nativa para Microsoft Windows es soportada desde la versión 0.8.[5]

Diseño

editar

Clutter funciona como un escenario lleno de objetos ocultos e interactivos. Cada objeto en el escenario es (normalmente) una superficie 2D dentro de un espacio 3D.

En resumen, Clutter es un entorno de ventanas tras un backend de OpenGL, que es también responsable de crear el contenedor principal de la escena gráfica, este contenedor de nivel superior se conoce como stage (escenario). Los elementos en el escenario se llaman actors (actores).

En lugar de operar sobre matrices, así como OpenGL, Clutter interactúa con las propiedades de cada actor. Cada vez que se realizan estos cambios, Clutter se dará cuenta y hará los cambios a la escena en consecuencia.

Ejemplo

editar

En este ejemplo se agregará un label(etiqueta) en el escenario.

ClutterActor *stage = clutter_stage_get_default ();
Esta declaración recuperará el escenario por defecto, que contendrá todos los actores en la escena.
ClutterActor *label = clutter_text_new_with_text ("Sans 32px", "¡Hola, mundo!");
clutter_container_add_actor (CLUTTER_CONTAINER (stage), label);
Estas declaraciones crearán una nueva etiqueta, con la fuente Sans 32 píxeles de alto, y con el texto "¡Hola, mundo!", y lo colocará en el escenario.
float x, y;
 
x = (clutter_actor_get_width (stage) - clutter_actor_get_width (label)) / 2;
y = (clutter_actor_get_height (stage) - clutter_actor_get_height (label)) / 2;
clutter_actor_set_position (label, x, y);
Estas declaraciones colocan una etiqueta en el centro del escenario, teniendo en cuenta los tamaños del escenario y la etiqueta.
clutter_actor_show (stage);
Esta declaración muestra el escenario. Todos los actores en clutter son visibles a menos que se declaren explícitamente ocultos, a excepción de la escena, así mostrando la escena, automáticamente todos sus hijos se hacen visibles.

Animación

editar

Clutter realiza animaciones implícitas en cada elemento del lienzo, mediante objetos especiales llamados behaviours(comportamientos): cada comportamiento se puede aplicar a múltiples actores y múltiples comportamientos pueden ser implementados en el mismo actor. Los comportamientos manejan animaciones implícitamente: el desarrollador especifica los estados inicial y final, el tiempo (o número de fotogramas) necesarios para completar la animación, la función de tiempo que se utiliza (lineal, de onda sinusoidal, exponencial, etc), y el comportamiento se hará cargo de la interpolación. Clutter proporciona una clase base genérica para que los desarrolladores implementen comportamientos personalizados, y varias clases simples con propiedades sencillas, como transparencia, posición en el eje Z (profundidad), posición, rotación, etc.

Desde Clutter 1.0, también es posible crear fácilmente y de una sola vez animaciones utilizando la clase ClutterAnimation y la función clutter_actor_animate(). La función clutter_actor_animate(), anima las propiedades de un actor, entre su estado actual y el estado final especificado.

Ejemplo

editar

En este ejemplo se escalará el tamaño de la etiqueta en un factor de 2, en 2 segundos, utilizando una función de tiempo lineal y su comportamiento:

ClutterTimeline *timeline = clutter_timeline_new (2000);
ClutterAlpha *alpha = clutter_alpha_new_full (timeline, CLUTTER_LINEAR);
ClutterBehaviour *behaviour = clutter_behaviour_scale_new (alpha,
                                                           1.0, 1.0, /* Factor inicial de la escala */
                                                           2.0, 2.0  /* Factor final de la escala */ );
clutter_behaviour_apply (behaviour, label);
Estas declaraciones crearán una línea de tiempo(timeline) con una duración de 2000 milisegundos; alpha, vincula la línea de tiempo mediante un modelo lineal; behaviour, escala a todos los agentes a los que se aplica (en este caso es alpha) entre el factor 1,0 y el factor 2,0 (tanto horizontal como verticalmente). Por último, se aplica behaviour a un actor.

El código equivalente que utiliza la API de animaciones implícita es:

clutter_actor_animate (label,          /* el actor que se animará */
                       CLUTTER_LINEAR, /* modo */
                       2000,           /* duración de la animación */
                       "scale-x", 2.0, /* factor final de escalado horizontal */
                       "scale-y", 2.0, /* factor final de escalado vertical */
                       NULL);
Esta declaración creara un implícitamente un objeto ClutterAnimation, que animará las propiedades GObject siempre entre su valor actual y el valor final especificado.

Construcción de interfaces

editar

Clutter puede construir interfaces de usuario(GUI) usando un dialecto basado en JSON.[6]​ Los gráficos de la escena completa se definen utilizando los tipos en JSON y luego son construidos en tiempo de ejecución a través de la clase ClutterScript.

Ejemplo

editar

Esta definición va a crear la ventana principal y colocar una etiqueta con el texto ¡Hola, mundo! dentro de él.

 
{
  "id" : "main-stage",
  "type" : "ClutterStage",
  "color" : "white",
  "width" : 800,
  "height" : 600,
  "title" : "Script demo",
  "children" : [
    {
      "id" : "hello-label",
      "type" : "ClutterText",
      "x" : 400,
      "y" : 300,
      "text" : "¡Hola, mundo!",
      "color" : "black",
      "font-name" : "Sans 48px"
    }
  ],
  "signals" : [
    { "name" : "destroy", "handler" : "clutter_main_quit" }
  ]
}

La definición se pueden guardar en un archivo o como una cadena, y se carga con:

ClutterScript *script = clutter_script_new ();
GError *error = NULL;
clutter_script_load_from_data (script, description, -1, &error);
if (error)
  {
    g_warning ("No se puede cargar la descripción de interfaz de usuario: %s", error->message);
    g_error_free (error);
  }
else
  {
    GObject *stage;
 
    clutter_script_connect_signals (script, NULL); /* connect the signal handlers */
    stage = clutter_script_get_object (script, "main-stage"); /* get the "main-stage" object */
    clutter_actor_show (CLUTTER_ACTOR (stage));
  }

Integración con otras bibliotecas

editar

Clutter puede ser integrado con otras bibliotecas y kits de herramientas, por ejemplo:

  • Aplicaciones GTK+ puede integrar una capa Clutter con un widget especial.
  • Clutter puede utilizar GStreamer para reproducir vídeos directamente en un actor.
  • Clutter puede utilizar Cairo para dibujar dentro de una textura.
  • Clutter puede incluir aplicaciones GTK+ directamente dentro de sí.
  • También es compatible con la biblioteca Qt.
  • Puede usarse la biblioteca de físicas Box2D.

Véase también

editar

Referencias

editar
  1. «Clutter 1.8.0 - stable release». Archivado desde el original el 23 de septiembre de 2011. Consultado el 20 de septiembre de 2011. 
  2. http://www.clutter-project.org/docs/clutter/stable/ClutterCairoTexture.html Archivado el 15 de septiembre de 2009 en Wayback Machine. Clutter Referencia de la API: ClutterCairoTexture
  3. http://www.clutter-project.org/docs/clutter/stable/clutter-X11-Specific-Support.html Archivado el 14 de agosto de 2009 en Wayback Machine.
  4. http://blogs.gnome.org/tko/2008/05/26/three-steps-forward-one-giant-step-back/ La vida con clutter en OSX
  5. «Copia archivada». Archivado desde el original el 5 de agosto de 2009. Consultado el 29 de julio de 2009. 
  6. http://www.clutter-project.org/docs/clutter/stable/ClutterScript.html Archivado el 4 de agosto de 2009 en Wayback Machine. ClutterScript.description Clutter Referencia de la API: ClutterScript

Enlaces externos

editar