Section courante

A propos

Section administrative du site

 Langage  Elément  Tutoriel  Annexe 
ABAP/4
Ada
Assembleur
Assembly & bytecode
ASP (Active Server Pages)
Basic
C
C++
C# (C Sharp)
Cobol
ColdFusion
Fortran
HTML
Java
JavaScript
LISP
Logo
LotusScript
Oberon
Pascal
Perl
PHP
PL/1
Prolog
Python
Rebol
REXX
Ruby
Rust
SAS
NoSQL
SQL
Swift
X++ (Axapta)
GNAT
SMALLAda
VHDL
Assembleur 370
Assembleur 1802
Assembleur 4004
Assembleur 6502
Assembleur 6800
Assembleur 68000
Assembleur 8080 et 8085
Assembleur 8089
Assembleur 80x86
Assembleur AGC4
Assembleur ARM
Assembleur DPS 8000
Assembleur i860
Assembleur Itanium
Assembleur MIPS
Assembleur PDP-11
Assembleur PowerPC
Assembleur RISC-V
Assembleur SPARC
Assembleur SuperH
Assembleur UNIVAC I
Assembleur VAX
Assembleur Z80
Assembleur Z8000
Assembleur z/Architecture
ASSEMBLER/MONITOR 64
Micol Assembler
GFA Assembler
A86
MASM (Macro Assembler)
TASM (Turbo Assembler)
CIL
Jasmin
LLVM
MSIL
Parrot
P-Code (PCode)
SWEET16
G-Pascal
ASP 1.0
ASP 2.0
ASP 3.0
ASP.NET
ASP.NET Core
ABasiC (Amiga)
Adam SmartBASIC
Altair BASIC
AmigaBASIC (Amiga)
AMOS Basic (Amiga)
Atari Basic (Atari 400, 600 XL, 800, 800XL)
Basic Apple II (Integer BASIC/APPLESOFT)
Basic Commodore 64 (CBM-BASIC)
Basic Commodore 128 (BASIC 7.0)
Basic Commodore VIC-20 (CBM-BASIC 2.0)
Basic Coco 1 (Color Basic)
Basic Coco 2 (Extended Color Basic)
Basic Coco 3 (Extended Color Basic 2.0)
BASICA (PC DOS)
Basic Pro
BBC BASIC
Blitz BASIC (Amiga)
DarkBASIC
Dartmouth BASIC
GFA-Basic (Atari ST/Amiga)
GWBASIC (MS-DOS)
Liberty BASIC
Locomotive BASIC (Amstrad CPC)
MSX-Basic
Omikron Basic (Atari ST)
Oric Extended Basic
Power Basic
Quick Basic/QBasic (MS-DOS)
Sinclair BASIC (ZX80, ZX81, ZX Spectrum)
ST BASIC (Atari ST)
Turbo Basic
Vintage BASIC
VBScript
Visual Basic (VB)
Visual Basic .NET (VB .NET)
Visual Basic pour DOS
Yabasic
BeckerBASIC
SIMONS' BASIC
Basic09 d'OS-9
Disk Extended Color Basic
Basic09 d'OS-9
Disk Extended Color Basic
Access
Excel
Visual Basic pour Windows
Visual Basic .NET pour Windows
C Shell Unix (csh)
C pour Amiga
C pour Atari ST
C pour DOS
C pour Falcon030
C pour GEMDOS (Atari ST)
C pour Linux
C pour PowerTV OS
C pour OS/2
C pour Unix
C pour Windows
Aztec C
CoCo-C
GNU C
HiSoft C
IBM C/2
Introl-C
Lattice C
Microsoft C
MinGW C
MSX-C
Open Watcom C
OS-9 C Compiler
Pure C
Quick C
Turbo C
HiSoft C for Atari ST
HiSoft C for CP/M (Amstrad CPC)
C++ pour OS/2
C++ pour Windows
Borland C++
C++Builder
IBM VisualAge C++
Intel C++
MinGW C++
Open Watcom C++
Symantec C++
Turbo C++
Visual C++
Visual C++ .NET
Watcom C++
Zortech C++
C# (C Sharp) pour Windows
Apple III Cobol
Microsoft Cobol
BlueDragon
Lucee
OpenBD
Railo
Smith Project
Microsoft Fortran
WATFOR-77
CSS
FBML
Open Graph
SVG
XML
XSL/XSLT
LESS
SASS
GCJ (GNU)
JSP
Jython
Visual J++
Node.js
TypeScript
AutoLISP
ACSLogo
LotusScript pour Windows
Amiga Oberon
Oberon .NET
Apple Pascal
Delphi/Kylix/Lazarus
Free Pascal
GNU Pascal
HighSpeed Pascal
IBM Personal Computer Pascal
Lisa Pascal
Maxon Pascal
MPW Pascal
OS-9 Pascal
OSS Personal Pascal
Pascal-86
Pascal du Cray Research
Pascal/VS
Pascal-XT
PURE Pascal
QuickPascal
RemObjets Chrome
Sun Pascal
THINK Pascal
Tiny Pascal (TRS-80)
Turbo Pascal
UCSD Pascal
VAX Pascal
Virtual Pascal
Turbo Pascal for CP/M-80
Turbo Pascal for DOS
Turbo Pascal for Macintosh
Turbo Pascal for Windows
CodeIgniter (Cadre d'application)
Drupal (Projet)
Joomla! (Projet)
Phalanger (PHP .NET)
phpBB (Projet)
Smarty (balise)
Twig (balise)
Symfony (Cadre d'application)
WordPress (Projet)
Zend (Cadre d'application)
PL360
PL/M-80
PL/M-86
Turbo Prolog
CPython
IronPython
Jython
PyPy
AREXX
Regina REXX
JMP
Btrieve
Cassandra
Clipper
CouchDB
dBASE
Hbase
Hypertable
MongoDB
Redis
Access
BigQuery
DB2
H2
Interbase
MySQL
Oracle
PostgreSQL
SAP HANA
SQL Server
Sybase
U-SQL
Introduction
Les premiers pas
Norme
Standard
Loi

Les premiers pas

La bibliothèque XLIB réclame comme configuration minimale, un microprocesseur 80286, une carte vidéo VGA et Borland/Turbo Pascal v6.0/7.0.

Caractéristiques générales

Création des bibliothèques

Pour compiler XLIB, chargez-le simplement dans l'IDE et appuyez sur la touche F9. Si vous préférez le compilateur en ligne de commande, exécutez la commande :

TPC xlib

Utiliser la bibliothèque avec vos programmes

L'utilisation de la bibliothèque XLIB dans vos programmes est simple. Il suffit d'inclure l'unité XLIB dans l'instruction USES au début de votre programme, ce qui rendra toutes les procédures et fonctions de composante de la bibliothèque XLIB disponibles :

  1. Uses XLIB;

Constantes et variables globales

Les résolutions disponibles en mode X de la bibliothèque XLIB sont :

  1. Const
  2.  XMODE320x200 = 0;
  3.  XMODE320x240 = 1;
  4.  XMODE360x200 = 2;
  5.  XMODE360x240 = 3;
  6.  XMODE360x282 = 4;
  7.  XMODE320x400 = 5;
  8.  XMODE320x480 = 6;
  9.  XMODE360x400 = 7;
  10.  XMODE360x480 = 8;
  11.  XMODE360x360 = 9;
  12.  XMODE376x308 = 10;
  13.  XMODE376x564 = 11;

Sens de rotation de la palette :

  1. Const
  2.  RBackward = 0;
  3.  RForward  = 1;

Les constantes d'erreur :

  1. Const
  2.  XModeInvalid = -1;
  3.  Error        = 1;
  4.  OK           = 0;

Les variables globales de l'unité XLIB sont :

Variable/Type de données Description
InGraphics:Byte Drapeau indiquant que le système graphique xlib est actif. Défini par la fonction «xsetmode».
CurrXMode:Word Si le système graphique xlib est actif, contient l'identifiant du mode x. Défini par la fonction "xsetmode". Voir aussi les constantes (par exemple XMODE320x200...).
ScrnPhysicalByteWidth:Word Largeur physique de l'écran en octets. Définie par la fonction «xsetmode».
ScrnPhysicalPixelWidth:Word Largeur physique de l'écran en pixels. Définie par la fonction «xsetmode»
ScrnPhysicalHeight:Word Hauteur physique de l'écran en pixels. Définie par la fonction «xsetmode».
ErrorValue:Word Contient une valeur d'erreur. Variable à usage général pour communiquer l'état d'erreur de plusieurs fonctions. La valeur de cette variable n'est généralement valide que pour la dernière fonction appelée qui la définit.
SplitScrnOffs:Word Décalage dans la mémoire vidéo de l'écran partagé. Défini par la fonction «xsetsplitscrn». La valeur n'est valide que si un écran partagé est actif. Voir également la variable globale «SplitScrnActive».
SplitScrnScanLine:Word Ligne de balayage d'écran à laquelle l'écran partagé commence initialement lorsqu'elle est définie par la fonction «xsetsplitscrn». La valeur n'est valide que si un écran partagé est actif. Voir également la variable globale «SplitScrnActive». Cette variable n'est pas mise à jour par «xhidesplitscrn», «xadjustsplitscrn».
SplitScrnVisibleHeight:word Le nombre de lignes de l'écran partagé initial étant actuellement affichées. Modifié par «xhidesplitscrn», «xadjustsplitscrn» et «xshowsplitscrn».
Page0Offs:Word Déplacement dans la mémoire vidéo de l'écran virtuel principal. Initialement défini par la fonction «xsetmode», mais mis à jour par les fonctions «xsetsplitscrn» et «xsetdoublebuffer».
Page1Offs:Word Déplacement dans la mémoire vidéo du deuxième écran virtuel. Défini par et n'est valide qu'après un appel à «xsetdoublebuffer».
ScrnLogicalByteWidth:Word Largeur de l'écran virtuel en octets. Définie par la fonction «xsetmode».
ScrnLogicalPixelWidth:Word Largeur de l'écran virtuel en pixels. Définie par la fonction «xsetmode».
ScrnLogicalHeight:Word Hauteur de l'écran virtuel en pixels. Définie initialement par la fonction «xsetmode», mais mise à jour par les fonctions «xsetsplitscrn» et «xsetdoublebuffer».
MaxScrollX:Word Position maximale de X pixels de l'écran physique dans l'écran virtuel. Défini par la fonction «xsetmode».
MaxScrollY:Word Position Y maximale de l'écran physique dans l'écran virtuel. Définie initialement par la fonction «xsetmode», mais mise à jour par les fonctions «xsetsplitscrn» et «xsetdoublebuffer».
DoubleBufferActive:Word Indique si la double mise en mémoire tampon est activée. Défini par la fonction «xsetdoublebuffer».
VisiblePageIdx:Word Numéro d'index de la page actuellement visible. Initialement défini par la fonction «xsetdoublebuffer» mais mis à jour par «xpageflip». Cette variable n'est utilisée que lorsque la double mise en mémoire tampon est activée.
HiddenPageOffs:Word Déplacement de la page cachée. Initialement défini par la fonction «xsetdoublebuffer» mais mis à jour par «xpageflip». Cette variable n'est utilisée que lorsque la double mise en mémoire tampon est activée.
VisiblePageOffs:Word Déplacement de la page visible. Initialement défini par la fonction «xsetdoublebuffer» mais mis à jour par «xpageflip». Cette variable n'est utilisée que lorsque la double mise en mémoire tampon est activée.
NonVisualOffs:Word Déplacement du premier octet de la RAM non visuelle, la RAM disponible pour l'entreposage de bitmaps,... Défini initialement par la fonction «xsetmode» mais mis à jour par les fonctions «xsetsplitscrn» et «xsetdoublebuffer».
TopClip, BottomClip,
LeftClip, RightClip:Word
Définissez le rectangle de découpage pour les fonctions de découpage de bitmaps linéaires et vidéo. Définissez-le manuellement ou par «xsetcliprect». Remarque : les coordonnées X sont en octets car toutes les fonctions de découpage découpent selon les limites d'octets.
PhysicalStartPixelX:Word Déplacement X pixels de l'écran physique (visible) par rapport au coin supérieur gauche (0,0) de l'écran virtuel.
PhysicalStartByteX:Word Déplacement de X octets de l'écran physique (visible) par rapport au coin supérieur gauche (0,0) de l'écran virtuel.
PhysicalStartY:Word Déplacement des pixels Y de l'écran physique (visible) par rapport au coin supérieur gauche (0,0) de l'écran virtuel.

Procédures et fonctions exportées

xsetmode

Function XSetMode(mode,WidthInPixels:Word):Word;

La définition des paramètres :

Paramètre Description
mode Le mode requis tel que défini par l'ensemble des «résolutions disponibles en mode X» définies dans le fichier d'entête xlib.h.
WidthInPixels La largeur d'écran virtuelle requise.

La valeur de retour :

Cette fonction initialise le système graphique, définit la résolution d'écran appropriée et alloue un écran virtuel. L'écran virtuel alloué peut ne pas nécessairement avoir la même taille que celle spécifiée dans le paramètre «WidthInPixels» car il est arrondi au multiple inférieur de 4 le plus proche.

La fonction renvoie la largeur réelle de l'écran virtuel alloué en pixels si un mode valide a été sélectionné, sinon renvoie XMODEINVALID.

Enregistre la largeur en pixels de l'écran virtuel dans «ScrnLogicalPixelWidth». Enregistre la largeur en octets de l'écran virtuel dans «ScrnLogicalByteWidth». Les dimensions physiques de l'écran sont définies dans «ScrnPhysicalPixelWidth». «ScrnPhysicalByteWidth» et «ScrnPhysicalHeight». Les autres variables globales définies sont «CurrXMode», «MaxScrollX», «MaxScrollY», «InGraphics». La variable «SplitScrnScanline» est également initialisée à zéro.

Voir aussi :

xselectdefaultplane

Procedure XSelectDefaultPlane(plane:Byte);

Active l'accès en lecture/écriture par défaut à un plan spécifié.

xsetsplitscreen

Procedure XSetSplitScreen(line:Word);

La définition des paramètres :

Paramètre Description
line La ligne de balayage de départ de l'écran partagé requis.

Cette fonction active l'écran partagé en mode X et définit la ligne de balayage de départ. L'écran partagé réside dans la moitié inférieure de l'écran et possède une adresse de départ de A000:0000 dans la RAM vidéo.

Elle met également à jour Page0Offs pour refléter l'existence de la région d'écran partagé, c'est-à-dire que «MainScrnOffset» est défini sur le déplacement du premier pixel au-delà de la région d'écran partagé. Les autres variables définies sont «Page1Offs» étant défini sur la même valeur que «Page0Offs» (voir la séquence d'appel graphique ci-dessous), «ScrnLogicalHeight», «ScrnPhysicalHeight», «SplitScrnScanLine» et «MaxScrollY».

Cette fonction ne peut pas être appelée après l'activation de la double mise en mémoire tampon, elle renverra une erreur. Pour configurer votre environnement graphique, la séquence d'appels graphiques est la suivante, bien que l'une ou les deux étapes b et c puissent être omises :

Ainsi, lorsque vous appelez cette fonction avec succès, la double mise en mémoire tampon n'est pas active, donc «Page1Offs» est défini sur la même adresse que «Page0Offs».

AVERTISSEMENT : si vous utilisez l'un des modes haute résolution (376 x 564 comme exemple extrême), vous risquez de ne pas avoir suffisamment de mémoire vidéo pour les options d'écran partagé et de double mise en mémoire tampon, car la mémoire vidéo VGA est limitée à 64 Ko.

Voir aussi :

xsetdoublebuffer

Function xsetdoublebuffer(PageHeight:Word):Word;

La définition des paramètres :

Paramètre Description
PageHeight La hauteur des deux écrans virtuels à double tampon.

La valeur de retour :

Cette fonction configure deux pages virtuelles à double tampon. La valeur «ErrorValue» est définie en fonction du succès ou de l'échec de cette commande.

Les autres variables définies sont :

Variable Description
Page1Offs Déplacement de la deuxième page virtuelle
NonVisualOffs Déplacement du premier octet de la RAM vidéo non visible
DoubleBufferActive Drapeau d'activation de double tampon
PageAddrTable Tableau des déplacement de début des pages de double mise en mémoire tampon
ScrnLogicalHeight Hauteur logique des pages à double tampon.
MaxScrollY Adresse de démarrage verticale maximale de l'écran physique dans l'écran virtuel

AVERTISSEMENT : si vous utilisez l'un des modes haute résolution (376 x 564 pixels comme exemple extrême), vous risquez de ne pas disposer de suffisamment de RAM vidéo pour les options d'écran partagé et de double mise en mémoire tampon, car la RAM vidéo VGA est limitée à 64 Ko.

Voir aussi :

xhidesplitscreen

Procedure XHideSplitScreen;

Cette fonction masque un écran partagé existant en définissant sa ligne de balayage de départ sur la dernière ligne de balayage de l'écran physique. "ScreenPhysicalHeight" est ajusté mais "SplitScreenScanLine" n'est pas modifié car il est nécessaire pour restaurer l'écran partagé à un stade ultérieur.

AVERTISSEMENT : À utiliser uniquement si SplitScrnLine a été précédemment appelé Disabled pour le mode 5 à 11 (320x400 à 376x564). La mémoire pour l'écran partagé initial est réservée et les limitations de taille de ces modes signifient que tout changement dans la ligne de balayage de l'écran partagé empiètera sur la mémoire vive de l'écran partagé. Mise à jour : désormais désactivé pour ces modes.

Voir aussi :

xshowsplitscreen

Procedure XShowSplitScreen;

Restaure la ligne de balayage de départ de l'écran partagé à la ligne de balayage de départ de l'écran partagé initiale définie par «SplitScrnScanLine». «ScreenPhysicalHeight» est ajusté.

AVERTISSEMENT : À utiliser uniquement si SplitScrnLine a été précédemment appelé Disabled (désactivé) pour le mode 4 à 10 (320x400 à 376x564 pixels). La mémoire pour l'écran partagé initial est réservée et les limitations de taille de ces modes signifient que tout changement dans la ligne de balayage de l'écran partagé empiètera sur la mémoire vive de l'écran partagé.

XAdjustSplitScreen

Procedure XAdjustSplitScreen(line:Word);

La définition des paramètres :

Paramètre Description
line La ligne de balayage à laquelle l'écran partagé doit démarrer.

Définit la ligne de balayage de départ de l'écran partagé sur une nouvelle ligne de balayage. Les lignes de balayage valides se situent entre la ligne de balayage de départ de l'écran partagé initial et la dernière ligne de balayage de l'écran physique. "ScreenPhysicalHeight" est également ajusté.

AVERTISSEMENT : À utiliser uniquement si SplitScrnLine a été précédemment appelé Disabled pour le mode 4 à 10 (320x400 à 376x564 pixels). La mémoire pour l'écran partagé initial est réservée et les limitations de taille de ces modes signifient que tout changement dans la ligne de balayage de l'écran partagé empiètera sur la RAM de l'écran partagé.

XSetStartAddr

Procedure XSetStartAddr(X,Y:Word);

La définition des paramètres :

Paramètre Description
X,Y Coordonnées du coin supérieur gauche de l'écran physique dans l'écran virtuel actuel.

Définissez l'adresse de démarrage physique de l'écran non partagé en mode X dans la page virtuelle actuelle.

X ne doit pas dépasser (largeur logique de l'écran - largeur physique de l'écran), c'est-à-dire «MaxScrollX» et Y ne doit pas dépasser (hauteur logique de l'écran - hauteur physique de l'écran), c'est-à-dire «MaxScrollY»

XPageFlip

Procedure XPageFlip(X,Y:Word);

La définition des paramètres :

Paramètre Description
X,Y Coordonnées du coin supérieur gauche de l'écran physique dans l'écran virtuel caché si la double mise en mémoire tampon est active, ou l'écran virtuel actuel dans le cas contraire.

Définit l'adresse de démarrage de l'écran physique dans la page virtuelle actuellement masquée, puis retourne les pages. Si la double mise en mémoire tampon n'est pas active, cette fonction est fonctionnellement équivalente à «xsetstartaddr».

X ne doit pas dépasser (largeur logique de l'écran - largeur physique de l'écran), c'est-à-dire «MaxScrollX» et Y ne doit pas dépasser (hauteur logique de l'écran - hauteur physique de l'écran), c'est-à-dire «MaxScrollY».

xtextmode

Procedure xtextmode;

Désactive le mode graphique.

xsetcliprect

Procedure xsetcliprect(left, top, right, bottom:Word);

Définit le rectangle de découpage pour les versions de découpage des bitmaps planaires et vidéo.

Remarque : les bitmaps compilées ne peuvent pas être découpées.

xputpix

Procedure xputpix(X,Y,PageOffset,Color:Word);

Dessine un point de couleur spécifiée aux coordonnées X, Y dans la page virtuelle commençant au déplacement PageOffset.

xgetpix

Function xgetpix(X,Y,PageBase:Word):Word;

Lire un point de coordonnées X, Y dans la page virtuelle commençant au déplacement PageOffset.

xrectpattern

Procedure xrectpattern(StartX,StartY,EndX,EndY,PageBase:Word;Var Pattern);

La définition des paramètres :

Paramètre Description
StartX,StartY Coordonnées du coin supérieur gauche du rectangle
EndX,EndY Coordonnées du coin inférieur droit du rectangle
PageBase Déplacement de l'écran virtuel
*Pattern Pointeur vers le modèle défini par l'utilisateur (16 octets)

Routine de remplissage de motif rectangle 4x4 en mode X.

Le coin supérieur gauche du motif est toujours aligné sur une ligne et une colonne multiples de 4. Fonctionne sur tous les VGA. Utilise l'approche consistant à copier le motif dans la mémoire d'affichage hors écran, puis à charger les verrous avec le motif pour chaque ligne de balayage et à remplir chaque ligne de balayage quatre pixels à la fois. Remplit jusqu'à la colonne à EndX et la ligne à EndY, mais sans les inclure. Aucun découpage n'est effectué.

Cette procédure est basé sur le code publié à l'origine dans DDJ Mag par M. Abrash.

Avertissement : les emplacements de mémoire VGA PATTERNBUFFER (A000:FFFc) à A000:FFFF sont réservés au tampon de motifs.

Voir également :

xrectpatternclipped

Comme ci-dessus mais coupé.

xcpvidrect

Procedure xcpvidrect(SourceStartX, SourceStartY, SourceEndX, SourceEndY, DestStartX, DestStartY, SourcePageBase, DestPageBase, SourceBitmapWidth, DestBitmapWidth:Word);

La définition des paramètres :

Paramètre Description
StartX,StartY Coordonnées du coin supérieur gauche du rectangle source.
EndX,EndY Coordonnées du coin inférieur droit du rectangle source.
DestStartX,DestStartY Coordonnées de la destination du rectangle
SourcePageBase Déplacement de page du rectangle source
DestPageBase Déplacement de page des rectangles de destination
SourceBitmapWidth Largeur du bitmap dans l'écran virtuel source contenant le rectangle source.
DestBitmapWidth Largeur du bitmap dans l'écran virtuel de destination contenant le rectangle de destination.

Mémoire d'affichage en mode X pour afficher la routine de copie de mémoire. Le bord gauche du rectangle source modulo 4 doit être égal au bord gauche du rectangle de destination modulo 4. Fonctionne sur tous les cartes vidéo VGA. Utilise l'approche consistant à lire 4 pixels à la fois de la source dans les verrous, puis à écrire les verrous vers la destination. Copie jusqu'à la colonne à SrcEndX et à la ligne à SrcEndY, mais sans les inclure. Aucun découpage n'est effectué. Les résultats ne sont pas garantis si la source et la destination se chevauchent.

Basé sur le code initialement publié dans DDJ Mag par M. Abrash

Voir également :

xshiftrect

Procedure xshiftrect(SrcLeft, SrcTop, SrcRight, SrcBottom, DestLeft, DestTop, ScreenOffs:Word);

La définition des paramètres :

Paramètre Description
SrcLeft, SrcTop Coordonnées du coin supérieur gauche du rectangle
SrcRight, SrcBottom Coordonnées du coin inférieur droit du rectangle
DestLeft, DestTop Coordonnées du coin supérieur gauche de la destination
ScreenOffs Déplacement de l'écran virtuel

Cette fonction copie un rectangle de VRAM sur une autre zone de VRAM, même si la destination chevauche la source. Elle est conçue pour faire défiler du texte de haut en bas et pour déplacer de grandes zones d'écran dans des systèmes de mosaïque. Elle arrondit toutes les coordonnées horizontales à l'octet le plus proche (morceau de 4 colonnes) pour des raisons de vitesse. Cela signifie qu'elle ne peut pas effectuer de défilement horizontal fluide. Pour cela, faites défiler l'écran entier (moins l'écran partagé) ou copiez des zones plus petites dans la mémoire système à l'aide des fonctions du module XPBITMAP.

SrcRight est arrondi vers le haut et les bords gauches sont arrondis vers le bas, pour garantir que les pixels pointés par les paramètres se trouvent à l'intérieur du rectangle. Autrement dit, SrcRight est traité comme (SrcRight+3) >> 2 et SrcLeft comme SrcLeft >> 2.

La largeur du rectangle en octets (largeur en pixels / 4) ne peut pas dépasser 255.

Fonctions de palette pour les modes de couleurs VGA 256

Toutes les fonctions de ce module fonctionnent sur deux variantes du tampon de palette, les tampons bruts et annotés.

Toutes les fonctions se terminant par «raw» fonctionnent sur la structure de palette suivante :

  1. r0,g0,b0,r1,g1,b1,...rn,gn,bn:Byte;

La structure ne contient aucune référence à l'index de couleur de départ ou au nombre de couleurs entreposées.

Toutes les fonctions se terminant par «struc» fonctionnent sur la structure de palette suivante :

  1. c, n, r0,g0,b0,r1,g1,b1,...rn,gn,bn:Byte;

c est la couleur de départ et n le nombre de couleurs entreposées.

ATTENTION : Il n'y a pas de contrôle de validité dans ces fonctions. Il incombe à l'utilisateur de fournir des paramètres valides aux fonctions.

xgetpalraw

Procedure xgetpalraw(Var pal;numcolrs, startindex:Word);

Lire la palette DAC dans le tampon brut avec les interruptions désactivées.

AVERTISSEMENT : la mémoire des tampons de palette doit être entièrement pré-allouée.

xgetpalstruc

Procedure xgetpalstruc(Var pal, numcolrs, startindex:Word);

Lire la palette DAC dans un tampon de type annoté avec les interruptions désactivées.

AVERTISSEMENT : la mémoire des tampons de palette doit être entièrement pré-allouée.

xputpalraw

Procedure xputpalraw(Var pal; numcolrs, startindex:Word);

Écrire la palette DAC à partir du tampon brut avec les interruptions désactivées.

xputpalstruc

Procedure xputpalstruc(Var pal);

Écrire une palette DAC à partir d'un tampon de type annoté avec les interruptions désactivées.

xsetrgb

Procedure xsetrgb(color, redc, greenc, bluec:Byte);

Définir les composantes RVB d'une couleur VGA.

xrotpalstruc

Procedure xrotpalstruc(Var pal; direction:Word);

Faire pivoter les entrées du tampon de palette annoté.

Direction 0 = vers l'arrière, 1 = vers l'avant.

xrotpalraw

Procedure xrotpalraw(Var pal; direction, numcolrs:Word);

Faire pivoter un tampon de palette brute. Direction 0 = vers l'arrière, 1 = vers l'avant.

xputcontrastpalstruc

Procedure xputcontrastpalstruc(Var pal; intensity:Byte);

Écrire une palette DAC à partir d'un tampon de type annoté avec un réglage d'intensité spécifié (c'est-à-dire que les entrées de palette sont décrémentées lorsque cela est possible par unités «d'intensité»).

Conçu pour faire apparaître ou disparaître une palette sans utiliser de tampon de palette de travail intermédiaire ! (Lent mais efficace en mémoire... Il est correcte pour les petites structures pal).

xtransposepalstruc

Procedure xtransposepalstruc(Var pal; StartColor:Word);

Écrire une palette DAC à partir d'un tampon de type annoté avec les interruptions désactivées à partir d'un nouvel index de palette.

xcpcontrastpalstruc

Function xcpcontrastpalstruc(Var srcpal, destpal; Intensity:Byte);

Copiez un tampon de palette annoté vers un autre pour effectuer le réglage de l'intensité. Utilisé pour un fondu entrant et sortant rapide et fluide.

xline

Procedure xline(x0, y0, x1, y1, color, PageBase:Word);

Tracez une ligne avec les points d'extrémité spécifiés dans la page en commençant par le déplacement «PageBase».

Aucun découpage n'est effectué.

Les polices de caractères

  1. Const
  2.  FONT8x8  = 0;
  3.  FONT8x15 = 1;
  4.  FONTUSER = 2;

Variables exportées

Remarque : toutes les variables sont en lecture seulement. Si vous les modifiez, les résultats peuvent être imprévisibles.

Variable/Type de données Description
CharHeight:Byte Hauteur de l'ensemble de caractères intégré actuel.
CharWidth:Byte Largeur de l'ensemble de caractères intégré actuel.
FirstChar:Byte Premier caractère de l'ensemble de caractères intégré actuel.
UserCharHeight:Byte Hauteur de l'ensemble de caractères utilisateur actuel.
UserCharWidth:Byte Largeur de l'ensemble de caractères utilisateur actuel.
UserFirstCh:Byte Premier caractère de l'ensemble de caractères de l'utilisateur actuel.

xtextinit

Procedure xtextinit;

Initialise le pilote de texte Mode X et définit la police de caractères par défaut (VGA ROM 8x8).

xsetfont

Procedure xsetfont(FontId:Word);

Sélectionnez la police de travail où :

Valeur Description
0 VGA ROM 8x8
1 VGA ROM 8x14
2 Police de caractères bitmap définie par l'utilisateur.

AVERTISSEMENT : une police de caractères utilisateur doit être enregistrée avant de définir FontID = 2.

Voir également :

xregisteruserfont

Procedure xregisteruserfont(Var UserFontPtr);

Enregistrez une police de caractères utilisateur pour une sélection ultérieure. Une seule police utilisateur peut être enregistrée à un moment donné. L'enregistrement d'une police de caractères utilisateur annule l'enregistrement de la police de caractères utilisateur précédente. Les polices utilisateur ne peuvent pas dépasser 8 pixels de large.

Structure de police de caractères utilisateur

Déplacement Type de données Description
0 Word Code ASCII du premier caractère de la police de caractères
2 Byte Hauteur des caractères dans la police de caractères
3 Byte Largeur des caractères dans la police de caractères
4 n*h*Byte Les données de police de caractères où n = nombre de caractères et h = hauteur des caractères

AVERTISSEMENT : Il incombe au programme de s'assurer que tous les caractères dessinés pendant que cette police est active se trouvent dans l'intervalle de caractères définie.

xputchar

Function xputchar(ch:Char; X, Y, PgOffs, Color:Word):Word;

Dessinez un caractère de texte à l'emplacement spécifié avec la couleur spécifiée.

La définition des paramètres :

Paramètre Description
ch Caractère à dessiner
x,y Coordonnées de l'écran sur lesquelles dessiner ch
ScrnOffs Déplacement de départ de la page sur laquelle dessiner
Color Couleur du texte

Renvoie la largeur du caractère.

ATTENTION : InitText doit être appelé avant d'utiliser cette fonction.

xprintf

Procedure xprintf(x, y, ScrnOffs, color:Word; s:String);

La définition des paramètres :

Paramètre Description
x,y Coordonnées de l'écran sur lesquelles dessiner ch
ScrnOffs Déplacement de départ de la page sur laquelle dessiner
Color Couleur du texte
s Texte à afficher

xbgprintf

Procedure xbgprintf(x, y, ScrnOffs, fgcolor, bgcolor:Word; s:String);

La définition des paramètres :

Paramètre Description
x,y Coordonnées de l'écran sur lesquelles dessiner ch
ScrnOffs Déplacement de départ de la page sur laquelle dessiner
fgcolor Couleur du premier plan du texte
bgcolor Couleur de l'arrière-plan du texte
s Chaîne à afficher

xgetcharwidth

Function xgetcharwidth(ch:Char):Word;

La définition des paramètres :

Paramètre Description
ch Caractère pour obtenir la largeur de

Plans Bitmaps

Les bitmaps planaires utilisés par ces fonctions ont la structure suivante :

Type de données Déplacement Description
Byte 0 La largeur du Bitmap en octets (groupes de 4 pixels) est comprise entre 1 et 255
Byte 1 La hauteur du bitmap dans la plage de lignes est comprise entre 1 et 255
Byte 2..n1 Le plan 0 pixels largeur*hauteur octets
Byte n1..n2 Le plan 1 pixels largeur * hauteur octets
Byte n2..n3 Le plan 2 pixels largeur*hauteur octets
Byte n3..n4 Le plan 3 pixels largeur*hauteur octets

Ces fonctions fournissent les transferts de bitmap les plus rapides possibles de la mémoire système à la vidéo et, de plus, le bitmap unique est applicable à tous les alignements de pixels. Les fonctions masquées n'ont pas besoin de masques séparés puisque tous les pixels non nuls sont considérés comme des pixels de masquage. Par conséquent, si un pixel est égal à 0, le pixel de destination de l'écran correspondant reste inchangé.

xputmaskedpbm

Procedure xputmaskedpbm(X, Y, ScrnOffs:Word;Var Bitmap);

Le masque écrit une image bitmap planaire de la RAM système vers la RAM vidéo. Tous les octets de l'image bitmap source zéro indiquent l'octet de destination à laisser inchangé.

Structure de l'image bitmap source :

Width, Height:byte,

Données de l'image bitmap (plan 0)... Données de l'image bitmap (plan 1)..., Données de l'image bitmap (plan 2)..., Données de l'image bitmap (plan 3)...

Remarque : la largeur est en octets, c'est-à-dire beaucoup de 4 pixels.

Limitations : Aucun découpage n'est pris en charge. Prend uniquement en charge les bitmaps dont la largeur est un multiple de 4 pixels.

Voir Outils Bitmap pour les fonctions de conversion bitmap linéaire <-> planaire.

xputpbm

Procedure xputpbm(X,Y,ScrnOffs:Word;Var Bitmap);

Écrire une image de plan de bitmap de la RAM système vers la RAM vidéo.

Structure de l'image bitmap source :

Width:byte, Height:byte,

Données bitmap (plan 0)... Données bitmap (plan 1)..., Données bitmap (plan 2)..., Données bitmap (plan 3)...

Remarque : la largeur est en octets, c'est-à-dire beaucoup de 4 pixels.

Limitations : Aucun découpage n'est pris en charge. Prend uniquement en charge les images bitmap dont la largeur est un multiple de 4 pixels.

Voir Outils Bitmap pour les fonctions de conversion bitmap linéaire <-> planaire.

xgetpbm

Procedure xgetpbm(X,Y:Word; Bw, Bh:Byte; ScrnOffs:Word;Var Bitmap);

Lire une image bitmap planaire dans la RAM système à partir de la RAM vidéo.

Structure de l'image bitmap source :

Width:byte, Height:byte, Données bitmap (plan 0)... Données bitmap (plan 1)..., Données bitmap (plan 2)..., Données bitmap (plan 3)...

Remarque : la largeur est en octets, c'est-à-dire beaucoup de 4 pixels.

Limitations : Aucun découpage n'est pris en charge. Prend uniquement en charge les images bitmap dont la largeur est un multiple de 4 pixels.

Plans Bitmaps décapés

Il existe trois variantes des procédures précédentes identifiées par les trois extensions de nom de fonction : clipx, clipy, clipxy. Étant donné que la vitesse est essentielle dans la programmation de jeux, vous ne souhaitez pas vérifier le découpage si ce n'est pas nécessaire. Ainsi, pour les sprites se déplaçant uniquement horizontalement, vous utiliserez la version clipx de la fonction put, pour les sprites se déplaçant verticalement, vous utiliserez la version clipy et pour les sprites se déplaçant dans les deux sens, vous utiliserez la version clipxy. Gardez également à l'esprit que les composantes de découpage de ces fonctions supposent que le rectangle de découpage est égal ou supérieur à la taille de la bitmap, c'est-à-dire que si une bitmap est découpée en haut, il est supposé que le bas de la bitmap n'est pas également découpé. De même pour le découpage horizontal.

Remarque : les performances par ordre décroissant sont les suivantes : clipy, clipx, clipxy, les placements masqués étant plus lents que les placements non masqués.

Le découpage horizontal est effectué sur les limites d'octets (4 pixels) plutôt que sur les pixels. Cela permet l'implémentation la plus rapide des fonctions. Ce n'est pas un tel handicap car, d'une part, la largeur de votre écran est un multiple de 4 pixels et, dans la plupart des cas, ce sont les bords de l'écran formant le rectangle de découpage.

Voici un exemple de définition d'un rectangle de découpage sur les bords logiques de l'écran :

  1. xsetcliprect(0,0,ScrnLogicalByteWidth,ScrnLogicalHeight);

xputpbmclipx

Procedure XPutPBMClipX(X, Y, ScrnOffs:Word; Var Bitmap);

xputpbmclipy

Procedure XPutPBMClipY(X, Y, ScrnOffs:Word; Var Bitmap);

xputpbmclipxy

Procedure XPutPBMClipXY(X, Y,ScrnOffs:Word; Var Bitmap);

xputmaskedpbmclipx

Procedure XPutMaskedPBMClipX(X, Y, ScrnOffs:Word;Var Bitmap);

xputmaskedpbmclipy

Procedure XPutMaskedPBMClipY(X, Y, ScrnOffs:Word;Var Bitmap);

xputmaskedpbmclipxy

Procedure XPutMaskedPBMClipXY(X,Y,ScrnOffs:Word; Var Bitmap);

Pour une description détaillée des paramètres,..., voir les procédures Plaire Bitmap équivalentes.

Bitmaps compilés

L'entretien et l'alimentation des blits masqués compilés par Matthew MacKenzie.

Les procédures sont dédiées aux bitmaps compilés :

Xcompilebitmap analyse une image bitmap source et génère des instructions 8086 pour tracer chaque pixel différent de zéro. Il est conçu pour être utilisé avant le début de l'action plutôt qu'à la volée. L'image bitmap compilée ne contient aucune branche et aucune référence aux pixels zéro (transparents). Lorsque deux pixels sont séparés par exactement quatre colonnes, ils sont tracés avec un seul magasin de 16 bits et le registre MAPMASK de VGA sera défini au plus quatre fois. En conséquence, votre image bitmap peut s'exécuter plusieurs fois plus rapidement qu'une routine blit masquée traditionnelle de la mémoire vers VGA.

Il n'existe aucun moyen d'effectuer un découpage sur ces images bitmap ou de tracer un pixel de couleur zéro.

Xcompilebitmap fonctionne avec des images bitmap au format bitmap planaire Xlib standard. Sur une échelle de temps de 60 images par seconde, il est en fait relativement lent. Comme une image bitmap compilée est déplaçable, vous pouvez simplement la sauvegarder sur le disque et ne pas inclure l'image bitmap source dans votre programme.

Le format bitmap source est un tableau d'octets, un peu comme ceci :

  1. eye : array[0..29] of byte = 
  2. (  4, 7,  { colonnes de quatre octets de large et sept lignes de haut }
  3.      0, 0, 0, 0, 9, 1, 1, 1, 9, 0, 0, 0, 0, 0, 0, 0,
  4.      0, 0, 9, 9, 1, 1, 1, 4, 4, 9, 9, 0, 0, 0, 0, 0,
  5.      0, 9, 9, 1, 2, 0, 0, 4, 4, 1, 9, 9, 0, 0, 0, 0,
  6.      9, 9, 9, 1, 0, 0, 0, 0, 1, 1, 9, 9, 9, 0, 0, 0,
  7.      0, 9, 9, 1, 2, 0, 0, 2, 1, 1, 9, 9, 0, 0, 0, 0,
  8.      0, 0, 9, 9, 1, 1, 1, 1, 1, 9, 9, 0, 0, 0, 0, 0,
  9.      0, 0, 0, 0, 9, 1, 1, 1, 9, 0, 0, 0, 0, 0, 0, 0 );

Il s'agit en fait d'une image bitmap linéaire, ce qui n'est pas le bon format pour la compilation, mais qui est plus agréable à l'oeil humain. Utilisez les procédures Outils Bitmap pour convertir les images bitmap linéaires en images de plans bitmap, et vice-versa.

Pour compiler cette image pour un mode 360 ??pixels (colonnes de 90 octets) :

  1. PlanarEye:Array[0..29] of Byte;
  2. EyeSize:Word;
  3. CompiledEye:Pointer;
  4.  
  5. xbmtopbm(Eye,PlanarEye);
  6. EyeSize:=xsizeofcbitmap(PlanarEye);
  7. GetMem(CompiledEye,EyeSize);
  8. xcompilebitmap(90,PlanarEye,CompiledEye^);

Notez que les deux tampons doivent exister au préalable. Étant donné que xcompilebitmap renvoie la taille du code compilé, en octets, vous pouvez immédiatement réaffecter le bitmap à la bonne taille si l'utilisation de xsizeofxbitmap ne vous semble pas pratique (la réaffectation peut même être plus rapide, bien que l'utilisation de la fonction soit plus propre). Les pointeurs sont 32 bits car les bitmaps compilés prennent beaucoup de place : ils se situent à une extrémité du spectre vitesse/mémoire. Une bonne règle empirique consiste à allouer (3,5 x hauteur du tampon x largeur du tampon) + 25 octets (arrondir au chiffre supérieur), puis à réduire votre bitmap lorsque vous découvrez combien d'espace vous avez réellement utilisé.

Étant donné que le bitmap compilé doit tenir dans un segment de mémoire, il ne peut pas contenir plus de 19 000 pixels environ. Cela ne constituera pas une limitation pour la plupart des programmeurs sains d'esprit. Si vous n'êtes pas un programmeur sain d'esprit, essayez de diviser votre image énorme et peu maniable en parties plus petites - vous pouvez utiliser la même image bitmap gigantesque si vous la divisez en tranches horizontales pour la compilation. D'ailleurs, diviser la source de cette façon vous permettra d'utiliser une image bitmap source de plus de 64 Ko, ce qui est une idée encore plus malsaine...

Retournons à nos moutons. Une image bitmap est compilée pour une seule largeur d'écran. Si vous utilisez un écran logique plus grand que votre écran physique, appelez le compilateur d'images bitmap avec la largeur logique - l'important est le nombre d'octets par ligne. Notez que vous n'avez pas besoin d'être en mode graphique pour utiliser cette routine. Cela vous permet de développer et de compiler des images bitmap séparément, avec n'importe quel programme utilitaire que vous pourriez créer.

La fonction finale est xputcbitmap. Pour tracer notre oeil à (99,4), sur la page commençant à l'emplacement 0 :

  1. xputcbitmap(99, 4, 0, CompiledEye);

Cette fonction dépend de la variable globale ScrnLogicalByteWidth du module XMAIN, devant être le même nombre que le paramètre de colonne que vous avez utilisé pour compiler votre bitmap.

Le module XCBITMAP ne prend en charge que les blits mémoire vers VGA. Xlib comprend également des routines non masquantes pouvant rapidement enregistrer et restaurer l'écran d'arrière-plan derrière votre bitmap, en utilisant des opérations de chaîne rapides.

Ce module fait partie du paquet Xlib et est dans le domaine public.

Le programme DEMO2.C inclus démontre la différence de performance entre les blits masqués bitmap planaires et les blits bitmap compilés.

xcompilepbm

Procedure XCompilePbm(LogicalWidth:Word;Var bitmap,output);

xsizeofcpbm

Function XSizeOfCPbm(LogicalWidth:Word;Var Bitmap):Word;

Identiques aux précédents, mais ils fonctionnent sur PBM.

Bitmaps vidéo

Les procédures VIDEO BITMAPS implémentent un autre type de bitmap pour compléter les bitmaps planaires et compilés, les bitmaps basés sur la VRAM. Si une voiture à 4 cylindres est analogue aux bitmaps planaires, c'est-à-dire économe en mémoire mais peu performante, et qu'un V8 est analogue aux bitmaps compilés, des gourmands en mémoire qui volent vraiment, alors les bitmaps basés sur la VRAM sont les 6 cylindres aux performances modestes avec une consommation de mémoire acceptable.

Pour résumer leurs arguments de vente, les VBM sont modérément rapides avec une consommation de mémoire raisonnable et, contrairement aux bitmaps compilés, peuvent être coupés. Les inconvénients sont qu'ils sont limités par la quantité de mémoire vive vidéo disponible et qu'ils ont une structure complexe.

Le format de bitmap VRAM est plutôt complexe, composé de composants stockés dans la mémoire vive vidéo et de composants dans la mémoire vive système fonctionnant ensemble. Cette complexité nécessite l'existence d'une fonction de création "xmakevbm" prenant une bitmap linéaire d'entrée et génère le VBM équivalent (VRAM Bit Map).

Structure VBM :

  1. word  0   Size                  ; Taille totale de cette structure VBM en octets
  2. word  1   ImageWidth            ; Largeur en octets de l'image (pour tous les alignements)
  3. word  2   ImageHeight           ; Hauteur en lignes de balayage de l'image
  4.  
  5. word  3 Alignment 0  ImagePtr   ; Déplacement dans VidRAM de cette image alignée
  6.  +--word  4              MaskPtr        ; Déplacement (dans le DS de cette structure) de
  7.  |   .                                  ; masques d'alignement
  8.  |   .
  9.  |   .
  10.  |  word  9 Alignment 3  ImagePtr       ; Déplacement dans VidRAM de cette image alignée
  11. +|--word 10              MaskPtr        ; Déplacement (dans le DS de cette structure) de
  12. ||                                      ; masques d'alignement
  13. ||
  14. |+->byte 21 (word 11)                -------+-- ; Masques d'image pour l'alignement 0
  15. |   .                                       |
  16. |   .                                       |
  17. |   byte  21 + ImageWidth*ImageHeight  -----+
  18. |
  19. |   .
  20. |   . ; (de même pour les alignements 1 - 2)
  21. |   .
  22. |
  23. +-->byte  21 + 3*ImageWidth*ImageHeight + 1-+-- ; Masques d'image pour l'alignement 3
  24. .                                       |
  25. .                                       |
  26. byte  21 + 4*(ImageWidth*ImageHeight) --+
  27.  
  28. .
  29. .
  30. ; De même pour les alignements 2 et 3
  31. .
  32. .
  33. byte 21 + 4*(ImageWidth*ImageHeight)

(Et n'oubliez pas les données correspondantes dans la mémoire vidéo)

Vous pouvez constater par vous-même la complexité de ce format bitmap. L'image est entreposée dans la mémoire vidéo dans ses 4 alignements différents avec des pointeurs vers ces alignements dans le VBM. De même, il existe 4 alignements des masques correspondants dans le VBM lui-même (vers la fin). Les octets de masque contiennent les paramètres de plan pour les octets vidéo correspondants afin qu'un déplacement de mémoire puisse déplacer jusqu'à 4 pixels à la fois (selon les paramètres de masque) en utilisant les verrous du VGA, ce qui vous donne théoriquement une amélioration de vitesse de 4x par rapport aux blits conventionnels comme ceux implémentés dans "XPBITMAP". En fait, c'est entre 2 et 3 en raison des frais généraux encourus.

Ces bitmaps sont plus difficiles à entreposer dans des fichiers que les PBM et les CBM, mais toujours possibles avec un peu de travail, alors ne les écartez pas comme étant trop difficiles à utiliser. Considérez attentivement tous les formats bitmap avant de décider lequel utiliser. Il peut même y avoir des situations où une application prudente des trois types serait la plus efficace, c'est-à-dire. bitmaps compilés pour les tuiles d'arrière-plan et le personnage principal du jeu (n'ayant jamais besoin d'être découpés), bitmaps basés sur VRAM pour les personnages les plus fréquemment rencontrés (adversaire, extraterrestre,...) étant découpés lorsqu'ils arrivent et quittent votre emplacement actuel et bitmaps planaires pour les personnages plus petits ou moins fréquemment rencontrés.

xmakevbm

Function xmakevbm(Var lbm; Var VramStart:Word):Pointer;

Créez le VBM à partir du bitmap linéaire donné et placez les alignements d'image dans la mémoire vidéo en commençant par le déplacement dans la variable pointée par «VramStart». «VramStart» est ensuite mis à jour pour pointer vers le prochain octet libre de la VRAM (juste après le dernier octet des alignements d'image). En général, vous pointerez «VramStart» vers «NonVisualOffs».

La définition des paramètres :

Paramètre Description
lbm Pointeur vers la bitmap linéaire d'entrée
VramStart Pointeur vers la variable contenant le déplacement du premier octet VRAM libre.

xputmaskedvbm

extern int xputmaskedvbm(int X, int Y, word ScrnOffs, byte far * VBitmap);

Dessine une image bitmap basée sur la VRAM à (X, Y) par rapport à l'écran avec le décalage de départ «ScrnOffs».

Renvoie 1 si l'image découpée est entièrement découpée (c'est-à-dire qu'aucune partie n'apparaît à l'écran), sinon renvoie 0.

xputmaskedvbmclipx

Procedure XPutMaskedVBMClipX(X, Y, ScrnOffs:Word; Var SrcVBM);

xputmaskedvbmclipy

Procedure XPutMaskedVBMClipY(X,Y,ScrnOffs:Word;Var SrcVBM);

xputmaskedvbmclipxy

Versions de découpage de «xputmaskedvbm».

Routines de la souris

Ces procédures implémentent des fonctions de gestion de la souris très basiques. Elles fonctionnent en installant une fonction de gestionnaire d'événements lors de l'initialisation interceptant et traitant ensuite les événements de la souris et met automatiquement à jour les variables d'état telles que la position de la souris et l'état du bouton enfoncé. Elles ne prennent pas en charge toutes les fonctionnalités de :

Cela a été fait principalement pour éviter des entraves inutiles aux performances, car la fonction de gestion de la souris a le potentiel de dégrader les performances.

Les programmes communiquent avec le pilote de la souris comme avec d'autres périphériques, via un vecteur d'interruption 33h. Lors de la génération d'une interruption, le pilote de la souris attend un numéro de fonction dans le registre AX et éventuellement d'autres paramètres dans d'autres registres et renvoie des informations via les registres. Une brève description des fonctions de la souris suit :

Fonctions Pilote de souris Microsoft
0 Initialisation de la souris
1 Afficher le curseur
2 Masquer le curseur
3 Obtenir la position de la souris et l'état des boutons
4 Définir la position du curseur de la souris
5 Obtenir des informations sur la pression des boutons
6 Obtenir des informations sur le bouton de déverrouillage
7 Définir la position horizontale minimum/maximum
8 Définir la position verticale minimum/maximum
9 Définir le bloc de curseur graphique
10 Définir le curseur de texte
11 Lire les compteurs de mouvements de la souris
12 Définir le gestionnaire d'événements
13 Mode d'émulation du crayon lumineux activé
14 Mode d'émulation du crayon lumineux désactivé
15 Définir le rapport Mickey/Pixel de la souris
16 Cacher le curseur conditionnel
19 Définir le seuil de double vitesse

En pratique, seules quelques-unes de ces fonctions sont utilisées et encore moins lorsque l'état de la souris est surveillé par une fonction de gestion d'événements telle que celle utilisée dans ce module.

La chose la plus importante à noter lors de l'utilisation du module de souris est que le gestionnaire d'événements de la souris doit être supprimé avant de quitter le programme. C'est une bonne idée d'avoir une fonction de sortie et d'inclure la ligne "xmouseremove" avec tout autre code de nettoyage avant la sortie.

Variables exportées

Nom/Type de données Description
MouseInstalled:Word Indique si le gestionnaire de souris est installé
MouseHidden:Word Indique si le curseur de la souris est masqué
MouseButtonStatus:Word Maintient l'état du bouton de la souris
MouseX:Word Position X actuelle du curseur de la souris
MouseY:Word Position Y actuelle du curseur de la souris
MouseFrozen:Word Interdit les mises à jour de position si TRUE
MouseColor:Byte La couleur des curseurs de la souris

xmouseinit

Procedure xmouseinit;

Initialisez les fonctions du pilote de la souris et installez la fonction de gestionnaire d'événements de la souris. Il s'agit de la première fonction que vous devez appeler avant d'utiliser l'une des fonctions de la souris. Ce code de souris utilise les techniques les plus rapides possibles pour enregistrer et restaurer les arrière-plans de la souris et pour dessiner le curseur de la souris.

AVERTISSEMENT : cette fonction utilise et met à jour «NonVisualOffset» pour allouer la mémoire vidéo à l'arrière-plan de la souris enregistré.

Limitations : aucun découpage n'est pris en charge horizontalement pour le curseur de la souris. Aucune vérification de validité n'est effectuée pour NonVisualOffs.

**AVERTISSEMENT ** : Vous devez masquer ou au moins geler le curseur de la souris pendant le dessin à l'aide de l'une des autres procédures XLIB, car le gestionnaire de la souris peut modifier les paramètres du registre VGA à tout moment. Les paramètres du registre VGA ne sont pas conservés, ce qui entraînera un comportement de dessin imprévisible. Si vous savez que le dessin se produira loin du curseur de la souris, définissez MouseFrozen sur TRUE (1), faites votre dessin puis définissez-le sur FALSE (0). Vous pouvez également appeler «xhidemouse», effectuer votre dessin puis appeler «xshowmouse». Une autre alternative est de désactiver les interruptions pendant le dessin, mais le dessin prend généralement beaucoup de temps et avoir les interruptions désactivées trop longtemps n'est pas une bonne idée.

xdefinemousecursor

Procedure xdefinemousecursor(Var MouseDef; MouseColor:Byte);

La définition des paramètres :

Paramètre Description
MouseDef Un pointeur vers 14 caractères contenant un masque de bits pour toutes les lignes du curseur.
MouseColor La couleur à utiliser lors du dessin du curseur de la souris.

Définissez une forme de curseur de souris à utiliser dans les redessins de curseur ultérieurs. XMouse a une taille de curseur de souris câblée de 8 pixels de large sur 14 pixels de haut.

AVERTISSEMENT : cette fonction suppose que MouseDef pointe sur 14 octets.

Remarque : l'ordre des bits est inversé. Par exemple, le bit 7 représente le pixel 0 ... le bit 0 représente le pixel 7 dans chaque octet «MouseDef».

xshowmouse

Procedure xshowmouse;

Rend le curseur visible s'il était précédemment masqué.

Voir aussi : «xhidemouse».

xhidemouse

Procedure xhidemouse;

Rend le curseur masqué s'il était précédemment visible.

Voir aussi : «xshowmouse».

xmouseremove

Procedure xmouseremove;

Arrêtez la gestion des événements de la souris et supprimez le gestionnaire de souris.

Remarque : cette fonction DOIT être appelée avant de quitter le programme si un gestionnaire de souris a été installé.

xpositionmouse

Procedure xpositionmouse(x,y:Integer);

Positionne le curseur de la souris à l'emplacement spécifié.

xmousewindow

Procedure xmousewindow(x0, y0, x1, y1:Integer);

Définit une fenêtre de souris.

xupdatemouse

Procedure xupdatemouse;

Force la mise à jour de la position de la souris et le redessin du curseur. Remarque : cette fonction est utile lorsque vous avez défini «MouseFrozen» sur true. Permet à la position du curseur d'être mise à jour manuellement plutôt qu'automatiquement par le gestionnaire installé.

Outils Bitmap

xpbmtobm

Procedure xpbmtobm(Var sourcepbm, destbm);

Cette fonction convertit une image bitmap au format planaire au format linéaire utilisé par xcompilebitmap.

AVERTISSEMENT : les images bitmap source et destination doivent être pré-allouées.

Remarque : cette fonction ne peut convertir que les images bitmap planaires qui conviennent. Si la largeur de l'image bitmap planaire source (par plan) est >= 256/4, elle ne peut pas être convertie.

xbmtopbm

Procedure xbmtopbm(Var sourcepbm, destbm);

Cette fonction convertit une image bitmap au format linéaire tel qu'utilisé par xcompilebitmap au format planaire.

AVERTISSEMENT : les images bitmap source et destination doivent être pré-allouées.

Remarque : cette fonction ne peut convertir que les images bitmap linéaires qui conviennent. Si la largeur de l'image bitmap linéaire source n'est pas un multiple de 4, elle ne peut pas être convertie.

Routines en cercle

«Wheel Have to See About That» par Matthew MacKenzie.

Les procédures de cercle sont :

Le mot «cercle» ici fait référence à une chose ronde ayant autant de pixels de haut que de large. Cela ne ressemble à un cercle qu'en mode 320x240 pixels - le mode X d'origine - et en mode 376x282 pixels.

Dans les deux procédures, le cercle est spécifié par les coordonnées du coin supérieur gauche de la plus petite boîte qui le contient, et le diamètre. Certaines fonctions de cercle vous demandent de spécifier un point central; ce système est un peu étrange car un cercle avec un diamètre pair n'a pas de pixel particulier pour centre. Chaque cercle, en revanche, a une boîte avec un coin supérieur gauche.

Aucune limite n'est vérifiée. Un diamètre de zéro ne dessinera rien, et un diamètre négatif fera exploser votre carte vidéo VGA en centaines de milliers de minuscules petits fragments fumants. Aucune des deux fonctions ne prend en charge le découpage.

Le calcul du cercle est basé sur un algorithme décrit par Michael P. Lindner dans une lettre à l'éditeur à la page 8 du Dr. Dobb's Journal #169 (octobre 1990). L'algorithme a été réorganisé pour permettre de dessiner et de déplacer les tracés dans les huit octants en une seule étape, de sorte que chaque pixel n'a pas besoin d'être chargé deux fois dans le processeur. xfilledcircle ne tire pas parti de cette optimisation car il gère différentes parties de chaque tracé à des moments différents.

xcircle

Procedure xcircle(Left,Top, Diameter, Color, ScreenOffs:Word);

Dessine un cercle avec le coin supérieur gauche et le diamètre donnés, qui sont donnés en pixels.

xfilledcircle

Procedure xfilledcircle(Left, Top, Diameter, Color, ScreenOffs:Word);

Dessine un cercle rempli avec le coin supérieur gauche et le diamètre donnés.

Routines polygonales

xtriangle

Procedure xtriangle(x0, y0, x1, y1, x2, y2, color, PageBase:Word);

Cette procédure dessine un triangle rempli étant découpé selon la fenêtre de découpage actuelle définie par TopClip, BottomClip, LeftClip, RightClip. N'oubliez pas : la variable de découpage X est en octets et non en pixels, vous ne pouvez donc découper que sur des limites de 4 pixels.

xpolygon

Procedure xpolygon(Var vertices; numvertices, color, PageBase:Word);

Cette procédure est similaire à la fonction triangle mais dessine des polygones convexes. Les sommets sont fournis sous la forme d'un pointeur FAR.

Remarque : un polygone convexe est un polygone tel que si vous tracez une ligne à partir de deux sommets quelconques, chaque point de cette ligne sera à l'intérieur du polygone.

Cette procédure fonctionne en divisant un polygone en ses triangles composants et en appelant la routine triangle ci-dessus pour dessiner chacun d'eux. Les performances sont respectables, mais une routine polygonale personnalisée pourrait être plus rapide.

Section de référence

Selon l'auteur de XLib, Themie Gouthas, le Doctor Dobbs Journal est le meilleur ouvrage de référence pour les graphiques VGA en mode X :

Qu'est-ce que le mode X ?

Le mode X est un dérivé du mode standard 13h du VGA (320x200 256 couleurs). Il s'agit d'une famille de modes vidéo non documentés qui sont créés en modifiant les registres du VGA. La beauté du mode X est qu'il offre plusieurs avantages au programmeur :

Voir le numéro 178-179 de D.D.J. pour une description complète du mode X du VGA.

Qu'est-ce qu'un écran partagé ?

Un écran partagé est une fonctionnalité matérielle intéressante offerte par les cartes vidéo EGA et VGA. Un écran partagé est un mode de fonctionnement graphique dans lequel le matériel divise l'écran graphique visuel horizontalement et traite les deux moitiés comme des écrans individuels, chacun commençant à des emplacements différents dans la RAM vidéo.

La moitié inférieure (qui est généralement appelée écran partagé) commence toujours à l'adresse A000:0000 mais l'adresse de départ de la moitié supérieure est définissable par l'utilisateur.

L'application la plus courante des écrans partagés dans les jeux est l'affichage de l'état dans les jeux à défilement. Les écrans partagés rendent ce type de jeu plus simple à programmer car lorsque la fenêtre de la moitié supérieure défile, le programmeur n'a pas à se soucier de redessiner la moitié inférieure.

Qu'est-ce que le double tamporisateur ?

Le double tamporisateur (également connu sous le nom de page flipping) est la technique la plus souvent utilisée pour faire de l'animation. Elle nécessite un matériel capable d'afficher plusieurs pages graphiques (ou au moins 2). L'animation est réalisée en dessinant une image sur l'écran non visible, puis en affichant l'écran non visible. Une fois la page retournée, le processus recommence. L'image suivante de l'animation est dessinée sur l'écran non visible, la page est à nouveau retournée,...

Qu'est-ce que la triple mise en mémoire tampon ?

La triple mise en mémoire tampon est similaire à la double mise en mémoire tampon à bien des égards, mais elle repose sur la définition de 3 pages pour l'animation. Le principal paramètre de vente de la triple mise en mémoire tampon est qu'elle élimine le besoin d'attendre que le retour vertical retourne les pages avant de dessiner sur la nouvelle page, ce qui permet au programmeur de commencer à créer la prochaine image d'animation immédiatement après avoir terminé la page en cours. Voici comment cela fonctionne p;:

Avec la double mise en mémoire tampon, une fois que vous avez terminé de dessiner la page cachée et que vous êtes prêt à retourner les pages, vous devez attendre que le matériel VGA retourne réellement la page (pendant le retour vertical) avant de commencer à dessiner la page suivante, sinon vous dessinerez sur la page visible.

Avec la triple mise en mémoire tampon, vous parcourez trois pages, ce qui garantit que la page sur laquelle vous dessinez ne sera pas visible.

La triple mise en mémoire tampon peut permettre l'animation la plus rapide possible dans les bonnes conditions, mais l'inconvénient est qu'elle nécessite plus de RAM vidéo. Si vous souhaitez stocker des bitmaps dans la RAM vidéo, comme des tuiles d'arrière-plan, la double mise en mémoire tampon serait la meilleure alternative.



PARTAGER CETTE PAGE SUR
Dernière mise à jour : Dimanche, le 19 janvier 2025