# Clutter (biblioteca)

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.
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

Clutter está escrito en el C con un diseño basado en GObject. Existen enlaces para los siguientes lenguajes de programación:
* C++ ( cluttermm (enlace roto disponible en Internet Archive; véase el historial, la primera versión y la última). )
* C# ( clutter-sharp (también conocido como Clutter#) (enlace roto disponible en Internet Archive; véase el historial, la primera versión y la última). )
* Java ( jClutter (enlace roto disponible en Internet Archive; véase el historial, la primera versión y la última). )
* JavaScript ( seed y GJS )
* Perl ( clutter-perl )
* Python ( PyClutter (enlace roto disponible en Internet Archive; véase el historial, la primera versión y la última). )
* Ruby ( rbclutter )
* Vala ( clutter-vala )

## Plataformas

Clutter se desarrolla en el sistema de ventanas X utilizando la extensión GLX. 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. Una implementación nativa para Microsoft Windows es soportada desde la versión 0.8.

## Diseño

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

En este ejemplo se agregará un label(etiqueta) en el escenario.
    Esta declaración recuperará el escenario por defecto, que contendrá todos los actores en la escena.
    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.
    Estas declaraciones colocan una etiqueta en el centro del escenario, teniendo en cuenta los tamaños del escenario y la etiqueta.
    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

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

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:
    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:
    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

Clutter puede construir interfaces de usuario(GUI) usando un dialecto basado en JSON. 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

Esta definición va a crear la ventana principal y colocar una etiqueta con el texto ¡Hola, mundo! dentro de él.
La definición se pueden guardar en un archivo o como una cadena, y se carga con:

## Integración con otras bibliotecas

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.