From fd424c94bbe5cfbded2c06ff791e97633e2f1280 Mon Sep 17 00:00:00 2001 From: Ed_ Date: Sun, 12 Jan 2025 22:03:38 -0500 Subject: [PATCH] Fixed bug wth vefoncache storage_entry.visible, added building stb_truetype to dep update --- Readme.md | 3 +++ code/font/vefontcache/vefontcache.odin | 12 +++++------ scripts/helpers/devshell.ps1 | 28 +++++++++++++++++++++++++ scripts/update_deps.ps1 | 18 ++++++++++++++-- thirdparty/stb/lib/stb_truetype.lib | Bin 380552 -> 380536 bytes 5 files changed, 53 insertions(+), 8 deletions(-) create mode 100644 scripts/helpers/devshell.ps1 diff --git a/Readme.md b/Readme.md index dba57c9..1b9d6b7 100644 --- a/Readme.md +++ b/Readme.md @@ -19,6 +19,9 @@ The dependencies are: * Added #region, #endregion directives support for editors * I added support for 'monlithic packages' or 'uniform-across-subdirectories packages'. It allows me to organize the main package with sub-directories. * Added the ability to debug using statements on structs (fields get dumped to the stack as ptr refs) + * Remove implicit assignments for container allocators in the Base and Core packages + * I did not enjoy bug hunting a memory corruption because I mistakenly didn't properly initialize a core container with their designated initiatizer: new, make, or init. + * See fork Readme for which procedures were changed.. * Odin repo's base, core, and vendor(raylib) libaries * An ini parser * backtrace (not used yet) diff --git a/code/font/vefontcache/vefontcache.odin b/code/font/vefontcache/vefontcache.odin index 86c5af6..7083779 100644 --- a/code/font/vefontcache/vefontcache.odin +++ b/code/font/vefontcache/vefontcache.odin @@ -279,6 +279,9 @@ startup :: proc( ctx : ^Context, parser_kind : Parser_Kind = .STB_TrueType, // N stroage_entry.position, error = make( [dynamic]Vec2, len = 0, cap = shape_cache_params.reserve ) assert( error == .None, "VEFontCache.init : Failed to allocate positions array for shape cache storage" ) + stroage_entry.visible, error = make( [dynamic]i32, len = 0, cap = shape_cache_params.reserve ) + assert( error == .None, "VEFontCache.init : Failed to allocate visible array for shape cache storage" ) + stroage_entry.atlas_lru_code, error = make( [dynamic]Atlas_Key, len = 0, cap = shape_cache_params.reserve ) assert( error == .None, "VEFontCache.init : Failed to allocate atlas_lru_code array for shape cache storage" ) @@ -287,9 +290,6 @@ startup :: proc( ctx : ^Context, parser_kind : Parser_Kind = .STB_TrueType, // N stroage_entry.bounds, error = make( [dynamic]Range2, len = 0, cap = shape_cache_params.reserve ) assert( error == .None, "VEFontCache.init : Failed to allocate bounds array for shape cache storage" ) - - // stroage_entry.bounds_scaled, error = make( [dynamic]Range2, len = 0, cap = shape_cache_params.reserve ) - // assert( error == .None, "VEFontCache.init : Failed to allocate bounds_scaled array for shape cache storage" ) } } @@ -415,12 +415,12 @@ hot_reload :: proc( ctx : ^Context, allocator : Allocator ) lru_reload( & shape_cache.state, allocator ) for idx : i32 = 0; idx < i32(len(shape_cache.storage)); idx += 1 { storage_entry := & shape_cache.storage[idx] - reload_array( & storage_entry.glyph, allocator) + reload_array( & storage_entry.glyph, allocator) reload_array( & storage_entry.position, allocator) + reload_array( & storage_entry.visible, allocator) reload_array( & storage_entry.atlas_lru_code, allocator) reload_array( & storage_entry.region_kind, allocator) reload_array( & storage_entry.bounds, allocator) - // reload_array( & storage_entry.bounds_scaled, allocator) } reload_array( & shape_cache.storage, allocator ) @@ -490,10 +490,10 @@ shutdown :: proc( ctx : ^Context ) storage_entry := & shape_cache.storage[idx] delete( storage_entry.glyph ) delete( storage_entry.position ) + delete( storage_entry.visible ) delete( storage_entry.atlas_lru_code) delete( storage_entry.region_kind) delete( storage_entry.bounds) - // delete( storage_entry.bounds_scaled) } lru_free( & shape_cache.state ) diff --git a/scripts/helpers/devshell.ps1 b/scripts/helpers/devshell.ps1 new file mode 100644 index 0000000..33ca0ce --- /dev/null +++ b/scripts/helpers/devshell.ps1 @@ -0,0 +1,28 @@ +if ($env:VCINSTALLDIR) { + return +} + +$ErrorActionPreference = "Stop" + +# Use vswhere to find the latest Visual Studio installation +$vswhere_out = & "C:\Program Files (x86)\Microsoft Visual Studio\Installer\vswhere.exe" -latest -property installationPath +if ($null -eq $vswhere_out) { + Write-Host "ERROR: Visual Studio installation not found" + exit 1 +} + +# Find Launch-VsDevShell.ps1 in the Visual Studio installation +$vs_path = $vswhere_out +$vs_devshell = Join-Path $vs_path "\Common7\Tools\Launch-VsDevShell.ps1" + +if ( -not (Test-Path $vs_devshell) ) { + Write-Host "ERROR: Launch-VsDevShell.ps1 not found in Visual Studio installation" + Write-Host Tested path: $vs_devshell + exit 1 +} + +# Launch the Visual Studio Developer Shell +Push-Location +write-host @args +& $vs_devshell @args +Pop-Location diff --git a/scripts/update_deps.ps1 b/scripts/update_deps.ps1 index 5e01365..f69aad3 100644 --- a/scripts/update_deps.ps1 +++ b/scripts/update_deps.ps1 @@ -63,8 +63,22 @@ if ( $binaries_dirty -or $true ) $third_party_dlls = Get-ChildItem -Path $path_sokol_dlls -Filter '*.dll' foreach ($dll in $third_party_dlls) { - $destination = join-path $path_build $dll.Name - Copy-Item $dll.FullName -Destination $destination -Force + $destination = join-path $path_build $dll.Name + Copy-Item $dll.FullName -Destination $destination -Force } } pop-location + +$path_helpers = join-path $PSScriptRoot 'helpers' +$path_devshell = join-path $path_helpers 'devshell.ps1' + +. $path_devshell -arch amd64 + +$path_stb = join-path $path_thirdparty 'stb' +$path_stb_src = join-path $path_stb 'src' + +push-location $path_stb_src + +& '.\build.bat' + +pop-location diff --git a/thirdparty/stb/lib/stb_truetype.lib b/thirdparty/stb/lib/stb_truetype.lib index c3d55c1488e98bf62a43282c4d9ddd7881f6195a..f645f2e098eaae858f91b7c7481a7f9130409f2c 100644 GIT binary patch delta 19737 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