Fixes all the tabulation problems.

git-svn-id: svn://pulkomandy.tk/GrafX2/trunk@465 416bcca6-2ee7-4201-b75f-2eb2f807beb1
This commit is contained in:
Adrien Destugues
2009-01-05 22:55:30 +00:00
parent bdf86b06a8
commit 154f5e824a
18 changed files with 841 additions and 841 deletions

230
op_c.c
View File

@@ -85,16 +85,16 @@ void RGBtoHSL(int r,int g,int b,byte * hr,byte * sr,byte* lr)
else
{
if (l<=0.5)
s = (max - min) / (max + min);
s = (max - min) / (max + min);
else
s = (max - min) / (2 - (max + min));
s = (max - min) / (2 - (max + min));
if (max == rd)
h = 42.5 * (gd-bd)/(max-min);
h = 42.5 * (gd-bd)/(max-min);
else if (max == gd)
h = 42.5 * (bd-rd)/(max-min)+85;
h = 42.5 * (bd-rd)/(max-min)+85;
else
h = 42.5 * (rd-gd)/(max-min)+170;
h = 42.5 * (rd-gd)/(max-min)+170;
if (h<0) h+=255;
}
@@ -111,8 +111,8 @@ void HSLtoRGB(byte H,byte S,byte L, byte* R, byte* G, byte* B)
if(S==0)
{
*R=*G=*B=L;
return;
*R=*G=*B=L;
return;
}
hf = H / 255.0;
@@ -120,9 +120,9 @@ void HSLtoRGB(byte H,byte S,byte L, byte* R, byte* G, byte* B)
sf = S / 255.0;
if (lf<=0.5)
q = lf*(1+sf);
q = lf*(1+sf);
else
q = lf+sf-lf*sf;
q = lf+sf-lf*sf;
p = 2*lf-q;
rf = hf + (1 / 3.0);
@@ -137,31 +137,31 @@ void HSLtoRGB(byte H,byte S,byte L, byte* R, byte* G, byte* B)
if (bf > 1) bf-=1;
if (rf < 1/6.0)
rf = p + ((q-p)*6*rf);
rf = p + ((q-p)*6*rf);
else if(rf < 0.5)
rf = q;
rf = q;
else if(rf < 2/3.0)
rf = p + ((q-p)*6*(2/3.0-rf));
rf = p + ((q-p)*6*(2/3.0-rf));
else
rf = p;
rf = p;
if (gf < 1/6.0)
gf = p + ((q-p)*6*gf);
gf = p + ((q-p)*6*gf);
else if(gf < 0.5)
gf = q;
gf = q;
else if(gf < 2/3.0)
gf = p + ((q-p)*6*(2/3.0-gf));
gf = p + ((q-p)*6*(2/3.0-gf));
else
gf = p;
gf = p;
if (bf < 1/6.0)
bf = p + ((q-p)*6*bf);
bf = p + ((q-p)*6*bf);
else if(bf < 0.5)
bf = q;
bf = q;
else if(bf < 2/3.0)
bf = p + ((q-p)*6*(2/3.0-bf));
bf = p + ((q-p)*6*(2/3.0-bf));
else
bf = p;
bf = p;
*R = rf * (255);
*G = gf * (255);
@@ -382,15 +382,15 @@ void Cluster_Analyser(Cluster * c,Table_occurence * to)
for (v=c->vmin<<8;v<=c->vmax<<8;v+=1<<8)
for (b=c->bmin;b<=c->bmax;b++)
{
nbocc=to->table[r + v + b]; // TO_Get
nbocc=to->table[r + v + b]; // TO_Get
if (nbocc)
{
if (r<rmin) rmin=r;
else if (r>rmax) rmax=r;
else if (r>rmax) rmax=r;
if (v<vmin) vmin=v;
else if (v>vmax) vmax=v;
else if (v>vmax) vmax=v;
if (b<bmin) bmin=b;
else if (b>bmax) bmax=b;
else if (b>bmax) bmax=b;
c->occurences+=nbocc;
}
}
@@ -402,77 +402,77 @@ void Cluster_Analyser(Cluster * c,Table_occurence * to)
for(r=c->rmin<<16;r<=c->rmax<<16;r+=1<<16)
for(v=c->vmin<<8;v<=c->vmax<<8;v+=1<<8)
for(b=c->bmin;b<=c->bmax;b++)
{
if(to->table[r + v + b]) // TO_Get
{
rmin=r;
goto RMAX;
}
}
for(b=c->bmin;b<=c->bmax;b++)
{
if(to->table[r + v + b]) // TO_Get
{
rmin=r;
goto RMAX;
}
}
RMAX:
for(r=c->rmax<<16;r>=rmin;r-=1<<16)
for(v=c->vmin<<8;v<=c->vmax<<8;v+=1<<8)
for(b=c->bmin;b<=c->bmax;b++)
{
if(to->table[r + v + b]) // TO_Get
{
rmax=r;
goto VMIN;
}
}
for(b=c->bmin;b<=c->bmax;b++)
{
if(to->table[r + v + b]) // TO_Get
{
rmax=r;
goto VMIN;
}
}
VMIN:
for(v=c->vmin<<8;v<=c->vmax<<8;v+=1<<8)
for(r=rmin;r<=rmax;r+=1<<16)
for(b=c->bmin;b<=c->bmax;b++)
{
if(to->table[r + v + b]) // TO_Get
{
vmin=v;
goto VMAX;
}
}
for(b=c->bmin;b<=c->bmax;b++)
{
if(to->table[r + v + b]) // TO_Get
{
vmin=v;
goto VMAX;
}
}
VMAX:
for(v=c->vmax<<8;v>=vmin;v-=1<<8)
for(r=rmin;r<=rmax;r+=1<<16)
for(b=c->bmin;b<=c->bmax;b++)
{
if(to->table[r + v + b]) // TO_Get
{
vmax=v;
goto BMIN;
}
}
for(b=c->bmin;b<=c->bmax;b++)
{
if(to->table[r + v + b]) // TO_Get
{
vmax=v;
goto BMIN;
}
}
BMIN:
for(b=c->bmin;b<=c->bmax;b++)
for(r=rmin;r<=rmax;r+=1<<16)
for(v=vmin;v<=vmax;v+=1<<8)
{
if(to->table[r + v + b]) // TO_Get
{
bmin=b;
goto BMAX;
}
}
for(v=vmin;v<=vmax;v+=1<<8)
{
if(to->table[r + v + b]) // TO_Get
{
bmin=b;
goto BMAX;
}
}
BMAX:
for(b=c->bmax;b>=bmin;b--)
for(r=rmin;r<=rmax;r+=1<<16)
for(v=vmin;v<=vmax;v+=1<<8)
{
if(to->table[r + v + b]) // TO_Get
{
bmax=b;
goto ENDCRUSH;
}
}
for(v=vmin;v<=vmax;v+=1<<8)
{
if(to->table[r + v + b]) // TO_Get
{
bmax=b;
goto ENDCRUSH;
}
}
ENDCRUSH:
// Il faut quand même parcourir la partie utile du cluster, pour savoir combien il y a d'occurences
for(r=rmin;r<=rmax;r+=1<<16)
for(v=vmin;v<=vmax;v+=1<<8)
for(b=bmin;b<=bmax;b++)
{
c->occurences+=to->table[r + v + b]; // TO_Get
}
for(b=bmin;b<=bmax;b++)
{
c->occurences+=to->table[r + v + b]; // TO_Get
}
c->rmin=rmin>>16; c->rmax=rmax>>16;
c->vmin=vmin>>8; c->vmax=vmax>>8;
@@ -812,9 +812,9 @@ void CS_Generer(ClusterSet * cs,Table_occurence * to)
// On met ces deux nouveaux clusters dans le clusterSet... sauf s'ils sont vides
if(Nouveau1.occurences>0)
CS_Set(cs,&Nouveau1);
CS_Set(cs,&Nouveau1);
if(Nouveau2.occurences>0)
CS_Set(cs,&Nouveau2);
CS_Set(cs,&Nouveau2);
}
}
@@ -934,20 +934,20 @@ DegradeSet * DS_New(ClusterSet * cs)
n=(DegradeSet *)malloc(sizeof(DegradeSet));
if (n!=NULL)
{
// On recopie les paramŠtres demands
n->nbmax=cs->nbmax;
// On recopie les paramŠtres demands
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
{
// Table impossible … allouer
free(n);
n=0;
}
// 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;
@@ -969,21 +969,21 @@ void DS_Generer(DegradeSet * ds,ClusterSet * cs)
// Pour chacun des clusters … traiter
for (ic=1;ic<cs->nb;ic++)
{
// On recherche le dgrad le plus proche de la chrominance du cluster
mdegr=-1;
mdiff=99999999;
for (id=0;id<ds->nb;id++)
{
diff=abs(cs->clusters[ic].h - ds->degrades[id].hue);
if ((mdiff>diff) && (diff<16))
{
mdegr=id;
mdiff=diff;
}
}
// On recherche le dgrad le plus proche de la chrominance du cluster
mdegr=-1;
mdiff=99999999;
for (id=0;id<ds->nb;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 dgrad dans lequel inclure le cluster
if (mdegr!=-1)
// Si on a trouv un dgrad dans lequel inclure le cluster
if (mdegr!=-1)
{
// On met … jour le dgrad
if (cs->clusters[ic].h < ds->degrades[mdegr].min)
@@ -1042,10 +1042,10 @@ Table_conversion * Optimiser_palette(Bitmap24B image,int taille,struct Composant
{
// C'est bon, on a pu tout allouer
// On génère les clusters (avec l'algo du median cut)
// On génère les clusters (avec l'algo du median cut)
CS_Generer(cs,to);
// On calcule la teinte de chaque pixel (Luminance et chrominance)
// On calcule la teinte de chaque pixel (Luminance et chrominance)
CS_Calculer_teintes(cs,to);
ds=DS_New(cs);
@@ -1055,11 +1055,11 @@ Table_conversion * Optimiser_palette(Bitmap24B image,int taille,struct Composant
DS_Delete(ds);
}
// Enfin on trie les clusters (donc les couleurs de la palette) dans un ordre sympa : par couleur, et par luminosité pour chaque couleur
// Enfin on trie les clusters (donc les couleurs de la palette) dans un ordre sympa : par couleur, et par luminosité pour chaque couleur
CS_Trier_par_luminance(cs);
CS_Trier_par_chrominance(cs);
// Enfin on génère la palette et la table de correspondance entre chaque couleur 24b et sa couleur palette associée.
// Enfin on génère la palette et la table de correspondance entre chaque couleur 24b et sa couleur palette associée.
CS_Generer_TC_et_Palette(cs,tc,palette);
CS_Delete(cs);
@@ -1105,11 +1105,11 @@ void Convert_bitmap_24B_to_256_Floyd_Steinberg(Bitmap256 Dest,Bitmap24B Source,i
float ERouge,EVert,EBleu;
// On initialise les variables de parcours:
Courant =Source; // Le pixel dont on s'occupe
Courant =Source; // Le pixel dont on s'occupe
Suivant =Courant+largeur; // Le pixel en dessous
C_plus1 =Courant+1; // Le pixel à droite
S_moins1=Suivant-1; // Le pixel en bas à gauche
S_plus1 =Suivant+1; // Le pixel en bas à droite
C_plus1 =Courant+1; // Le pixel à droite
S_moins1=Suivant-1; // Le pixel en bas à gauche
S_plus1 =Suivant+1; // Le pixel en bas à droite
D =Dest;
// On parcours chaque pixel:
@@ -1137,7 +1137,7 @@ void Convert_bitmap_24B_to_256_Floyd_Steinberg(Bitmap256 Dest,Bitmap24B Source,i
EBleu =(Bleu *7)/16.0;
if (Pos_X+1<largeur)
{
// Valeur_modifiee fait la somme des 2 params en bornant sur [0,255]
// Valeur_modifiee fait la somme des 2 params en bornant sur [0,255]
C_plus1->R=Valeur_modifiee(C_plus1->R,ERouge);
C_plus1->V=Valeur_modifiee(C_plus1->V,EVert );
C_plus1->B=Valeur_modifiee(C_plus1->B,EBleu );