Skip to content

Commit 9b57055

Browse files
authored
Merge pull request #26 from kimkulling/refactorings/decouple_backend
Refactorings/decouple backend
2 parents 607a766 + aa432b1 commit 9b57055

6 files changed

Lines changed: 120 additions & 86 deletions

File tree

src/backends/sdl2_renderer.cpp

Lines changed: 74 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -74,10 +74,11 @@ namespace {
7474
}
7575
}
7676

77-
void showDriverInUse(const Context &ctx) {
77+
void showDriverInUse(Context &ctx) {
7878
ctx.mLogger(LogSeverity::Message, "Driver in use:");
79+
SDLContext *sdlCtx = getBackendContext(ctx);
7980
SDL_RendererInfo info;
80-
SDL_GetRendererInfo(ctx.mSDLContext->mRenderer, &info);
81+
SDL_GetRendererInfo(sdlCtx->mRenderer, &info);
8182
printDriverInfo(info);
8283
}
8384

@@ -178,15 +179,17 @@ ret_code Renderer::releaseRenderer(Context &ctx) {
178179
delete ctx.mDefaultFont;
179180
ctx.mDefaultFont = nullptr;
180181
}
182+
181183
IMG_Quit();
182-
if (ctx.mSDLContext == nullptr) {
184+
if (ctx.mBackendCtx == nullptr) {
183185
SDL_Quit();
184186
return ResultOk;
185187
}
186188

187-
if (ctx.mSDLContext->mRenderer != nullptr) {
188-
SDL_DestroyRenderer(ctx.mSDLContext->mRenderer);
189-
ctx.mSDLContext->mRenderer = nullptr;
189+
SDLContext *sdlCtx = getBackendContext(ctx);
190+
if (sdlCtx->mRenderer != nullptr) {
191+
SDL_DestroyRenderer(sdlCtx->mRenderer);
192+
sdlCtx->mRenderer = nullptr;
190193
}
191194
SDL_Quit();
192195

@@ -220,15 +223,16 @@ ret_code Renderer::drawText(Context &ctx, const char *string, Font *font, const
220223
return ErrorCode;
221224
}
222225

223-
SDL_Texture *messageTexture = SDL_CreateTextureFromSurface(ctx.mSDLContext->mRenderer, surfaceMessage);
226+
SDLContext *sdlCtx = getBackendContext(ctx);
227+
SDL_Texture *messageTexture = SDL_CreateTextureFromSurface(sdlCtx->mRenderer, surfaceMessage);
224228
if (messageTexture == nullptr) {
225229
const std::string msg = "Cannot create texture: " + std::string(SDL_GetError()) + ".";
226230
ctx.mLogger(LogSeverity::Error, msg.c_str());
227231
return ErrorCode;
228232
}
229233

230-
int32_t margin = ctx.mStyle.mMargin;
231-
SDL_Rect Message_rect = {};
234+
int32_t margin{ctx.mStyle.mMargin};
235+
SDL_Rect Message_rect{};
232236
switch (alignment) {
233237
case Alignment::Left:
234238
Message_rect.x = r.top.x + margin;
@@ -239,18 +243,18 @@ ret_code Renderer::drawText(Context &ctx, const char *string, Font *font, const
239243
case Alignment::Center:
240244
Message_rect.x = r.top.x + 2 * margin + surfaceMessage->clip_rect.w / 2;
241245
Message_rect.y = r.top.y + margin;
242-
Message_rect.w = font->mSize;
243-
Message_rect.h = font->mSize;
246+
Message_rect.w = font->mSize * static_cast<int>(strlen(string));
247+
Message_rect.h = font->mSize + margin * 2;
244248
break;
245249
case Alignment::Right:
246250
Message_rect.x = r.top.x + surfaceMessage->clip_rect.w - font->mSize * static_cast<int>(strlen(string));
247251
Message_rect.y = r.top.y + margin;
248-
Message_rect.w = font->mSize;
249-
Message_rect.h = font->mSize;
252+
Message_rect.w = font->mSize * static_cast<int>(strlen(string));
253+
Message_rect.h = font->mSize + margin * 2;
250254
break;
251255
}
252256

253-
SDL_RenderCopy(ctx.mSDLContext->mRenderer, messageTexture, nullptr, &Message_rect);
257+
SDL_RenderCopy(sdlCtx->mRenderer, messageTexture, nullptr, &Message_rect);
254258
SDL_FreeSurface(surfaceMessage);
255259
SDL_DestroyTexture(messageTexture);
256260

@@ -259,15 +263,18 @@ ret_code Renderer::drawText(Context &ctx, const char *string, Font *font, const
259263

260264
ret_code Renderer::initScreen(Context &ctx, int32_t x, int32_t y, int32_t w, int32_t h) {
261265
if (!ctx.mCreated) {
262-
ctx.mLogger(LogSeverity::Error, "Not initialzed.");
266+
ctx.mLogger(LogSeverity::Error, "Not initialized.");
263267
return ErrorCode;
264268
}
265-
ctx.mSDLContext = SDLContext::create();
266-
if (ctx.mSDLContext->mWindow != nullptr) {
269+
SDLContext *sdlCtx = SDLContext::create();
270+
if (sdlCtx->mWindow != nullptr) {
267271
ctx.mLogger(LogSeverity::Error, "Already created.");
268272
return ErrorCode;
269273
}
270274

275+
ctx.mBackendCtx = new BackendContext;
276+
ctx.mBackendCtx->mHandle = (void*) sdlCtx;
277+
271278
if (TTF_Init() == -1) {
272279
ctx.mLogger(LogSeverity::Error, "TTF init failed.");
273280
return ErrorCode;
@@ -283,8 +290,8 @@ ret_code Renderer::initScreen(Context &ctx, int32_t x, int32_t y, int32_t w, int
283290
title = "TinyUI Window";
284291
}
285292

286-
ctx.mSDLContext->mWindow = SDL_CreateWindow(title, x, y, w, h, SDL_WINDOW_SHOWN | SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE);
287-
if (ctx.mSDLContext->mWindow == nullptr) {
293+
sdlCtx->mWindow = SDL_CreateWindow(title, x, y, w, h, SDL_WINDOW_SHOWN | SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE);
294+
if (sdlCtx->mWindow == nullptr) {
288295
const std::string msg = "Error while SDL_CreateWindow: " + std::string(SDL_GetError()) + ".";
289296
ctx.mLogger(LogSeverity::Error, msg.c_str());
290297
return ErrorCode;
@@ -296,8 +303,8 @@ ret_code Renderer::initScreen(Context &ctx, int32_t x, int32_t y, int32_t w, int
296303
return ErrorCode;
297304
}
298305

299-
ctx.mSDLContext->mRenderer = SDL_CreateRenderer(ctx.mSDLContext->mWindow, driverIndex, SDL_RENDERER_ACCELERATED);
300-
if (nullptr == ctx.mSDLContext->mRenderer) {
306+
sdlCtx->mRenderer = SDL_CreateRenderer(sdlCtx->mWindow, driverIndex, SDL_RENDERER_ACCELERATED);
307+
if (nullptr == sdlCtx->mRenderer) {
301308
const std::string msg = "Error while SDL_CreateRenderer: " + std::string(SDL_GetError()) + ".";
302309
ctx.mLogger(LogSeverity::Error, msg.c_str());
303310
return ErrorCode;
@@ -309,8 +316,8 @@ ret_code Renderer::initScreen(Context &ctx, int32_t x, int32_t y, int32_t w, int
309316

310317
showDriverInUse(ctx);
311318

312-
ctx.mSDLContext->mSurface = SDL_GetWindowSurface(ctx.mSDLContext->mWindow);
313-
if (ctx.mSDLContext->mSurface == nullptr) {
319+
sdlCtx->mSurface = SDL_GetWindowSurface(sdlCtx->mWindow);
320+
if (sdlCtx->mSurface == nullptr) {
314321
ctx.mLogger(LogSeverity::Error, "Surface pointer from window is nullptr.");
315322
return ErrorCode;
316323
}
@@ -320,7 +327,7 @@ ret_code Renderer::initScreen(Context &ctx, int32_t x, int32_t y, int32_t w, int
320327

321328
ret_code Renderer::initScreen(Context &ctx, SDL_Window *window, SDL_Renderer *renderer) {
322329
if (!ctx.mCreated) {
323-
ctx.mLogger(LogSeverity::Error, "Not initialzed.");
330+
ctx.mLogger(LogSeverity::Error, "TinyUI context is not initialzed.");
324331
return ErrorCode;
325332
}
326333

@@ -331,13 +338,19 @@ ret_code Renderer::initScreen(Context &ctx, SDL_Window *window, SDL_Renderer *re
331338

332339
TTF_Init();
333340

334-
ctx.mSDLContext->mRenderer = renderer;
335-
ctx.mSDLContext->mWindow = window;
341+
SDLContext *sdlCtx = getBackendContext(ctx);
342+
if (sdlCtx == nullptr) {
343+
ctx.mLogger(LogSeverity::Error, "Invalid sdl context detected.");
344+
return ErrorCode;
345+
}
346+
347+
sdlCtx->mRenderer = renderer;
348+
sdlCtx->mWindow = window;
336349

337350
showDriverInUse(ctx);
338351

339-
ctx.mSDLContext->mSurface = SDL_GetWindowSurface(ctx.mSDLContext->mWindow);
340-
ctx.mSDLContext->mOwner = false;
352+
sdlCtx->mSurface = SDL_GetWindowSurface(sdlCtx->mWindow);
353+
sdlCtx->mOwner = false;
341354
ctx.mCreated = true;
342355

343356
return ResultOk;
@@ -349,8 +362,9 @@ ret_code Renderer::releaseScreen(Context &ctx) {
349362
return ErrorCode;
350363
}
351364

352-
SDL_DestroyWindow(ctx.mSDLContext->mWindow);
353-
ctx.mSDLContext->mWindow = nullptr;
365+
SDLContext *sdlCtx = getBackendContext(ctx);
366+
SDL_DestroyWindow(sdlCtx->mWindow);
367+
sdlCtx->mWindow = nullptr;
354368

355369
return ResultOk;
356370
}
@@ -362,19 +376,21 @@ ret_code Renderer::beginRender(Context &ctx, Color4 bg, SDL_Texture *renderTarge
362376
}
363377

364378
const SDL_Color sdl_bg = getSDLColor(bg);
365-
SDL_SetRenderDrawColor(ctx.mSDLContext->mRenderer, sdl_bg.r, sdl_bg.g, sdl_bg.b, sdl_bg.a);
366-
SDL_RenderClear(ctx.mSDLContext->mRenderer);
379+
SDLContext *sdlCtx = getBackendContext(ctx);
380+
SDL_SetRenderDrawColor(sdlCtx->mRenderer, sdl_bg.r, sdl_bg.g, sdl_bg.b, sdl_bg.a);
381+
SDL_RenderClear(sdlCtx->mRenderer);
367382

368383
return ResultOk;
369384
}
370385

371386
ret_code Renderer::drawRect(Context &ctx, int32_t x, int32_t y, int32_t w, int32_t h, bool filled, Color4 fg) {
372387
SDL_Rect r = {x, y, w, h};
373-
SDL_SetRenderDrawColor(ctx.mSDLContext->mRenderer, fg.r, fg.g, fg.b, fg.a);
388+
SDLContext *sdlCtx = getBackendContext(ctx);
389+
SDL_SetRenderDrawColor(sdlCtx->mRenderer, fg.r, fg.g, fg.b, fg.a);
374390
if (filled) {
375-
SDL_RenderFillRect(ctx.mSDLContext->mRenderer, &r);
391+
SDL_RenderFillRect(sdlCtx->mRenderer, &r);
376392
} else {
377-
SDL_RenderDrawRect(ctx.mSDLContext->mRenderer, &r);
393+
SDL_RenderDrawRect(sdlCtx->mRenderer, &r);
378394
}
379395

380396
return ResultOk;
@@ -386,28 +402,31 @@ ret_code Renderer::drawImage(Context &ctx, int32_t x, int32_t y, int32_t w, int3
386402
}
387403

388404
SDL_Rect imageRect = {x, y, w, h};
389-
SDL_Texture *tex = SDL_CreateTextureFromSurface(ctx.mSDLContext->mRenderer, image->mSurfaceImpl->mSurface);
390-
SDL_RenderCopy(ctx.mSDLContext->mRenderer, tex, nullptr, &imageRect);
405+
SDLContext *sdlCtx = getBackendContext(ctx);
406+
SDL_Texture *tex = SDL_CreateTextureFromSurface(sdlCtx->mRenderer, image->mSurfaceImpl->mSurface);
407+
SDL_RenderCopy(sdlCtx->mRenderer, tex, nullptr, &imageRect);
391408
SDL_DestroyTexture(tex);
392409

393410
return ResultOk;
394411
}
395412

396413
ret_code Renderer::closeScreen(Context &ctx) {
397-
if (ctx.mSDLContext->mWindow == nullptr) {
414+
SDLContext *sdlCtx = getBackendContext(ctx);
415+
if (sdlCtx->mWindow == nullptr) {
398416
return ErrorCode;
399417
}
400418

401419
TTF_Quit();
402420

403-
SDL_DestroyWindow(ctx.mSDLContext->mWindow);
404-
ctx.mSDLContext->mWindow = nullptr;
421+
SDL_DestroyWindow(sdlCtx->mWindow);
422+
sdlCtx->mWindow = nullptr;
405423

406424
return ResultOk;
407425
}
408426

409427
ret_code Renderer::endRender(Context &ctx) {
410-
SDL_RenderPresent(ctx.mSDLContext->mRenderer);
428+
SDLContext *sdlCtx = getBackendContext(ctx);
429+
SDL_RenderPresent(sdlCtx->mRenderer);
411430

412431
return ResultOk;
413432
}
@@ -416,7 +435,8 @@ ret_code Renderer::createRenderTexture(Context &ctx, int w, int h, SDL_Texture *
416435
if (texture == nullptr) {
417436
return ErrorCode;
418437
}
419-
*texture = SDL_CreateTexture(ctx.mSDLContext->mRenderer, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET, w, h);
438+
SDLContext *sdlCtx = getBackendContext(ctx);
439+
*texture = SDL_CreateTexture(sdlCtx->mRenderer, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET, w, h);
420440

421441
return ResultOk;
422442
}
@@ -499,4 +519,16 @@ void Renderer::releaseSurfaceImpl(SurfaceImpl *surfaceImpl) {
499519
}
500520
}
501521

522+
ret_code Renderer::getSurfaceInfo(Context &ctx, int32_t &w, int32_t &h) {
523+
SDLContext *sdlCtx = (SDLContext *) ctx.mBackendCtx;
524+
if (sdlCtx->mSurface == nullptr) {
525+
return ErrorCode;
526+
}
527+
528+
w = sdlCtx->mSurface->w;
529+
h = sdlCtx->mSurface->h;
530+
531+
return ResultOk;
532+
}
533+
502534
} // namespace tinyui

src/backends/sdl2_renderer.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,10 @@ struct SDLContext {
100100
}
101101
};
102102

103+
inline SDLContext *getBackendContext(Context &ctx) {
104+
SDLContext *sdlCtx = (SDLContext*) ctx.mBackendCtx->mHandle;
105+
return sdlCtx;
106+
}
103107

104108
/// @brief The renderer implementation using the SDL2 library.
105109
struct Renderer {
@@ -118,6 +122,7 @@ struct Renderer {
118122
static bool update(Context &ctx);
119123
static SurfaceImpl *createSurfaceImpl(unsigned char *data, int w, int h, int bytesPerPixel, int pitch);
120124
static void releaseSurfaceImpl(SurfaceImpl *surfaceImpl);
125+
static ret_code getSurfaceInfo(Context &ctx, int32_t &w, int32_t &h);
121126
};
122127

123128
} // namespace tinyui

src/tinyui.cpp

Lines changed: 12 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@ SOFTWARE.
2727
#include "backends/sdl2_iodevice.h"
2828

2929
#include <iostream>
30-
#include <cstring>
3130

3231
namespace tinyui {
3332

@@ -37,7 +36,7 @@ static Style DefaultStyle {
3736
Color4{ 20, 20, 20, 0 },
3837
Color4{ 100, 100, 100, 0 },
3938
Color4{ 200, 200, 200, 0 },
40-
8,
39+
2,
4140
{ "Arial.ttf", 12, nullptr }
4241
};
4342

@@ -98,7 +97,7 @@ Context &TinyUi::getContext() {
9897
}
9998

10099
ret_code TinyUi::initScreen(int32_t x, int32_t y, int32_t w, int32_t h) {
101-
auto &ctx = TinyUi::getContext();
100+
auto &ctx = getContext();
102101
if (Renderer::initRenderer(ctx) == ErrorCode) {
103102
printf("Error: Cannot init renderer\n");
104103
return ErrorCode;
@@ -114,14 +113,7 @@ ret_code TinyUi::getSurfaceInfo(int32_t &w, int32_t &h) {
114113
return ErrorCode;
115114
}
116115

117-
if (ctx.mSDLContext->mSurface == nullptr) {
118-
return ErrorCode;
119-
}
120-
121-
w = ctx.mSDLContext->mSurface->w;
122-
h = ctx.mSDLContext->mSurface->h;
123-
124-
return ResultOk;
116+
return Renderer::getSurfaceInfo(ctx, w, h);
125117
}
126118

127119
ret_code TinyUi::getSurfaceCenter(int32_t &x, int32_t &y) {
@@ -138,7 +130,7 @@ ret_code TinyUi::getSurfaceCenter(int32_t &x, int32_t &y) {
138130
}
139131

140132
bool TinyUi::run() {
141-
auto &ctx = TinyUi::getContext();
133+
auto &ctx = getContext();
142134
if (!ctx.mUpdateCallbackList.empty()) {
143135
for (auto it = ctx.mUpdateCallbackList.begin(); it != ctx.mUpdateCallbackList.end(); ++it) {
144136
(*it)->mfuncCallback[Events::UpdateEvent](1, (*it)->mInstance);
@@ -148,31 +140,29 @@ bool TinyUi::run() {
148140
}
149141

150142
ret_code TinyUi::beginRender(Color4 bg) {
151-
auto &ctx = TinyUi::getContext();
143+
auto &ctx = getContext();
152144
return Renderer::beginRender(ctx, bg);
153145
}
154146

155147
ret_code TinyUi::endRender() {
156-
auto &ctx = TinyUi::getContext();
148+
auto &ctx = getContext();
157149
return Renderer::endRender(ctx);
158150
}
159151

160152
void TinyUi::render() {
161-
auto &ctx = TinyUi::getContext();
162-
TinyUi::beginRender(ctx.mStyle.mClearColor);
153+
auto &ctx = getContext();
154+
beginRender(ctx.mStyle.mClearColor);
163155
Widgets::renderWidgets();
164-
TinyUi::endRender();
156+
endRender();
165157
}
166158

167159
ret_code TinyUi::release() {
168-
auto &ctx = TinyUi::getContext();
160+
auto &ctx = getContext();
169161
if (!ctx.mCreated) {
170162
return ErrorCode;
171163
}
172164
Renderer::releaseRenderer(ctx);
173165
Renderer::releaseScreen(ctx);
174-
ctx.mSDLContext->mRenderer = nullptr;
175-
ctx.mSDLContext->mWindow = nullptr;
176166
ctx.mRoot = nullptr;
177167

178168
ctx.mCreated = false;
@@ -193,12 +183,12 @@ void TinyUi::setDefaultStyle(const Style &style) {
193183
}
194184

195185
void TinyUi::setDefaultFont(const char *defaultFont) {
196-
auto &ctx = TinyUi::getContext();
186+
auto &ctx = getContext();
197187
if (defaultFont == nullptr) {
198188
return;
199189
}
200190

201-
if (strncmp( ctx.mStyle.mFont.mName, defaultFont, std::strlen(defaultFont)) == 0) {
191+
if (strncmp( ctx.mStyle.mFont.mName, defaultFont, strlen(defaultFont)) == 0) {
202192
return;
203193
}
204194

0 commit comments

Comments
 (0)