Some small optimisations to speed up the color reduction algorithm... still a little bit slow for me ...

git-svn-id: svn://pulkomandy.tk/GrafX2/trunk@373 416bcca6-2ee7-4201-b75f-2eb2f807beb1
This commit is contained in:
Adrien Destugues 2008-12-08 20:28:38 +00:00
parent 8695c31c1b
commit de726cae2f
5 changed files with 521 additions and 659 deletions

156
op_c.c
View File

@ -370,29 +370,18 @@ void Cluster_Analyser(Cluster * c,Table_occurence * to)
// On cherche les mins et les maxs de chaque composante sur la couverture
#ifdef OPTIMISATIONS_ASSEMBLEUR
rmin=(c->rmin << to->dec_r); rmax=(c->rmax << to->dec_r);
vmin=(c->vmin << to->dec_v); vmax=(c->vmax << to->dec_v);
bmin=(c->bmin << to->dec_b); bmax=(c->bmax << to->dec_b);
OPASM_Analyser_cluster(to->table,&rmin,&vmin,&bmin,&rmax,&vmax,&bmax,
to->dec_r,to->dec_v,to->dec_b,
(1 << to->dec_r),(1 << to->dec_v),(1 << to->dec_b),
&c->occurences);
#else
int nbocc;
rmin=c->rmax; rmax=c->rmin;
vmin=c->vmax; vmax=c->vmin;
// On prédécale tout pour éviter de faire trop de bazar en se forçant à utiliser TO_Get, plus rapide
rmin=c->rmax <<16; rmax=c->rmin << 16;
vmin=c->vmax << 8; vmax=c->vmin << 8;
bmin=c->bmax; bmax=c->bmin;
c->occurences=0;
for (r=c->rmin;r<=c->rmax;r++)
for (v=c->vmin;v<=c->vmax;v++)
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++)
{
nbocc=TO_Get(to,r,v,b);
nbocc=to->table[r + v + b]; // TO_Get
if (nbocc)
{
if (r<rmin) rmin=r;
@ -405,10 +394,8 @@ void Cluster_Analyser(Cluster * c,Table_occurence * to)
}
}
#endif
c->rmin=rmin; c->rmax=rmax;
c->vmin=vmin; c->vmax=vmax;
c->rmin=rmin>>16; c->rmax=rmax>>16;
c->vmin=vmin>>8; c->vmax=vmax>>8;
c->bmin=bmin; c->bmax=bmax;
// On regarde la composante qui a la variation la plus grande
@ -456,18 +443,6 @@ void Cluster_Split(Cluster * c,Cluster * c1,Cluster * c2,int teinte,Table_occure
cumul=0;
if (teinte==0)
{
#ifdef OPTIMISATIONS_ASSEMBLEUR
OPASM_Split_cluster_Rouge(to->table,
(c->rmin << to->dec_r),(c->vmin << to->dec_v),
(c->bmin << to->dec_b),(c->rmax << to->dec_r),
(c->vmax << to->dec_v),(c->bmax << to->dec_b),
(1 << to->dec_r),(1 << to->dec_v),
(1 << to->dec_b),limite,to->dec_r,&r);
#else
for (r=c->rmin;r<=c->rmax;r++)
{
for (v=c->vmin;v<=c->vmax;v++)
@ -485,8 +460,6 @@ void Cluster_Split(Cluster * c,Cluster * c1,Cluster * c2,int teinte,Table_occure
break;
}
#endif
if (r==c->rmin)
r++;
// R est la valeur de dbut du 2nd cluster
@ -508,17 +481,6 @@ void Cluster_Split(Cluster * c,Cluster * c1,Cluster * c2,int teinte,Table_occure
if (teinte==1)
{
#ifdef OPTIMISATIONS_ASSEMBLEUR
OPASM_Split_cluster_Vert(to->table,
(c->rmin << to->dec_r),(c->vmin << to->dec_v),
(c->bmin << to->dec_b),(c->rmax << to->dec_r),
(c->vmax << to->dec_v),(c->bmax << to->dec_b),
(1 << to->dec_r),(1 << to->dec_v),
(1 << to->dec_b),limite,to->dec_v,&v);
#else
for (v=c->vmin;v<=c->vmax;v++)
{
for (r=c->rmin;r<=c->rmax;r++)
@ -536,8 +498,6 @@ void Cluster_Split(Cluster * c,Cluster * c1,Cluster * c2,int teinte,Table_occure
break;
}
#endif
if (v==c->vmin)
v++;
// V est la valeur de dbut du 2nd cluster
@ -558,17 +518,6 @@ void Cluster_Split(Cluster * c,Cluster * c1,Cluster * c2,int teinte,Table_occure
else
{
#ifdef OPTIMISATIONS_ASSEMBLEUR
OPASM_Split_cluster_Bleu(to->table,
(c->rmin << to->dec_r),(c->vmin << to->dec_v),
(c->bmin << to->dec_b),(c->rmax << to->dec_r),
(c->vmax << to->dec_v),(c->bmax << to->dec_b),
(1 << to->dec_r),(1 << to->dec_v),
(1 << to->dec_b),limite,to->dec_b,&b);
#else
for (b=c->bmin;b<=c->bmax;b++)
{
for (v=c->vmin;v<=c->vmax;v++)
@ -586,8 +535,6 @@ void Cluster_Split(Cluster * c,Cluster * c1,Cluster * c2,int teinte,Table_occure
break;
}
#endif
if (b==c->bmin)
b++;
// B est la valeur de dbut du 2nd cluster
@ -1030,91 +977,6 @@ Table_conversion * Optimiser_palette(Bitmap24B image,int taille,struct Composant
return 0;
}
#ifdef OPTIMISATIONS_ASSEMBLEUR
void Convert_bitmap_24B_to_256_Floyd_Steinberg(Bitmap256 dest,Bitmap24B source,int largeur,int hauteur,struct Composantes * palette,Table_conversion * tc)
// Cette fonction dégrade au fur et à mesure le bitmap source, donc soit on ne
// s'en ressert pas, soit on passe à la fonction une copie de travail du
// bitmap original.
{
Bitmap24B courant;
Bitmap256 d;
int y;
// On initialise les variables de parcours:
courant=source;
d =dest;
if ((largeur>0) && (hauteur>0))
{
if (hauteur>1)
{
// Traitement de la 1ère ligne à l'avant-dernière
if (largeur>1)
{
// Il y a plusieurs colonnes
for (y=0;y<hauteur-1;y++)
{
// Premier pixel de la ligne
OPASM_DitherFS_623(d,courant,largeur-2,palette,tc->table,
tc->red_r,tc->red_v,tc->red_b,
tc->nbb_v,tc->nbb_b);
courant++;
d++;
// Pixels intermdiaires de la ligne
if (largeur>2)
{
OPASM_DitherFS_6123(d,courant,largeur-2,palette,tc->table,
tc->red_r,tc->red_v,tc->red_b,
tc->nbb_v,tc->nbb_b);
courant+=largeur-2;
d+=largeur-2;
}
// Dernier pixel de la ligne
OPASM_DitherFS_12(d,courant,largeur-2,palette,tc->table,
tc->red_r,tc->red_v,tc->red_b,
tc->nbb_v,tc->nbb_b);
courant++;
d++;
}
}
else
{
OPASM_DitherFS_2(d,courant,hauteur-1,palette,tc->table,
tc->red_r,tc->red_v,tc->red_b,
tc->nbb_v,tc->nbb_b);
courant+=hauteur-1;
d+=hauteur-1;
}
}
// Traitement de la derniŠre ligne
if (largeur>1)
{
// Il y a plusieurs colonnes
OPASM_DitherFS_6(d,courant,largeur-1,palette,tc->table,
tc->red_r,tc->red_v,tc->red_b,
tc->nbb_v,tc->nbb_b);
courant+=largeur-1;
d+=largeur-1;
}
// Le dernier pixel
OPASM_DitherFS(d,courant,tc->table,
tc->red_r,tc->red_v,tc->red_b,
tc->nbb_v,tc->nbb_b);
}
}
#else
int Valeur_modifiee(int valeur,int modif)
{
valeur+=modif;
@ -1225,8 +1087,6 @@ void Convert_bitmap_24B_to_256_Floyd_Steinberg(Bitmap256 Dest,Bitmap24B Source,i
}
#endif
static const byte precision_24b[]=

2
op_c.h
View File

@ -158,7 +158,7 @@ void HSLtoRGB(byte h, byte s, byte l, byte* r, byte* g, byte* b);
void TO_Init(Table_occurence * t);
Table_occurence * TO_New(int nbb_r,int nbb_v,int nbb_b);
void TO_Delete(Table_occurence * t);
int TO_Get(Table_occurence * t,int r,int v,int b);
inline int TO_Get(Table_occurence * t,int r,int v,int b);
void TO_Set(Table_occurence * t,int r,int v,int b,int i);
void TO_Inc(Table_occurence * t,int r,int v,int b);
void TO_Compter_occurences(Table_occurence * t,Bitmap24B image,int taille);

View File

@ -748,7 +748,6 @@ void Loupe_12_0(void)
// On fait de notre mieux pour restaurer l'ancienne opération:
Demarrer_pile_operation(Operation_avant_interruption);
DEBUG("OP",0);
}
/////////////////////////////////////////////////// OPERATION_RECTANGLE_?????

View File

@ -714,6 +714,7 @@ int Initialiser_les_listes_de_backups_en_debut_de_programme(int Taille,int Large
// On ne peut pas démarrer le programme avec ne serait-ce qu'une
// page de la dimension souhaitée, donc on laisse tout tomber et on
// le renvoie chier.
free(Page);
Retour=0;
}
}

View File

@ -88,7 +88,7 @@ int Compare_fontes(T_FONTE * Fonte1, T_FONTE * Fonte2)
void Ajout_fonte(const char *Nom)
{
char * Nom_fonte;
T_FONTE * Fonte = (T_FONTE *)malloc(sizeof(T_FONTE));
T_FONTE * Fonte;
int Taille=strlen(Nom)+1;
int Indice;
@ -114,6 +114,8 @@ void Ajout_fonte(const char *Nom)
return;
#endif
Fonte = (T_FONTE *)malloc(sizeof(T_FONTE));
switch (EXTID(tolower(Nom[Taille-4]), tolower(Nom[Taille-3]), tolower(Nom[Taille-2])))
{
case EXTID('t','t','f'):