diff --git a/src/blitter/32bpp_anim.cpp b/src/blitter/32bpp_anim.cpp index d10213745a..6e63c59c77 100644 --- a/src/blitter/32bpp_anim.cpp +++ b/src/blitter/32bpp_anim.cpp @@ -399,6 +399,15 @@ void Blitter_32bppAnim::SetPixel(void *video, int x, int y, uint8 colour) this->anim_buf[this->ScreenToAnimOffset((uint32 *)video) + x + y * this->anim_buf_pitch] = colour | (DEFAULT_BRIGHTNESS << 8); } +void Blitter_32bppAnim::SetPixel32(void *video, int x, int y, uint8 colour, uint32 colour32) +{ + *((Colour *)video + x + y * _screen.pitch) = colour32; + + /* Set the colour in the anim-buffer too, if we are rendering to the screen */ + if (_screen_disable_anim) return; + this->anim_buf[this->ScreenToAnimOffset((uint32 *)video) + x + y * this->anim_buf_pitch] = 0; +} + void Blitter_32bppAnim::DrawLine(void *video, int x, int y, int x2, int y2, int screen_width, int screen_height, uint8 colour, int width, int dash) { const Colour c = LookupColourInPalette(colour); diff --git a/src/blitter/32bpp_anim.hpp b/src/blitter/32bpp_anim.hpp index 90d1b544da..accf02a210 100644 --- a/src/blitter/32bpp_anim.hpp +++ b/src/blitter/32bpp_anim.hpp @@ -38,6 +38,7 @@ public: void Draw(Blitter::BlitterParams *bp, BlitterMode mode, ZoomLevel zoom) override; void DrawColourMappingRect(void *dst, int width, int height, PaletteID pal) override; void SetPixel(void *video, int x, int y, uint8 colour) override; + void SetPixel32(void *video, int x, int y, uint8 colour, uint32 colour32) override; void DrawLine(void *video, int x, int y, int x2, int y2, int screen_width, int screen_height, uint8 colour, int width, int dash) override; void SetRect(void *video, int x, int y, const uint8 *colours, uint lines, uint width, uint pitch) override; void SetRect32(void *video, int x, int y, const uint32 *colours, uint lines, uint width, uint pitch) override; diff --git a/src/blitter/32bpp_base.cpp b/src/blitter/32bpp_base.cpp index 4f41bb2626..6a087cd274 100644 --- a/src/blitter/32bpp_base.cpp +++ b/src/blitter/32bpp_base.cpp @@ -23,6 +23,11 @@ void Blitter_32bppBase::SetPixel(void *video, int x, int y, uint8 colour) *((Colour *)video + x + y * _screen.pitch) = LookupColourInPalette(colour); } +void Blitter_32bppBase::SetPixel32(void *video, int x, int y, uint8 colour, uint32 colour32) +{ + *((Colour *)video + x + y * _screen.pitch) = colour32; +} + void Blitter_32bppBase::DrawLine(void *video, int x, int y, int x2, int y2, int screen_width, int screen_height, uint8 colour, int width, int dash) { const Colour c = LookupColourInPalette(colour); diff --git a/src/blitter/32bpp_base.hpp b/src/blitter/32bpp_base.hpp index 2bf2c50b53..86fc913115 100644 --- a/src/blitter/32bpp_base.hpp +++ b/src/blitter/32bpp_base.hpp @@ -21,6 +21,7 @@ public: uint8 GetScreenDepth() override { return 32; } void *MoveTo(void *video, int x, int y) override; void SetPixel(void *video, int x, int y, uint8 colour) override; + void SetPixel32(void *video, int x, int y, uint8 colour, uint32 colour32) override; void DrawLine(void *video, int x, int y, int x2, int y2, int screen_width, int screen_height, uint8 colour, int width, int dash) override; void SetRect(void *video, int x, int y, const uint8 *colours, uint lines, uint width, uint pitch) override; void SetRect32(void *video, int x, int y, const uint32 *colours, uint lines, uint width, uint pitch) override; diff --git a/src/blitter/40bpp_anim.cpp b/src/blitter/40bpp_anim.cpp index 5027da9424..d1ec170c7c 100644 --- a/src/blitter/40bpp_anim.cpp +++ b/src/blitter/40bpp_anim.cpp @@ -39,6 +39,17 @@ void Blitter_40bppAnim::SetPixel(void *video, int x, int y, uint8 colour) } } +void Blitter_40bppAnim::SetPixel32(void *video, int x, int y, uint8 colour, uint32 colour32) +{ + if (_screen_disable_anim) { + Blitter_32bppOptimized::SetPixel32(video, x, y, colour, colour32); + } else { + *((Colour *)video + x + y * _screen.pitch) = colour32; + + VideoDriver::GetInstance()->GetAnimBuffer()[((uint32 *)video - (uint32 *)_screen.dst_ptr) + x + y * _screen.pitch] = 0; + } +} + void Blitter_40bppAnim::SetRect(void *video, int x, int y, const uint8 *colours, uint lines, uint width, uint pitch) { if (_screen_disable_anim) { diff --git a/src/blitter/40bpp_anim.hpp b/src/blitter/40bpp_anim.hpp index 7cc1a8bd39..8a8a80a38d 100644 --- a/src/blitter/40bpp_anim.hpp +++ b/src/blitter/40bpp_anim.hpp @@ -22,6 +22,7 @@ public: // void *MoveTo(void *video, int x, int y) override; void SetPixel(void *video, int x, int y, uint8 colour) override; + void SetPixel32(void *video, int x, int y, uint8 colour, uint32 colour32) override; void SetRect(void *video, int x, int y, const uint8 *colours, uint lines, uint width, uint pitch) override; void SetRect32(void *video, int x, int y, const uint32 *colours, uint lines, uint width, uint pitch) override; void DrawRect(void *video, int width, int height, uint8 colour) override; diff --git a/src/blitter/8bpp_base.cpp b/src/blitter/8bpp_base.cpp index 436c5c387e..d3a967b26c 100644 --- a/src/blitter/8bpp_base.cpp +++ b/src/blitter/8bpp_base.cpp @@ -34,6 +34,11 @@ void Blitter_8bppBase::SetPixel(void *video, int x, int y, uint8 colour) *((uint8 *)video + x + y * _screen.pitch) = colour; } +void Blitter_8bppBase::SetPixel32(void *video, int x, int y, uint8 colour, uint32 colour32) +{ + this->Blitter_8bppBase::SetPixel(video, x, y, colour); +} + void Blitter_8bppBase::DrawLine(void *video, int x, int y, int x2, int y2, int screen_width, int screen_height, uint8 colour, int width, int dash) { this->DrawLineGeneric(x, y, x2, y2, screen_width, screen_height, width, dash, [=](int x, int y) { diff --git a/src/blitter/8bpp_base.hpp b/src/blitter/8bpp_base.hpp index 359121b535..fa52848196 100644 --- a/src/blitter/8bpp_base.hpp +++ b/src/blitter/8bpp_base.hpp @@ -19,6 +19,7 @@ public: void DrawColourMappingRect(void *dst, int width, int height, PaletteID pal) override; void *MoveTo(void *video, int x, int y) override; void SetPixel(void *video, int x, int y, uint8 colour) override; + void SetPixel32(void *video, int x, int y, uint8 colour, uint32 colour32) override; void DrawLine(void *video, int x, int y, int x2, int y2, int screen_width, int screen_height, uint8 colour, int width, int dash) override; void SetRect(void *video, int x, int y, const uint8 *colours, uint lines, uint width, uint pitch) override; void DrawRect(void *video, int width, int height, uint8 colour) override; diff --git a/src/blitter/base.hpp b/src/blitter/base.hpp index 37154eac35..0ff1acd52c 100644 --- a/src/blitter/base.hpp +++ b/src/blitter/base.hpp @@ -117,6 +117,17 @@ public: */ virtual void SetPixel(void *video, int x, int y, uint8 colour) = 0; + /** + * Draw a pixel with a given 32bpp colour on the video-buffer. + * Fall back to an 8bpp colour if 32bpp colour is not available. + * @param video The destination pointer (video-buffer). + * @param x The x position within video-buffer. + * @param y The y position within video-buffer. + * @param colour A 8bpp mapping colour. + * @param colour32 A 32bpp colour. + */ + virtual void SetPixel32(void *video, int x, int y, uint8 colour, uint32 colour32) = 0; + /** * Draw a rectangle of pixels on the video-buffer. * @param video The destination pointer (video-buffer). diff --git a/src/blitter/null.hpp b/src/blitter/null.hpp index 822d504dae..19be8a1d57 100644 --- a/src/blitter/null.hpp +++ b/src/blitter/null.hpp @@ -21,6 +21,7 @@ public: Sprite *Encode(const SpriteLoader::Sprite *sprite, AllocatorProc *allocator) override; void *MoveTo(void *video, int x, int y) override { return nullptr; }; void SetPixel(void *video, int x, int y, uint8 colour) override {}; + void SetPixel32(void *video, int x, int y, uint8 colour, uint32 colour32) override {}; void DrawRect(void *video, int width, int height, uint8 colour) override {}; void DrawLine(void *video, int x, int y, int x2, int y2, int screen_width, int screen_height, uint8 colour, int width, int dash) override {}; void SetRect(void *video, int x, int y, const uint8 *colours, uint lines, uint width, uint pitch) override {};