IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Arduino Discussion :

GFX : Rotation et miroir bitmap


Sujet :

Arduino

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné Avatar de electroremy
    Homme Profil pro
    Ingénieur sécurité
    Inscrit en
    Juin 2007
    Messages
    1 002
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 002
    Par défaut GFX : Rotation et miroir bitmap
    Bonjour,

    La librairie GFX Adafruit (j'utilise le fork PDQ GFX) permet d'afficher des bitmaps mais il est dommage de ne pas pouvoir les tourner ou les afficher en miroir.

    C'est en effet trop bête de devoir charger plusieurs bitmaps en mémoire pour représenter des logos ou des dessins sous différents angles.

    Je parle bien sûr de rotation d'un angle de 90°, 180° ou 270°, un Arduino n'est pas assez costaud pour des rotations quelconques.

    Du coup j'ai modifié la librairie PDQ GFX, voici le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    template<class HW>
    void PDQ_GFX<HW>::drawBitmap(coord_t x, coord_t y, uint8_t *bitmap, coord_t w, coord_t h, color_t color, color_t bg, bool drawBG, uint8_t angleFM)
    {
    	coord_t i, j, byteWidth = (w + 7) / 8;
    	uint8_t byte;
    	coord_t xx, yy;
    	bool mirror;
    	mirror = angleFM>3;
    	if (mirror) {
    		angleFM-=4;
    	}
     
    	for (j = 0; j < h; j++)
    	{
    		for (i = 0; i < w; i++)
    		{
    			if (i % 8 == 0)
    				byte = bitmap[j * byteWidth + i / 8];
    			else
    				byte <<= 1;
     
    			switch (angleFM) {
    			case 0:
    				if (mirror) {
    					xx = w - i - 1;
    				}else{
    					xx = i;
    				}
    				yy = j;
    				break;
    			case 1:
    				xx = h - j - 1;
    				if (mirror) {
    					yy = w - i - 1;
    				}else{
    					yy = i;
    				}
    				break;
    			case 2:
    				if (mirror) {
    					xx = i;
    				}else{
    					xx = w - i - 1;
    				}
    				yy = h - j - 1;
    				break;
    			default:
    				xx = j;
    				if (mirror) {
    					yy = i;
    				}else{
    					yy = w - i - 1;
    				}
    				break;
    			}
    			if (byte & 0x80)
    				HW::drawPixel(xx + x, yy + y, color);
    			else
    				if (drawBG) HW::drawPixel(xx + x, yy + y, bg);
    		}
    	}
    }
    En paramètre il y a qui doit être vrai si vous voulez dessiner l'arrière plan

    Il y a aussi qui définit l'angle de rotation et le miroir :
    0 correspond au bitmap normal
    1 correspond à une rotation de 90°
    2 correspond à une rotation de 180°
    3 correspond à une rotation de 270°
    4 correspond à un miroir
    5 correspond à un miroir suivit d'une rotation de 90°
    6 correspond à un miroir suivit d'une rotation de 180°
    7 correspond à un miroir suivit d'une rotation de 270°

    A noter que cette fonction permet de dessiner un bitmap en RAM.

    Vous pouvez faire facilement la même modif pour la fonction qui dessine un bitmap en ROM (progmem)

    A bientôt

  2. #2
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 921
    Par défaut
    Citation Envoyé par electroremy Voir le message
    Bonjour,

    Il y a aussi qui définit l'angle de rotation et le miroir :
    0 correspond au bitmap normal
    1 correspond à une rotation de 90°
    2 correspond à une rotation de 180°
    3 correspond à une rotation de 270°
    4 correspond à un miroir
    5 correspond à un miroir suivit d'une rotation de 90°
    6 correspond à un miroir suivit d'une rotation de 180°
    7 correspond à un miroir suivit d'une rotation de 270°
    merci pour ce partage.

    trois petites suggestions:

    1/ n'utilisez pas byte comme nom de variable, ça peut créer une confusion lors de la lecture du code avec le type pré-défini dans Arduino.h )

    2/ vous pourriez définir un type énuméré avec les différents angles
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    enum : uint8_t {ANGLE_0, ANGLE_90, ANGLE_180, ANGLE_270, MIRROR_0, MIRROR_90, MIRROR_180, MIRROR_270};
    le switch/case deviendrait plus simple à lire et le code d'appel de la fonction serait "auto documenté".

    3/ vous pourriez donner une valeur par défaut à drawBG et angleFM comme cela si vous voulez afficher avec un angle normal en dessinant l'arrière plan (souvent le cas), vous n'avez pas à fournir les 2 derniers paramètres (compatibilité avec une ancienne version de votre fonction ?)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void PDQ_GFX<HW>::drawBitmap(coord_t x, coord_t y, uint8_t *bitmap, coord_t w, coord_t h, color_t color, color_t bg, bool drawBG=true, uint8_t angleFM=ANGLE_0)

  3. #3
    Membre chevronné Avatar de electroremy
    Homme Profil pro
    Ingénieur sécurité
    Inscrit en
    Juin 2007
    Messages
    1 002
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 002
    Par défaut
    Vos idées sont très bonnes, je vais les utiliser !

    A noter que "uint8_t byte;" était dans le code source original de la librairie. Bizarre que le compilateur tolère ça

    A bientôt

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Rotate et scaled bitmap
    Par albanninou dans le forum Android
    Réponses: 2
    Dernier message: 30/01/2017, 16h56
  2. Dessiner avec rotation un bitmap
    Par Andry dans le forum Delphi
    Réponses: 6
    Dernier message: 04/05/2007, 15h15
  3. rotation de bitmap
    Par Manu1985 dans le forum Delphi
    Réponses: 2
    Dernier message: 08/12/2006, 13h36
  4. Rotation horizontal à 180 ° (miroir) d'un texte
    Par ^Cali^ dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 16/04/2005, 14h24
  5. Rotation de Bitmap -> ScanLine
    Par jujuesteban dans le forum Langage
    Réponses: 7
    Dernier message: 03/07/2003, 15h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo