OpenTTD Source: src/palette.cpp File Reference

OpenTTD Source 14.0-beta3

Macros | Typedefs | Functions | Variables
palette.cpp File Reference
`#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.

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

## Variables
Palette | _cur_palette
| Current palette.
byte | _colour_gradient [COLOUR_END][8]
| All 16 colour gradients 8 colours per gradient from darkest (0) to lightest (7)
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

  col1 | First colour.
  r2 | Red component of second colour.
  g2 | Green component of second colour.
  b2 | Blue component of second colour.

Returns
  Euclidean distance between first and second colour.

Definition at line 72 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_palette | The location to copy the palette to.
  force_copy | Whether to ignore if there is an update for the palette.

Returns
  True iff a copy was done.

Definition at line 154 of file palette.cpp.

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

Referenced by VideoDriver_SDL::CheckPaletteAnim(), VideoDriver_Win32Base::CheckPaletteAnim(), VideoDriver_SDL_Base::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

  c | 8 bit colour component.

Returns
  Colour component reduced to PALETTE_BITS.

Definition at line 59 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

  r | Red component.
  g | Green component.
  b | Blue component.

Returns
  palette index of nearest colour.

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

## ◆ GetContrastColour()

TextColour GetContrastColour | ( | uint8_t | background,
|  | uint8_t | threshold
| ) |  |

Determine a contrasty text colour for a coloured background.

Parameters

  background | Background colour.
  threshold | Background 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 289 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

  r | Red component.
  g | Green component.
  b | Blue component.

Returns
  nearest colour palette index.

Definition at line 129 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 40 of file palette.cpp.