Blitter: Do not override global screen pitch to use 8bpp blitter

8bpp blitter keep a point to pitch (default screen pitch)
pull/647/head
Jonathan G Rennison 4 months ago
parent 539ca43525
commit ff0c77ee3b

@ -17,21 +17,22 @@
void Blitter_8bppBase::DrawColourMappingRect(void *dst, int width, int height, PaletteID pal) void Blitter_8bppBase::DrawColourMappingRect(void *dst, int width, int height, PaletteID pal)
{ {
const uint8_t *ctab = GetNonSprite(pal, SpriteType::Recolour) + 1; const uint8_t *ctab = GetNonSprite(pal, SpriteType::Recolour) + 1;
const int screen_pitch = this->GetScreenPitch();
do { do {
for (int i = 0; i != width; i++) *((uint8_t *)dst + i) = ctab[((uint8_t *)dst)[i]]; for (int i = 0; i != width; i++) *((uint8_t *)dst + i) = ctab[((uint8_t *)dst)[i]];
dst = (uint8_t *)dst + _screen.pitch; dst = (uint8_t *)dst + screen_pitch;
} while (--height); } while (--height);
} }
void *Blitter_8bppBase::MoveTo(void *video, int x, int y) void *Blitter_8bppBase::MoveTo(void *video, int x, int y)
{ {
return (uint8_t *)video + x + y * _screen.pitch; return (uint8_t *)video + x + y * this->GetScreenPitch();
} }
void Blitter_8bppBase::SetPixel(void *video, int x, int y, uint8_t colour) void Blitter_8bppBase::SetPixel(void *video, int x, int y, uint8_t colour)
{ {
*((uint8_t *)video + x + y * _screen.pitch) = colour; *((uint8_t *)video + x + y * this->GetScreenPitch()) = colour;
} }
void Blitter_8bppBase::SetPixel32(void *video, int x, int y, uint8_t colour, uint32_t colour32) void Blitter_8bppBase::SetPixel32(void *video, int x, int y, uint8_t colour, uint32_t colour32)
@ -41,55 +42,60 @@ void Blitter_8bppBase::SetPixel32(void *video, int x, int y, uint8_t colour, uin
void Blitter_8bppBase::DrawLine(void *video, int x, int y, int x2, int y2, int screen_width, int screen_height, uint8_t colour, int width, int dash) void Blitter_8bppBase::DrawLine(void *video, int x, int y, int x2, int y2, int screen_width, int screen_height, uint8_t colour, int width, int dash)
{ {
const int screen_pitch = this->GetScreenPitch();
this->DrawLineGeneric(x, y, x2, y2, screen_width, screen_height, width, dash, [=](int x, int y) { this->DrawLineGeneric(x, y, x2, y2, screen_width, screen_height, width, dash, [=](int x, int y) {
*((uint8_t *)video + x + y * _screen.pitch) = colour; *((uint8_t *)video + x + y * screen_pitch) = colour;
}); });
} }
void Blitter_8bppBase::SetRect(void *video, int x, int y, const uint8_t *colours, uint lines, uint width, uint pitch) void Blitter_8bppBase::SetRect(void *video, int x, int y, const uint8_t *colours, uint lines, uint width, uint pitch)
{ {
uint8_t *dst = (uint8_t *)video + x + y * _screen.pitch; const int screen_pitch = this->GetScreenPitch();
uint8_t *dst = (uint8_t *)video + x + y * screen_pitch;
do { do {
memcpy(dst, colours, width * sizeof(uint8_t)); memcpy(dst, colours, width * sizeof(uint8_t));
dst += _screen.pitch; dst += screen_pitch;
colours += pitch; colours += pitch;
} while (--lines); } while (--lines);
} }
void Blitter_8bppBase::SetRectNoD7(void *video, int x, int y, const uint8_t *colours, uint lines, uint width, uint pitch) void Blitter_8bppBase::SetRectNoD7(void *video, int x, int y, const uint8_t *colours, uint lines, uint width, uint pitch)
{ {
uint8_t *dst = (uint8_t *)video + x + y * _screen.pitch; const int screen_pitch = this->GetScreenPitch();
uint8_t *dst = (uint8_t *)video + x + y * screen_pitch;
do { do {
for (size_t i = 0; i < width; i++) { for (size_t i = 0; i < width; i++) {
if (colours[i] != 0xD7) dst[i] = colours[i]; if (colours[i] != 0xD7) dst[i] = colours[i];
} }
dst += _screen.pitch; dst += screen_pitch;
colours += pitch; colours += pitch;
} while (--lines); } while (--lines);
} }
void Blitter_8bppBase::DrawRect(void *video, int width, int height, uint8_t colour) void Blitter_8bppBase::DrawRect(void *video, int width, int height, uint8_t colour)
{ {
const int screen_pitch = this->GetScreenPitch();
do { do {
memset(video, colour, width); memset(video, colour, width);
video = (uint8_t *)video + _screen.pitch; video = (uint8_t *)video + screen_pitch;
} while (--height); } while (--height);
} }
void Blitter_8bppBase::DrawRectAt(void *video, int x, int y, int width, int height, uint8_t colour) void Blitter_8bppBase::DrawRectAt(void *video, int x, int y, int width, int height, uint8_t colour)
{ {
this->Blitter_8bppBase::DrawRect((uint8_t *)video + x + y * _screen.pitch, width, height, colour); this->Blitter_8bppBase::DrawRect((uint8_t *)video + x + y * this->GetScreenPitch(), width, height, colour);
} }
void Blitter_8bppBase::CopyFromBuffer(void *video, const void *src, int width, int height) void Blitter_8bppBase::CopyFromBuffer(void *video, const void *src, int width, int height)
{ {
uint8_t *dst = (uint8_t *)video; uint8_t *dst = (uint8_t *)video;
const uint8_t *usrc = (const uint8_t *)src; const uint8_t *usrc = (const uint8_t *)src;
const int screen_pitch = this->GetScreenPitch();
for (; height > 0; height--) { for (; height > 0; height--) {
memcpy(dst, usrc, width * sizeof(uint8_t)); memcpy(dst, usrc, width * sizeof(uint8_t));
usrc += width; usrc += width;
dst += _screen.pitch; dst += screen_pitch;
} }
} }
@ -97,10 +103,11 @@ void Blitter_8bppBase::CopyToBuffer(const void *video, void *dst, int width, int
{ {
uint8_t *udst = (uint8_t *)dst; uint8_t *udst = (uint8_t *)dst;
const uint8_t *src = (const uint8_t *)video; const uint8_t *src = (const uint8_t *)video;
const int screen_pitch = this->GetScreenPitch();
for (; height > 0; height--) { for (; height > 0; height--) {
memcpy(udst, src, width * sizeof(uint8_t)); memcpy(udst, src, width * sizeof(uint8_t));
src += _screen.pitch; src += screen_pitch;
udst += width; udst += width;
} }
} }
@ -109,10 +116,11 @@ void Blitter_8bppBase::CopyImageToBuffer(const void *video, void *dst, int width
{ {
uint8_t *udst = (uint8_t *)dst; uint8_t *udst = (uint8_t *)dst;
const uint8_t *src = (const uint8_t *)video; const uint8_t *src = (const uint8_t *)video;
const int screen_pitch = this->GetScreenPitch();
for (; height > 0; height--) { for (; height > 0; height--) {
memcpy(udst, src, width * sizeof(uint8_t)); memcpy(udst, src, width * sizeof(uint8_t));
src += _screen.pitch; src += screen_pitch;
udst += dst_pitch; udst += dst_pitch;
} }
} }
@ -121,11 +129,12 @@ void Blitter_8bppBase::ScrollBuffer(void *video, int left, int top, int width, i
{ {
const uint8_t *src; const uint8_t *src;
uint8_t *dst; uint8_t *dst;
const int screen_pitch = this->GetScreenPitch();
if (scroll_y > 0) { if (scroll_y > 0) {
/* Calculate pointers */ /* Calculate pointers */
dst = (uint8_t *)video + left + (top + height - 1) * _screen.pitch; dst = (uint8_t *)video + left + (top + height - 1) * screen_pitch;
src = dst - scroll_y * _screen.pitch; src = dst - scroll_y * this->GetScreenPitch();
/* Decrease height and increase top */ /* Decrease height and increase top */
top += scroll_y; top += scroll_y;
@ -144,13 +153,13 @@ void Blitter_8bppBase::ScrollBuffer(void *video, int left, int top, int width, i
for (int h = height; h > 0; h--) { for (int h = height; h > 0; h--) {
memcpy(dst, src, width * sizeof(uint8_t)); memcpy(dst, src, width * sizeof(uint8_t));
src -= _screen.pitch; src -= screen_pitch;
dst -= _screen.pitch; dst -= screen_pitch;
} }
} else { } else {
/* Calculate pointers */ /* Calculate pointers */
dst = (uint8_t *)video + left + top * _screen.pitch; dst = (uint8_t *)video + left + top * screen_pitch;
src = dst - scroll_y * _screen.pitch; src = dst - scroll_y * screen_pitch;
/* Decrease height. (scroll_y is <=0). */ /* Decrease height. (scroll_y is <=0). */
height += scroll_y; height += scroll_y;
@ -170,8 +179,8 @@ void Blitter_8bppBase::ScrollBuffer(void *video, int left, int top, int width, i
* because source and destination may overlap */ * because source and destination may overlap */
for (int h = height; h > 0; h--) { for (int h = height; h > 0; h--) {
memmove(dst, src, width * sizeof(uint8_t)); memmove(dst, src, width * sizeof(uint8_t));
src += _screen.pitch; src += screen_pitch;
dst += _screen.pitch; dst += screen_pitch;
} }
} }
} }

@ -11,13 +11,35 @@
#define BLITTER_8BPP_BASE_HPP #define BLITTER_8BPP_BASE_HPP
#include "base.hpp" #include "base.hpp"
#include "../gfx_type.h"
/** Base for all 8bpp blitters. */ /** Base for all 8bpp blitters. */
class Blitter_8bppBase : public Blitter { class Blitter_8bppBase : public Blitter {
const int *screen_pitch;
public: public:
Blitter_8bppBase() Blitter_8bppBase()
{ {
this->SetScreenDepth(8); this->SetScreenDepth(8);
extern DrawPixelInfo _screen;
this->screen_pitch = &_screen.pitch;
}
Blitter_8bppBase(const int *screen_pitch)
{
this->SetScreenDepth(8);
this->screen_pitch = screen_pitch;
}
/**
* Get the screen pitch used for drawing.
* By default this is _screen.pitch.
*/
int GetScreenPitch() const
{
return *this->screen_pitch;
} }
void DrawColourMappingRect(void *dst, int width, int height, PaletteID pal) override; void DrawColourMappingRect(void *dst, int width, int height, PaletteID pal) override;

@ -16,6 +16,7 @@
/** Most trivial 8bpp blitter. */ /** Most trivial 8bpp blitter. */
class Blitter_8bppSimple FINAL : public Blitter_8bppBase { class Blitter_8bppSimple FINAL : public Blitter_8bppBase {
public: public:
using Blitter_8bppBase::Blitter_8bppBase;
void Draw(Blitter::BlitterParams *bp, BlitterMode mode, ZoomLevel zoom) override; void Draw(Blitter::BlitterParams *bp, BlitterMode mode, ZoomLevel zoom) override;
Sprite *Encode(const SpriteLoader::SpriteCollection &sprite, AllocatorProc *allocator) override; Sprite *Encode(const SpriteLoader::SpriteCollection &sprite, AllocatorProc *allocator) override;

@ -15,7 +15,7 @@
/** Blitter that does nothing. */ /** Blitter that does nothing. */
class Blitter_Null : public Blitter { class Blitter_Null : public Blitter {
public: public:
Blitter_Null() Blitter_Null(const int *screen_pitch = nullptr)
{ {
this->SetScreenDepth(0); this->SetScreenDepth(0);
this->SetNoSpriteDataRequired(true); this->SetNoSpriteDataRequired(true);

@ -227,19 +227,4 @@ inline int GetCharacterHeight(FontSize size)
return font_height_cache[size]; return font_height_cache[size];
} }
/* Scoped temporary screen pitch override */
struct TemporaryScreenPitchOverride {
int old_pitch;
TemporaryScreenPitchOverride(int new_pitch) : old_pitch(_screen.pitch)
{
_screen.pitch = new_pitch;
}
~TemporaryScreenPitchOverride()
{
_screen.pitch = this->old_pitch;
}
};
#endif /* GFX_FUNC_H */ #endif /* GFX_FUNC_H */

@ -494,10 +494,9 @@ static bool ScrollViewportPixelCacheGeneric(Viewport *vp, std::vector<byte> &cac
int height = vp->height; int height = vp->height;
TemporaryScreenPitchOverride screen_pitch(width);
/* Blitter_8bppDrawing::ScrollBuffer can be used on 32 bit buffers if widths and offsets are suitably adjusted */ /* Blitter_8bppDrawing::ScrollBuffer can be used on 32 bit buffers if widths and offsets are suitably adjusted */
Blitter_8bppDrawing blitter; const int pitch = width;
Blitter_8bppDrawing blitter(&pitch);
blitter.ScrollBuffer(cache.data(), 0, 0, width, height, offset_x, offset_y); blitter.ScrollBuffer(cache.data(), 0, 0, width, height, offset_x, offset_y);
auto fill_rect = [&](int x, int y, int w, int h) { auto fill_rect = [&](int x, int y, int w, int h) {
@ -3904,9 +3903,9 @@ void ViewportDoDraw(Viewport *vp, int left, int top, int right, int bottom, uint
overlay_dpi.left = UnScaleByZoomLower(vp->virtual_left, vp->zoom); overlay_dpi.left = UnScaleByZoomLower(vp->virtual_left, vp->zoom);
overlay_dpi.top = UnScaleByZoomLower(vp->virtual_top, vp->zoom); overlay_dpi.top = UnScaleByZoomLower(vp->virtual_top, vp->zoom);
Blitter_8bppDrawing blitter; const int pitch = vp->width;
Blitter_8bppDrawing blitter(&pitch);
BlitterFactory::TemporaryCurrentBlitterOverride current_blitter(&blitter); BlitterFactory::TemporaryCurrentBlitterOverride current_blitter(&blitter);
TemporaryScreenPitchOverride screen_pitch(vp->width);
vp->overlay->Draw(&overlay_dpi); vp->overlay->Draw(&overlay_dpi);
} }
} }
@ -3941,9 +3940,9 @@ void ViewportDoDraw(Viewport *vp, int left, int top, int right, int bottom, uint
plan_dpi.left = UnScaleByZoomLower(vp->virtual_left, vp->zoom); plan_dpi.left = UnScaleByZoomLower(vp->virtual_left, vp->zoom);
plan_dpi.top = UnScaleByZoomLower(vp->virtual_top, vp->zoom); plan_dpi.top = UnScaleByZoomLower(vp->virtual_top, vp->zoom);
Blitter_8bppDrawing blitter; const int pitch = vp->width;
Blitter_8bppDrawing blitter(&pitch);
BlitterFactory::TemporaryCurrentBlitterOverride current_blitter(&blitter); BlitterFactory::TemporaryCurrentBlitterOverride current_blitter(&blitter);
TemporaryScreenPitchOverride screen_pitch(vp->width);
ViewportDrawPlans(vp, &plan_dpi); ViewportDrawPlans(vp, &plan_dpi);
} }
} else { } else {

Loading…
Cancel
Save