Re: [cc65] TGI palettes (was: TGI colors revisited)

From: Daniel Serpell <>
Date: 2011-05-11 21:17:16
Hi Oliver!

On Wed, May 11, 2011 at 12:52 PM, Oliver Schmidt <> wrote:
>> Remember that in Atari, you have a driver with few simultaneous
>> colors (ie, 1 or 2) from a palette with many (128) and at the same
>> time drivers with several colors (16) with no palette. And you can
>> select the driver at run-time.
> All my statements so far claim to justify such a scenario. Especially
> the pseudo codeline
> "Is the TGI_COLOR_RED macro value smaller than tgi_getcolorcount() ?"
> tries to find out if the TGI_COLOR_RED macro is usable as "direct"
> color in the currently at run-time selected driver. Such a macro would
> be expected to have a values > 1 but < 16 so that the pseudocode would
> do the right thing for both types of drivers - on the same target and
> therefore with the same value for TGI_COLOR_RED. Or am I wrong at some
> point?

I think it could work, but in atari you have at least:

mode 8: 2 colors paletted, default is index 0=blue, index  1=white.
mode 9: 16 colors, no palette, 0=black, 1 to 15 are 15 different
        colors of the same brightness.
mode 10: 9 colors paletted.
mode 11: 16 brightness, no palette. 0=dark, 15=light, all of
         the same color.
mode 15: 4 colors, paletted, default is 0=black, 1=red, 2=green, 3=blue.

>> There is another option, the one used by earlier X windows functions. In those,
>> you can "allocate" a new color, and the driver returns the best approximation
>> of that color.
>> [...]
> While I agree that this approach is conceptually the
> correct/right/best I personally feel that it is (way) too complicated
> both for the driver and program implementator. Just my two cents...

I think that is not that difficult, either for the driver or the program.
For example, this code would work:

 // get colors
 char black, red;
 black = tgi_alloccolor(TGI_COLOR_BLACK);
 red   = tgi_alloccolor(TGI_COLOR_RED);
 // draw

In the driver, this would be implemented as:

 // Fixed mode, with no palette:
 static char color_map[]; // array with index for each color value
 char tgi_alloccolor(int color)
  return color_map[color];
 void tgi_freecolor(char index)
  // NOP

 // Palleted mode
 static char num_index; // Number of indexes
 static char used_index[max_index]; // flags
 char tgi_alloccolor(int color)
  char i;
   if( !used_index[i] )
  if( i == max_index )
   return max_index -1; // Returns last index if no more colors.
  used_index[i] = 1;
  return i;
 void tgi_freecolor(char index)
  used_index[i] = 0;

>> The only missing functionality is palette changing effects.
> Hm, it seems that we're still looking at the topic from quite
> different perspectives: Many TGI drivers don't support palettes.
> Therefore a portable TGI program can't even think about palette-based
> effects. For me this falls exactly into the same category sprites fall
> into. Great stuff but just not portable enough.
> What I wanted to point out in response to Uz' idea of dropping
> palettes altogether was this:
> TGI palettes aren't for useres/programs who WANT palettes to create
> something beyond the ordinary. TGI palettes are rather for
> users/programs who NEED palettes to reach the ordinary on as many
> targets/drivers as possible.

I agree, but with only one simple functions (tgi_darkencolor) you can
implement palette effects in atari and c64, making the fade-out
effects portable.

To unsubscribe from the list send mail to with
the string "unsubscribe cc65" in the body(!) of the mail.
Received on Wed May 11 21:17:29 2011

This archive was generated by hypermail 2.1.8 : 2011-05-11 21:17:31 CEST