|
|
@@ -120,6 +120,14 @@ static void guess_palette(uint32_t *rgba_palette, |
|
|
|
uint8_t *alpha, |
|
|
|
uint32_t subtitle_color) |
|
|
|
{ |
|
|
|
static const uint8_t level_map[4][4] = { |
|
|
|
// this configuration (full range, lowest to highest) in tests |
|
|
|
// seemed most common, so assume this |
|
|
|
{0xff}, |
|
|
|
{0x00, 0xff}, |
|
|
|
{0x00, 0x80, 0xff}, |
|
|
|
{0x00, 0x55, 0xaa, 0xff}, |
|
|
|
}; |
|
|
|
uint8_t color_used[16]; |
|
|
|
int nb_opaque_colors, i, level, j, r, g, b; |
|
|
|
|
|
|
@@ -138,18 +146,18 @@ static void guess_palette(uint32_t *rgba_palette, |
|
|
|
if (nb_opaque_colors == 0) |
|
|
|
return; |
|
|
|
|
|
|
|
j = nb_opaque_colors; |
|
|
|
j = 0; |
|
|
|
memset(color_used, 0, 16); |
|
|
|
for(i = 0; i < 4; i++) { |
|
|
|
if (alpha[i] != 0) { |
|
|
|
if (!color_used[colormap[i]]) { |
|
|
|
level = (0xff * j) / nb_opaque_colors; |
|
|
|
level = level_map[nb_opaque_colors][j]; |
|
|
|
r = (((subtitle_color >> 16) & 0xff) * level) >> 8; |
|
|
|
g = (((subtitle_color >> 8) & 0xff) * level) >> 8; |
|
|
|
b = (((subtitle_color >> 0) & 0xff) * level) >> 8; |
|
|
|
rgba_palette[i] = b | (g << 8) | (r << 16) | ((alpha[i] * 17) << 24); |
|
|
|
color_used[colormap[i]] = (i + 1); |
|
|
|
j--; |
|
|
|
j++; |
|
|
|
} else { |
|
|
|
rgba_palette[i] = (rgba_palette[color_used[colormap[i]] - 1] & 0x00ffffff) | |
|
|
|
((alpha[i] * 17) << 24); |
|
|
|