begin process at 2013 05 26 08:42:23
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Applications Linux

 > COLORIMÈTRE NUMÉRIQUE LINUX

COLORIMÈTRE NUMÉRIQUE LINUX


 Description

Cliquez pour voir la capture en taille normale
Emulation sous linux du colorimètre numérique MacOSX, en utilisant la librairie X11.
Codé en C et testé sur Ubuntu.

Dans mon cas, j'ai du ajouter dans le Makefile :
-L/usr/lib/i386-linux-gnu -lX11

Source

  • /*
  • Colorimètre numérique basé sur la librairie X11
  • 3 sous fenetres composent cette application:
  • La 1ere est un zoom sur le voisinage du curseur. Le diaphragme y est représenté par un carré noir.
  • La 2eme est la couleur moyenne sur tous les pixels dans le diaphragme.
  • La 3eme liste les valeurs r, g, b, la taille du diaphragme et la position x, y du curseur.
  • Echap pour sortir. Les touches 'a' et 'z' permettent de réduire / agrandir le diaphragme.
  • */
  • #include <X11/Xlib.h>
  • #include <X11/Xutil.h>
  • #include <X11/Xatom.h>
  • #include <X11/keysym.h>
  • #include <X11/cursorfont.h>
  • #include <stdlib.h>
  • #include <stdio.h>
  • #include <string.h>
  • // NPIX et TPIX sont le nombre et la taille des pixels de la sous-fenetre zoom
  • // HEIGHT, WIDTH les dimensions de la fenetre application; SUBWIDTH la largeur de chaque 'sous fenetres'
  • #define NPIX 15
  • #define TPIX 8
  • #define HEIGHT 120
  • #define WIDTH 360
  • #define SUBWIDTH 120
  • Display *dpy;
  • int black, white;
  • double r, g, b;
  • unsigned int dpy_width, dpy_height;
  • Window w, wroot;
  • XTextProperty *title;
  • GC gc;
  • unsigned int x, y, x_im, y_im;
  • XImage *image;
  • XColor *c;
  • //Colormap cmap;
  • char str[5][32];
  • unsigned int i, j;
  • unsigned int diaphragme;
  • XEvent e;
  • // redessiner la fenetre de l'application
  • void redraw(){
  • // x, y coords souris
  • // (x_im, y_im) coords de l'angle haut-gauche de la fenetre de zoom
  • x_im= x- (NPIX- 1)/ 2;
  • if (x_im< (NPIX- 1)/ 2) x_im= (NPIX- 1)/ 2;
  • if (x_im> dpy_width- NPIX) x_im= dpy_width- NPIX;
  • y_im= y- (NPIX- 1)/ 2;
  • if (y_im< (NPIX- 1)/ 2) y_im= (NPIX- 1)/ 2;
  • if (y_im> dpy_height- NPIX) y_im= dpy_height- NPIX;
  • // recuperer l'image de l'écran entre (x_im, y_im) et (x_im+ NPIX, y_im+ NPIX)
  • image= XGetImage(dpy, wroot, x_im, y_im, NPIX, NPIX, XAllPlanes(), ZPixmap);
  • // Partie gauche
  • // Dessin d'un rectangle pour chaque pixel
  • r= g= b= 0.;
  • for (i=0; i<NPIX; i++)
  • for (j=0; j<NPIX; j++)
  • {
  • c->pixel= XGetPixel(image, i, j);
  • // XQueryColor très lent => décomposition en red, green, blue de pixel
  • //XQueryColor(dpy, cmap, c);
  • c->red= c->pixel>> 16;
  • c->green= (c->pixel>> 8) & 0xFF;
  • c->blue= c->pixel & 0xFF;
  • // Dessin des pixels zoomés
  • XSetForeground(dpy, gc, c->pixel);
  • XFillRectangle(dpy, w, gc, TPIX* i, TPIX* j, TPIX* (i+ 1), TPIX* (j+ 1));
  • // Si le pixel est dans le diaphragme, on ajoute sa contribution à la valeur moyenne
  • if ( (i>= (NPIX- 1)/2- diaphragme+ 1) && (i< NPIX- ((NPIX- 1)/2- diaphragme+ 1)) &&
  • (j>= (NPIX- 1)/2- diaphragme+ 1) && (j< NPIX- ((NPIX- 1)/2- diaphragme+ 1)) ){
  • r+= (double)(c->red)/ ((2* diaphragme- 1)* (2* diaphragme- 1));
  • g+= (double)(c->green)/ ((2* diaphragme- 1)* (2* diaphragme- 1));
  • b+= (double)(c->blue)/ ((2* diaphragme- 1)* (2* diaphragme- 1));
  • }
  • }
  • // Dessin carré du diaphragme
  • XSetForeground(dpy, gc, black);
  • XDrawRectangle(dpy, w, gc, ((NPIX- 1)/ 2- diaphragme+ 1)* TPIX, ((NPIX- 1)/ 2- diaphragme+ 1)* TPIX, TPIX* (2* diaphragme- 1), TPIX* (2* diaphragme- 1));
  • // Partie centrale
  • c->red= (unsigned int)(r); c->green= (unsigned int)(g); c->blue= (unsigned int)(b);
  • c->pixel= c->blue+ (c->green<< 8)+ (c->red<< 16);
  • XSetForeground(dpy, gc, c->pixel);
  • XFillRectangle(dpy, w, gc, SUBWIDTH, 0, 2* SUBWIDTH, HEIGHT);
  • // Partie droite
  • sprintf(str[0], "X: %i; Y: %i", x, y);
  • sprintf(str[1], "red : %i", c->red);
  • sprintf(str[2], "green : %i", c->green);
  • sprintf(str[3], "blue : %i", c->blue);
  • sprintf(str[4], "diaph : %i", diaphragme);
  • XSetForeground(dpy, gc, black);
  • XFillRectangle(dpy, w, gc, 2* SUBWIDTH, 0, WIDTH, HEIGHT);
  • XSetForeground(dpy, gc, white);
  • for (i=0; i<5; i++)
  • XDrawString(dpy, w, gc, 5+ 2* SUBWIDTH, 20*(i+ 1), str[i], strlen(str[i]));
  • // Dessiner tout ca dans la fenetre
  • XFlush(dpy);
  • }
  • // Initialisation
  • void init(){
  • dpy= XOpenDisplay(NULL);
  • if (dpy== NULL){
  • printf("Pas de display\n");
  • exit(1);
  • }
  • dpy_width= DisplayWidth(dpy, DefaultScreen(dpy));
  • dpy_height= DisplayHeight(dpy, DefaultScreen(dpy));
  • black= BlackPixel(dpy, DefaultScreen(dpy));
  • white= WhitePixel(dpy, DefaultScreen(dpy));
  • wroot= DefaultRootWindow(dpy);
  • // Création fenetre
  • w= XCreateSimpleWindow(dpy, wroot, 0, 0, WIDTH, HEIGHT, 0, black, black);
  • // Donner un titre à la fenetre
  • title= malloc(sizeof(XTextProperty));
  • title->value= (unsigned char *) "Colorimetre numerique";
  • title->encoding= XA_STRING;
  • title->format= 8;
  • title->nitems= strlen((char *) title->value);
  • XSetWMName(dpy, w, title);
  • // Selectionner events que l'on veut capter
  • XSelectInput(dpy, w, StructureNotifyMask | KeyPressMask | ExposureMask);
  • // Afficher fenetre
  • XMapWindow(dpy, w);
  • // Creer un "Graphics Context"
  • gc= XCreateGC(dpy, w, 0, NULL);
  • // cmap Utile à XQueryColor : désactivé
  • //cmap= DefaultColormap(dpy, DefaultScreen(dpy));
  • c= malloc(sizeof(XColor));
  • diaphragme= 1;
  • // Attendre MapNotify event
  • for(;;){
  • XNextEvent(dpy, &e);
  • if (e.type == MapNotify)
  • break;
  • }
  • XSync(dpy, False);
  • // Grabber le curseur en lui assignant une forme (ici XC_cross)
  • XGrabPointer(dpy, wroot, True, PointerMotionMask, GrabModeAsync, GrabModeAsync, wroot, XCreateFontCursor(dpy, XC_cross), CurrentTime);
  • // Déplacement du curseur au milieu de l'écran et 1er dessin
  • x= dpy_width/ 2; y= dpy_height/ 2;
  • XWarpPointer(dpy, None, wroot, 0, 0, 0, 0, x, y);
  • redraw();
  • }
  • // -----------------------------------------------------------
  • // Point entrée application
  • // -----------------------------------------------------------
  • void main()
  • {
  • // Initialiser les variables
  • init();
  • // Boucle principale
  • for(;;){
  • XNextEvent(dpy, &e);
  • // a : réduire diaphragme
  • // z : augmenter diaphragme
  • // esc : sortir du programme
  • if (e.type== KeyPress){
  • if (XLookupKeysym(&e.xkey, 0)== XK_a){
  • diaphragme--; if (diaphragme< 1) diaphragme= 1;
  • redraw();
  • }
  • if (XLookupKeysym(&e.xkey, 0)== XK_z){
  • diaphragme++; if (2* diaphragme- 1> NPIX) diaphragme--;
  • redraw();
  • }
  • else if (XLookupKeysym(&e.xkey, 0)== XK_Escape){
  • break;
  • }
  • }
  • // Mouvement curseur => redessiner fenetre
  • else if (e.type== MotionNotify){
  • x= e.xmotion.x; y= e.xmotion.y;
  • redraw();
  • }
  • }
  • // Libérer les resources
  • XFree(image);
  • XCloseDisplay(dpy);
  • free(c);
  • free(title);
  • }
/*
Colorimètre numérique basé sur la librairie X11

3 sous fenetres composent cette application:
La 1ere est un zoom sur le voisinage du curseur. Le diaphragme y est représenté par un carré noir.
La 2eme est la couleur moyenne sur tous les pixels dans le diaphragme.
La 3eme liste les valeurs r, g, b, la taille du diaphragme et la position x, y du curseur.

Echap pour sortir. Les touches 'a' et 'z' permettent de réduire / agrandir le diaphragme.
*/


#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <X11/Xatom.h>
#include <X11/keysym.h>
#include <X11/cursorfont.h> 

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

// NPIX et TPIX sont le nombre et la taille des pixels de la sous-fenetre zoom
// HEIGHT, WIDTH les dimensions de la fenetre application; SUBWIDTH la largeur de chaque 'sous fenetres'
#define NPIX 15
#define TPIX 8
#define HEIGHT 120
#define WIDTH 360
#define SUBWIDTH 120


Display *dpy;
int black, white;
double r, g, b;
unsigned int dpy_width, dpy_height;
Window w, wroot;
XTextProperty *title;
GC gc;
unsigned int x, y, x_im, y_im;
XImage *image;
XColor *c;
//Colormap cmap;
char str[5][32];
unsigned int i, j;
unsigned int diaphragme;
XEvent e;



// redessiner la fenetre de l'application
void redraw(){
	// x, y coords souris
	// (x_im, y_im) coords de l'angle haut-gauche de la fenetre de zoom
	x_im= x- (NPIX- 1)/ 2;
	if (x_im< (NPIX- 1)/ 2) x_im= (NPIX- 1)/ 2;
	if (x_im> dpy_width- NPIX) x_im= dpy_width- NPIX;
	y_im= y- (NPIX- 1)/ 2;
	if (y_im< (NPIX- 1)/ 2) y_im= (NPIX- 1)/ 2;
	if (y_im> dpy_height- NPIX) y_im= dpy_height- NPIX;
	// recuperer l'image de l'écran entre (x_im, y_im) et (x_im+ NPIX, y_im+ NPIX)
	image= XGetImage(dpy, wroot, x_im, y_im, NPIX, NPIX, XAllPlanes(), ZPixmap);

	// Partie gauche
	// Dessin d'un rectangle pour chaque pixel
	r= g= b= 0.;
	for (i=0; i<NPIX; i++)
		for (j=0; j<NPIX; j++)
		{
			c->pixel= XGetPixel(image, i, j);
			// XQueryColor très lent => décomposition en red, green, blue de pixel
			//XQueryColor(dpy, cmap, c);
			c->red= c->pixel>> 16;
			c->green= (c->pixel>> 8) & 0xFF;
			c->blue= c->pixel & 0xFF;
			// Dessin des pixels zoomés
			XSetForeground(dpy, gc, c->pixel);
			XFillRectangle(dpy, w, gc, TPIX* i, TPIX* j, TPIX* (i+ 1), TPIX* (j+ 1));
			// Si le pixel est dans le diaphragme, on ajoute sa contribution à la valeur moyenne
			if ( (i>= (NPIX- 1)/2- diaphragme+ 1) && (i< NPIX- ((NPIX- 1)/2- diaphragme+ 1)) &&
				 (j>= (NPIX- 1)/2- diaphragme+ 1) && (j< NPIX- ((NPIX- 1)/2- diaphragme+ 1)) ){
				r+= (double)(c->red)/ ((2* diaphragme- 1)* (2* diaphragme- 1));
				g+= (double)(c->green)/ ((2* diaphragme- 1)* (2* diaphragme- 1));
				b+= (double)(c->blue)/ ((2* diaphragme- 1)* (2* diaphragme- 1));
			}
		}
	// Dessin carré du diaphragme
	XSetForeground(dpy, gc, black);
	XDrawRectangle(dpy, w, gc, ((NPIX- 1)/ 2- diaphragme+ 1)* TPIX, ((NPIX- 1)/ 2- diaphragme+ 1)* TPIX, TPIX* (2* diaphragme- 1), TPIX* (2* diaphragme- 1));

	// Partie centrale
	c->red= (unsigned int)(r); c->green= (unsigned int)(g); c->blue= (unsigned int)(b);
	c->pixel= c->blue+ (c->green<< 8)+ (c->red<< 16);
	XSetForeground(dpy, gc, c->pixel);
	XFillRectangle(dpy, w, gc, SUBWIDTH, 0, 2* SUBWIDTH, HEIGHT);

	// Partie droite
	sprintf(str[0], "X: %i; Y: %i", x, y);
	sprintf(str[1], "red : %i", c->red);
	sprintf(str[2], "green : %i", c->green);
	sprintf(str[3], "blue : %i", c->blue);
	sprintf(str[4], "diaph : %i", diaphragme);
	XSetForeground(dpy, gc, black);
	XFillRectangle(dpy, w, gc, 2* SUBWIDTH, 0, WIDTH, HEIGHT);
	XSetForeground(dpy, gc, white);
	for (i=0; i<5; i++)
		XDrawString(dpy, w, gc, 5+ 2* SUBWIDTH, 20*(i+ 1), str[i], strlen(str[i]));
	
	// Dessiner tout ca dans la fenetre
	XFlush(dpy);
}


// Initialisation
void init(){
	dpy= XOpenDisplay(NULL);
	if (dpy== NULL){
		printf("Pas de display\n");
		exit(1);
	}
	dpy_width= DisplayWidth(dpy, DefaultScreen(dpy));
	dpy_height= DisplayHeight(dpy, DefaultScreen(dpy));
	black= BlackPixel(dpy, DefaultScreen(dpy));
	white= WhitePixel(dpy, DefaultScreen(dpy));
	wroot= DefaultRootWindow(dpy);
	
	// Création fenetre
	w= XCreateSimpleWindow(dpy, wroot, 0, 0, WIDTH, HEIGHT, 0, black, black);
	// Donner un titre à la fenetre
	title= malloc(sizeof(XTextProperty));
	title->value= (unsigned char *) "Colorimetre numerique";
	title->encoding= XA_STRING;
	title->format= 8;
	title->nitems= strlen((char *) title->value);
	XSetWMName(dpy, w, title);
	
	// Selectionner events que l'on veut capter
	XSelectInput(dpy, w, StructureNotifyMask | KeyPressMask | ExposureMask);
	// Afficher fenetre
	XMapWindow(dpy, w);
	// Creer un "Graphics Context"
	gc= XCreateGC(dpy, w, 0, NULL);
	// cmap Utile à XQueryColor : désactivé
	//cmap= DefaultColormap(dpy, DefaultScreen(dpy));
	c= malloc(sizeof(XColor));
	diaphragme= 1;
	
	// Attendre MapNotify event
	for(;;){
		XNextEvent(dpy, &e);
		if (e.type == MapNotify)
			break;
	}

	XSync(dpy, False);
	// Grabber le curseur en lui assignant une forme (ici XC_cross)
	XGrabPointer(dpy, wroot, True, PointerMotionMask, GrabModeAsync, GrabModeAsync, wroot, XCreateFontCursor(dpy, XC_cross), CurrentTime);
	
	// Déplacement du curseur au milieu de l'écran et 1er dessin
	x= dpy_width/ 2; y= dpy_height/ 2;
	XWarpPointer(dpy, None, wroot, 0, 0, 0, 0, x, y);
	redraw();
}



// -----------------------------------------------------------
// Point entrée application
// -----------------------------------------------------------
void main()
{
	// Initialiser les variables
	init();

	// Boucle principale
	for(;;){
		XNextEvent(dpy, &e);
		
		// a : réduire diaphragme
		// z : augmenter diaphragme
		// esc : sortir du programme
		if (e.type== KeyPress){
			if (XLookupKeysym(&e.xkey, 0)== XK_a){
				diaphragme--; if (diaphragme< 1) diaphragme= 1;
				redraw();
			}
			if (XLookupKeysym(&e.xkey, 0)== XK_z){
				diaphragme++; if (2* diaphragme- 1> NPIX) diaphragme--;
				redraw();
			}
			else if (XLookupKeysym(&e.xkey, 0)== XK_Escape){
				break;
			}
		}
		// Mouvement curseur => redessiner fenetre
		else if (e.type== MotionNotify){
			x= e.xmotion.x; y= e.xmotion.y;
			redraw();
		}
	}

	// Libérer les resources
	XFree(image);
	XCloseDisplay(dpy);
	free(c);
	free(title);
}

 Conclusion

Toutes les remarques sont les bienvenues.


 Sources du même auteur

Source avec Zip Source avec une capture BOIDS : SIMULATION DE VOLS D'OISEAUX
Source avec une capture HALLEY MAP

 Sources de la même categorie

Source avec Zip CLASSE DE GESTION DE PROCESSUS par CptPingu
Source avec Zip TRAITEMENT D'IMAGE PGM par Jios
Source avec Zip TRAITEMENTS D'IMAGES AU FORMAT PGM AVEC LES ALGORITHMES DE C... par lemout
Source avec Zip ALGORITHME ACO INTERFACE GTK par RyBeN
Source avec Zip COMPRESSER SES SAUVEGARDES SMSBACKUPRESTORE (ANDROID) EN C A... par ThalLab

 Sources en rapport avec celle ci

Source avec Zip LINUX: UTILISATION ETHTOOL (TEST DU LIEN ETHERNET, VITESSE, ... par Twinuts
Source avec Zip TRAITEMENT D'IMAGE PGM par Jios
Source avec Zip Source avec une capture SOKOBAN EN C POUR DÉBUTANT (VERSION AMÉLIORÉE BASÉE SUR LE T... par eustatika
Source avec Zip [MYLIB] GESTION DE FICHIERS par Galaad2908
Source avec Zip LINUX USB BOOT LEGER par patatalo

Commentaires et avis

Commentaire de g3g3 le 09/01/2012 14:37:57

library = bibliothèque en français à moins que tu ne fasse payer tes fonctions ...

Commentaire de alec078 le 27/01/2012 13:06:43

Voici les modifications que j'ai effectuées pour que cela compile:

$ uname -a
Linux lucid 2.6.32-34-generic #77-Ubuntu SMP Tue Sep 13 19:39:17 UTC 2011 x86_64 GNU/Linux

$ lsb_release -a
[...]
Description: Ubuntu 10.04.3 LTS

J'ai du caster ces 2 malloc:

$ g++ -o color color.cpp -lX11
color.cpp: In function 'void init()':
color.cpp:111: error: invalid conversion from 'void*' to 'XTextProperty*'
color.cpp:125: error: invalid conversion from 'void*' to 'XColor*'
color.cpp: At global scope:
color.cpp:144: error: '::main' must return 'int'

1/
title=(XTextProperty *) malloc(sizeof(XTextProperty));
2/
c= (XColor *) malloc(sizeof(XColor));

puis renvoyer un int plutôt que void dans le main, ce qui est plus dans la norme.

Le programme fonctionne comme prévu pour ce qui est de la colorimétrie.
Par contre changer le curseur en croix ne rend pas le pointage plus précis, c'est le rôle de la loupe.

Et surtout, et c'est ce qui rend le programme non fonctionnel, les événements X sont tous interceptés par l'application, ce qui rend son utilisation compliquée; quand on en arrive au point d'utiliser un colorimètre, c'est qu'on est en train de programmer, et qu'on a besoin de ces valeurs (bien souvent plusieurs en série si on veut les couleurs dans un dégrade). Et obliger l'utilisateur a quitter et relancer l'application, entre chaque valeur, sans compter qu'il doit compter sur sa mémoire entre deux.

Pourquoi ne pas juste dumper les valeurs aux points cliqués ?

Commentaire de valchek le 30/01/2012 09:40:26

Bonjour Alec078

Pour ce qui est des problèmes de compilation, je pense que c'est lié au binaire utilisé : g++ au lieu de gcc. Ce code est en C.
Sinon en ce qui concerne la remarque sur la non fonctionnalité du programme, je crois comprendre ce que tu dis; j'ai fais ce bout de code car j'avais besoin d'un programme équivalent à celui existant sur Mac, comme précisé dans la description; je m'en sers en peinture lorsque j'ai un modèle sur écran et que j'ai un doute sur la couleur d'une portion de l'image. Je n'ai donc pas l'utilité de récupérer ces valeurs dans un programme... Mais cela pourrait être une amélioration de ce code, assez simple à mettre en place je pense.

Bonne journée

Commentaire de alec078 le 30/01/2012 12:00:56

Pour la compilation, c'est bien lié au compilateur: par réflexe, ne faisant que rarement du C, j'avais le source mis dans un fichier d'extension cpp. Ce qui donne:
$ gcc -o color color.cpp -lX11
/tmp/ccZ6jt2n.o:(.eh_frame+0x12): undefined reference to `__gxx_personality_v0'
$ gcc -o color color.c -lX11
# OK

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

portage Linux vers visual C++ [ par acsx ] Salut,J'ai un programme écrit en C sous Linux et je souhaite le faire tourner sous Visual C++ 6.0 sous Windows.J'ai donc créé un projet win32 et intég Problème pour ouvrir une fenetre et écrire dedans sous Linux en C++ [ par Nicolas ] Je souhaiterais savoir comment ouvrir une fenetre sous linux en C++(pour écrire dedans avec des "cout")MerciA+ Nicolas Problème pour ouvrir une fenetre sous linux en c++ [ par Nicolas ] Je souhaiterais savoir comment ouvrir une fenetre sous linux en C++(pour écrire dedans avec des "cout")MerciA+ Nicolas Problème pour ouvrir une fenetre sous linux en c++ [ par Nicolas ] Je souhaiterais savoir comment ouvrir une fenetre sous linux en C++(pour écrire dedans avec des "cout")MerciA+ Nicolas Linux et opengl [ par FleXus ] Helloje voudrais savoir comment utiliser et compiler un prog avec les fonctions d'opengl sous linux(j'utilise actuellement Kdevelop clone de visual c+ processus sous linux [g++] [ par satanik_mike ] Bonjour,Je suis en train de d?velopper un serveur POP, SMTP en C++ sous linux, mais je bloque sur une petit probl?me d'ex?cution.J'ai fait un ex?cutbl Comment compiler avec GTK (sous linux) [ par defcon ] Bonjour à touse, voilà, je voulais savoir comment compiler mon code source souis linux (avec librairie GTK)???Merci d'avance pour votre réponse.Amical Comment compiler GTK (sous linux)??? [ par defcon ] Bonjour à touse, voilà, je voulais savoir comment compiler mon code source souis linux (avec librairie GTK)???Merci d'avance pour votre réponse.Amical Thread [ par Vince007 ] Bonjour, je vous laisse se message pour savoir si qqu'un qui connait bien les thread et les sémaphores sous Linux pourrait m'indiquer la méthode de co codes sources linux [ par Edzome ] salut à tous !!!je désire savoir ou est-ce que je peux me procurer le code source du SE linux...merci d'avance...


Nos sponsors


Sondage...

CalendriCode

Mai 2013
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,061 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales