Palette
Customizes colors in modes with paletted colors
Syntax
`
Palette [Get] [index, color]
Palette [Get] [index, r, g, b]
Palette [Get] Using arrayname(idx)
`
Parameters
`Get`
indicates getting palette information rather than setting palette information
`index`
palette index
`color`
color attribute
`r`
red color component
`g`
green color component
`b`
blue color component
`Using`
indicates using array of color values
`arrayname(idx)`
array and index to get/set color attributes
Description
The `Palette` statement is used to retrieve or customize the current palette for graphics modes with a color depth of up to 8bpp; using `Palette` while in a mode with a higher color depth will have no effect. Calling `Palette` with no argument restores the default palette for current graphics mode, as set by the `Screen (Graphics)` statement.
The GfxLib sets a default palette when a `Screen` mode is initialized.
First form
If you specify index and color, these are dependent on the current mode:

Screen mode | index range | color range
1 | 0-3 | 0-15
2 | 0-1 | 0-15
7,8 | 0-15 | 0-15
9 | 0-15 | 0-63
11 | 0-1 | see below
12 | 0-15 | see below
13 to 21 | 0-255 | see below

In screen modes `1`, `2`, `7`, `8` and `9` you can assign to each color index one of the colors in the available range. In other screen modes, the color must be specified in the form `&hBBGGRR`, where `BB`, `GG` and `RR` are the blue, green and red components ranging `&h0`-`&h3F` in hexadecimal (`0`-`63` in decimal). If you don't like hexadecimal form, you can use the following formula to compute the integer value to pass to this parameter:
`color = red Or (green Shl 8) Or (blue Shl 16)`
Where red, green and blue must range `0`-`63`. Please note that color values accepted by `Palette` are not the in the same form as returned by the `RGB` macro (the red and blue fields are inverted, and the range is different); this is for backward compatibility with QB.
Second form
In the second form, you specify the red, green and blue components for a palette entry directly, by calling `Palette` with 4 parameters. In this case `r`, `g` and `b` must be in the range `0`-`255`.
Third form
Calling `Palette Using` allows to set a list of color values all at once; you should pass an array holding enough elements as the color indices available for your current graphics mode color depth (2 for 1bpp, 4 for 2bpp, 16 for 4bpp or 256 for 8bpp). The array elements must be integer color values in the form described above. The colors stored into `arrayname` starting with given `idx` index are then assigned to each palette index, starting with index `0`.
Form 1 and 3 are for backward compatibility with QB; form 2 is meant to ease palette handling. Any change to the palette is immediately visible on screen.
If the `Get` option is specified, `Palette` retrieves instead of setting color values for the current palette. The parameters have the same meaning as specified for the form being used, but in this case color, `r`, `g` and `b` must be variables passed by reference that will hold the color RGB values on function exit.
Example
`
' Setting a single color, form 1.
Screen 15
Locate 1,1: Color 15
Print "Press any key to change my color!"
Sleep
' Now change color 15 hues to bright red
Palette 15, &h00003F
Sleep
`
`
' Getting a single color, form 2.
Dim As ULong r, g, b
Screen 13
Palette Get 32, r, g, b
Print "Color 32 hues:"
Print Using "Red:### Green:### Blue:###"; r; g; b
Sleep
`
`
' Getting whole palette, form 3.
Dim pal(0 To 255) As ULong
Screen 13
Palette Get Using pal
For i As Integer = 0 To 15
Print Using "Color ## = &"; i; Hex(pal(i), 6)
Next i
Sleep
`
Differences from QB

- QBasic did not support PALETTE GET to retrieve a palette.
- QBasic did not allow passing individual red/green/blue values.

See also

- `Screen (Graphics)`
- `Color`
- `Using`
- Internal Pixel Formats
- Default Palettes