Mise en fonction de l'objet Image
Import du code de Geoffrey lors de la séance du 14/02/14, la plupart étant du travail à la maison * Ajout d'un Makefile * Seul l'objet image a été découpé * Instruction test * Modification de l'objet Image * Initialisation du tableau dans le constructeur * Changement de certains int en unsigned int (puisque ne pouvant pas avoir de valeurs négative) * typeComposantes est maintenant un ensemble de constantes * Correction de diverses fautes * Ajout de g_pixelVide pour créer un objet Pixel déjà compatible avec une image * Modification de test_affichageFenetre.cpp en test.cpp * Vérifie désormais si l'objet Image est fonctionnel * Changement de la façon dont la surface est bloquée dans affichageFenetreSDL.cpp * Passage de tous les fichiers C++ au formatteur (d'où le nombre exageré de lignes modifiées) * Correction de README.md * Syntaxe * Message de mise en garde sur la non-disponibilité d'un fichier binaire * Mise à jour de TODO.md * Correction de LICENCE.md * Respect de l'ordre alphabétique, et de la cohérence vis-à-vis des autres fichiers * Ajout des dossiers bin/ et obj/ pour éviter de les créer après un clone
This commit is contained in:
parent
f5a82baaf6
commit
22bcfb2b2f
2
.gitignore
vendored
2
.gitignore
vendored
|
@ -1,3 +1 @@
|
||||||
compile*
|
|
||||||
bin/*
|
|
||||||
*.sublime-*
|
*.sublime-*
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
*Copyright 2014 Geoffrey et Lucas*
|
*Copyright 2014 Lucas et Geoffrey*
|
||||||
|
|
31
Makefile
Normal file
31
Makefile
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
# Variables
|
||||||
|
## Pour make
|
||||||
|
.PHONY: clean, mrproper
|
||||||
|
## Compilation
|
||||||
|
CXX = g++
|
||||||
|
CXXFLAGS = -lSDL -lSDLmain -DDEBUG
|
||||||
|
## Chemins
|
||||||
|
EXEPATH = bin/
|
||||||
|
OBJPATH = obj/
|
||||||
|
SRCPATH = src/
|
||||||
|
|
||||||
|
# Programmes possibles
|
||||||
|
main: main.o image.o
|
||||||
|
$(CXX) $(OBJPATH)main.o $(OBJPATH)image.o -o $(EXEPATH)$@ $(CXXFLAGS)
|
||||||
|
|
||||||
|
test: test.o image.o
|
||||||
|
$(CXX) $(OBJPATH)test.o $(OBJPATH)image.o -o $(EXEPATH)$@ $(CXXFLAGS)
|
||||||
|
|
||||||
|
# Dépendances
|
||||||
|
main.o: $(SRCPATH)main.cpp $(SRCPATH)image.h
|
||||||
|
$(CXX) -c $< -o $(OBJPATH)$@ $(CXXFLAGS)
|
||||||
|
|
||||||
|
test.o: $(SRCPATH)test.cpp $(SRCPATH)image.cpp
|
||||||
|
$(CXX) -c $< -o $(OBJPATH)$@ $(CXXFLAGS)
|
||||||
|
|
||||||
|
image.o: $(SRCPATH)image.cpp
|
||||||
|
$(CXX) -c $< -o $(OBJPATH)$@
|
||||||
|
|
||||||
|
# Meta
|
||||||
|
clean:
|
||||||
|
rm -rf $(OBJPATH)*.o
|
26
README.md
26
README.md
|
@ -1,34 +1,36 @@
|
||||||
#Projet d'ISN de Lucas et Geoffrey
|
#Projet d'ISN de Lucas et Geoffrey
|
||||||
|
|
||||||
##À propos...
|
##À propos
|
||||||
|
|
||||||
###De ce dépôt
|
###Le dépôt
|
||||||
Ce dépôt a été crée pour faciliter le développement du projet. Son caractère public n'est que lié aux nécessité de GitHub. Si vous ne savez pas de quel projet il s'agit, vous perdez votre temps ici. L'absence de licence (du moins jusqu'aux épreuves) vous interdit de distribuer ou de réutiliser le code, qui de toute façon ne vous aurait pas été utile.
|
Ce dépôt a été crée pour faciliter le développement du projet. Son caractère public n'est que lié aux nécessité de GitHub. Si vous ne savez pas de quel projet il s'agit, vous perdez votre temps ici. L'absence de licence (du moins jusqu'aux épreuves) vous interdit de distribuer ou de réutiliser le code, qui de toute façon ne vous aurait pas été utile.
|
||||||
|
|
||||||
###De ce projet
|
###Le projet
|
||||||
Ceci est la création de Lucas et de Geoffrey pour l'option Informatique et Sciences du Numérique qui sera présenté lors du Baccalauréat 2013/2014.
|
Ceci est la création de Lucas et de Geoffrey pour l'option Informatique et Sciences du Numérique qui sera présenté lors du Baccalauréat 2013/2014.
|
||||||
Nos noms complets et le nom du lycée sont masqués pour des raisons d'intimité. Les personnes devant nous reconnaître nous reconnaîtront.
|
Nos noms complets et le nom du lycée sont masqués pour des raisons d'intimité. Les personnes devant nous reconnaître nous reconnaîtront.
|
||||||
|
|
||||||
###Du programme
|
###Le programme
|
||||||
Ce programme est un éditeur basique d'images [PBM/PGM/PPM](http://fr.wikipedia.org/wiki/Portable_pixmap) s’exécutant en ligne de commande.
|
Ce programme est un éditeur basique d'images [PBM/PGM/PPM](http://fr.wikipedia.org/wiki/Portable_pixmap) s’exécutant en ligne de commande.
|
||||||
|
|
||||||
*Statut :* Prétotype
|
*Statut :* Prétotype
|
||||||
|
|
||||||
##Compilation
|
##Compilation
|
||||||
|
Il n'existe pas de fichier binaire à télécharger pour le moment, le seul moyen d'avoir un aperçu du programme est de le compiler.
|
||||||
|
|
||||||
|
Téléchargement : ```git clone https://github.com/GeoffreyFrogeye/PILG.git```
|
||||||
|
|
||||||
###Windows
|
###Windows
|
||||||
1. Télécharger et installer [MinGW](http://www.mingw.org/)
|
1. Télécharger et installer [MinGW](http://www.mingw.org/)
|
||||||
2. Inclure **MinGW** dans la variable d'environnement ```%PATH%``` : ```set path=%path%;C:\MinGW\bin```
|
2. Inclure **MinGW** dans la variable d'environnement ```%PATH%``` : ```set path=%path%;C:\MinGW\bin```
|
||||||
3. Créer le dossier *bin* à la racine du dépôt : ```mkdir bin```
|
3. Télécharger la [bibliothèque de développement SDL 1.2.15](http://www.libsdl.org/release/SDL-devel-1.2.15-mingw32.tar.gz), copier le contenu des dossier *lib* et *include* de l'archive téléchargée dans le dossier de **MinGW**
|
||||||
4. Télécharger la [bibliothèque de développement SDL 1.2.15](http://www.libsdl.org/release/SDL-devel-1.2.15-mingw32.tar.gz), copier le contenu des dossier *lib* et *include* de l'archive téléchargée dans le dossier de **MinGW**
|
4. Télécharger la [bibliothèque d’exécution de SDL 1.2.15](http://www.libsdl.org/release/SDL-1.2.15-win32.zip) et placer *SDL.dll* dans le dossier *bin*
|
||||||
5. Télécharger la [bibliothèque d’exécution de SDL 1.2.15](http://www.libsdl.org/release/SDL-1.2.15-win32.zip) et placer *SDL.dll* dans le dossier *bin*
|
5. Compiler : ```mingw32-make```
|
||||||
6. Compiler : ```g++ src/main.cpp -o bin/main.exe -lmingw32 -lSDLmain -lSDL -static-libgcc -static-libstdc++```
|
|
||||||
|
|
||||||
L’exécutable se trouvera dans le dossier *bin*
|
L’exécutable se trouvera dans le dossier *bin*
|
||||||
|
|
||||||
###Linux
|
###Debian / Linux
|
||||||
1. Installer la **bibliothèque de développement SDL 1.2** : ```sudo apt-get install libsdl1.2-dev```
|
1. Installer le nécessaire à la compilation ainsi que la **bibliothèque de développement SDL 1.2** : ```sudo apt-get install build-essential libsdl1.2-dev```
|
||||||
2. Créer le dossier *bin* à la racine du dépôt : ```mkdir bin```
|
2. Compiler : ```make```
|
||||||
3. Compiler : ```g++ src/main.cpp -o bin/main -lSDLmain -lSDL```
|
|
||||||
|
|
||||||
L’exécutable se trouvera dans le dossier *bin*
|
L’exécutable se trouvera dans le dossier *bin*
|
||||||
|
|
||||||
|
|
30
TODO.md
30
TODO.md
|
@ -1,11 +1,11 @@
|
||||||
#À réaliser
|
#À réaliser
|
||||||
|
|
||||||
####Légende
|
###Légende
|
||||||
* **D** Définition réalisée
|
* **D** Définition réalisée
|
||||||
* **A** Algorithme réalisé
|
* **A** Algorithme réalisé
|
||||||
* **C** Code réalisé
|
* **C** Code réalisé
|
||||||
|
|
||||||
####Liste générale
|
###Liste générale
|
||||||
*Ordre donné à titre indicatif*
|
*Ordre donné à titre indicatif*
|
||||||
|
|
||||||
* Fonction principale
|
* Fonction principale
|
||||||
|
@ -13,14 +13,14 @@
|
||||||
* Analyse de la commande
|
* Analyse de la commande
|
||||||
* Analyse des arguments
|
* Analyse des arguments
|
||||||
* Correspondance commandes ↔ fonctions
|
* Correspondance commandes ↔ fonctions
|
||||||
* Objets
|
* Objets **D**
|
||||||
* Fenêtre **D**
|
* Fenêtre **D**
|
||||||
* SDL **C**
|
* SDL **C**
|
||||||
* BGI **A**
|
* BGI **A**
|
||||||
* Pixel **C**
|
* Pixel **C**
|
||||||
* Image **D**
|
* Image **C**
|
||||||
* Fonctions **D**
|
* Fonctions **D**
|
||||||
* Gestion de fichier
|
* Gestion de fichier **D**
|
||||||
* Créer
|
* Créer
|
||||||
* Ouvrir
|
* Ouvrir
|
||||||
* Enregistrer
|
* Enregistrer
|
||||||
|
@ -31,23 +31,27 @@
|
||||||
* Coller tout
|
* Coller tout
|
||||||
* Annuler
|
* Annuler
|
||||||
* Refaire
|
* Refaire
|
||||||
* Couleur
|
* Couleur **D**
|
||||||
* Teinte
|
* Teinte **D**
|
||||||
* Saturation
|
* Saturation **D**
|
||||||
* Luminosité
|
* Luminosité **D**
|
||||||
* Contraste
|
* Contraste **D**
|
||||||
* Dessin
|
* Dessin **D**
|
||||||
* Trait
|
* Trait
|
||||||
* Rectangle
|
* Rectangle
|
||||||
* Cercle
|
* Cercle
|
||||||
* Disque
|
* Disque
|
||||||
* Géométrie
|
* Géométrie **D**
|
||||||
* Zoom
|
* Zoom
|
||||||
* Pivot
|
* Pivot
|
||||||
* Redimensionner
|
* Redimensionner
|
||||||
* Conversion du mode
|
* Conversion du mode **D**
|
||||||
* Binaire
|
* Binaire
|
||||||
* Niveaux de gris
|
* Niveaux de gris
|
||||||
* Couleur
|
* Couleur
|
||||||
* Aide
|
* Aide
|
||||||
* Documentation
|
* Documentation
|
||||||
|
|
||||||
|
|
||||||
|
----------
|
||||||
|
*Copyright 2014 Lucas et Geoffrey*
|
3
bin/.gitignore
vendored
Normal file
3
bin/.gitignore
vendored
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
# Pour forcer l'ajout de ce dossier dans le dépôt
|
||||||
|
*
|
||||||
|
!.gitignore
|
3
obj/.gitignore
vendored
Normal file
3
obj/.gitignore
vendored
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
# Pour forcer l'ajout de ce dossier dans le dépôt
|
||||||
|
*
|
||||||
|
!.gitignore
|
|
@ -1,11 +1,11 @@
|
||||||
#include <graphics.h>
|
#include <graphics.h>
|
||||||
|
|
||||||
int ouvrirFenetre(int dimensionX, int dimensionY, const char* nom) { // Crée une fenêtre
|
int ouvrirFenetre(int dimensionX, int dimensionY, const char *nom) { // Crée une fenêtre
|
||||||
initwindow(dimensionX, dimensionY, nom, 0, 0);
|
initwindow(dimensionX, dimensionY, nom, 0, 0);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int setNomFenetre(const char* nom) { // Change le nom de la fenêtre
|
int setNomFenetre(const char *nom) { // Change le nom de la fenêtre
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -3,12 +3,11 @@
|
||||||
|
|
||||||
int fenetreDimensionX; // Stocke les dimensions X de la fenêtre
|
int fenetreDimensionX; // Stocke les dimensions X de la fenêtre
|
||||||
int fenetreDimensionY; // Stocke les dimensions Y de la fenêtre
|
int fenetreDimensionY; // Stocke les dimensions Y de la fenêtre
|
||||||
SDL_Surface* fenetreEcran;
|
SDL_Surface *fenetreEcran;
|
||||||
SDL_Surface* fenetreImage;
|
SDL_Surface *fenetreImage;
|
||||||
|
|
||||||
|
|
||||||
void definirPixel(SDL_Surface *surface, int x, int y, Uint32 pixel)
|
void definirPixel(SDL_Surface *surface, int x, int y, Uint32 pixel) {
|
||||||
{
|
|
||||||
/*nbOctetsParPixel représente le nombre d'octets utilisés pour stocker un 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
|
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.*/
|
de l'image : 8, 16, 24 ou 32 bits.*/
|
||||||
|
@ -18,8 +17,7 @@ void definirPixel(SDL_Surface *surface, int x, int y, Uint32 pixel)
|
||||||
Uint8 *p = (Uint8 *)surface->pixels + y * surface->pitch + x * nbOctetsParPixel;
|
Uint8 *p = (Uint8 *)surface->pixels + y * surface->pitch + x * nbOctetsParPixel;
|
||||||
|
|
||||||
/*Gestion différente suivant le nombre d'octets par pixel de l'image*/
|
/*Gestion différente suivant le nombre d'octets par pixel de l'image*/
|
||||||
switch(nbOctetsParPixel)
|
switch (nbOctetsParPixel) {
|
||||||
{
|
|
||||||
case 1:
|
case 1:
|
||||||
*p = pixel;
|
*p = pixel;
|
||||||
break;
|
break;
|
||||||
|
@ -30,14 +28,11 @@ void definirPixel(SDL_Surface *surface, int x, int y, Uint32 pixel)
|
||||||
|
|
||||||
case 3:
|
case 3:
|
||||||
/*Suivant l'architecture de la machine*/
|
/*Suivant l'architecture de la machine*/
|
||||||
if(SDL_BYTEORDER == SDL_BIG_ENDIAN)
|
if (SDL_BYTEORDER == SDL_BIG_ENDIAN) {
|
||||||
{
|
|
||||||
p[0] = (pixel >> 16) & 0xff;
|
p[0] = (pixel >> 16) & 0xff;
|
||||||
p[1] = (pixel >> 8) & 0xff;
|
p[1] = (pixel >> 8) & 0xff;
|
||||||
p[2] = pixel & 0xff;
|
p[2] = pixel & 0xff;
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
p[0] = pixel & 0xff;
|
p[0] = pixel & 0xff;
|
||||||
p[1] = (pixel >> 8) & 0xff;
|
p[1] = (pixel >> 8) & 0xff;
|
||||||
p[2] = (pixel >> 16) & 0xff;
|
p[2] = (pixel >> 16) & 0xff;
|
||||||
|
@ -50,54 +45,38 @@ void definirPixel(SDL_Surface *surface, int x, int y, Uint32 pixel)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int ouvrirFenetre(int dimensionX, int dimensionY, std::string nom) { // Crée une fenêtre
|
void setNomFenetre(std::string nom) { // Change le nom de la 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);
|
SDL_WM_SetCaption(nom.c_str(), NULL);
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int pointFenetre(int x, int y, int r, int v, int b) {
|
void 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
|
// std::cout << "(" << x << ";" << y << ") = (" << r << ";" << v << ";" << b << ")" << std::endl; // DEBUG
|
||||||
|
|
||||||
Uint32 pixel;
|
Uint32 pixel;
|
||||||
|
|
||||||
Uint8 u_r, u_v, u_b, u_a;
|
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_r = (r > 255 ? 0xff : (Uint8) r);
|
||||||
u_v = (Uint8) (v > 255 ? 255 : v);
|
u_v = (v > 255 ? 0xff : (Uint8) v);
|
||||||
u_b = (Uint8) (b > 255 ? 255 : b);
|
u_b = (b > 255 ? 0xff : (Uint8) b);
|
||||||
u_a = (Uint8) 255;
|
u_a = 0xff;
|
||||||
|
|
||||||
pixel = SDL_MapRGBA(fenetreImage->format, u_r, u_v, u_b, u_a);
|
pixel = SDL_MapRGBA(fenetreImage->format, u_r, u_v, u_b, u_a);
|
||||||
|
|
||||||
SDL_LockSurface(fenetreImage);
|
|
||||||
definirPixel(fenetreImage, x, y, pixel);
|
definirPixel(fenetreImage, x, y, pixel);
|
||||||
SDL_UnlockSurface(fenetreImage);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int afficherFenetre() {
|
void afficherFenetre() {
|
||||||
// TODO (performance, facultatif) fenetreImage pourrait être crée pendant afficherFenetre(), et pointFenetre() ne modifierait qu'un tableau
|
|
||||||
SDL_Rect position;
|
SDL_Rect position;
|
||||||
position.x = 0; position.y = 0;
|
position.x = 0;
|
||||||
|
position.y = 0;
|
||||||
|
SDL_UnlockSurface(fenetreImage);
|
||||||
SDL_BlitSurface(fenetreImage, NULL, fenetreEcran, &position);
|
SDL_BlitSurface(fenetreImage, NULL, fenetreEcran, &position);
|
||||||
SDL_Flip(fenetreEcran);
|
SDL_Flip(fenetreEcran);
|
||||||
return 0;
|
SDL_LockSurface(fenetreImage);
|
||||||
}
|
}
|
||||||
|
|
||||||
int attendreFenetre() {
|
void attendreFenetre() {
|
||||||
SDL_Event evenement;
|
SDL_Event evenement;
|
||||||
|
|
||||||
while (evenement.type != SDL_QUIT) {
|
while (evenement.type != SDL_QUIT) {
|
||||||
|
@ -105,8 +84,19 @@ int attendreFenetre() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int fermerFenetre() {
|
void fermerFenetre() {
|
||||||
|
SDL_UnlockSurface(fenetreImage);
|
||||||
SDL_FreeSurface(fenetreImage);
|
SDL_FreeSurface(fenetreImage);
|
||||||
SDL_Quit();
|
SDL_Quit();
|
||||||
return 0;
|
}
|
||||||
|
|
||||||
|
void 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);
|
||||||
|
SDL_LockSurface(fenetreImage);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,48 +1,88 @@
|
||||||
int Image::Image(int dimensionX, int dimensionY, int maxComposante, int typeComposantes) { // Crée l'objet Image
|
#include "image.h"
|
||||||
|
|
||||||
|
Image::Image(unsigned int dimensionX, unsigned int dimensionY, unsigned int maxComposante, PILG_Comp typeComposantes): m_dimensionX(dimensionX), m_dimensionY(dimensionY), m_maxComposante(maxComposante), m_typeComposantes(typeComposantes) {
|
||||||
|
Pixel pixelVide = g_pixelVide();
|
||||||
|
for (int xT = 0; xT < dimensionX; xT++) {
|
||||||
|
std::vector< Pixel > colonne;
|
||||||
|
for (int yT = 0; yT < dimensionX; yT++) {
|
||||||
|
colonne.push_back(pixelVide);
|
||||||
|
}
|
||||||
|
m_tab.push_back(colonne);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Getters
|
// Getters
|
||||||
int Image::g_dimensionX() {
|
unsigned int Image::g_dimensionX() const {
|
||||||
return m_dimensionX;
|
return m_dimensionX;
|
||||||
}
|
}
|
||||||
int Image::g_dimensionY() {
|
|
||||||
|
unsigned int Image::g_dimensionY() const {
|
||||||
return m_dimensionY;
|
return m_dimensionY;
|
||||||
|
}
|
||||||
|
|
||||||
|
PILG_Comp Image::g_typeComposantes() const {
|
||||||
|
return m_typeComposantes;
|
||||||
}
|
}
|
||||||
int Image::g_typeComposante() {
|
|
||||||
return m_typeComposante;
|
|
||||||
}
|
|
||||||
int Image::g_maxComposante() {
|
|
||||||
return m_typeComposante;
|
|
||||||
|
|
||||||
|
unsigned int Image::g_maxComposante() const {
|
||||||
|
return m_maxComposante;
|
||||||
}
|
}
|
||||||
int g_point(int x, int y, Pixel &pixel) {
|
|
||||||
if (en_Limites(x, y)) {
|
int Image::g_point(unsigned int x, unsigned int y, Pixel &pixel) const {
|
||||||
|
if (enLimites(x, y)) {
|
||||||
pixel = m_tab[x][y];
|
pixel = m_tab[x][y];
|
||||||
return 0;
|
return 0;
|
||||||
} else {
|
} else {
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Setters
|
// Setters
|
||||||
|
int Image::s_point(unsigned int x, unsigned int y, Pixel pixel) {
|
||||||
int Image::s_point(int x, int y, Pixel pixel) {
|
if (enLimites(x, y)
|
||||||
if (en_Limites(x, y) && pixel.typeComposantes == Image.g_typeComposante && pixel.maxComposante == Image.g_maxComposante && enLimitesComposantes(pixel)) {
|
&& pixel.typeComposantes == m_typeComposantes
|
||||||
|
&& pixel.maxComposante == m_maxComposante
|
||||||
|
&& enLimitesComposantes(pixel)) {
|
||||||
m_tab[x][y] = pixel;
|
m_tab[x][y] = pixel;
|
||||||
|
return 0;
|
||||||
|
} else {
|
||||||
|
return 1;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Utilitaires
|
||||||
|
Pixel Image::g_pixelVide() const {
|
||||||
|
Pixel pixel;
|
||||||
|
pixel.typeComposantes = m_typeComposantes;
|
||||||
|
pixel.maxComposante = m_maxComposante;
|
||||||
|
switch (pixel.typeComposantes) {
|
||||||
|
case PILG_BIN:
|
||||||
|
pixel.b = false;
|
||||||
|
break;
|
||||||
|
case PILG_NIV:
|
||||||
|
pixel.g = 0;
|
||||||
|
break;
|
||||||
|
case PILG_RVB:
|
||||||
|
pixel.r = 0;
|
||||||
|
pixel.b = 0;
|
||||||
|
pixel.v = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return pixel;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Image::enLimitesComposantes(Pixel pixel) {
|
bool Image::enLimitesComposantes(Pixel pixel) {
|
||||||
switch (pixel.typeComposantes) {
|
switch (pixel.typeComposantes) {
|
||||||
case 0:
|
case PILG_BIN:
|
||||||
return true;
|
return true;
|
||||||
break;
|
break;
|
||||||
case 1:
|
case PILG_NIV:
|
||||||
return pixel.m <= pixel.maxComposante;
|
return (pixel.g <= pixel.maxComposante);
|
||||||
break;
|
break;
|
||||||
case 2:
|
case PILG_RVB:
|
||||||
return (pixel.r <= pixel.maxComposante && pixel.v <= pixel.maxComposante && pixel.b <= pixel.maxComposante);
|
return (pixel.r <= pixel.maxComposante
|
||||||
|
&& pixel.v <= pixel.maxComposante
|
||||||
|
&& pixel.b <= pixel.maxComposante);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
return false;
|
return false;
|
||||||
|
@ -50,6 +90,6 @@ bool Image::enLimitesComposantes(Pixel pixel) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Image::enLimites(int x, int y) {
|
bool Image::enLimites(unsigned int x, unsigned int y) const {
|
||||||
return (x >= 0 && x < g_dimensionX && y >= 0 && y < g_dimensionY);
|
return (x >= 0 && x < m_dimensionX && y >= 0 && y < m_dimensionY);
|
||||||
}
|
}
|
49
src/image.h
49
src/image.h
|
@ -1,34 +1,39 @@
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
typedef Pixel {
|
typedef enum {PILG_BIN, PILG_NIV, PILG_RVB} PILG_Comp;
|
||||||
int typeComposantes;
|
|
||||||
int maxComposante;
|
|
||||||
int r;
|
|
||||||
int v;
|
|
||||||
int b;
|
|
||||||
int g;
|
|
||||||
bool n;
|
|
||||||
|
|
||||||
|
typedef struct Pixel {
|
||||||
|
PILG_Comp typeComposantes;
|
||||||
|
unsigned int maxComposante;
|
||||||
|
unsigned int r;
|
||||||
|
unsigned int v;
|
||||||
|
unsigned int b;
|
||||||
|
unsigned int g;
|
||||||
|
bool n;
|
||||||
} Pixel;
|
} Pixel;
|
||||||
|
|
||||||
class Image {
|
class Image {
|
||||||
public:
|
public:
|
||||||
int Image(int dimensionX, int dimensionY, int maxComposante, int typeComposantes); // Crée l'objet Image
|
Image(unsigned int dimensionX, unsigned int dimensionY, unsigned int maxComposante, PILG_Comp typeComposantes);
|
||||||
// Getters
|
// Getters
|
||||||
int g_dimensionX();
|
unsigned int g_dimensionX() const;
|
||||||
int g_dimensionY();
|
unsigned int g_dimensionY() const;
|
||||||
int g_typeComposante();
|
PILG_Comp g_typeComposantes() const;
|
||||||
int g_maxComposante();
|
unsigned int g_maxComposante() const;
|
||||||
Pixel g_point(int x, int y);
|
int g_point(unsigned int x, unsigned int y, Pixel &pixel) const;
|
||||||
// Setters
|
// Setters
|
||||||
int s_point(int x, int y, Pixel pixel);
|
int s_point(unsigned int x, unsigned int y, Pixel pixel);
|
||||||
|
// Utilitaires
|
||||||
|
Pixel g_pixelVide() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
bool enLimitesComposantes(Pixel pixel);
|
// Utilitaires
|
||||||
bool enLimites(int x, int y);
|
static bool enLimitesComposantes(Pixel pixel);
|
||||||
int m_dimensionX;
|
bool enLimites(unsigned int x, unsigned int y) const;
|
||||||
int m_dimensionY;
|
// Variables
|
||||||
int m_typeComposantes; // 0 : N&B, 1 : Niveaux de gris, 2 : RVB
|
unsigned int m_dimensionX;
|
||||||
int m_maxComposante; // Maximum de composante (inutilisé pour binaire)
|
unsigned int m_dimensionY;
|
||||||
vector< vector< Pixel > > m_tab;
|
PILG_Comp m_typeComposantes; // 0 : N&B, 1 : Niveaux de gris, 2 : RVB
|
||||||
|
unsigned int m_maxComposante; // Maximum de composante (sauf binaire)
|
||||||
|
std::vector< std::vector< Pixel > > m_tab;
|
||||||
};
|
};
|
||||||
|
|
|
@ -3,15 +3,13 @@
|
||||||
|
|
||||||
#include "affichageFenetreSDL.cpp"
|
#include "affichageFenetreSDL.cpp"
|
||||||
|
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
// Insertion des ensembles de fonctions massives séparés pour plus de clarté
|
// Insertion des ensembles de fonctions massives séparés pour plus de clarté
|
||||||
#include "analyserCommande.cpp"
|
#include "analyserCommande.cpp"
|
||||||
#include "traitementImage.cpp"
|
#include "traitementImage.cpp"
|
||||||
|
|
||||||
int main(int argc, char* args[]) {
|
int main(int argc, char *args[]) {
|
||||||
|
|
||||||
#if defined(WIN32) // Permet de refaire fonctionner cin et cout sous Windows après démarrage de SDL
|
#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", stdout);
|
||||||
freopen("CON", "w", stderr);
|
freopen("CON", "w", stderr);
|
||||||
|
|
64
src/test.cpp
Normal file
64
src/test.cpp
Normal file
|
@ -0,0 +1,64 @@
|
||||||
|
#include <iostream>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
#include "affichageFenetreSDL.cpp"
|
||||||
|
#include "image.h"
|
||||||
|
|
||||||
|
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");
|
||||||
|
|
||||||
|
Image image(dimX, dimY, 255, PILG_RVB);
|
||||||
|
int x, y, c;
|
||||||
|
Pixel point;
|
||||||
|
point = image.g_pixelVide();
|
||||||
|
// cout << "R : " << point.r << " - V : " << point.v << " - B : " << point.b << endl; // DEBUG
|
||||||
|
|
||||||
|
|
||||||
|
// Cycle de couleurs avec utilisation d'Image
|
||||||
|
for (c = 0; c < 256; c++) { // À peu près 28 FPS avec SDL
|
||||||
|
for (x = 0; x < dimX; x++) {
|
||||||
|
for (y = 0; y < dimY; y++) {
|
||||||
|
point.r = c;
|
||||||
|
point.v = image.g_maxComposante() - c;
|
||||||
|
point.b = 0;
|
||||||
|
if (image.s_point(x, y, point) == 1) {
|
||||||
|
cerr << "Erreur : s_point() a été entré avec des valeurs incorrectes" << endl;
|
||||||
|
cout << "X : " << x << " - Y: " << y << " - R : " << point.r << " - V : " << point.v << " - B : " << point.b << endl; // DEBUG
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
image.g_point(x, y, point);
|
||||||
|
pointFenetre(x, y, point.r, point.v, point.b);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
afficherFenetre();
|
||||||
|
}
|
||||||
|
|
||||||
|
// // Cycle de couleurs sans utilisation d'Image
|
||||||
|
// for (c = 0; c < 256; c++) { // À peu près 75 FPS avec SDL
|
||||||
|
// for (x = 0; x < dimX; x++) {
|
||||||
|
// for (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;
|
||||||
|
}
|
|
@ -1,36 +0,0 @@
|
||||||
#include <iostream>
|
|
||||||
#include <string>
|
|
||||||
|
|
||||||
#include "affichageFenetreBGI.cpp"
|
|
||||||
|
|
||||||
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;
|
|
||||||
}
|
|
Reference in a new issue