From 7786bb445437ef3582d6a7b236ecfa37299bd754 Mon Sep 17 00:00:00 2001 From: GeoffreyFrogeye Date: Mon, 31 Mar 2014 19:12:27 +0200 Subject: [PATCH] Mise en fonction de l'objet Fenetre via SDL MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * affichageFenetreSDL.cpp est désormais fonctionnel Note : Vu la possibilité de ne pouvoir afficher qu'une seule fenêtre avec SDL, la POO pour l'objet fenêtre a été supprimée * Ajout de test_affichageFenetre.cpp pour tester cet ajout * Suppression de ce qui était relatif à SDL dans main.cpp * Mise de analyserCommande() dans un autre fichier pour faciliter l'édition --- .gitignore | 2 +- src/affichageFenetreSDL.cpp | 113 ++++++++++++++++++++++++++++++++-- src/affichageFenetreSDL.h | 12 ---- src/analyserCommande.cpp | 3 + src/image.h | 11 +++- src/main.cpp | 16 ++--- src/test_affichageFenetre.cpp | 36 +++++++++++ 7 files changed, 167 insertions(+), 26 deletions(-) delete mode 100644 src/affichageFenetreSDL.h create mode 100644 src/analyserCommande.cpp create mode 100644 src/test_affichageFenetre.cpp diff --git a/.gitignore b/.gitignore index 349e8c3..1e8df95 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,3 @@ -compile.* +compile* bin/* *.sublime-* diff --git a/src/affichageFenetreSDL.cpp b/src/affichageFenetreSDL.cpp index f439093..57b0d8a 100644 --- a/src/affichageFenetreSDL.cpp +++ b/src/affichageFenetreSDL.cpp @@ -1,7 +1,112 @@ -int creerFenetre(int dimensionX, int dimensionY, string nom) { - return 1; +#include +#include + +int fenetreDimensionX; // Stocke les dimensions X de la fenêtre +int fenetreDimensionY; // Stocke les dimensions Y de la fenêtre +SDL_Surface* fenetreEcran; +SDL_Surface* fenetreImage; + + +void definirPixel(SDL_Surface *surface, int x, int y, Uint32 pixel) +{ + /*nbOctetsParPixel représente le nombre d'octets utilisés pour stocker un pixel. + En multipliant ce nombre d'octets par 8 (un octet = 8 bits), on obtient la profondeur de couleur + de l'image : 8, 16, 24 ou 32 bits.*/ + int nbOctetsParPixel = surface->format->BytesPerPixel; + /*Ici p est l'adresse du pixel que l'on veut modifier*/ + /*surface->pixels contient l'adresse du premier pixel de l'image*/ + Uint8 *p = (Uint8 *)surface->pixels + y * surface->pitch + x * nbOctetsParPixel; + + /*Gestion différente suivant le nombre d'octets par pixel de l'image*/ + switch(nbOctetsParPixel) + { + case 1: + *p = pixel; + break; + + case 2: + *(Uint16 *)p = pixel; + break; + + case 3: + /*Suivant l'architecture de la machine*/ + if(SDL_BYTEORDER == SDL_BIG_ENDIAN) + { + p[0] = (pixel >> 16) & 0xff; + p[1] = (pixel >> 8) & 0xff; + p[2] = pixel & 0xff; + } + else + { + p[0] = pixel & 0xff; + p[1] = (pixel >> 8) & 0xff; + p[2] = (pixel >> 16) & 0xff; + } + break; + + case 4: + *(Uint32 *)p = pixel; + break; + } } -int point(int x, int y) { - return 1; +int ouvrirFenetre(int dimensionX, int dimensionY, std::string nom) { // Crée une fenêtre + SDL_Init(SDL_INIT_VIDEO); + fenetreDimensionX = dimensionX; + fenetreDimensionY = dimensionY; + fenetreEcran = SDL_SetVideoMode(fenetreDimensionX, fenetreDimensionY, 32, SDL_HWSURFACE); + fenetreImage = SDL_CreateRGBSurface(SDL_HWSURFACE, fenetreDimensionX, fenetreDimensionX, 32, 0, 0, 0, 0); + SDL_FillRect(fenetreImage, NULL, SDL_MapRGB(fenetreEcran->format, 0, 0, 0)); + setNomFenetre(nom); + return 0; +} + +int setNomFenetre(std::string nom) { // Change le nom de la fenêtre + SDL_WM_SetCaption(nom.c_str(), NULL); + return 0; +} + +int pointFenetre(int x, int y, int r, int v, int b) { + // TODO (erreur) Vérifications des dimensions + + // std::cout << "(" << x << ";" << y << ") = (" << r << ";" << v << ";" << b << ")" << std::endl; // DEBUG + + Uint32 pixel; + + Uint8 u_r, u_v, u_b, u_a; + u_r = (Uint8) (r > 255 ? 255 : r); // TODO (performance, facultatif, erreur) Si > 255, on renvoit 0xff sinon on convertit + u_v = (Uint8) (v > 255 ? 255 : v); + u_b = (Uint8) (b > 255 ? 255 : b); + u_a = (Uint8) 255; + + pixel = SDL_MapRGBA(fenetreImage->format, u_r, u_v, u_b, u_a); + + SDL_LockSurface(fenetreImage); + definirPixel(fenetreImage, x, y, pixel); + SDL_UnlockSurface(fenetreImage); + + return 0; +} + +int afficherFenetre() { + // TODO (performance, facultatif) fenetreImage pourrait être crée pendant afficherFenetre(), et pointFenetre() ne modifierait qu'un tableau + SDL_Rect position; + position.x = 0; position.y = 0; + SDL_BlitSurface(fenetreImage, NULL, fenetreEcran, &position); + SDL_Flip(fenetreEcran); + return 0; +} + +int attendreFenetre() { + SDL_Event evenement; + + while (evenement.type != SDL_QUIT) { + SDL_WaitEvent(&evenement); + } +} + +int fermerFenetre() { + SDL_FreeSurface(fenetreImage); + SDL_Quit(); + return 0; } diff --git a/src/affichageFenetreSDL.h b/src/affichageFenetreSDL.h deleted file mode 100644 index b0f178b..0000000 --- a/src/affichageFenetreSDL.h +++ /dev/null @@ -1,12 +0,0 @@ -class Fenetre { - -public: - int Fenetre(int dimensionX, int dimensionY, string nom); // Crée une fenêtre - int setNom(string nom); // Change le nom de la fenêtre - int point(int x, int y); -private: - int dimensionX; // Stocke les dimensions X de la fenêtre - int dimensionY; // Stocke les dimensions Y de la fenêtre - string m_nom; // Stocke le nom de la fenêtre - vector< vector< int[3] > > tab; // Tableau qui stocke les pixels -}; diff --git a/src/analyserCommande.cpp b/src/analyserCommande.cpp new file mode 100644 index 0000000..25a9d17 --- /dev/null +++ b/src/analyserCommande.cpp @@ -0,0 +1,3 @@ +function analyserCommande(string nom) { + +} diff --git a/src/image.h b/src/image.h index 8b51cc1..8f7d051 100644 --- a/src/image.h +++ b/src/image.h @@ -6,6 +6,9 @@ public: int getB(); // Récupère la composante Bleu int getG(); // Récupère la composante Gris bool getN(); // Récupère la composante Noir + int getTypeComposantes(); // Récupère le type de composante + int getMaxComposantes(); // Récupère le maximum de composante + int setR(int R); // Change la composante Rouge int setV(int V); // Change la composante Vert int setB(int B); // Change la composante Bleu @@ -24,6 +27,12 @@ private: class Image { public: - int Image(int dimensionX, int dimensionY, int maxComposante); // Crée l'objet Image + int Image(int dimensionX, int dimensionY, int maxComposante, int typeComposantes); // Crée l'objet Image int point(int x, int y, Pixel pixel); // Définit une couleur au point + Pixel getPoint(int x, int y); + +private: + int m_typeComposantes; // 0 : N&B, 1 : Niveaux de gris, 2 : RVB + int m_maxComposante; // Maximum de composante (inutilisé pour binaire) + vector< vector< Pixel > > m_tab; }; diff --git a/src/main.cpp b/src/main.cpp index 69b4aa2..8965b65 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,9 +1,15 @@ #include #include -#include "SDL/SDL.h" + +#include "affichageFenetreSDL.cpp" // Devrait charger le .h mais le programme est relativement simple (sans Makefile) donc on assemble tout en même temps + using namespace std; +// Insertion des ensembles de fonctions massives séparés pour plus de clarté +#include "analyserCommande.cpp" +#include "traitementImage.cpp" + int main(int argc, char* args[]) { #if defined(WIN32) // Permet de refaire fonctionner cin et cout sous Windows après démarrage de SDL @@ -11,13 +17,7 @@ int main(int argc, char* args[]) { freopen("CON", "w", stderr); #endif - SDL_Init(SDL_INIT_EVERYTHING); - - SDL_Quit(); + cout << "PILG" << endl; // Message d'entrée et de test return 0; } - -int analyserCommande(string commande) { - -} diff --git a/src/test_affichageFenetre.cpp b/src/test_affichageFenetre.cpp new file mode 100644 index 0000000..b04f0fb --- /dev/null +++ b/src/test_affichageFenetre.cpp @@ -0,0 +1,36 @@ +#include +#include + +#include "affichageFenetreSDL.cpp" // Devrait charger le .h mais le programme est relativement simple (sans Makefile) donc on assemble tout en même temps + +using namespace std; + + +int main(int argc, char* args[]) { + +#if defined(WIN32) // Permet de refaire fonctionner cin et cout sous Windows après démarrage de SDL + freopen("CON", "w", stdout); + freopen("CON", "w", stderr); +#endif + + cout << "TEST AFFICHAGE FENETRE" << endl; // Message d'entrée et de test + + int dimX = 640, dimY = 480; + ouvrirFenetre(dimX, dimY, "Test affichage fenêtre"); + + for (int c = 0; c <= 255; c++) { // À peu près 58 FPS + for (int x = 0; x <= dimX; x++) { + for (int y = 0; y <= dimY; y++) { + pointFenetre(x, y, c, 255-c, 0); + } + } + afficherFenetre(); + } + + cout << "Éxecution du programme terminée. Vous pouvez quitter la fenêtre." << endl; + attendreFenetre(); + fermerFenetre(); + + + return 0; +}