@@ -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
260264ret_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
321328ret_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
371386ret_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
396413ret_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
409427ret_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
0 commit comments