OpenTTD Source 20241224-master-gf74b0cf984
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.
 
static uint CalculateColourDistance (const Colour &col1, int r2, int g2, int b2)
 Calculate distance between two colours.
 
static uint8_t FindNearestColourIndex (uint8_t r, uint8_t g, uint8_t b)
 Find nearest colour palette index for a 32bpp pixel.
 
uint8_t GetNearestColourIndex (uint8_t r, uint8_t g, uint8_t b)
 Get nearest colour palette index from an RGB colour.
 
void DoPaletteAnimations ()
 
void GfxInitPalettes ()
 
bool CopyPalette (Palette &local_palette, bool force_copy)
 Copy the current palette if the palette was updated.
 
TextColour GetContrastColour (uint8_t background, uint8_t threshold)
 Determine a contrasty text colour for a coloured background.
 
uint8_t GetColourGradient (Colours colour, ColourShade shade)
 Get colour gradient palette index.
 
void SetColourGradient (Colours colour, ColourShade shade, uint8_t palette_index)
 Set colour gradient palette index.
 

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.
 
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.

Macro Definition Documentation

◆ EXTR

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

Definition at line 169 of file palette.cpp.

◆ EXTR2

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

Definition at line 170 of file palette.cpp.

Typedef Documentation

◆ PaletteLookup

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

Definition at line 44 of 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.

References Colour::b.

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_OpenGL::AllocateBackingStore(), 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().

◆ DoPaletteAnimations()

void DoPaletteAnimations ( )

Definition at line 172 of file palette.cpp.

◆ 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.

Referenced by GetNearestColourIndex().

◆ GetColourGradient()

◆ 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, Colour::b, and Palette::palette.

Referenced by LinkGraphLegendWindow::DrawWidget(), and StationsWndShowStationRating().

◆ 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.

References FindNearestColourIndex(), and PALETTE_BITS.

Referenced by Blitter_32bppSimple::Draw(), Blitter_32bppOptimized::Draw(), and Blitter_40bppAnim::Draw().

◆ GfxInitPalettes()

void GfxInitPalettes ( )

Definition at line 136 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.

Referenced by HandleBootstrap(), and SetupColoursAndInitialWindow().

Variable Documentation

◆ _cur_palette

◆ _palette_lookup

PaletteLookup _palette_lookup {}
static

Definition at line 45 of file palette.cpp.

◆ _palette_mutex

std::recursive_mutex _palette_mutex
static

To coordinate access to _cur_palette.

Definition at line 26 of file palette.cpp.

Referenced by CopyPalette().

◆ 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.

Referenced by GetNearestColourIndex().

◆ PALETTE_BITS_MASK

const uint PALETTE_BITS_MASK = ((1U << PALETTE_BITS) - 1) << PALETTE_SHIFT

Definition at line 40 of file palette.cpp.

◆ PALETTE_BITS_OR

const uint PALETTE_BITS_OR = (1U << (PALETTE_SHIFT - 1))

Definition at line 41 of file palette.cpp.

◆ PALETTE_INDEX_CC_END

const uint8_t PALETTE_INDEX_CC_END = PALETTE_INDEX_CC_START + 8

Palette index of end of company colour remap area.

Definition at line 83 of file palette.cpp.

Referenced by FindNearestColourIndex().

◆ PALETTE_INDEX_CC_START

const uint8_t PALETTE_INDEX_CC_START = 198

Palette index of start of company colour remap area.

Definition at line 82 of file palette.cpp.

Referenced by FindNearestColourIndex().

◆ PALETTE_INDEX_END

const uint8_t PALETTE_INDEX_END = 215

Palette index of end of defined palette.

Definition at line 85 of file palette.cpp.

Referenced by FindNearestColourIndex().

◆ PALETTE_INDEX_START

const uint8_t PALETTE_INDEX_START = 1

Palette index of start of defined palette.

Definition at line 84 of file palette.cpp.

Referenced by FindNearestColourIndex().

◆ PALETTE_SHIFT

const uint PALETTE_SHIFT = 8 - PALETTE_BITS

Definition at line 39 of file palette.cpp.