2016-05-04 19:24:41 +02:00
|
|
|
/*****************************************************************************
|
2019-03-17 08:16:15 +01:00
|
|
|
* Copyright (c) 2014-2019 OpenRCT2 developers
|
2016-05-04 19:24:41 +02:00
|
|
|
*
|
2018-06-15 14:07:34 +02:00
|
|
|
* For a complete list of all authors, please refer to contributors.md
|
|
|
|
* Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2
|
2016-05-04 19:24:41 +02:00
|
|
|
*
|
2018-06-15 14:07:34 +02:00
|
|
|
* OpenRCT2 is licensed under the GNU General Public License version 3.
|
2016-05-04 19:24:41 +02:00
|
|
|
*****************************************************************************/
|
|
|
|
|
2018-06-22 22:59:46 +02:00
|
|
|
#include "Colour.h"
|
|
|
|
|
2018-01-05 22:17:33 +01:00
|
|
|
#include "../drawing/Drawing.h"
|
2016-11-11 09:46:14 +01:00
|
|
|
#include "../sprites.h"
|
2018-06-22 22:59:46 +02:00
|
|
|
|
|
|
|
#include <algorithm>
|
|
|
|
#include <cmath>
|
2018-01-06 00:08:58 +01:00
|
|
|
|
2018-06-04 19:50:46 +02:00
|
|
|
rct_colour_map ColourMapA[COLOUR_COUNT] = {};
|
2016-11-11 09:46:14 +01:00
|
|
|
|
|
|
|
enum
|
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
INDEX_COLOUR_0 = 243,
|
|
|
|
INDEX_COLOUR_1 = 245,
|
|
|
|
INDEX_DARKEST = 245,
|
|
|
|
INDEX_DARKER = 246,
|
|
|
|
INDEX_DARK = 247,
|
|
|
|
INDEX_MID_DARK = 248,
|
|
|
|
INDEX_MID_LIGHT = 249,
|
|
|
|
INDEX_LIGHT = 250,
|
|
|
|
INDEX_LIGHTER = 251,
|
|
|
|
INDEX_LIGHTEST = 252,
|
|
|
|
INDEX_COLOUR_10 = 253,
|
|
|
|
INDEX_COLOUR_11 = 254,
|
2016-11-11 09:46:14 +01:00
|
|
|
};
|
2015-11-08 19:55:32 +01:00
|
|
|
|
|
|
|
void colours_init_maps()
|
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
// Get colour maps from g1
|
2018-06-20 17:28:51 +02:00
|
|
|
for (int32_t i = 0; i < COLOUR_COUNT; i++)
|
2017-10-05 15:55:39 +02:00
|
|
|
{
|
2018-06-22 22:59:46 +02:00
|
|
|
const rct_g1_element* g1 = gfx_get_g1_element(SPR_PALETTE_2_START + i);
|
2018-01-07 21:43:07 +01:00
|
|
|
if (g1 != nullptr)
|
2017-10-26 14:14:37 +02:00
|
|
|
{
|
|
|
|
ColourMapA[i].colour_0 = g1->offset[INDEX_COLOUR_0];
|
|
|
|
ColourMapA[i].colour_1 = g1->offset[INDEX_COLOUR_1];
|
|
|
|
ColourMapA[i].darkest = g1->offset[INDEX_DARKEST];
|
|
|
|
ColourMapA[i].darker = g1->offset[INDEX_DARKER];
|
|
|
|
ColourMapA[i].dark = g1->offset[INDEX_DARK];
|
|
|
|
ColourMapA[i].mid_dark = g1->offset[INDEX_MID_DARK];
|
|
|
|
ColourMapA[i].mid_light = g1->offset[INDEX_MID_LIGHT];
|
|
|
|
ColourMapA[i].light = g1->offset[INDEX_LIGHT];
|
|
|
|
ColourMapA[i].lighter = g1->offset[INDEX_LIGHTER];
|
|
|
|
ColourMapA[i].lightest = g1->offset[INDEX_LIGHTEST];
|
|
|
|
ColourMapA[i].colour_10 = g1->offset[INDEX_COLOUR_10];
|
|
|
|
ColourMapA[i].colour_11 = g1->offset[INDEX_COLOUR_11];
|
|
|
|
}
|
2017-06-06 23:24:18 +02:00
|
|
|
}
|
2015-11-08 19:55:32 +01:00
|
|
|
}
|
2017-10-13 16:17:21 +02:00
|
|
|
|
|
|
|
#ifndef NO_TTF
|
2018-06-22 22:59:46 +02:00
|
|
|
static uint8_t BlendColourMap[PALETTE_COUNT][PALETTE_COUNT] = { 0 };
|
2017-10-13 16:17:21 +02:00
|
|
|
|
2018-06-20 17:28:51 +02:00
|
|
|
static uint8_t findClosestPaletteIndex(uint8_t red, uint8_t green, uint8_t blue)
|
2017-10-13 16:17:21 +02:00
|
|
|
{
|
2018-06-20 17:28:51 +02:00
|
|
|
int16_t closest = -1;
|
|
|
|
int32_t closestDistance = INT32_MAX;
|
2017-10-13 16:17:21 +02:00
|
|
|
|
2017-10-13 22:13:58 +02:00
|
|
|
for (int i = PALETTE_INDEX_0; i < PALETTE_INDEX_230; i++)
|
2017-10-13 16:17:21 +02:00
|
|
|
{
|
2018-06-22 22:59:46 +02:00
|
|
|
const int32_t distance = std::pow(gPalette[i].red - red, 2) + std::pow(gPalette[i].green - green, 2)
|
|
|
|
+ std::pow(gPalette[i].blue - blue, 2);
|
2017-10-13 16:17:21 +02:00
|
|
|
|
|
|
|
if (distance < closestDistance)
|
|
|
|
{
|
|
|
|
closest = i;
|
|
|
|
closestDistance = distance;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return closest;
|
|
|
|
}
|
|
|
|
|
2018-06-20 17:28:51 +02:00
|
|
|
uint8_t blendColours(const uint8_t paletteIndex1, const uint8_t paletteIndex2)
|
2017-10-13 16:17:21 +02:00
|
|
|
{
|
2018-06-20 17:28:51 +02:00
|
|
|
const uint8_t cMin = std::min(paletteIndex1, paletteIndex2);
|
|
|
|
const uint8_t cMax = std::max(paletteIndex1, paletteIndex2);
|
2017-10-13 16:17:21 +02:00
|
|
|
|
|
|
|
if (BlendColourMap[cMin][cMax] != 0)
|
|
|
|
{
|
|
|
|
return BlendColourMap[cMin][cMax];
|
|
|
|
}
|
|
|
|
|
2018-06-20 17:28:51 +02:00
|
|
|
uint8_t red = (gPalette[cMin].red + gPalette[cMax].red) / 2;
|
|
|
|
uint8_t green = (gPalette[cMin].green + gPalette[cMax].green) / 2;
|
|
|
|
uint8_t blue = (gPalette[cMin].blue + gPalette[cMax].blue) / 2;
|
2017-10-13 16:17:21 +02:00
|
|
|
|
2017-10-13 22:12:09 +02:00
|
|
|
BlendColourMap[cMin][cMax] = findClosestPaletteIndex(red, green, blue);
|
2017-10-13 16:17:21 +02:00
|
|
|
return BlendColourMap[cMin][cMax];
|
|
|
|
}
|
|
|
|
#endif
|