From 7c658a6855fce92d904fd19ccc08d146da3d50c4 Mon Sep 17 00:00:00 2001 From: Adrien Destugues Date: Wed, 3 Dec 2008 20:50:52 +0000 Subject: [PATCH] Some fixes to the floyd steinberg dithering. The error was added to the neughbour pixels, it is now substracted, the results are much better. However, the palette seems to lack saturated colors (in comparison to the one generated b ygimp, wich gives more dithering, but better overall subjective ressemblance to the 24bit image. Maybe having less dithering is fine for us, as we are in a pixelart painting program afterall... git-svn-id: svn://pulkomandy.tk/GrafX2/trunk@369 416bcca6-2ee7-4201-b75f-2eb2f807beb1 --- gfx2.cfg | Bin 10062 -> 10062 bytes op_c.c | 64 ++++++++++++++++++++++++-------------------------- struct.h | 2 +- tables_aide.h | 10 ++++---- 4 files changed, 37 insertions(+), 39 deletions(-) diff --git a/gfx2.cfg b/gfx2.cfg index 11a609472f23e343d362a103acaa1ef00520242b..1b8da8c57150cff8bff58700c4d1863f12971761 100644 GIT binary patch delta 52 zcmX@-cg}Bv89O7>W=Cljj?MPsY&<{$$Z}QYWD;Z)&}RUG6+p}g#0SoAj#qup2mo3x B3`zh1 delta 52 zcmX@-cg}Bv89O86W=Cljj?MPsY&<{$$Z}QYWD;Z&&}RUG6+p}g#DD&8j#qup2moB% B47LCO diff --git a/op_c.c b/op_c.c index 87420485..b4326525 100644 --- a/op_c.c +++ b/op_c.c @@ -178,7 +178,7 @@ Table_conversion * TC_New(int nbb_r,int nbb_v,int nbb_b) int taille; n=(Table_conversion *)malloc(sizeof(Table_conversion)); - if (n!=0) + if (n!=NULL) { // On recopie les paramŠtres demand‚s n->nbb_r=nbb_r; @@ -199,14 +199,14 @@ Table_conversion * TC_New(int nbb_r,int nbb_v,int nbb_b) // On tente d'allouer la table taille=(n->rng_r)*(n->rng_v)*(n->rng_b); n->table=(byte *)malloc(taille); - if (n->table!=0) + if (n->table!=NULL) // C'est bon! memset(n->table,0,taille); // Inutile, mais plus propre else { // Table impossible … allouer free(n); - n=0; + n=NULL; } } @@ -663,12 +663,16 @@ ClusterSet * CS_New(int nbmax,Table_occurence * to) { // On recopie les paramŠtres demand‚s n->nbmax=TO_Compter_couleurs(to); + + // On vient de compter le nombre de couleurs existantes, s'il est plus grand que 256 on limite à 256 (nombre de couleurs voulu au final) if (n->nbmax>nbmax) + { n->nbmax=nbmax; + } // On tente d'allouer la table n->clusters=(Cluster *)malloc(nbmax*sizeof(Cluster)); - if (n->clusters!=0) + if (n->clusters!=NULL) // C'est bon! On initialise CS_Init(n,to); else @@ -761,9 +765,11 @@ void CS_Generer(ClusterSet * cs,Table_occurence * to) Cluster_Analyser(&Nouveau1,to); Cluster_Analyser(&Nouveau2,to); - // On met ces deux nouveaux clusters dans le clusterSet - CS_Set(cs,&Nouveau1); - CS_Set(cs,&Nouveau2); + // On met ces deux nouveaux clusters dans le clusterSet... sauf s'ils sont vides + if(Nouveau1.occurences>0) + CS_Set(cs,&Nouveau1); + if(Nouveau2.occurences>0) + CS_Set(cs,&Nouveau2); } } @@ -881,7 +887,7 @@ DegradeSet * DS_New(ClusterSet * cs) DegradeSet * n; n=(DegradeSet *)malloc(sizeof(DegradeSet)); - if (n!=0) + if (n!=NULL) { // On recopie les paramŠtres demand‚s n->nbmax=cs->nbmax; @@ -1113,9 +1119,13 @@ int Valeur_modifiee(int valeur,int modif) { valeur+=modif; if (valeur<0) + { valeur=0; + } else if (valeur>255) + { valeur=255; + } return valeur; } @@ -1132,8 +1142,7 @@ void Convert_bitmap_24B_to_256_Floyd_Steinberg(Bitmap256 Dest,Bitmap24B Source,i Bitmap256 D; int Pos_X,Pos_Y; int Rouge,Vert,Bleu; - int DRouge,DVert,DBleu; - int ERouge,EVert,EBleu; + float ERouge,EVert,EBleu; // On initialise les variables de parcours: Courant =Source; // Le pixel dont on s'occupe @@ -1157,14 +1166,9 @@ void Convert_bitmap_24B_to_256_Floyd_Steinberg(Bitmap256 Dest,Bitmap24B Source,i *D=TC_Get(tc,Rouge,Vert,Bleu); // Puis on calcule pour chaque composante l'erreur dûe à l'approximation - Rouge=palette[*D].R - Rouge; - Vert =palette[*D].V - Vert; - Bleu =palette[*D].B - Bleu; - - // On initialise la quantité d'erreur diffusée - DRouge=Rouge; - DVert =Vert; - DBleu =Bleu; + Rouge-=palette[*D].R; + Vert -=palette[*D].V; + Bleu -=palette[*D].B; // Et dans chaque pixel voisin on propage l'erreur // A droite: @@ -1178,9 +1182,6 @@ void Convert_bitmap_24B_to_256_Floyd_Steinberg(Bitmap256 Dest,Bitmap24B Source,i C_plus1->V=Valeur_modifiee(C_plus1->V,EVert ); C_plus1->B=Valeur_modifiee(C_plus1->B,EBleu ); } - DRouge-=ERouge; - DVert -=EVert; - DBleu -=EBleu; // En bas à gauche: if (Pos_Y+1V=Valeur_modifiee(S_moins1->V,EVert ); S_moins1->B=Valeur_modifiee(S_moins1->B,EBleu ); } - DRouge-=ERouge; - DVert -=EVert; - DBleu -=EBleu; // En bas: - ERouge=(Rouge/4); - EVert =(Vert /4); - EBleu =(Bleu /4); + ERouge=(Rouge*5/16.0); + EVert =(Vert*5 /16.0); + EBleu =(Bleu*5 /16.0); Suivant->R=Valeur_modifiee(Suivant->R,ERouge); Suivant->V=Valeur_modifiee(Suivant->V,EVert ); Suivant->B=Valeur_modifiee(Suivant->B,EBleu ); - DRouge-=ERouge; - DVert -=EVert; - DBleu -=EBleu; // En bas à droite: if (Pos_X+1R=Valeur_modifiee(S_plus1->R,DRouge); - S_plus1->V=Valeur_modifiee(S_plus1->V,DVert ); - S_plus1->B=Valeur_modifiee(S_plus1->B,DBleu ); + ERouge=(Rouge/16.0); + EVert =(Vert /16.0); + EBleu =(Bleu /16.0); + S_plus1->R=Valeur_modifiee(S_plus1->R,ERouge); + S_plus1->V=Valeur_modifiee(S_plus1->V,EVert ); + S_plus1->B=Valeur_modifiee(S_plus1->B,EBleu ); } } diff --git a/struct.h b/struct.h index 97a1f43c..6baf15d0 100644 --- a/struct.h +++ b/struct.h @@ -49,7 +49,7 @@ typedef void (* fonction_display_zoom) (word,word,word,byte *); typedef void (* fonction_display_brush_Color_zoom) (word,word,word,word,word,word,byte,word,byte *); typedef void (* fonction_display_brush_Mono_zoom) (word,word,word,word,word,word,byte,byte,word,byte *); -struct Composantes +struct __attribute__ ((__packed__)) Composantes { byte R; byte V; diff --git a/tables_aide.h b/tables_aide.h index f4242ea7..de12379f 100644 --- a/tables_aide.h +++ b/tables_aide.h @@ -427,11 +427,11 @@ static const T_TABLEAIDE TableAideCredits[] = AIDE_TEXTE("") AIDE_BOLD(" BUGFINDERS") // AIDE_TEXTE("") // - AIDE_TEXTE(" Ced El Topo fallenblood") - AIDE_TEXTE(" Frost Grimmy keito") - AIDE_TEXTE(" kusma Lord Graga mind") - AIDE_TEXTE(" MooZ richienyhus tempest") - AIDE_TEXTE(" titus^Rab tobe") + AIDE_TEXTE(" BDCIron Ced El Topo ") + AIDE_TEXTE(" fallenblood Frost Grimmy ") + AIDE_TEXTE(" keito kusma Lord Graga ") + AIDE_TEXTE(" mind MooZ richienyhus") + AIDE_TEXTE(" tempest titus^Rab tobe") AIDE_TEXTE("") AIDE_BOLD (" OUR HOMEPAGE") // AIDE_TEXTE("") //