Count colors when loading True color pictures
If the count is <= 256 there is no need to execute the expensive color quantization process
This commit is contained in:
parent
753aaf3422
commit
ee11079b86
44
src/op_c.c
44
src/op_c.c
@ -1368,6 +1368,41 @@ void Convert_24b_bitmap_to_256_nearest_neighbor(T_Bitmap256 dest,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Count colors and convert if 256 colors or less are used
|
||||||
|
// return 0 for success
|
||||||
|
int Try_Convert_to_256_Without_Loss(T_Bitmap256 dest,T_Bitmap24B source,int width,int height,T_Components * palette)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
int n = 0; // number of colors
|
||||||
|
long index;
|
||||||
|
T_Bitmap24B ptr;
|
||||||
|
|
||||||
|
for (index = width * height, ptr = source; index > 0; index--, ptr++)
|
||||||
|
{
|
||||||
|
// look for the color in the table
|
||||||
|
for (i = 0; i < n; i++) {
|
||||||
|
if(palette[i].R == ptr->R && palette[i].G == ptr->G && palette[i].B == ptr->B)
|
||||||
|
break; // found !
|
||||||
|
}
|
||||||
|
if (i >= n) {
|
||||||
|
if (n > 255) {
|
||||||
|
// there are more than 256 colors
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
// need to add the color in the palette
|
||||||
|
palette[n].R = ptr->R;
|
||||||
|
palette[n].G = ptr->G;
|
||||||
|
palette[n].B = ptr->B;
|
||||||
|
n++;
|
||||||
|
}
|
||||||
|
*dest = (byte)i;
|
||||||
|
dest++;
|
||||||
|
}
|
||||||
|
// TODO : Sort the palette ?
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// These are the allowed precisions for all the tables.
|
// These are the allowed precisions for all the tables.
|
||||||
// For some of them only the first one may work because of ugly optimizations
|
// For some of them only the first one may work because of ugly optimizations
|
||||||
static const byte precision_24b[]=
|
static const byte precision_24b[]=
|
||||||
@ -1389,13 +1424,16 @@ static const byte precision_24b[]=
|
|||||||
// Give this one a 24b source, get back the 256c bitmap and its palette
|
// Give this one a 24b source, get back the 256c bitmap and its palette
|
||||||
int Convert_24b_bitmap_to_256(T_Bitmap256 dest,T_Bitmap24B source,int width,int height,T_Components * palette)
|
int Convert_24b_bitmap_to_256(T_Bitmap256 dest,T_Bitmap24B source,int width,int height,T_Components * palette)
|
||||||
{
|
{
|
||||||
|
CT_Tree* table; // table de conversion
|
||||||
|
int ip; // index de précision pour la conversion
|
||||||
|
|
||||||
|
if (Try_Convert_to_256_Without_Loss(dest, source, width, height, palette) == 0)
|
||||||
|
return 0;
|
||||||
|
|
||||||
#if defined(__GP2X__) || defined(__gp2x__) || defined(__WIZ__) || defined(__CAANOO__)
|
#if defined(__GP2X__) || defined(__gp2x__) || defined(__WIZ__) || defined(__CAANOO__)
|
||||||
return Convert_24b_bitmap_to_256_fast(dest, source, width, height, palette);
|
return Convert_24b_bitmap_to_256_fast(dest, source, width, height, palette);
|
||||||
|
|
||||||
#else
|
#else
|
||||||
CT_Tree* table; // table de conversion
|
|
||||||
int ip; // index de précision pour la conversion
|
|
||||||
|
|
||||||
// On essaye d'obtenir une table de conversion qui loge en mémoire, avec la
|
// On essaye d'obtenir une table de conversion qui loge en mémoire, avec la
|
||||||
// meilleure précision possible
|
// meilleure précision possible
|
||||||
for (ip=0;ip<(10*3);ip+=3)
|
for (ip=0;ip<(10*3);ip+=3)
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user