mirror of https://github.com/OpenTTD/OpenTTD
Codechange: Move colour brightness methods to palette code.
This allows reuse outside of blitters.pull/13349/head
parent
83e9ee00f0
commit
c5d3ac7a71
|
@ -109,7 +109,7 @@ inline void Blitter_32bppAnim::Draw(const Blitter::BlitterParams *bp, ZoomLevel
|
||||||
} else {
|
} else {
|
||||||
uint r = remap[GB(m, 0, 8)];
|
uint r = remap[GB(m, 0, 8)];
|
||||||
*anim = r | (m & 0xFF00);
|
*anim = r | (m & 0xFF00);
|
||||||
if (r != 0) *dst = this->AdjustBrightness(this->LookupColourInPalette(r), GB(m, 8, 8));
|
if (r != 0) *dst = AdjustBrightness(this->LookupColourInPalette(r), GB(m, 8, 8));
|
||||||
}
|
}
|
||||||
anim++;
|
anim++;
|
||||||
dst++;
|
dst++;
|
||||||
|
@ -125,7 +125,7 @@ inline void Blitter_32bppAnim::Draw(const Blitter::BlitterParams *bp, ZoomLevel
|
||||||
} else {
|
} else {
|
||||||
uint r = remap[GB(m, 0, 8)];
|
uint r = remap[GB(m, 0, 8)];
|
||||||
*anim = 0;
|
*anim = 0;
|
||||||
if (r != 0) *dst = ComposeColourPANoCheck(this->AdjustBrightness(this->LookupColourInPalette(r), GB(m, 8, 8)), src_px->a, *dst);
|
if (r != 0) *dst = ComposeColourPANoCheck(AdjustBrightness(this->LookupColourInPalette(r), GB(m, 8, 8)), src_px->a, *dst);
|
||||||
}
|
}
|
||||||
anim++;
|
anim++;
|
||||||
dst++;
|
dst++;
|
||||||
|
@ -146,7 +146,7 @@ inline void Blitter_32bppAnim::Draw(const Blitter::BlitterParams *bp, ZoomLevel
|
||||||
} else {
|
} else {
|
||||||
uint r = remap[GB(m, 0, 8)];
|
uint r = remap[GB(m, 0, 8)];
|
||||||
*anim = r | (m & 0xFF00);
|
*anim = r | (m & 0xFF00);
|
||||||
if (r != 0) *dst = this->AdjustBrightness(this->LookupColourInPalette(r), GB(m, 8, 8));
|
if (r != 0) *dst = AdjustBrightness(this->LookupColourInPalette(r), GB(m, 8, 8));
|
||||||
}
|
}
|
||||||
anim++;
|
anim++;
|
||||||
dst++;
|
dst++;
|
||||||
|
@ -165,7 +165,7 @@ inline void Blitter_32bppAnim::Draw(const Blitter::BlitterParams *bp, ZoomLevel
|
||||||
} else {
|
} else {
|
||||||
uint r = remap[GB(m, 0, 8)];
|
uint r = remap[GB(m, 0, 8)];
|
||||||
*anim = 0;
|
*anim = 0;
|
||||||
if (r != 0) *dst = ComposeColourPANoCheck(this->AdjustBrightness(this->LookupColourInPalette(r), GB(m, 8, 8)), src_px->a, *dst);
|
if (r != 0) *dst = ComposeColourPANoCheck(AdjustBrightness(this->LookupColourInPalette(r), GB(m, 8, 8)), src_px->a, *dst);
|
||||||
}
|
}
|
||||||
anim++;
|
anim++;
|
||||||
dst++;
|
dst++;
|
||||||
|
@ -232,7 +232,7 @@ inline void Blitter_32bppAnim::Draw(const Blitter::BlitterParams *bp, ZoomLevel
|
||||||
uint m = GB(*src_n, 0, 8);
|
uint m = GB(*src_n, 0, 8);
|
||||||
/* Above PALETTE_ANIM_START is palette animation */
|
/* Above PALETTE_ANIM_START is palette animation */
|
||||||
*anim++ = *src_n;
|
*anim++ = *src_n;
|
||||||
*dst++ = (m >= PALETTE_ANIM_START) ? this->AdjustBrightness(this->LookupColourInPalette(m), GB(*src_n, 8, 8)) : src_px->data;
|
*dst++ = (m >= PALETTE_ANIM_START) ? AdjustBrightness(this->LookupColourInPalette(m), GB(*src_n, 8, 8)) : src_px->data;
|
||||||
src_px++;
|
src_px++;
|
||||||
src_n++;
|
src_n++;
|
||||||
} while (--n != 0);
|
} while (--n != 0);
|
||||||
|
@ -241,7 +241,7 @@ inline void Blitter_32bppAnim::Draw(const Blitter::BlitterParams *bp, ZoomLevel
|
||||||
uint m = GB(*src_n, 0, 8);
|
uint m = GB(*src_n, 0, 8);
|
||||||
*anim++ = 0;
|
*anim++ = 0;
|
||||||
if (m >= PALETTE_ANIM_START) {
|
if (m >= PALETTE_ANIM_START) {
|
||||||
*dst = ComposeColourPANoCheck(this->AdjustBrightness(this->LookupColourInPalette(m), GB(*src_n, 8, 8)), src_px->a, *dst);
|
*dst = ComposeColourPANoCheck(AdjustBrightness(this->LookupColourInPalette(m), GB(*src_n, 8, 8)), src_px->a, *dst);
|
||||||
} else {
|
} else {
|
||||||
*dst = ComposeColourRGBANoCheck(src_px->r, src_px->g, src_px->b, src_px->a, *dst);
|
*dst = ComposeColourRGBANoCheck(src_px->r, src_px->g, src_px->b, src_px->a, *dst);
|
||||||
}
|
}
|
||||||
|
@ -408,7 +408,7 @@ void Blitter_32bppAnim::CopyFromBuffer(void *video, const void *src, int width,
|
||||||
uint colour = GB(*anim_pal, 0, 8);
|
uint colour = GB(*anim_pal, 0, 8);
|
||||||
if (colour >= PALETTE_ANIM_START) {
|
if (colour >= PALETTE_ANIM_START) {
|
||||||
/* Update this pixel */
|
/* Update this pixel */
|
||||||
*dst_pal = this->AdjustBrightness(LookupColourInPalette(colour), GB(*anim_pal, 8, 8));
|
*dst_pal = AdjustBrightness(LookupColourInPalette(colour), GB(*anim_pal, 8, 8));
|
||||||
}
|
}
|
||||||
dst_pal++;
|
dst_pal++;
|
||||||
anim_pal++;
|
anim_pal++;
|
||||||
|
@ -517,7 +517,7 @@ void Blitter_32bppAnim::PaletteAnimate(const Palette &palette)
|
||||||
uint8_t colour = GB(value, 0, 8);
|
uint8_t colour = GB(value, 0, 8);
|
||||||
if (colour >= PALETTE_ANIM_START) {
|
if (colour >= PALETTE_ANIM_START) {
|
||||||
/* Update this pixel */
|
/* Update this pixel */
|
||||||
*dst = this->AdjustBrightness(LookupColourInPalette(colour), GB(value, 8, 8));
|
*dst = AdjustBrightness(LookupColourInPalette(colour), GB(value, 8, 8));
|
||||||
}
|
}
|
||||||
dst++;
|
dst++;
|
||||||
anim++;
|
anim++;
|
||||||
|
|
|
@ -40,7 +40,7 @@ void Blitter_32bppSSE2_Anim::PaletteAnimate(const Palette &palette)
|
||||||
const int screen_pitch = _screen.pitch;
|
const int screen_pitch = _screen.pitch;
|
||||||
const int anim_pitch = this->anim_buf_pitch;
|
const int anim_pitch = this->anim_buf_pitch;
|
||||||
__m128i anim_cmp = _mm_set1_epi16(PALETTE_ANIM_START - 1);
|
__m128i anim_cmp = _mm_set1_epi16(PALETTE_ANIM_START - 1);
|
||||||
__m128i brightness_cmp = _mm_set1_epi16(Blitter_32bppBase::DEFAULT_BRIGHTNESS);
|
__m128i brightness_cmp = _mm_set1_epi16(DEFAULT_BRIGHTNESS);
|
||||||
__m128i colour_mask = _mm_set1_epi16(0xFF);
|
__m128i colour_mask = _mm_set1_epi16(0xFF);
|
||||||
for (int y = this->anim_buf_height; y != 0 ; y--) {
|
for (int y = this->anim_buf_height; y != 0 ; y--) {
|
||||||
Colour *next_dst_ln = dst + screen_pitch;
|
Colour *next_dst_ln = dst + screen_pitch;
|
||||||
|
|
|
@ -343,7 +343,7 @@ bmcr_alpha_blend_single:
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
uint r = remap[src_mv->m];
|
uint r = remap[src_mv->m];
|
||||||
if (r != 0) *dst = ComposeColourPANoCheck(this->AdjustBrightness(this->LookupColourInPalette(r), src_mv->v), src->a, *dst);
|
if (r != 0) *dst = ComposeColourPANoCheck(AdjustBrightness(this->LookupColourInPalette(r), src_mv->v), src->a, *dst);
|
||||||
}
|
}
|
||||||
src_mv++;
|
src_mv++;
|
||||||
dst++;
|
dst++;
|
||||||
|
|
|
@ -150,36 +150,6 @@ void Blitter_32bppBase::PaletteAnimate(const Palette &)
|
||||||
/* By default, 32bpp doesn't have palette animation */
|
/* By default, 32bpp doesn't have palette animation */
|
||||||
}
|
}
|
||||||
|
|
||||||
Colour Blitter_32bppBase::ReallyAdjustBrightness(Colour colour, uint8_t brightness)
|
|
||||||
{
|
|
||||||
assert(DEFAULT_BRIGHTNESS == 1 << 7);
|
|
||||||
|
|
||||||
uint64_t combined = (((uint64_t) colour.r) << 32) | (((uint64_t) colour.g) << 16) | ((uint64_t) colour.b);
|
|
||||||
combined *= brightness;
|
|
||||||
|
|
||||||
uint16_t r = GB(combined, 39, 9);
|
|
||||||
uint16_t g = GB(combined, 23, 9);
|
|
||||||
uint16_t b = GB(combined, 7, 9);
|
|
||||||
|
|
||||||
if ((combined & 0x800080008000L) == 0L) {
|
|
||||||
return Colour(r, g, b, colour.a);
|
|
||||||
}
|
|
||||||
|
|
||||||
uint16_t ob = 0;
|
|
||||||
/* Sum overbright */
|
|
||||||
if (r > 255) ob += r - 255;
|
|
||||||
if (g > 255) ob += g - 255;
|
|
||||||
if (b > 255) ob += b - 255;
|
|
||||||
|
|
||||||
/* Reduce overbright strength */
|
|
||||||
ob /= 2;
|
|
||||||
return Colour(
|
|
||||||
r >= 255 ? 255 : std::min(r + ob * (255 - r) / 256, 255),
|
|
||||||
g >= 255 ? 255 : std::min(g + ob * (255 - g) / 256, 255),
|
|
||||||
b >= 255 ? 255 : std::min(b + ob * (255 - b) / 256, 255),
|
|
||||||
colour.a);
|
|
||||||
}
|
|
||||||
|
|
||||||
Blitter::PaletteAnimation Blitter_32bppBase::UsePaletteAnimation()
|
Blitter::PaletteAnimation Blitter_32bppBase::UsePaletteAnimation()
|
||||||
{
|
{
|
||||||
return Blitter::PALETTE_ANIMATION_NONE;
|
return Blitter::PALETTE_ANIMATION_NONE;
|
||||||
|
|
|
@ -11,9 +11,8 @@
|
||||||
#define BLITTER_32BPP_BASE_HPP
|
#define BLITTER_32BPP_BASE_HPP
|
||||||
|
|
||||||
#include "base.hpp"
|
#include "base.hpp"
|
||||||
#include "../core/bitmath_func.hpp"
|
|
||||||
#include "../core/math_func.hpp"
|
|
||||||
#include "../gfx_func.h"
|
#include "../gfx_func.h"
|
||||||
|
#include "../palette_func.h"
|
||||||
|
|
||||||
/** Base for all 32bpp blitters. */
|
/** Base for all 32bpp blitters. */
|
||||||
class Blitter_32bppBase : public Blitter {
|
class Blitter_32bppBase : public Blitter {
|
||||||
|
@ -153,28 +152,6 @@ public:
|
||||||
|
|
||||||
return Colour(grey, grey, grey);
|
return Colour(grey, grey, grey);
|
||||||
}
|
}
|
||||||
|
|
||||||
static const int DEFAULT_BRIGHTNESS = 128;
|
|
||||||
|
|
||||||
static Colour ReallyAdjustBrightness(Colour colour, uint8_t brightness);
|
|
||||||
|
|
||||||
static inline Colour AdjustBrightness(Colour colour, uint8_t brightness)
|
|
||||||
{
|
|
||||||
/* Shortcut for normal brightness */
|
|
||||||
if (brightness == DEFAULT_BRIGHTNESS) return colour;
|
|
||||||
|
|
||||||
return ReallyAdjustBrightness(colour, brightness);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline uint8_t GetColourBrightness(Colour colour)
|
|
||||||
{
|
|
||||||
uint8_t rgb_max = std::max(colour.r, std::max(colour.g, colour.b));
|
|
||||||
|
|
||||||
/* Black pixel (8bpp or old 32bpp image), so use default value */
|
|
||||||
if (rgb_max == 0) rgb_max = DEFAULT_BRIGHTNESS;
|
|
||||||
|
|
||||||
return rgb_max;
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* BLITTER_32BPP_BASE_HPP */
|
#endif /* BLITTER_32BPP_BASE_HPP */
|
||||||
|
|
|
@ -120,7 +120,7 @@ inline void Blitter_32bppOptimized::Draw(const Blitter::BlitterParams *bp, ZoomL
|
||||||
*dst = src_px->data;
|
*dst = src_px->data;
|
||||||
} else {
|
} else {
|
||||||
uint r = remap[GB(m, 0, 8)];
|
uint r = remap[GB(m, 0, 8)];
|
||||||
if (r != 0) *dst = this->AdjustBrightness(this->LookupColourInPalette(r), GB(m, 8, 8));
|
if (r != 0) *dst = AdjustBrightness(this->LookupColourInPalette(r), GB(m, 8, 8));
|
||||||
}
|
}
|
||||||
dst++;
|
dst++;
|
||||||
src_px++;
|
src_px++;
|
||||||
|
@ -133,7 +133,7 @@ inline void Blitter_32bppOptimized::Draw(const Blitter::BlitterParams *bp, ZoomL
|
||||||
*dst = ComposeColourRGBANoCheck(src_px->r, src_px->g, src_px->b, src_px->a, *dst);
|
*dst = ComposeColourRGBANoCheck(src_px->r, src_px->g, src_px->b, src_px->a, *dst);
|
||||||
} else {
|
} else {
|
||||||
uint r = remap[GB(m, 0, 8)];
|
uint r = remap[GB(m, 0, 8)];
|
||||||
if (r != 0) *dst = ComposeColourPANoCheck(this->AdjustBrightness(this->LookupColourInPalette(r), GB(m, 8, 8)), src_px->a, *dst);
|
if (r != 0) *dst = ComposeColourPANoCheck(AdjustBrightness(this->LookupColourInPalette(r), GB(m, 8, 8)), src_px->a, *dst);
|
||||||
}
|
}
|
||||||
dst++;
|
dst++;
|
||||||
src_px++;
|
src_px++;
|
||||||
|
@ -151,7 +151,7 @@ inline void Blitter_32bppOptimized::Draw(const Blitter::BlitterParams *bp, ZoomL
|
||||||
*dst = ComposeColourRGBA(g, g, g, src_px->a, *dst);
|
*dst = ComposeColourRGBA(g, g, g, src_px->a, *dst);
|
||||||
} else {
|
} else {
|
||||||
uint r = remap[GB(m, 0, 8)];
|
uint r = remap[GB(m, 0, 8)];
|
||||||
if (r != 0) *dst = this->AdjustBrightness(this->LookupColourInPalette(r), GB(m, 8, 8));
|
if (r != 0) *dst = AdjustBrightness(this->LookupColourInPalette(r), GB(m, 8, 8));
|
||||||
}
|
}
|
||||||
dst++;
|
dst++;
|
||||||
src_px++;
|
src_px++;
|
||||||
|
@ -167,7 +167,7 @@ inline void Blitter_32bppOptimized::Draw(const Blitter::BlitterParams *bp, ZoomL
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
uint r = remap[GB(m, 0, 8)];
|
uint r = remap[GB(m, 0, 8)];
|
||||||
if (r != 0) *dst = ComposeColourPANoCheck(this->AdjustBrightness(this->LookupColourInPalette(r), GB(m, 8, 8)), src_px->a, *dst);
|
if (r != 0) *dst = ComposeColourPANoCheck(AdjustBrightness(this->LookupColourInPalette(r), GB(m, 8, 8)), src_px->a, *dst);
|
||||||
}
|
}
|
||||||
dst++;
|
dst++;
|
||||||
src_px++;
|
src_px++;
|
||||||
|
@ -224,7 +224,7 @@ inline void Blitter_32bppOptimized::Draw(const Blitter::BlitterParams *bp, ZoomL
|
||||||
do {
|
do {
|
||||||
if (Tpal_to_rgb && *src_n != 0) {
|
if (Tpal_to_rgb && *src_n != 0) {
|
||||||
/* Convert the mapping channel to a RGB value */
|
/* Convert the mapping channel to a RGB value */
|
||||||
*dst = this->AdjustBrightness(this->LookupColourInPalette(GB(*src_n, 0, 8)), GB(*src_n, 8, 8)).data;
|
*dst = AdjustBrightness(this->LookupColourInPalette(GB(*src_n, 0, 8)), GB(*src_n, 8, 8)).data;
|
||||||
} else {
|
} else {
|
||||||
*dst = src_px->data;
|
*dst = src_px->data;
|
||||||
}
|
}
|
||||||
|
@ -236,7 +236,7 @@ inline void Blitter_32bppOptimized::Draw(const Blitter::BlitterParams *bp, ZoomL
|
||||||
do {
|
do {
|
||||||
if (Tpal_to_rgb && *src_n != 0) {
|
if (Tpal_to_rgb && *src_n != 0) {
|
||||||
/* Convert the mapping channel to a RGB value */
|
/* Convert the mapping channel to a RGB value */
|
||||||
Colour colour = this->AdjustBrightness(this->LookupColourInPalette(GB(*src_n, 0, 8)), GB(*src_n, 8, 8));
|
Colour colour = AdjustBrightness(this->LookupColourInPalette(GB(*src_n, 0, 8)), GB(*src_n, 8, 8));
|
||||||
*dst = ComposeColourRGBANoCheck(colour.r, colour.g, colour.b, src_px->a, *dst);
|
*dst = ComposeColourRGBANoCheck(colour.r, colour.g, colour.b, src_px->a, *dst);
|
||||||
} else {
|
} else {
|
||||||
*dst = ComposeColourRGBANoCheck(src_px->r, src_px->g, src_px->b, src_px->a, *dst);
|
*dst = ComposeColourRGBANoCheck(src_px->r, src_px->g, src_px->b, src_px->a, *dst);
|
||||||
|
@ -366,7 +366,7 @@ template <bool Tpal_to_rgb> Sprite *Blitter_32bppOptimized::EncodeInternal(const
|
||||||
|
|
||||||
if (Tpal_to_rgb) {
|
if (Tpal_to_rgb) {
|
||||||
/* Pre-convert the mapping channel to a RGB value */
|
/* Pre-convert the mapping channel to a RGB value */
|
||||||
Colour colour = this->AdjustBrightness(this->LookupColourInPalette(src->m), rgb_max);
|
Colour colour = AdjustBrightness(this->LookupColourInPalette(src->m), rgb_max);
|
||||||
dst_px->r = colour.r;
|
dst_px->r = colour.r;
|
||||||
dst_px->g = colour.g;
|
dst_px->g = colour.g;
|
||||||
dst_px->b = colour.b;
|
dst_px->b = colour.b;
|
||||||
|
|
|
@ -42,7 +42,7 @@ void Blitter_32bppSimple::Draw(Blitter::BlitterParams *bp, BlitterMode mode, Zoo
|
||||||
if (src->m == 0) {
|
if (src->m == 0) {
|
||||||
if (src->a != 0) *dst = ComposeColourRGBA(src->r, src->g, src->b, src->a, *dst);
|
if (src->a != 0) *dst = ComposeColourRGBA(src->r, src->g, src->b, src->a, *dst);
|
||||||
} else {
|
} else {
|
||||||
if (bp->remap[src->m] != 0) *dst = ComposeColourPA(this->AdjustBrightness(this->LookupColourInPalette(bp->remap[src->m]), src->v), src->a, *dst);
|
if (bp->remap[src->m] != 0) *dst = ComposeColourPA(AdjustBrightness(this->LookupColourInPalette(bp->remap[src->m]), src->v), src->a, *dst);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -53,7 +53,7 @@ void Blitter_32bppSimple::Draw(Blitter::BlitterParams *bp, BlitterMode mode, Zoo
|
||||||
*dst = ComposeColourRGBA(g, g, g, src->a, *dst);
|
*dst = ComposeColourRGBA(g, g, g, src->a, *dst);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (bp->remap[src->m] != 0) *dst = ComposeColourPA(this->AdjustBrightness(this->LookupColourInPalette(bp->remap[src->m]), src->v), src->a, *dst);
|
if (bp->remap[src->m] != 0) *dst = ComposeColourPA(AdjustBrightness(this->LookupColourInPalette(bp->remap[src->m]), src->v), src->a, *dst);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -145,7 +145,7 @@ Sprite *Blitter_32bppSimple::Encode(const SpriteLoader::SpriteCollection &sprite
|
||||||
dst[i].v = rgb_max;
|
dst[i].v = rgb_max;
|
||||||
|
|
||||||
/* Pre-convert the mapping channel to a RGB value */
|
/* Pre-convert the mapping channel to a RGB value */
|
||||||
Colour colour = this->AdjustBrightness(this->LookupColourInPalette(src->m), dst[i].v);
|
Colour colour = AdjustBrightness(this->LookupColourInPalette(src->m), dst[i].v);
|
||||||
dst[i].r = colour.r;
|
dst[i].r = colour.r;
|
||||||
dst[i].g = colour.g;
|
dst[i].g = colour.g;
|
||||||
dst[i].b = colour.b;
|
dst[i].b = colour.b;
|
||||||
|
|
|
@ -81,7 +81,7 @@ Sprite *Blitter_32bppSSE_Base::Encode(const SpriteLoader::SpriteCollection &spri
|
||||||
|
|
||||||
/* Get brightest value (or default brightness if it's a black pixel). */
|
/* Get brightest value (or default brightness if it's a black pixel). */
|
||||||
const uint8_t rgb_max = std::max({src->r, src->g, src->b});
|
const uint8_t rgb_max = std::max({src->r, src->g, src->b});
|
||||||
dst_mv->v = (rgb_max == 0) ? Blitter_32bppBase::DEFAULT_BRIGHTNESS : rgb_max;
|
dst_mv->v = (rgb_max == 0) ? DEFAULT_BRIGHTNESS : rgb_max;
|
||||||
|
|
||||||
/* Pre-convert the mapping channel to a RGB value. */
|
/* Pre-convert the mapping channel to a RGB value. */
|
||||||
const Colour colour = AdjustBrightneSSE(Blitter_32bppBase::LookupColourInPalette(src->m), dst_mv->v);
|
const Colour colour = AdjustBrightneSSE(Blitter_32bppBase::LookupColourInPalette(src->m), dst_mv->v);
|
||||||
|
@ -92,7 +92,7 @@ Sprite *Blitter_32bppSSE_Base::Encode(const SpriteLoader::SpriteCollection &spri
|
||||||
dst_rgba->r = src->r;
|
dst_rgba->r = src->r;
|
||||||
dst_rgba->g = src->g;
|
dst_rgba->g = src->g;
|
||||||
dst_rgba->b = src->b;
|
dst_rgba->b = src->b;
|
||||||
dst_mv->v = Blitter_32bppBase::DEFAULT_BRIGHTNESS;
|
dst_mv->v = DEFAULT_BRIGHTNESS;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
dst_rgba->data = 0;
|
dst_rgba->data = 0;
|
||||||
|
|
|
@ -123,7 +123,7 @@ INTERNAL_LINKAGE Colour ReallyAdjustBrightness(Colour colour, uint8_t brightness
|
||||||
uint64_t c16 = colour.b | (uint64_t) colour.g << 16 | (uint64_t) colour.r << 32;
|
uint64_t c16 = colour.b | (uint64_t) colour.g << 16 | (uint64_t) colour.r << 32;
|
||||||
c16 *= brightness;
|
c16 *= brightness;
|
||||||
uint64_t c16_ob = c16; // Helps out of order execution.
|
uint64_t c16_ob = c16; // Helps out of order execution.
|
||||||
c16 /= Blitter_32bppBase::DEFAULT_BRIGHTNESS;
|
c16 /= DEFAULT_BRIGHTNESS;
|
||||||
c16 &= 0x01FF01FF01FFULL;
|
c16 &= 0x01FF01FF01FFULL;
|
||||||
|
|
||||||
/* Sum overbright (maximum for each rgb is 508, 9 bits, -255 is changed in -256 so we just have to take the 8 lower bits into account). */
|
/* Sum overbright (maximum for each rgb is 508, 9 bits, -255 is changed in -256 so we just have to take the 8 lower bits into account). */
|
||||||
|
@ -155,7 +155,7 @@ IGNORE_UNINITIALIZED_WARNING_STOP
|
||||||
INTERNAL_LINKAGE inline Colour AdjustBrightneSSE(Colour colour, uint8_t brightness)
|
INTERNAL_LINKAGE inline Colour AdjustBrightneSSE(Colour colour, uint8_t brightness)
|
||||||
{
|
{
|
||||||
/* Shortcut for normal brightness. */
|
/* Shortcut for normal brightness. */
|
||||||
if (brightness == Blitter_32bppBase::DEFAULT_BRIGHTNESS) return colour;
|
if (brightness == DEFAULT_BRIGHTNESS) return colour;
|
||||||
|
|
||||||
return ReallyAdjustBrightness(colour, brightness);
|
return ReallyAdjustBrightness(colour, brightness);
|
||||||
}
|
}
|
||||||
|
@ -171,7 +171,7 @@ INTERNAL_LINKAGE inline __m128i AdjustBrightnessOfTwoPixels([[maybe_unused]] __m
|
||||||
* OK, not a 1 but DEFAULT_BRIGHTNESS to compensate the div.
|
* OK, not a 1 but DEFAULT_BRIGHTNESS to compensate the div.
|
||||||
*/
|
*/
|
||||||
brightness &= 0xFF00FF00;
|
brightness &= 0xFF00FF00;
|
||||||
brightness += Blitter_32bppBase::DEFAULT_BRIGHTNESS;
|
brightness += DEFAULT_BRIGHTNESS;
|
||||||
|
|
||||||
__m128i colAB = _mm_unpacklo_epi8(from, _mm_setzero_si128());
|
__m128i colAB = _mm_unpacklo_epi8(from, _mm_setzero_si128());
|
||||||
__m128i briAB = _mm_cvtsi32_si128(brightness);
|
__m128i briAB = _mm_cvtsi32_si128(brightness);
|
||||||
|
@ -420,7 +420,7 @@ bmcr_alpha_blend_single:
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
uint r = remap[src_mv->m];
|
uint r = remap[src_mv->m];
|
||||||
if (r != 0) *dst = ComposeColourPANoCheck(this->AdjustBrightness(this->LookupColourInPalette(r), src_mv->v), src->a, *dst);
|
if (r != 0) *dst = ComposeColourPANoCheck(AdjustBrightness(this->LookupColourInPalette(r), src_mv->v), src->a, *dst);
|
||||||
}
|
}
|
||||||
src_mv++;
|
src_mv++;
|
||||||
dst++;
|
dst++;
|
||||||
|
|
|
@ -243,7 +243,7 @@ inline void Blitter_40bppAnim::Draw(const Blitter::BlitterParams *bp, ZoomLevel
|
||||||
/* If the anim buffer contains a color value, the image composition will
|
/* If the anim buffer contains a color value, the image composition will
|
||||||
* only look at the RGB brightness value. As such, we can simply darken the
|
* only look at the RGB brightness value. As such, we can simply darken the
|
||||||
* RGB value to darken the anim color. */
|
* RGB value to darken the anim color. */
|
||||||
Colour b = *anim != 0 ? Colour(this->GetColourBrightness(*dst), 0, 0) : *dst;
|
Colour b = *anim != 0 ? Colour(GetColourBrightness(*dst), 0, 0) : *dst;
|
||||||
*dst = this->MakeTransparent(b, 3, 4);
|
*dst = this->MakeTransparent(b, 3, 4);
|
||||||
anim++;
|
anim++;
|
||||||
dst++;
|
dst++;
|
||||||
|
@ -365,7 +365,7 @@ void Blitter_40bppAnim::DrawColourMappingRect(void *dst, int width, int height,
|
||||||
* RGB value to darken the anim color. */
|
* RGB value to darken the anim color. */
|
||||||
do {
|
do {
|
||||||
for (int i = 0; i != width; i++) {
|
for (int i = 0; i != width; i++) {
|
||||||
Colour b = *anim != 0 ? Colour(this->GetColourBrightness(*udst), 0, 0) : *udst;
|
Colour b = *anim != 0 ? Colour(GetColourBrightness(*udst), 0, 0) : *udst;
|
||||||
*udst = MakeTransparent(b, 154);
|
*udst = MakeTransparent(b, 154);
|
||||||
udst++;
|
udst++;
|
||||||
anim++;
|
anim++;
|
||||||
|
|
|
@ -131,6 +131,42 @@ uint8_t GetNearestColourIndex(uint8_t r, uint8_t g, uint8_t b)
|
||||||
return _palette_lookup[key];
|
return _palette_lookup[key];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adjust brightness of colour.
|
||||||
|
* @param colour Colour to adjust.
|
||||||
|
* @param brightness Brightness to apply to colour.
|
||||||
|
* @returns Adjusted colour.
|
||||||
|
*/
|
||||||
|
Colour ReallyAdjustBrightness(Colour colour, int brightness)
|
||||||
|
{
|
||||||
|
if (brightness == DEFAULT_BRIGHTNESS) return colour;
|
||||||
|
|
||||||
|
uint64_t combined = (static_cast<uint64_t>(colour.r) << 32) | (static_cast<uint64_t>(colour.g) << 16) | static_cast<uint64_t>(colour.b);
|
||||||
|
combined *= brightness;
|
||||||
|
|
||||||
|
uint16_t r = GB(combined, 39, 9);
|
||||||
|
uint16_t g = GB(combined, 23, 9);
|
||||||
|
uint16_t b = GB(combined, 7, 9);
|
||||||
|
|
||||||
|
if ((combined & 0x800080008000L) == 0L) {
|
||||||
|
return Colour(r, g, b, colour.a);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint16_t ob = 0;
|
||||||
|
/* Sum overbright */
|
||||||
|
if (r > 255) ob += r - 255;
|
||||||
|
if (g > 255) ob += g - 255;
|
||||||
|
if (b > 255) ob += b - 255;
|
||||||
|
|
||||||
|
/* Reduce overbright strength */
|
||||||
|
ob /= 2;
|
||||||
|
return Colour(
|
||||||
|
r >= 255 ? 255 : std::min(r + ob * (255 - r) / 256, 255),
|
||||||
|
g >= 255 ? 255 : std::min(g + ob * (255 - g) / 256, 255),
|
||||||
|
b >= 255 ? 255 : std::min(b + ob * (255 - b) / 256, 255),
|
||||||
|
colour.a);
|
||||||
|
}
|
||||||
|
|
||||||
void DoPaletteAnimations();
|
void DoPaletteAnimations();
|
||||||
|
|
||||||
void GfxInitPalettes()
|
void GfxInitPalettes()
|
||||||
|
|
|
@ -27,6 +27,34 @@ inline uint8_t GetNearestColourIndex(const Colour colour)
|
||||||
return GetNearestColourIndex(colour.r, colour.g, colour.b);
|
return GetNearestColourIndex(colour.r, colour.g, colour.b);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static constexpr int DEFAULT_BRIGHTNESS = 128;
|
||||||
|
|
||||||
|
Colour ReallyAdjustBrightness(Colour colour, int brightness);
|
||||||
|
|
||||||
|
static inline Colour AdjustBrightness(Colour colour, uint8_t brightness)
|
||||||
|
{
|
||||||
|
/* Shortcut for normal brightness */
|
||||||
|
if (brightness == DEFAULT_BRIGHTNESS) return colour;
|
||||||
|
|
||||||
|
return ReallyAdjustBrightness(colour, brightness);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the brightness of a colour.
|
||||||
|
* This uses the maximum value of R, G or B channel, instead of perceptual brightness.
|
||||||
|
* @param colour Colour to get the brightness of.
|
||||||
|
* @returns Brightness of colour.
|
||||||
|
*/
|
||||||
|
static inline uint8_t GetColourBrightness(Colour colour)
|
||||||
|
{
|
||||||
|
uint8_t rgb_max = std::max(colour.r, std::max(colour.g, colour.b));
|
||||||
|
|
||||||
|
/* Black pixel (8bpp or old 32bpp image), so use default value */
|
||||||
|
if (rgb_max == 0) rgb_max = DEFAULT_BRIGHTNESS;
|
||||||
|
|
||||||
|
return rgb_max;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Checks if a Colours value is valid.
|
* Checks if a Colours value is valid.
|
||||||
*
|
*
|
||||||
|
|
Loading…
Reference in New Issue