static int annotate_hash_table(BoxNode *n,HashTable *h,uint32_t *box) { PixelList *p; PixelHashData *d=(PixelHashData *)hashtable_get_user_data(h); Pixel q; if (n->l&&n->r) { return annotate_hash_table(n->l,h,box) && annotate_hash_table(n->r,h,box); } if (n->l||n->r) { #ifndef NO_OUTPUT printf ("box tree is dead\n"); #endif return 0; } for (p=n->head[0];p;p=p->next[0]) { PIXEL_UNSCALE(&(p->p),&q,d->scale); if (!hashtable_insert(h,q,*box)) { #ifndef NO_OUTPUT printf ("hashtable insert failed\n"); #endif return 0; } } if (n->head[0]) (*box)++; return 1; }
static void destroy_pixel_hash(HashTable *hash) { PixelHashData *d=(PixelHashData *)hashtable_get_user_data(hash); if (d) free(d); hashtable_free(hash); }
static void hash_to_list(const HashTable *h, const Pixel pixel, const uint32_t count, void *u) { PixelHashData *d=(PixelHashData *)hashtable_get_user_data(h); PixelList **pl=(PixelList **)u; PixelList *p; int i; Pixel q; PIXEL_SCALE(&pixel,&q,d->scale); /* malloc check ok, small constant allocation */ p=malloc(sizeof(PixelList)); if (!p) return; p->flag=0; p->p=q; p->count=count; for (i=0;i<3;i++) { p->next[i]=pl[i]; p->prev[i]=NULL; if (pl[i]) pl[i]->prev[i]=p; pl[i]=p; } }
static void hash_to_list(HashTable h, const void *key, const void *val, void *u) { PixelHashData *d=(PixelHashData *)hashtable_get_user_data(h); PixelList **pl=(PixelList **)u; PixelList *p; Pixel *pixel=(Pixel *)&key; int i; Pixel q; int count=*(int *)&val; PIXEL_SCALE(pixel,&q,d->scale); p=malloc(sizeof(PixelList)); if (!p) return; p->flag=0; p->p=q; p->count=count; for (i=0;i<3;i++) { p->next[i]=pl[i]; p->prev[i]=NULL; if (pl[i]) pl[i]->prev[i]=p; pl[i]=p; } }
static int pixel_cmp(const HashTable *h,const Pixel pixel1, const Pixel pixel2) { PixelHashData *d=(PixelHashData *)hashtable_get_user_data(h); uint32_t A,B; A=PIXEL_HASH(pixel1.c.r>>d->scale, pixel1.c.g>>d->scale, pixel1.c.b>>d->scale); B=PIXEL_HASH(pixel2.c.r>>d->scale, pixel2.c.g>>d->scale, pixel2.c.b>>d->scale); return (A==B)?0:((A<B)?-1:1); }
static unsigned long pixel_hash(const HashTable h,const void *p) { PixelHashData *d=(PixelHashData *)hashtable_get_user_data(h); Pixel *pixel=(Pixel *)&p; unsigned long hash=PIXEL_HASH(pixel->c.r>>d->scale, pixel->c.g>>d->scale, pixel->c.b>>d->scale); return hash; }
static int pixel_cmp(const HashTable h,const void *a,const void *b) { PixelHashData *d=(PixelHashData *)hashtable_get_user_data(h); Pixel *pixel1=(Pixel *)&a; Pixel *pixel2=(Pixel *)&b; unsigned long A,B; A=PIXEL_HASH(pixel1->c.r>>d->scale, pixel1->c.g>>d->scale, pixel1->c.b>>d->scale); B=PIXEL_HASH(pixel2->c.r>>d->scale, pixel2->c.g>>d->scale, pixel2->c.b>>d->scale); return (A==B)?0:((A<B)?-1:1); }
static uint32_t pixel_hash(const HashTable *h,const Pixel pixel) { PixelHashData *d=(PixelHashData *)hashtable_get_user_data(h); return PIXEL_HASH(pixel.c.r>>d->scale, pixel.c.g>>d->scale, pixel.c.b>>d->scale); }