// ハッシュリストを求める int computeHash(ImageData *img,int x1,int y1,int x2,int y2,HashList **rgbHash) { HashList *fnd; int mx,my,dep; int val; int x,y; int r,g,b; int h_val; int res; int colors; Pixel col; colors=0; for(y=y1;y<=y2;y++) { for(x=x1;x<=x2;x++) { val = getPixel(img,x,y,&col); //画像上の画素情報を取得 r=col.r; g=col.g; b=col.b; h_val=((r * 33023 + g * 30013 + b * 27011) & 0x7fffffff) % HM_HASH; // ハッシュ関数 if(rgbHash[h_val]==NULL) { // 未使用なら新規に割り当てる rgbHash[h_val]=allocHash(r,g,b); colors++; } else { fnd=findHashList(rgbHash[h_val],r,g,b,&res); if(res) { // リスト内に存在する場合 (fnd->num)++; } else { fnd->next=allocHash(r,g,b); colors++; } } } } return colors; }
static void compute_hash (DviCharNameMap *map) { DviCharNameHash **buckets; int c, s, i; DviCharNameHash *h; buckets = map->buckets; for (i = 0; i < DVI_HASH_SIZE; i++) buckets[i] = 0; for (c = 0; c < DVI_MAP_SIZE; c++) for (s = 0; s < DVI_MAX_SYNONYMS; s++) { if (!map->dvi_names[c][s]) break; i = hash_name (map->dvi_names[c][s]) % DVI_HASH_SIZE; h = allocHash (); h->next = buckets[i]; buckets[i] = h; h->name = map->dvi_names[c][s]; h->position = c; } }