vesaGraphique.c (2738B)
1 #include <module.h> 2 #include <types.h> 3 #include <math.h> 4 #include <pc/vesaGraphique/vesaGraphique.h> 5 #include <demarrage/multiboot/multiboot.h> 6 #include <interfaceUtilisateur/police/police.h> 7 #include <interfaceUtilisateur/console/console.h> 8 9 MODULE(VesaGraphique); 10 11 DEPENDANCE_MODULE(VesaGraphique, Multiboot); 12 DEPENDANCE_MODULE(VesaGraphique, Console); 13 DEPENDANCE_MODULE(VesaGraphique, Police); 14 15 extern EtatMultiboot* etatMultiboot; 16 17 18 void setPixel32 (uint32 x, uint32 y, uint32 couleur) { 19 etatVesaGraphique->memoireVideo[x + 1024*y].rvb = couleur; 20 } 21 22 void ligne (uint32 x1, uint32 y1, uint32 x2, uint32 y2, uint32 couleur) { 23 uint32 mdx2, mdy2, dx2, dy2; 24 int32 err, dx, dy; 25 26 setPixel32 (x2, y2, couleur); 27 28 dx = x2 - x1; 29 dy = y2 - y1; 30 31 if (abs(dx) > abs(dy)) { // y++ ou y-- ou y=y à chaque tour 32 err = - abs(dx); 33 mdx2 = 2 * err; 34 dy2 = 2 * abs(dy); 35 36 for (; x1 != x2; x1 += sign(dx)) { 37 setPixel32 (x1, y1, couleur); 38 err += dy2; 39 if (err >= 0) { 40 err += mdx2; 41 y1 += sign(dy); 42 } 43 } 44 } else { // x++ ou x-- ou x=x à chaque tour 45 err = - abs(dy); 46 mdy2 = 2 * err; 47 dx2 = 2 * abs(dx); 48 49 for (; y1 != y2; y1 += sign(dy)) { 50 setPixel32 (x1, y1, couleur); 51 err += dx2; 52 if (err >= 0) { 53 err += mdy2; 54 x1 += sign(dx); 55 } 56 } 57 } 58 } 59 60 void rectanglePlein (uint32 x1, uint32 y1, uint32 x2, uint32 y2, uint32 couleur) { 61 uint32 y; 62 for (; x1 <= x2; x1++) 63 for (y = y1; y <= y2; y++) 64 setPixel32(x1, y, couleur); 65 } 66 67 void rectangleContour (uint32 x1, uint32 y1, uint32 x2, uint32 y2, uint32 couleur) { 68 uint32 x; 69 for (x = x1; x <= x2; x++) { 70 setPixel32(x, y1, couleur); 71 setPixel32(x, y2, couleur); 72 } 73 74 for (; y1 <= y2; y1++) { 75 setPixel32(x1, y1, couleur); 76 setPixel32(x2, y1, couleur); 77 } 78 } 79 80 81 void vesaGraphiqueAfficherCaractereCouleurPosition(char caractere, uint32 couleurAv, uint32 couleurAr, uint32 x, uint32 y) { 82 policeAfficherCaractereCouleurPosition(caractere, couleurAv, couleurAr, x * 8, y * 15); 83 caractere = caractere; 84 couleurAv = couleurAv; 85 couleurAr = couleurAr; 86 x = x; 87 y = y; 88 } 89 90 91 void initVesaGraphique (void** etat) { 92 *etat = etatVesaGraphique; 93 94 /* Passage en mode graphique. Actuellement effectué par grub (avec le patch pour VBE) */ 95 96 etatVesaGraphique->memoireVideo = etatMultiboot->InfoMultiboot->vbeModeInfo->linearAddress; 97 98 etatVesaGraphique->console.x = 0; 99 etatVesaGraphique->console.y = 0; 100 etatVesaGraphique->console.largeur = 1024 / 8; 101 etatVesaGraphique->console.hauteur = 768 / 15; 102 etatVesaGraphique->console.fonctionAffichage = vesaGraphiqueAfficherCaractereCouleurPosition; 103 104 definirConsoleActive(&etatVesaGraphique->console); 105 } 106 107 void deinitVesaGraphique (void** etat) { 108 *etat = NULL; 109 }