コード例 #1
0
ファイル: Quant.c プロジェクト: Nexuapex/Pillow
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;
}
コード例 #2
0
ファイル: Quant.c プロジェクト: Nexuapex/Pillow
static void
destroy_pixel_hash(HashTable *hash)
{
   PixelHashData *d=(PixelHashData *)hashtable_get_user_data(hash);
   if (d) free(d);
   hashtable_free(hash);
}
コード例 #3
0
ファイル: Quant.c プロジェクト: Nexuapex/Pillow
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;
   }
}
コード例 #4
0
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;
   }
}
コード例 #5
0
ファイル: Quant.c プロジェクト: Nexuapex/Pillow
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);
}
コード例 #6
0
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;
}
コード例 #7
0
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);
}
コード例 #8
0
ファイル: Quant.c プロジェクト: Nexuapex/Pillow
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);
}