|
このページは大阪弁化フィルタによって翻訳生成されたんですわ。 |
Hay varios modos de conseguir acceso directo a la memoria de imagen de un llamados 'line', la cual es parte de la estructura bitmap y contiene punteros al comienzo de cada l?ea de la imagen. Por ejemplo, una funci? putpixel simple para un bitmap de memoria es:
void memory_putpixel(BITMAP *bmp, int x, int y, int color)
{
bmp->line[y][x] = color;
}
Para modos truecolor, es necesario especificar el tipo del puntero de l?ea, por ejemplo:
void memory_putpixel_15_or_16_bpp(BITMAP *bmp, int x, int y, int color)
{
((short *)bmp->line[y])[x] = color;
}
void memory_putpixel_32(BITMAP *bmp, int x, int y, int color)
{
((long *)bmp->line[y])[x] = color;
}
cualquier pantalla lineal, p.ej unos framebuffers lineales de VESA.
void linear_screen_putpixel(BITMAP *bmp, int x, int y, int color)
{
bmp_select(bmp);
bmp_write8((unsigned long)bmp->line[y]+x, color);
}
Para los modos truecolor deber? reemplazar bmp_write8() por bmp_write16(),
bmp_write24(), o bmp_write32(), y multiplicar el desplazamiento x por el
n?ero de bytes por p?el. Por supuesto hay funciones similares para leer el
las funciones de cambio de banco. Para un acceso m疽 flexible a los bitmaps
de memoria, necesita llamar a las rutinas:
unsigned long bmp_write_line(BITMAP *bmp, int line);
Selecciona la l?ea de un bitmap en la que va a dibujar.
unsigned long bmp_read_line(BITMAP *bmp, int line);
Selecciona la l?ea de un bitmap de la que va a leer.
unsigned long bmp_unwrite_line(BITMAP *bmp);
Libera el bitmap de memoria despued de que haya acabado de trabajar con
駘. S?o necesita llamar a esta funci? una vez al final de una operaci?
de dibujado, incluso si ha llamado a bmp_write_line() o bmp_read_line()
diversas beces antes.
Estas est疣 implementadas como rutinas de ensamblador en l?ea, por lo que no son tan ineficientes como podr?n parecer. Si el bitmap no necesita cambio de banco (ejemplo: es un bitmap de memoria, pantalla en modo 13h, etc), estas funciones simplemente retornan bmp->line[line].
A pesar de que los bitmaps de SVGA usan bancos, Allegro permite acceso lineal a la memoria dentro de cada scanline, por lo que s?o necesita pasar una coordenada y a estas funciones. Varias posiciones x pueden ser obtenidas simplemente sumando la coordenada x a la direcci? devuelta. El valor devuelto es un entero largo sin signo en vez de un puntero a caracter porque la memoria bitmap puede no estar en su segmento de datos, y necesita acceder a 駘 con punteros far. Por ejemplo, una funci? putpixel usando funciones de cambio de banco es:
void banked_putpixel(BITMAP *bmp, int x, int y, int color)
{
unsigned long address = bmp_write_line(bmp, y);
bmp_select(bmp);
bmp_write8(address+x, color);
individualmente, y en otros la memoria de v?eo es le?a y escrita en
direcciones diferentes. No obstante, la vida nunca es tan simple como
desear?mos que fuese (esto es verdad incluso cuando _no_ estamos hablando
de programaci? de gr畴icos :-) y por supuesto algunas tarjetas de v?eo
s?o pueden proveer un banco. En 駸tas, las funciones de lectura/escritura
se comportar疣 id駭ticamente, por lo que no deber? asumir que puede leer de
una parte de la memoria de v?eo y escribir en otra al mismo tiempo. Puede
llamar bmp_read_line(), y leer lo que quiera de la l?ea, entonces llamar
bmp_write_line() con el mismo o diferente valor de l?ea, y escribir lo que
quiera en ella, pero no deber? llamar bmp_read_line() y bmp_write_line() a
void modex_putpixel(BITMAP *b, int x, int y, int color)
{
outportw(0x3C4, (0x100<<(x&3))|2);
bmp_select(bmp);
bmp_write8((unsigned long)bmp->line[y]+(x>>2), color);
}
#include <sys/nearptr.h>
unsigned char *screenmemory;
unsigned long screen_base_addr;
__djgpp_nearptr_enable();
__dpmi_get_segment_base_address(screen->seg, &screen_base_addr);
screenmemory = (unsigned char *)(screen_base_addr +
screen->line[0] -
__djgpp_base_address);
Luego:
void nearptr_putpixel(int x, int y, int color)
{
screenmemory[x + y*SCREEN_W] = color;
}
Volver al Indice