www.delorie.com/djgpp/doc/ug/graphics/intro.html | search |
Guia: Informaciones basicas sobre graficos
Para poder elaborar un programa que visualiza imagenes graficas, debes configurar el hardware de video con una de las diferentes resoluciones graficas disponibles. En esos modos, la imagen de la pantalla se crea tomando como base una rejilla de diminutos puntos llamados pixeles, siendo posible asignar a cada uno de ellos un color distinto. Puedes construir contornos complejos combinando muchos de esos puntos hasta formar un patron adecuado. Este proceso podria compararse con un pedazo de papel milimetrado, en el cual cada cuadrado puede colorearse de manera diferente. En los modos de video de PC mas comunes un pixel ocupa exactamente un byte de memoria, siendo por ello posible que asuma cualquiera de los 256 distintos colores posibles, pero las tarjetas graficas modernas soportan resoluciones con mas colores tales como, por ejemplo, los modos de alta resolucion de color que utilizan pixeles de 16 bits (65536 colores diferentes), y los modos de color real con pixeles de 24 bits (hasta 16777216 colores posibles).
Existen muchas bibliotecas que pueden facilitar mucho la programacion de graficos con djgpp, tales como Allegro, GRX y Jlib, pero en este archivo no intentaremos describir su uso, ya que ese cometido se ha cumplido ya en la documentacion de los paquetes respectivos. La presente documentacion esta dirigida a la gente que desea escribir su propio codigo grafico "desde la base", sin utilizar ninguna biblioteca de terceros. No se requiere experiencia previa en la programacion de graficos de PC, pero si algunos conocimientos del mapeo de memoria DPMI y nociones fundamentales de la forma de acceder a la memoria convencional (estos temas se tratan en el capitulo anterior (no escrito todavia)).
Una pantalla grafica consta de una matriz de pixeles denominada "bufer de video". De conformidad con las convenciones, un bufer de video debe indexarse con el origen (cero) en la esquina superior izquierda, con el eje X aumentando hacia la derecha y el eje Y aumentando a medida que te desplazas hacia abajo en la pantalla. Esto coincide con la distribucion de una matriz C, de manera que puedes declarar la matriz de tu pantalla como una matriz sencilla de dos dimensiones. Asi, por ejemplo, en una resolucion de 320x200 podrias escribir:
unsigned char screen_image[200][320];
Ten presente que el valor Y debe preceder al valor X: esto puede parecer ilogico, pero es necesario para que la distribucion de la memoria sea correcta.
Despues de esta declaracion puedes acceder a los pixeles en su respectiva ubicacion (x,y) mediante una sintaxis de matriz C normal. Por ejemplo, para dibujar un pixel en el bufer de video deberas escribir:
screen_image[y][x] = color;
Esto parece muy sencillo, pero en muchas ocasiones resulta mas adecuado tratar el bufer de video como una matriz C de una sola dimension y procesar el desplazamiento de pixeles uno mismo (esto resulta necesario cuando tu programa se ejecutara con mas de una resolucion posible, ya que al momento de compilar se desconocen el ancho de la pantalla y, por lo tanto, las dimensiones de la matriz). Para utilizar este sistema, debes reescribir la declaracion del bufer de video de la siguiente forma:
unsigned char screen_image[320*200];
y dibujar un pixel con el codigo:
screen_image[y*320+x] = color;
Hasta ahora, estos buferes de video han sido solamente matrices normales en la memoria, de manera que sin importar lo que escribas en ellos, los resultados nunca se mostraran en pantalla. Pero seguramente te alegrara saber que el hardware grafico utiliza exactamente el mismo formato para guardar las imagenes que visualiza en tu pantalla, de forma que basta con copiar la figura de este bufer de video de memoria al area de memoria especial utilizada por la tarjeta VGA para que la figura se visualice y todos puedan verla. Es muy complicado escribir directamente en la memoria de video, ya que esta ubicada fuera de tu espacio de direccionamiento normal. Por ello, se requieren tecnicas especiales para acceder a ella y es por este motivo que mucha gente opta por preparar un marco entero de graficos en un bufer de memoria (de la forma descrita arriba) y copiarlo luego a la memoria de video una vez que la imagen entera este completa, pero las reglas basicas son las mismas.
Traducido por: [www.cevallos.de] (21/6/2000)
Revisado por:
Copyright © 1998 by DJ Delorie | Updated Jan 1998 |