// ハッシュリストを求める
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;
}
示例#2
0
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;
		}
	
}