Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Introduce render context #1766

Merged
merged 6 commits into from Jan 27, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
3 changes: 3 additions & 0 deletions src/OpenLoco/CMakeLists.txt
Expand Up @@ -63,6 +63,7 @@ set(OLOCO_SOURCES
"${CMAKE_CURRENT_SOURCE_DIR}/src/Date.cpp"
"${CMAKE_CURRENT_SOURCE_DIR}/src/Drawing/DrawSprite.cpp"
"${CMAKE_CURRENT_SOURCE_DIR}/src/Drawing/FPSCounter.cpp"
"${CMAKE_CURRENT_SOURCE_DIR}/src/Drawing/SoftwareDrawingContext.cpp"
"${CMAKE_CURRENT_SOURCE_DIR}/src/Drawing/SoftwareDrawingEngine.cpp"
"${CMAKE_CURRENT_SOURCE_DIR}/src/Economy/Economy.cpp"
"${CMAKE_CURRENT_SOURCE_DIR}/src/EditorController.cpp"
Expand Down Expand Up @@ -307,7 +308,9 @@ set(OLOCO_HEADERS
"${CMAKE_CURRENT_SOURCE_DIR}/src/Console.h"
"${CMAKE_CURRENT_SOURCE_DIR}/src/Date.h"
"${CMAKE_CURRENT_SOURCE_DIR}/src/Drawing/DrawSprite.h"
"${CMAKE_CURRENT_SOURCE_DIR}/src/Drawing/DrawingContext.h"
"${CMAKE_CURRENT_SOURCE_DIR}/src/Drawing/FPSCounter.h"
"${CMAKE_CURRENT_SOURCE_DIR}/src/Drawing/SoftwareDrawingContext.h"
"${CMAKE_CURRENT_SOURCE_DIR}/src/Drawing/SoftwareDrawingEngine.h"
"${CMAKE_CURRENT_SOURCE_DIR}/src/Economy/Currency.h"
"${CMAKE_CURRENT_SOURCE_DIR}/src/Economy/Economy.h"
Expand Down
154 changes: 154 additions & 0 deletions src/OpenLoco/src/Drawing/DrawingContext.h
@@ -0,0 +1,154 @@
#pragma once

#include "Graphics/Gfx.h"
#include "Graphics/PaletteMap.h"
#include "Types.hpp"
#include "Ui/Rect.h"
#include <cstdint>

namespace OpenLoco::Drawing
{
class DrawingContext
{
public:
virtual ~DrawingContext() = default;

virtual void clear(Gfx::RenderTarget& rt, uint32_t fill) = 0;
virtual void clearSingle(Gfx::RenderTarget& rt, uint8_t paletteId) = 0;

virtual int16_t clipString(int16_t width, char* string) = 0;
virtual uint16_t getStringWidth(const char* buffer) = 0;
virtual uint16_t getMaxStringWidth(const char* buffer) = 0;

virtual Ui::Point drawString(Gfx::RenderTarget& rt, int16_t x, int16_t y, AdvancedColour colour, void* str) = 0;

virtual int16_t drawStringLeftWrapped(
Gfx::RenderTarget& rt,
int16_t x,
int16_t y,
int16_t width,
AdvancedColour colour,
string_id stringId,
const void* args = nullptr)
= 0;

virtual void drawStringLeft(
Gfx::RenderTarget& rt,
int16_t x,
int16_t y,
AdvancedColour colour,
string_id stringId,
const void* args = nullptr)
= 0;

virtual void drawStringLeft(
Gfx::RenderTarget& rt,
Ui::Point* origin,
AdvancedColour colour,
string_id stringId,
const void* args = nullptr)
= 0;

virtual void drawStringLeftClipped(
Gfx::RenderTarget& rt,
int16_t x,
int16_t y,
int16_t width,
AdvancedColour colour,
string_id stringId,
const void* args = nullptr)
= 0;

virtual void drawStringRight(
Gfx::RenderTarget& rt,
int16_t x,
int16_t y,
AdvancedColour colour,
string_id stringId,
const void* args = nullptr)
= 0;

virtual void drawStringRightUnderline(
Gfx::RenderTarget& rt,
int16_t x,
int16_t y,
AdvancedColour colour,
string_id stringId,
const void* args)
= 0;

virtual void drawStringLeftUnderline(
Gfx::RenderTarget& rt,
int16_t x,
int16_t y,
AdvancedColour colour,
string_id stringId,
const void* args = nullptr)
= 0;

virtual void drawStringCentred(
Gfx::RenderTarget& rt,
int16_t x,
int16_t y,
AdvancedColour colour,
string_id stringId,
const void* args = nullptr)
= 0;

virtual void drawStringCentredClipped(
Gfx::RenderTarget& rt,
int16_t x,
int16_t y,
int16_t width,
AdvancedColour colour,
string_id stringId,
const void* args = nullptr)
= 0;

virtual uint16_t drawStringCentredWrapped(
Gfx::RenderTarget& rt,
Ui::Point& origin,
uint16_t width,
AdvancedColour colour,
string_id stringId,
const void* args = nullptr)
= 0;

virtual void drawStringCentredRaw(
Gfx::RenderTarget& rt,
int16_t x,
int16_t y,
int16_t width,
AdvancedColour colour,
const void* args)
= 0;

virtual void drawStringYOffsets(Gfx::RenderTarget& rt, const Ui::Point& loc, AdvancedColour colour, const void* args, const int8_t* yOffsets) = 0;

virtual uint16_t getStringWidthNewLined(const char* buffer) = 0;

virtual std::pair<uint16_t, uint16_t> wrapString(char* buffer, uint16_t stringWidth) = 0;

virtual void fillRect(Gfx::RenderTarget& rt, int16_t left, int16_t top, int16_t right, int16_t bottom, uint32_t colour) = 0;

virtual void drawRect(Gfx::RenderTarget& rt, int16_t x, int16_t y, uint16_t dx, uint16_t dy, uint32_t colour) = 0;

virtual void fillRectInset(Gfx::RenderTarget& rt, int16_t left, int16_t top, int16_t right, int16_t bottom, uint32_t colour, uint8_t flags) = 0;

virtual void drawRectInset(Gfx::RenderTarget& rt, int16_t x, int16_t y, uint16_t dx, uint16_t dy, uint32_t colour, uint8_t flags) = 0;

virtual void drawLine(Gfx::RenderTarget& rt, int16_t left, int16_t top, int16_t right, int16_t bottom, uint32_t colour) = 0;

virtual void drawImage(Gfx::RenderTarget* rt, int16_t x, int16_t y, uint32_t image) = 0;

virtual void drawImage(Gfx::RenderTarget& rt, const Ui::Point& pos, const ImageId& image) = 0;

virtual void drawImageSolid(Gfx::RenderTarget& rt, const Ui::Point& pos, const ImageId& image, PaletteIndex_t paletteIndex) = 0;

virtual void drawImagePaletteSet(Gfx::RenderTarget& rt, const Ui::Point& pos, const ImageId& image, Gfx::PaletteMap::View palette, const Gfx::G1Element* noiseImage) = 0;

virtual int16_t getCurrentFontSpriteBase() = 0;

virtual void setCurrentFontSpriteBase(int16_t base) = 0;
};
}
7 changes: 5 additions & 2 deletions src/OpenLoco/src/Drawing/FPSCounter.cpp
@@ -1,4 +1,5 @@
#include "FPSCounter.h"
#include "Drawing/SoftwareDrawingEngine.h"
#include "Graphics/Colour.h"
#include "Graphics/Gfx.h"
#include "Localisation/StringManager.h"
Expand Down Expand Up @@ -35,6 +36,8 @@ namespace OpenLoco::Drawing

void drawFPS()
{
auto& drawingCtx = Gfx::getDrawingEngine().getDrawingContext();

// Measure FPS
const float fps = measureFPS();

Expand All @@ -50,10 +53,10 @@ namespace OpenLoco::Drawing
auto& rt = Gfx::getScreenRT();

// Draw text
const int stringWidth = Gfx::getStringWidth(buffer);
const int stringWidth = drawingCtx.getStringWidth(buffer);
const auto x = Ui::width() / 2 - (stringWidth / 2);
const auto y = 2;
Gfx::drawString(rt, x, y, Colour::black, buffer);
drawingCtx.drawString(rt, x, y, Colour::black, buffer);

// Make area dirty so the text doesn't get drawn over the last
Gfx::invalidateRegion(x - 16, y - 4, x + 16, 16);
Expand Down