Volver al índice ; Próximo: Eventos ; Previo: Ventanas

Dibujando en X

Mapas de pixels

Una ventana es un vector bidimensional de pixels almacenado en el servidor y asociado a una zona de la pantalla.

pixmap
La misma estructura de datos que una ventana, pero no está asociado a la pantalla.

Las primitivas de dibujo pueden usarse con ventanas y pixmaps (nos referiremos a ambos como zonas de dibujo). Además, puede copiarse el contenido entre zonas de dibujo de la misma profundidad (XCopyArea).

Uso de los pixmaps:

Bitmap
Pixmap de profundidad 1.

Además de los anteriores, el bitmap tiene algunos usos específicos:

Existen ficheros con bitmaps predefinidos almacenados normalmente en /usr/include/X11/bitmaps/. Un ejemplo, xlogo11:

#define xlogo11_width 11
#define xlogo11_height 11

static char xlogo11_bits[] = {
 0x0f, 0x04, 0x0f, 0x02, 0x1e, 0x01, 0x3c, 0x01, 0xb8, 0x00, 0x58, 0x00,
 0xe8, 0x00, 0xe4, 0x01, 0xc4, 0x03, 0xc2, 0x03, 0x81, 0x07 };

Cuya apariencia aproximada es (obtenida por el comando
bmtoa /usr/include/X11/bitmaps/xlogo11):

	####------#
	####-----#-
	-####---#--
	--####--#--
	---###-#---
	---##-#----
	---#-###---
	--#--####--
	--#---####-
	-#----####-
	#------####
Imagen
Estructura de datos situada en el cliente que permite almacenar los datos correspondientes a una zona de dibujo. El cliente puede procesar la información sin contactar con el servidor.
Con XGetImage se copia una zona de dibujo en una estructura de tipo imagen y con XPutImage se realiza la transferencia inversa.

Ejemplo: Creando una ventana con un pixmap de fondo


Contexto gráfico

Contiene los atributos que controlan la aparencia de las primitivas gráficas. Cada primitiva gráfica incluye un identificador de contexto gráfico que determina el resultado de la misma. Un programa puede crear varios contextos gráficos (XCreateGC) para usarlos en distitas pertes del mismo o sólo uno y modificarlo (XChangeGC) según lo precise.

El contexto gráfico determina el resultado de la primitiva interviniendo en las sucesivas etapas del proceso de dibujo en el servidor:

  1. La primitiva gráfica junto con algunos atributos del contexto gráfico determinan los pixels afectados.
  2. Al resultado anterior se le aplica un color o un patrón definido en el contexto gráfico usado.
  3. Se aplica la máscara de planos especificada en el contexto para determinar qué planos serán afectados por la primitiva.
  4. Se mezclan, usando una función lógica definida en el contexto, los valores calculados con los almacenados actualmente.

Elementos del contexto gráfico:

Características de la línea:
Anchura (line_width), estilo de los extremos (cap_style), estilo de las uniones (join_style) y el estilo de la línea (line_style): continua o discontinua.
font
Fuente de texto.
Modo de relleno
Para polígonos (fill_rule) y para arcos (arc_mode).
foreground
Especifica el valor de pixel que se usará en la mayoría de las primitivas gráficas.
background
En algunos casos (relleno stipple opaco, línea con estilo LineDoubleDash y primitiva XDrawImageString) además de dibujarse con foreground los pixels activos, se dibujan con background los desactivados.
fill_style
Puede ser sólido (se usa el valor foreground y en algunos casos el background), tile (un pixmap que se usa como patrón de relleno), stipple (los bit activos del bitmap de relleno se dibujan con color foreground) y stipple opaco (igual que el anterior pero además los bits desactivados se dibujan de color background).
function
Función lógica que controla cómo se mezclan el nuevo dibujo con el ya existente.
plane_mask
Determina qué planos se ven afectados por el dibujo.
clip_mask
Permite limitar el efecto de las primitivas de dibujo a una determinada área de la zona de dibujo.

Gráficos y texto

Dibujos

Hay primitivas para dibujar un objeto o múltiples objetos:

XDrawPoint(s)
Dibuja uno o varios puntos.
XDrawLine(s)
Dibuja una o varias líneas.
XDrawSegments
Dibuja líneas no necesariamente conectadas.
XDrawRectangle(s) y XFillRectangle(s)
Dibuja uno o varios rectángulos: sólo el contorno o relleno respectivamente.
XDrawArc(s) y XFillArc(s)
Dibuja uno o varios arcos: sólo el contorno o relleno respectivamente.
XFillPoligon
Dibuja un polígono relleno.

Texto

Un font es un vector de bitmaps representando los correspondientes caracteres.

Antes de usarlo hay que cargarlo y obtener información que lo describa (XLoadQueryFont). Esta información describe lo que ocupa la caja de cada carácter.

Para posicionar un string es necesario obtener información del tamaño que ocupará mediante XTextWidth o XTextExtents (información más detallada).

Las primitivas de texto disponibles son:

Color

Tipos de hardware gráficos y visual

Un visual describe el modo de funcionamiento del hardware gráfico. Se distinguen 6 tipos:

PseudoColor
El valor del pixel sirve como índice de un mapa de color. Cada entrada del mapa tiene 3 campos (RGB) y se puede modificar dinámicamente.
StaticColor
Igual pero las entradas son sólo de lectura.
GrayScale
Cada entrada del mapa se puede modificar dinámicamente. El valor almacenado controla la intensidad de un único haz de electrones.
StaticGray
Igual pero las entradas son sólo de lectura.
DirectColor
El valor del pixel se descompone en tres campos (RGB) que sirven como índice para acceder a tres mapas de color.
TrueColor
Igual pero las entradas son sólo de lectura.

Base de datos de colores

Para simplificar la especificación de los colores y aumentar la compartición, el servidor mantiene una base de datos que relaciona nombres de color con valores RGB. Normalmente está almacenada en el fichero /usr/lib/X11/rgb.txt. Un ejemplo:

 70 130 180             SteelBlue

Reservando colores

Normalmente se reservan colores compartidos o de sólo lectura usando XAllocColor (reserva por valor RGB) o XAllocNamedColor (reserva por nombre). Estas funciones devuelven un índice (pixel) a una entrada del mapa (que podría haberse reservado previamente por otra aplicación) que contendrá el valor RGB pedido o el más cercano posible.

Ciertas aplicaciones necesitan reservar entradas privadas de lectura/escritura debido a:

Con XAllocColorCells se reservan las entradas y con XStoreColor (usa valor RGB) o XStoreNamedColor (usa el nombre) se rellenan.

Mapas de color

Además del mapa de color por defecto existen otros mapas de carácter estándar en los que la relación entre el valor del pixel y el color es predecible.

Adicionalmente, una aplicación que use muchos colores distribuidos de forma específica puede crear un mapa de color propio (XCreateColorMap) distinto al que existe por defecto.

La mayoría de los displays poseen sólo un mapa de color hardware. Normalmente el gestor de ventanas se encarga de instalar el mapa de color de la ventana activa en el mapa hardware.


Volver al índice ; Próximo: Eventos ; Previo: Ventanas