Clutter (biblioteca)

De Wikipedia, la enciclopedia libre
Saltar a: navegación, búsqueda
Clutter
Desarrollador
Intel Corporation
http://www.clutter-project.org/
Información general
Lanzamiento inicial 22 de junio de 2006
Última versión estable 1.8.0[1]
19 de septiembre de 2011; hace 2 años (2011-09-19)
Género Biblioteca Gráfica en OpenGL
Programado en C
Sistema operativo X11, Darwin Win32
Licencia LGPL
Estado actual En desarrollo
En español No No

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 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 un 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]

Enlaces externos[editar]