static int compare_colors(const void*_c1, const void*_c2) {
colornum_t*c1 = (colornum_t*)_c1;
colornum_t*c2 = (colornum_t*)_c2;
- return c1->num - c2->num;
+ return c2->num - c1->num;
}
static colornum_t* getColors(COL*image, int size, int*num)
int col = (image[t].r)|(image[t].g)<<8|(image[t].b)<<16;
int min,max,i,l;
for(min=0, max=count, i=count/2, l=count; i != l; l=i,i=(min+max)/2) {
+ // binary search
if(colors[i].color >= col) max=i;
else min=i+1;
}
return ret;
}
+ if(num>2048) {
+ /* if there are too many different colors, pick the ones that
+ occur most often */
+ num = 2048;
+ }
+
colornum_t*centers = malloc(sizeof(colornum_t)*palettesize);
int t;
for(t=0;t<palettesize;t++) {
long idatsize = 0;
{
int x,y;
- int srcwidth = width * (bpp/8);
- int linelen = 1 + ((srcwidth+3)&~3);
+ int bypp = bpp/8;
+ int srcwidth = width * bypp;
+ int linelen = 1 + srcwidth;
+ if(bypp==2)
+ linelen = 1 + ((srcwidth+1)&~1);
+ else if(bypp==3)
+ linelen = 1 + ((srcwidth+2)/3)*3;
+ else if(bypp==4)
+ linelen = 1 + ((srcwidth+3)&~3);
unsigned char* line = (unsigned char*)malloc(linelen);
unsigned char* bestline = (unsigned char*)malloc(linelen);
memset(line, 0, linelen);