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:
parent
8695c31c1b
commit
de726cae2f
156
op_c.c
156
op_c.c
@ -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 d‚but 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 d‚but 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 d‚but 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 interm‚diaires 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
2
op_c.h
@ -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);
|
||||
|
||||
@ -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_?????
|
||||
|
||||
1
pages.c
1
pages.c
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
4
texte.c
4
texte.c
@ -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'):
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user