06 Modos gr�ficos



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 desencadenado

Los par�metros w y h especifican la resoluci�n gr�fica que quiere. Los modos posibles son:

Los par�metros v_w y v_h especifican el tama�o m�nimo de la pantalla virtual, en caso de que necesite una pantalla virtual grande para hacer scroll por hardware o intercambio de p�ginas. Deber�a ponerlos a cero si no le importa la pantalla virtual. Las pantallas virtuales crean mucha confusi�n, pero en realidad son muy simples. Aviso: ahora viene una explicaci�n condescendiente, por lo que quiz�s quiera saltarse el resto del p�rrafo :-) Imag�nese la memoria de v�deo como una pieza rectangular de papel que es vista a trav�s de un peque�o agujero (su monitor) hecho sobre cart�n. Ya que el papel es m�s grande que el agujero, s�lo puede ver una parte de �l cada vez, pero moviendo el cart�n puede alterar qu� porci�n est� visualizando. Puede dejar el agujero en una posici�n e ignorar el resto de la memoria de v�deo no visible, pero puede conseguir una gran variedad de �tiles efectos desplazando la ventana de visualizaci�n, o dibujando en una parte de la memoria de v�deo no visible, y entonces intercambiar p�ginas para visualizar la nueva pantalla.

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).




Volver al Indice