X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=lib%2Fpng.c;h=d71c19bc05c542be31b00f65f72450f4f079e3d8;hb=66a03382aab040571f94b0861719753bda3ff8f1;hp=118fbd6d1581fb2f5f782dabe7a10937e79ca4b9;hpb=d7e5869b0305452533e53dc433f0102df77bbdbc;p=swftools.git diff --git a/lib/png.c b/lib/png.c index 118fbd6..d71c19b 100644 --- a/lib/png.c +++ b/lib/png.c @@ -782,7 +782,7 @@ typedef struct { 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) @@ -817,6 +817,7 @@ 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; } @@ -852,6 +853,12 @@ static COL* getOptimalPalette(COL*image, int size, int palettesize) 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