static int checkContained(BoxNode *n,Pixel *pp) { if (n->l&&n->r) { return checkContained(n->l,pp)+checkContained(n->r,pp); } if (n->l||n->r) { #ifndef NO_OUTPUT printf ("box tree is dead\n"); #endif return 0; } if ( pp->c.r<=n->head[0]->p.c.r && pp->c.r>=n->tail[0]->p.c.r && pp->c.g<=n->head[1]->p.c.g && pp->c.g>=n->tail[1]->p.c.g && pp->c.b<=n->head[2]->p.c.b && pp->c.b>=n->tail[2]->p.c.b) { return 1; } return 0; }
static int compute_palette_from_median_cut( Pixel *pixelData, uint32_t nPixels, HashTable *medianBoxHash, Pixel **palette, uint32_t nPaletteEntries) { uint32_t i; uint32_t paletteEntry; Pixel *p; uint32_t *avg[3]; uint32_t *count; *palette=NULL; /* malloc check ok, using calloc */ if (!(count=calloc(nPaletteEntries, sizeof(uint32_t)))) { return 0; } for(i=0;i<3;i++) { avg[i]=NULL; } for(i=0;i<3;i++) { /* malloc check ok, using calloc */ if (!(avg[i]=calloc(nPaletteEntries, sizeof(uint32_t)))) { for(i=0;i<3;i++) { if (avg[i]) free (avg[i]); } free(count); return 0; } } for (i=0;i<nPixels;i++) { #ifdef TEST_SPLIT_INTEGRITY if (!(i%100)) { printf ("%05d\r",i); fflush(stdout); } if (checkContained(root,pixelData+i)>1) { printf ("pixel in two boxes\n"); for(i=0;i<3;i++) free (avg[i]); free(count); return 0; } #endif if (!hashtable_lookup(medianBoxHash,pixelData[i],&paletteEntry)) { #ifndef NO_OUTPUT printf ("pixel lookup failed\n"); #endif for(i=0;i<3;i++) free (avg[i]); free(count); return 0; } if (paletteEntry>=nPaletteEntries) { #ifndef NO_OUTPUT printf ("panic - paletteEntry>=nPaletteEntries (%d>=%d)\n",(int)paletteEntry,(int)nPaletteEntries); #endif for(i=0;i<3;i++) free (avg[i]); free(count); return 0; } avg[0][paletteEntry]+=pixelData[i].c.r; avg[1][paletteEntry]+=pixelData[i].c.g; avg[2][paletteEntry]+=pixelData[i].c.b; count[paletteEntry]++; } /* malloc check ok, using calloc */ p=calloc(nPaletteEntries, sizeof(Pixel)); if (!p) { for(i=0;i<3;i++) free (avg[i]); free(count); return 0; } for (i=0;i<nPaletteEntries;i++) { p[i].c.r=(int)(.5+(double)avg[0][i]/(double)count[i]); p[i].c.g=(int)(.5+(double)avg[1][i]/(double)count[i]); p[i].c.b=(int)(.5+(double)avg[2][i]/(double)count[i]); } *palette=p; for(i=0;i<3;i++) free (avg[i]); free(count); return 1; }
static int compute_palette_from_median_cut( Pixel *pixelData, unsigned long nPixels, HashTable medianBoxHash, Pixel **palette, unsigned long nPaletteEntries) { unsigned long i; unsigned long paletteEntry; Pixel *p; unsigned long *avg[3]; unsigned long *count; *palette=NULL; if (!(count=malloc(sizeof(unsigned long)*nPaletteEntries))) { return 0; } memset(count,0,sizeof(unsigned long)*nPaletteEntries); for(i=0;i<3;i++) { avg[i]=NULL; } for(i=0;i<3;i++) { if (!(avg[i]=malloc(sizeof(unsigned long)*nPaletteEntries))) { for(i=0;i<3;i++) { if (avg[i]) free (avg[i]); } free(count); return 0; } } for(i=0;i<3;i++) { memset(avg[i],0,sizeof(unsigned long)*nPaletteEntries); } for (i=0;i<nPixels;i++) { #ifdef TEST_SPLIT_INTEGRITY if (!(i%100)) { printf ("%05d\r",i); fflush(stdout); } if (checkContained(root,pixelData+i)>1) { printf ("pixel in two boxes\n"); for(i=0;i<3;i++) free (avg[i]); free(count); return 0; } #endif if (!hashtable_lookup(medianBoxHash,(void *)pixelData[i].v,(void **)&paletteEntry)) { #ifndef NO_OUTPUT printf ("pixel lookup failed\n"); #endif for(i=0;i<3;i++) free (avg[i]); free(count); return 0; } if (paletteEntry>=nPaletteEntries) { #ifndef NO_OUTPUT printf ("panic - paletteEntry>=nPaletteEntries (%d>=%d)\n",(int)paletteEntry,(int)nPaletteEntries); #endif for(i=0;i<3;i++) free (avg[i]); free(count); return 0; } avg[0][paletteEntry]+=pixelData[i].c.r; avg[1][paletteEntry]+=pixelData[i].c.g; avg[2][paletteEntry]+=pixelData[i].c.b; count[paletteEntry]++; } p=malloc(sizeof(Pixel)*nPaletteEntries); if (!p) { for(i=0;i<3;i++) free (avg[i]); free(count); return 0; } for (i=0;i<nPaletteEntries;i++) { p[i].c.r=(int)(.5+(double)avg[0][i]/(double)count[i]); p[i].c.g=(int)(.5+(double)avg[1][i]/(double)count[i]); p[i].c.b=(int)(.5+(double)avg[2][i]/(double)count[i]); } *palette=p; for(i=0;i<3;i++) free (avg[i]); free(count); return 1; }