[fpc-devel] proposal for palette-related graph unit interface changes

Nikolay Nikolov nickysn at users.sourceforge.net
Wed Sep 15 22:45:20 CEST 2010


  On 09/15/2010 05:39 PM, Nikolay Nikolov wrote:
>  Currently, the following palette-related things from the fpc graph 
> unit aren't TP7 compatible:
>
> ...
>
> What do you think?
There are also 2 other palette-related incompatibilities, that I'd also 
like to fix. They're relatively independent from the 
PaletteType/RGBPaletteType issue.

1. SetRGBPalette's range of values for RedValue, GreenValue and 
BlueValue is 0..63 in TP7 and 0..255 in FPC. So to set the background to 
bright red, in TP7 you would use:

SetRGBPalette(0, 63, 0, 0)

but this would set it to only dark red in FPC, where you have to use:

SetRGBPalette(0, 255, 0, 0)

this could be supported with a global boolean variable, that enables or 
disables the extended DAC range. E.g:

ExtendedRGBPaletteRange := true; { use 0..255 range }
ExtendedRGBPaletteRange := false; { use 0..63 range }

This can be implemented without any change to the platform-specific 
drivers, i.e. TModeInfo.SetRGBPalette and TModeInfo.GetRGBPalette will 
continue to only support the range 0..255 and not care about the 
ExtendedRGBPaletteRange flag. However, we'll add new front-end wrapper 
functions, that'll check the flag and convert the data, if necessary, 
before calling the internal Set/GetRGBPalette functions:

procedure SetRGBPalette(ColorNum, RedValue, GreenValue, BlueValue: 
smallint);
begin
   if not ExtendedRGBPaletteRange then
   begin
     RedValue := (RedValue and 63) shl 2;
     GreenValue := (RedValue and 63) shl 2;
     BlueValue := (RedValue and 63) shl 2;
   end;
   InternalSetRGBPalette(ColorNum, RedValue, GreenValue, BlueValue);
end;

2. The second one's trickier and affects SetRGBPalette in 16-colour 
modes. In FPC, to set the RGB palette value of a colour number ColorNum 
(in [0..15]) you simply use:

SetRGBPalette(ColorNum, R, G, B)

in TP7, you have to do something like:

SetRGBPalette(DefaultEGAPalette[ColorNum], R, G, B)

where DefaultEGAPalette is (0, 1, 2, 3, 4, 5, 20, 7, 56, 57, 58, 59, 60, 
61, 62, 63) for most EGA/VGA and VESA 16-colour modes, with the 
exception of modes 0Dh - 320x200x16 (not supported by BGI or FPC as of 
now) and 0Eh - 640x200x16 (supported by both BGI and FPC - driver VGA, 
mode VGALo), where DefaultEGAPalette is (0, 1, 2, 3, 4, 5, 6, 7, 16, 17, 
18, 19, 20, 21, 22, 23). These EGA palettes can be obtained in TP7, 
using GetDefaultPalette or GetPalette. You can also decide to combine 
SetPalette and SetRGBPalette to produce all sorts of tricks.

This could also be emulated in front-end wrapper functions and we could 
also add a flag to turn the EGA palettes off, but the code would be 
trickier.



More information about the fpc-devel mailing list