diff --git a/src/drawing/IDrawingEngine.h b/src/drawing/IDrawingEngine.h index 247e56407f..91d1c7a0fa 100644 --- a/src/drawing/IDrawingEngine.h +++ b/src/drawing/IDrawingEngine.h @@ -21,6 +21,7 @@ #include struct rct_drawpixelinfo; +interface IDrawingContext; interface IDrawingEngine { @@ -32,6 +33,8 @@ interface IDrawingEngine virtual void Invalidate(sint32 left, sint32 top, sint32 right, sint32 bottom) abstract; virtual void Draw() abstract; + + virtual IDrawingContext * GetDrawingContext(rct_drawpixelinfo * dpi) abstract; }; namespace DrawingEngineFactory diff --git a/src/drawing/NewDrawing.cpp b/src/drawing/NewDrawing.cpp index 530694a5c0..46e9cfe26c 100644 --- a/src/drawing/NewDrawing.cpp +++ b/src/drawing/NewDrawing.cpp @@ -14,6 +14,7 @@ *****************************************************************************/ #pragma endregion +#include "IDrawingContext.h" #include "IDrawingEngine.h" extern "C" @@ -67,6 +68,18 @@ extern "C" void gfx_draw_all_dirty_blocks() { - + } + + /** + * Clears the screen with the specified colour. + * rct2: 0x00678A9F + */ + void gfx_clear(rct_drawpixelinfo * dpi, int colour) + { + if (_drawingEngine != nullptr) + { + IDrawingContext * dc = _drawingEngine->GetDrawingContext(dpi); + dc->Clear(colour); + } } } diff --git a/src/drawing/drawing.c b/src/drawing/drawing.c index bf69c85bb5..0801364f87 100644 --- a/src/drawing/drawing.c +++ b/src/drawing/drawing.c @@ -114,22 +114,6 @@ const uint16 palette_to_g1_offset[PALETTE_TO_G1_OFFSET_COUNT] = { static void gfx_draw_dirty_blocks(int x, int y, int columns, int rows); -/** - * Clears the screen with the specified colour. - * rct2: 0x00678A9F - */ -void gfx_clear(rct_drawpixelinfo *dpi, int colour) -{ - int w = dpi->width >> dpi->zoom_level; - int h = dpi->height >> dpi->zoom_level; - uint8* ptr = dpi->bits; - - for (int y = 0; y < h; y++) { - memset(ptr, colour, w); - ptr += w + dpi->pitch; - } -} - void gfx_draw_pixel(rct_drawpixelinfo *dpi, int x, int y, int colour) { gfx_fill_rect(dpi, x, y, x, y, colour); diff --git a/src/drawing/engines/SoftwareDrawingEngine.cpp b/src/drawing/engines/SoftwareDrawingEngine.cpp index 3a4b8bd8d5..b0b019b8f8 100644 --- a/src/drawing/engines/SoftwareDrawingEngine.cpp +++ b/src/drawing/engines/SoftwareDrawingEngine.cpp @@ -16,6 +16,7 @@ #include "../../core/Math.hpp" #include "../../core/Memory.hpp" +#include "../IDrawingContext.h" #include "../IDrawingEngine.h" #include "../Rain.h" @@ -26,6 +27,8 @@ extern "C" #include "../../interface/window.h" } +class SoftwareDrawingEngine; + struct DirtyGrid { uint32 BlockShiftX; @@ -148,6 +151,25 @@ public: } }; +class SoftwareDrawingContext : public IDrawingContext +{ +private: + SoftwareDrawingEngine * _engine; + rct_drawpixelinfo * _dpi; + +public: + SoftwareDrawingContext(SoftwareDrawingEngine * engine); + ~SoftwareDrawingContext() override; + + IDrawingEngine * GetEngine() override; + + void Clear(uint32 colour) override; + void FillRect(uint32 colour, sint32 x, sint32 y, sint32 w, sint32 h) override; + void DrawSprite(uint32 image, sint32 x, sint32 y) override; + + void SetDPI(rct_drawpixelinfo * dpi); +}; + class SoftwareDrawingEngine : public IDrawingEngine { private: @@ -166,16 +188,18 @@ private: rct_drawpixelinfo _bitsDPI = { 0 }; - RainDrawer _rainDrawer; + RainDrawer _rainDrawer; + SoftwareDrawingContext * _drawingContext; public: SoftwareDrawingEngine() { - + _drawingContext = new SoftwareDrawingContext(this); } ~SoftwareDrawingEngine() override { + delete _drawingContext; delete _dirtyGrid.Blocks; delete _bits; SDL_FreeSurface(_surface); @@ -281,6 +305,17 @@ public: Display(); } + IDrawingContext * GetDrawingContext(rct_drawpixelinfo * dpi) override + { + _drawingContext->SetDPI(dpi); + return _drawingContext; + } + + rct_drawpixelinfo * GetDPI() + { + return &_bitsDPI; + } + private: void ConfigureBits(uint32 width, uint32 height, uint32 pitch) @@ -487,3 +522,48 @@ IDrawingEngine * DrawingEngineFactory::CreateSoftware() { return new SoftwareDrawingEngine(); } + +SoftwareDrawingContext::SoftwareDrawingContext(SoftwareDrawingEngine * engine) +{ + _engine = engine; +} + +SoftwareDrawingContext::~SoftwareDrawingContext() +{ + +} + +IDrawingEngine * SoftwareDrawingContext::GetEngine() +{ + return _engine; +} + +void SoftwareDrawingContext::Clear(uint32 colour) +{ + rct_drawpixelinfo * dpi = _dpi; + + int w = dpi->width >> dpi->zoom_level; + int h = dpi->height >> dpi->zoom_level; + uint8 * ptr = dpi->bits; + + for (int y = 0; y < h; y++) + { + Memory::Set(ptr, colour, w); + ptr += w + dpi->pitch; + } +} + +void SoftwareDrawingContext::FillRect(uint32 colour, sint32 x, sint32 y, sint32 w, sint32 h) +{ + +} + +void SoftwareDrawingContext::DrawSprite(uint32 image, sint32 x, sint32 y) +{ + +} + +void SoftwareDrawingContext::SetDPI(rct_drawpixelinfo * dpi) +{ + _dpi = dpi; +}