Tutorial de programación en DOS – Paleta de colores VGA

En este artículo crearemos una paleta de colores para salida VGA bajo DOS. El código fuente del último artículo sobre VGA se expande para dibujar un fondo con degradados de color.

Tutorial de programación en DOS – Paleta de colores VGA

En el último artículo, mostramos todos los colores línea por línea y vimos que el resultado no es un degradado. Bajo DOS hay diferentes paletas de colores en las que se almacenan los colores. Se accede a ellos a través de un índice. Eso significa que el color en el índice 10 no siempre es el mismo. Puede definir usted mismo qué valor de color se encuentra allí. ¿Porqué es eso?

Almacenamiento limitado

La memoria de video es limitada, siempre lo es. Hoy, sin embargo, tenemos tarjetas gráficas de 8 gigas y más, donde podemos guardar y dibujar fácilmente todos los colores que podemos ver. En el ejemplo de cálculo mostré que no solo los colores sino también cada píxel de la imagen a dibujar debe almacenarse en la memoria. Por lo tanto, cuanto mayor sea la resolución, menos memoria quedará para los colores.

Agregar paleta de colores

Creamos nuestra propia paleta de colores para nuestro programa, porque queremos crear gradientes de color más hermosos. Creé 2 nuevas funciones para esto.

  • crear una paleta de colores
  • colocar una paleta de colores en la memoria de video

Para esto necesitamos algunas constantes:

#define NUM_COLORS 256 /* tamaño de la paleta de colores */ #define PALETTE_INDEX 0x3C8 /* número de puerto para VGA DAC PEL */ #define PALETTE_DATA 0x3C9 /* número de puerto para datos VGA DAC */

#define NUM_COLORS 256 /* tamaño de la paleta de colores */

#define PALETTE_INDEX 0x3C8 /* número de puerto para VGA DAC PEL */

#define PALETTE_DATA 0x3C9 /* número de puerto para datos VGA DAC */

Por ejemplo, la paleta de colores se crea así:

/* crea una paleta de colores para el color VGA y le devuelve un puntero */ byte* get_color_palette() { byte* pal; ent yo; amigo = (byte*)malloc(NUM_COLORS * 3); /* Colores RGB */ /* cielo */ for(i=0; i<100; ++i) { /* ¡Colores de 6 bits! */ amigo[i*3 + 0] = MIN(63, i/2); /* rojo */ amigo[i*3 + 1] = MIN(63, i/2); /* verde */ amigo[i*3 + 2] = 63; /* azul */ } /* suelo */ for(i=100; i<200; ++i) { amigo[i*3 + 0] = 15; /* rojo */ amigo[i*3 + 1] = ((i-100) / 2) +15; /* verde */ amigo[i*3 + 2] = 15; /* azul */ } return amigo; }

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

dieciséis

17

18

19

20

21

22

23

/* crea una paleta de colores para el color VGA y le devuelve un puntero */

byte* get_color_palette()

{

bytes* amigo;

ent yo;

amigo = (byte*)malloc(NUM_COLORS * 3); /* colores RGB */

/* cielo */

para(i=0; i<100; ++i)

{

/* ¡Colores de 6 bits! */

Camarada[i*3 + 0] = MIN(63, i/2); /* rojo */

Camarada[i*3 + 1] = MIN(63, i/2); /* verde */

Camarada[i*3 + 2] = 63; /* azul */

}

/* suelo */

para(i=100; i<200; ++i)

{

Camarada[i*3 + 0] = 15; /* rojo */

Camarada[i*3 + 1] = ((i-100) / 2) +15; /* verde */

Camarada[i*3 + 2] = 15; /* azul */

}

Vuelve amigo;

}

En el código, solo una matriz se llena con valores numéricos. El campo es número de colores * 3 de tamaño. 3 porque cada color consta de un componente rojo, verde y azul (colores RGB). Dado que nuestro código genera el color de un índice de la paleta por línea, creamos 200 (resolución de 320 × 200) colores diferentes.

/* copia la matriz de la paleta de colores a la dirección VGA DAC PEL */ void set_color_palette(byte* pal) { int i; /* outp escribe un byte en el puerto de hardware */ outp(PALETTE_INDEX, 0); for(i=0; i<NUM_COLORS * 3; ++i) { salida(PALETA_DATOS, amigo[i]); } }

/* copia la matriz de la paleta de colores a la dirección VGA DAC PEL */

void set_color_palette(byte* amigo)

{

ent yo;

/* outp escribe un byte en el puerto de hardware */

salida(PALETA_INDEX, 0);

para(i=0; i<NUM_COLORS * 3; ++i)

{

salida(PALETTE_DATA, amigo[i]);

}

}

El campo de colores se copia a través de una nueva función outp del encabezado dos.h. Esta función utiliza nuevamente las funcionalidades de DOS para llenar la memoria de video a través del sistema operativo. DOS ofrece una gran cantidad de puertos de hardware que se pueden utilizar para acceder al hardware. En la sección VGA encontrarás:

3C8 Vídeo VGA DAC Dirección PEL 3C9 Vídeo VGA DAC

Dirección PEL del DAC de vídeo VGA 3C8

DAC de vídeo VGA 3C9

El resultado se ve así:

Conclusión

Como puede ver, debe pensar en lo que desea dibujar antes de escribir la primera línea del código del programa. Luego, crea una lista de todos los colores requeridos y luego intenta almacenarlos en la memoria de video limitada en una paleta de colores. Después de eso, se puede dibujar la imagen especificando los índices de los colores por píxel. Este proceso hace que dibujar píxeles sea un poco más complicado de lo esperado. Como suele suceder, no mejora debido a las limitaciones del hardware.

(Visita 234 veces, 1 visitas hoy)