@@ -107,8 +107,8 @@ CRuntime::~CRuntime()
107107 */
108108void CRuntime::paint ()
109109{
110- CGame &game = *m_game;
111110 /*
111+ CGame &game = *m_game;
112112 if (game.level() == 4)
113113 {
114114 LOGI("paint IN");
@@ -308,6 +308,12 @@ bool CRuntime::createSDLWindow()
308308#endif
309309 m_resolution = findResolutionIndex ();
310310
311+ SDL_SetRenderLogicalPresentation (
312+ m_app.renderer ,
313+ width, // e.g. 640
314+ height, // e.g. 480
315+ SDL_LOGICAL_PRESENTATION_INTEGER_SCALE );
316+
311317 return true ;
312318}
313319
@@ -438,10 +444,10 @@ void CRuntime::doInput()
438444 LOGI (" SDL_EVENT_WINDOW_RESIZED" );
439445 if (!m_app.isFullscreen )
440446 {
441- LOGI (" resized" );
447+ LOGI (" resized %d x %d " , getWidth (), getHeight () );
442448 SDL_SetWindowSize (m_app.window , event.window .data1 , event.window .data2 );
443449 }
444- // updateScreenInfo( );
450+ m_engine-> resize ( getWidth (), getHeight () );
445451 onOrientationChange ();
446452 break ;
447453
@@ -451,12 +457,10 @@ void CRuntime::doInput()
451457
452458 case SDL_EVENT_WINDOW_RESTORED :
453459 LOGI (" SDL_EVENT_WINDOW_RESTORED" );
454- // updateScreenInfo();
455460 break ;
456461
457462 case SDL_EVENT_DISPLAY_ORIENTATION :
458463 LOGI (" SDL_EVENT_DISPLAY_ORIENTATION" );
459- // updateScreenInfo();
460464 onOrientationChange ();
461465 break ;
462466
@@ -885,49 +889,6 @@ bool CRuntime::fetchFile(const std::string &path, char **dest, const bool termin
885889
886890void CRuntime::preloadAssets ()
887891{
888- /*
889- std::unique_ptr<CFrameSet> *frameSets[] = {
890- &m_tiles,
891- &m_animz,
892- &m_users,
893- &m_sheet0,
894- &m_sheet1,
895- &m_uisheet,
896- &m_titlePix,
897- nullptr,
898- };
899- CFileMem mem;
900- for (size_t i = 0; i < m_assetFiles.size(); ++i)
901- {
902- const std::string filename = AssetMan::getPrefix() + "pixels/" + m_assetFiles[i];
903- if (!frameSets[i])
904- continue;
905- *frameSets[i] = std::make_unique<CFrameSet>();
906- data_t data = AssetMan::read(filename);
907- if (!data.empty())
908- {
909- if (!m_quiet)
910- LOGI("reading %s", filename.c_str());
911- mem.replace(data.data(), data.size());
912- if ((*frameSets[i])->extract(mem))
913- {
914- if (!m_quiet)
915- LOGI("extracted: %ld", ((*frameSets[i])->getSize()));
916- }
917- }
918- else
919- {
920- LOGE("can't read: %s", filename.c_str());
921- }
922- }
923-
924- const std::string fontName = AssetMan::getPrefix() + m_config["font"];
925- data_t data = AssetMan::read(fontName);
926- if (data.empty())
927- return;
928- m_fontData = std::move(data);
929- */
930-
931892 const std::string creditsFile = AssetMan::getPrefix () + m_config[" credits" ];
932893 data_t data = AssetMan::read (creditsFile, true );
933894 if (!data.empty ())
@@ -1582,6 +1543,24 @@ void CRuntime::toggleFullscreen()
15821543 }
15831544 else
15841545 {
1546+ if (!m_app.isFullscreen )
1547+ {
1548+ EmscriptenFullscreenStrategy strategy{};
1549+ strategy.scaleMode = EMSCRIPTEN_FULLSCREEN_SCALE_ASPECT ;
1550+ strategy.canvasResolutionScaleMode =
1551+ EMSCRIPTEN_FULLSCREEN_CANVAS_SCALE_STDDEF ;
1552+ strategy.filteringMode =
1553+ EMSCRIPTEN_FULLSCREEN_FILTERING_NEAREST ;
1554+ strategy.canvasResizedCallback = nullptr ;
1555+ strategy.canvasResizedCallbackUserData = nullptr ;
1556+
1557+ emscripten_enter_soft_fullscreen (" #canvas" , &strategy);
1558+ }
1559+ else
1560+ {
1561+ emscripten_exit_soft_fullscreen ();
1562+ }
1563+ /*
15851564 if (m_app.isFullscreen)
15861565 {
15871566 EmscriptenFullscreenStrategy strategy = {
@@ -1596,13 +1575,14 @@ void CRuntime::toggleFullscreen()
15961575 {
15971576 emscripten_exit_soft_fullscreen();
15981577 }
1578+ */
15991579 }
16001580#else
16011581 if (m_app.isFullscreen )
16021582 {
16031583 // Currently in fullscreen, switch to windowed
16041584 LOGI (" Switching to windowed mode." );
1605- if (!SDL_SetWindowFullscreen (m_app.window , false )) // false means windowed mode
1585+ if (!SDL_SetWindowFullscreen (m_app.window , 0 )) // false means windowed mode
16061586 {
16071587 LOGE (" Switching to windowed mode failed: %s" , SDL_GetError ());
16081588 }
@@ -1613,7 +1593,7 @@ void CRuntime::toggleFullscreen()
16131593 LOGE (" SDL_SetWindowSize failed: %s" , SDL_GetError ());
16141594 }
16151595
1616- if (!SDL_SetWindowPosition (m_app.window , m_app.windowedX , m_app.windowedX ))
1596+ if (!SDL_SetWindowPosition (m_app.window , m_app.windowedX , m_app.windowedY ))
16171597 {
16181598 LOGE (" SDL_SetWindowPosition failed: %s" , SDL_GetError ());
16191599 }
@@ -1624,14 +1604,38 @@ void CRuntime::toggleFullscreen()
16241604 LOGI (" Switching to fullscreen desktop mode." );
16251605
16261606 // Save current windowed position and size before going fullscreen
1627- SDL_GetWindowPosition (m_app.window , &m_app.windowedX , &m_app.windowedX );
1607+ SDL_GetWindowPosition (m_app.window , &m_app.windowedX , &m_app.windowedY );
16281608 SDL_GetWindowSize (m_app.window , &m_app.windowedWidth , &m_app.windowedHeigth );
16291609
1630- if (!SDL_SetWindowFullscreen (m_app.window , true ))
1610+ if (!SDL_SetWindowFullscreen (m_app.window , SDL_WINDOW_FULLSCREEN ))
16311611 {
16321612 LOGE (" Switching to fullscreen mode failed: %s" , SDL_GetError ());
16331613 }
16341614 }
1615+
1616+ // ---- IMPORTANT: wait until renderer size becomes valid ----
1617+ // REQUIRED: update renderer state AFTER the switch
1618+ int w = 0 , h = 0 ;
1619+ for (int i = 0 ; i < 5 && (w == 0 || h == 0 ); ++i)
1620+ {
1621+ SDL_GetRenderOutputSize (m_app.renderer , &w, &h);
1622+ SDL_Delay (1 );
1623+ }
1624+
1625+ SDL_Rect vp;
1626+ vp.x = 0 ;
1627+ vp.y = 0 ;
1628+ vp.w = w;
1629+ vp.h = h;
1630+
1631+ SDL_SetRenderViewport (m_app.renderer , &vp);
1632+
1633+ SDL_SetRenderLogicalPresentation (
1634+ m_app.renderer ,
1635+ w,
1636+ h,
1637+ SDL_LOGICAL_PRESENTATION_INTEGER_SCALE );
1638+
16351639#endif
16361640 if (m_verbose)
16371641 {
@@ -2017,8 +2021,8 @@ CMenu &CRuntime::initOptionMenu()
20172021 snprintf (tmp, sizeof (tmp), " %dx%d" , rez.w , rez.h );
20182022 resolutions.emplace_back (tmp);
20192023 }
2020- menu.addItem (CMenuItem (" SCREEN: %s" , resolutions, &m_resolution))
2021- .setRole (MENU_ITEM_RESOLUTION );
2024+ // menu.addItem(CMenuItem("SCREEN: %s", resolutions, &m_resolution))
2025+ // .setRole(MENU_ITEM_RESOLUTION);
20222026 menu.addItem (CMenuItem (" DISPLAY: %s" , {" WINDOWED" , " FULLSCREEN" }, &m_fullscreen))
20232027 .setRole (MENU_ITEM_FULLSCREEN );
20242028#endif
0 commit comments