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 3 months ago
parent 539ca43525
commit ff0c77ee3b

@ -17,21 +17,22 @@
void Blitter_8bppBase::DrawColourMappingRect(void *dst, int width, int height, PaletteID pal)
{
const uint8_t *ctab = GetNonSprite(pal, SpriteType::Recolour) + 1;
const int screen_pitch = this->GetScreenPitch();
do {
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);
}
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)
{
*((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)
@ -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)
{
const int screen_pitch = this->GetScreenPitch();
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)
{
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 {
memcpy(dst, colours, width * sizeof(uint8_t));
dst += _screen.pitch;
dst += screen_pitch;
colours += pitch;
} while (--lines);
}
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 {
for (size_t i = 0; i < width; i++) {
if (colours[i] != 0xD7) dst[i] = colours[i];
}
dst += _screen.pitch;
dst += screen_pitch;
colours += pitch;
} while (--lines);
}
void Blitter_8bppBase::DrawRect(void *video, int width, int height, uint8_t colour)
{
const int screen_pitch = this->GetScreenPitch();
do {
memset(video, colour, width);
video = (uint8_t *)video + _screen.pitch;
video = (uint8_t *)video + screen_pitch;
} while (--height);
}
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)
{
uint8_t *dst = (uint8_t *)video;
const uint8_t *usrc = (const uint8_t *)src;
const int screen_pitch = this->GetScreenPitch();
for (; height > 0; height--) {
memcpy(dst, usrc, width * sizeof(uint8_t));
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;
const uint8_t *src = (const uint8_t *)video;
const int screen_pitch = this->GetScreenPitch();
for (; height > 0; height--) {
memcpy(udst, src, width * sizeof(uint8_t));
src += _screen.pitch;
src += screen_pitch;
udst += width;
}
}
@ -109,10 +116,11 @@ void Blitter_8bppBase::CopyImageToBuffer(const void *video, void *dst, int width
{
uint8_t *udst = (uint8_t *)dst;
const uint8_t *src = (const uint8_t *)video;
const int screen_pitch = this->GetScreenPitch();
for (; height > 0; height--) {
memcpy(udst, src, width * sizeof(uint8_t));
src += _screen.pitch;
src += screen_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;
uint8_t *dst;
const int screen_pitch = this->GetScreenPitch();
if (scroll_y > 0) {
/* Calculate pointers */
dst = (uint8_t *)video + left + (top + height - 1) * _screen.pitch;
src = dst - scroll_y * _screen.pitch;
dst = (uint8_t *)video + left + (top + height - 1) * screen_pitch;
src = dst - scroll_y * this->GetScreenPitch();
/* Decrease height and increase top */
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--) {
memcpy(dst, src, width * sizeof(uint8_t));
src -= _screen.pitch;
dst -= _screen.pitch;
src -= screen_pitch;
dst -= screen_pitch;
}
} else {
/* Calculate pointers */
dst = (uint8_t *)video + left + top * _screen.pitch;
src = dst - scroll_y * _screen.pitch;
dst = (uint8_t *)video + left + top * screen_pitch;
src = dst - scroll_y * screen_pitch;
/* Decrease height. (scroll_y is <=0). */
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 */
for (int h = height; h > 0; h--) {
memmove(dst, src, width * sizeof(uint8_t));
src += _screen.pitch;
dst += _screen.pitch;
src += screen_pitch;
dst += screen_pitch;
}
}
}

@ -11,13 +11,35 @@
#define BLITTER_8BPP_BASE_HPP
#include "base.hpp"
#include "../gfx_type.h"
/** Base for all 8bpp blitters. */
class Blitter_8bppBase : public Blitter {
const int *screen_pitch;
public:
Blitter_8bppBase()
{
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;

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

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

@ -227,19 +227,4 @@ inline int GetCharacterHeight(FontSize 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 */

@ -494,10 +494,9 @@ static bool ScrollViewportPixelCacheGeneric(Viewport *vp, std::vector<byte> &cac
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 blitter;
const int pitch = width;
Blitter_8bppDrawing blitter(&pitch);
blitter.ScrollBuffer(cache.data(), 0, 0, width, height, offset_x, offset_y);
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.top = UnScaleByZoomLower(vp->virtual_top, vp->zoom);
Blitter_8bppDrawing blitter;
const int pitch = vp->width;
Blitter_8bppDrawing blitter(&pitch);
BlitterFactory::TemporaryCurrentBlitterOverride current_blitter(&blitter);
TemporaryScreenPitchOverride screen_pitch(vp->width);
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.top = UnScaleByZoomLower(vp->virtual_top, vp->zoom);
Blitter_8bppDrawing blitter;
const int pitch = vp->width;
Blitter_8bppDrawing blitter(&pitch);
BlitterFactory::TemporaryCurrentBlitterOverride current_blitter(&blitter);
TemporaryScreenPitchOverride screen_pitch(vp->width);
ViewportDrawPlans(vp, &plan_dpi);
}
} else {

Loading…
Cancel
Save