diff --git a/Makefile b/Makefile index 8d954e6c..b95ea7f3 100644 --- a/Makefile +++ b/Makefile @@ -44,7 +44,7 @@ else else BIN = grafx2 CFGBIN = gfxcfg - COPT = -Wall -c -g `sdl-config --cflags` + COPT = -W -Wall -c -g `sdl-config --cflags` LOPT = `sdl-config --libs` CC = gcc OBJDIR = obj/unix diff --git a/Makefile.dep b/Makefile.dep index f44c5776..d8cdab71 100644 --- a/Makefile.dep +++ b/Makefile.dep @@ -1,44 +1,44 @@ -obj/win32/SFont.o: SFont.c SFont.h -obj/win32/aide.o: aide.c const.h struct.h global.h loadsave.h divers.h graph.h \ +$(OBJDIR)/SFont.o: SFont.c SFont.h +$(OBJDIR)/aide.o: aide.c const.h struct.h global.h loadsave.h divers.h graph.h \ moteur.h tables_aide.h aide.h sdlscreen.h -obj/win32/boutons.o: boutons.c const.h struct.h global.h loadsave.h divers.h \ +$(OBJDIR)/boutons.o: boutons.c const.h struct.h global.h loadsave.h divers.h \ graph.h moteur.h readline.h files.h init.h boutons.h operatio.h pages.h \ erreurs.h readini.h saveini.h shade.h io.h aide.h sdlscreen.h -obj/win32/clavier.o: clavier.c global.h struct.h const.h loadsave.h -obj/win32/divers.o: divers.c struct.h const.h sdlscreen.h global.h loadsave.h \ +$(OBJDIR)/clavier.o: clavier.c global.h struct.h const.h loadsave.h +$(OBJDIR)/divers.o: divers.c struct.h const.h sdlscreen.h global.h loadsave.h \ graph.h erreurs.h boutons.h moteur.h divers.h clavier.h -obj/win32/files.o: files.c const.h struct.h global.h loadsave.h graph.h divers.h \ +$(OBJDIR)/files.o: files.c const.h struct.h global.h loadsave.h graph.h divers.h \ erreurs.h linux.h -obj/win32/gfxcfg.o: gfxcfg.c SFont.h struct.h const.h clavier.h io.h hotkeys.h -obj/win32/graph.o: graph.c sdlscreen.h struct.h const.h graph.h divers.h moteur.h \ +$(OBJDIR)/gfxcfg.o: gfxcfg.c SFont.h struct.h const.h clavier.h io.h hotkeys.h +$(OBJDIR)/graph.o: graph.c sdlscreen.h struct.h const.h graph.h divers.h moteur.h \ boutons.h pages.h global.h loadsave.h erreurs.h -obj/win32/init.o: init.c const.h struct.h global.h loadsave.h graph.h boutons.h \ +$(OBJDIR)/init.o: init.c const.h struct.h global.h loadsave.h graph.h boutons.h \ palette.h aide.h operatio.h divers.h erreurs.h clavier.h io.h hotkeys.h -obj/win32/io.o: io.c struct.h const.h io.h -obj/win32/linux.o: linux.c -obj/win32/loadsave.o: loadsave.c const.h struct.h global.h loadsave.h graph.h \ +$(OBJDIR)/io.o: io.c struct.h const.h io.h +$(OBJDIR)/linux.o: linux.c +$(OBJDIR)/loadsave.o: loadsave.c const.h struct.h global.h loadsave.h graph.h \ divers.h pages.h op_c.h boutons.h erreurs.h linux.h io.h sdlscreen.h -obj/win32/main.o: main.c const.h struct.h global.h loadsave.h graph.h divers.h \ +$(OBJDIR)/main.o: main.c const.h struct.h global.h loadsave.h graph.h divers.h \ init.h boutons.h moteur.h pages.h files.h sdlscreen.h erreurs.h \ readini.h saveini.h linux.h io.h -obj/win32/moteur.o: moteur.c const.h struct.h global.h loadsave.h graph.h divers.h \ +$(OBJDIR)/moteur.o: moteur.c const.h struct.h global.h loadsave.h graph.h divers.h \ special.h boutons.h operatio.h shade.h erreurs.h linux.h sdlscreen.h -obj/win32/op_c.o: op_c.c op_c.h struct.h const.h erreurs.h -obj/win32/operatio.o: operatio.c const.h struct.h global.h loadsave.h divers.h \ +$(OBJDIR)/op_c.o: op_c.c op_c.h struct.h const.h erreurs.h +$(OBJDIR)/operatio.o: operatio.c const.h struct.h global.h loadsave.h divers.h \ moteur.h graph.h operatio.h boutons.h pages.h erreurs.h -obj/win32/pages.o: pages.c global.h struct.h const.h loadsave.h pages.h graph.h \ +$(OBJDIR)/pages.o: pages.c global.h struct.h const.h loadsave.h pages.h graph.h \ erreurs.h linux.h -obj/win32/palette.o: palette.c const.h struct.h global.h loadsave.h divers.h \ +$(OBJDIR)/palette.o: palette.c const.h struct.h global.h loadsave.h divers.h \ graph.h moteur.h readline.h boutons.h pages.h aide.h sdlscreen.h -obj/win32/readini.o: readini.c const.h global.h struct.h loadsave.h graph.h -obj/win32/readline.o: readline.c const.h struct.h global.h loadsave.h graph.h \ +$(OBJDIR)/readini.o: readini.c const.h global.h struct.h loadsave.h graph.h +$(OBJDIR)/readline.o: readline.c const.h struct.h global.h loadsave.h graph.h \ divers.h erreurs.h linux.h sdlscreen.h -obj/win32/saveini.o: saveini.c const.h global.h struct.h loadsave.h readini.h \ +$(OBJDIR)/saveini.o: saveini.c const.h global.h struct.h loadsave.h readini.h \ files.h erreurs.h graph.h -obj/win32/sdlscreen.o: sdlscreen.c global.h struct.h const.h loadsave.h sdlscreen.h \ +$(OBJDIR)/sdlscreen.o: sdlscreen.c global.h struct.h const.h loadsave.h sdlscreen.h \ divers.h erreurs.h graph.h -obj/win32/shade.o: shade.c global.h struct.h const.h loadsave.h graph.h moteur.h \ +$(OBJDIR)/shade.o: shade.c global.h struct.h const.h loadsave.h graph.h moteur.h \ divers.h readline.h aide.h sdlscreen.h -obj/win32/special.o: special.c const.h struct.h global.h loadsave.h graph.h \ +$(OBJDIR)/special.o: special.c const.h struct.h global.h loadsave.h graph.h \ moteur.h -obj/win32/version.o: version.c +$(OBJDIR)/version.o: version.c diff --git a/op_c.c b/op_c.c index f52de46e..52e2f49e 100644 --- a/op_c.c +++ b/op_c.c @@ -24,8 +24,10 @@ #include #include #include + #include "op_c.h" #include "erreurs.h" +#include "graph.h" #undef OPTIMISATIONS_ASSEMBLEUR @@ -807,79 +809,77 @@ void CS_Generer_TC_et_Palette(ClusterSet * cs,Table_conversion * tc,struct Compo } } - - ///////////////////////////////////////////////////////////////////////////// -///////////////////////////////////////// M‚thodes de gestion des d‚grad‚s // +///////////////////////////////////////// Méthodes de gestion des dégradés // ///////////////////////////////////////////////////////////////////////////// void DS_Init(DegradeSet * ds,ClusterSet * cs) { - ds->degrades[0].nbcouleurs=1; - ds->degrades[0].min=cs->clusters[0].h; - ds->degrades[0].max=cs->clusters[0].h; - ds->degrades[0].hue=cs->clusters[0].h; - // Et hop : le 1er ensemble de d‚grad‚s est initialis‚ - ds->nb=1; + ds->degrades[0].nbcouleurs=1; + ds->degrades[0].min=cs->clusters[0].h; + ds->degrades[0].max=cs->clusters[0].h; + ds->degrades[0].hue=cs->clusters[0].h; + // Et hop : le 1er ensemble de d‚grad‚s est initialis‚ + ds->nb=1; } DegradeSet * DS_New(ClusterSet * cs) { - DegradeSet * n; + DegradeSet * n; - n=(DegradeSet *)malloc(sizeof(DegradeSet)); - if (n!=0) - { - // On recopie les paramŠtres demand‚s - n->nbmax=cs->nbmax; - - // On tente d'allouer la table - n->degrades=(Degrade *)malloc((n->nbmax)*sizeof(Degrade)); - if (n->degrades!=0) - // C'est bon! On initialise - DS_Init(n,cs); - else + n=(DegradeSet *)malloc(sizeof(DegradeSet)); + if (n!=0) { - // Table impossible … allouer - free(n); - n=0; - } - } + // On recopie les paramŠtres demand‚s + n->nbmax=cs->nbmax; - return n; + // On tente d'allouer la table + n->degrades=(Degrade *)malloc((n->nbmax)*sizeof(Degrade)); + if (n->degrades!=0) + // C'est bon! On initialise + DS_Init(n,cs); + else + { + // Table impossible … allouer + free(n); + n=0; + } + } + + return n; } void DS_Delete(DegradeSet * ds) { - free(ds->degrades); - free(ds); + free(ds->degrades); + free(ds); } void DS_Generer(DegradeSet * ds,ClusterSet * cs) { - int ic,id; // Les indices de parcours des ensembles - int mdegr; // Meilleur d‚grad‚ - int mdiff; // Meilleure diff‚rence de chrominance - int diff; // Diff‚rence de chrominance courante + int ic,id; // Les indices de parcours des ensembles + int mdegr; // Meilleur d‚grad‚ + int mdiff; // Meilleure diff‚rence de chrominance + int diff; // Diff‚rence de chrominance courante - // Pour chacun des clusters … traiter - for (ic=1;icnb;ic++) - { - // On recherche le d‚grad‚ le plus proche de la chrominance du cluster - mdegr=-1; - mdiff=99999999; - for (id=0;idnb;id++) + // Pour chacun des clusters … traiter + for (ic=1;icnb;ic++) { - diff=abs(cs->clusters[ic].h - ds->degrades[id].hue); - if ((mdiff>diff) && (diff<16)) - { - mdegr=id; - mdiff=diff; - } - } + // On recherche le d‚grad‚ le plus proche de la chrominance du cluster + mdegr=-1; + mdiff=99999999; + for (id=0;idnb;id++) + { + diff=abs(cs->clusters[ic].h - ds->degrades[id].hue); + if ((mdiff>diff) && (diff<16)) + { + mdegr=id; + mdiff=diff; + } + } - // Si on a trouv‚ un d‚grad‚ dans lequel inclure le cluster - if (mdegr!=-1) + // Si on a trouv‚ un d‚grad‚ dans lequel inclure le cluster + if (mdegr!=-1) { // On met … jour le d‚grad‚ if (cs->clusters[ic].h < ds->degrades[mdegr].min) diff --git a/op_c.h b/op_c.h index 5e374cbd..0b4ee842 100644 --- a/op_c.h +++ b/op_c.h @@ -147,6 +147,7 @@ void TC_Delete(Table_conversion * t); byte TC_Get(Table_conversion * t,int r,int v,int b); void TC_Set(Table_conversion * t,int r,int v,int b,byte i); +void rgb2hl(int r, int v,int b, byte* h, byte*l); ///////////////////////////////////////////////////////////////////////////// @@ -186,8 +187,6 @@ void CS_Generer(ClusterSet * cs,Table_occurence * to); void CS_Calculer_teintes(ClusterSet * cs,Table_occurence * to); void CS_Generer_TC_et_Palette(ClusterSet * cs,Table_conversion * tc,struct Composantes * palette); - - ///////////////////////////////////////////////////////////////////////////// //////////////////////////// M‚thodes de gestion des ensembles de d‚grad‚s // ///////////////////////////////////////////////////////////////////////////// diff --git a/palette.c b/palette.c index 68bbb786..3b9a98cb 100644 --- a/palette.c +++ b/palette.c @@ -32,6 +32,10 @@ #include "pages.h" #include "aide.h" #include "sdlscreen.h" +#include "erreurs.h" +#include "op_c.h" + +byte Palette_mode_RGB = 1; // Indique si on est en HSV ou en RGB // --------------------------- Menu des palettes ----------------------------- char * Libelle_reduction_palette[7]= @@ -763,10 +767,10 @@ void Bouton_Palette(void) Fenetre_Definir_bouton_normal( 6,17,59,14,"Default",3,1,SDLK_f); // 5 Fenetre_Definir_bouton_normal(66,17,29,14,"Gry" ,1,1,SDLK_g); // 6 - Fenetre_Definir_bouton_normal( 6,47,59,14,"Swap" ,1,1,SDLK_s); // 7 - Fenetre_Definir_bouton_normal(66,47,59,14,"X-Swap" ,1,1,SDLK_x); // 8 - Fenetre_Definir_bouton_normal( 6,62,59,14,"Copy" ,1,1,SDLK_c); // 9 - Fenetre_Definir_bouton_normal(66,62,59,14,"Spread" ,4,1,SDLK_e); // 10 + Fenetre_Definir_bouton_normal(66,47,29,14,"Swp" ,1,1,SDLK_s); // 7 + Fenetre_Definir_bouton_normal( 6,47,59,14,"X-Swap" ,1,1,SDLK_x); // 8 + Fenetre_Definir_bouton_normal(66,32,29,14,"Cpy" ,1,1,SDLK_c); // 9 + Fenetre_Definir_bouton_normal( 6,32,59,14,"Spread" ,4,1,SDLK_e); // 10 Fenetre_Definir_bouton_normal(239,20,51,14,"Reduce" ,1,1,SDLK_r); // 11 Print_dans_fenetre(241,41,"to",CM_Fonce,CM_Clair); @@ -787,10 +791,13 @@ void Bouton_Palette(void) Fenetre_Definir_bouton_normal(266,165,12,11,"-",0,1,SDLK_KP_MINUS); // 19 Fenetre_Definir_bouton_normal(96,17,29,14,"Neg" ,1,1,SDLK_n); // 20 - Fenetre_Definir_bouton_normal( 6,32,59,14,"Invert" ,1,1,SDLK_i); // 21 - Fenetre_Definir_bouton_normal(66,32,59,14,"X-Inv." ,5,1,SDLK_v); // 22 + Fenetre_Definir_bouton_normal(66,62,29,14,"Inv" ,1,1,SDLK_i); // 21 + Fenetre_Definir_bouton_normal( 6,62,59,14,"X-Inv." ,5,1,SDLK_v); // 22 Fenetre_Definir_bouton_saisie(263,39,3); // 23 + + Fenetre_Definir_bouton_normal(96,32,29,14,"HSV" ,1,1,SDLK_n); // 24 + Fenetre_Definir_bouton_normal(96,47,29,14,"Sort" ,1,1,SDLK_o); // 25 // Affichage du facteur de réduction de la palette Num2str(Reduce_Nb_couleurs,Chaine,3); Print_dans_fenetre(265,41,Chaine,CM_Noir,CM_Clair); @@ -1616,17 +1623,73 @@ void Bouton_Palette(void) } Afficher_curseur(); break; + + case 24 : // HSV <> RGB + // TODO unfinished ! + if(Palette_mode_RGB) + { + // On passe en HSV + Print_dans_fenetre(184,71,"H",CM_Fonce,CM_Clair); + Print_dans_fenetre(211,71,"S",CM_Fonce,CM_Clair); + Print_dans_fenetre(238,71,"V",CM_Fonce,CM_Clair); + } + else + { + // On passe en RGB + Print_dans_fenetre(184,71,"R",CM_Fonce,CM_Clair); + Print_dans_fenetre(211,71,"G",CM_Fonce,CM_Clair); + Print_dans_fenetre(238,71,"B",CM_Fonce,CM_Clair); + } + + Palette_mode_RGB = !Palette_mode_RGB ; + break; + + case 25 : // Sort palette + { + int h = 0, l = 0; + int oh=0,ol=0; // Valeur pour la couleur précédente + int swap=1; + + while(swap==1) + { + swap=0; + h=0;l=0; + for(Couleur_temporaire=0;Couleur_temporaire<256;Couleur_temporaire++) + { + oh=h; ol=l; + // On trie par Chrominance (H) et Luminance (L) + rgb2hl(Palette_de_travail[Couleur_temporaire].R, + Palette_de_travail[Couleur_temporaire].V, + Palette_de_travail[Couleur_temporaire].B,&h,&l); + + // Note : comparer seulement H et L ne suffit pas toujours à trancher... + // donc on regarde aussi les composantes R G B s'il y a un doute + if((h