OpenTTD Source  20241120-master-g6d3adc6169
palette.cpp File Reference

Handling of palettes. More...

#include "stdafx.h"
#include "blitter/base.hpp"
#include "blitter/factory.hpp"
#include "fileio_func.h"
#include "gfx_type.h"
#include "landscape_type.h"
#include "palette_func.h"
#include "settings_type.h"
#include "thread.h"
#include "table/palettes.h"
#include "safeguards.h"

Go to the source code of this file.

Data Structures

struct  ColourGradients
 Lookup table of colour shades for all 16 colour gradients. More...
 

Macros

#define EXTR(p, q)   (((uint16_t)(palette_animation_counter * (p)) * (q)) >> 16)
 
#define EXTR2(p, q)   (((uint16_t)(~palette_animation_counter * (p)) * (q)) >> 16)
 

Typedefs

using PaletteLookup = std::array< uint8_t, 1U<<(PALETTE_BITS *3)>
 

Functions

uint CrunchColour (uint c)
 Reduce bits per channel to PALETTE_BITS, and place value in the middle of the reduced range. More...
 
static uint CalculateColourDistance (const Colour &col1, int r2, int g2, int b2)
 Calculate distance between two colours. More...
 
static uint8_t FindNearestColourIndex (uint8_t r, uint8_t g, uint8_t b)
 Find nearest colour palette index for a 32bpp pixel. More...
 
uint8_t GetNearestColourIndex (uint8_t r, uint8_t g, uint8_t b)
 Get nearest colour palette index from an RGB colour. More...
 
void DoPaletteAnimations ()
 
void GfxInitPalettes ()
 
bool CopyPalette (Palette &local_palette, bool force_copy)
 Copy the current palette if the palette was updated. More...
 
TextColour GetContrastColour (uint8_t background, uint8_t threshold)
 Determine a contrasty text colour for a coloured background. More...
 
uint8_t GetColourGradient (Colours colour, ColourShade shade)
 Get colour gradient palette index. More...
 
void SetColourGradient (Colours colour, ColourShade shade, uint8_t palette_index)
 Set colour gradient palette index. More...
 

Variables

Palette _cur_palette
 Current palette.
 
static std::recursive_mutex _palette_mutex
 To coordinate access to _cur_palette.
 
const uint PALETTE_BITS = 6
 PALETTE_BITS reduces the bits-per-channel of 32bpp graphics data to allow faster palette lookups from a smaller lookup table. More...
 
const uint PALETTE_SHIFT = 8 - PALETTE_BITS
 
const uint PALETTE_BITS_MASK = ((1U << PALETTE_BITS) - 1) << PALETTE_SHIFT
 
const uint PALETTE_BITS_OR = (1U << (PALETTE_SHIFT - 1))
 
static PaletteLookup _palette_lookup {}
 
const uint8_t PALETTE_INDEX_CC_START = 198
 Palette index of start of company colour remap area.
 
const uint8_t PALETTE_INDEX_CC_END = PALETTE_INDEX_CC_START + 8
 Palette index of end of company colour remap area.
 
const uint8_t PALETTE_INDEX_START = 1
 Palette index of start of defined palette.
 
const uint8_t PALETTE_INDEX_END = 215
 Palette index of end of defined palette.
 

Detailed Description

Handling of palettes.

Definition in file palette.cpp.

Function Documentation

◆ CalculateColourDistance()

static uint CalculateColourDistance ( const Colour col1,
int  r2,
int  g2,
int  b2 
)
static

Calculate distance between two colours.

Parameters
col1First colour.
r2Red component of second colour.
g2Green component of second colour.
b2Blue component of second colour.
Returns
Euclidean distance between first and second colour.

Definition at line 70 of file palette.cpp.

Referenced by FindNearestColourIndex().

◆ CopyPalette()

bool CopyPalette ( Palette local_palette,
bool  force_copy 
)

Copy the current palette if the palette was updated.

Used by video-driver to get a current up-to-date version of the palette, to avoid two threads accessing the same piece of memory (with a good chance one is already updating the palette while the other is drawing based on it).

Parameters
local_paletteThe location to copy the palette to.
force_copyWhether to ignore if there is an update for the palette.
Returns
True iff a copy was done.

Definition at line 152 of file palette.cpp.

References _cur_palette, _palette_mutex, Palette::count_dirty, Palette::first_dirty, and lock.

Referenced by VideoDriver_SDL_Base::CheckPaletteAnim(), VideoDriver_SDL::CheckPaletteAnim(), VideoDriver_Win32Base::CheckPaletteAnim(), and VideoDriver_SDL_Base::ClientSizeChanged().

◆ CrunchColour()

uint CrunchColour ( uint  c)
inline

Reduce bits per channel to PALETTE_BITS, and place value in the middle of the reduced range.

This is to counteract the information lost between bright and dark pixels, e.g if PALETTE_BITS was 2: 0 - 63 -> 32 64 - 127 -> 96 128 - 191 -> 160 192 - 255 -> 224

Parameters
c8 bit colour component.
Returns
Colour component reduced to PALETTE_BITS.

Definition at line 57 of file palette.cpp.

Referenced by FindNearestColourIndex().

◆ FindNearestColourIndex()

static uint8_t FindNearestColourIndex ( uint8_t  r,
uint8_t  g,
uint8_t  b 
)
static

Find nearest colour palette index for a 32bpp pixel.

Parameters
rRed component.
gGreen component.
bBlue component.
Returns
palette index of nearest colour.

Definition at line 94 of file palette.cpp.

References _palette, CalculateColourDistance(), CrunchColour(), Palette::palette, PALETTE_INDEX_CC_END, PALETTE_INDEX_CC_START, PALETTE_INDEX_END, and PALETTE_INDEX_START.

◆ GetColourGradient()

uint8_t GetColourGradient ( Colours  colour,
ColourShade  shade 
)

Get colour gradient palette index.

Parameters
colourColour.
shadeShade level from 1 to 7.
Returns
palette index of colour.

Definition at line 314 of file palette.cpp.

Referenced by NWidgetMatrix::Draw(), DrawCaption(), DrawFrame(), LinkGraphOverlay::DrawStationDots(), and GetDrawStringCompanyColour().

◆ GetContrastColour()

TextColour GetContrastColour ( uint8_t  background,
uint8_t  threshold 
)

Determine a contrasty text colour for a coloured background.

Parameters
backgroundBackground colour.
thresholdBackground colour brightness threshold below which the background is considered dark and TC_WHITE is returned, range: 0 - 255, default 128.
Returns
TC_BLACK or TC_WHITE depending on what gives a better contrast.

Definition at line 287 of file palette.cpp.

References _cur_palette, and Palette::palette.

◆ GetNearestColourIndex()

uint8_t GetNearestColourIndex ( uint8_t  r,
uint8_t  g,
uint8_t  b 
)

Get nearest colour palette index from an RGB colour.

A search is performed if this colour is not already in the lookup table.

Parameters
rRed component.
gGreen component.
bBlue component.
Returns
nearest colour palette index.

Definition at line 127 of file palette.cpp.

◆ SetColourGradient()

void SetColourGradient ( Colours  colour,
ColourShade  shade,
uint8_t  palette_index 
)

Set colour gradient palette index.

Parameters
colourColour.
shadeShade level from 1 to 7.
palette_indexPalette index to set.

Definition at line 325 of file palette.cpp.

Variable Documentation

◆ PALETTE_BITS

const uint PALETTE_BITS = 6

PALETTE_BITS reduces the bits-per-channel of 32bpp graphics data to allow faster palette lookups from a smaller lookup table.

6 bpc is chosen as this results in a palette lookup table of 256KiB with adequate fidelty. In constract, a 5 bpc lookup table would be 32KiB, and 7 bpc would be 2MiB.

Values in the table are filled as they are first encountered – larger lookup table means more colour distance calculations, and is therefore slower.

Definition at line 38 of file palette.cpp.