void set_color_depth(int depth);
Especifica el formato gráfico que será usado en las siguientes llamadas a
set_gfx_mode() y create_bitmap(). Las profundidades válidas son 8 (por
defecto), 15, 16, 24 y 32 bits.
int set_gfx_mode(int card, int w, int h, int v_w, int v_h);
Cambia el modo gráfico. El parámetro card debe ser uno de los siguientes
valores:
GFX_TEXT - vuelve al modo texto GFX_AUTODETECT - deja que Allegro seleccione la tarjeta apropiada GFX_VGA - VGA estándar (320x200, 320x100, o 160x120) GFX_MODEX - selecciona un modo VGA lineal modificado (modo-X) GFX_VESA1 - usa el controlador VESA 1.x GFX_VESA2B - usa el controlador VBE 2.0 con bancos GFX_VESA2L - usa el controlador VBE 2.0 con framebuffer lineal GFX_VESA3 - usa el VBE 3.0 driver GFX_VBEAF - usa el controlador VBE/AF acelerado por hardware GFX_XTENDED - usa el controlador 640x400 en modo desencadenadoLos parámetros w y h especifican la resolución gráfica que quiere. Los modos posibles son:
"Hace tiempo, poner valores o combinaciones ilegales o no soportadas en los registros de la tarjeta de vídeo podía ser peligroso para su salud y para su monitor. *Nunca* he declarado que esto no puede pasar si usa TWEAK, pero estoy muy seguro de que esto nunca pasará. Nunca he oído que usar TWEAK o cambiar manualmente los registros de la VGA hayan ocasionado daño alguno."
Puede usar el programa test afinfo para comprobar si tiene un controlador VBE/AF, y para ver qué resoluciones soporta.
Los controladores VBE/AF de SciTech requieren que el acceso con nearptr esté activado, por lo que cualquier puntero erróneo puede bloquear su máquina cuando estos controladores estén en uso. Esto significa que puede ser buena idea usar VESA mientras depura su programa, y activa VBE/AF sólo cuando el código funcione correctamente. Los controladores FreeBE/AF no tienen este problema.
Por ejemplo, puede seleccionar el modo 640x480 en el cual el monitor actúa como una ventana sobre la pantalla virtual de 1024x1024, y entonces mover la pantalla visible dentro del área grande. Inicialmente, la parte visible está posicionada en la parte superior izquierda de la memoria de vídeo. Esta configuración sería así:
(0,0)------------(640,0)----(1024,0) | | | | pantalla visible | | | | | (0,480)----------(640,480) | | | | resto de la memoria de vídeo | | | (0,1024)--------------------(1024,1024)¿Qué es eso? ¿Está viendo esto con una fuente proporcional? Jejeje.
Cuando llama set_gfx_mode(), los parámetros v_w y v_h representan el tamaño mínimo de la pantalla virtual que es aceptable para su programa. El rango de tamaños posibles es normalmente muy restringido, y es posible que Allegro acabe creando una pantalla virtual más grande que la que solicitó. En una SVGA con una mega de vram cuente con conseguir una pantalla virtual de 1024x1024 (256 colores) o 1024x512 (15 o 16 bpp), y con 512k de ram puede conseguir 1024x512 (256 colores). Otros tamaños pueden ser y no ser posibles: no asuma que vayan a funcionar. En modo-X la anchura virtual puede ser cualquier múltiplo de 8 mayor o igual a la anchura de la pantalla, y la altura virtual se ajustará de la misma forma (la VGA tiene 256k de vram, por lo que la altura virtual será 256*1024/virtual_width).
Después de seleccionar el modo gráfico, los tamaños físicos y virtuales pueden obtenerse con las macros SCREEN_W(), SCREEN_H(), VIRTUAL_W(), y VIRTUAL_H().
Si Allegro no es capaz de seleccionar un modo apropiado, set_gfx_mode() devuelve un modo negativo y almacena la descripción del problema en allegro_error. De otro modo devuelve cero.
extern int gfx_capabilities;
Campo de bits describiendo las capacidades del controlador gráfico y
hardware de vídeo actual. Esto puede contener cualquiera de los
siguientes biestables:
GFX_CAN_SCROLL:
Indica que la función scroll_screen() puede ser usada con este
controlador.
GFX_CAN_TRIPLE_BUFFER:
Indica que las funciones request_scroll() y poll_scroll() pueden ser
usadas con este controlador. A modo especial, el controlador modo-X
sólo soporta triple buffering cuando el simulador de retrazo está
instalado, por lo que debe llamar timer_simulate_retrace() antes de
hacer algo con triple buffer en una resolución de modo-X.
GFX_HW_CURSOR:
Indica que un puntero de ratón por hardware está siendo usado. Cuando
este biestable esté activado, puede dibujar sin problemas en la
pantalla sin tener que ocultar antes el puntero del ratón. Tenga en
cuenta que no todo cursor gráfico puede ser implementado via hardware:
en particular, VBE/AF sólo soporta imágenes de 2 colores y de hasta
32x32 pixels, donde el segundo color es un inverso exacto del primero.
Esto significa que Allegro puede necesitar alternar entre cursores por
hardware o software en cualquier punto durante la ejecución de su
programa, por lo que no debe asumir que esta biestable será constante
durante largos periodos de tiempo. Sólo le dice si un cursor hardware
está siendo usado ahora, y puede cambiar cuando oculte/enseñe el
puntero.
GFX_HW_HLINE:
Indica que la versión opaca normal de la función hline() está
implementada usando aceleración por hardware. Esto incrementará el
rendimiento, no sólo de hline(), sino también de otras funciones que
la usen internamente, por ejemplo circlefill(), triangle(), y
floodfill().
GFX_HW_HLINE_XOR:
Indica que la versión XOR de la función hline(), y cualquier otra que
la use, estan implementadas usando aceleración por hardware.
GFX_HW_HLINE_SOLID_PATTERN:
Indica que los modos sólidos y con patrones de la función hline(), y
cualquier otra función que la use, estan implementadas usando
aceleración por hardware (lea nota abajo).
GFX_HW_HLINE_COPY_PATTERN:
Indica que el modo copia de patrón de la función hline(), y cualquier
otra función que la use, estan implementadas usando aceleración por
hardware (lea nota abajo).
GFX_HW_FILL:
Indica que la versión opaca de las funciones rectfill(), clear() y
clear_to_color(), están implementadas usando aceleración por hardware.
GFX_HW_FILL_XOR:
Indica que la versión XOR de la función rectfill() está implementada
usando aceleración por hardware.
GFX_HW_FILL_SOLID_PATTERN:
Indica que los modos sólidos y con patrones de la función rectfill()
están implementados usando aceleración por hardware (lea nota abajo).
GFX_HW_FILL_COPY_PATTERN:
Indica que el modo copia de patrón de la función rectill() está
implementado usando aceleración por hardware (lea nota abajo).
GFX_HW_LINE:
Indica que la versión opaca de las funciones line() y vline() está
implementada usando aceleración por hardware.
GFX_HW_LINE_XOR:
Indica que la versión XOR de las funciónes line() y vline() está
implementada usando aceleración por hardware.
GFX_HW_TRIANGLE:
Indica que la versión opaca de la función triangle() está implementada
usando aceleración por hardware.
GFX_HW_TRIANGLE_XOR:
Indica que la versión XOR de la función triangle() está implementada
usando aceleración por hardware.
GFX_HW_TEXTOUT_FIXED:
Indica que la expansión de caracteres monocromos (para fuentes
monoespaciadas de 8x8 y 8x16) está implementada usando aceleración por
hardware.
GFX_HW_VRAM_BLIT:
Indica que hacer un blit desde una parte de la pantalla a otra está
implementado usando aceleración por hardware. Si este biestable está
activado, hacer blits dentro de la memoria de vídeo será ciertamente
el modo más rápido para enseñar una imagen, por lo que sería útil
almacenar parte de sus gráficos más usados en una posición oculta de
la memoria de vídeo.
GFX_HW_VRAM_BLIT_MASKED:
Indica que la rutina masked_blit() es capaz de hacer una copia de una
parte de vídeo a otra usando aceleración por hardware, y que
draw_sprite() usará copia por hardware cuando un sub-bitmap de la
pantalla sea la imagen origen. Si este biestable está activado, el
copiar desde la memoria de vídeo será casi seguramente el modo más
rápido para visualizar una imagen, por lo que podría ser rentable
almacenar algunos de sus sprites más usados en una porción no visible
de la memoria de vídeo.
Aviso: ¡si esta biestable no está activado, masked_blit() y draw_sprite() no funcionarán correctamente cuando los use con la memoria de vídeo como bitmap origen! Sólo puede usar estas funciones para copiar memoria de vídeo si están soportadas por el hardware.
GFX_HW_MEM_BLIT:
Indica que hacer un blit desde un bitmap de memoria a la pantalla usa
aceleración por hardware.
GFX_HW_MEM_BLIT_MASKED:
Indica que masked_blit() y draw_sprite() usan aceleración por hardware
cuando la imagen fuente es un bitmap de memoria, y la imagen destino
es la pantalla física.
Nota: incluso cuando la información diga que el dibujo con patrón está soportado usando aceleración por hardware, no será posible para cualquier tamaño de patrón. El controlador VBE/AF sólo soporta patrones de hasta 8x8 pixels, y usará la versión original no acelerada por hardware de las rutinas de dibujo siempre que use patrones más grandes.
Nota2: estas características de aceleración por hardware sólo surtirán efecto cuando dibuje directamente sobre la pantalla física, o un sub-bitmap de ésta. La aceleración por hardware es útil sobre todo con una configuración de cambio de páginas o triple buffer, y probablemente no habrá diferencia de rendimiento con el sistema "dibuja en un bitmap de memoria, entonces cópialo a la pantalla".
int scroll_screen(int x, int y);
Intenta hacer un scroll de la pantalla para enseñar una parte diferente
de la pantalla virtual (que será posicionada inicialmente en 0, 0,
esquina superior izquierda). Devuelve cero con éxito: podría fallar si el
controlador gráfico no soporta scroll por hardware o si la pantalla
virtual no es suficientemente grande. Esta función esperará un retrazo
vertical si la tarjeta lo requiere, por lo que no necesita llamar vsync()
manualmente. Puede usar esto para mover la pantalla de visualización en
un espacio virtual grande, o para cambiar hacia/desde dos áreas de la
pantalla virtual que no se sobreescriben (intercambio de páginas). Tenga
en cuenta que para dibujar fuera de la posición original en la pantalla,
deberá alterar el área de recorte: mire abajo.
Scroll en modo-X es posible en cualquier tarjeta. Desafortunadamente la mayoría de las implementaciones VESA solo pueden hacer scroll en incrementos de 4 pixels, por lo que hacer un scroll horizontal es imposible en modos SVGA. Esto es una vergüenza, pero no puedo solucionarlo. Un número bien grande de implementaciones VESA tienen fallos cuando hay que hacer scroll en modos truecolor, por lo que le recomiendo no usar esta rutina en resoluciones truecolor a no ser que esté seguro que SciTech Display Doctor esta instalado.
Allegro se ocupará de la sincronización con el retrazo vertical cuando haga un scroll de la pantalla, por lo que no hace falta llamar vsync() antes. Esto significa que scroll_screen() tiene los mismos efectos de retraso que vsync().
int request_scroll(int x, int y);
Esta función es usada con triple buffering. Hace una petición de scroll
por hardware a la posición especificada, pero volverá inmediatamente en
vez de esperar el retrazo. El scroll tendrá lugar después del siguiente
retrazo, pero puede seguir ejecutando su código mientras usa la rutina
poll_scroll() para detectar cuándo ocurre el scroll en realidad (mire
examples/ex20.c). Triple buffering es sólo posible en cierto hardware:
sólo funcionará en modo-X si el simulador de retrazo está activo (pero
esto no funciona bien en win95), y está soportado por los controladores
VBE 3.0 y VBE/AF para un número limitado de tarjetas gráficas de alto
nivel. Puede mirar el bit GFX_CAN_TRIPLE_BUFFER del biestable
gfx_capabilities para ver si funcionará con el controlador actual.
int poll_scroll();
Esta función es usada con triple buffering. Chequea el estado de un
scroll por hardware iniciado previamente por la rutina request_scroll(),
devolviendo no-cero si todavía está esperando a que ocurra, y cero si ya
ha ocurrido.
int show_video_bitmap(BITMAP *bitmap);
Solicita intercambiar la página de pantalla hardware para visualizar el
objeto bitmap de vídeo especificado, que debe tener el mismo tamaño que
la pantalla física, y debe haber sido obtenido usando la función
create_video_bitmap(). Devuelve cero si no hubo problemas. Esta función
esperará un retrazo vertical si su tarjeta de vídeo lo requiere, por lo
que no hace falta que llame vsync() manualmente.
int request_video_bitmap(BITMAP *bitmap);
Esta función se usa con triple buffering. Solicita intercambiar la página
de pantalla al objeto bitmap de vídeo especificado, pero retorna
inmediatamente en vez de esperar el retrazo. El intercambio tendrá lugar
con el siguiente retrazo vertical, pero puede mientras puede seguir
ejecutando su código y usar la rutina poll_scroll() para detectar cuándo
ocurre el intercambio realmente. Triple buffering sólo es posible en
determinado hardware: mire los comentarios de request_scroll().
int request_modex_scroll(int x, int y);
int poll_modex_scroll();
Versiones obsoletas de request_scroll() y poll_scroll(), preservadas para
mantener la compatibilidad con aplicaciones antiguas.
void split_modex_screen(int line);
Esta función sólo está disponible en modo-X. Parte la pantalla VGA en dos
partes en la línea especificada. En la mitad superior puede hacer scroll
hacia cualquier parte de la vram con la función scroll_screen(), pero la
parte inferior quedará fija y enseñará la pantalla desde la posición (0,
0). Después de partir la pantalla, generalmente querrás hacer un scroll de
tal forma que la parte superior empiece más abajo en la memoria de vídeo,
y crear dos sub-bitmas para acceder a las dos secciones (mire
examples/ex19.c, demuestra cómo hacerlo). Para desactivar la pantalla
partida, llame split_modex_screen(0).