setDrawInverse()

Il y a deux modes pour les fonctions de dessins et de textes. Dans le mode NORMAL, le dessin se fait dans la couleur demandée (celle qui est spécifiée sinon la dernière utilisée). En mode INVERSE, la couleur demandée est ignorée et chaque point dessiné va prendre la couleur complémentaire de ce qu'il y avait. En dessinant deux fois la même chose au même endroit, on revient à l'écran de départ. Cela permet par exemple de dessiner une sélection, puis de l'effacer sans avoir à mémoriser la zone (ce qui est très long, car il faudrait le faire sur la carte SD). On peut aussi écrire une phrase de façon provisoire sur une image.

setDrawInverse() permet de changer la manière de dessiner. L'usage des constantes INVERSE et NORMAL permettent de choisir le mode sans avoir besoin de se rappeler la valeur du paramètre. Cela permet aussi une plus grande lisibilité du code.

 

Exemples d'utilisation

setDrawInverse(INVERSE); // Passe en mode inversion
setDrawInverse(NORMAL); // Repasse en mode dessin
setDrawInverse(INVERSE); fillRect(0,0,MAX_X,MAX_Y); // Inverse les couleurs de l'écran
setDrawInverse(INVERSE); clrscr(); // clrscr() ignorant le mode, efface l'écran et passe en mode normal

 

Référence

void setDrawInverse(boolean mode)

Paramètre passé

mode: INVERSE ou NORMAL

Valeur retournée

Aucune

 

Voir aussi

- INVERSE; Constante pour l'inversion
- NORMAL; Constante pour le mode normal
- getDrawInverse(); Retourne NORMAL, INVERSE
- drawInverse contient NORMAL ou INVERSE
- clrscr(); Efface l'écran
- RGBcolor(); Transforme un triplet RGB en un code couleur
- setTextColor(); Couleur du texte
- Toutes les fonctions concernées: point(), fillRect(), hLine(), vLine(), line(), lineTo(), rect(), circle(), arc(), text()

 

Notes

L'inversion fonctionne très bien sur des zones très claires ou très sombres. Pas du tout sur les couleurs moyennes.

Lors de l'affichage des caractères, certains points sont dessinés une fois, mais souvent les extrémités sont dessinées deux fois. En mode inversion, les points dessinés une fois vont s'inverser, mais pas ceux qui sont dessinées deux fois. Les textes sont moins nets en mode inversion. Pour la même raison, les textes filiformes (épaisseur 1) passent mieux que les gras.

L'inversion fonctionne pour les dessins de points, de droites, de cercles, de pavés, de textes... Cela n'a aucun effet sur l'affichage des bitmaps et sur clrscr(). En mode inversion, le passage en paramètre d'une couleur n'a aucun effet.

L'inversion est utilisée lors de la sauvegarde des bitmaps pour procurer des hachures de progression.

Après un clrscr(), le mode est NORMAL. Il en est de même à l'initialisation de l'écran par setGraphMode() qui efface l'écran.

Le mode est stocké dans la variable drawInverse. Pour changer le mode, on peut utiliser la fonction setDrawInverse() ou la variable drawInverse. La première méthode est meilleure (plus de sécurité), mais la deuxième nécessite moins d'octets dans un contexte de carte Uno, c'est une économie.

 

Exemple

PecheuxGraph_ILI9341_8bits.zip\PecheuxGraph_ILI9341_8bits\examples\Documentation\Exemple-109-setDrawInverse\Exemple-109-setDrawInverse.ino (dans votre fichier téléchargé):

// Ce programme affiche quelques droites pour faire un "fond", puis dessine et efface un rectangle et le mot bonjour sans
// toucher aux droites.

#include <PecheuxGraph_ILI9341_8bits.h>

void setup() 
{
  setGraphMode(PAYSAGE); // Initialisation générale
  
  setDrawInverse(NORMAL); // Pour dessiner les droites (inutile ici, c'est le mode mis au départ
  
  // Affiche un fond d'écran avec des lignes un peu partout
  for (int boucle=0; boucle<10; boucle++) line(random(LARGEUR), random(HAUTEUR), random(LARGEUR), random(HAUTEUR), WHITE); 

  setDrawInverse(INVERSE); // Pour pouvoir mettre et enlever les messages 
  setTextSize(3);
  setTextBold(1); // Avec des caractères filiformes cela passe mieux!
}

int x1, y1, x2, y2; // Pour dessiner un rectangle
int x3, y3; // Pour du texte
void loop()
{
  x1=random(LARGEUR); y1=random(HAUTEUR); x2=random(LARGEUR); y2=random(HAUTEUR); // Coordonnées au hasard
  x3=random(LARGEUR-getTextWidth("Bonjour")-1); y3=random(HAUTEUR-getTextHeight("Bonjour")-1); // Pour ne pas dépasser
  rect(x1, y1, x2, y2); // Comme pour une sélection
  setTextCursor(x3,y3); text("Bonjour"); // Comme pour un message de pop-up
  delay(500); // pour en voir l'effet
  rect(x1, y1, x2, y2); // Efface le rectangle
  setTextCursor(x3,y3); text("Bonjour"); // Efface le texte
}

Résultat: