[cc65] Re: TGI colors revisited

From: Oliver Schmidt <ol.sc1web.de>
Date: 2011-05-02 17:34:39
Hi,

I didn't receive any feedback at all on my posting below. So I'm
wondering by now if there was anything fundamentally wrong with it.
Maybe...

- to long to be read at all ?
- to offending to be anything but ignored ?
- to complicated to be understood ?
- to boring to be thought about ?
- to <whatever> ?

I've put quite some thoughts and effort into the TGI color topic so
I'm really interested to learn if there's something wrong about it !

Thanks in advance,
Oliver

On Sat, Apr 23, 2011 at 8:30 PM, Oliver Schmidt <ol.sc@web.de> wrote:
> Hi,
>
> If you're maintaining a cc65 TGI driver please read on...
>
> Quite some months ago we were discussing here improvements for the TGI
> color handling. We reached some good results - however most of them
> were not actually implemented. Therefore I revisited the topic.
>
> First let me briefly summarize our results:
>
> 1. We aggreed on that there is no benefit in using the same color
> macros (i.e. COLOR_RED) for both conio and TGI. On the other hand
> there might be targets that benefit from having different color values
> for conio and TGI. Therefore we aggreed to introduce additional color
> macros for TGI (i.e. TGI_COLOR_RED). The documentation is already
> adjusted but there no TGI_COLOR_... macros whatsoever in the target
> header files!
>
> 2. We aggreed that we live with the somewhat inconsistent usage of the
> TGI_COLOR_... macros in the TGI API. As long as one doesn't modify the
> default palette the macros can be used in the calls
> tgi_setcolor/tgi_getcolor/tgi_getpixel just as expected. When is comes
> however to palette manipulation the macros rather mean the palette
> index of the color in question. For example after a tgi_getpalette one
> can replace red with a different color with
> mypalette[TGI_COLOR_RED]=... This means that the values of the macros
> _MUST_ be in the range of 0..tgi_getmaxcolor. And this especially
> means that the values for monochrome graphics must be 0 and 1 as those
> have two palette entries.
>
> 3. We aggreed that the TGI_COLOR_... macros are defined in the target
> header files thus allowing the targets to define them differently
> (just like the COLOR_... macros for conio). However _ALL_ TGI drivers
> for a single target need to share the TGI_COLOR... macros. This
> requirement might very well mean that TGI drivers are required to
> convert color values at runtime. Here's a hypothetical example:
>
> A certain target has two TGI drivers. One for a monochrome mode and
> one for a 16-color mode. Because of the usage of the TGI_COLOR_...
> macros as palette indices it is obligaroty to have
> #define TGI_COLOR_BLACK 0
> #define TGI_COLOR_WHITE 1
> for the monochrome mode (see 2. above). But the 16-color mode needs
> white to have the value $0F. Then the 16-color mode TGI driver needs
> to convert (remap) the color values in order to allow TGI_COLOR_WHITE
> to be used. This conversion is not only necessary for
> tgi_setcolor/tgi_getcolor/tgi_getpixel but _ALSO_ for
> tgi_setpalette/tgi_getpalette/tgi_getdefpalette where the second index
> needs to be the one that shows as white in the default palette.
>
> 4. According to my records/memory we didn't discuss the actual palette
> values. However the overall goal of cc65 TGI is to allow for
> target-independent graphics programming and from that perspective i is
> obligatory that the TGI_COLOR_... macros can be used as palette values
> too. This means that a TGI_COLOR_... macro can serve three (!)
> purposes:
> - A "simple" color for tgi_setcolor/tgi_getcolor/tgi_getpixel
> - A palette index corresponding to that color in the default palette
> - A palette value
>
> Only if we follow these rules one can write things like:
> mypalette = {TGI_COLOR_RED, TGI_COLOR_BLUE};
> mypalette[TGI_COLOR_WHITE] = TGI_COLOR_GREEN;
>
> One implication of the these rules is btw. that _ALL_ default palettes
> consist the ascending values in the range of 0..tgi_getmaxcolor.
>
> So far so good - I've been looking through the cc65 source code in
> order to see what needs to be done to actually realize the above:
>
> - All targets without any TGI drivers don't need any TGI_COLOR_...
> macros - a no-brainer.
>
> - 'c64' has only a monochrome mode driver. So the (black/white = 0/1)
> rules above apply. It has a palette so additional color macros are
> useful. As far as I understand the values are identical to the conio
> values so I defined the TGI_COLOR_... macros to be identical to the
> TGI_COLOR_... macros. Please speak up if this is wrong and needs to be
> changed!
>
> - 'c128' has only monochrome mode drivers. So the (black/white = 0/1)
> rules above apply. They have palettes so additional color macros are
> useful. As far as I understand the values are identical to the conio
> values so I defined the TGI_COLOR_... macros to be identical to the
> TGI_COLOR_... macros. Please speak up if this is wrong and needs to be
> changed! However the default palette contains as second value $0F (not
> 1) so there is some work in the drivers necessary - which I can't do.
>
> - 'lynx' has only a 16-color mode driver. So the (black/white = 0/1)
> rules do _NOT_ above apply. In fact white has the value $0F so this
> target benefits from the target-specific TGI_COLOR_... macros. I
> defined the 16 macros to be identical to the TGI_COLOR_... macros.
> Please speak up if this is wrong and needs to be changed! However the
> default palette has totally different values than the TGI_COLOR_...
> macros - they even seem to be 16-bit values so there is some work in
> the drivers necessary - which I can't do.
>
> - 'atmos' has only a monochrome mode driver. So the (black/white =
> 0/1) rules above apply. It has a palette so addional color macros are
> useful. However currently white has the value 7 (not 1). So here a
> runtime conversion/mapping is necessary - which I can't do.
>
> - 'atari' has 5 monochrome mode drivers. So the (black/white = 0/1)
> rules above apply. Given the generic driver architecture I don't
> understand it but I'm pretty sure that most TGI drivers do need
> conversion/mapping. As there not only monochrome and 16-color drivers
> but addionally 4-color and 9-color drivers the conversion/mapping has
> to take those into account as well. The colors used by the 4-color
> drivers have to be in the range 0..3 and the 9-color driver colors
> have to be 0..8 - which I can't do.
>
> - 'apple2[enh]' has an 8-color and 16-color mode driver. So the
> (black/white = 0/1) rules do _NOT_ above apply. However the 16-color
> mode driver needs does need conversion/mapping to use the same color
> values the 8-color driver uses. I'll take care of that.
>
> As Uz already pointed out today the TGI kernel needs the value of
> TGI_COLOR_WHITE as it sets the current color to white on tgi_init().
> Therefore every target has to provide the TGI kernel with that value.
> Uz provided my with the concept of doing so and I'll take care of that
> pretty soon.
>
> Regards,
> Oliver
>
----------------------------------------------------------------------
To unsubscribe from the list send mail to majordomo@musoftware.de with
the string "unsubscribe cc65" in the body(!) of the mail.
Received on Mon May 2 17:35:18 2011

This archive was generated by hypermail 2.1.8 : 2011-05-02 17:35:22 CEST