Beispiel #1
0
void TCOD_color_gen_map(TCOD_color_t *map, int nb_key, TCOD_color_t const  *key_color, int const  *key_index) {
	int segment=0;
	for (segment=0; segment < nb_key-1; segment++) {
		int idx_start=key_index[segment];
		int idx_end=key_index[segment+1];
		int idx;
		for ( idx=idx_start;idx <= idx_end; idx++) {
			map[idx]=TCOD_color_lerp(key_color[segment],key_color[segment+1],(float)(idx-idx_start)/(idx_end-idx_start));
		}
	}
}
Beispiel #2
0
colornum_t TCOD_color_lerp_wrapper(colornum_t c1, colornum_t c2, float coef)
{
  return color_to_int(TCOD_color_lerp (int_to_color(c1),int_to_color(c2),
				       coef));
}
Beispiel #3
0
void getPattern(TCOD_color_t desired[4], TCOD_color_t palette[2], int *nbCols, int *ascii) {
	// adapted from Jeff Lait's code posted on r.g.r.d
	int flag=0;
	/*
		pixels have following flag values :
			X 1
			2 4
		flag indicates which pixels uses foreground color (palette[1])
	*/
	static int flagToAscii[8] = {
		0,
		TCOD_CHAR_SUBP_NE,TCOD_CHAR_SUBP_SW,-TCOD_CHAR_SUBP_DIAG,TCOD_CHAR_SUBP_SE,
		TCOD_CHAR_SUBP_E,-TCOD_CHAR_SUBP_N,-TCOD_CHAR_SUBP_NW
	};
	int weight[2] = { 0, 0 };
	int i;

	// First colour trivial.
	palette[0] = desired[0];

	// Ignore all duplicates...
	for (i = 1; i < 4; i++) {
		if (desired[i].r != palette[0].r || desired[i].g != palette[0].g || desired[i].b != palette[0].b)
		break;
	}

	// All the same.
	if (i == 4) {
		*nbCols=1;
		return;
	}
	weight[0] = i;

	// Found a second colour...
	palette[1] = desired[i];
	weight[1] = 1;
	flag |= 1<<(i-1);
	*nbCols = 2;
	// remaining colours
	i++;
	while (i< 4) {
		if (desired[i].r == palette[0].r && desired[i].g == palette[0].g && desired[i].b == palette[0].b) {
			weight[0]++;
		} else if (desired[i].r == palette[1].r && desired[i].g == palette[1].g && desired[i].b == palette[1].b)  {
			flag |= 1<<(i-1);
			weight[1]++;
		} else {
			// Bah, too many colours,
			// merge the two nearest
			int dist0i=rgbdist(&desired[i], &palette[0]);
			int dist1i=rgbdist(&desired[i], &palette[1]);
			int dist01=rgbdist(&palette[0],&palette[1]);
			if ( dist0i < dist1i ) {
				if ( dist0i <= dist01 ) {
					// merge 0 and i
					palette[0]=TCOD_color_lerp(desired[i],palette[0],weight[0]/(1.0f+weight[0]));
					weight[0]++;
				} else {
					// merge 0 and 1
					palette[0]=TCOD_color_lerp(palette[0],palette[1],(float)(weight[1])/(weight[0]+weight[1]));
					weight[0]++;
					palette[1]=desired[i];
					flag=1<<(i-1);
				}
			} else {
				if ( dist1i <= dist01 ) {
					// merge 1 and i
					palette[1]=TCOD_color_lerp(desired[i],palette[1],weight[1]/(1.0f+weight[1]));
					weight[1]++;
					flag|=1<<(i-1);
				} else {
					// merge 0 and 1
					palette[0]=TCOD_color_lerp(palette[0],palette[1],(float)(weight[1])/(weight[0]+weight[1]));
					weight[0]++;
					palette[1]=desired[i];
					flag=1<<(i-1);
				}
			}
		}
		i++;
	}
	*ascii=flagToAscii[flag];
}