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)); } } }
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)); }
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]; }