Blitter: Do not override global screen pitch to use 8bpp blitter
8bpp blitter keep a point to pitch (default screen pitch)
This commit is contained in:
@@ -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 {
|
||||||
|
Reference in New Issue
Block a user