/* ５１２＊５１２／６５５３５色モードにおける
	実際に画面上に使われている色数を数える */
/* さらに、最初に２５６色を読み出す */

/* アルゴリズム的にはＣでももっと高速なやり方はあるが、
	ワークエリアが８倍＝６５５３６バイト必要なのでやめる */
/* と思ったけど、それはgcolor_count2()とすることにする */

#include <doslibm.h>
#include "defines.h"

int gcolor_count(unsint cols[256])
{
#define COLMAX	65536		/* 最大色数 */
#define SS	32		/* check[]１要素あたりのビット数 */
#define CHKS	(COLMAX/SS)	/* COLMAX色調べるのに必要なcheck[]要素数 */
unint cc,check[CHKS];		/* ビット対応で調べる */
unsint c,*gram=(unsint *)GRAM;
unint i,j,k;
	/* 色使用フラグリセット */
	for (i=0;i<CHKS;i++) check[i]=0;
	
	/* 色チェック＆使用フラグセット */
	cc=SUPER(0);
	do {
		c=*gram++;
		check[c/SS]|=(1<<(c%SS));
		c=*gram++;
		check[c/SS]|=(1<<(c%SS));
	} while (gram<(unsint *)(GRAM+GRSIZE));
	if (cc>=0) SUPER(cc);
	
	/* 色数チェック */
	k=0;
	for (i=0;i<CHKS;i++) {
		cc=check[i];
		for (j=0;j<SS;j++) {
			if (cc&(1<<j)) {
				if (k<256) cols[k]=i*SS+j;
				k++;
			}
		}
	}
	for (i=k;i<256;i++) cols[i]=0; /* 残り分を消す */
	return(k);
}
