From bd246f368cc4dd19d627ae140bc03bcaf838273c Mon Sep 17 00:00:00 2001 From: John Lambert Date: Wed, 6 May 2026 19:14:02 -0400 Subject: [PATCH 1/7] perf: speed up Views rendering and add render verification --- .gitattributes | 3 + .gitignore | 8 + .vscode/tasks.json | 17 + Build/Agent/Run-AllRenders.ps1 | 131 ++ FieldWorks.sln | 16 + .../Controls/DetailControls/DataTree.cs | 620 ++++++- ...ests.DataTreeRender_collapsed.verified.png | Bin 0 -> 4440 bytes ...nderTests.DataTreeRender_deep.verified.png | Bin 0 -> 13691 bytes ...Tests.DataTreeRender_expanded.verified.png | Bin 0 -> 18457 bytes ...rTests.DataTreeRender_extreme.verified.png | Bin 0 -> 14060 bytes ...rTests.DataTreeRender_multiws.verified.png | Bin 0 -> 13767 bytes ...erTests.DataTreeRender_simple.verified.png | Bin 0 -> 14022 bytes ...subsub-hidden-productionlike.verified.json | 25 + ...bsubsub-hidden-productionlike.verified.png | Bin 0 -> 94467 bytes ...aTreeRender_subsubsub-hidden.verified.json | 25 + ...taTreeRender_subsubsub-hidden.verified.png | Bin 0 -> 92706 bytes .../DataTreeRenderTests.cs | 1642 +++++++++++++++++ .../DetailControlsTests/DataTreeTests.cs | 2 +- .../DataTreeTimingBaselineCatalog.cs | 167 ++ .../DetailControlsTests.csproj | 11 +- .../RenderTestAssemblySetup.cs | 46 + .../DetailControlsTests/Test.fwlayout | 50 +- .../DetailControlsTests/TestParts.xml | 32 + .../PossibilityVectorReferenceView.cs | 4 +- Src/Common/Controls/DetailControls/Slice.cs | 70 +- .../Controls/DetailControls/SliceTreeNode.cs | 56 +- .../DetailControls/VectorReferenceView.cs | 6 +- .../Widgets/LabeledMultiStringView.cs | 8 + .../XMLViewsTests/XmlBrowseViewBaseTests.cs | 21 +- .../XmlViewRefreshPolicyTests.cs | 185 ++ .../RenderTestInfrastructure.csproj | 74 + .../CompositeViewCapture.cs | 400 ++++ .../DataTreeRenderHarness.cs | 685 +++++++ .../RenderBenchmarkComparer.cs | 284 +++ .../RenderBenchmarkReportWriter.cs | 328 ++++ .../RenderBenchmarkResults.cs | 271 +++ .../RenderDiagnosticsToggle.cs | 355 ++++ .../RenderEnvironmentValidator.cs | 326 ++++ Src/Common/RenderVerification/RenderModels.cs | 77 + .../RenderScenarioDataBuilder.cs | 260 +++ .../RenderSnapshotVerifier.cs | 692 +++++++ .../RenderVerification/RenderTraceParser.cs | 259 +++ .../RenderVerification.csproj | 53 + Src/Common/RootSite/RootSiteTests/App.config | 21 + .../RootSite/RootSiteTests/DummyBasicView.cs | 31 + .../RootSiteTests/DummyBasicViewVc.cs | 13 + .../RootSiteTests/GenericLexEntryView.cs | 229 +++ .../RootSiteTests/GenericScriptureView.cs | 80 + .../RootSiteTests/RealDataTestsBase.cs | 113 ++ .../RootSiteTests/RenderBaselineTests.cs | 356 ++++ .../RootSiteTests/RenderBaselineVerifier.cs | 19 + .../RootSiteTests/RenderBenchmarkHarness.cs | 496 +++++ .../RootSiteTests/RenderBenchmarkTestsBase.cs | 1024 ++++++++++ .../RootSiteTests/RenderTestAssemblySetup.cs | 46 + .../RootSiteTests/RenderTimingSuiteTests.cs | 135 ++ .../RootSiteTests/RenderTraceParserTests.cs | 45 + ...yTests.VerifyScenario_complex.verified.png | Bin 0 -> 134025 bytes ...s.VerifyScenario_custom-heavy.verified.png | Bin 0 -> 66561 bytes ...ts.VerifyScenario_deep-nested.verified.png | Bin 0 -> 58042 bytes ...VerifyScenario_footnote-heavy.verified.png | Bin 0 -> 260963 bytes ...Tests.VerifyScenario_lex-deep.verified.png | Bin 0 -> 82877 bytes ...ts.VerifyScenario_lex-extreme.verified.png | Bin 0 -> 353689 bytes ...ts.VerifyScenario_lex-shallow.verified.png | Bin 0 -> 34286 bytes ...sts.VerifyScenario_long-prose.verified.png | Bin 0 -> 466556 bytes ...erifyScenario_many-paragraphs.verified.png | Bin 0 -> 164997 bytes ...fyTests.VerifyScenario_medium.verified.png | Bin 0 -> 52697 bytes ...s.VerifyScenario_mixed-styles.verified.png | Bin 0 -> 237393 bytes ...sts.VerifyScenario_multi-book.verified.png | Bin 0 -> 81437 bytes ...Tests.VerifyScenario_multi-ws.verified.png | Bin 0 -> 83200 bytes ...sts.VerifyScenario_rtl-script.verified.png | Bin 0 -> 28899 bytes ...fyTests.VerifyScenario_simple.verified.png | Bin 0 -> 25588 bytes .../RootSiteTests/RenderVerifyTests.cs | 68 + .../RootSiteTests/RootSiteTests.csproj | 7 +- .../TestData/RenderBenchmarkFlags.json | 5 + .../TestData/RenderBenchmarkScenarios.json | 94 + Src/Common/SimpleRootSite/SimpleRootSite.cs | 696 ++++++- .../SimpleRootSiteTests_DpiLayout.cs | 62 + ...iteTests_RefreshDisplayNeedsReconstruct.cs | 152 ++ .../DiscourseTests/InterlinRibbonTests.cs | 55 + Src/LexText/Discourse/InterlinRibbon.cs | 6 +- .../VwDrawRootBuffered.cs | 59 +- Src/views/Test/TestLayoutPage.h | 21 + Src/views/Test/TestViewCaches.h | 182 ++ Src/views/Test/TestViews.vcxproj | 11 +- Src/views/Test/TestVwRootBox.h | 668 +++++++ Src/views/Views.idh | 8 + Src/views/Views.mak | 2 + Src/views/ViewsGlobals.cpp | 5 + Src/views/VwLayoutStream.cpp | 10 +- Src/views/VwPropertyStore.cpp | 65 +- Src/views/VwRenderTrace.h | 169 ++ Src/views/VwRootBox.cpp | 132 +- Src/views/VwRootBox.h | 13 +- Src/views/VwTextBoxes.cpp | 28 + Src/views/lib/ColorStateCache.cpp | 47 + Src/views/lib/ColorStateCache.h | 25 + Src/views/lib/FontHandleCache.cpp | 165 ++ Src/views/lib/FontHandleCache.h | 45 + Src/views/lib/LayoutCache.h | 453 +++++ Src/views/lib/UniscribeEngine.cpp | 30 +- Src/views/lib/UniscribeSegment.cpp | 196 +- Src/views/lib/UniscribeSegment.h | 10 +- Src/views/lib/VwGraphics.cpp | 174 +- Src/views/lib/VwGraphics.h | 9 + Src/views/views.vcxproj | 4 + Src/views/views.vcxproj.filters | 12 + .../render-speedup-benchmark/.openspec.yaml | 2 + ...ERFORM_OFFSCREENLAYOUT_PATHS_1_2_5_PLAN.md | 747 ++++++++ .../RENDER_OPTIMIZATIONS.md | 148 ++ .../VERIFY_WINFORMS.md | 500 +++++ .../contracts/render-benchmark.openapi.yaml | 219 +++ .../render-speedup-benchmark/data-model.md | 28 + .../render-speedup-benchmark/design.md | 120 ++ .../dpi-fix-implementation.md | 41 + .../render-speedup-benchmark/final_cleanup.md | 172 ++ .../render-speedup-benchmark/migration-map.md | 48 + .../render-speedup-benchmark/proposal.md | 36 + .../render-speedup-benchmark/quickstart.md | 83 + .../refresh-dirty-flag-audit.md | 386 ++++ .../specs/render-speedup-benchmark/spec.md | 130 ++ .../changes/render-speedup-benchmark/tasks.md | 90 + .../timing-artifact-schema.md | 42 + 122 files changed, 16006 insertions(+), 291 deletions(-) create mode 100644 Build/Agent/Run-AllRenders.ps1 create mode 100644 Src/Common/Controls/DetailControls/DetailControlsTests/DataTreeRenderTests.DataTreeRender_collapsed.verified.png create mode 100644 Src/Common/Controls/DetailControls/DetailControlsTests/DataTreeRenderTests.DataTreeRender_deep.verified.png create mode 100644 Src/Common/Controls/DetailControls/DetailControlsTests/DataTreeRenderTests.DataTreeRender_expanded.verified.png create mode 100644 Src/Common/Controls/DetailControls/DetailControlsTests/DataTreeRenderTests.DataTreeRender_extreme.verified.png create mode 100644 Src/Common/Controls/DetailControls/DetailControlsTests/DataTreeRenderTests.DataTreeRender_multiws.verified.png create mode 100644 Src/Common/Controls/DetailControls/DetailControlsTests/DataTreeRenderTests.DataTreeRender_simple.verified.png create mode 100644 Src/Common/Controls/DetailControls/DetailControlsTests/DataTreeRenderTests.DataTreeRender_subsubsub-hidden-productionlike.verified.json create mode 100644 Src/Common/Controls/DetailControls/DetailControlsTests/DataTreeRenderTests.DataTreeRender_subsubsub-hidden-productionlike.verified.png create mode 100644 Src/Common/Controls/DetailControls/DetailControlsTests/DataTreeRenderTests.DataTreeRender_subsubsub-hidden.verified.json create mode 100644 Src/Common/Controls/DetailControls/DetailControlsTests/DataTreeRenderTests.DataTreeRender_subsubsub-hidden.verified.png create mode 100644 Src/Common/Controls/DetailControls/DetailControlsTests/DataTreeRenderTests.cs create mode 100644 Src/Common/Controls/DetailControls/DetailControlsTests/DataTreeTimingBaselineCatalog.cs create mode 100644 Src/Common/Controls/DetailControls/DetailControlsTests/RenderTestAssemblySetup.cs create mode 100644 Src/Common/Controls/XMLViews/XMLViewsTests/XmlViewRefreshPolicyTests.cs create mode 100644 Src/Common/RenderTestInfrastructure/RenderTestInfrastructure.csproj create mode 100644 Src/Common/RenderVerification/CompositeViewCapture.cs create mode 100644 Src/Common/RenderVerification/DataTreeRenderHarness.cs create mode 100644 Src/Common/RenderVerification/RenderBenchmarkComparer.cs create mode 100644 Src/Common/RenderVerification/RenderBenchmarkReportWriter.cs create mode 100644 Src/Common/RenderVerification/RenderBenchmarkResults.cs create mode 100644 Src/Common/RenderVerification/RenderDiagnosticsToggle.cs create mode 100644 Src/Common/RenderVerification/RenderEnvironmentValidator.cs create mode 100644 Src/Common/RenderVerification/RenderModels.cs create mode 100644 Src/Common/RenderVerification/RenderScenarioDataBuilder.cs create mode 100644 Src/Common/RenderVerification/RenderSnapshotVerifier.cs create mode 100644 Src/Common/RenderVerification/RenderTraceParser.cs create mode 100644 Src/Common/RenderVerification/RenderVerification.csproj create mode 100644 Src/Common/RootSite/RootSiteTests/App.config create mode 100644 Src/Common/RootSite/RootSiteTests/GenericLexEntryView.cs create mode 100644 Src/Common/RootSite/RootSiteTests/GenericScriptureView.cs create mode 100644 Src/Common/RootSite/RootSiteTests/RealDataTestsBase.cs create mode 100644 Src/Common/RootSite/RootSiteTests/RenderBaselineTests.cs create mode 100644 Src/Common/RootSite/RootSiteTests/RenderBaselineVerifier.cs create mode 100644 Src/Common/RootSite/RootSiteTests/RenderBenchmarkHarness.cs create mode 100644 Src/Common/RootSite/RootSiteTests/RenderBenchmarkTestsBase.cs create mode 100644 Src/Common/RootSite/RootSiteTests/RenderTestAssemblySetup.cs create mode 100644 Src/Common/RootSite/RootSiteTests/RenderTimingSuiteTests.cs create mode 100644 Src/Common/RootSite/RootSiteTests/RenderTraceParserTests.cs create mode 100644 Src/Common/RootSite/RootSiteTests/RenderVerifyTests.VerifyScenario_complex.verified.png create mode 100644 Src/Common/RootSite/RootSiteTests/RenderVerifyTests.VerifyScenario_custom-heavy.verified.png create mode 100644 Src/Common/RootSite/RootSiteTests/RenderVerifyTests.VerifyScenario_deep-nested.verified.png create mode 100644 Src/Common/RootSite/RootSiteTests/RenderVerifyTests.VerifyScenario_footnote-heavy.verified.png create mode 100644 Src/Common/RootSite/RootSiteTests/RenderVerifyTests.VerifyScenario_lex-deep.verified.png create mode 100644 Src/Common/RootSite/RootSiteTests/RenderVerifyTests.VerifyScenario_lex-extreme.verified.png create mode 100644 Src/Common/RootSite/RootSiteTests/RenderVerifyTests.VerifyScenario_lex-shallow.verified.png create mode 100644 Src/Common/RootSite/RootSiteTests/RenderVerifyTests.VerifyScenario_long-prose.verified.png create mode 100644 Src/Common/RootSite/RootSiteTests/RenderVerifyTests.VerifyScenario_many-paragraphs.verified.png create mode 100644 Src/Common/RootSite/RootSiteTests/RenderVerifyTests.VerifyScenario_medium.verified.png create mode 100644 Src/Common/RootSite/RootSiteTests/RenderVerifyTests.VerifyScenario_mixed-styles.verified.png create mode 100644 Src/Common/RootSite/RootSiteTests/RenderVerifyTests.VerifyScenario_multi-book.verified.png create mode 100644 Src/Common/RootSite/RootSiteTests/RenderVerifyTests.VerifyScenario_multi-ws.verified.png create mode 100644 Src/Common/RootSite/RootSiteTests/RenderVerifyTests.VerifyScenario_rtl-script.verified.png create mode 100644 Src/Common/RootSite/RootSiteTests/RenderVerifyTests.VerifyScenario_simple.verified.png create mode 100644 Src/Common/RootSite/RootSiteTests/RenderVerifyTests.cs create mode 100644 Src/Common/RootSite/RootSiteTests/TestData/RenderBenchmarkFlags.json create mode 100644 Src/Common/RootSite/RootSiteTests/TestData/RenderBenchmarkScenarios.json create mode 100644 Src/Common/SimpleRootSite/SimpleRootSiteTests/SimpleRootSiteTests_DpiLayout.cs create mode 100644 Src/Common/SimpleRootSite/SimpleRootSiteTests/SimpleRootSiteTests_RefreshDisplayNeedsReconstruct.cs create mode 100644 Src/views/Test/TestViewCaches.h create mode 100644 Src/views/VwRenderTrace.h create mode 100644 Src/views/lib/ColorStateCache.cpp create mode 100644 Src/views/lib/ColorStateCache.h create mode 100644 Src/views/lib/FontHandleCache.cpp create mode 100644 Src/views/lib/FontHandleCache.h create mode 100644 Src/views/lib/LayoutCache.h create mode 100644 openspec/changes/render-speedup-benchmark/.openspec.yaml create mode 100644 openspec/changes/render-speedup-benchmark/PERFORM_OFFSCREENLAYOUT_PATHS_1_2_5_PLAN.md create mode 100644 openspec/changes/render-speedup-benchmark/RENDER_OPTIMIZATIONS.md create mode 100644 openspec/changes/render-speedup-benchmark/VERIFY_WINFORMS.md create mode 100644 openspec/changes/render-speedup-benchmark/contracts/render-benchmark.openapi.yaml create mode 100644 openspec/changes/render-speedup-benchmark/data-model.md create mode 100644 openspec/changes/render-speedup-benchmark/design.md create mode 100644 openspec/changes/render-speedup-benchmark/dpi-fix-implementation.md create mode 100644 openspec/changes/render-speedup-benchmark/final_cleanup.md create mode 100644 openspec/changes/render-speedup-benchmark/migration-map.md create mode 100644 openspec/changes/render-speedup-benchmark/proposal.md create mode 100644 openspec/changes/render-speedup-benchmark/quickstart.md create mode 100644 openspec/changes/render-speedup-benchmark/refresh-dirty-flag-audit.md create mode 100644 openspec/changes/render-speedup-benchmark/specs/render-speedup-benchmark/spec.md create mode 100644 openspec/changes/render-speedup-benchmark/tasks.md create mode 100644 openspec/changes/render-speedup-benchmark/timing-artifact-schema.md diff --git a/.gitattributes b/.gitattributes index 155cbc7df1..8cf8104b2a 100644 --- a/.gitattributes +++ b/.gitattributes @@ -34,3 +34,6 @@ Src/LexText/ParserCore/ParserCoreTests/**/*.txt -whitespace Src/Utilities/pcpatrflex/DisambiguateInFLExDB/DisambiguateInFLExDBTests/TestData/*.* -whitespace Src/Utilities/pcpatrflex/PcPatrBrowserDll/Transforms/*.* -whitespace Src/Utilities/HCSynthByGloss/HCSynthByGloss/TestData/*.txt -whitespace + +# Verify snapshot testing +*.verified.png binary diff --git a/.gitignore b/.gitignore index a0ef3c2c2f..8e17117da2 100644 --- a/.gitignore +++ b/.gitignore @@ -100,6 +100,8 @@ _UpgradeReport_Files/ /Release/ Output/ Output +Output/RenderBenchmarks/ +Output/RenderBenchmarks/** Output_i686/ Output_x86_64/ __pycache__/ @@ -186,6 +188,7 @@ CrashLog.txt # VSTest Artifacts TestResults/ *.trx +TestResult.xml # WPF markup compilation temp projects *_wpftmp.csproj @@ -201,3 +204,8 @@ FLExInstaller/wix6/cabcache/* # Claude Code worktrees .claude/worktrees/* + +# Verify snapshot testing - received files are transient +*.received.png +*.diff.png +DataTreeTimingBaselines.json \ No newline at end of file diff --git a/.vscode/tasks.json b/.vscode/tasks.json index e83806466c..8e14bcddb2 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -85,6 +85,23 @@ } ], "tasks": [ + { + "label": "Test: RenderBaselineTests", + "type": "shell", + "command": ".\\test.ps1 -TestProject \"RootSiteTests\" -TestFilter \"FullyQualifiedName~RenderBaselineTests\"", + "options": { + "shell": { + "executable": "powershell.exe", + "args": ["-NoProfile", "-ExecutionPolicy", "Bypass", "-Command"] + } + }, + "problemMatcher": [], + "group": "test", + "presentation": { + "reveal": "always", + "panel": "shared" + } + }, // ==================== Setup Tasks ==================== { "label": "Setup: Colorize Worktree", diff --git a/Build/Agent/Run-AllRenders.ps1 b/Build/Agent/Run-AllRenders.ps1 new file mode 100644 index 0000000000..18bf447d06 --- /dev/null +++ b/Build/Agent/Run-AllRenders.ps1 @@ -0,0 +1,131 @@ +<# +.SYNOPSIS + Runs the render-focused test suites for FieldWorks. + +.DESCRIPTION + Executes the DetailControls render tests and the RootSite render tests sequentially. + This script is intentionally outside the product project graph so developers can use a + single entrypoint without introducing a meta test project into the repository architecture. + +.PARAMETER Scope + Which render suites to run. Default is All. + +.PARAMETER Configuration + The build configuration to test. Default is Debug. + +.PARAMETER NoBuild + Skip building before running tests. + +.PARAMETER Verbosity + Test output verbosity: quiet, minimal, normal, detailed. + +.PARAMETER SkipDependencyCheck + Skip dependency preflight checks inside test.ps1. +#> +[CmdletBinding()] +param( + [ValidateSet('All', 'DetailControls', 'RootSite')] + [string]$Scope = 'All', + [string]$Configuration = 'Debug', + [switch]$NoBuild, + [ValidateSet('quiet', 'minimal', 'normal', 'detailed', 'q', 'm', 'n', 'd')] + [string]$Verbosity = 'normal', + [switch]$SkipDependencyCheck +) + +Set-StrictMode -Version Latest +$ErrorActionPreference = 'Stop' + +$repoRoot = [System.IO.Path]::GetFullPath((Join-Path $PSScriptRoot '..\..')) +$buildScript = Join-Path $repoRoot 'build.ps1' +$testScript = Join-Path $repoRoot 'test.ps1' + +if (-not (Test-Path $buildScript)) { + throw "build.ps1 not found at $buildScript" +} + +if (-not (Test-Path $testScript)) { + throw "test.ps1 not found at $testScript" +} + +$requestedScopes = switch ($Scope) { + 'All' { @('DetailControls', 'RootSite') } + default { @($Scope) } +} + +function Invoke-RenderSuite { + param( + [Parameter(Mandatory = $true)] + [string]$Name, + [Parameter(Mandatory = $true)] + [string]$BuildProject, + [Parameter(Mandatory = $true)] + [string]$TestProject, + [Parameter(Mandatory = $true)] + [string[]]$TestFilters + ) + + if (-not $NoBuild) { + Write-Output "Building $Name render tests..." + + $buildArgs = @{ + Configuration = $Configuration + Project = $BuildProject + Verbosity = $Verbosity + } + + if ($SkipDependencyCheck) { + $buildArgs['SkipDependencyCheck'] = $true + } + + & $buildScript @buildArgs + if ($LASTEXITCODE -ne 0) { + throw "$Name render build failed with exit code $LASTEXITCODE." + } + } + + foreach ($testFilter in $TestFilters) { + Write-Output "Running $Name render tests with filter '$testFilter'..." + + $testArgs = @{ + Configuration = $Configuration + TestProject = $TestProject + TestFilter = $testFilter + Verbosity = $Verbosity + NoBuild = $true + SkipDependencyCheck = $true + } + + & $testScript @testArgs + if ($LASTEXITCODE -ne 0) { + throw "$Name render tests failed with exit code $LASTEXITCODE for filter '$testFilter'." + } + } + + Write-Output "[OK] $Name render tests passed." +} + +foreach ($requestedScope in $requestedScopes) { + switch ($requestedScope) { + 'DetailControls' { + Invoke-RenderSuite ` + -Name 'DetailControls' ` + -BuildProject 'Src/Common/Controls/DetailControls/DetailControlsTests/DetailControlsTests.csproj' ` + -TestProject 'Src/Common/Controls/DetailControls/DetailControlsTests' ` + -TestFilters 'FullyQualifiedName~DataTreeRenderTests' + } + 'RootSite' { + Invoke-RenderSuite ` + -Name 'RootSite' ` + -BuildProject 'Src/Common/RootSite/RootSiteTests/RootSiteTests.csproj' ` + -TestProject 'Src/Common/RootSite/RootSiteTests' ` + -TestFilters @( + 'FullyQualifiedName~RenderBaselineTests', + 'FullyQualifiedName~RenderTimingSuiteTests', + 'FullyQualifiedName~RenderVerifyTests' + ) + } + } +} + +Write-Output 'All requested render suites passed.' \ No newline at end of file diff --git a/FieldWorks.sln b/FieldWorks.sln index 12b0c003cf..c7ca074998 100644 --- a/FieldWorks.sln +++ b/FieldWorks.sln @@ -18,6 +18,10 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DetailControls", "Src\Commo EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DetailControlsTests", "Src\Common\Controls\DetailControls\DetailControlsTests\DetailControlsTests.csproj", "{36F2A7A6-C7F9-5D3D-87D7-B4C0D5C51C0E}" EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "RenderTestInfrastructure", "Src\Common\RenderTestInfrastructure\RenderTestInfrastructure.csproj", "{B53C715F-2F97-4E2B-9C10-5BFF1C04A446}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "RenderVerification", "Src\Common\RenderVerification\RenderVerification.csproj", "{6F7A4D9C-5B44-4D0E-ABAA-8D6F38F30C6A}" +EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Discourse", "Src\LexText\Discourse\Discourse.csproj", "{A51BAFC3-1649-584D-8D25-101884EE9EAA}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DiscourseTests", "Src\LexText\Discourse\DiscourseTests\DiscourseTests.csproj", "{1CE6483D-5D10-51AD-B2A7-FD7F82CCBAB2}" @@ -335,6 +339,18 @@ Global {36F2A7A6-C7F9-5D3D-87D7-B4C0D5C51C0E}.Debug|x64.Build.0 = Debug|x64 {36F2A7A6-C7F9-5D3D-87D7-B4C0D5C51C0E}.Release|x64.ActiveCfg = Release|x64 {36F2A7A6-C7F9-5D3D-87D7-B4C0D5C51C0E}.Release|x64.Build.0 = Release|x64 + {B53C715F-2F97-4E2B-9C10-5BFF1C04A446}.Bounds|x64.ActiveCfg = Release|x64 + {B53C715F-2F97-4E2B-9C10-5BFF1C04A446}.Bounds|x64.Build.0 = Release|x64 + {B53C715F-2F97-4E2B-9C10-5BFF1C04A446}.Debug|x64.ActiveCfg = Debug|x64 + {B53C715F-2F97-4E2B-9C10-5BFF1C04A446}.Debug|x64.Build.0 = Debug|x64 + {B53C715F-2F97-4E2B-9C10-5BFF1C04A446}.Release|x64.ActiveCfg = Release|x64 + {B53C715F-2F97-4E2B-9C10-5BFF1C04A446}.Release|x64.Build.0 = Release|x64 + {6F7A4D9C-5B44-4D0E-ABAA-8D6F38F30C6A}.Bounds|x64.ActiveCfg = Release|x64 + {6F7A4D9C-5B44-4D0E-ABAA-8D6F38F30C6A}.Bounds|x64.Build.0 = Release|x64 + {6F7A4D9C-5B44-4D0E-ABAA-8D6F38F30C6A}.Debug|x64.ActiveCfg = Debug|x64 + {6F7A4D9C-5B44-4D0E-ABAA-8D6F38F30C6A}.Debug|x64.Build.0 = Debug|x64 + {6F7A4D9C-5B44-4D0E-ABAA-8D6F38F30C6A}.Release|x64.ActiveCfg = Release|x64 + {6F7A4D9C-5B44-4D0E-ABAA-8D6F38F30C6A}.Release|x64.Build.0 = Release|x64 {A51BAFC3-1649-584D-8D25-101884EE9EAA}.Bounds|x64.ActiveCfg = Release|x64 {A51BAFC3-1649-584D-8D25-101884EE9EAA}.Bounds|x64.Build.0 = Release|x64 {A51BAFC3-1649-584D-8D25-101884EE9EAA}.Debug|x64.ActiveCfg = Debug|x64 diff --git a/Src/Common/Controls/DetailControls/DataTree.cs b/Src/Common/Controls/DetailControls/DataTree.cs index 219d8bd882..27ea2ea211 100644 --- a/Src/Common/Controls/DetailControls/DataTree.cs +++ b/Src/Common/Controls/DetailControls/DataTree.cs @@ -139,6 +139,7 @@ public class DataTree : UserControl, IVwNotifyChange, IxCoreColleague, IRefresha // to allow slices to handle events (e.g. InflAffixTemplateSlice) protected Mediator m_mediator; protected PropertyTable m_propertyTable; + private int m_sliceInstallCreationCount; protected IRecordChangeHandler m_rch = null; protected IRecordListUpdater m_rlu = null; protected string m_listName; @@ -162,6 +163,34 @@ public class DataTree : UserControl, IVwNotifyChange, IxCoreColleague, IRefresha public List Slices { get; private set; } + public int SliceInstallCreationCount => m_sliceInstallCreationCount; + + public void ResetSliceInstallCreationCount() + { + m_sliceInstallCreationCount = 0; + } + + public void IncrementSliceInstallCreationCount() + { + m_sliceInstallCreationCount++; + } + + /// + /// Tracks the highest slice index that has been made visible. Used by MakeSliceVisible + /// to avoid re-walking already-visible prefix on sequential calls. + /// Reset to -1 in CreateSlices and on any structural mutation of Slices. + /// This may be able to be optimized more, but this is the simplest, + /// "always works" solution. + /// + private int m_lastVisibleHighWaterMark = -1; + private int m_lastSlicePrewarmScrollTop = int.MinValue; + private int m_lastSlicePrewarmScrollDirection; + private int m_deferredSlicePrewarmStartIndex = -1; + private int m_deferredSlicePrewarmTargetIndex = -1; + private int m_deferredSlicePrewarmGeneration; + private bool m_deferredSlicePrewarmPending; + private bool m_deferredSlicePrewarmQueued; + #endregion Data members #region constants @@ -206,6 +235,9 @@ public enum LayoutStates : byte /// Control how much output we send to the application's listeners (e.g. visual studio output window) /// protected TraceSwitch m_traceSwitch = new TraceSwitch("DataTree", ""); + private static readonly bool s_enableInteractionTrace = IsOptInPerfFlagEnabled("FW_PERF_INTERACTION_TRACE"); + private static readonly int s_interactionTraceThresholdMs = GetPerfThresholdMs( + "FW_PERF_INTERACTION_TRACE_THRESHOLD_MS", 25); protected void TraceVerbose(string s) { if(m_traceSwitch.TraceVerbose) @@ -221,8 +253,51 @@ protected void TraceInfoLine(string s) if(m_traceSwitch.TraceInfo || m_traceSwitch.TraceVerbose) Trace.WriteLine("DataTreeThreadID="+System.Threading.Thread.CurrentThread.GetHashCode()+": "+s); } + private static bool IsOptInPerfFlagEnabled(string variableName) + { + var value = Environment.GetEnvironmentVariable(variableName); + if (string.IsNullOrEmpty(value)) + return false; + + return !string.Equals(value, "0", StringComparison.OrdinalIgnoreCase) && + !string.Equals(value, "false", StringComparison.OrdinalIgnoreCase) && + !string.Equals(value, "off", StringComparison.OrdinalIgnoreCase); + } + + private static int GetPerfThresholdMs(string variableName, int defaultValue) + { + var value = Environment.GetEnvironmentVariable(variableName); + if (int.TryParse(value, out var thresholdMs) && thresholdMs >= 0) + return thresholdMs; + + return defaultValue; + } + + private static void TraceInteractionTiming(string stage, long elapsedMs, string details) + { + if (!s_enableInteractionTrace || elapsedMs < s_interactionTraceThresholdMs) + return; + + Trace.WriteLine( + $"[FW_PERF_INTERACTION] [DataTree] Stage={stage} DurationMs={elapsedMs} {details}"); + } + + private static void TraceInteractionEvent(string stage, string details) + { + if (!s_enableInteractionTrace) + return; + + Trace.WriteLine( + $"[FW_PERF_INTERACTION] [DataTree] Stage={stage} {details}"); + } #endregion + protected virtual int ScrollSlicePrewarmPercentInScrollDirection => 200; + protected virtual int ScrollSlicePrewarmPercentAgainstScrollDirection => 0; + protected virtual int ScrollSlicePrewarmChunkSize => 10; + protected virtual int ScrollSlicePrewarmTimeBudgetMs => 25; + protected virtual IdleQueuePriority ScrollSlicePrewarmIdlePriority => IdleQueuePriority.Medium; + #region Slice collection manipulation methods private ToolTip ToolTip @@ -242,7 +317,11 @@ private ToolTip ToolTip private void InsertSlice(int index, Slice slice) { InstallSlice(slice, index); - ResetTabIndices(index); + InvalidateVisibleSliceHighWaterMark(); + // Skip per-slice tab index reset during bulk construction; CreateSlices() + // performs a single ResetTabIndices(0) after all slices are created. + if (!ConstructingSlices) + ResetTabIndices(index); if (m_fSetCurrentSliceNew && !slice.IsHeaderNode) { m_fSetCurrentSliceNew = false; @@ -268,9 +347,12 @@ private void InstallSlice(Slice slice, int index) SetToolTip(slice); slice.ResumeLayout(); - // Make sure it isn't added twice. - SplitContainer sc = slice.SplitCont; - AdjustSliceSplitPosition(slice); + // Skip per-slice splitter adjustment during bulk construction; + // HandleLayout1 sets correct widths + positions after construction completes. + if (!ConstructingSlices) + { + AdjustSliceSplitPosition(slice); + } } /// @@ -283,9 +365,20 @@ private void ForceSliceIndex(Slice slice, int index) { Slices.Remove(slice); Slices.Insert(index, slice); + InvalidateVisibleSliceHighWaterMark(); } } + /// + /// The MakeSliceVisible cache is only valid while the current Slices ordering stays intact. + /// Any insert, remove, or reorder can move an invisible slice into the cached visible prefix, + /// so the conservative fix is to drop the cache and rebuild it on demand. + /// + private void InvalidateVisibleSliceHighWaterMark() + { + m_lastVisibleHighWaterMark = -1; + } + private void SetToolTip(Slice slice) { if (slice.ToolTip != null) @@ -317,8 +410,6 @@ void slice_SplitterMoved(object sender, SplitterEventArgs e) } } ResumeLayout(false); - // This can affect the lines between the slices. We need to redraw them but not the - // slices themselves. Invalidate(false); movedSlice.TakeFocus(); } @@ -335,6 +426,10 @@ private void AdjustSliceSplitPosition(Slice otherSlice) protected override void OnSizeChanged(EventArgs e) { base.OnSizeChanged(e); + // Skip O(N) splitter adjustment during bulk slice construction — + // HandleLayout1 will set correct widths + positions after construction. + if (ConstructingSlices) + return; foreach (Slice slice in Slices) { AdjustSliceSplitPosition(slice); @@ -393,6 +488,7 @@ private void RemoveSlice(Slice gonner, int index) internal void RemoveDisposedSlice(Slice gonner) { Slices.Remove(gonner); + InvalidateVisibleSliceHighWaterMark(); } private void RemoveSlice(Slice gonner, int index, bool fixToolTips) @@ -402,6 +498,7 @@ private void RemoveSlice(Slice gonner, int index, bool fixToolTips) Controls.Remove(gonner); Debug.Assert(Slices[index] == gonner); Slices.RemoveAt(index); + InvalidateVisibleSliceHighWaterMark(); // Reset CurrentSlice, if appropriate. if (gonner == m_currentSlice) @@ -445,7 +542,10 @@ private void RemoveSlice(Slice gonner, int index, bool fixToolTips) SetToolTip(keeper); } - ResetTabIndices(index); + // Skip per-slice tab index reset during bulk construction; CreateSlices() + // performs a single ResetTabIndices(0) after all slices are created. + if (!ConstructingSlices) + ResetTabIndices(index); } private void SetTabIndex(int index) @@ -474,6 +574,9 @@ public DataTree() { // string objName = ToString() + GetHashCode().ToString(); // Debug.WriteLine("Creating object:" + objName); + SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint, true); + UpdateStyles(); + Slices = new List(); m_autoCustomFieldNodesDocument = new XmlDocument(); m_autoCustomFieldNodesDocRoot = m_autoCustomFieldNodesDocument.CreateElement("root"); @@ -682,8 +785,9 @@ public Slice CurrentSlice // Tell the old geezer it isn't current anymore. if (m_currentSlice != null) { - m_currentSlice.Validate(); - if (m_currentSlice.Control is ContainerControl) + if (m_currentSlice.IsHandleCreated) + m_currentSlice.Validate(); + if (m_currentSlice.IsHandleCreated && m_currentSlice.Control is ContainerControl) ((ContainerControl)m_currentSlice.Control).Validate(); m_currentSlice.SetCurrentState(false); } @@ -817,6 +921,7 @@ public void Reset() } Controls.Clear(); //clear the controls Slices.Clear(); //empty the slices collection + InvalidateVisibleSliceHighWaterMark(); foreach (var slice in slices) //make sure the slices don't think they are active, dispose them { slice.SetCurrentState(false); @@ -1775,10 +1880,12 @@ private void CreateSlices(bool differentObject) { var watch = new Stopwatch(); watch.Start(); + ResetSliceInstallCreationCount(); bool wasVisible = this.Visible; var previousSlices = new ObjSeqHashMap(); int oldSliceCount = Slices.Count; ConstructingSlices = true; + m_lastVisibleHighWaterMark = -1; // Reset visibility tracking for fresh slice construction. try { // Bizarrely, calling Hide has been known to cause OnEnter to be called in a slice; we need to suppress this, @@ -1825,10 +1932,13 @@ private void CreateSlices(bool differentObject) foreach (Slice keeper in Slices) SetToolTip(keeper); } - ResetTabIndices(0); } finally { + // Keep tab indices consistent even if slice generation throws. + // This also serves as the single bulk reset for per-slice InsertSlice calls + // during ConstructingSlices. + ResetTabIndices(0); ConstructingSlices = false; } if (wasVisible) @@ -1893,13 +2003,10 @@ private static bool IsChildSlice(Slice first, Slice second) /// /// This actually handles Paint for the contained control that has the slice controls in it. /// - /// The instance containing the event data. - void HandlePaintLinesBetweenSlices(PaintEventArgs pea) + private void PaintLinesBetweenSlices(Graphics gr, Rectangle clipRect, int width) { - Graphics gr = pea.Graphics; - UserControl uc = this; - // Where we're drawing. - int width = uc.Width; + // Maximum vertical extent a separator can occupy (heavy rule + above-margin). + int maxLineExtent = HeavyweightRuleThickness + HeavyweightRuleAboveMargin; using (var thinPen = new Pen(Color.LightGray, 1)) using (var thickPen = new Pen(Color.LightGray, 1 + HeavyweightRuleThickness)) { @@ -1908,13 +2015,21 @@ void HandlePaintLinesBetweenSlices(PaintEventArgs pea) var slice = Slices[i] as Slice; if (slice == null) continue; - // shouldn't be visible + + // Clip-rect culling: skip separator lines entirely outside the paint region. + // Slice positions are monotonically increasing (set sequentially by HandleLayout1), + // so once we pass the bottom of the clip rect we can stop. + Point loc = slice.Location; + int yPos = loc.Y + slice.Height; + if (yPos + maxLineExtent < clipRect.Top) + continue; // separator is above the paint region + if (loc.Y > clipRect.Bottom) + break; // all remaining slices are below the paint region + Slice nextSlice = null; if (i < Slices.Count - 1) nextSlice = Slices[i + 1] as Slice; Pen linePen = thinPen; - Point loc = slice.Location; - int yPos = loc.Y + slice.Height; int xPos = loc.X + slice.LabelIndent(); if (nextSlice != null) @@ -1925,19 +2040,18 @@ void HandlePaintLinesBetweenSlices(PaintEventArgs pea) //drop the next line unless the next slice is going to be a header, too // (as is the case with empty sections), or isn't indented (as for the line following // the empty 'Subclasses' heading in each inflection class). - if (XmlUtils.GetOptionalBooleanAttributeValue(slice.ConfigurationNode, "header", false) + if (slice.IsHeader && nextSlice.Weight != ObjectWeight.heavy && IsChildSlice(slice, nextSlice)) continue; //LT-11962 Improvements to display in Info tab. // (remove the line directly below the Notebook Record header) - if (XmlUtils.GetOptionalBooleanAttributeValue(slice.ConfigurationNode, "skipSpacerLine", false) && - slice is SummarySlice) + if (slice.SkipSpacerLine && slice is SummarySlice) continue; // Check for attribute that the next slice should be grouped with the current slice // regardless of whether they represent the same object. - bool fSameObject = XmlUtils.GetOptionalBooleanAttributeValue(nextSlice.ConfigurationNode, "sameObject", false); + bool fSameObject = nextSlice.SameObject; xPos = Math.Min(xPos, loc.X + nextSlice.LabelIndent()); if (nextSlice.Weight == ObjectWeight.heavy) @@ -3366,12 +3480,18 @@ public virtual Slice MakeEditorAt(int i) public Slice FieldAt(int i) { CheckDisposed(); + Stopwatch stopwatch = null; + int expansionCount = 0; + if (s_enableInteractionTrace) + stopwatch = Stopwatch.StartNew(); + Slice slice = FieldOrDummyAt(i); // Keep trying until we get a real slice. It's possible, for example, that the first object // in a sequence expands into an embedded lazy sequence, which in turn needs to have its // first item made real. while (!slice.IsRealSlice) { + expansionCount++; var oldState = m_layoutState; // guard against OnPaint() while slice is being constructed. Especially dangerous if it is a view, // which might end up doing a re-entrant call to Construct() the root box. LT-11052. @@ -3404,6 +3524,12 @@ public Slice FieldAt(int i) m_layoutState = oldState; } } + if (stopwatch != null) + { + stopwatch.Stop(); + TraceInteractionTiming("FieldAt", stopwatch.ElapsedMilliseconds, + $"Index={i} Expansions={expansionCount} IsRealSlice={slice != null && slice.IsRealSlice}"); + } return slice; } /// @@ -3540,22 +3666,80 @@ protected override void OnLayout(LayoutEventArgs levent) } } + /// + /// Binary search for the index of the first slice whose bottom edge extends + /// below . Slices before this index are entirely + /// above the viewport and can be skipped in the paint path. + /// Returns 0 if no slices can be safely skipped (e.g., all are visible or a + /// null entry is encountered during the search). + /// + /// The Y coordinate of the top of the clip rectangle. + /// Index of the first slice that might be visible. + private int FindFirstPotentiallyVisibleSlice(int clipTop) + { + int lo = 0, hi = Slices.Count - 1; + int result = 0; + + while (lo <= hi) + { + int mid = lo + (hi - lo) / 2; + var slice = Slices[mid] as Slice; + if (slice == null) + return result; // Can't binary search past null; use best result so far + + int sliceBottom = slice.Top + slice.Height; + if (sliceBottom <= clipTop) + { + // Slice ends at or before the clip top — entirely above viewport. + result = mid + 1; + lo = mid + 1; + } + else + { + // Slice extends below clip top — could be visible. + hi = mid - 1; + } + } + + // Back up by one slice as a safety margin for heavyweight spacing or + // off-by-one edge cases. Cost: one extra loop iteration. + return Math.Max(0, result - 1); + } + /// /// Used both by main layout routine and also by OnPaint to make sure all /// visible slices are real. For full layout, clipRect is meaningless. + /// On the paint path (!fFull), uses a binary search to skip above-viewport + /// slices, reducing each paint from O(N) to O(log N + V) where V is the + /// number of visible slices. /// /// if set to true [f full]. /// The clip rect. /// protected internal int HandleLayout1(bool fFull, Rectangle clipRect) { + Stopwatch layoutStopwatch = null; + long fieldAtMs = 0; + int fieldAtCount = 0; + long makeVisibleMs = 0; + int makeVisibleCount = 0; + int visibleSliceCount = 0; + if (s_enableInteractionTrace && !fFull) + layoutStopwatch = Stopwatch.StartNew(); + if (m_fDisposing) - return clipRect.Bottom; // don't want to lay out while clearing slices in dispose! + { + if (layoutStopwatch != null) + { + layoutStopwatch.Stop(); + TraceInteractionTiming("HandleLayout1.PaintPath", layoutStopwatch.ElapsedMilliseconds, + $"Reason=disposing ClipTop={clipRect.Top} ClipBottom={clipRect.Bottom}"); + } + return clipRect.Bottom; + } int minHeight = GetMinFieldHeight(); int desiredWidth = ClientRectangle.Width; - - // FWNX-370: work around https://bugzilla.novell.com/show_bug.cgi?id=609596 if (Platform.IsMono && VerticalScroll.Visible) desiredWidth -= SystemInformation.VerticalScrollBarWidth; @@ -3563,77 +3747,282 @@ protected internal int HandleLayout1(bool fFull, Rectangle clipRect) var desiredScrollPosition = new Point(-oldPos.X, -oldPos.Y); int yTop = AutoScrollPosition.Y; - for (int i = 0; i < Slices.Count; i++) + int startIndex = 0; + int firstIndexBelowViewport = -1; + if (!fFull && Slices.Count > 0) + { + startIndex = FindFirstPotentiallyVisibleSlice(clipRect.Top); + if (startIndex > 0) + { + var startSlice = Slices[startIndex] as Slice; + if (startSlice != null) + { + yTop = startSlice.Top; + if (startSlice.Weight == ObjectWeight.heavy) + yTop -= (HeavyweightRuleThickness + HeavyweightRuleAboveMargin); + } + else + { + startIndex = 0; + } + } + } + + for (int i = startIndex; i < Slices.Count; i++) { - // Don't care about items below bottom of clip, if one is specified. if ((!fFull) && yTop >= clipRect.Bottom) { - return yTop - AutoScrollPosition.Y; // not very meaningful in this case, but a result is required. + firstIndexBelowViewport = i; + QueueDeferredSlicePrewarm(firstIndexBelowViewport); + if (layoutStopwatch != null) + { + layoutStopwatch.Stop(); + TraceInteractionTiming("HandleLayout1.PaintPath", layoutStopwatch.ElapsedMilliseconds, + $"StartIndex={startIndex} VisibleSlices={visibleSliceCount} FieldAtCount={fieldAtCount} FieldAtMs={fieldAtMs} MakeVisibleCount={makeVisibleCount} MakeVisibleMs={makeVisibleMs} ClipTop={clipRect.Top} ClipBottom={clipRect.Bottom} Exit=below-clip"); + } + return yTop - AutoScrollPosition.Y; } + var tci = Slices[i] as Slice; - // Best guess of its height, before we ensure it's real. int defHeight = tci == null ? minHeight : tci.Height; bool fSliceIsVisible = !fFull && yTop + defHeight > clipRect.Top && yTop <= clipRect.Bottom; - //Debug.WriteLine(String.Format("DataTree.HandleLayout1({3},{4}): fSliceIsVisible = {5}, i = {0}, defHeight = {1}, yTop = {2}, desiredWidth = {7}, tci.Config = {6}", - // i, defHeight, yTop, fFull, clipRect.ToString(), fSliceIsVisible, tci.ConfigurationNode.OuterXml, desiredWidth)); - if (fSliceIsVisible) { - // We cannot allow slice to be unreal; it's visible, and we're checking - // for real slices where they're visible - tci = FieldAt(i); // ensures it becomes real if needed. - var dummy = tci.Handle; // also force it to get a handle + visibleSliceCount++; + Stopwatch fieldAtStopwatch = null; + if (layoutStopwatch != null) + fieldAtStopwatch = Stopwatch.StartNew(); + tci = FieldAt(i); + if (fieldAtStopwatch != null) + { + fieldAtStopwatch.Stop(); + fieldAtCount++; + fieldAtMs += fieldAtStopwatch.ElapsedMilliseconds; + } + var dummy = tci.Handle; if (tci.Control != null) - dummy = tci.Control.Handle; // and its control must too. + dummy = tci.Control.Handle; if (yTop < 0) { - // It starts above the top of the window. We need to adjust the scroll position - // by the difference between the expected and actual heights. - // This can have side effects, don't do unless needed. - // The slice will now handle the conditioanl execution. - //if (tci.Width != desiredWidth) - tci.SetWidthForDataTreeLayout(desiredWidth); + tci.SetWidthForDataTreeLayout(desiredWidth); desiredScrollPosition.Y -= (defHeight - tci.Height); } } + if (tci == null) { yTop += minHeight; } else { - // Move this slice down a little if it needs a heavy rule above it if (tci.Weight == ObjectWeight.heavy) yTop += HeavyweightRuleThickness + HeavyweightRuleAboveMargin; if (tci.Top != yTop) tci.Top = yTop; - // This can have side effects, don't do unless needed. - // The slice will now handle the conditional execution. - //if (tci.Width != desiredWidth) + if (fFull || fSliceIsVisible) tci.SetWidthForDataTreeLayout(desiredWidth); yTop += tci.Height + 1; if (fSliceIsVisible) { - MakeSliceVisible(tci); + Stopwatch makeVisibleStopwatch = null; + if (layoutStopwatch != null) + makeVisibleStopwatch = Stopwatch.StartNew(); + MakeSliceVisible(tci, i); + if (makeVisibleStopwatch != null) + { + makeVisibleStopwatch.Stop(); + makeVisibleCount++; + makeVisibleMs += makeVisibleStopwatch.ElapsedMilliseconds; + } } } } - // In the course of making slices real or adjusting their width they may have changed height (more strictly, its - // real height may be different from the previous estimated height). - // If it was previously above the top of the window, this can produce an unwanted - // change in the visble position of previously visible slices. - // The scroll position may also have changed as a result of the blankety blank - // blank undocumented behavior of the UserControl class trying to make what it - // thinks is the interesting child control visible. - // In case it changed, try to change it back! - // (This might not always succeed, if the scroll range changed so as to make the old position invalid. + if (-AutoScrollPosition.Y != desiredScrollPosition.Y) AutoScrollPosition = desiredScrollPosition; + if (!fFull) + QueueDeferredSlicePrewarm(firstIndexBelowViewport >= 0 ? firstIndexBelowViewport : Slices.Count); + if (layoutStopwatch != null) + { + layoutStopwatch.Stop(); + TraceInteractionTiming("HandleLayout1.PaintPath", layoutStopwatch.ElapsedMilliseconds, + $"StartIndex={startIndex} VisibleSlices={visibleSliceCount} FieldAtCount={fieldAtCount} FieldAtMs={fieldAtMs} MakeVisibleCount={makeVisibleCount} MakeVisibleMs={makeVisibleMs} ClipTop={clipRect.Top} ClipBottom={clipRect.Bottom} Exit=complete"); + } return yTop - AutoScrollPosition.Y; } - private void MakeSliceRealAt(int i) + private int GetSlicePrewarmPixels(int viewportPercent) + { + if (viewportPercent <= 0 || ClientRectangle.Height <= 0) + return 0; + + long pixels = (long)ClientRectangle.Height * viewportPercent / 100; + return Math.Max(1, (int)pixels); + } + + private void QueueDeferredSlicePrewarm(int firstIndexBelowViewport) + { + if (m_fDisposing || !Visible || !IsHandleCreated || ClientRectangle.Height <= 0 || Slices.Count == 0) + return; + if (m_lastSlicePrewarmScrollDirection == 0) + return; + + int viewportTop = -AutoScrollPosition.Y; + int viewportBottom = viewportTop + ClientRectangle.Height; + int topMargin = m_lastSlicePrewarmScrollDirection > 0 + ? GetSlicePrewarmPixels(ScrollSlicePrewarmPercentAgainstScrollDirection) + : GetSlicePrewarmPixels(ScrollSlicePrewarmPercentInScrollDirection); + int bottomMargin = m_lastSlicePrewarmScrollDirection > 0 + ? GetSlicePrewarmPixels(ScrollSlicePrewarmPercentInScrollDirection) + : GetSlicePrewarmPixels(ScrollSlicePrewarmPercentAgainstScrollDirection); + if (topMargin <= 0 && bottomMargin <= 0) + return; + + int targetY = m_lastSlicePrewarmScrollDirection >= 0 + ? viewportBottom + bottomMargin + : Math.Max(0, viewportTop - topMargin); + int targetIndex = IndexOfSliceAtY(targetY); + if (targetIndex < 0) + targetIndex = Slices.Count - 1; + + int startIndex = firstIndexBelowViewport; + if (m_lastSlicePrewarmScrollDirection < 0) + startIndex = Math.Max(0, IndexOfSliceAtY(Math.Max(0, viewportTop - topMargin))); + else if (startIndex < 0) + startIndex = Math.Max(0, IndexOfSliceAtY(viewportBottom)); + + startIndex = Math.Max(0, Math.Min(startIndex, Slices.Count - 1)); + targetIndex = Math.Max(0, Math.Min(targetIndex, Slices.Count - 1)); + int direction = m_lastSlicePrewarmScrollDirection; + if ((direction > 0 && startIndex > targetIndex) || + (direction < 0 && targetIndex > startIndex)) + { + return; + } + + bool restartingRange = !m_deferredSlicePrewarmPending || + (direction > 0 && targetIndex > m_deferredSlicePrewarmTargetIndex) || + (direction < 0 && targetIndex < m_deferredSlicePrewarmTargetIndex) || + (direction > 0 && startIndex > m_deferredSlicePrewarmTargetIndex) || + (direction < 0 && startIndex < m_deferredSlicePrewarmTargetIndex); + + if (!m_deferredSlicePrewarmPending) + { + m_deferredSlicePrewarmStartIndex = startIndex; + m_deferredSlicePrewarmTargetIndex = targetIndex; + m_deferredSlicePrewarmGeneration++; + } + else if (direction > 0) + { + m_deferredSlicePrewarmStartIndex = Math.Max(m_deferredSlicePrewarmStartIndex, startIndex); + m_deferredSlicePrewarmTargetIndex = Math.Max(m_deferredSlicePrewarmTargetIndex, targetIndex); + if (restartingRange) + m_deferredSlicePrewarmGeneration++; + } + else + { + m_deferredSlicePrewarmStartIndex = Math.Min(m_deferredSlicePrewarmStartIndex, startIndex); + m_deferredSlicePrewarmTargetIndex = Math.Min(m_deferredSlicePrewarmTargetIndex, targetIndex); + if (restartingRange) + m_deferredSlicePrewarmGeneration++; + } + + if ((direction > 0 && m_deferredSlicePrewarmStartIndex > m_deferredSlicePrewarmTargetIndex) || + (direction < 0 && m_deferredSlicePrewarmStartIndex < m_deferredSlicePrewarmTargetIndex)) + { + m_deferredSlicePrewarmPending = false; + return; + } + + m_deferredSlicePrewarmPending = true; + TraceInteractionEvent( + "DeferredSlicePrewarm.Plan", + $"Direction={direction} StartIndex={m_deferredSlicePrewarmStartIndex} TargetIndex={m_deferredSlicePrewarmTargetIndex} ViewTop={viewportTop} ViewBottom={viewportBottom} FirstBelowViewport={firstIndexBelowViewport} ChunkSize={ScrollSlicePrewarmChunkSize} BudgetMs={ScrollSlicePrewarmTimeBudgetMs} Restarting={restartingRange}"); + QueueDeferredSlicePrewarmOnIdle(); + } + + private void QueueDeferredSlicePrewarmOnIdle() + { + if (!m_deferredSlicePrewarmPending || m_fDisposing || !Visible || !IsHandleCreated) + return; + + if (m_mediator != null) + { + m_mediator.IdleQueue.Add( + ScrollSlicePrewarmIdlePriority, + ContinueDeferredSlicePrewarmOnIdle, + m_deferredSlicePrewarmGeneration, + true); + return; + } + + if (m_deferredSlicePrewarmQueued) + return; + + m_deferredSlicePrewarmQueued = true; + BeginInvoke((MethodInvoker)delegate + { + m_deferredSlicePrewarmQueued = false; + if (!ContinueDeferredSlicePrewarmOnIdle(m_deferredSlicePrewarmGeneration)) + QueueDeferredSlicePrewarmOnIdle(); + }); + } + + private bool ContinueDeferredSlicePrewarmOnIdle(object generationState) + { + if (!m_deferredSlicePrewarmPending || m_fDisposing) + return true; + if (!Visible || !IsHandleCreated || m_layoutState != LayoutStates.klsNormal) + return false; + + int generation = generationState is int value ? value : m_deferredSlicePrewarmGeneration; + if (generation != m_deferredSlicePrewarmGeneration) + return true; + + Stopwatch stopwatch = Stopwatch.StartNew(); + int slicesWarmed = 0; + int initialIndex = m_deferredSlicePrewarmStartIndex; + while (m_deferredSlicePrewarmPending && slicesWarmed < ScrollSlicePrewarmChunkSize) + { + if (stopwatch.ElapsedMilliseconds >= ScrollSlicePrewarmTimeBudgetMs) + break; + + int index = m_deferredSlicePrewarmStartIndex; + if (index < 0 || index >= Slices.Count) + { + m_deferredSlicePrewarmPending = false; + break; + } + + if (m_lastSlicePrewarmScrollDirection > 0 && index > m_deferredSlicePrewarmTargetIndex) + { + m_deferredSlicePrewarmPending = false; + break; + } + if (m_lastSlicePrewarmScrollDirection < 0 && index < m_deferredSlicePrewarmTargetIndex) + { + m_deferredSlicePrewarmPending = false; + break; + } + + if (Slices[index] is Slice) + MakeSliceRealAt(index, false); + + m_deferredSlicePrewarmStartIndex += m_lastSlicePrewarmScrollDirection >= 0 ? 1 : -1; + slicesWarmed++; + } + + stopwatch.Stop(); + TraceInteractionTiming( + "DeferredSlicePrewarm.Idle", + stopwatch.ElapsedMilliseconds, + $"Direction={m_lastSlicePrewarmScrollDirection} InitialIndex={initialIndex} NextIndex={m_deferredSlicePrewarmStartIndex} TargetIndex={m_deferredSlicePrewarmTargetIndex} SlicesWarmed={slicesWarmed} Pending={m_deferredSlicePrewarmPending}"); + + return !m_deferredSlicePrewarmPending; + } + + private void MakeSliceRealAt(int i, bool ensureVisible = true) { // We cannot allow slice to be unreal; it's visible, and we're checking // for real slices where they're visible @@ -3657,9 +4046,12 @@ private void MakeSliceRealAt(int i) var desiredScrollPosition = new Point(-oldPos.X, -oldPos.Y); // topAbs is the position of the slice relative to the top of the whole view contents now. int topAbs = tci.Top - AutoScrollPosition.Y; - MakeSliceVisible(tci); // also required for it to be a real tab stop. + if (ensureVisible) + MakeSliceVisible(tci); // also required for it to be a real tab stop. + else + tci.ShowSubControls(); - if (topAbs < desiredScrollPosition.Y) + if (ensureVisible && topAbs < desiredScrollPosition.Y) { // It was above the top of the window. We need to adjust the scroll position // by the difference between the expected and actual heights. @@ -3673,23 +4065,41 @@ private void MakeSliceRealAt(int i) /// Make a slice visible, either because it needs to be drawn, or because it needs to be /// focused. /// - /// - internal static void MakeSliceVisible(Slice tci) + /// The slice to make visible. + /// + /// The slice's known index in Slices, or -1 to look it up via IndexOf. + /// Passing the index avoids an O(N) IndexOf call when the caller already knows it. + /// + internal void MakeSliceVisible(Slice tci, int knownIndex = -1) { + Stopwatch stopwatch = null; + int newlyVisibleSiblingCount = 0; + bool sliceAlreadyVisible = tci.Visible; + if (s_enableInteractionTrace) + stopwatch = Stopwatch.StartNew(); + // It intersects the screen so it needs to be visible. if (!tci.Visible) { - int index = tci.IndexInContainer; + int index = knownIndex >= 0 ? knownIndex : Slices.IndexOf(tci); // All previous slices must be "visible". Otherwise, the index of the current // slice gets changed when it becomes visible due to what is presumably a bug // in the dotnet framework. - for (int i = 0; i < index; ++i) + // Optimization: start from m_lastVisibleHighWaterMark + 1 instead of 0, + // since slices before the high-water mark are already visible from prior calls. + int start = Math.Max(0, m_lastVisibleHighWaterMark + 1); + for (int i = start; i < index; ++i) { - Control ctrl = tci.ContainingDataTree.Slices[i]; + Control ctrl = Slices[i]; if (ctrl != null && !ctrl.Visible) + { ctrl.Visible = true; + newlyVisibleSiblingCount++; + } } tci.Visible = true; + if (index > m_lastVisibleHighWaterMark) + m_lastVisibleHighWaterMark = index; Debug.Assert(tci.IndexInContainer == index, String.Format("MakeSliceVisible: slice '{0}' at index({2}) should not have changed to index ({1})." + " This can occur when making slices visible in an order different than their order in DataTree.Slices. See LT-7307.", @@ -3702,6 +4112,12 @@ internal static void MakeSliceVisible(Slice tci) tci.Control.AccessibilityObject.Name = tci.Label;// + "ZZZ_Slice"; } tci.ShowSubControls(); + if (stopwatch != null) + { + stopwatch.Stop(); + TraceInteractionTiming("MakeSliceVisible", stopwatch.ElapsedMilliseconds, + $"SliceLabel={tci.Label ?? "(null)"} AlreadyVisible={sliceAlreadyVisible} NewlyVisibleSiblings={newlyVisibleSiblingCount}"); + } } public int GetMinFieldHeight() @@ -3798,6 +4214,14 @@ public int IndexOfSliceAtY(int yp) protected override void OnPaint(PaintEventArgs e) { + int previousScrollTop = m_lastSlicePrewarmScrollTop == int.MinValue + ? -AutoScrollPosition.Y + : m_lastSlicePrewarmScrollTop; + int currentScrollTop = -AutoScrollPosition.Y; + if (currentScrollTop != previousScrollTop) + m_lastSlicePrewarmScrollDirection = Math.Sign(currentScrollTop - previousScrollTop); + m_lastSlicePrewarmScrollTop = currentScrollTop; + if (m_layoutState != LayoutStates.klsNormal) { // re-entrant call, in the middle of doing layout! Suppress it. But, we need to paint sometime... @@ -3813,8 +4237,8 @@ protected override void OnPaint(PaintEventArgs e) } try { - // Optimize JohnT: Could we do a binary search for the - // slice at the top? But the chop point slices may not be real... + // Paint-path binary search: HandleLayout1 now uses FindFirstPotentiallyVisibleSlice + // to skip above-viewport slices (addresses JohnT's original TODO). m_layoutState = LayoutStates.klsChecking; Rectangle requiredReal = ClientRectangle; // all slices in this must be real HandleLayout1(false, requiredReal); @@ -3828,11 +4252,15 @@ protected override void OnPaint(PaintEventArgs e) PerformLayout(); if (AutoScrollPosition != oldPos) AutoScrollPosition = new Point(-oldPos.X, -oldPos.Y); + // Layout recovery can complete this paint pass without reaching the normal + // line-paint path below. Redraw separators now so they do not disappear + // until a follow-up paint arrives. + PaintLinesBetweenSlices(e.Graphics, ClientRectangle, ClientRectangle.Width); } else { base.OnPaint(e); - HandlePaintLinesBetweenSlices(e); + PaintLinesBetweenSlices(e.Graphics, e.ClipRectangle, ClientRectangle.Width); } } finally @@ -3859,6 +4287,33 @@ protected override void OnPaint(PaintEventArgs e) } } + protected override void WndProc(ref Message m) + { + base.WndProc(ref m); + // After any scroll input (scrollbar drag, mouse wheel, horizontal wheel), + // force the parent background to repaint so separator lines are redrawn at + // correct positions. Without this, Windows bitblts stale line pixels + // from the old scroll position and only repaints the newly-exposed strip. + // Invalidate(false) skips child invalidation — slice HWNDs repaint + // themselves — so only the gap areas between slices are redrawn. + // Update() forces synchronous processing so stale lines don't accumulate + // across multiple scroll events before the low-priority WM_PAINT fires. + const int WM_VSCROLL = 0x0115; + const int WM_HSCROLL = 0x0114; + const int WM_MOUSEWHEEL = 0x020A; + const int WM_MOUSEHWHEEL = 0x020E; + switch (m.Msg) + { + case WM_VSCROLL: + case WM_HSCROLL: + case WM_MOUSEWHEEL: + case WM_MOUSEHWHEEL: + Invalidate(false); + Update(); + break; + } + } + #region automated tree navigation /// @@ -3899,7 +4354,7 @@ internal bool GotoNextSliceAfterIndex(int index) while (index >= 0 && index < Slices.Count) { Slice current = FieldAt(index); - MakeSliceVisible(current); + MakeSliceVisible(current, index); if (current.TakeFocus(false)) { if (m_currentSlice != current) @@ -3921,7 +4376,7 @@ public bool GotoPreviousSliceBeforeIndex(int index) while (index >= 0 && index < Slices.Count) { Slice current = FieldAt(index); - MakeSliceVisible(current); + MakeSliceVisible(current, index); if (current.TakeFocus(false)) { if (m_currentSlice != current) @@ -4959,14 +5414,24 @@ public override Slice BecomeReal(int index) // Save these, we may get disposed soon, can't get them from member data any more. DataTree containingTree = ContainingDataTree; - Control parent = Parent; var parentSlice = ParentSlice; path.Add(hvo); var objItem = ContainingDataTree.Cache.ServiceLocator.GetInstance().GetObject(hvo); Point oldPos = ContainingDataTree.AutoScrollPosition; - ContainingDataTree.CreateSlicesFor(objItem, parentSlice, m_layoutName, m_layoutChoiceField, m_indent, index + 1, path, - new ObjSeqHashMap(), m_caller); + // Suspend layout during lazy expansion to avoid per-slice layout passes. + // ShowObject and RefreshList already do this, but BecomeReal is called + // independently when dummy slices become visible during scrolling. + containingTree.DeepSuspendLayout(); + try + { + ContainingDataTree.CreateSlicesFor(objItem, parentSlice, m_layoutName, m_layoutChoiceField, m_indent, index + 1, path, + new ObjSeqHashMap(), m_caller); + } + finally + { + containingTree.DeepResumeLayout(); + } // If inserting slices somehow altered the scroll position, for example as the // silly Panel tries to make the selected control visible, put it back! if (containingTree.AutoScrollPosition != oldPos) @@ -4976,12 +5441,5 @@ public override Slice BecomeReal(int index) return containingTree.Slices.Count > index + 1 ? containingTree.Slices[index + 1] as Slice : null; } - protected override void WndProc(ref Message m) - { - int aspY = AutoScrollPosition.Y; - base.WndProc (ref m); - if (aspY != AutoScrollPosition.Y) - Debug.WriteLine("ASP changed during processing message " + m.Msg); - } } } diff --git a/Src/Common/Controls/DetailControls/DetailControlsTests/DataTreeRenderTests.DataTreeRender_collapsed.verified.png b/Src/Common/Controls/DetailControls/DetailControlsTests/DataTreeRenderTests.DataTreeRender_collapsed.verified.png new file mode 100644 index 0000000000000000000000000000000000000000..cf8ea69411958428e2fb06c1cdc15bf7fe92a35e GIT binary patch literal 4440 zcmZ`+2~<S>Blq6svz<>lnz!4-!ghV5R#U$)YLX!W+@xAl=&i|it@2&20yQ`|Jzy7NF`YAWZ z%^TD=001_ha60AzfGpGm;p^p~@AtNQD^nyeF<_W)J$(#+F8?-cL&gCp6>9p~5C}At5H?<+M{*?ctFN z6n@o6|186wO!>^*#k;SIuFIFuSk0u(0My7;=L5^nkym*7ohBKh)6}l*T(+^piunrS zG9|#Yc#2#*%$Chc0GFzBpBGv5?xma1wg~!)bm!}21lt$L%JA27AKEfK?}n#r9Gz-} zfyCY2X)2Yne2YDuwu?smzXCHp2C#}4zBGScWuW|yC%7z?TLF&jp{JRwX&soc$rtKau1|F)1BsU)Ez?<&Tgwh+*?4L0)ZN~c z{i95&i|M8%T+b7)uxzhrO$OfwR`V!GUrrqHd`X|!_uyMS>Xz)Sj!gDtB<|BXhVwz2AbWmtrJDu$xf`EudhSodRQxqHd;5<5)5a++|7d!&Qe zjH%{64h(k|KC6w%vFV*n{7g+3B@c_&R_7lVpBy%3JZNC!PS9`DoU~EpG0tO)<5qcG zT(9Kx&y{oh+v9%EIrkn7Q!$eCrtC8wwiRiL#Aez+W4XAPh-k)0s(N<&AZmkcW*_nZWVb(2gtD&+1IYjpJ_68GrbF(j89-&%};{HP|sG64ZG1LPaoPF zbhoA}veMU9Vk*k*XNzNEeRl+nCnFq%d}D8pqFcX;EEHwxfyT{$g9-w2$5pT5m>Wyf#%c9J8*on(2atC6N!q zbCQZwS!3MT<1IxoU1m9Rk&y(#<-V2L^Hy3$>xNTpi8074QK%{+iF3P}Qq)}?*j&X} z4)Ahf^GDU~>4AL=F&eQWoKCL^Tj?N&)I5kVv&Q_^j;^1Kd|c?FmJ`Bo9M99hv> zzZr_mCTjQAu_3gI1eRt{(YX1BrZ>YSCXh)(6yoK*cddqjGgcIVS-P1&pMooD$ z>f}tF*TI2dBv*f?kNfl55c$6~1{@7A=HR*aYdKmib`1E#3cQrI>RWVZWRaaOW=hplkk|WI|@A@t8F8exjH$qw@;}0adc(|l% z!2AVixO;O*$y`11@%@ANSa=H*NrHQ-*zqB}w-S$01b}bQeuBxnmIYBHq zb1zi|p14ODYBuUHk0q%nX8!U(@5VpR+*Rpl01ULg5jCkYta?7F(3RYf@1HQiHJHLB zSH(PNeIFIN{8^W+{~v}mDugKSdCvs~7e{`?PG`8w`0aY`Kf#E1XX;vNg8-I|&D~N> zh_2sfC}33|(s_3@DWdp(l>F&MTL+PCT8X_3tLLIN_;>^BEf0YA%`s(w&L0aD7UjY@ zV~fXI(vS|(zVR40^)mv+-Z-}dez*}HC1Mk1l43_VrbifW6ot zYri49JE;EAwt5;xa1P$8?-aSf%|a`5R?A-#j5UZOUNd)ETx?v&$~Uc__e+v2q8s)d zOkR9^b)7i@i;xo$jArdxW8!{-R$kAOm+Vsg^=NfS*(OvAaea`O?hv{B2rAtY8(Hn8yeZd`^-^1B? zn>SRCq*oBZ+!MY@j6p!StM)O5nJT~99gh#43sJ!KQ$Mb}r0!L~){1HalJ~((!wt8)#@fnfT48Ucbtk*&eNvOxpK)6(y6VLEIpA?|hx4MwtB#mw zRw0kH4#QV`5bimBxfu(WU8u$7jbts{UAx>heo+GnF<;wf?eDB{Ffi)*(lFC13vY+F zVWzqig}KQMARu;IIcrz|I{WC$>n7&=z##8-W+}p^5OY%9ZyC1_d_=E={&ns(*~7$D z8}MxDS}i3N^Y(eTTpX4wmqdsi-q$2Bru%G$@$8suQ&GxzCtWZJe{<_F*Qk;CXmyVAzB7edl# zOD{4HH(n>Kuh6=QQ+(KP zhn9z&Pwfhm0l+yIV6Um_jgNg;eaD|W3#2~Ph1ycJss=6i&XPyTtBuKbum0+AL4&*% zJ8FG_fT~EZwkcoBXs%5Fb>r$}8iIdEs}s{!G<4l0!A0oFw85wH=0?{0jB<8CxNg)| z2BzP`G5SF+t^WH7lvh^KJ+0vzj`qjzH`B^W3t@Rvd#Emm0YQg7Sq(dSP-;N@Yph%7 z(epgNZZ5R-D17t9Q&c6>m)#Q2>j{f&CiP4|KZ!bM^sjf@_c>0Ab3Yg`y*6 zy>D8L3Yl#Vr&W*t^CTVp4H^KjYPY`;-UwLq`vgYMBZgmhm32G9BpB*V5vXIU^7HzADG@jW)!?QuFPWfE zf;ayzNB7fTH;$&Jq(x z0=2*A3OK`4ziV_?T_#%yXafS4K8S}|FJ3xDnb`uB)b?x*6kUw3RvXK&Yy(sl=lQ+3E}JY zVJFaTy}YHdGFquc-ji-Iq*;BgVzfE?@AJ~D!xNI9OpsFL=mLHS_kNG&Ei*5iFz2oT zc;L)TOFR_B`c1Ya2;SnU4F1)hA`|>nx^2B%UBIW(y7(|#8*<>Wy0K@gZPQ4)#+W>R-^QZ1Smo#nQ9DqtT^r+CO{?K2yw=GwL%a`w-||3n*1l} zp8ZbESvqSb%G($gjTG2%+$2_eqSKBAQTUOwb4kp|K${imQ%m$v`hALIRcq$*$5?-Qyc652rv2IFG_CFoQ?^+ zSa{^@d%N|YZaT_$g^F@%FA~544N0RYLE{rq-P)i6w)!s4Ds5A7u5J~WDB+K)fo0jb zZMfa|t2F7J1?g|p0kK%d7HnVNSSDxb=ATWegX!A`aBodQ)L@H~esr3WPOrIoXC^h2 zg@8N(R|Q2h={1zK!%&JKSWLrZ#OUmQ5H#}zL2E}_Y&q(iKjp?wrcd9McsJkYAK}bx z+tlGDC4rWM$Sz($i7(M-E=P&-B@-`;RxPbWd=g>EniDm z4L6>GBEM792MS=TX+GHQt7b}q@Wit9v4PdtUDHax4J_k@D5QS0J|it*G%vfGOAw!n zgFR8hOYksJ69e*v|M$jyz{9Ya0$*y9ZP6}hu2TAS@xume8;>NZ-|}RmH=!0#)h5U! z$eYnW@F#$ujL@?(fK)+8O|sLWeRmAMkr_>VU|E8DBn_ zuww^qTuBl3Q{cfeFdmC%2OZe0CPkpWvA&uuL@+4JQj g|5u^>ZP`3yM?Fy?ajFk^CY^HPxZAO+qd^(}12=RQq+R?mClZO{wkXZrhkyY0GFOie=>#Au8jBB4|z4Wa4CH<$_Jw z=7Ls=qzH{AnG0nqCMXsODFSYYAj@~Cncs3<|L?p0*T8v%j!D2%gt6^mA!7eWER_@rSfaM2+pzz%W{rQSmD_MS#4FnYh z{C$O34a-h|e|Cc)COz>5oGGX{a$PbZzB7EEz$<+&@2ZJSp+Bk~W?5?_sv0!mNhD)a zK@Z+>;%sX@aR%Hdm)vS)P>dn;k}ex_z> zE#beDj3dRAk%s=H~b@40Yj z&AacuU=8}s6bn|~K(!8d;@BK8XP(sQ)l+sOWmbmjh+C7My($}=Ahw@Zq7eE$=e*km zb(mbpnf$xCbbQo59^xG=x@o9Wq)24S9x!2|c*2YXL(v8PC=+ttWoAW@S!A=fv92sAt{m#pL3y0k=3nRMpzF}}xjM{@pqXto9mEquN zx@SPF(Ctm#Q`y=jdG=7>WBasEGCm{28CjpH@xrS%sug@fMm2_CZzY@>7qLGkPF#+7 z7d9a@Ia$bJu|A496oH6M_9n?!j?%ntI2JG*%I~zyxA$VzRjF{zw}%9ra@|qobAm>- zDY=Y>)TZ8;xK-OoONF4311iF(_p2pSLiD8aWWockjMYy|y{ui5&w)*;Yu+=J2s&8h z&9Hfse#9KqH7K!JXz=PNoK_qV`orrryDMzcBBp>_9VYoGt|q;yG+W7$$7UTEdihuJ zIQ5zE;sFQPn@ZeX`6#N3P}X<5`8iHAB#ZPT$F4yJEbs&V8g_0Hsg4%y9_czD9m%y_ zD^>qQhfjZ>E^sqmLl#@X{Dn$dBR`raJdhmHXWg;b@%gq#m*saLox6w|~&1wCJz$LK;wwM@pgh<#V zM`g8M=RGLyEF_6=vZ?lnBZJs-Oo^urd%U%^fTU2JC=-C0<*9%EZjQ)+`oyumuZ`SE zf?jrwjL}k~Qky)ms3W-H9wiD(g06`lnJ+6#5&|RQ%f{-{Xqz~q!(*B?g9n9W35hLu zU;P?sTai5@rq_v1xu3u~JD}r|S2~}+O#Lgv>{{dK@g|P|*LaD#%I%Lo{H+#Hg}2=6 zC%UVIf9{(Ug8VQN1O&omk z_<0)E*>h3(E$<^4y8hFK9 z{Py?8{P%Cj_4QV$=Id=xv{4ipO61Kh$;kNlF|ey4zCEauBBuzO_I0JM5ff6^7k(13 zNI3=otUA!<5LZ4jQn73^iM5@S*SXOoy27gK5r%7zCx`EWJQ|V`*KhTPARqo5b7=lO zcJC^J<>r!%V{v9bBh5OH?Fth+s4p|fz*c7bIt~mXIi?oQyoy$4c-5YG5tWQz7)^3F z&f-cF{LbB~cM$d1FExz_&igp8K{g%LSYRx#+px$UYRgA`L%(=V0{xM-vly=6tp~@`+Bb7LA(y3`~C~LC2wONEPBrpL}Gb+>QvZdQ>LE=@mHE_8PUr~ zQ?_Gk0K9nqJzwH7omQ)HPgq)?s(HR8k$z8Re;gl|gt7zE-(MZI*xthxmOY{BLOayL zggq7!PkAnR7F>6Z7c9E2iBR5l0CeX7Imri_b1T)#@yJr0W;$W>F1p>#|4@F&su_6CT?i(q_RL&pNkd(RgEuyso%xp$~Gsh*t^r z`&<%WskcFQEi!85WQv4{UD{lA41^D zb08g}Ah+YYhnJsgRsj?Cx$R(DN#e$A(+6mkqco>iS6!C}mbVr>kmgYCY^GjVLs|7% zb|&43QT`;mv)v0x%6B=4Xt+d@rqLLXE5JObOUo#wf$~#G`uGRD|8um;biCU zh0f3Vwi4r4KRIDdSD;)+O3$?zKZ!W|VH;n}MK!ZxlPTzOHm?#Z@gK^)Z9(Q-Yi_UZ zs{>XqdmDXY--m)_(4SPsa9xe4^;qR;yD*T!q^ zK9dgR+SbCm=1;IhD}hr_3&Wpl8qRckSkLv03UbbY*Bmhj$KmzAF6&(j1BmrB;V+wv)}dpEJrg?C0HYwL zRc)w2cnp*7Z){o3rfhClSJ+oo=F%B7{d#4l`>e;f5)59OBkvG-TC?33#Nvm5 z|Dj>=!ezHPA#JisusfhO(35R?m)~0NNE^!sw%U8CHzTPf;YXcei6+l1UL^0+z=MvWDPfyo(Xqi^HeCLE?_a-kCXgSH z79ApezeiYRILM2)beSWJT(f)LujR56DKb^8r^90K^diYusBp=X0@au;?d-{i{rfZ>9=~`DZ~BVu8g9Xm_AnLZqiB6}j`7{HgK*3`40WmwcDb z!d_?1J5b^2%C<}FYkgXq*Qc^SN5`5Fu^h!cxXLvxHb1$A$YWImg45;OqTE z4HWoW(+i0ope-B)nbT=8F2)wXx$;S6gstbyFY;xlt}Zc(G>7hB@eZh=Q2rjeHjemI zthc_f*9$gsHnw6mxLBY+_rQUs$6u)5wC?WLPb`W1!}e86KNNJ{+rCGX#7V4Vq9 z610E8&ToH7+y2nsMs&CRuU1TnIYi1kCLdYrVfhBvE%XBSF!%OuhE;^lojbSW*m$DH zM9q=j{bu3rrSIin`I!DS$ABO3GmhcS2E9%5IvXmUUw(L4Zv&C@5iC-SSa;Q3Q+uBI zaei9osV$Aowbk4idAk7AZpOa9$>-ESv5~Tcs)pviww12{fmYjn9T91$NgH=*F}g&q#7}QEuT(Y ztRJhh-XA{@Q$!U7UPkPXm)xQIqS{}LnD%MvzAC{sTno4diW<0JLNx2&XV~A1RSwcL zKc1nGtGwq7CCfF4pM5+F#Uo4px`mB1RCZ8Jd9?yS5Ib`{0Nz26jtMBqvDp{JW#h`M z1QVX(q%;^h1_|JCfe`8u@>)-z65&dKbsG3{$532&)ic+c`|JuQb>c3k=19~Gkb=cEm z_FRXP`Y=%xe5US#yrPxGro~$ZPXj`K4|KgYP5@_~uF%ySnKM`Bw588fdoF34-&K)ay2Xa7N-Mz@&|HKSji9-S-hl#UWZ5A?@$4~rv?pf5Bmm@bp& z#VmeNj{kXIHno={@2h#|v?`|khKN`0K-w^@>WnB6-yV*w8M}SBv`XV`q{EW=cR^$` zmyxP@lfix-&nrur8aXy4W9Y_?fz9+CyAWDp16v6j(R#vI!~~m_Hq}P=a8mD?pWoXu z3ZP#yxnx1jg)@JnxP#?9QYCV8USULzqry+gqqa;zukwP-agnO-#cnzk$DrjsGEOzHH{okbdV|(>-F^PvR6gZbI$L`a7qQB#@(zrWM^AZNJ`$;b0rWOpuna3FtRAO-s(DaFYzU45MX z+>w<0Mvl1K!p9l;oF*s7GdPQ|FB3v~KH=_SlJWtLO93=&oG|DK3ei++jEBU;jig87 z`4f#bE3sQ~D8xhdk#yzrfELc}TDa1_Le`3Jk|Rny?gysE*s_;$7PH>q&XiR@WW{x0 z8B{VB4iW9`AYy`}!+hZVVSYfexUENyVSpR|`ZTiQEH&is<7oea0h68oMly z^j%}S#LH`D_PNoeu3w@aQ%5-_=_y$>+&-sa?)avH68#`ogSgX2bVQ50tobFSI(37G z(}ztJcCZS*ee{-B2jiiRSR$cZe=ty9f^l4hXWw`H?@J*$h$ZB1Ny$Nw* zjrL~rmdqwtYWV~BPS0S|5q2kl?EdRDXan0}StB{>6}wkxX1L*o9n?OllgA@%&Z#1} zPK|7Np!dwcg4IS-q9MK2yLnz;&zrg}`Xl|{fw`Ujs^4@M^uP27zkfVpZAegqaNSq6 zGHP(M39;wq?0FOVf%^mYtv|{}(oKl0V^1Gj&pC{~ust`X1=oExC}XnoL^^I5*B#^t zZel)Kyc-%eoQgB)1yQkS+V;1M&;SFVNOmjMU4>^P>HBeY&Vjo5AIaw>@=A|W?F9GI zJP@5h%zRD`^w4mcmwFW%Y1Vsh^d<1kmJhJE{*dvMevZsQ%hzo61CeUlgxKLi2l6P0 z4dmcNtNb`jfu5N`?^%#gs25((08iJyoIwx)UjN?&&g?6J(`y&Bk4vwh4$tMLSnB(0 zaR;JlhWshn99)HY|GfmxH=#tmcJcA!F=SBQv7Sxo%82R5g}>B#Ww}4=)F?!rN$?_U z8=l{KY7=1}Xqng$wh~q`_a(=EBbj1jI1(DoK$Uyvp71dldv8kgGYHpOW~jQUZlV(a z>7Ybz7~s{hkzQ7LD9o)1i5(cM$7xI^(6NawQn?*8)bA;+CwrI$`iCefd!Y^uHu>xR zw3x)1L6PU=^vW_EJiJ};7u<*9$qYM(l#dqFZzg*atW!0r>vMJHoECiR5-^hs|$O!H9#Nhh}k$zCeI4g8|3kJ25sI|2b%M2J zBCTAR%-@OOX)Rfs4!JKlRnKl{UxB@61v&6V*E!cZ`GfX?MHh>dTq@>iE%d|9tlA;h z3M~+uzh5^`va{FO%a^gfUYa|g+-?W^G$jy7-LT{-%Mi6-D%TlldMWe3(TF$CBZl?* z5n9y6trg-BrNvPsb_@v05^DiHdnjFIvwQh#&qr*uKW5na%goa2mK~yT&LWDgCB;E} zc7h!d(6cD3#4$>&-w0d4Mra+X&&>=ef;Y{7D0G+3AJGC0YIC-!{Vr#&T%2nEI_uuH zXTEf~M`|HKny8_*1h=^-Xb~jBU2Bf{r=xenu3CS!WU6rYpMPdL4%GvP;r=Rs`^jptew{u4A*=kiHSG5m=A2uGN>rBxS^U!P zmPv%@=DmeKw9$a=5r7`tJU!ebCcEC?V%`P04<@L*&WFmsZDLdew}rsi9umPb zh+7*XGgz4bSh?}3y8$1@3eSC{v9a%(Zh_Ejp?-K{ zPr#XkP)#^Y?&E{FG+2IW-tF`cISJ63*>1U|x)bU_fsx?01G|~p##cH$7mT?>k8!=u zo)O;V;%IyUoS9R;>Jj5T&za+V$f#la#?TBrbk+MZqJ^jZ#9qS_znB8(;0zmf1}5XfYDKk1M0bg%i%YC)FK4HEhq>xS#NV zhAc;}1ok*3n8X9WL!`^bJk*G_`Jz_&(Wt!SnGET{tA+#isd4j=4l{*~9WvpFdOX@J zk#m%5JzlX$HUauHsjmy*fF7k8lBUsO6QZOdjF+3dq92(0r8dSuPgF`i9t$mo?4X*o zFoPoM>LPtoZlsXs0jo&bvsLY900PF+;}4kirJEbdS2bQ2lxa^Vz!FwtbQD9CzxVh? z8?Tfl+G!ah1>k1lF?Kd|@o*}B_OOEq5xNUzR}xOoN`gxhqJDslJ}wTB{$7`w&+62_Z%&+zdk zVrHny*q+Gxl%>s}hej2jLExXQNG|cw1dW6F3>e=7p6nS9%lC)&q^oIgA9)S4NdV)O zJdrS*;QAr&P<)wo}o*DRQ~}61-$j2 z-Eyga8i1v8WGlRMe(8-~*nEIRcC$ZWTju}JeFZnX;^L&)mRwuK)q4BEc_!)YE?%7R zmo@D{WWl3^q47<*M0yK1Bt)-g1N;ZXwTAa}1(cOA5+Z|cdI`K2j|B7xdJSCDpv8xA z3h(?`H?irq>CzdyhO5GRid z5*^J|x+jFkAK*;wD}0Wi3<LqM_3s#c2R$bLs!;8PtwaNKN z2*pwOkUJIy+_FE`45|o(-Cqwu0He0PXn{X`hk7=kAJAm)r8Y_EiGH0W3<4=}i3Ok5u5h>nZq z&T7QcIh%vos59~s@hGMvxpvu&m5jB4sd8KLQ~mn=TY5(L0_i#KtMr`cW&-th>g7Em zAwd7Fo?rL#bD;mF_?-JKP1afAs-2BH69V|78aY%L;a+NEeIcXs)JA;N9bx~iVs<@3in5j1fAD6s! z-UXelUdNwUN0hh;Tm3FI;^GaTi};x&^A_rr@d=gW)$J^_Mbo9FNz(+Yw@8)pz`tn` z_FsE^>Xip4&RO1556D#_I&2GUUTg(@ZX)YTs?I~J9gjj-*~-j}i<1^-1{jK?4Eom@ zOsjY?b#^PVSb1XCWbK(U2lOn}_3@wmeh*z=G)nKQ41@UJO@xp`ZoqFM8L6IJ(NVcl zfW5{b=!8*szfe!mWli)@XRyzP7OsE}XzUJ0wJhDID)fhj4Tk+j=-i;dvO7-;hd-;Y z#5j;GG_mO)qf5uFc#r<0Uw;(>1vsQ;TERo>8B<>Qz^3O^@eGLQPj81aW16SShq;mG zWVqzis-1*t%>IH6Dv7K@R;_z5*@ydS7Mox;!A|jdB$C~a%luCiISM=F8kRnG;CCDE z)J(bY8-iBtx^ywR5@oA!hNXZAKn!P6G5kitxD)ZqL18I}d(`(ds^Do@L{tgq{m|ke zEGxn=3C-E!BBF^4P^+<@X)vhYGZ6r_ybYb@wfH}7^^S>#7$2%4S> zN+1q7uUqS2bQ8Z^k^Vo)on+s9EjS z!nUPsmG9L%nX6$jVF4w`iA%WBRWEVlieDdjM4EKxA~2LPgl`y1ive;2=H2Q&&>k`k z8A}YtN`V-hG4R)ZXA1QKmQEPfmjnnRIENs_Q`eF-F&* za=iTfEjc1q8}ybhrc!6A5?)cDy8Iy9n})BS2UxY-XdklpA)5p}J6nvAQ@lB~(3@Tz z&w+9$Dg@Vtz~I~Dye_x+OSDmCK5Y$J+zQTR%m;}X#M`xR-w5JpTDUVYlUP^3A*>m{ zomZe88}Q$7kvxrvhh4L+e>gqSRXLGQ>r>^6W26Lpu!fgU7fV2nEH1>(_tW9j46wQD zcA7zyo+#fJqmgq1Y)tx<&(garjX5Fjm+vY_Zu4$w4JNUjt5JB<0V&?(6PAn>ACCQI zSgf>bTm^h15;!J$ov+=F-61K??_3za09mN-2NPm2B~@*^TU&m=$^G=g3f_FgH5qBrjM?E$hd{hfHya!cT#iAB@mxzY*3)~S6HiRr^5|y9# zG>%TMe#l{*3S`Wi2Rhed;1RkIEqA>HMj*QchepmGN8x!fl!RS%EA&TnU8EUEZR}(s ztGT}YHe8vgkU^NEhss2@9h7MPpVIf(`TsGu@^@v_nXzg421bPUH zWG3$n6F-+S|IK0cL8TY=;yx$@r#9_1uta1-iDi9%E#t5HhL2Ajpq{Ny;1EX)M5kH< zoL*m$HGyxB8!;bS<|o6$>0Y`TreBc;z-nj2%#zmZaZ|3m5?}RUw)jc)&9AirqY(zj zLnz;?azDh2j$npZ7W+6gOA}lVjb9%Rcw!Mlf54y1Y2xa{L~T2pGX+xdBcRe}bezV& zO5uuQD6KScO>wS=3z(Z=5Iuhu=??mM0)^w8Vl*c00A>X=`9k-7O`Cip`}?JV_Rxy0 zsXdq0t}tw;JuV`Q?b=>gV(oq_5=r(u6kYHSbp5c>ap3)ffCfNLVsqco`sIje)aX@l zN)yPiGn4iCfEFvM+dMBn=(D!7GRUC+go}^YX2maC3th<6^*Lv^teCZJ6QK}w>MVVE zxZB)-ceDCK(o)4(f2(VtBq6y}r&exAaJQ%{L=harVhfy;qQLr53cW$5FGXPn{rr~q zol0Z|< z5g9%o90M`qWO2w#(H9$*V3fFPW5-y2Qu!}BpzBZ3tPct^tB*IiiIs1+TGKCW%O6oj3C8&GJUe0qlNu(v_4@`)~>)H#T&Dck&9o8p{C`Ss?_0G^@7X)u(Spy90X& z33T)Ki=_nwBcFx$9z@C=@Om;9B0$i4j)YI^#1#`#!o~hdrx;P~b?9RF22#N+m6$!h zG(TUhQ>(tf5Q45H~|8TW}5i-Nm^V!s#(mI08W7E zAzb(F)b7Kj!umhADS$S#>FnlCi>VO2dz!qdhAyQ*zY33H#P9}?O1p~u@n%Wx`K@k^ z-0X8K++rV74{Y{_GZ?&=OVsIPxNtr^7p)el6d={#vY0H0!khLvUuWl#uE%lyk=0#5 z5K(sqOR`wAPGQXa?RdtEoE81WEi*_1hfO`iNaNQDV_5!}YxNU$Z>5vqs052$7?a^q z$i_$x9e&=1Ao;@HJk#Twu$0~0 z1dB0Ii{haj{h@`MNbaBKKfHk+qhXW?_TnE_X2tA$L@m6|7O!T#u~MmH>Hb|G9&^OC zT{Q8J5-eM)=xGZD?1Pu*z6(09nVuo6mLNZyfRsb8!TSXBk?I{jM{;YXL;KpvhGLaO zDZl(hsOs7pmwDN?s)cOG#kGwcJYPoJ2G^`ZUZcU8?Qw0L%Zu6)q?FFu@_C})BLW*iPP=p_g<)9oV6h_|+h_2$Z(j0PN zfog}x9@g2_{0A)Ku80V@WH2WE3l$^|H6G%(0-$@tUpED3D%2=HW2`Bv*@1+j@2> z-i=NrGQU5N)nB`e5gIILFPO$x;EkCMX=Vlp{ zXX*2Jdlp@*&Q4fxEn=N7?;V9SFn)tppQ3EfcOYFFZya4>Azn4+D&QZF>J8XW@E*Om zEi6(zEv~xmI>rOe&@pZg{Z+HKKGj;Ao;$L)x;w!@0n+N`1xdn2c@LJp`G`AZC*Xt+ zOoN(Di2&_vdi=AkNHca2muZ@p8^m~6FMS;gAq=`z@6w+K+@ivn1AJQ2Zo1u%T5t$- zMYQfGp;qDrNB;~HI>UZN^>SW|SAv{kTbF`^S}kUC6dkM$z%}VfeQ@TISphbN5BadS zbH>>9hD8fAMId7e>TMrzryNj{!l%^uu$KCP?L9=ZZ&9z&_^ zZj!lLq?rL0&7zKzMiX6@*f`wwI+KkY=G=~aL4h{1KOo#OKU*F8$u`drRI54_PmpTg zom`Dy-CbBBioi;+U)3<@BZ^I9Nn@2`1)YE6UbraU1WJq?Dq1i7lhr%w_BvBVv!!_` z>Q9KZyvnW{Y7ZyUt=jFWP0PlfQ{El*{Wc|+U5Bdc8i1hQ{Rc$+EjHYeynL-AyWKZB zkIZNP>1f1{^C7eUAiZMjcXl2PSs$?Up!aecalY6+cy3ZJXQc>DH!M%euQrPP2NZd=?A@=F0(z+uQ61c0_m~AaM8n^q{gH(6+p< zRT0hq+l&z)Ga&N;Qiy@q<)E6%0hF`<7%DC=&G2_ls_i3%qA##w`etA!RPvs_OMt2r zE&vb80=0MDGjt`bg3-5LyHa!gh@(A0+wrv81|T;H6AwldHor{Jb-4B|`o`b@>_DnSY}cs1nhb5~Fx|=X(7#K$Wt-Aiv*p)FubbVM*i} zP0oYvKYh+Yt1?2ri_v!C4pSaGs&i(2fp-DbQkoJM$Ow@&EjJikmp>Xc;4A2%ji1^-T)*jg|u%sOB(;|%~a#MxtL8Zeoea&~uRK+wSM_<*=Y8#Y` ztLW!zszCz48C3lfUG$YH?|r82mS!8izXfNm+tO=Por5!}aURSwGmnd|pUa#J!!Yh8D_X?^mGC|U{O z>~Kdi8Y_R}M+`L@eIFAur?vK@Lj;z4wO_r*lPtK0e&IT%Rvwmt!8(7F)Er}iRn581 z5kJ@>%8M()#_R1P@IleD5f0xPpqWZYF&Lw z#U~NGfh_j?!`@zASth^5vgp>-XFz*9IgQ5@?m~1(MqRV6*SpqSvGcJcVHdAMT3#N% z{@J%fd?2f;+>^3SRgky*r6{&wG*k^>c71@@lJl5Sm9kil6V_kGqEBY&Nx4TZNK_r= z4kW+$g0+Jhv4_xfc?at#=U}ErXb!#4g`E8CHrD67LN8tc;UqL|)`XcMc6a{`!}@H) zm(Rn}yXHmQ4U0Fs*8c>ao;xvTz_Pf^v}HMS4J_qW$!k2;z}5!T?zIF9f5eJLu^el$ zvtS5SHeDrL>6Z=?Lz(hjzwe+Azx+}lSf)%FU`$_?{rRmJ35=4;NaO|1E@%(sbmW-T=g8slWjAJu{6Xp& z_gLqYBcEs+HFcyI*^H5p*1MFa&bGCmGq&vZ)>Mil@rq!R zC`QR>ZlOReh3C$Vt!EY|ya++l`cTbs zCNkL~ay^SUy&x?de%3y_1XTYny6gCc7G4)Ds~W)NM-IAPHg*$9qjJr#JIN}|%$-TY z-|tq=NXuq-hWM5^Y8^#v^c}5Kz>6amObb<;-b5@MSZp+wUk2Q2k-R1gC#A`jf|@x{ z6(ZdQC(8rAjHY~*H}wpOcd6Sx(E4D%Qhy?hwA%s3dCgITW#1q7_!_~V))`i1{c`8e T^W7wH1LU`J-;VNa;pzVe=J?sh literal 0 HcmV?d00001 diff --git a/Src/Common/Controls/DetailControls/DetailControlsTests/DataTreeRenderTests.DataTreeRender_expanded.verified.png b/Src/Common/Controls/DetailControls/DetailControlsTests/DataTreeRenderTests.DataTreeRender_expanded.verified.png new file mode 100644 index 0000000000000000000000000000000000000000..b64df46cc1aad3e361ca6ef839bf3d9cded97471 GIT binary patch literal 18457 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 literal 0 HcmV?d00001 diff --git a/Src/Common/Controls/DetailControls/DetailControlsTests/DataTreeRenderTests.DataTreeRender_extreme.verified.png b/Src/Common/Controls/DetailControls/DetailControlsTests/DataTreeRenderTests.DataTreeRender_extreme.verified.png new file mode 100644 index 0000000000000000000000000000000000000000..3e59d1b97319fd791617a9e8ccd33dcac8e11d3e GIT binary patch literal 14060 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 Zb=YR|^xS|2niM|d_Or*XqMbpP{udzjpw$2X literal 0 HcmV?d00001 diff --git a/Src/Common/Controls/DetailControls/DetailControlsTests/DataTreeRenderTests.DataTreeRender_multiws.verified.png b/Src/Common/Controls/DetailControls/DetailControlsTests/DataTreeRenderTests.DataTreeRender_multiws.verified.png new file mode 100644 index 0000000000000000000000000000000000000000..a0c9cb6d3d73ad0e9d8aa35ed98098e790788b90 GIT binary patch literal 13767 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 literal 0 HcmV?d00001 diff --git a/Src/Common/Controls/DetailControls/DetailControlsTests/DataTreeRenderTests.DataTreeRender_simple.verified.png b/Src/Common/Controls/DetailControls/DetailControlsTests/DataTreeRenderTests.DataTreeRender_simple.verified.png new file mode 100644 index 0000000000000000000000000000000000000000..e3df08f2d309510310c56b6964f729924e17de2b GIT binary patch literal 14022 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 + /// Snapshot tests using Verify for pixel-perfect validation of the full DataTree edit view, + /// including WinForms chrome (grey labels, icons, section headers, separators) and + /// Views engine text content (rendered via VwDrawRootBuffered overlay). + ///

+ /// + /// These tests exercise the production DataTree/Slice rendering pipeline that FLEx uses + /// to display the lexical entry edit view. Unlike the RootSiteTests lex entry scenarios + /// (which only test Views engine text rendering), these capture the full UI composition. + /// Baselines are committed PNG files stored next to this test source. + /// + [TestFixture] + public class DataTreeRenderTests : MemoryOnlyBackendProviderRestoredForEachTestTestBase + { + private const string DeterministicRenderFontFamily = "Segoe UI"; + private ILexEntry m_entry; + + [SetUp] + public void UseDeterministicWritingSystemFonts() + { + NormalizeDeterministicWritingSystemFonts( + Cache.ServiceLocator.WritingSystems.DefaultVernacularWritingSystem, + Cache.ServiceLocator.WritingSystems.DefaultAnalysisWritingSystem); + } + + private void NormalizeDeterministicWritingSystemFonts(params CoreWritingSystemDefinition[] additionalWritingSystems) + { + var writingSystems = new[] + { + Cache.ServiceLocator.WritingSystems.DefaultVernacularWritingSystem, + Cache.ServiceLocator.WritingSystems.DefaultAnalysisWritingSystem + } + .Concat(Cache.ServiceLocator.WritingSystems.CurrentVernacularWritingSystems) + .Concat(Cache.ServiceLocator.WritingSystems.CurrentAnalysisWritingSystems) + .Concat(additionalWritingSystems) + .Where(ws => ws != null) + .GroupBy(ws => ws.Handle) + .Select(group => group.First()); + + foreach (var writingSystem in writingSystems) + { + writingSystem.DefaultFont = new FontDefinition(DeterministicRenderFontFamily); + writingSystem.IsGraphiteEnabled = false; + } + } + + private static ITsString MakeRenderString(string value, int writingSystemHandle) + { + var propsBuilder = TsStringUtils.MakePropsBldr(); + propsBuilder.SetIntPropValues((int)FwTextPropType.ktptWs, + (int)FwTextPropVar.ktpvDefault, writingSystemHandle); + propsBuilder.SetStrPropValue((int)FwTextPropType.ktptFontFamily, + DeterministicRenderFontFamily); + + var stringBuilder = TsStringUtils.MakeStrBldr(); + stringBuilder.Replace(0, 0, value, propsBuilder.GetTextProps()); + return stringBuilder.GetString(); + } + + #region Scenario Data Creation + + /// + /// Creates a simple lex entry with 3 senses for the "simple" scenario. + /// All fields filled with predictable text: "FieldName - simple". + /// + private void CreateSimpleEntry() + { + const string testName = "simple"; + m_entry = Cache.ServiceLocator.GetInstance().Create(); + + var morphFactory = Cache.ServiceLocator.GetInstance(); + var morph = morphFactory.Create(); + m_entry.LexemeFormOA = morph; + morph.Form.VernacularDefaultWritingSystem = MakeRenderString( + $"LexemeForm - {testName}", Cache.DefaultVernWs); + + m_entry.CitationForm.VernacularDefaultWritingSystem = MakeRenderString( + $"CitationForm - {testName}", Cache.DefaultVernWs); + + // Add 3 senses with predictable text + var senseFactory = Cache.ServiceLocator.GetInstance(); + for (int i = 1; i <= 3; i++) + { + var sense = senseFactory.Create(); + m_entry.SensesOS.Add(sense); + FillSenseFields(sense, $"{i}", testName); + } + + EnrichEntry(m_entry, testName); + } + + /// + /// Creates a lex entry with triple-nested senses (depth 3, breadth 2). + /// 2 senses × 2 subsenses × 2 sub-sub-senses = 14 total senses (2+4+8). + /// This is the "slow" scenario — realistic deeply nested entry. + /// + private void CreateDeepEntry() + { + const string testName = "deep"; + m_entry = Cache.ServiceLocator.GetInstance().Create(); + + var morphFactory = Cache.ServiceLocator.GetInstance(); + var morph = morphFactory.Create(); + m_entry.LexemeFormOA = morph; + morph.Form.VernacularDefaultWritingSystem = MakeRenderString( + $"LexemeForm - {testName}", Cache.DefaultVernWs); + + m_entry.CitationForm.VernacularDefaultWritingSystem = MakeRenderString( + $"CitationForm - {testName}", Cache.DefaultVernWs); + + var senseFactory = Cache.ServiceLocator.GetInstance(); + CreateNestedSenses(m_entry, senseFactory, 3, 2, "", 1, testName); + + EnrichEntry(m_entry, testName); + } + + /// + /// Creates a lex entry with sub-sub-sub senses (depth 4, breadth 2). + /// 2 + 4 + 8 + 16 = 30 senses total. + /// Used to validate deeper recursive rendering with hidden fields enabled. + /// + private void CreateSubSubSubEntry() + { + const string testName = "subsubsub-hidden"; + m_entry = Cache.ServiceLocator.GetInstance().Create(); + + var morphFactory = Cache.ServiceLocator.GetInstance(); + var morph = morphFactory.Create(); + m_entry.LexemeFormOA = morph; + morph.Form.VernacularDefaultWritingSystem = MakeRenderString( + $"LexemeForm - {testName}", Cache.DefaultVernWs); + + m_entry.CitationForm.VernacularDefaultWritingSystem = MakeRenderString( + $"CitationForm - {testName}", Cache.DefaultVernWs); + + var senseFactory = Cache.ServiceLocator.GetInstance(); + CreateNestedSenses(m_entry, senseFactory, 4, 2, "", 1, testName); + + EnrichEntry(m_entry, testName); + } + + /// + /// Creates a lex entry with extreme nesting (6 levels deep, 2 wide = 126 senses). + /// Stress test for the DataTree slice rendering pipeline. + /// + private void CreateExtremeEntry() + { + const string testName = "extreme"; + m_entry = Cache.ServiceLocator.GetInstance().Create(); + + var morphFactory = Cache.ServiceLocator.GetInstance(); + var morph = morphFactory.Create(); + m_entry.LexemeFormOA = morph; + morph.Form.VernacularDefaultWritingSystem = MakeRenderString( + $"LexemeForm - {testName}", Cache.DefaultVernWs); + + m_entry.CitationForm.VernacularDefaultWritingSystem = MakeRenderString( + $"CitationForm - {testName}", Cache.DefaultVernWs); + + var senseFactory = Cache.ServiceLocator.GetInstance(); + CreateNestedSenses(m_entry, senseFactory, 6, 2, "", 1, testName); + + EnrichEntry(m_entry, testName); + } + + private void CreateNestedSenses(ICmObject owner, ILexSenseFactory senseFactory, + int remainingDepth, int breadth, string prefix, int startNumber, string testName) + { + if (remainingDepth <= 0) return; + + for (int i = 0; i < breadth; i++) + { + int num = startNumber + i; + string senseNum = string.IsNullOrEmpty(prefix) ? num.ToString() : $"{prefix}.{num}"; + + var sense = senseFactory.Create(); + + if (owner is ILexEntry entry) + entry.SensesOS.Add(sense); + else if (owner is ILexSense parentSense) + parentSense.SensesOS.Add(sense); + + FillSenseFields(sense, senseNum, testName); + + // Recurse into subsenses + CreateNestedSenses(sense, senseFactory, remainingDepth - 1, breadth, senseNum, 1, testName); + } + } + + /// + /// Fills sense-level fields with predictable text: "FieldName - testName sense N". + /// + private void FillSenseFields(ILexSense sense, string senseNum, string testName) + { + sense.Gloss.AnalysisDefaultWritingSystem = MakeRenderString( + $"Gloss - {testName} sense {senseNum}", Cache.DefaultAnalWs); + sense.Definition.AnalysisDefaultWritingSystem = MakeRenderString( + $"Definition - {testName} sense {senseNum}", Cache.DefaultAnalWs); + sense.ScientificName = MakeRenderString( + $"ScientificName - {testName} sense {senseNum}", Cache.DefaultAnalWs); + } + + /// + /// Enriches a lex entry with additional fields that trigger ifdata layout parts. + /// All fields use predictable text: "FieldName - testName". + /// Populates: Pronunciation, LiteralMeaning, Bibliography, Restrictions, + /// SummaryDefinition, and Comment. + /// Etymology is intentionally excluded because its SummarySlice creates native + /// COM views that crash in test context. + /// + private void EnrichEntry(ILexEntry entry, string testName) + { + // Pronunciation (ifdata, owned sequence object) + var pronFactory = Cache.ServiceLocator.GetInstance(); + var pronunciation = pronFactory.Create(); + entry.PronunciationsOS.Add(pronunciation); + pronunciation.Form.VernacularDefaultWritingSystem = MakeRenderString( + $"Pronunciation - {testName}", Cache.DefaultVernWs); + + // MultiString ifdata fields + entry.LiteralMeaning.AnalysisDefaultWritingSystem = MakeRenderString( + $"LiteralMeaning - {testName}", Cache.DefaultAnalWs); + entry.Bibliography.AnalysisDefaultWritingSystem = MakeRenderString( + $"Bibliography - {testName}", Cache.DefaultAnalWs); + entry.Restrictions.AnalysisDefaultWritingSystem = MakeRenderString( + $"Restrictions - {testName}", Cache.DefaultAnalWs); + entry.SummaryDefinition.AnalysisDefaultWritingSystem = MakeRenderString( + $"SummaryDefinition - {testName}", Cache.DefaultAnalWs); + entry.Comment.AnalysisDefaultWritingSystem = MakeRenderString( + $"Comment - {testName}", Cache.DefaultAnalWs); + } + + /// + /// Creates a minimal lex entry with a single sense and no optional fields. + /// Exercises the "collapsed" view — bare minimum rendering path. + /// + private void CreateCollapsedEntry() + { + const string testName = "collapsed"; + m_entry = Cache.ServiceLocator.GetInstance().Create(); + + var morphFactory = Cache.ServiceLocator.GetInstance(); + var morph = morphFactory.Create(); + m_entry.LexemeFormOA = morph; + morph.Form.VernacularDefaultWritingSystem = MakeRenderString( + $"LexemeForm - {testName}", Cache.DefaultVernWs); + + m_entry.CitationForm.VernacularDefaultWritingSystem = MakeRenderString( + $"CitationForm - {testName}", Cache.DefaultVernWs); + + // Single sense — minimal entry, no enrichment + var senseFactory = Cache.ServiceLocator.GetInstance(); + var sense = senseFactory.Create(); + m_entry.SensesOS.Add(sense); + FillSenseFields(sense, "1", testName); + } + + /// + /// Creates a fully enriched lex entry with all available optional fields populated. + /// 4 senses with all sense-level fields, plus full entry enrichment. + /// Exercises the "expanded" view — maximum slice count for fields we can safely render. + /// + private void CreateExpandedEntry() + { + const string testName = "expanded"; + m_entry = Cache.ServiceLocator.GetInstance().Create(); + + var morphFactory = Cache.ServiceLocator.GetInstance(); + var morph = morphFactory.Create(); + m_entry.LexemeFormOA = morph; + morph.Form.VernacularDefaultWritingSystem = MakeRenderString( + $"LexemeForm - {testName}", Cache.DefaultVernWs); + + m_entry.CitationForm.VernacularDefaultWritingSystem = MakeRenderString( + $"CitationForm - {testName}", Cache.DefaultVernWs); + + // Multiple senses with all fields + var senseFactory = Cache.ServiceLocator.GetInstance(); + for (int i = 1; i <= 4; i++) + { + var sense = senseFactory.Create(); + m_entry.SensesOS.Add(sense); + FillSenseFields(sense, $"{i}", testName); + } + + // Full enrichment + EnrichEntry(m_entry, testName); + + // Add a second pronunciation + var pronFactory = Cache.ServiceLocator.GetInstance(); + var pron2 = pronFactory.Create(); + m_entry.PronunciationsOS.Add(pron2); + pron2.Form.VernacularDefaultWritingSystem = MakeRenderString( + $"Pronunciation2 - {testName}", Cache.DefaultVernWs); + } + + /// + /// Creates a lex entry with values in multiple writing systems. + /// Exercises the MultiStringSlice rendering with WS indicators. + /// Fields filled with predictable text in both English and French. + /// + private void CreateMultiWsEntry() + { + const string testName = "multiws"; + m_entry = Cache.ServiceLocator.GetInstance().Create(); + + var morphFactory = Cache.ServiceLocator.GetInstance(); + var morph = morphFactory.Create(); + m_entry.LexemeFormOA = morph; + + morph.Form.VernacularDefaultWritingSystem = MakeRenderString( + $"LexemeForm - {testName}", Cache.DefaultVernWs); + + m_entry.CitationForm.VernacularDefaultWritingSystem = MakeRenderString( + $"CitationForm - {testName}", Cache.DefaultVernWs); + + int analWs = Cache.DefaultAnalWs; + + // Add a French writing system + int frWs = analWs; + try + { + var wsManager = Cache.ServiceLocator.WritingSystemManager; + CoreWritingSystemDefinition frWsDef; + wsManager.GetOrSet("fr", out frWsDef); + frWs = frWsDef.Handle; + Cache.LanguageProject.AddToCurrentAnalysisWritingSystems(frWsDef); + NormalizeDeterministicWritingSystemFonts(frWsDef); + } + catch + { + // If we can't create French WS, proceed with default analysis WS + } + + // Senses with multi-WS text + var senseFactory = Cache.ServiceLocator.GetInstance(); + for (int i = 1; i <= 2; i++) + { + var sense = senseFactory.Create(); + m_entry.SensesOS.Add(sense); + sense.Gloss.set_String(analWs, MakeRenderString( + $"Gloss - {testName} sense {i} (en)", analWs)); + if (frWs != analWs) + { + sense.Gloss.set_String(frWs, MakeRenderString( + $"Gloss - {testName} sens {i} (fr)", frWs)); + } + sense.Definition.set_String(analWs, MakeRenderString( + $"Definition - {testName} sense {i} (en)", analWs)); + if (frWs != analWs) + { + sense.Definition.set_String(frWs, MakeRenderString( + $"Definition - {testName} sens {i} (fr)", frWs)); + } + } + + // Multi-WS entry-level fields + m_entry.LiteralMeaning.set_String(analWs, MakeRenderString( + $"LiteralMeaning - {testName} (en)", analWs)); + if (frWs != analWs) + { + m_entry.LiteralMeaning.set_String(frWs, MakeRenderString( + $"LiteralMeaning - {testName} (fr)", frWs)); + } + + m_entry.SummaryDefinition.set_String(analWs, MakeRenderString( + $"SummaryDefinition - {testName} (en)", analWs)); + if (frWs != analWs) + { + m_entry.SummaryDefinition.set_String(frWs, MakeRenderString( + $"SummaryDefinition - {testName} (fr)", frWs)); + } + + // Pronunciation + var pronFactory = Cache.ServiceLocator.GetInstance(); + var pronunciation = pronFactory.Create(); + m_entry.PronunciationsOS.Add(pronunciation); + pronunciation.Form.VernacularDefaultWritingSystem = MakeRenderString( + $"Pronunciation - {testName}", Cache.DefaultVernWs); + } + + #endregion + + #region Verify Infrastructure + + /// + /// Returns the directory containing this source file (resolved at compile time). + /// RenderSnapshotVerifier stores approved .verified.png baselines alongside the test source file. + /// + private async Task VerifyDataTreeBitmap(Bitmap bitmap, string scenarioId) + { + string directory = RenderSnapshotVerifier.GetSourceFileDirectory(); + string name = $"DataTreeRenderTests.DataTreeRender_{scenarioId}"; + var verification = RenderSnapshotVerifier.Verify(bitmap, directory, name, scenarioId); + if (!verification.Passed) + Assert.Fail(verification.FailureMessage); + + await Task.CompletedTask; + } + + #endregion + + #region Snapshot Tests + + /// + /// Verifies a production-like DataTree rendering for a simple lex entry with 3 senses. + /// Captures grey labels, WS indicators, sense summaries, all WinForms chrome. + /// Uses DistFiles layouts plus test-time exclusions for unsupported/crashy parts. + /// + [Test] + public async Task DataTreeRender_Simple() + { + CreateSimpleEntry(); + + using (var harness = new DataTreeRenderHarness(Cache, m_entry, "Normal")) + { + harness.PopulateSlices(1024, 768, true); + DumpSliceDiagnostics(harness, "Simple"); + + Assert.That(harness.SliceCount, Is.GreaterThan(0), + "DataTree should have populated some slices"); + + var bitmap = harness.CaptureCompositeBitmap(); + Assert.That(bitmap, Is.Not.Null, "Composite bitmap capture should succeed"); + + double density = CalculateNonWhiteDensity(bitmap); + Console.WriteLine($"[DATATREE] Non-white density: {density:F2}%"); + Console.WriteLine($"[DATATREE] Bitmap size: {bitmap.Width}x{bitmap.Height}"); + + RecordTiming("simple", 1, 3, harness.LastTiming, density); + await VerifyDataTreeBitmap(bitmap, "simple"); + } + } + + /// + /// Verifies the full DataTree rendering for a triple-nested lex entry. + /// 2 senses × 2 subsenses × 2 sub-sub-senses = 14 total senses. + /// This is the "slow" scenario for realistic deep nesting. + /// + [Test] + public async Task DataTreeRender_Deep() + { + CreateDeepEntry(); + + using (var harness = new DataTreeRenderHarness(Cache, m_entry, "Normal")) + { + harness.PopulateSlices(1024, 1200, true); + DumpSliceDiagnostics(harness, "Deep"); + + Assert.That(harness.SliceCount, Is.GreaterThan(0), + "DataTree should have populated some slices"); + + var bitmap = harness.CaptureCompositeBitmap(); + Assert.That(bitmap, Is.Not.Null, "Composite bitmap capture should succeed"); + + double density = CalculateNonWhiteDensity(bitmap); + Console.WriteLine($"[DATATREE] Non-white density: {density:F2}%"); + Console.WriteLine($"[DATATREE] Bitmap size: {bitmap.Width}x{bitmap.Height}"); + + RecordTiming("deep", 3, 2, harness.LastTiming, density); + await VerifyDataTreeBitmap(bitmap, "deep"); + } + } + + /// + /// Verifies a depth-4 lexeme edit tree can render recursive senses while hidden + /// entry fields are forced visible. The hidden-field layout is test-only, but the + /// render path is the real DataTree pipeline. + /// + [Test] + public async Task DataTreeRender_SubSubSubSenses_ShowHiddenFields() + { + CreateSubSubSubEntry(); + const string layoutName = "NormalWithHiddenFieldsIndented"; + var hiddenLabels = new[] + { + "Bibliography", + "Comment", + "Literal Meaning", + "Restrictions", + "Summary Definition" + }; + + using (var withoutHiddenFields = new DataTreeRenderHarness(Cache, m_entry, layoutName)) + using (var withHiddenFields = new DataTreeRenderHarness(Cache, m_entry, layoutName, showHiddenFields: true)) + { + withoutHiddenFields.PopulateSlices(1024, 2400, false); + withHiddenFields.PopulateSlices(1024, 2400, false); + + var labelsWithoutHiddenFields = withoutHiddenFields.LastTiming.SliceDiagnostics + .Select(diag => diag.Label) + .Where(label => !string.IsNullOrEmpty(label)) + .ToList(); + var labelsWithHiddenFields = withHiddenFields.LastTiming.SliceDiagnostics + .Select(diag => diag.Label) + .Where(label => !string.IsNullOrEmpty(label)) + .ToList(); + + foreach (var hiddenLabel in hiddenLabels) + { + Assert.That(labelsWithoutHiddenFields, Does.Not.Contain(hiddenLabel), + $"{hiddenLabel} should stay hidden when ShowHiddenFields is off."); + Assert.That(labelsWithHiddenFields, Does.Contain(hiddenLabel), + $"{hiddenLabel} should be rendered when ShowHiddenFields is enabled."); + } + + Assert.That(withHiddenFields.SliceCount, Is.GreaterThan(withoutHiddenFields.SliceCount), + "Enabling hidden fields should increase the number of rendered slices."); + + int glossSliceCount = labelsWithHiddenFields.Count(label => label == "Gloss"); + int scientificNameSliceCount = labelsWithHiddenFields.Count(label => label == "ScientificName"); + Assert.That(glossSliceCount, Is.GreaterThanOrEqualTo(30), + $"Expected at least 30 gloss slices for the depth-4 sense tree, but saw {glossSliceCount}."); + Assert.That(scientificNameSliceCount, Is.GreaterThanOrEqualTo(30), + $"Expected at least 30 scientific-name slices for the depth-4 sense tree, but saw {scientificNameSliceCount}."); + + int maxIndent = withHiddenFields.DataTree.Slices.Cast().Max(slice => slice.Indent); + Assert.That(maxIndent, Is.GreaterThanOrEqualTo(3), + $"Expected nested subsenses to create at least 3 levels of indentation, but saw {maxIndent}."); + + // Warm the composite capture once so deep hidden-field trees snapshot after layout convergence. + var warmup = withHiddenFields.CaptureCompositeBitmap(); + Assert.That(warmup, Is.Not.Null, "Warm-up capture should succeed with hidden fields enabled."); + warmup.Dispose(); + + var bitmap = withHiddenFields.CaptureCompositeBitmap(); + Assert.That(bitmap, Is.Not.Null, "Composite bitmap capture should succeed with hidden fields enabled."); + double density = CalculateNonWhiteDensity(bitmap); + RecordTiming("subsubsub-hidden", 4, 2, withHiddenFields.LastTiming, density); + await VerifyDataTreeBitmap(bitmap, "subsubsub-hidden"); + bitmap.Dispose(); + } + } + + /// + /// Verifies a production-like lexeme edit snapshot for the depth-4 hidden-fields scenario. + /// This keeps the focused hidden-field regression separate while adding top-matter coverage + /// closer to the real lexeme edit view. + /// + [Test] + public async Task DataTreeRender_SubSubSubSenses_ShowHiddenFields_ProductionLike() + { + CreateSubSubSubEntry(); + const string layoutName = "ProductionLikeWithHiddenFieldsIndented"; + + using (var harness = new DataTreeRenderHarness(Cache, m_entry, layoutName, showHiddenFields: true)) + { + harness.PopulateSlices(1024, 2600, false); + + var labels = harness.LastTiming.SliceDiagnostics + .Select(diag => diag.Label) + .Where(label => !string.IsNullOrEmpty(label)) + .ToList(); + + Assert.That(labels, Does.Contain("Lexeme Form"), + "Production-like scenario should include the lexeme form top matter."); + Assert.That(labels, Does.Contain("Citation Form"), + "Production-like scenario should include the citation form top matter."); + Assert.That(labels, Does.Contain("Pronunciation"), + "Production-like scenario should include pronunciation top matter."); + Assert.That(labels, Does.Contain("Bibliography")); + Assert.That(labels, Does.Contain("Comment")); + Assert.That(labels, Does.Contain("Literal Meaning")); + Assert.That(labels, Does.Contain("Restrictions")); + Assert.That(labels, Does.Contain("Summary Definition")); + + int maxIndent = harness.DataTree.Slices.Cast().Max(slice => slice.Indent); + Assert.That(maxIndent, Is.GreaterThanOrEqualTo(3), + $"Expected nested subsenses to create at least 3 levels of indentation, but saw {maxIndent}."); + + // Warm the composite capture once so deep hidden-field trees snapshot after layout convergence. + var warmup = harness.CaptureCompositeBitmap(); + Assert.That(warmup, Is.Not.Null, "Warm-up capture should succeed for the production-like layout."); + warmup.Dispose(); + + var bitmap = harness.CaptureCompositeBitmap(); + Assert.That(bitmap, Is.Not.Null, "Composite bitmap capture should succeed for the production-like layout."); + + double density = CalculateNonWhiteDensity(bitmap); + RecordTiming("subsubsub-hidden-productionlike", 4, 2, harness.LastTiming, density); + await VerifyDataTreeBitmap(bitmap, "subsubsub-hidden-productionlike"); + bitmap.Dispose(); + } + } + + [Test] + public void DataTreeRender_CaptureUsesRequestedWidth_WhenClientWidthDrifts() + { + CreateSimpleEntry(); + + using (var harness = new DataTreeRenderHarness(Cache, m_entry, "Normal")) + { + harness.PopulateSlices(1024, 768, false); + harness.DataTree.ClientSize = new Size(1007, harness.DataTree.ClientSize.Height); + harness.DataTree.PerformLayout(); + + var bitmap = harness.CaptureCompositeBitmap(); + Assert.That(bitmap, Is.Not.Null, "Composite bitmap capture should succeed when the live client width drifts."); + Assert.That(bitmap.Width, Is.EqualTo(1024), + "Capture should use the requested host width instead of the current DataTree client width."); + bitmap.Dispose(); + } + } + + /// + /// Verifies the full DataTree rendering for an extreme nesting scenario. + /// 6-level nesting with 126 senses exercises the full slice rendering pipeline. + /// + [Test] + public async Task DataTreeRender_Extreme() + { + CreateExtremeEntry(); + + using (var harness = new DataTreeRenderHarness(Cache, m_entry, "Normal")) + { + harness.PopulateSlices(1024, 2400, true); + DumpSliceDiagnostics(harness, "Extreme"); + + Assert.That(harness.SliceCount, Is.GreaterThan(0), + "DataTree should have populated some slices"); + + var bitmap = harness.CaptureCompositeBitmap(); + Assert.That(bitmap, Is.Not.Null, "Composite bitmap capture should succeed"); + + double density = CalculateNonWhiteDensity(bitmap); + Console.WriteLine($"[DATATREE] Non-white density: {density:F2}%"); + Console.WriteLine($"[DATATREE] Bitmap size: {bitmap.Width}x{bitmap.Height}"); + + RecordTiming("extreme", 6, 2, harness.LastTiming, density); + await VerifyDataTreeBitmap(bitmap, "extreme"); + } + } + + /// + /// Verifies the DataTree rendering for a minimal entry with a single sense. + /// Exercises the bare minimum rendering path — collapsed view. + /// + [Test] + public async Task DataTreeRender_Collapsed() + { + CreateCollapsedEntry(); + + using (var harness = new DataTreeRenderHarness(Cache, m_entry, "Normal")) + { + harness.PopulateSlices(1024, 400, true); + DumpSliceDiagnostics(harness, "Collapsed"); + + Assert.That(harness.SliceCount, Is.GreaterThan(0), + "DataTree should have populated some slices"); + + var bitmap = harness.CaptureCompositeBitmap(); + Assert.That(bitmap, Is.Not.Null, "Composite bitmap capture should succeed"); + + double density = CalculateNonWhiteDensity(bitmap); + Console.WriteLine($"[DATATREE] Non-white density: {density:F2}%"); + Console.WriteLine($"[DATATREE] Bitmap size: {bitmap.Width}x{bitmap.Height}"); + + RecordTiming("collapsed", 1, 1, harness.LastTiming, density); + await VerifyDataTreeBitmap(bitmap, "collapsed"); + } + } + + /// + /// Verifies the DataTree rendering for a fully enriched entry with all optional + /// fields populated. Maximum slice count with multiple pronunciations, + /// scientific names, and extended definitions. + /// + [Test] + public async Task DataTreeRender_Expanded() + { + CreateExpandedEntry(); + + using (var harness = new DataTreeRenderHarness(Cache, m_entry, "Normal")) + { + harness.PopulateSlices(1024, 1200, true); + DumpSliceDiagnostics(harness, "Expanded"); + + Assert.That(harness.SliceCount, Is.GreaterThan(0), + "DataTree should have populated some slices"); + + var bitmap = harness.CaptureCompositeBitmap(); + Assert.That(bitmap, Is.Not.Null, "Composite bitmap capture should succeed"); + + double density = CalculateNonWhiteDensity(bitmap); + Console.WriteLine($"[DATATREE] Non-white density: {density:F2}%"); + Console.WriteLine($"[DATATREE] Bitmap size: {bitmap.Width}x{bitmap.Height}"); + + RecordTiming("expanded", 1, 4, harness.LastTiming, density); + await VerifyDataTreeBitmap(bitmap, "expanded"); + } + } + + /// + /// Verifies the DataTree rendering for an entry with multiple writing systems. + /// Exercises MultiStringSlice WS indicators and font fallback across French and English. + /// + [Test] + public async Task DataTreeRender_MultiWs() + { + CreateMultiWsEntry(); + + using (var harness = new DataTreeRenderHarness(Cache, m_entry, "Normal")) + { + harness.PopulateSlices(1024, 768, true); + DumpSliceDiagnostics(harness, "MultiWs"); + + Assert.That(harness.SliceCount, Is.GreaterThan(0), + "DataTree should have populated some slices"); + + var bitmap = harness.CaptureCompositeBitmap(); + Assert.That(bitmap, Is.Not.Null, "Composite bitmap capture should succeed"); + + double density = CalculateNonWhiteDensity(bitmap); + Console.WriteLine($"[DATATREE] Non-white density: {density:F2}%"); + Console.WriteLine($"[DATATREE] Bitmap size: {bitmap.Width}x{bitmap.Height}"); + + RecordTiming("multiws", 1, 2, harness.LastTiming, density); + await VerifyDataTreeBitmap(bitmap, "multiws"); + } + } + + #endregion + + #region Timing Tests + + /// + /// Benchmarks DataTree population time at varying nesting depths. + /// Reports the exponential growth in slice creation and rendering time. + /// Writes timing results to Output/RenderBenchmarks/datatree-timings.json. + /// + [Test] + [TestCase(2, 3, "shallow", Description = "Depth 2, breadth 3 = 12 senses")] + [TestCase(3, 2, "deep", Description = "Depth 3, breadth 2 = 14 senses (triple-nested)")] + [TestCase(6, 2, "extreme", Description = "Depth 6, breadth 2 = 126 senses")] + public void DataTreeTiming(int depth, int breadth, string label) + { + m_entry = Cache.ServiceLocator.GetInstance().Create(); + var morphFactory = Cache.ServiceLocator.GetInstance(); + var morph = morphFactory.Create(); + m_entry.LexemeFormOA = morph; + morph.Form.VernacularDefaultWritingSystem = MakeRenderString( + $"LexemeForm - timing-{label}", Cache.DefaultVernWs); + + var senseFactory = Cache.ServiceLocator.GetInstance(); + CreateNestedSenses(m_entry, senseFactory, depth, breadth, "", 1, $"timing-{label}"); + EnrichEntry(m_entry, $"timing-{label}"); + + using (var harness = new DataTreeRenderHarness(Cache, m_entry, "Normal")) + { + // Use test inventories for timing to keep recursive sense growth active + // while avoiding known production-layout crash-only parts in test context. + harness.PopulateSlices(1024, 2400, false); + + Console.WriteLine($"[DATATREE-TIMING] {label}: " + + $"Init={harness.LastTiming.InitializationMs:F1}ms, " + + $"Populate={harness.LastTiming.PopulateSlicesMs:F1}ms, " + + $"Total={harness.LastTiming.TotalMs:F1}ms, " + + $"Slices={harness.LastTiming.SliceCount}"); + + Assert.That(harness.SliceCount, Is.GreaterThan(0), + $"DataTree should create slices for {label} scenario"); + + // Capture bitmap to exercise the full pipeline + var bitmap = harness.CaptureCompositeBitmap(); + Assert.That(bitmap, Is.Not.Null, "Composite capture should succeed"); + + double density = CalculateNonWhiteDensity(bitmap); + Console.WriteLine($"[DATATREE-TIMING] {label}: Non-white density={density:F2}%"); + + // Record timing to file + RecordTiming($"timing-{label}", depth, breadth, harness.LastTiming, density); + } + } + + /// + /// Measures paint/capture time for the extreme scenario. + /// Exercises the full OnPaint → HandlePaintLinesBetweenSlices pipeline + /// via DrawToBitmap. This provides a baseline for paint optimizations + /// (clip-rect culling, double-buffering). + /// + [Test] + public void DataTreeTiming_PaintPerformance() + { + CreateExtremeEntry(); + using (var harness = new DataTreeRenderHarness(Cache, m_entry, "Normal")) + { + harness.PopulateSlices(1024, 2400, false); + Assert.That(harness.SliceCount, Is.GreaterThan(0), + "DataTree should create slices for extreme scenario"); + + // Warm-up capture (first paint triggers handle creation, layout convergence, etc.) + var warmup = harness.CaptureCompositeBitmap(); + Assert.That(warmup, Is.Not.Null, "Warm-up capture should succeed"); + warmup.Dispose(); + + // Timed capture: DrawToBitmap → OnPaint → HandlePaintLinesBetweenSlices + var sw = System.Diagnostics.Stopwatch.StartNew(); + var bitmap = harness.CaptureCompositeBitmap(); + sw.Stop(); + + Assert.That(bitmap, Is.Not.Null, "Timed capture should succeed"); + double captureMs = sw.Elapsed.TotalMilliseconds; + Console.WriteLine($"[PAINT-TIMING] Extreme scenario capture: {captureMs:F1}ms"); + Console.WriteLine($"[PAINT-TIMING] Slices: {harness.SliceCount}, Bitmap: {bitmap.Width}x{bitmap.Height}"); + + RecordTiming("paint-extreme", 6, 2, harness.LastTiming, + CalculateNonWhiteDensity(bitmap)); + bitmap.Dispose(); + } + } + + /// + /// Verifies benchmark workload grows with scenario complexity. + /// This guards against timing tests that accidentally stop exercising deeper data. + /// + [Test] + public void DataTreeTiming_WorkloadGrowsWithComplexity() + { + int shallowSlices = RunTimingScenarioAndGetSliceCount(2, 3, "growth-shallow"); + int deepSlices = RunTimingScenarioAndGetSliceCount(3, 2, "growth-deep"); + int extremeSlices = RunTimingScenarioAndGetSliceCount(6, 2, "growth-extreme"); + + Assert.That(deepSlices, Is.GreaterThan(shallowSlices), + $"Expected deep workload to exceed shallow workload, but got shallow={shallowSlices}, deep={deepSlices}"); + Assert.That(extremeSlices, Is.GreaterThan(deepSlices), + $"Expected extreme workload to exceed deep workload, but got deep={deepSlices}, extreme={extremeSlices}"); + } + + [Test] + public void DataTreeTimingBaselines_CoverAllSnapshotScenarios() + { + DataTreeTimingBaselineCatalog.AssertSnapshotCoverage(); + } + + #endregion + + #region Optimization Regression Tests + + /// + /// Verifies that all visible slices in the viewport have consistent width after + /// layout converges. Exercises Enhancement 5 (SetWidthForDataTreeLayout early-exit): + /// after the first layout pass sets widths, subsequent passes should be no-ops. + /// + [Test] + public void DataTreeOpt_WidthStabilityAfterLayout() + { + CreateDeepEntry(); + using (var harness = new DataTreeRenderHarness(Cache, m_entry, "Normal")) + { + harness.PopulateSlices(1024, 2400, false); + Assert.That(harness.SliceCount, Is.GreaterThan(0), + "Should have slices"); + + // Record widths after initial layout convergence + var dt = harness.DataTree; + int desiredWidth = dt.ClientRectangle.Width; + var initialWidths = new int[dt.Slices.Count]; + for (int i = 0; i < dt.Slices.Count; i++) + initialWidths[i] = ((Slice)dt.Slices[i]).Width; + + // Force a second paint/layout pass — widths should remain identical + var bitmap = harness.CaptureCompositeBitmap(); + Assert.That(bitmap, Is.Not.Null, "Second paint should succeed"); + bitmap.Dispose(); + + for (int i = 0; i < dt.Slices.Count; i++) + { + int currentWidth = ((Slice)dt.Slices[i]).Width; + Assert.That(currentWidth, Is.EqualTo(initialWidths[i]), + $"Slice [{i}] width changed after second layout pass " + + $"(was {initialWidths[i]}, now {currentWidth}). " + + $"Enhancement 5 early-exit should prevent width changes when stable."); + } + + Console.WriteLine($"[OPT-TEST] Width stability: {dt.Slices.Count} slices " + + $"all stable at width={desiredWidth}"); + } + } + + /// + /// Verifies that all slices in the viewport are marked Visible=true after layout. + /// Exercises Enhancement 9 (MakeSliceVisible high-water mark): the optimization + /// must not skip making any slice visible that should be visible. + /// + [Test] + public void DataTreeOpt_AllViewportSlicesVisible() + { + CreateExtremeEntry(); + using (var harness = new DataTreeRenderHarness(Cache, m_entry, "Normal")) + { + // Use a viewport smaller than total content to exercise partial visibility + harness.PopulateSlices(1024, 800, false); + Assert.That(harness.SliceCount, Is.GreaterThan(0), + "Should have slices"); + + // Force layout + paint to trigger MakeSliceVisible calls + var bitmap = harness.CaptureCompositeBitmap(); + Assert.That(bitmap, Is.Not.Null, "Paint should succeed"); + bitmap.Dispose(); + + var dt = harness.DataTree; + var diagnostics = harness.LastTiming.SliceDiagnostics; + + // Every slice that is within the viewport bounds should be Visible + int viewportBottom = dt.ClientRectangle.Height; + int visibleCount = 0; + int totalCount = 0; + for (int i = 0; i < dt.Slices.Count; i++) + { + var slice = (Slice)dt.Slices[i]; + totalCount++; + int sliceTop = slice.Top; + int sliceBottom = sliceTop + slice.Height; + + // Slice intersects viewport + if (sliceBottom > 0 && sliceTop < viewportBottom) + { + Assert.That(slice.Visible, Is.True, + $"Slice [{i}] ({slice.GetType().Name}, Label=\"{slice.Label}\") " + + $"at Y={sliceTop}-{sliceBottom} is in viewport (0-{viewportBottom}) " + + $"but Visible=false. Enhancement 9 high-water mark may have skipped it."); + visibleCount++; + } + } + + Assert.That(visibleCount, Is.GreaterThan(0), + "At least one slice should be visible in the viewport"); + Console.WriteLine($"[OPT-TEST] Visibility: {visibleCount}/{totalCount} slices " + + $"visible in viewport 0-{viewportBottom}"); + } + } + + /// + /// Verifies that the XML attribute cache on Slice returns the same results as + /// direct XML parsing. Exercises Enhancement 8 (cached IsHeader/SkipSpacerLine/SameObject): + /// the cache must be correct and must be invalidated when ConfigurationNode changes. + /// + [Test] + public void DataTreeOpt_XmlCacheConsistency() + { + CreateSimpleEntry(); + using (var harness = new DataTreeRenderHarness(Cache, m_entry, "Normal")) + { + harness.PopulateSlices(1024, 1200, false); + Assert.That(harness.SliceCount, Is.GreaterThan(0), + "Should have slices"); + + var dt = harness.DataTree; + int checkedCount = 0; + + for (int i = 0; i < dt.Slices.Count; i++) + { + var slice = (Slice)dt.Slices[i]; + if (slice.ConfigurationNode == null) + continue; + + // Get the cached property values + bool cachedIsHeader = slice.IsHeader; + bool cachedSkipSpacer = slice.SkipSpacerLine; + bool cachedSameObj = slice.SameObject; + + // Get the ground truth from direct XML parsing + bool directIsHeader = SIL.Utils.XmlUtils.GetOptionalBooleanAttributeValue( + slice.ConfigurationNode, "header", false); + bool directSkipSpacer = SIL.Utils.XmlUtils.GetOptionalBooleanAttributeValue( + slice.ConfigurationNode, "skipSpacerLine", false); + bool directSameObj = SIL.Utils.XmlUtils.GetOptionalBooleanAttributeValue( + slice.ConfigurationNode, "sameObject", false); + + Assert.That(cachedIsHeader, Is.EqualTo(directIsHeader), + $"Slice [{i}] IsHeader cache mismatch: cached={cachedIsHeader}, " + + $"XML={directIsHeader}"); + Assert.That(cachedSkipSpacer, Is.EqualTo(directSkipSpacer), + $"Slice [{i}] SkipSpacerLine cache mismatch: cached={cachedSkipSpacer}, " + + $"XML={directSkipSpacer}"); + Assert.That(cachedSameObj, Is.EqualTo(directSameObj), + $"Slice [{i}] SameObject cache mismatch: cached={cachedSameObj}, " + + $"XML={directSameObj}"); + + checkedCount++; + } + + Assert.That(checkedCount, Is.GreaterThan(0), + "Should have checked at least one slice's XML cache"); + Console.WriteLine($"[OPT-TEST] XML cache consistency: {checkedCount} slices verified"); + } + } + + /// + /// Verifies that ConfigurationNode setter invalidates the XML attribute cache. + /// Re-setting the same ConfigurationNode should still produce correct results + /// (cache re-populated from XML). Exercises Enhancement 8 cache invalidation. + /// + [Test] + public void DataTreeOpt_XmlCacheInvalidationOnConfigChange() + { + CreateSimpleEntry(); + using (var harness = new DataTreeRenderHarness(Cache, m_entry, "Normal")) + { + harness.PopulateSlices(1024, 1200, false); + Assert.That(harness.SliceCount, Is.GreaterThan(0), + "Should have slices"); + + var dt = harness.DataTree; + + // Find a slice with a ConfigurationNode to test cache invalidation + Slice testSlice = null; + for (int i = 0; i < dt.Slices.Count; i++) + { + var slice = (Slice)dt.Slices[i]; + if (slice.ConfigurationNode != null) + { + testSlice = slice; + break; + } + } + Assert.That(testSlice, Is.Not.Null, + "Should find at least one slice with a ConfigurationNode"); + + // Prime the cache by accessing each property + bool originalIsHeader = testSlice.IsHeader; + bool originalSkipSpacer = testSlice.SkipSpacerLine; + bool originalSameObj = testSlice.SameObject; + + // Re-set the ConfigurationNode (triggers cache invalidation) + var savedNode = testSlice.ConfigurationNode; + testSlice.ConfigurationNode = savedNode; + + // Cache should be re-populated with same values + Assert.That(testSlice.IsHeader, Is.EqualTo(originalIsHeader), + "IsHeader should match after ConfigurationNode reset"); + Assert.That(testSlice.SkipSpacerLine, Is.EqualTo(originalSkipSpacer), + "SkipSpacerLine should match after ConfigurationNode reset"); + Assert.That(testSlice.SameObject, Is.EqualTo(originalSameObj), + "SameObject should match after ConfigurationNode reset"); + + Console.WriteLine($"[OPT-TEST] Cache invalidation: verified on slice " + + $"'{testSlice.Label}' ({testSlice.GetType().Name})"); + } + } + + /// + /// Verifies that multiple sequential paint captures produce identical output. + /// Exercises all paint-path optimizations (Enhancement 3 clip-rect culling, + /// Enhancement 4 double-buffering, Enhancement 7 paint-path width skip, + /// Enhancement 8 XML caching): repeated paints must be deterministic. + /// + [Test] + public void DataTreeOpt_SequentialPaintsProduceIdenticalOutput() + { + CreateDeepEntry(); + using (var harness = new DataTreeRenderHarness(Cache, m_entry, "Normal")) + { + harness.PopulateSlices(1024, 1200, false); + Assert.That(harness.SliceCount, Is.GreaterThan(0), + "Should have slices"); + + // Warm-up to get past initial layout convergence + var warmup = harness.CaptureCompositeBitmap(); + Assert.That(warmup, Is.Not.Null); + warmup.Dispose(); + + // Capture twice + var capture1 = harness.CaptureCompositeBitmap(); + var capture2 = harness.CaptureCompositeBitmap(); + + Assert.That(capture1, Is.Not.Null, "First capture should succeed"); + Assert.That(capture2, Is.Not.Null, "Second capture should succeed"); + + Assert.That(capture2.Width, Is.EqualTo(capture1.Width), + "Bitmap widths should match"); + Assert.That(capture2.Height, Is.EqualTo(capture1.Height), + "Bitmap heights should match"); + + // Compare pixel-by-pixel — paint must be deterministic + int mismatchCount = 0; + for (int y = 0; y < capture1.Height; y++) + { + for (int x = 0; x < capture1.Width; x++) + { + if (capture1.GetPixel(x, y) != capture2.GetPixel(x, y)) + mismatchCount++; + } + } + + double mismatchRate = (double)mismatchCount / (capture1.Width * capture1.Height) * 100; + Assert.That(mismatchRate, Is.LessThan(0.1), + $"Sequential paints differ in {mismatchCount} pixels ({mismatchRate:F3}%). " + + $"Paint optimizations must produce deterministic output."); + + Console.WriteLine($"[OPT-TEST] Paint determinism: {capture1.Width}x{capture1.Height}, " + + $"mismatch={mismatchCount} ({mismatchRate:F3}%)"); + + capture1.Dispose(); + capture2.Dispose(); + } + } + + /// + /// Verifies that slice positions are monotonically increasing (each slice's Top + /// is >= previous slice's Top + Height). This is a prerequisite for Enhancement 3's + /// clip-rect culling early-break optimization in HandlePaintLinesBetweenSlices. + /// + [Test] + public void DataTreeOpt_SlicePositionsMonotonicallyIncreasing() + { + CreateExtremeEntry(); + using (var harness = new DataTreeRenderHarness(Cache, m_entry, "Normal")) + { + harness.PopulateSlices(1024, 2400, false); + Assert.That(harness.SliceCount, Is.GreaterThan(1), + "Should have multiple slices to test ordering"); + + var dt = harness.DataTree; + int previousBottom = int.MinValue; + int checkedCount = 0; + + for (int i = 0; i < dt.Slices.Count; i++) + { + var slice = (Slice)dt.Slices[i]; + int sliceTop = slice.Top; + + if (i > 0) + { + Assert.That(sliceTop, Is.GreaterThanOrEqualTo(previousBottom), + $"Slice [{i}] ({slice.GetType().Name}, Label=\"{slice.Label}\") " + + $"Top={sliceTop} overlaps previous slice bottom={previousBottom}. " + + $"Monotonic ordering required for clip-rect culling (Enhancement 3)."); + } + + previousBottom = sliceTop + slice.Height; + checkedCount++; + } + + Console.WriteLine($"[OPT-TEST] Monotonic ordering: {checkedCount} slices verified"); + } + } + + /// + /// Verifies IsHeaderNode delegates correctly to the cached IsHeader property. + /// The public IsHeaderNode property should always agree with the internal + /// cached IsHeader value. Exercises Enhancement 8 delegation. + /// + [Test] + public void DataTreeOpt_IsHeaderNodeDelegatesToCachedProperty() + { + CreateSimpleEntry(); + using (var harness = new DataTreeRenderHarness(Cache, m_entry, "Normal")) + { + harness.PopulateSlices(1024, 1200, false); + Assert.That(harness.SliceCount, Is.GreaterThan(0), + "Should have slices"); + + var dt = harness.DataTree; + int checkedCount = 0; + + for (int i = 0; i < dt.Slices.Count; i++) + { + var slice = (Slice)dt.Slices[i]; + if (slice.ConfigurationNode == null) + continue; + + // IsHeaderNode (public) should delegate to IsHeader (internal cached) + Assert.That(slice.IsHeaderNode, Is.EqualTo(slice.IsHeader), + $"Slice [{i}] IsHeaderNode/IsHeader mismatch"); + checkedCount++; + } + + Assert.That(checkedCount, Is.GreaterThan(0), + "Should have checked at least one slice"); + Console.WriteLine($"[OPT-TEST] IsHeaderNode delegation: {checkedCount} slices verified"); + } + } + + /// + /// Verifies that slice positions set by the full layout pass (fFull=true, + /// called from OnLayout) agree with the accumulated yTop values computed by + /// the paint path (fFull=false, called from OnPaint). This is the core safety + /// invariant for a future binary-search optimization: if the paint path skips + /// iterating above-viewport slices, the positions it uses must match what + /// the full layout established. + /// Failure mode: yTop accumulator drift when the paint path doesn't walk all slices. + /// + [Test] + public void DataTreeOpt_FullLayoutAndPaintPathPositionsAgree() + { + CreateExtremeEntry(); + using (var harness = new DataTreeRenderHarness(Cache, m_entry, "Normal")) + { + harness.PopulateSlices(1024, 2400, false); + Assert.That(harness.SliceCount, Is.GreaterThan(0), "Should have slices"); + + var dt = harness.DataTree; + + // Record positions after full layout (set by OnLayout → HandleLayout1(fFull=true)) + var fullLayoutPositions = new int[dt.Slices.Count]; + var fullLayoutHeights = new int[dt.Slices.Count]; + for (int i = 0; i < dt.Slices.Count; i++) + { + var slice = (Slice)dt.Slices[i]; + fullLayoutPositions[i] = slice.Top; + fullLayoutHeights[i] = slice.Height; + } + + // Force another paint-path layout by invalidating and pumping + dt.Invalidate(); + System.Windows.Forms.Application.DoEvents(); + + // Verify positions haven't drifted + int checkedCount = 0; + for (int i = 0; i < dt.Slices.Count; i++) + { + var slice = (Slice)dt.Slices[i]; + Assert.That(slice.Top, Is.EqualTo(fullLayoutPositions[i]), + $"Slice [{i}] ({slice.GetType().Name}, Label=\"{slice.Label}\") " + + $"Top drifted from {fullLayoutPositions[i]} to {slice.Top} " + + $"after paint-path layout. Full→paint position agreement broken."); + checkedCount++; + } + + Console.WriteLine($"[OPT-TEST] Position agreement: {checkedCount} slices verified"); + } + } + + /// + /// Verifies that AutoScrollPosition does not drift across multiple paint passes. + /// The paint path adjusts scroll position when slices above the viewport change + /// height (e.g., DummyObjectSlice → real slice). After initial convergence, + /// scroll position must be stable. + /// Failure mode: binary search skips the desiredScrollPosition adjustment for + /// above-viewport slices, causing scroll jumps. + /// + [Test] + public void DataTreeOpt_ScrollPositionStableAcrossPaints() + { + CreateExtremeEntry(); + using (var harness = new DataTreeRenderHarness(Cache, m_entry, "Normal")) + { + // Use a small viewport so most slices are below the fold + harness.PopulateSlices(1024, 400, false); + Assert.That(harness.SliceCount, Is.GreaterThan(0), "Should have slices"); + + var dt = harness.DataTree; + + // Warm up — first paint triggers layout convergence + var warmup = harness.CaptureCompositeBitmap(); + Assert.That(warmup, Is.Not.Null); + warmup.Dispose(); + + // Record scroll position after convergence + var scrollAfterConvergence = dt.AutoScrollPosition; + + // Force multiple paint passes + for (int pass = 0; pass < 3; pass++) + { + dt.Invalidate(); + System.Windows.Forms.Application.DoEvents(); + } + + Assert.That(dt.AutoScrollPosition, Is.EqualTo(scrollAfterConvergence), + $"AutoScrollPosition drifted from {scrollAfterConvergence} to " + + $"{dt.AutoScrollPosition} after 3 additional paint passes. " + + $"Scroll stability is essential for binary-search correctness."); + + Console.WriteLine($"[OPT-TEST] Scroll stability: position={dt.AutoScrollPosition} " + + $"stable across 3 additional paints"); + } + } + + /// + /// Verifies that all slices at or before the last visible slice are also visible. + /// The .NET Framework has a bug (LT-7307) where making a slice visible when + /// prior slices are invisible causes index corruption. The MakeSliceVisible + /// method guarantees all preceding slices are visible before making the target + /// visible. A binary search that starts mid-list must preserve this invariant. + /// Failure mode: binary search skips MakeSliceVisible for slices 0..N-1, leaving + /// gaps in the visibility sequence. + /// + [Test] + public void DataTreeOpt_VisibilitySequenceHasNoGaps() + { + CreateExtremeEntry(); + using (var harness = new DataTreeRenderHarness(Cache, m_entry, "Normal")) + { + harness.PopulateSlices(1024, 800, false); + Assert.That(harness.SliceCount, Is.GreaterThan(0), "Should have slices"); + + // Force paint to trigger MakeSliceVisible + var bitmap = harness.CaptureCompositeBitmap(); + Assert.That(bitmap, Is.Not.Null); + bitmap.Dispose(); + + var dt = harness.DataTree; + + // Find the highest-index visible slice + int highestVisibleIndex = -1; + for (int i = 0; i < dt.Slices.Count; i++) + { + if (((Slice)dt.Slices[i]).Visible) + highestVisibleIndex = i; + } + + Assert.That(highestVisibleIndex, Is.GreaterThan(0), + "Should have multiple visible slices"); + + // All slices 0..highestVisibleIndex must be visible (no gaps) + int gapCount = 0; + for (int i = 0; i <= highestVisibleIndex; i++) + { + var slice = (Slice)dt.Slices[i]; + if (!slice.Visible) + { + gapCount++; + Console.WriteLine($"[OPT-TEST] Visibility gap at [{i}] " + + $"({slice.GetType().Name}, Label=\"{slice.Label}\")"); + } + } + + Assert.That(gapCount, Is.EqualTo(0), + $"Found {gapCount} invisible slices before the last visible slice " + + $"(index {highestVisibleIndex}). LT-7307: all preceding slices must " + + $"be visible to prevent index corruption."); + + Console.WriteLine($"[OPT-TEST] Visibility sequence: no gaps in 0..{highestVisibleIndex}"); + } + } + + /// + /// Removing the last visible slice shifts the first invisible off-screen slice into the + /// visible prefix. MakeSliceVisible must rebuild that prefix from the start on the next call; + /// otherwise LT-7307 can be violated by skipping the shifted slice. + /// + [Test] + public void DataTreeOpt_RemoveVisibleSliceInvalidatesHighWaterMark() + { + CreateExtremeEntry(); + using (var harness = new DataTreeRenderHarness(Cache, m_entry, "Normal")) + { + harness.PopulateSlices(1024, 800, false); + Assert.That(harness.SliceCount, Is.GreaterThan(0), "Should have slices"); + + var dt = harness.DataTree; + const int cachedPrefixEnd = 4; + Assert.That(dt.Slices.Count, Is.GreaterThan(cachedPrefixEnd + 2), + "Need enough slices to remove one cached-visible slice and then show a later one"); + + for (int i = 0; i < dt.Slices.Count; i++) + { + ((Slice)dt.Slices[i]).Visible = i <= cachedPrefixEnd; + } + + var highWaterMarkField = typeof(DataTree).GetField("m_lastVisibleHighWaterMark", + BindingFlags.Instance | BindingFlags.NonPublic); + Assert.That(highWaterMarkField, Is.Not.Null, + "Test must be able to seed the private visibility cache deterministically"); + highWaterMarkField.SetValue(dt, cachedPrefixEnd); + + dt.RemoveSliceAt(cachedPrefixEnd); + + var shiftedSlice = (Slice)dt.Slices[cachedPrefixEnd]; + Assert.That(shiftedSlice.Visible, Is.False, + "Removing the cached frontier should shift an off-screen slice into that slot"); + + int targetIndex = cachedPrefixEnd + 1; + Assert.That(((Slice)dt.Slices[targetIndex]).Visible, Is.False, + "The later target slice should begin off-screen for this regression test"); + + dt.MakeSliceVisible((Slice)dt.Slices[targetIndex], targetIndex); + + Assert.That(((Slice)dt.Slices[cachedPrefixEnd]).Visible, Is.True, + "Removing a slice must invalidate the high-water mark so MakeSliceVisible repairs the shifted prefix"); + Assert.That(((Slice)dt.Slices[targetIndex]).Visible, Is.True, + "The requested target slice should still be made visible"); + } + } + + /// + /// Verifies that no DummyObjectSlice remains in the viewport after paint. + /// The paint path must make all viewport slices real via FieldAt(). A binary + /// search that miscalculates which slices are in the viewport could leave + /// DummyObjectSlices un-expanded. + /// Failure mode: binary search starts too late, leaving slices at the top edge + /// of the viewport as dummies. + /// + [Test] + public void DataTreeOpt_NoDummySlicesInViewportAfterPaint() + { + CreateExtremeEntry(); + using (var harness = new DataTreeRenderHarness(Cache, m_entry, "Normal")) + { + harness.PopulateSlices(1024, 800, false); + Assert.That(harness.SliceCount, Is.GreaterThan(0), "Should have slices"); + + // Force full paint cycle + var bitmap = harness.CaptureCompositeBitmap(); + Assert.That(bitmap, Is.Not.Null); + bitmap.Dispose(); + + var dt = harness.DataTree; + int viewportHeight = dt.ClientRectangle.Height; + int dummyCount = 0; + + for (int i = 0; i < dt.Slices.Count; i++) + { + var slice = (Slice)dt.Slices[i]; + int sliceTop = slice.Top; + int sliceBottom = sliceTop + slice.Height; + + // Slice intersects the viewport + if (sliceBottom > 0 && sliceTop < viewportHeight) + { + if (!slice.IsRealSlice) + { + dummyCount++; + Console.WriteLine($"[OPT-TEST] Dummy in viewport at [{i}]: " + + $"{slice.GetType().Name} Y={sliceTop}-{sliceBottom}"); + } + } + } + + Assert.That(dummyCount, Is.EqualTo(0), + $"Found {dummyCount} DummyObjectSlice(s) in viewport (0-{viewportHeight}). " + + $"Paint path must make all viewport slices real via FieldAt()."); + + Console.WriteLine($"[OPT-TEST] No dummies in viewport 0-{viewportHeight}"); + } + } + + /// + /// Verifies that slice heights are stable after layout convergence. + /// A binary search for the first visible slice depends on accumulated + /// heights being deterministic: if heights change between paint calls + /// (e.g., because DummyObjectSlice→real changes weren't finalized), + /// the binary search would compute wrong yTop offsets and skip or + /// double-show slices. + /// After the initial full-layout pass, heights should never change + /// on subsequent paint passes (since all viewport slices are already real). + /// Failure mode: binary search pre-computes yTop from stale heights, + /// causing slices to render at wrong positions. + /// + [Test] + public void DataTreeOpt_SliceHeightsStableAfterConvergence() + { + CreateExtremeEntry(); + using (var harness = new DataTreeRenderHarness(Cache, m_entry, "Normal")) + { + harness.PopulateSlices(1024, 800, false); + Assert.That(harness.SliceCount, Is.GreaterThan(0), "Should have slices"); + + // Force full convergence — first paint makes everything real + var warmup = harness.CaptureCompositeBitmap(); + Assert.That(warmup, Is.Not.Null); + warmup.Dispose(); + + var dt = harness.DataTree; + + // Record converged heights + var convergedHeights = new int[dt.Slices.Count]; + for (int i = 0; i < dt.Slices.Count; i++) + convergedHeights[i] = ((Slice)dt.Slices[i]).Height; + + // Force 3 more paint cycles + for (int pass = 0; pass < 3; pass++) + { + dt.Invalidate(); + System.Windows.Forms.Application.DoEvents(); + } + + // Verify heights haven't changed + int driftCount = 0; + for (int i = 0; i < dt.Slices.Count; i++) + { + var slice = (Slice)dt.Slices[i]; + if (slice.Height != convergedHeights[i]) + { + driftCount++; + Console.WriteLine($"[OPT-TEST] Height drift at [{i}] " + + $"({slice.GetType().Name}): {convergedHeights[i]} → {slice.Height}"); + } + } + + Assert.That(driftCount, Is.EqualTo(0), + $"{driftCount} slice(s) changed height after convergence. " + + $"Binary search requires stable heights to compute accurate yTop offsets."); + + Console.WriteLine($"[OPT-TEST] Height stability: {dt.Slices.Count} slices " + + $"stable across 3 post-convergence paint passes"); + } + } + + #endregion + + #region Helpers + + /// + /// Dumps detailed slice diagnostic information to console output for debugging. + /// + private static void DumpSliceDiagnostics(DataTreeRenderHarness harness, string label) + { + Console.WriteLine($"[DATATREE] === {label} Diagnostics ==="); + Console.WriteLine($"[DATATREE] Slice count: {harness.SliceCount}"); + Console.WriteLine($"[DATATREE] Populate time: {harness.LastTiming.PopulateSlicesMs:F1}ms"); + Console.WriteLine($"[DATATREE] Init time: {harness.LastTiming.InitializationMs:F1}ms"); + + // Summary by type + var typeCounts = harness.LastTiming.SliceDiagnostics + .GroupBy(d => d.TypeName) + .OrderByDescending(g => g.Count()); + foreach (var group in typeCounts) + { + Console.WriteLine($"[DATATREE] {group.Key}: {group.Count()}"); + } + + // Individual slice details (first 30) + int limit = Math.Min(harness.LastTiming.SliceDiagnostics.Count, 30); + for (int i = 0; i < limit; i++) + { + var d = harness.LastTiming.SliceDiagnostics[i]; + Console.WriteLine($"[DATATREE] [{d.Index}] {d.TypeName,-25} " + + $"Label=\"{d.Label}\" Visible={d.Visible} " + + $"Bounds={d.Bounds} HasRootBox={d.HasRootBox}"); + } + if (harness.LastTiming.SliceDiagnostics.Count > 30) + { + Console.WriteLine($"[DATATREE] ... ({harness.LastTiming.SliceDiagnostics.Count - 30} more)"); + } + } + + private int RunTimingScenarioAndGetSliceCount(int depth, int breadth, string label) + { + m_entry = Cache.ServiceLocator.GetInstance().Create(); + var morphFactory = Cache.ServiceLocator.GetInstance(); + var morph = morphFactory.Create(); + m_entry.LexemeFormOA = morph; + morph.Form.VernacularDefaultWritingSystem = MakeRenderString( + $"LexemeForm - timing-{label}", Cache.DefaultVernWs); + + var senseFactory = Cache.ServiceLocator.GetInstance(); + CreateNestedSenses(m_entry, senseFactory, depth, breadth, "", 1, $"timing-{label}"); + EnrichEntry(m_entry, $"timing-{label}"); + + using (var harness = new DataTreeRenderHarness(Cache, m_entry, "Normal")) + { + harness.PopulateSlices(1024, 2400, false); + Assert.That(harness.SliceCount, Is.GreaterThan(0), + $"DataTree should create slices for growth scenario {label}"); + Console.WriteLine($"[DATATREE-TIMING] growth check {label}: Slices={harness.SliceCount}"); + return harness.SliceCount; + } + } + + private static double CalculateNonWhiteDensity(Bitmap bitmap) + { + int nonWhiteCount = 0; + int totalPixels = bitmap.Width * bitmap.Height; + + for (int y = 0; y < bitmap.Height; y++) + { + for (int x = 0; x < bitmap.Width; x++) + { + var pixel = bitmap.GetPixel(x, y); + if (pixel.R < 250 || pixel.G < 250 || pixel.B < 250) + nonWhiteCount++; + } + } + + return totalPixels > 0 ? (nonWhiteCount * 100.0 / totalPixels) : 0.0; + } + + /// + /// Records timing data for a scenario to Output/RenderBenchmarks/datatree-timings.json. + /// The file accumulates entries keyed by scenario name, updating on each run. + /// + private static void RecordTiming(string scenario, int depth, int breadth, + DataTreeTimingInfo timing, double density) + { + DataTreeTimingBaselineCatalog.AssertMatches(scenario, depth, breadth, timing, density); + + string outputDir = Path.Combine( + AppDomain.CurrentDomain.BaseDirectory, "..", "..", "Output", "RenderBenchmarks"); + if (!Directory.Exists(outputDir)) + Directory.CreateDirectory(outputDir); + + string filePath = Path.Combine(outputDir, "datatree-timings.json"); + + // Load existing data or start fresh + Dictionary allTimings; + if (File.Exists(filePath)) + { + string existing = File.ReadAllText(filePath); + allTimings = JsonConvert.DeserializeObject>(existing) + ?? new Dictionary(); + } + else + { + allTimings = new Dictionary(); + } + + // Update entry for this scenario + allTimings[scenario] = new + { + depth, + breadth, + slices = timing.SliceCount, + initMs = Math.Round(timing.InitializationMs, 1), + populateMs = Math.Round(timing.PopulateSlicesMs, 1), + totalMs = Math.Round(timing.TotalMs, 1), + density = Math.Round(density, 2), + timestamp = DateTime.UtcNow.ToString("o") + }; + + string json = JsonConvert.SerializeObject(allTimings, Formatting.Indented); + File.WriteAllText(filePath, json); + Console.WriteLine($"[DATATREE-TIMING] Wrote timing for '{scenario}' to {filePath}"); + } + + #endregion + } +} diff --git a/Src/Common/Controls/DetailControls/DetailControlsTests/DataTreeTests.cs b/Src/Common/Controls/DetailControls/DetailControlsTests/DataTreeTests.cs index 555e744b98..0f74fe0003 100644 --- a/Src/Common/Controls/DetailControls/DetailControlsTests/DataTreeTests.cs +++ b/Src/Common/Controls/DetailControls/DetailControlsTests/DataTreeTests.cs @@ -264,7 +264,7 @@ public void RemoveDuplicateCustomFields() m_dtree.Initialize(Cache, false, m_layouts, m_parts); m_dtree.ShowObject(m_entry, "Normal", null, m_entry, false); var template = m_dtree.GetTemplateForObjLayout(m_entry, "Normal", null); - var expected = ""; + var expected = ""; Assert.That(expected, Is.EqualTo(template.OuterXml), "Exactly one part with a _CustomFieldPlaceholder ref attribute should exist."); } diff --git a/Src/Common/Controls/DetailControls/DetailControlsTests/DataTreeTimingBaselineCatalog.cs b/Src/Common/Controls/DetailControls/DetailControlsTests/DataTreeTimingBaselineCatalog.cs new file mode 100644 index 0000000000..1445c6ec45 --- /dev/null +++ b/Src/Common/Controls/DetailControls/DetailControlsTests/DataTreeTimingBaselineCatalog.cs @@ -0,0 +1,167 @@ +// Copyright (c) 2026 SIL International +// This software is licensed under the LGPL, version 2.1 or later +// (http://www.gnu.org/licenses/lgpl-2.1.html) + +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Runtime.CompilerServices; +using Newtonsoft.Json; +using NUnit.Framework; +using SIL.FieldWorks.Common.RenderVerification; + +namespace SIL.FieldWorks.Common.Framework.DetailControls +{ + internal sealed class DataTreeTimingBaseline + { + public int Depth { get; set; } + public int Breadth { get; set; } + public int Slices { get; set; } + public double MaxInitMs { get; set; } + public double MaxPopulateMs { get; set; } + public double MaxTotalMs { get; set; } + public double MinDensity { get; set; } + public double MaxDensity { get; set; } + } + + internal static class DataTreeTimingBaselineCatalog + { + private const string ReportTimingBaselinesEnvVar = "FW_REPORT_TIMING_BASELINES"; + private static readonly Lazy> s_baselines = + new Lazy>(LoadBaselines); + + internal static IReadOnlyDictionary Baselines => s_baselines.Value; + + internal static string BaselineFilePath => Path.Combine(GetSourceFileDirectory(), "DataTreeTimingBaselines.json"); + + internal static void AssertMatches(string scenario, int depth, int breadth, DataTreeTimingInfo timing, double density) + { + if (!Baselines.TryGetValue(scenario, out var baseline)) + { + WriteTimingReport( + $"Missing local timing baseline for scenario '{scenario}'. " + + $"Skipping timing threshold checks. Expected file: {BaselineFilePath}"); + return; + } + + WarnIfValueDiffers(scenario, "Depth", depth, baseline.Depth); + WarnIfValueDiffers(scenario, "Breadth", breadth, baseline.Breadth); + WarnIfValueDiffers(scenario, "Slice count", timing.SliceCount, baseline.Slices); + WarnIfTimingExceedsBaseline(scenario, "Init", timing.InitializationMs, baseline.MaxInitMs); + WarnIfTimingExceedsBaseline(scenario, "Populate", timing.PopulateSlicesMs, baseline.MaxPopulateMs); + WarnIfTimingExceedsBaseline(scenario, "Total", timing.TotalMs, baseline.MaxTotalMs); + WarnIfDensityOutOfRange(scenario, density, baseline.MinDensity, baseline.MaxDensity); + } + + internal static void AssertSnapshotCoverage() + { + if (Baselines.Count == 0) + { + WriteTimingReport( + $"No local timing baselines loaded from {BaselineFilePath}. " + + "Skipping timing baseline coverage assertion."); + return; + } + + var snapshotScenarioIds = Directory + .GetFiles(GetSourceFileDirectory(), "DataTreeRenderTests.DataTreeRender_*.verified.png") + .Select(path => Path.GetFileName(path)) + .Select(name => name.Substring( + "DataTreeRenderTests.DataTreeRender_".Length, + name.Length - "DataTreeRenderTests.DataTreeRender_".Length - ".verified.png".Length)) + .OrderBy(name => name, StringComparer.Ordinal) + .ToList(); + + var missingScenarioIds = snapshotScenarioIds + .Where(id => !Baselines.ContainsKey(id)) + .ToList(); + + if (missingScenarioIds.Count > 0) + { + WriteTimingReport( + $"Committed snapshot scenarios are missing timing baselines in {BaselineFilePath}: " + + string.Join(", ", missingScenarioIds)); + } + } + + private static IReadOnlyDictionary LoadBaselines() + { + if (!File.Exists(BaselineFilePath)) + { + WriteTimingReport( + $"Timing baseline file not found at {BaselineFilePath}. " + + "Using empty baseline catalog."); + return new Dictionary(StringComparer.Ordinal); + } + + var json = File.ReadAllText(BaselineFilePath); + var baselines = JsonConvert.DeserializeObject>(json); + return baselines ?? new Dictionary(StringComparer.Ordinal); + } + + private static string GetSourceFileDirectory([CallerFilePath] string sourceFile = "") + { + return Path.GetDirectoryName(sourceFile); + } + + private static bool IsTimingReportingEnabled() + { + return string.Equals( + Environment.GetEnvironmentVariable(ReportTimingBaselinesEnvVar), + "1", + StringComparison.Ordinal); + } + + private static bool IsRunningInCi() + { + return !string.IsNullOrEmpty(Environment.GetEnvironmentVariable("CI")); + } + + private static void WarnIfTimingExceedsBaseline(string scenario, string metricName, double actualMs, double baselineMs) + { + if (actualMs <= baselineMs) + return; + + WriteTimingReport( + $"{scenario} {metricName} exceeded local baseline: " + + $"actual={actualMs:F2}ms baseline={baselineMs:F2}ms"); + } + + private static void WarnIfValueDiffers(string scenario, string metricName, int actualValue, int baselineValue) + { + if (actualValue == baselineValue) + return; + + WriteTimingReport( + $"{scenario} {metricName} differs from local baseline: " + + $"actual={actualValue} baseline={baselineValue}"); + } + + private static void WarnIfDensityOutOfRange(string scenario, double actualDensity, double minDensity, double maxDensity) + { + if (actualDensity < minDensity) + { + WriteTimingReport( + $"{scenario} rendered less content than its local timing baseline: " + + $"actual={actualDensity:F2}% min={minDensity:F2}%"); + return; + } + + if (actualDensity > maxDensity) + { + WriteTimingReport( + $"{scenario} rendered more content than its local timing baseline: " + + $"actual={actualDensity:F2}% max={maxDensity:F2}%"); + } + } + + private static void WriteTimingReport(string message) + { + if (IsRunningInCi() || !IsTimingReportingEnabled()) + return; + + TestContext.Progress.WriteLine($"[DATATREE-TIMING] {message}"); + } + } +} \ No newline at end of file diff --git a/Src/Common/Controls/DetailControls/DetailControlsTests/DetailControlsTests.csproj b/Src/Common/Controls/DetailControls/DetailControlsTests/DetailControlsTests.csproj index ced8c89b00..cfd5ff4782 100644 --- a/Src/Common/Controls/DetailControls/DetailControlsTests/DetailControlsTests.csproj +++ b/Src/Common/Controls/DetailControls/DetailControlsTests/DetailControlsTests.csproj @@ -1,11 +1,12 @@ - + DetailControlsTests SIL.FieldWorks.Common.Framework.DetailControls net48 Library - true 168,169,219,414,649,1635,1702,1701 + true + 168,169,219,414,649,1635,1702,1701 false false @@ -29,8 +30,10 @@ + + @@ -44,10 +47,12 @@ + + Properties\CommonAssemblyInfo.cs - \ No newline at end of file + diff --git a/Src/Common/Controls/DetailControls/DetailControlsTests/RenderTestAssemblySetup.cs b/Src/Common/Controls/DetailControls/DetailControlsTests/RenderTestAssemblySetup.cs new file mode 100644 index 0000000000..1188266848 --- /dev/null +++ b/Src/Common/Controls/DetailControls/DetailControlsTests/RenderTestAssemblySetup.cs @@ -0,0 +1,46 @@ +using System; +using System.Drawing.Text; +using System.Linq; +using System.Runtime.InteropServices; +using NUnit.Framework; + +namespace SIL.FieldWorks.Common.Framework.DetailControls +{ + [SetUpFixture] + public sealed class RenderTestAssemblySetup + { + private const int DpiAwarenessContextUnaware = -1; + private const string DeterministicRenderFontFamily = "Segoe UI"; + + [DllImport("User32.dll")] + private static extern bool SetProcessDpiAwarenessContext(int dpiFlag); + + [OneTimeSetUp] + public void OneTimeSetup() + { + // Force grayscale antialiasing (ANTIALIASED_QUALITY=4) for deterministic + // rendering across dev machines and CI (Windows Server 2025). + // The native VwGraphics reads this env var when creating GDI fonts. + Environment.SetEnvironmentVariable("FW_FONT_QUALITY", "4"); + + try + { + SetProcessDpiAwarenessContext(DpiAwarenessContextUnaware); + } + catch (DllNotFoundException) + { + } + catch (EntryPointNotFoundException) + { + } + + using (var installedFonts = new InstalledFontCollection()) + { + bool hasDeterministicFont = installedFonts.Families.Any( + family => string.Equals(family.Name, DeterministicRenderFontFamily, StringComparison.OrdinalIgnoreCase)); + TestContext.Progress.WriteLine( + $"[RENDER-SETUP] DPI unaware requested. Font '{DeterministicRenderFontFamily}' installed={hasDeterministicFont}"); + } + } + } +} \ No newline at end of file diff --git a/Src/Common/Controls/DetailControls/DetailControlsTests/Test.fwlayout b/Src/Common/Controls/DetailControls/DetailControlsTests/Test.fwlayout index 3684e911d3..c9eba8797f 100644 --- a/Src/Common/Controls/DetailControls/DetailControlsTests/Test.fwlayout +++ b/Src/Common/Controls/DetailControls/DetailControlsTests/Test.fwlayout @@ -24,6 +24,20 @@ + + + + + + + + + + + + + + @@ -34,9 +48,39 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -46,4 +90,8 @@ + + + + \ No newline at end of file diff --git a/Src/Common/Controls/DetailControls/DetailControlsTests/TestParts.xml b/Src/Common/Controls/DetailControls/DetailControlsTests/TestParts.xml index ab64e5f17b..66c55b8a99 100644 --- a/Src/Common/Controls/DetailControls/DetailControlsTests/TestParts.xml +++ b/Src/Common/Controls/DetailControls/DetailControlsTests/TestParts.xml @@ -4,9 +4,27 @@ + + + + + + + + + + + + + + + + + + @@ -19,6 +37,15 @@ + + + + + + + + + @@ -34,6 +61,11 @@ + + + + + diff --git a/Src/Common/Controls/DetailControls/PossibilityVectorReferenceView.cs b/Src/Common/Controls/DetailControls/PossibilityVectorReferenceView.cs index 73d00d214a..4bd5668385 100644 --- a/Src/Common/Controls/DetailControls/PossibilityVectorReferenceView.cs +++ b/Src/Common/Controls/DetailControls/PossibilityVectorReferenceView.cs @@ -321,7 +321,9 @@ public override void DisplayVec(IVwEnv vwenv, int hvo, int tag, int frag) for (int i = 0; i < count; ++i) { vwenv.AddObj(da.get_VecItem(hvo, tag, i), this, VectorReferenceView.kfragTargetObj); - vwenv.AddSeparatorBar(); + // Only add separator between items, not after the last one. + if (i < count - 1) + vwenv.AddSeparatorBar(); } vwenv.AddObj(PossibilityVectorReferenceView.khvoFake, this, VectorReferenceView.kfragTargetObj); } diff --git a/Src/Common/Controls/DetailControls/Slice.cs b/Src/Common/Controls/DetailControls/Slice.cs index 10e1b16cfe..6faaacb111 100644 --- a/Src/Common/Controls/DetailControls/Slice.cs +++ b/Src/Common/Controls/DetailControls/Slice.cs @@ -91,6 +91,12 @@ public class Slice : UserControl, IxCoreColleague protected bool m_widthHasBeenSetByDataTree = false; protected IPersistenceProvider m_persistenceProvider; + // Cached XML configuration attributes — parsed once from ConfigurationNode on first access. + // Invalidated when ConfigurationNode is re-set (rare). + private bool? m_cachedIsHeader; + private bool? m_cachedSkipSpacerLine; + private bool? m_cachedSameObject; + protected Slice m_parentSlice; private readonly SplitContainer m_splitter; @@ -285,6 +291,10 @@ public XmlNode ConfigurationNode CheckDisposed(); m_configurationNode = value; + // Invalidate cached XML attribute values. + m_cachedIsHeader = null; + m_cachedSkipSpacerLine = null; + m_cachedSameObject = null; } } @@ -417,7 +427,49 @@ public bool IsHeaderNode { CheckDisposed(); - return XmlUtils.GetOptionalAttributeValue(ConfigurationNode, "header") == "true"; + return IsHeader; + } + } + + /// + /// Cached: whether ConfigurationNode has header="true". Parsed once per ConfigurationNode. + /// + internal bool IsHeader + { + get + { + if (!m_cachedIsHeader.HasValue) + m_cachedIsHeader = XmlUtils.GetOptionalBooleanAttributeValue( + ConfigurationNode, "header", false); + return m_cachedIsHeader.Value; + } + } + + /// + /// Cached: whether ConfigurationNode has skipSpacerLine="true". Parsed once per ConfigurationNode. + /// + internal bool SkipSpacerLine + { + get + { + if (!m_cachedSkipSpacerLine.HasValue) + m_cachedSkipSpacerLine = XmlUtils.GetOptionalBooleanAttributeValue( + ConfigurationNode, "skipSpacerLine", false); + return m_cachedSkipSpacerLine.Value; + } + } + + /// + /// Cached: whether ConfigurationNode has sameObject="true". Parsed once per ConfigurationNode. + /// + internal bool SameObject + { + get + { + if (!m_cachedSameObject.HasValue) + m_cachedSameObject = XmlUtils.GetOptionalBooleanAttributeValue( + ConfigurationNode, "sameObject", false); + return m_cachedSameObject.Value; } } @@ -603,7 +655,7 @@ public bool TakeFocus(bool fOkToFocusTreeNode) { // We very possibly want to focus this node, but .NET won't let us focus it till it is visible. // Make it so. - DataTree.MakeSliceVisible(this); + ContainingDataTree.MakeSliceVisible(this); } } @@ -633,7 +685,7 @@ protected override void OnGotFocus(EventArgs e) CheckDisposed(); if (Disposing) return; - DataTree.MakeSliceVisible(this); // otherwise no change our control can take focus. + ContainingDataTree.MakeSliceVisible(this); // otherwise no change our control can take focus. base.OnGotFocus(e); if (Control != null && Control.CanFocus) Control.Focus(); @@ -839,6 +891,7 @@ public virtual void Install(DataTree parent) // REVIEW (Hasso) 2018.07: would it be better to check !parent.Controls.Contains(this)? if (!isBeingReused) { + parent.IncrementSliceInstallCreationCount(); parent.Controls.Add(this); // Parent will have to move it into the right place. parent.Slices.Add(this); } @@ -2311,14 +2364,14 @@ public Slice FocusSliceOrChild() { Slice slice = containingDT.FieldAt(i); // make it real. if (!slice.Visible) // make it visible. - DataTree.MakeSliceVisible(slice); + containingDT.MakeSliceVisible(slice); } int cslice = containingDT.Slices.Count; Slice sliceRetVal = null; for (int islice = myIndex; islice < cslice; ++islice) { Slice slice = containingDT.FieldAt(islice); - DataTree.MakeSliceVisible(slice); // otherwise it can't take focus + containingDT.MakeSliceVisible(slice); // otherwise it can't take focus if (slice.TakeFocus(false)) { sliceRetVal = slice; @@ -3278,6 +3331,13 @@ protected internal virtual void SetWidthForDataTreeLayout(int width) { CheckDisposed(); + // Fast path: if width hasn't changed and we've already been initialized, + // skip splitter resize and event handler manipulation. This avoids O(N) + // unnecessary work in HandleLayout1 when width is stable (every layout + // pass after the first). + if (m_widthHasBeenSetByDataTree && Width == width) + return; + if (Width != width) Width = width; diff --git a/Src/Common/Controls/DetailControls/SliceTreeNode.cs b/Src/Common/Controls/DetailControls/SliceTreeNode.cs index f614bf9d5e..8e7de27282 100644 --- a/Src/Common/Controls/DetailControls/SliceTreeNode.cs +++ b/Src/Common/Controls/DetailControls/SliceTreeNode.cs @@ -332,51 +332,27 @@ void HandlePaint(object sender, PaintEventArgs pea) Graphics gr = pea.Graphics; Color lineColor = Color.FromKnownColor(KnownColor.ControlDark); - using (Pen linePen = new Pen(lineColor, 1)) + using (Pen boxLinePen = new Pen(lineColor, 1)) + using (Brush backgroundBrush = new SolidBrush(Slice.ContainingDataTree.BackColor)) + using (Brush lineBrush = new SolidBrush(lineColor)) { - linePen.DashStyle = System.Drawing.Drawing2D.DashStyle.Dot; - using (Pen boxLinePen = new Pen(lineColor, 1)) - using (Brush backgroundBrush = new SolidBrush(Slice.ContainingDataTree.BackColor)) - using (Brush lineBrush = new SolidBrush(lineColor)) - { - int nIndent = Slice.Indent; - DataTree.TreeItemState tis = Slice.Expansion; - // Drawing within a control that covers the tree node portion of this slice, we always - // draw relative to a top-of-slice that is 0. I'm keeping the variable just in case - // we ever go back to drawing in the parent window. - int ypTopOfSlice = 0; - // int ypTopOfNextSlice = this.Height; // CS2019 - int iSlice = Slice.ContainingDataTree.Slices.IndexOf(Slice); - // Go through the indents. This used to draw the correct tree structure at each level. - // Now we leave out the structue, but this figures out some stuff we need if we end up - // drawing a box. This could be optimized if we really never want the tree diagram. - for (int nInd = 0; nInd <= nIndent; ++nInd) - { - // int ypTreeTop = ypTopOfSlice; // CS2019 - int xpBoxLeft = kdxpLeftMargin + nInd * kdxpIndDist; + int nIndent = Slice.Indent; + DataTree.TreeItemState tis = Slice.Expansion; + // Drawing within a control that covers the tree node portion of this slice, we always + // draw relative to a top-of-slice that is 0. I'm keeping the variable just in case + // we ever go back to drawing in the parent window. + int ypTopOfSlice = 0; + + // We intentionally do not draw connector line patterns here. + // Keep only the geometry needed to position the expand/collapse box. + int xpBoxLeft = kdxpLeftMargin + nIndent * kdxpIndDist; int xpBoxCtr = xpBoxLeft + kdxpBoxCtr; - // Enhance JohnT: 2nd argument of max should be label height. int dypBranchHeight = Slice.GetBranchHeight(); int dypLeftOver = Math.Max(kdypBoxHeight / 2, dypBranchHeight) - kdypBoxHeight / 2; int ypBoxTop = ypTopOfSlice + dypLeftOver; int ypBoxCtr = ypBoxTop + kdypBoxHeight / 2; - // int xpRtLineEnd = xpBoxCtr + kdxpLongLineLen; // CS2019 - - // There are two possible locations for the start and stop points for the - // vertical line. That will produce three different results which I have - // attempted to illustrate below. In case that's unclear they are: - // an L - shaped right angle, a T - shape rotated counter-clockwise by - // 90 degrees and an inverted L shape (i.e. flipped vertically). - // - // |_ > ypStart = top of field, ypStop = center point of +/- box. - // |- > ypStart = top of field, ypStop = bottom of field. - // | > ypStart = center point of +/- box, ypStop = bottom of field. - // - // Draw the vertical line. - bool fMoreFieldsAtLevel = (Slice.ContainingDataTree.NextFieldAtIndent(nInd, iSlice) != 0); - - // Process a terminal level with a box. - if (ShowPlusMinus && nInd == nIndent && tis != DataTree.TreeItemState.ktisFixed) + + if (ShowPlusMinus && tis != DataTree.TreeItemState.ktisFixed) { // Draw the box. Rectangle rcBox = new Rectangle(xpBoxLeft, ypBoxTop, kdxpBoxWid, kdypBoxHeight); @@ -399,7 +375,6 @@ void HandlePaint(object sender, PaintEventArgs pea) } } } - } // // If the height of the slice is greater then one line (1.5 * LabelHeight) and // // the slice has a child, then we need to draw a line to that child. (fixes a @@ -432,7 +407,6 @@ void HandlePaint(object sender, PaintEventArgs pea) // gr.DrawLine(borderPen, xIndent, yPos, this.Width, yPos); Slice.DrawLabel(ypTopOfSlice, gr, pea.ClipRectangle.Width); - } } } diff --git a/Src/Common/Controls/DetailControls/VectorReferenceView.cs b/Src/Common/Controls/DetailControls/VectorReferenceView.cs index 2d9c139faf..e7f2ec4f7b 100644 --- a/Src/Common/Controls/DetailControls/VectorReferenceView.cs +++ b/Src/Common/Controls/DetailControls/VectorReferenceView.cs @@ -858,7 +858,11 @@ public override void DisplayVec(IVwEnv vwenv, int hvo, int tag, int frag) { vwenv.AddObj(da.get_VecItem(hvo, tag, i), this, VectorReferenceView.kfragTargetObj); - vwenv.AddSeparatorBar(); + // Only add separator between items, not after the last one. + // A trailing separator draws an unwanted grey bar after the + // final item (e.g. after "Main Dictionary"). + if (i < count - 1) + vwenv.AddSeparatorBar(); } } public string TextStyle diff --git a/Src/Common/Controls/Widgets/LabeledMultiStringView.cs b/Src/Common/Controls/Widgets/LabeledMultiStringView.cs index 47073c3280..18c7b50812 100644 --- a/Src/Common/Controls/Widgets/LabeledMultiStringView.cs +++ b/Src/Common/Controls/Widgets/LabeledMultiStringView.cs @@ -150,6 +150,12 @@ protected override void Dispose(bool disposing) if (IsDisposed) return; + if (disposing && m_innerView != null) + { + m_innerView.AllowPainting = false; + m_innerView.AllowLayout = false; + } + base.Dispose(disposing); if (disposing) @@ -253,6 +259,8 @@ CoreWritingSystemDefinition WsForSoundField(ShortSoundFieldControl sc, out int w protected override void OnLayout(LayoutEventArgs levent) { base.OnLayout(levent); + if (IsDisposed || Disposing || !IsHandleCreated) + return; if (m_innerView.VC == null || m_innerView.RootBox == null) // We can come in with no rootb from a dispose call. return; if (Visible) diff --git a/Src/Common/Controls/XMLViews/XMLViewsTests/XmlBrowseViewBaseTests.cs b/Src/Common/Controls/XMLViews/XMLViewsTests/XmlBrowseViewBaseTests.cs index e68d8fa5a5..46babcaadd 100644 --- a/Src/Common/Controls/XMLViews/XMLViewsTests/XmlBrowseViewBaseTests.cs +++ b/Src/Common/Controls/XMLViews/XMLViewsTests/XmlBrowseViewBaseTests.cs @@ -75,6 +75,12 @@ public class FakeRootBox : IVwRootBox /// public XmlBrowseViewBase m_xmlBrowseViewBase; + public int ReconstructCallCount { get; private set; } + public int LastSetRootObjectHvo { get; private set; } + public IVwViewConstructor LastSetRootObjectVc { get; private set; } + public int LastSetRootObjectFrag { get; private set; } + public IVwStylesheet LastSetRootObjectStylesheet { get; private set; } + /// /// null unless manually set /// @@ -189,6 +195,12 @@ public bool IsPropChangedInProgress get { throw new NotImplementedException();} } + /// + public bool NeedsReconstruct + { + get { throw new NotImplementedException();} + } + /// public void PropChanged(int hvo, int tag, int ivMin, int cvIns, int cvDel) { @@ -210,7 +222,10 @@ public void SetRootObjects(int[] _rghvo, IVwViewConstructor[] _rgpvwvc, int[] _r /// public void SetRootObject(int hvo, IVwViewConstructor _vwvc, int frag, IVwStylesheet _ss) { - throw new NotImplementedException(); + LastSetRootObjectHvo = hvo; + LastSetRootObjectVc = _vwvc; + LastSetRootObjectFrag = frag; + LastSetRootObjectStylesheet = _ss; } /// @@ -426,7 +441,7 @@ public void PrintSinglePage(IVwPrintContext _vpc, int nPageNo) /// public bool LoseFocus() { - throw new NotImplementedException(); + return true; } /// @@ -438,7 +453,7 @@ public void Close() /// public void Reconstruct() { - throw new NotImplementedException(); + ReconstructCallCount++; } /// diff --git a/Src/Common/Controls/XMLViews/XMLViewsTests/XmlViewRefreshPolicyTests.cs b/Src/Common/Controls/XMLViews/XMLViewsTests/XmlViewRefreshPolicyTests.cs new file mode 100644 index 0000000000..76eee9143a --- /dev/null +++ b/Src/Common/Controls/XMLViews/XMLViewsTests/XmlViewRefreshPolicyTests.cs @@ -0,0 +1,185 @@ +// Copyright (c) 2026 SIL International +// This software is licensed under the LGPL, version 2.1 or later +// (http://www.gnu.org/licenses/lgpl-2.1.html) + +using NUnit.Framework; +using SIL.FieldWorks.Common.ViewsInterfaces; +using SIL.LCModel; +using SIL.LCModel.Core.KernelInterfaces; +using XCore; + +namespace XMLViewsTests +{ + internal sealed class TestXmlView : SIL.FieldWorks.Common.Controls.XmlView + { + public void InstallRootBoxForTest(IVwRootBox rootBox) + { + m_rootb = rootBox; + } + + public void InstallXmlVcForTest(SIL.FieldWorks.Common.Controls.XmlVc xmlVc) + { + m_xmlVc = xmlVc; + } + + public string LayoutNameForTest => m_layoutName; + } + + internal sealed class TestXmlSeqView : SIL.FieldWorks.Common.Controls.XmlSeqView + { + public void InstallRootBoxForTest(IVwRootBox rootBox) + { + m_rootb = rootBox; + } + + public void InstallXmlVcForTest(SIL.FieldWorks.Common.Controls.XmlVc xmlVc) + { + m_xmlVc = xmlVc; + } + + public void InstallPropertyTableForTest(PropertyTable propertyTable) + { + m_propertyTable = propertyTable; + } + } + + [TestFixture] + public class XmlViewRefreshPolicyTests : MemoryOnlyBackendProviderRestoredForEachTestTestBase + { + private static void EnsureTestInventoriesLoaded(string databaseName) + { + if (Inventory.GetInventory("layouts", databaseName) != null && + Inventory.GetInventory("parts", databaseName) != null) + { + return; + } + + var layoutKeyAttributes = new System.Collections.Generic.Dictionary(); + layoutKeyAttributes["layout"] = new[] { "class", "type", "name", "choiceGuid" }; + layoutKeyAttributes["group"] = new[] { "label" }; + layoutKeyAttributes["part"] = new[] { "ref" }; + + var layoutInventory = new Inventory("*.fwlayout", "/LayoutInventory/*", layoutKeyAttributes, "test", "nowhere"); + layoutInventory.LoadElements(Resources.Layouts_xml, 1); + Inventory.SetInventory("layouts", databaseName, layoutInventory); + + var partKeyAttributes = new System.Collections.Generic.Dictionary(); + partKeyAttributes["part"] = new[] { "id" }; + + var partInventory = new Inventory("*Parts.xml", "/PartInventory/bin/*", partKeyAttributes, "test", "nowhere"); + partInventory.LoadElements(Resources.Parts_xml, 1); + Inventory.SetInventory("parts", databaseName, partInventory); + } + + private SIL.FieldWorks.Common.Controls.XmlVc CreateConfiguredXmlVc(SIL.FieldWorks.Common.RootSites.SimpleRootSite rootSite, bool editable) + { + EnsureTestInventoriesLoaded(Cache.ProjectId.Name); + + var xmlVc = new SIL.FieldWorks.Common.Controls.XmlVc("root", editable, rootSite, null, Cache.DomainDataByFlid); + xmlVc.SetCache(Cache); + xmlVc.DataAccess = Cache.DomainDataByFlid; + return xmlVc; + } + + [Test] + public void XmlViewResetTables_ReconstructsRootBox() + { + using (var view = new TestXmlView()) + { + var rootBox = new FakeXmlBrowseViewBase.FakeRootBox(); + view.InstallRootBoxForTest(rootBox); + view.InstallXmlVcForTest(CreateConfiguredXmlVc(view, true)); + + view.ResetTables(); + + Assert.That(rootBox.ReconstructCallCount, Is.EqualTo(1)); + } + } + + [Test] + public void XmlViewResetTablesWithNewLayout_ReconstructsRootBoxAndStoresLayoutWithoutVc() + { + using (var view = new TestXmlView()) + { + var rootBox = new FakeXmlBrowseViewBase.FakeRootBox(); + view.InstallRootBoxForTest(rootBox); + + view.ResetTables("updated-layout"); + + Assert.That(rootBox.ReconstructCallCount, Is.EqualTo(1)); + Assert.That(view.LayoutNameForTest, Is.EqualTo("updated-layout")); + } + } + + [Test] + public void XmlSeqViewResetTablesWithLayout_ReconstructsRootBoxWithoutVc() + { + using (var view = new TestXmlSeqView()) + { + var rootBox = new FakeXmlBrowseViewBase.FakeRootBox(); + view.InstallRootBoxForTest(rootBox); + + view.ResetTables("updated-layout"); + + Assert.That(rootBox.ReconstructCallCount, Is.EqualTo(1)); + } + } + + [Test] + public void XmlSeqViewResetRoot_ReassignsRootObjectAndReconstructs() + { + using (var view = new TestXmlSeqView()) + { + var rootBox = new FakeXmlBrowseViewBase.FakeRootBox(); + var xmlVc = new SIL.FieldWorks.Common.Controls.XmlVc(); + view.InstallRootBoxForTest(rootBox); + view.InstallXmlVcForTest(xmlVc); + + view.ResetRoot(42); + + Assert.That(rootBox.LastSetRootObjectHvo, Is.EqualTo(42)); + Assert.That(rootBox.LastSetRootObjectVc, Is.SameAs(xmlVc)); + Assert.That(rootBox.LastSetRootObjectFrag, Is.EqualTo(view.RootFrag)); + Assert.That(rootBox.ReconstructCallCount, Is.EqualTo(1)); + } + } + + [Test] + public void XmlSeqViewOnPropertyChanged_ShowFailingItemsChange_ReconstructsRootBox() + { + using (var view = new TestXmlSeqView()) + using (var propertyTable = new PropertyTable(null)) + { + var rootBox = new FakeXmlBrowseViewBase.FakeRootBox(); + view.InstallRootBoxForTest(rootBox); + view.InstallXmlVcForTest(new SIL.FieldWorks.Common.Controls.XmlVc("root", false, view, null, (ISilDataAccess)null)); + view.InstallPropertyTableForTest(propertyTable); + propertyTable.SetProperty("currentContentControl", "tool", false); + propertyTable.SetProperty("ShowFailingItems-tool", true, false); + + view.OnPropertyChanged("ShowFailingItems-tool"); + + Assert.That(rootBox.ReconstructCallCount, Is.EqualTo(1)); + } + } + + [Test] + public void XmlSeqViewOnPropertyChanged_ShowFailingItemsUnchanged_DoesNotReconstructRootBox() + { + using (var view = new TestXmlSeqView()) + using (var propertyTable = new PropertyTable(null)) + { + var rootBox = new FakeXmlBrowseViewBase.FakeRootBox(); + view.InstallRootBoxForTest(rootBox); + view.InstallXmlVcForTest(new SIL.FieldWorks.Common.Controls.XmlVc("root", false, view, null, (ISilDataAccess)null)); + view.InstallPropertyTableForTest(propertyTable); + propertyTable.SetProperty("currentContentControl", "tool", false); + propertyTable.SetProperty("ShowFailingItems-tool", false, false); + + view.OnPropertyChanged("ShowFailingItems-tool"); + + Assert.That(rootBox.ReconstructCallCount, Is.EqualTo(0)); + } + } + } +} \ No newline at end of file diff --git a/Src/Common/RenderTestInfrastructure/RenderTestInfrastructure.csproj b/Src/Common/RenderTestInfrastructure/RenderTestInfrastructure.csproj new file mode 100644 index 0000000000..de4cb0056e --- /dev/null +++ b/Src/Common/RenderTestInfrastructure/RenderTestInfrastructure.csproj @@ -0,0 +1,74 @@ + + + + RenderTestInfrastructure + SIL.FieldWorks.Common.RenderVerification + net48 + Library + 168,169,219,414,649,1635,1702,1701 + false + false + false + + + DEBUG;TRACE + true + false + portable + + + TRACE + true + true + portable + + + + + + + + + + + + + + + + + + + RenderBenchmarkComparer.cs + + + RenderBenchmarkReportWriter.cs + + + RenderBenchmarkResults.cs + + + RenderDiagnosticsToggle.cs + + + RenderSnapshotVerifier.cs + + + RenderEnvironmentValidator.cs + + + RenderModels.cs + + + RenderScenarioDataBuilder.cs + + + RenderTraceParser.cs + + + Properties\CommonAssemblyInfo.cs + + + \ No newline at end of file diff --git a/Src/Common/RenderVerification/CompositeViewCapture.cs b/Src/Common/RenderVerification/CompositeViewCapture.cs new file mode 100644 index 0000000000..522a68490f --- /dev/null +++ b/Src/Common/RenderVerification/CompositeViewCapture.cs @@ -0,0 +1,400 @@ +// Copyright (c) 2026 SIL International +// This software is licensed under the LGPL, version 2.1 or later +// (http://www.gnu.org/licenses/lgpl-2.1.html) + +using System; +using System.Diagnostics; +using System.Drawing; +using System.Drawing.Imaging; +using System.Reflection; +using System.Windows.Forms; +using SIL.FieldWorks.Common.Framework.DetailControls; +using SIL.FieldWorks.Common.RootSites; +using SIL.FieldWorks.Common.ViewsInterfaces; + +namespace SIL.FieldWorks.Common.RenderVerification +{ + /// + /// Captures a composite bitmap from a DataTree control. This solves the fundamental problem + /// that WinForms DrawToBitmap works for standard controls (grey labels, icons, + /// splitters, section headers) but produces black rectangles for Views engine content + /// inside controls. The fix is a two-pass approach: + /// + /// Capture each slice locally via DrawToBitmap and composite it into the + /// full bitmap (gets per-slice WinForms chrome without relying on giant control coordinates) + /// Repaint DataTree-owned separator rules directly onto the bitmap, since those + /// thin gray lines are drawn by the parent control rather than by each slice + /// For each , render its RootBox via + /// VwDrawRootBuffered into the correct region, overlaying the black rectangles + /// + /// + public static class CompositeViewCapture + { + /// + /// Captures a composite bitmap of the DataTree, including both WinForms chrome + /// and Views engine rendered text. + /// + /// The populated DataTree to capture. + /// A composite bitmap. + public static Bitmap CaptureDataTree(DataTree dataTree, int captureWidth = 0) + { + if (dataTree == null) + throw new ArgumentNullException(nameof(dataTree)); + + // Initial totalHeight estimate from pre-init slice positions. + int totalHeight = CalculateTotalHeight(dataTree); + int width = captureWidth > 0 ? captureWidth : dataTree.ClientSize.Width; + + if (width <= 0 || totalHeight <= 0) + { + throw new InvalidOperationException( + $"DataTree has invalid dimensions ({width}x{totalHeight}). " + + $"Is it populated and laid out?"); + } + + // Ensure the DataTree is large enough to contain all slices + // (normally it would scroll, but we want to capture everything) + var originalSize = dataTree.ClientSize; + var originalAutoScroll = dataTree.AutoScroll; + try + { + dataTree.AutoScroll = false; + dataTree.ClientSize = new Size(width, totalHeight); + dataTree.PerformLayout(); + + // Force all slices to create handles and RootBoxes. + // PerformLayout calls HandleLayout1(fFull=true) which positions slices + // but does NOT call MakeSliceVisible (because fSliceIsVisible is always + // false on the full-layout path). Without explicit initialization here, + // ViewSlices that never received a paint-path MakeSliceVisible call would + // have null RootBoxes, and the VwDrawRootBuffered overlay in Pass 2 would + // silently skip them, leaving blank/empty field areas in the bitmap. + // + // We use the same sequence as HandleLayout1's fSliceIsVisible block: + // FieldAt(i) to convert dummies → force Handle creation on slice and its + // Control (which triggers MakeRoot via OnHandleCreated) → set Visible. + EnsureAllSlicesInitialized(dataTree); + + // Recompute height after initialization — slices may have changed + // height during BecomeRealInPlace (VwRootBox construction adjusts + // slice heights to match content). Use the content-tight height + // so the bitmap fits exactly around the rendered content without + // depending on DataTree.ClientSize.Height, which can vary based on + // WinForms internal auto-scroll state. + totalHeight = CalculateTotalHeight(dataTree); + dataTree.ClientSize = new Size(width, totalHeight); + dataTree.PerformLayout(); + + // Pass 1: Capture WinForms chrome slice-by-slice. + // A single DrawToBitmap over a very tall DataTree can drop left-side + // labels and separator lines for slices near the bottom of the image. + // Compositing each slice locally avoids that large-coordinate WinForms + // capture failure while preserving the existing root-box overlay pass. + var bitmap = new Bitmap(width, totalHeight, PixelFormat.Format32bppArgb); + CaptureSliceChrome(dataTree, bitmap); + + // Pass 2: Overlay Views engine content for each ViewSlice + OverlayViewSliceContent(dataTree, bitmap); + + // Pass 3: Repaint parent-drawn separator rules. + // These thin gray lines come from DataTree.OnPaint rather than from the + // slice controls, so the slice-by-slice pass above will not capture them. + PaintDataTreeSeparators(dataTree, bitmap, width, totalHeight); + + return bitmap; + } + finally + { + // Restore original size + dataTree.ClientSize = originalSize; + dataTree.AutoScroll = originalAutoScroll; + } + } + + /// + /// Calculates the content-tight height from slice positions. + /// Returns the bottom edge of the lowest slice, producing a bitmap + /// that fits exactly around the rendered content without padding. + /// This avoids depending on which + /// varies with WinForms auto-scroll state, form size, and other + /// non-deterministic factors. + /// + private static int CalculateTotalHeight(DataTree dataTree) + { + int maxBottom = 0; + if (dataTree.Slices != null) + { + foreach (Slice slice in dataTree.Slices) + { + int bottom = slice.Top + slice.Height; + if (bottom > maxBottom) + maxBottom = bottom; + } + } + return Math.Max(maxBottom, 1); + } + + /// + /// Deterministically initializes every slice so that ViewSlice RootBoxes + /// are fully laid out and available for the pass. + /// + /// Uses the production path which: + /// 1. Forces Handle creation (triggers OnHandleCreated → MakeRoot → VwRootBox) + /// 2. Sets AllowLayout = true (triggers PerformLayout → DoLayout → rootBox.Layout) + /// 3. Adjusts slice height to match content + /// + /// Without BecomeRealInPlace, AllowLayout remains false (set in ViewSlice.Control setter), + /// rootBox.Layout is never called, and VwDrawRootBuffered renders un-laid-out boxes + /// producing empty or clipped field content. + /// + private static void EnsureAllSlicesInitialized(DataTree dataTree) + { + if (dataTree.Slices == null) return; + + for (int i = 0; i < dataTree.Slices.Count; i++) + { + Slice slice; + try + { + // FieldAt converts dummy slices → real slices (may change Slices.Count). + slice = dataTree.FieldAt(i); + } + catch (Exception ex) + { + Trace.TraceWarning( + $"[CompositeViewCapture] FieldAt({i}) failed: {ex.Message}"); + continue; + } + if (slice == null) continue; + + try + { + // Ensure the slice has a window handle. + if (!slice.IsHandleCreated) + { + var h = slice.Handle; + } + + // Use the production initialization path (BecomeRealInPlace). + // For ViewSlice this creates the RootBox handle, sets AllowLayout = true + // (which triggers rootBox.Layout with the correct width), and adjusts + // the slice height to match the laid-out content. + if (!slice.IsRealSlice) + slice.BecomeRealInPlace(); + + // Set the slice visible (required for DrawToBitmap to include it). + if (!slice.Visible) + slice.Visible = true; + + var viewSlice = slice as ViewSlice; + if (viewSlice != null) + { + var rootSite = viewSlice.RootSite; + if (rootSite != null && rootSite.RootBox != null) + rootSite.AllowLayout = true; + } + } + catch (Exception ex) + { + Trace.TraceWarning( + $"[CompositeViewCapture] Failed to init slice '{slice.Label}' at {i}: {ex.Message}"); + } + } + + // After making all slices real and visible, run a full layout pass to + // reposition slices correctly with their updated heights. + dataTree.PerformLayout(); + } + + /// + /// Captures WinForms chrome one slice at a time and composites the result into the + /// final bitmap. This avoids whole-control DrawToBitmap failures when slice + /// coordinates become very large in tall DataTree captures. + /// + private static void CaptureSliceChrome(DataTree dataTree, Bitmap bitmap) + { + using (var mainGraphics = Graphics.FromImage(bitmap)) + { + mainGraphics.Clear(Color.White); + + if (dataTree.Slices == null) + return; + + foreach (Slice slice in dataTree.Slices) + { + if (slice == null) + continue; + + try + { + CaptureSingleSliceChrome(slice, dataTree, mainGraphics); + } + catch (Exception ex) + { + Trace.TraceWarning( + $"[CompositeViewCapture] Failed to capture slice chrome '{slice.Label}': {ex.Message}"); + } + } + } + } + + private static void CaptureSingleSliceChrome(Slice slice, DataTree dataTree, Graphics mainGraphics) + { + var sliceRect = GetControlRectRelativeTo(slice, dataTree); + if (sliceRect.Width <= 0 || sliceRect.Height <= 0) + return; + + using (var sliceBitmap = new Bitmap(sliceRect.Width, sliceRect.Height, PixelFormat.Format32bppArgb)) + { + using (var sliceGraphics = Graphics.FromImage(sliceBitmap)) + { + sliceGraphics.Clear(Color.White); + } + + slice.DrawToBitmap(sliceBitmap, new Rectangle(0, 0, sliceRect.Width, sliceRect.Height)); + mainGraphics.DrawImageUnscaled(sliceBitmap, sliceRect.Location); + } + } + + private static void PaintDataTreeSeparators(DataTree dataTree, Bitmap bitmap, int width, int totalHeight) + { + const BindingFlags privateInstance = BindingFlags.Instance | BindingFlags.NonPublic; + var paintLinesMethod = typeof(DataTree).GetMethod("PaintLinesBetweenSlices", privateInstance); + if (paintLinesMethod == null) + { + Trace.TraceWarning("[CompositeViewCapture] Could not locate DataTree.PaintLinesBetweenSlices."); + return; + } + + using (var graphics = Graphics.FromImage(bitmap)) + { + try + { + paintLinesMethod.Invoke(dataTree, new object[] + { + graphics, + new Rectangle(0, 0, width, totalHeight), + width, + }); + } + catch (TargetInvocationException ex) + { + Trace.TraceWarning( + $"[CompositeViewCapture] Failed to paint DataTree separators: {ex.InnerException?.Message ?? ex.Message}"); + } + catch (Exception ex) + { + Trace.TraceWarning( + $"[CompositeViewCapture] Failed to paint DataTree separators: {ex.Message}"); + } + } + } + + /// + /// Iterates all ViewSlice descendants and renders their RootBox content + /// via VwDrawRootBuffered into the correct region of the bitmap. + /// + private static void OverlayViewSliceContent(DataTree dataTree, Bitmap bitmap) + { + if (dataTree.Slices == null) return; + + foreach (Slice slice in dataTree.Slices) + { + var viewSlice = slice as ViewSlice; + if (viewSlice == null) continue; + + try + { + OverlaySingleViewSlice(viewSlice, dataTree, bitmap); + } + catch (Exception ex) + { + // Don't fail the entire capture for one bad slice + Trace.TraceWarning( + $"[CompositeViewCapture] Failed to overlay ViewSlice '{slice.Label}': {ex.Message}"); + } + } + } + + /// + /// Renders a single ViewSlice's RootBox into the correct region of the bitmap. + /// + /// Key insight: VwDrawRootBuffered.DrawTheRoot calls rootSite.GetGraphics() to get + /// coordinate transform rectangles (rcSrc/rcDst). GetCoordRects returns rcDst in + /// rootSite-local coordinates (origin at (HorizMargin, 0)). If we pass a clientRect + /// with the rootSite's position in the *DataTree* (e.g. X=175), VwDrawRootBuffered + /// offsets rcDst by (-175, -y), placing content at negative X — clipping it. + /// + /// Fix: render into a temporary bitmap using rootSite-local coordinates (0,0,w,h), + /// then composite the result into the main bitmap at the correct DataTree-relative position. + /// + private static void OverlaySingleViewSlice(ViewSlice viewSlice, DataTree dataTree, Bitmap bitmap) + { + RootSite rootSite = viewSlice.RootSite; + if (rootSite == null) return; + + IVwRootBox rootBox = null; + try + { + rootBox = rootSite.RootBox; + } + catch + { + return; + } + if (rootBox == null) return; + + // Where in the DataTree bitmap this rootSite should appear + var rootSiteRect = GetControlRectRelativeTo(rootSite, dataTree); + if (rootSiteRect.Width <= 0 || rootSiteRect.Height <= 0) return; + + // Render into a temp bitmap using rootSite-local coordinates. + // This matches what GetCoordRects returns (origin at the rootSite control, not + // the DataTree), so VwDrawRootBuffered produces correct content. + using (var tempBitmap = new Bitmap(rootSiteRect.Width, rootSiteRect.Height, PixelFormat.Format32bppArgb)) + { + using (var tempGraphics = Graphics.FromImage(tempBitmap)) + { + IntPtr tempHdc = tempGraphics.GetHdc(); + try + { + using (var vdrb = new SIL.FieldWorks.Views.VwDrawRootBuffered()) + { + var localRect = new Rect(0, 0, rootSiteRect.Width, rootSiteRect.Height); + const uint whiteColor = 0x00FFFFFF; + vdrb.DrawTheRoot(rootBox, tempHdc, localRect, whiteColor, true, rootSite); + } + } + finally + { + tempGraphics.ReleaseHdc(tempHdc); + } + } + + // Composite the rendered rootSite content into the main bitmap + using (var mainGraphics = Graphics.FromImage(bitmap)) + { + // Clear the area first (DrawToBitmap may have left a black rect) + mainGraphics.FillRectangle(Brushes.White, rootSiteRect); + + mainGraphics.DrawImage(tempBitmap, rootSiteRect.X, rootSiteRect.Y); + } + } + } + + /// + /// Gets the bounding rectangle of a child control relative to an ancestor control. + /// + private static Rectangle GetControlRectRelativeTo(Control child, Control ancestor) + { + var location = child.PointToScreen(Point.Empty); + var ancestorOrigin = ancestor.PointToScreen(Point.Empty); + + return new Rectangle( + location.X - ancestorOrigin.X, + location.Y - ancestorOrigin.Y, + child.Width, + child.Height); + } + } +} diff --git a/Src/Common/RenderVerification/DataTreeRenderHarness.cs b/Src/Common/RenderVerification/DataTreeRenderHarness.cs new file mode 100644 index 0000000000..714958f527 --- /dev/null +++ b/Src/Common/RenderVerification/DataTreeRenderHarness.cs @@ -0,0 +1,685 @@ +// Copyright (c) 2026 SIL International +// This software is licensed under the LGPL, version 2.1 or later +// (http://www.gnu.org/licenses/lgpl-2.1.html) + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Drawing; +using System.Drawing.Imaging; +using System.IO; +using System.Windows.Forms; +using System.Xml; +using SIL.FieldWorks.Common.Framework.DetailControls; +using SIL.FieldWorks.Common.FwUtils; +using SIL.FieldWorks.Common.RootSites; +using SIL.FieldWorks.Common.ViewsInterfaces; +using SIL.LCModel; +using XCore; + +namespace SIL.FieldWorks.Common.RenderVerification +{ + /// + /// Harness for rendering a full DataTree (the lex entry edit view with all WinForms chrome) + /// and capturing composite bitmaps that include grey labels, icons, expand/collapse buttons, + /// writing system indicators, section headers, and Views engine text content. + /// + /// + /// The DataTree is the real FLEx control that composes Slices from layout XML. + /// This harness creates one programmatically, populates it via ShowObject(), and + /// captures the result using CompositeViewCapture (DrawToBitmap + VwDrawRootBuffered overlay). + /// + public class DataTreeRenderHarness : IDisposable + { + private readonly LcmCache m_cache; + private readonly ICmObject m_rootObject; + private readonly string m_layoutName; + private readonly bool m_showHiddenFields; + + private DataTree m_dataTree; + private Mediator m_mediator; + private PropertyTable m_propertyTable; + private Form m_hostForm; + private Inventory m_layoutInventory; + private Inventory m_partInventory; + private int m_captureWidth; + private bool m_disposed; + + /// + /// Gets the number of slices populated by ShowObject. + /// + public int SliceCount => m_dataTree?.Slices?.Count ?? 0; + + /// + /// Gets the DataTree control for inspection. + /// + public DataTree DataTree => m_dataTree; + + /// + /// Gets the last captured bitmap. + /// + public Bitmap LastCapture { get; private set; } + + /// + /// Gets timing information from the last population. + /// + public DataTreeTimingInfo LastTiming { get; private set; } + + /// + /// Initializes a new instance of the class. + /// + /// The LCM data cache. + /// The root object to display (e.g. an ILexEntry). + /// The layout name (e.g. "Normal"). + public DataTreeRenderHarness(LcmCache cache, ICmObject rootObject, string layoutName = "Normal", + bool showHiddenFields = false) + { + m_cache = cache ?? throw new ArgumentNullException(nameof(cache)); + m_rootObject = rootObject ?? throw new ArgumentNullException(nameof(rootObject)); + m_layoutName = layoutName ?? "Normal"; + m_showHiddenFields = showHiddenFields; + } + + /// + /// Initializes the DataTree and populates it with slices for the root object. + /// This is the equivalent of what FLEx does when you navigate to a lex entry. + /// + /// Width of the host form in pixels. + /// Height of the host form in pixels. + /// If true, loads production layout XML from DistFiles. + /// If false, uses test layouts from DetailControlsTests (simpler but less realistic). + public void PopulateSlices(int width = 1024, int height = 768, bool useProductionLayouts = true) + { + DisposeResources(); + m_captureWidth = width; + + var stopwatch = Stopwatch.StartNew(); + + // Create XCore infrastructure required by DataTree + m_mediator = new Mediator(); + m_propertyTable = new PropertyTable(m_mediator); + + if (m_showHiddenFields) + { + var toolName = m_rootObject is ILexEntry ? "lexiconEdit" : + m_propertyTable.GetStringProperty("currentContentControl", null); + if (!string.IsNullOrEmpty(toolName)) + { + m_propertyTable.SetProperty( + "ShowHiddenFields-" + toolName, + true, + PropertyTable.SettingsGroup.LocalSettings, + false); + } + } + + // Create the DataTree + m_dataTree = new DataTree(); + m_dataTree.Init(m_mediator, m_propertyTable, null); + + // Host in a form for proper layout context. The form is shown offscreen + // (Opacity=0) after ShowObject to trigger the full slice lifecycle: + // OnPaint → HandleLayout1(fFull=false) → MakeSliceVisible → handle + // creation → MakeRoot → VwRootBox creation. + m_hostForm = new Form + { + FormBorderStyle = FormBorderStyle.None, + ShowInTaskbar = false, + ClientSize = new Size(width, height), + StartPosition = FormStartPosition.Manual, + Location = new Point(-2000, -2000) // offscreen + }; + m_hostForm.Controls.Add(m_dataTree); + m_dataTree.Dock = DockStyle.Fill; + + // Load layout inventories + if (useProductionLayouts) + { + LoadProductionInventories(); + } + else + { + LoadTestInventories(); + } + + // Set up the stylesheet + var ss = new SIL.LCModel.DomainServices.LcmStyleSheet(); + ss.Init(m_cache, m_cache.LangProject.Hvo, LangProjectTags.kflidStyles); + m_dataTree.StyleSheet = ss; + + // Strip layout parts that cause native crashes or managed exceptions in + // test context. Must be done after inventories are loaded but before + // ShowObject, which reads from the layout inventory. + if (useProductionLayouts) + { + StripProblematicLayoutParts(); + } + + // Initialize the DataTree with cache and inventories + m_dataTree.Initialize(m_cache, false, m_layoutInventory, m_partInventory); + + // Create the form handle so controls can paint. + m_hostForm.CreateControl(); + + var initMs = stopwatch.Elapsed.TotalMilliseconds; + + // Populate the slices (this is the expensive operation we want to benchmark). + // After ShowObject, slices exist but are Visible=false because CreateSlices + // checks wasVisible = this.Visible at the start, and since the form isn't + // shown, wasVisible is false and Show() is skipped at the end. + m_dataTree.ResetSliceInstallCreationCount(); + var populateStopwatch = Stopwatch.StartNew(); + try + { + m_dataTree.ShowObject(m_rootObject, m_layoutName, null, m_rootObject, true); + } + catch (ApplicationException ex) + { + // Even after stripping known problematic parts, other parts may still fail + // in the test harness because the full production stack is not loaded. + // DataTree creates slices as it encounters them, so the slices created + // before the failure are still usable for production-like snapshot capture. + Trace.TraceWarning( + $"[DataTreeRenderHarness] ShowObject partially failed (continuing with " + + $"{m_dataTree.Slices?.Count ?? 0} slices already created): {ex.Message}"); + } + populateStopwatch.Stop(); + + // Show the form to trigger the full WinForms lifecycle: + // OnLayout → HandleLayout1 positions slices but does NOT make them visible + // (fFull=true path). Only OnPaint → HandleLayout1(fFull=false) makes slices + // visible. So we need to: + // 1. Show the form (with Opacity=0 to avoid flicker) + // 2. Make the DataTree visible (CreateSlices called Hide() on it) + // 3. Pump paint messages so OnPaint fires + m_hostForm.Opacity = 0; + m_hostForm.Show(); + m_dataTree.Visible = true; + m_dataTree.Invalidate(); + System.Windows.Forms.Application.DoEvents(); + ExpandHostFormToContent(width, height); + + stopwatch.Stop(); + + LastTiming = new DataTreeTimingInfo + { + InitializationMs = initMs, + PopulateSlicesMs = populateStopwatch.Elapsed.TotalMilliseconds, + TotalMs = stopwatch.Elapsed.TotalMilliseconds, + SliceCount = m_dataTree.Slices?.Count ?? 0, + SliceInstallCreationCount = m_dataTree.SliceInstallCreationCount, + Timestamp = DateTime.UtcNow + }; + + // Collect slice diagnostics for debugging + if (m_dataTree.Slices != null) + { + for (int i = 0; i < m_dataTree.Slices.Count; i++) + { + var slice = m_dataTree.Slices[i]; + var diag = new SliceDiagnosticInfo + { + Index = i, + TypeName = slice.GetType().Name, + Label = slice.Label ?? "(null)", + Bounds = new Rectangle(slice.Location, slice.Size), + Visible = slice.Visible, + }; + // Check if it's a ViewSlice with a RootBox + var viewSlice = slice as ViewSlice; + if (viewSlice != null) + { + try { diag.HasRootBox = viewSlice.RootSite?.RootBox != null; } + catch { diag.HasRootBox = false; } + } + LastTiming.SliceDiagnostics.Add(diag); + } + } + } + + private void ExpandHostFormToContent(int width, int minimumHeight) + { + int currentHeight = Math.Max(minimumHeight, 1); + for (int pass = 0; pass < 3; pass++) + { + int requiredHeight = Math.Max(currentHeight, CalculateSliceContentHeight()); + if (requiredHeight <= currentHeight) + break; + + currentHeight = requiredHeight; + m_hostForm.ClientSize = new Size(width, currentHeight); + m_hostForm.PerformLayout(); + m_dataTree.PerformLayout(); + m_dataTree.Invalidate(); + System.Windows.Forms.Application.DoEvents(); + } + } + + private int CalculateSliceContentHeight() + { + int maxBottom = 0; + if (m_dataTree?.Slices != null) + { + foreach (Slice slice in m_dataTree.Slices) + { + if (slice == null) + continue; + + int bottom = slice.Top + slice.Height; + if (bottom > maxBottom) + maxBottom = bottom; + } + } + + return Math.Max(maxBottom, 1); + } + + /// + /// Captures the DataTree as a composite bitmap. WinForms chrome (grey labels, icons, + /// section headers, separators) is captured via DrawToBitmap; Views engine content + /// inside ViewSlices is overlaid via VwDrawRootBuffered for each RootSite. + /// + /// The composite bitmap, or null if capture failed. + public Bitmap CaptureCompositeBitmap() + { + if (m_dataTree == null) + throw new InvalidOperationException("Call PopulateSlices before capturing."); + + bool wasVisible = m_dataTree.Visible; + try + { + m_dataTree.Visible = true; + var bitmap = CompositeViewCapture.CaptureDataTree(m_dataTree, m_captureWidth); + LastCapture = bitmap; + return bitmap; + } + catch (Exception ex) + { + Trace.TraceWarning($"[DataTreeRenderHarness] Composite capture failed: {ex.Message}"); + return null; + } + finally + { + if (m_dataTree != null) + m_dataTree.Visible = wasVisible; + } + } + + /// + /// Saves the last captured bitmap to the specified path. + /// + public void SaveCapture(string outputPath, ImageFormat format = null) + { + if (LastCapture == null) + throw new InvalidOperationException("No capture available. Call CaptureCompositeBitmap first."); + + var directory = Path.GetDirectoryName(outputPath); + if (!string.IsNullOrEmpty(directory) && !Directory.Exists(directory)) + Directory.CreateDirectory(directory); + + LastCapture.Save(outputPath, format ?? ImageFormat.Png); + } + + #region Layout Inventory Loading + + /// + /// Removes part refs from the loaded layout inventory that reference slices with + /// heavy external dependencies unavailable in test context. This prevents + /// ProcessSubpartNode from throwing ApplicationException which would kill the + /// entire ApplyLayout loop and lose all subsequent parts. + /// + /// + /// Known problematic parts: + /// - "Etymologies" → SummarySlice → SummaryXmlView → native COM VwRootBox creation + /// that crashes the test host with unrecoverable native exceptions. + /// - "Messages" → MessageSlice (LexEdDll.dll) → ChorusSystem → L10NSharp. + /// Throws managed ApplicationException. + /// - "Senses", Section parts (VariantFormsSection, AlternateFormsSection, + /// GrammaticalFunctionsSection, PublicationSection) → Create complex slice + /// hierarchies with DynamicLoader, native COM Views, and expanding sections. + /// These crash the test host with unhandled native exceptions in test context + /// because the full FLEx COM infrastructure isn't initialized. + /// + private void StripProblematicLayoutParts() + { + // Parts that crash or throw in test context. This includes all parts that + // come after and including Messages in the Normal layout, since they involve + // complex slice types (Senses with recursive sub-slices, expanding sections + // with menus, DynamicLoader-loaded custom slices, etc.). + var problematicPartRefs = new HashSet(StringComparer.OrdinalIgnoreCase) + { + "Etymologies", // SummarySlice → SummaryXmlView → native COM VwRootBox + "Messages", // L10NSharp/Chorus dependency + "Senses", // Recursive sense expansion → native COM crash + "VariantFormsSection", // Expanding section → native crash + "AlternateFormsSection", // Expanding section → native crash + "GrammaticalFunctionsSection", // Expanding section → native crash + "PublicationSection" // Expanding section → native crash + }; + + // Get the LexEntry detail Normal layout node from the inventory + XmlNode layout = m_layoutInventory.GetElement("layout", + new[] { "LexEntry", "detail", m_layoutName }); + if (layout == null) + return; + + var toRemove = new List(); + foreach (XmlNode child in layout.ChildNodes) + { + if (child.NodeType != XmlNodeType.Element || child.Name != "part") + continue; + string refAttr = child.Attributes?["ref"]?.Value; + if (refAttr != null && problematicPartRefs.Contains(refAttr)) + { + toRemove.Add(child); + } + } + + foreach (var node in toRemove) + { + Trace.TraceInformation( + $"[DataTreeRenderHarness] Stripping problematic part ref=\"{node.Attributes?["ref"]?.Value}\" " + + $"from {m_layoutName} layout (external dependency not available in test context)."); + layout.RemoveChild(node); + } + } + + private void LoadProductionInventories() + { + // The production path: DistFiles/Language Explorer/Configuration/Parts/ + string partDirectory = Path.Combine(FwDirectoryFinder.FlexFolder, + Path.Combine("Configuration", "Parts")); + + if (!Directory.Exists(partDirectory)) + { + throw new DirectoryNotFoundException( + $"Production layout directory not found: {partDirectory}. " + + $"FwDirectoryFinder.FlexFolder = {FwDirectoryFinder.FlexFolder}"); + } + + // Layout inventory: keyed by class+type+name, group label, part ref + var layoutKeyAttrs = new Dictionary + { + ["layout"] = new[] { "class", "type", "name" }, + ["group"] = new[] { "label" }, + ["part"] = new[] { "ref" } + }; + m_layoutInventory = new Inventory(new[] { partDirectory }, + "*.fwlayout", "/LayoutInventory/*", layoutKeyAttrs, + "RenderVerification", Path.GetTempPath()); + + // Parts inventory: keyed by part id + var partKeyAttrs = new Dictionary + { + ["part"] = new[] { "id" } + }; + m_partInventory = new Inventory(new[] { partDirectory }, + "*Parts.xml", "/PartInventory/bin/*", partKeyAttrs, + "RenderVerification", Path.GetTempPath()); + } + + private void LoadTestInventories() + { + // Same pattern as DataTreeTests — load from DetailControlsTests test XML + string partDirectory = Path.Combine(FwDirectoryFinder.SourceDirectory, + @"Common/Controls/DetailControls/DetailControlsTests"); + + var layoutKeyAttrs = new Dictionary + { + ["layout"] = new[] { "class", "type", "name" }, + ["group"] = new[] { "label" }, + ["part"] = new[] { "ref" } + }; + m_layoutInventory = new Inventory(new[] { partDirectory }, + "*.fwlayout", "/LayoutInventory/*", layoutKeyAttrs, + "RenderVerification", Path.GetTempPath()); + + var partKeyAttrs = new Dictionary + { + ["part"] = new[] { "id" } + }; + m_partInventory = new Inventory(new[] { partDirectory }, + "*Parts.xml", "/PartInventory/bin/*", partKeyAttrs, + "RenderVerification", Path.GetTempPath()); + } + + #endregion + + #region Dispose + + private void DisposeResources() + { + if (m_hostForm != null) + { + if (m_dataTree != null) + { + m_dataTree.Enabled = false; + m_dataTree.Visible = false; + m_hostForm.Visible = false; + SuppressHostedRootSiteDrawing(m_dataTree); + DrainHostedRootBoxDrawingErrors(m_dataTree); + QuiesceHostedRootSites(m_dataTree); + m_dataTree.Reset(); + } + + m_hostForm.Close(); + m_hostForm.Dispose(); + m_hostForm = null; + } + + if (m_dataTree != null) + { + // DataTree gets disposed by form.Close since it's in Controls + m_dataTree = null; + } + + if (m_propertyTable != null) + { + m_propertyTable.Dispose(); + m_propertyTable = null; + } + + if (m_mediator != null) + { + m_mediator.Dispose(); + m_mediator = null; + } + } + + private void QuiesceHostedRootSites(DataTree dataTree) + { + var rootSites = new HashSet(); + CollectHostedRootSites(dataTree, rootSites); + foreach (var rootSite in rootSites) + QuiesceRootSite(rootSite); + } + + private void DrainHostedRootBoxDrawingErrors(DataTree dataTree) + { + var rootSites = new HashSet(); + CollectHostedRootSites(dataTree, rootSites); + foreach (var rootSite in rootSites) + DrainRootBoxDrawingErrors(rootSite); + } + + private void SuppressHostedRootSiteDrawing(DataTree dataTree) + { + var rootSites = new HashSet(); + CollectHostedRootSites(dataTree, rootSites); + foreach (var rootSite in rootSites) + SuppressRootSiteDrawing(rootSite); + } + + private void CollectHostedRootSites(DataTree dataTree, ISet rootSites) + { + if (dataTree.Slices != null) + { + foreach (Slice slice in dataTree.Slices) + { + var viewSlice = slice as ViewSlice; + if (viewSlice == null) + continue; + + try + { + var rootSite = viewSlice.RootSite; + if (rootSite != null) + rootSites.Add(rootSite); + } + catch + { + // Shutdown path only: slices may already be partially disposed. + } + } + } + + CollectRootSites(dataTree, rootSites); + } + + private void CollectRootSites(Control control, ISet rootSites) + { + if (control == null) + return; + + var rootSite = control as SimpleRootSite; + if (rootSite != null) + rootSites.Add(rootSite); + + foreach (Control child in control.Controls) + CollectRootSites(child, rootSites); + } + + private void QuiesceRootSite(SimpleRootSite rootSite) + { + try + { + SuppressRootSiteDrawing(rootSite); + rootSite.AboutToDiscard(); + rootSite.CloseRootBox(); + } + catch + { + // Shutdown path only: controls may already be partially disposed. + } + } + + private void SuppressRootSiteDrawing(SimpleRootSite rootSite) + { + try + { + rootSite.AllowPainting = false; + rootSite.AllowLayout = false; + rootSite.Visible = false; + } + catch + { + // Shutdown path only: controls may already be partially disposed. + } + } + + private void DrainRootBoxDrawingErrors(SimpleRootSite rootSite) + { + IVwRootBox rootBox = null; + try + { + rootBox = rootSite.RootBox; + } + catch + { + return; + } + + if (rootBox == null) + return; + + IVwGraphics graphics = null; + try + { + Rect sourceRectangle; + Rect destinationRectangle; + rootSite.GetGraphics(rootBox, out graphics, out sourceRectangle, out destinationRectangle); + rootBox.DrawingErrors(graphics); + } + catch (Exception ex) + { + Trace.TraceWarning( + $"[DataTreeRenderHarness] Suppressed deferred drawing error for '{rootSite.Name}': {ex.Message}"); + } + finally + { + if (graphics != null) + rootSite.ReleaseGraphics(rootBox, graphics); + } + } + + /// Releases all resources used by the harness. + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + /// Releases the unmanaged resources and optionally releases the managed resources. + protected virtual void Dispose(bool disposing) + { + if (m_disposed) return; + + if (disposing) + { + DisposeResources(); + LastCapture?.Dispose(); + LastCapture = null; + } + + m_disposed = true; + } + + #endregion + } + + /// + /// Timing information for a DataTree population operation. + /// + public class DataTreeTimingInfo + { + /// Time to create DataTree, Mediator, load inventories, and create form. + public double InitializationMs { get; set; } + + /// Time for ShowObject (slice creation and layout). + public double PopulateSlicesMs { get; set; } + + /// Total wall-clock time including initialization and population. + public double TotalMs { get; set; } + + /// Number of slices created. + public int SliceCount { get; set; } + + /// Number of slice installs that created hosted controls. + public int SliceInstallCreationCount { get; set; } + + /// Timestamp of the operation. + public DateTime Timestamp { get; set; } + + /// Diagnostic information about each slice. + public List SliceDiagnostics { get; set; } = new List(); + } + + /// + /// Diagnostic information about a single slice for debugging render capture issues. + /// + public class SliceDiagnosticInfo + { + /// Zero-based index. + public int Index { get; set; } + /// Concrete type name (e.g. ViewSlice, MultiStringSlice). + public string TypeName { get; set; } + /// Grey label text. + public string Label { get; set; } + /// Bounds in DataTree coordinates. + public Rectangle Bounds { get; set; } + /// Whether the slice is visible. + public bool Visible { get; set; } + /// Whether the slice is a ViewSlice with a RootBox. + public bool HasRootBox { get; set; } + } +} diff --git a/Src/Common/RenderVerification/RenderBenchmarkComparer.cs b/Src/Common/RenderVerification/RenderBenchmarkComparer.cs new file mode 100644 index 0000000000..20b766d6f3 --- /dev/null +++ b/Src/Common/RenderVerification/RenderBenchmarkComparer.cs @@ -0,0 +1,284 @@ +// Copyright (c) 2026 SIL International +// This software is licensed under the LGPL, version 2.1 or later +// (http://www.gnu.org/licenses/lgpl-2.1.html) + +using System; +using System.Collections.Generic; +using System.Linq; + +namespace SIL.FieldWorks.Common.RenderVerification +{ + /// + /// Compares benchmark runs to detect performance regressions. + /// + public class RenderBenchmarkComparer + { + /// + /// Gets or sets the threshold percentage for detecting cold render regressions. + /// Default is 10% (0.10). + /// + public double ColdRenderRegressionThreshold { get; set; } = 0.10; + + /// + /// Gets or sets the threshold percentage for detecting warm render regressions. + /// Default is 15% (0.15). + /// + public double WarmRenderRegressionThreshold { get; set; } = 0.15; + + /// + /// Gets or sets the minimum absolute difference (in ms) to consider a regression. + /// Avoids false positives for very fast operations. + /// + public double MinAbsoluteDifferenceMs { get; set; } = 5.0; + + /// + /// Compares two benchmark runs and identifies regressions. + /// + /// The baseline run to compare against. + /// The current run being evaluated. + /// A comparison result with regression details. + public BenchmarkComparisonResult Compare(BenchmarkRun baseline, BenchmarkRun current) + { + if (baseline == null) + throw new ArgumentNullException(nameof(baseline)); + if (current == null) + throw new ArgumentNullException(nameof(current)); + + var result = new BenchmarkComparisonResult + { + BaselineRunId = baseline.Id, + CurrentRunId = current.Id, + BaselineTimestamp = baseline.RunAt, + CurrentTimestamp = current.RunAt + }; + + // Build lookup for baseline results + var baselineByScenario = baseline.Results.ToDictionary(r => r.ScenarioId, StringComparer.OrdinalIgnoreCase); + + foreach (var currentResult in current.Results) + { + if (!baselineByScenario.TryGetValue(currentResult.ScenarioId, out var baselineResult)) + { + // New scenario, no comparison possible + result.NewScenarios.Add(currentResult.ScenarioId); + continue; + } + + // Check cold render regression + var coldDiff = currentResult.ColdRenderMs - baselineResult.ColdRenderMs; + var coldPercent = baselineResult.ColdRenderMs > 0 + ? coldDiff / baselineResult.ColdRenderMs + : 0; + + if (coldDiff > MinAbsoluteDifferenceMs && coldPercent > ColdRenderRegressionThreshold) + { + result.Regressions.Add(new RegressionInfo + { + ScenarioId = currentResult.ScenarioId, + Metric = "ColdRender", + BaselineValue = baselineResult.ColdRenderMs, + CurrentValue = currentResult.ColdRenderMs, + RegressionPercent = coldPercent * 100 + }); + } + + // Check warm render regression + var warmDiff = currentResult.WarmRenderMs - baselineResult.WarmRenderMs; + var warmPercent = baselineResult.WarmRenderMs > 0 + ? warmDiff / baselineResult.WarmRenderMs + : 0; + + if (warmDiff > MinAbsoluteDifferenceMs && warmPercent > WarmRenderRegressionThreshold) + { + result.Regressions.Add(new RegressionInfo + { + ScenarioId = currentResult.ScenarioId, + Metric = "WarmRender", + BaselineValue = baselineResult.WarmRenderMs, + CurrentValue = currentResult.WarmRenderMs, + RegressionPercent = warmPercent * 100 + }); + } + + // Check pixel validation regression (pass -> fail) + if (baselineResult.PixelPerfectPass && !currentResult.PixelPerfectPass) + { + result.PixelValidationRegressions.Add(currentResult.ScenarioId); + } + + // Track improvements (inverse of regression) + if (coldDiff < -MinAbsoluteDifferenceMs && coldPercent < -ColdRenderRegressionThreshold) + { + result.Improvements.Add(new RegressionInfo + { + ScenarioId = currentResult.ScenarioId, + Metric = "ColdRender", + BaselineValue = baselineResult.ColdRenderMs, + CurrentValue = currentResult.ColdRenderMs, + RegressionPercent = coldPercent * 100 // Negative = improvement + }); + } + + if (warmDiff < -MinAbsoluteDifferenceMs && warmPercent < -WarmRenderRegressionThreshold) + { + result.Improvements.Add(new RegressionInfo + { + ScenarioId = currentResult.ScenarioId, + Metric = "WarmRender", + BaselineValue = baselineResult.WarmRenderMs, + CurrentValue = currentResult.WarmRenderMs, + RegressionPercent = warmPercent * 100 + }); + } + } + + // Find missing scenarios (in baseline but not in current) + var currentScenarios = new HashSet(current.Results.Select(r => r.ScenarioId), StringComparer.OrdinalIgnoreCase); + result.MissingScenarios = baseline.Results + .Where(r => !currentScenarios.Contains(r.ScenarioId)) + .Select(r => r.ScenarioId) + .ToList(); + + result.HasRegressions = result.Regressions.Any() || result.PixelValidationRegressions.Any(); + result.HasImprovements = result.Improvements.Any(); + + return result; + } + + /// + /// Compares a current run against a baseline file. + /// + /// Path to the baseline results JSON file. + /// The current run. + /// The comparison result. + public BenchmarkComparisonResult CompareToBaseline(string baselineFilePath, BenchmarkRun current) + { + var baseline = BenchmarkRun.LoadFromFile(baselineFilePath); + return Compare(baseline, current); + } + + /// + /// Generates a summary report of the comparison. + /// + /// The comparison result. + /// A formatted summary string. + public string GenerateSummary(BenchmarkComparisonResult result) + { + var lines = new List + { + "# Benchmark Comparison Summary", + "", + $"**Baseline**: {result.BaselineRunId} ({result.BaselineTimestamp:u})", + $"**Current**: {result.CurrentRunId} ({result.CurrentTimestamp:u})", + "" + }; + + if (result.HasRegressions) + { + lines.Add("## ⚠️ Regressions Detected"); + lines.Add(""); + + foreach (var reg in result.Regressions) + { + lines.Add($"- **{reg.ScenarioId}** ({reg.Metric}): {reg.BaselineValue:F2}ms → {reg.CurrentValue:F2}ms (+{reg.RegressionPercent:F1}%)"); + } + + if (result.PixelValidationRegressions.Any()) + { + lines.Add(""); + lines.Add("### Pixel Validation Failures"); + foreach (var scenario in result.PixelValidationRegressions) + { + lines.Add($"- {scenario}"); + } + } + + lines.Add(""); + } + + if (result.HasImprovements) + { + lines.Add("## ✅ Improvements"); + lines.Add(""); + + foreach (var imp in result.Improvements) + { + lines.Add($"- **{imp.ScenarioId}** ({imp.Metric}): {imp.BaselineValue:F2}ms → {imp.CurrentValue:F2}ms ({imp.RegressionPercent:F1}%)"); + } + + lines.Add(""); + } + + if (!result.HasRegressions && !result.HasImprovements) + { + lines.Add("## ✅ No Significant Changes"); + lines.Add(""); + lines.Add("All scenarios are within acceptable tolerance."); + lines.Add(""); + } + + if (result.NewScenarios.Any()) + { + lines.Add("## New Scenarios (no baseline)"); + lines.Add(""); + foreach (var scenario in result.NewScenarios) + { + lines.Add($"- {scenario}"); + } + lines.Add(""); + } + + if (result.MissingScenarios.Any()) + { + lines.Add("## Missing Scenarios (in baseline, not in current)"); + lines.Add(""); + foreach (var scenario in result.MissingScenarios) + { + lines.Add($"- {scenario}"); + } + lines.Add(""); + } + + return string.Join(Environment.NewLine, lines); + } + } + + /// + /// Contains the result of comparing two benchmark runs. + /// + public class BenchmarkComparisonResult + { + /// Gets or sets the baseline run identifier. + public string BaselineRunId { get; set; } + + /// Gets or sets the current run identifier. + public string CurrentRunId { get; set; } + + /// Gets or sets the baseline timestamp. + public DateTime BaselineTimestamp { get; set; } + + /// Gets or sets the current timestamp. + public DateTime CurrentTimestamp { get; set; } + + /// Gets or sets whether any regressions were detected. + public bool HasRegressions { get; set; } + + /// Gets or sets whether any improvements were detected. + public bool HasImprovements { get; set; } + + /// Gets or sets the list of timing regressions. + public List Regressions { get; set; } = new List(); + + /// Gets or sets the list of timing improvements. + public List Improvements { get; set; } = new List(); + + /// Gets or sets scenarios that failed pixel validation but previously passed. + public List PixelValidationRegressions { get; set; } = new List(); + + /// Gets or sets new scenarios not in baseline. + public List NewScenarios { get; set; } = new List(); + + /// Gets or sets scenarios in baseline but missing from current. + public List MissingScenarios { get; set; } = new List(); + } +} diff --git a/Src/Common/RenderVerification/RenderBenchmarkReportWriter.cs b/Src/Common/RenderVerification/RenderBenchmarkReportWriter.cs new file mode 100644 index 0000000000..4ad928f29d --- /dev/null +++ b/Src/Common/RenderVerification/RenderBenchmarkReportWriter.cs @@ -0,0 +1,328 @@ +// Copyright (c) 2026 SIL International +// This software is licensed under the LGPL, version 2.1 or later +// (http://www.gnu.org/licenses/lgpl-2.1.html) + +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; + +namespace SIL.FieldWorks.Common.RenderVerification +{ + /// + /// Generates summary reports for benchmark runs. + /// Outputs results in JSON and Markdown formats. + /// + public class RenderBenchmarkReportWriter + { + private readonly RenderBenchmarkComparer m_comparer; + private readonly RenderTraceParser m_traceParser; + + /// + /// Gets or sets the output directory for reports. + /// + public string OutputDirectory { get; set; } + + /// + /// Initializes a new instance of the class. + /// + /// The output directory for reports. + public RenderBenchmarkReportWriter(string outputDirectory = null) + { + OutputDirectory = outputDirectory ?? RenderDiagnosticsToggle.DefaultOutputDirectory; + m_comparer = new RenderBenchmarkComparer(); + m_traceParser = new RenderTraceParser(); + + if (!Directory.Exists(OutputDirectory)) + { + Directory.CreateDirectory(OutputDirectory); + } + } + + /// + /// Writes a complete benchmark run to JSON and Markdown files. + /// + /// The benchmark run to write. + /// Optional baseline run for comparison. + public void WriteReport(BenchmarkRun run, BenchmarkRun baselineRun = null) + { + if (run == null) + throw new ArgumentNullException(nameof(run)); + + // Generate summary if not present + if (run.Summary == null) + { + run.Summary = GenerateSummary(run); + } + + // Compare to baseline if provided + BenchmarkComparisonResult comparison = null; + if (baselineRun != null) + { + comparison = m_comparer.Compare(baselineRun, run); + run.Summary.HasRegressions = comparison.HasRegressions; + run.Summary.Regressions = comparison.Regressions; + } + + // Write JSON results + var jsonPath = Path.Combine(OutputDirectory, "results.json"); + run.SaveToFile(jsonPath); + + // Write Markdown summary + var markdownPath = Path.Combine(OutputDirectory, "summary.md"); + WriteSummaryMarkdown(run, comparison, markdownPath); + } + + /// + /// Generates an analysis summary for a benchmark run. + /// + /// The benchmark run. + /// The generated summary. + public AnalysisSummary GenerateSummary(BenchmarkRun run) + { + var summary = new AnalysisSummary + { + RunId = run.Id, + TotalScenarios = run.Results.Count, + PassingScenarios = run.Results.Count(r => r.PixelPerfectPass), + FailingScenarios = run.Results.Count(r => !r.PixelPerfectPass) + }; + + // Calculate averages + if (run.Results.Any()) + { + summary.AverageColdRenderMs = run.Results.Average(r => r.ColdRenderMs); + summary.AverageWarmRenderMs = run.Results.Average(r => r.WarmRenderMs); + summary.AverageColdPerformOffscreenLayoutMs = run.Results.Average(r => r.ColdPerformOffscreenLayoutMs); + summary.AverageWarmPerformOffscreenLayoutMs = run.Results.Average(r => r.WarmPerformOffscreenLayoutMs); + } + + // Aggregate trace events for top contributors + var allTraceEvents = run.Results + .Where(r => r.TraceEvents != null) + .SelectMany(r => r.TraceEvents) + .ToList(); + + if (allTraceEvents.Any()) + { + summary.StageBreakdown = m_traceParser + .AggregateByStage(allTraceEvents) + .Values + .OrderByDescending(s => s.TotalDurationMs) + .Select(s => new StageBreakdown + { + Stage = s.Stage, + Calls = s.Count, + TotalDurationMs = s.TotalDurationMs, + AverageDurationMs = s.AverageDurationMs, + MinDurationMs = s.MinDurationMs, + MaxDurationMs = s.MaxDurationMs + }) + .ToList(); + + summary.TopContributors = m_traceParser.GetTopContributors(allTraceEvents, count: 5); + } + + // Generate recommendations + summary.Recommendations = GenerateRecommendations(run, summary); + + return summary; + } + + /// + /// Writes the summary in Markdown format. + /// + /// The benchmark run. + /// Optional comparison result. + /// The output file path. + public void WriteSummaryMarkdown(BenchmarkRun run, BenchmarkComparisonResult comparison, string outputPath) + { + var sb = new StringBuilder(); + + sb.AppendLine("# Render Benchmark Summary"); + sb.AppendLine(); + sb.AppendLine($"**Run ID**: {run.Id}"); + sb.AppendLine($"**Timestamp**: {run.RunAt:u}"); + sb.AppendLine($"**Machine**: {run.MachineName}"); + sb.AppendLine($"**Configuration**: {run.Configuration ?? "Debug"}"); + sb.AppendLine($"**Environment Hash**: `{run.EnvironmentHash}`"); + sb.AppendLine(); + + if (run.FeatureFlags?.Any() == true) + { + sb.AppendLine("## Feature Flags"); + sb.AppendLine(); + foreach (var flag in run.FeatureFlags.OrderBy(kvp => kvp.Key)) + { + sb.AppendLine($"- **{flag.Key}**: {flag.Value}"); + } + sb.AppendLine(); + } + + // Overall Status + var summary = run.Summary; + if (summary != null) + { + var statusIcon = summary.FailingScenarios == 0 ? "✅" : "⚠️"; + sb.AppendLine($"## Status {statusIcon}"); + sb.AppendLine(); + sb.AppendLine($"- **Total Scenarios**: {summary.TotalScenarios}"); + sb.AppendLine($"- **Passing**: {summary.PassingScenarios}"); + sb.AppendLine($"- **Failing**: {summary.FailingScenarios}"); + sb.AppendLine($"- **Avg Cold Render**: {summary.AverageColdRenderMs:F2}ms"); + sb.AppendLine($"- **Avg Warm Render**: {summary.AverageWarmRenderMs:F2}ms"); + sb.AppendLine($"- **Avg Cold PerformOffscreenLayout**: {summary.AverageColdPerformOffscreenLayoutMs:F2}ms"); + sb.AppendLine($"- **Avg Warm PerformOffscreenLayout**: {summary.AverageWarmPerformOffscreenLayoutMs:F2}ms"); + sb.AppendLine(); + } + + // Regression Status + if (comparison != null) + { + if (comparison.HasRegressions) + { + sb.AppendLine("## ⚠️ Regressions Detected"); + sb.AppendLine(); + foreach (var reg in comparison.Regressions) + { + sb.AppendLine($"- **{reg.ScenarioId}** ({reg.Metric}): {reg.BaselineValue:F2}ms → {reg.CurrentValue:F2}ms (+{reg.RegressionPercent:F1}%)"); + } + sb.AppendLine(); + } + + if (comparison.HasImprovements) + { + sb.AppendLine("## ✅ Improvements"); + sb.AppendLine(); + foreach (var imp in comparison.Improvements) + { + sb.AppendLine($"- **{imp.ScenarioId}** ({imp.Metric}): {imp.BaselineValue:F2}ms → {imp.CurrentValue:F2}ms ({imp.RegressionPercent:F1}%)"); + } + sb.AppendLine(); + } + } + + // Scenario Details Table + sb.AppendLine("## Scenario Results"); + sb.AppendLine(); + sb.AppendLine("| Scenario | Cold (ms) | Warm (ms) | Cold Layout (ms) | Warm Layout (ms) | Pixel Pass | Variance |"); + sb.AppendLine("|----------|-----------|-----------|------------------|------------------|------------|----------|"); + + foreach (var result in run.Results.OrderBy(r => r.ScenarioId)) + { + var passIcon = result.PixelPerfectPass ? "✅" : "❌"; + sb.AppendLine($"| {result.ScenarioId} | {result.ColdRenderMs:F2} | {result.WarmRenderMs:F2} | {result.ColdPerformOffscreenLayoutMs:F2} | {result.WarmPerformOffscreenLayoutMs:F2} | {passIcon} | {result.VariancePercent:F1}% |"); + } + sb.AppendLine(); + + // Top Contributors + if (summary?.TopContributors?.Any() == true) + { + sb.AppendLine("## Top Time Contributors"); + sb.AppendLine(); + sb.AppendLine("| Stage | Avg Duration (ms) | Share % |"); + sb.AppendLine("|-------|-------------------|---------|"); + + foreach (var contributor in summary.TopContributors) + { + sb.AppendLine($"| {contributor.Stage} | {contributor.AverageDurationMs:F2} | {contributor.SharePercent:F1}% |"); + } + sb.AppendLine(); + } + + if (summary?.StageBreakdown?.Any() == true) + { + sb.AppendLine("## Stage Breakdown"); + sb.AppendLine(); + sb.AppendLine("| Stage | Calls | Total (ms) | Avg (ms) | Min (ms) | Max (ms) |"); + sb.AppendLine("|-------|------:|-----------:|---------:|---------:|---------:|"); + + foreach (var stage in summary.StageBreakdown) + { + sb.AppendLine($"| {stage.Stage} | {stage.Calls} | {stage.TotalDurationMs:F2} | {stage.AverageDurationMs:F2} | {stage.MinDurationMs:F2} | {stage.MaxDurationMs:F2} |"); + } + sb.AppendLine(); + } + + // Recommendations + if (summary?.Recommendations?.Any() == true) + { + sb.AppendLine("## Recommendations"); + sb.AppendLine(); + foreach (var rec in summary.Recommendations) + { + sb.AppendLine($"- {rec}"); + } + sb.AppendLine(); + } + + // Write to file + File.WriteAllText(outputPath, sb.ToString(), Encoding.UTF8); + } + + /// + /// Writes a comparison report between baseline and current run. + /// + /// Path to the baseline results JSON. + /// The current benchmark run. + /// The output path for the comparison report. + public void WriteComparisonReport(string baselineFilePath, BenchmarkRun current, string outputPath = null) + { + var baseline = BenchmarkRun.LoadFromFile(baselineFilePath); + var comparison = m_comparer.Compare(baseline, current); + + outputPath = outputPath ?? Path.Combine(OutputDirectory, "comparison.md"); + var content = m_comparer.GenerateSummary(comparison); + File.WriteAllText(outputPath, content, Encoding.UTF8); + } + + private List GenerateRecommendations(BenchmarkRun run, AnalysisSummary summary) + { + var recommendations = new List(); + + // Check for high cold/warm ratio + if (summary.AverageColdRenderMs > 0 && summary.AverageWarmRenderMs > 0) + { + var ratio = summary.AverageColdRenderMs / summary.AverageWarmRenderMs; + if (ratio > 5) + { + recommendations.Add("High cold/warm ratio suggests initialization overhead. Consider lazy loading or caching."); + } + } + + // Check for failing scenarios + if (summary.FailingScenarios > 0) + { + recommendations.Add($"Fix {summary.FailingScenarios} failing pixel-perfect validation(s) before optimizing."); + } + + // Check for high variance + var highVarianceScenarios = run.Results.Where(r => r.VariancePercent > 10).ToList(); + if (highVarianceScenarios.Any()) + { + recommendations.Add($"{highVarianceScenarios.Count} scenario(s) have >10% variance. Consider more test iterations or environment stabilization."); + } + + // Check top contributors for optimization opportunities + if (summary.TopContributors?.Any() == true) + { + var topStage = summary.TopContributors.First(); + if (topStage.SharePercent > 40) + { + recommendations.Add($"'{topStage.Stage}' contributes {topStage.SharePercent:F1}% of render time. Prioritize optimization here."); + } + } + + // Default recommendations if none generated + if (!recommendations.Any()) + { + recommendations.Add("No immediate optimization targets identified. Consider profiling deeper stages."); + recommendations.Add("Enable trace diagnostics for detailed stage-level timing."); + recommendations.Add("Review lazy expansion patterns for complex/deep-nested scenarios."); + } + + return recommendations; + } + } +} diff --git a/Src/Common/RenderVerification/RenderBenchmarkResults.cs b/Src/Common/RenderVerification/RenderBenchmarkResults.cs new file mode 100644 index 0000000000..318a556238 --- /dev/null +++ b/Src/Common/RenderVerification/RenderBenchmarkResults.cs @@ -0,0 +1,271 @@ +// Copyright (c) 2026 SIL International +// This software is licensed under the LGPL, version 2.1 or later +// (http://www.gnu.org/licenses/lgpl-2.1.html) + +using System; +using System.Collections.Generic; +using System.IO; +using System.Text; +using Newtonsoft.Json; +using Newtonsoft.Json.Converters; + +namespace SIL.FieldWorks.Common.RenderVerification +{ + /// + /// Contains the full results of a benchmark run including all scenario timings. + /// + public class BenchmarkRun + { + /// Gets or sets the unique run identifier. + public string Id { get; set; } = Guid.NewGuid().ToString("N"); + + /// Gets or sets the run timestamp. + public DateTime RunAt { get; set; } = DateTime.UtcNow; + + /// Gets or sets the build configuration (Debug/Release). + public string Configuration { get; set; } + + /// Gets or sets the environment hash for deterministic validation. + public string EnvironmentHash { get; set; } + + /// Gets or sets the machine name. + public string MachineName { get; set; } = Environment.MachineName; + + /// Gets or sets the active performance feature-flag states for this run. + public Dictionary FeatureFlags { get; set; } = new Dictionary(); + + /// Gets or sets the list of scenario results. + public List Results { get; set; } = new List(); + + /// Gets or sets the analysis summary. + public AnalysisSummary Summary { get; set; } + + /// + /// Saves the benchmark run to a JSON file. + /// + /// The output file path. + public void SaveToFile(string outputPath) + { + var directory = Path.GetDirectoryName(outputPath); + if (!string.IsNullOrEmpty(directory) && !Directory.Exists(directory)) + { + Directory.CreateDirectory(directory); + } + + var settings = new JsonSerializerSettings + { + Formatting = Formatting.Indented, + NullValueHandling = NullValueHandling.Ignore, + Converters = { new StringEnumConverter() } + }; + + var json = JsonConvert.SerializeObject(this, settings); + File.WriteAllText(outputPath, json, Encoding.UTF8); + } + + /// + /// Loads a benchmark run from a JSON file. + /// + /// The input file path. + /// The loaded benchmark run. + public static BenchmarkRun LoadFromFile(string inputPath) + { + if (!File.Exists(inputPath)) + throw new FileNotFoundException("Benchmark results file not found.", inputPath); + + var json = File.ReadAllText(inputPath, Encoding.UTF8); + return JsonConvert.DeserializeObject(json); + } + } + + /// + /// Contains the timing and validation results for a single scenario. + /// + public class BenchmarkResult + { + /// Gets or sets the scenario identifier. + public string ScenarioId { get; set; } + + /// Gets or sets the scenario description. + public string ScenarioDescription { get; set; } + + /// Gets or sets the cold render duration in milliseconds. + public double ColdRenderMs { get; set; } + + /// Gets or sets the warm render duration in milliseconds. + public double WarmRenderMs { get; set; } + + /// Gets or sets the total cold-phase PerformOffscreenLayout duration in milliseconds. + public double ColdPerformOffscreenLayoutMs { get; set; } + + /// Gets or sets the total warm-phase PerformOffscreenLayout duration in milliseconds. + public double WarmPerformOffscreenLayoutMs { get; set; } + + /// Gets or sets the variance percentage across multiple runs. + public double VariancePercent { get; set; } + + /// Gets or sets whether the pixel-perfect validation passed. + public bool PixelPerfectPass { get; set; } + + /// Gets or sets the mismatch details if validation failed. + public string MismatchDetails { get; set; } + + /// Gets or sets the snapshot path used for comparison. + public string SnapshotPath { get; set; } + + /// Gets or sets the trace events for this scenario (if diagnostics enabled). + public List TraceEvents { get; set; } + } + + /// + /// Captures a single rendering stage trace event. + /// + public class TraceEvent + { + /// Gets or sets the rendering stage name. + public string Stage { get; set; } + + /// Gets or sets the stage start time (relative to render start). + public double StartTimeMs { get; set; } + + /// Gets or sets the stage duration in milliseconds. + public double DurationMs { get; set; } + + /// Gets or sets additional context metadata. + public Dictionary Context { get; set; } + } + + /// + /// Summarizes the benchmark run with top contributors and recommendations. + /// + public class AnalysisSummary + { + /// Gets or sets the benchmark run identifier. + public string RunId { get; set; } + + /// Gets or sets the total scenarios executed. + public int TotalScenarios { get; set; } + + /// Gets or sets the number of passing scenarios. + public int PassingScenarios { get; set; } + + /// Gets or sets the number of failing scenarios. + public int FailingScenarios { get; set; } + + /// Gets or sets the average cold render time across scenarios. + public double AverageColdRenderMs { get; set; } + + /// Gets or sets the average warm render time across scenarios. + public double AverageWarmRenderMs { get; set; } + + /// Gets or sets the average cold-phase PerformOffscreenLayout time across scenarios. + public double AverageColdPerformOffscreenLayoutMs { get; set; } + + /// Gets or sets the average warm-phase PerformOffscreenLayout time across scenarios. + public double AverageWarmPerformOffscreenLayoutMs { get; set; } + + /// Gets or sets the top time contributors by stage. + public List TopContributors { get; set; } = new List(); + + /// Gets or sets aggregated per-stage timing and call statistics. + public List StageBreakdown { get; set; } = new List(); + + /// Gets or sets optimization recommendations. + public List Recommendations { get; set; } = new List(); + + /// Gets or sets whether any regressions were detected compared to baseline. + public bool HasRegressions { get; set; } + + /// Gets or sets regression details if any were detected. + public List Regressions { get; set; } = new List(); + } + + /// + /// Represents a ranked timing contributor. + /// + public class Contributor + { + /// Gets or sets the rendering stage name. + public string Stage { get; set; } + + /// Gets or sets the average duration in milliseconds. + public double AverageDurationMs { get; set; } + + /// Gets or sets the percentage share of total render time. + public double SharePercent { get; set; } + } + + /// + /// Aggregated timing metrics for a single stage/function. + /// + public class StageBreakdown + { + /// Gets or sets the stage/function name. + public string Stage { get; set; } + + /// Gets or sets how many times the stage executed. + public int Calls { get; set; } + + /// Gets or sets total duration for the stage across all calls. + public double TotalDurationMs { get; set; } + + /// Gets or sets average duration per call. + public double AverageDurationMs { get; set; } + + /// Gets or sets minimum observed call duration. + public double MinDurationMs { get; set; } + + /// Gets or sets maximum observed call duration. + public double MaxDurationMs { get; set; } + } + + /// + /// Contains information about a detected regression. + /// + public class RegressionInfo + { + /// Gets or sets the scenario identifier. + public string ScenarioId { get; set; } + + /// Gets or sets the metric that regressed. + public string Metric { get; set; } + + /// Gets or sets the baseline value. + public double BaselineValue { get; set; } + + /// Gets or sets the current value. + public double CurrentValue { get; set; } + + /// Gets or sets the regression percentage. + public double RegressionPercent { get; set; } + } + + /// + /// Configuration flags for benchmark execution. + /// + public class BenchmarkFlags + { + /// Gets or sets whether diagnostics logging is enabled. + public bool DiagnosticsEnabled { get; set; } + + /// Gets or sets whether trace output is enabled. + public bool TraceEnabled { get; set; } + + /// Gets or sets the capture mode (DrawToBitmap, etc.). + public string CaptureMode { get; set; } = "DrawToBitmap"; + + /// + /// Loads flags from a JSON file. + /// + /// The flags file path. + /// The loaded flags, or defaults if file not found. + public static BenchmarkFlags LoadFromFile(string path) + { + if (!File.Exists(path)) + return new BenchmarkFlags(); + + var json = File.ReadAllText(path, Encoding.UTF8); + return JsonConvert.DeserializeObject(json) ?? new BenchmarkFlags(); + } + } +} diff --git a/Src/Common/RenderVerification/RenderDiagnosticsToggle.cs b/Src/Common/RenderVerification/RenderDiagnosticsToggle.cs new file mode 100644 index 0000000000..7a7dd10b62 --- /dev/null +++ b/Src/Common/RenderVerification/RenderDiagnosticsToggle.cs @@ -0,0 +1,355 @@ +// Copyright (c) 2026 SIL International +// This software is licensed under the LGPL, version 2.1 or later +// (http://www.gnu.org/licenses/lgpl-2.1.html) + +using System; +using System.Diagnostics; +using System.IO; +using System.Text; +using Newtonsoft.Json; + +namespace SIL.FieldWorks.Common.RenderVerification +{ + /// + /// Manages the diagnostics and trace output toggle for render benchmarks. + /// Provides methods to enable/disable trace output and configure trace listeners. + /// + public class RenderDiagnosticsToggle : IDisposable + { + private const string TraceListenerName = "RenderBenchmark"; + private static readonly object s_traceListenerSync = new object(); + private static TextWriterTraceListener s_sharedTraceListener; + private static StreamWriter s_sharedTraceWriter; + private static int s_sharedTraceListenerRefCount; + private readonly string m_flagsFilePath; + private readonly string m_traceLogPath; + private TextWriterTraceListener m_traceListener; + private StreamWriter m_traceWriter; + private bool m_disposed; + private bool m_originalDiagnosticsState; + + /// + /// Gets whether diagnostics are currently enabled. + /// + public bool DiagnosticsEnabled { get; private set; } + + /// + /// Gets whether trace output is currently enabled. + /// + public bool TraceEnabled { get; private set; } + + /// + /// Gets the path to the trace log file. + /// + public string TraceLogPath => m_traceLogPath; + + /// + /// Gets the default output directory for benchmark artifacts. + /// + public static string DefaultOutputDirectory => Path.Combine( + AppDomain.CurrentDomain.BaseDirectory, + "..", + "..", + "..", + "Output", + "RenderBenchmarks"); + + /// + /// Initializes a new instance of the class. + /// + /// Path to the flags JSON file. + /// Path for trace log output. + public RenderDiagnosticsToggle(string flagsFilePath = null, string traceLogPath = null) + { + m_flagsFilePath = flagsFilePath ?? RenderScenarioDataBuilder.DefaultFlagsPath; + m_traceLogPath = traceLogPath ?? Path.Combine( + DefaultOutputDirectory, + "render-trace.log"); + + LoadFlags(); + } + + /// + /// Enables diagnostics and trace output. + /// + /// Whether to persist the change to the flags file. + public void EnableDiagnostics(bool persist = false) + { + ApplyDiagnosticsState(enabled: true, persist: persist); + } + + /// + /// Disables diagnostics and trace output. + /// + /// Whether to persist the change to the flags file. + public void DisableDiagnostics(bool persist = false) + { + ApplyDiagnosticsState(enabled: false, persist: persist); + } + + /// + /// Restores the original diagnostics state before Enable/Disable was called. + /// + public void RestoreOriginalState() + { + ApplyDiagnosticsState(enabled: m_originalDiagnosticsState, persist: false); + } + + /// + /// Writes a render trace entry to the trace log. + /// + /// The rendering stage name. + /// The stage duration in milliseconds. + /// Optional context information. + public void WriteTraceEntry(string stage, double durationMs, string context = null) + { + if (!TraceEnabled) + return; + + var timestamp = DateTime.UtcNow.ToString("yyyy-MM-ddTHH:mm:ss.fff"); + var contextPart = string.IsNullOrEmpty(context) ? "" : $" Context={context}"; + var entry = $"[{timestamp}] [RENDER] Stage={stage} Duration={durationMs:F3}ms{contextPart}"; + + Trace.WriteLine(entry); + } + + /// + /// Writes an informational message to the trace log. + /// + /// The message to write. + public void WriteInfo(string message) + { + if (!DiagnosticsEnabled) + return; + + var timestamp = DateTime.UtcNow.ToString("yyyy-MM-ddTHH:mm:ss.fff"); + Trace.WriteLine($"[{timestamp}] [INFO] {message}"); + } + + /// + /// Writes a warning message to the trace log. + /// + /// The warning message. + public void WriteWarning(string message) + { + if (!DiagnosticsEnabled) + return; + + var timestamp = DateTime.UtcNow.ToString("yyyy-MM-ddTHH:mm:ss.fff"); + Trace.TraceWarning($"[{timestamp}] [WARN] {message}"); + } + + /// + /// Flushes any buffered trace output. + /// + public void Flush() + { + m_traceListener?.Flush(); + m_traceWriter?.Flush(); + Trace.Flush(); + } + + /// + /// Gets the contents of the trace log file. + /// + /// The trace log content, or empty string if not available. + public string GetTraceLogContent() + { + Flush(); + + if (!File.Exists(m_traceLogPath)) + return string.Empty; + + try + { + // Need to read without locking since we may still have the file open + using (var stream = new FileStream( + m_traceLogPath, + FileMode.Open, + FileAccess.Read, + FileShare.ReadWrite)) + using (var reader = new StreamReader(stream)) + { + return reader.ReadToEnd(); + } + } + catch + { + return string.Empty; + } + } + + /// + /// Clears the trace log file. + /// + public void ClearTraceLog() + { + RemoveTraceListener(); + + if (File.Exists(m_traceLogPath)) + { + try + { + File.Delete(m_traceLogPath); + } + catch + { + // Ignore deletion errors + } + } + + if (TraceEnabled) + { + SetupTraceListener(); + } + } + + private void LoadFlags() + { + var flags = BenchmarkFlags.LoadFromFile(m_flagsFilePath); + DiagnosticsEnabled = flags.DiagnosticsEnabled; + TraceEnabled = flags.TraceEnabled; + m_originalDiagnosticsState = DiagnosticsEnabled; + + if (TraceEnabled) + { + SetupTraceListener(); + } + } + + private void SaveFlags() + { + var flags = new BenchmarkFlags + { + DiagnosticsEnabled = DiagnosticsEnabled, + TraceEnabled = TraceEnabled, + CaptureMode = "DrawToBitmap" + }; + + var directory = Path.GetDirectoryName(m_flagsFilePath); + if (!string.IsNullOrEmpty(directory) && !Directory.Exists(directory)) + { + Directory.CreateDirectory(directory); + } + + var json = JsonConvert.SerializeObject(flags, Formatting.Indented); + File.WriteAllText(m_flagsFilePath, json, Encoding.UTF8); + } + + private void ApplyDiagnosticsState(bool enabled, bool persist) + { + DiagnosticsEnabled = enabled; + TraceEnabled = enabled; + + if (persist) + { + SaveFlags(); + } + + if (enabled) + { + SetupTraceListener(); + } + else + { + RemoveTraceListener(); + } + } + + private void SetupTraceListener() + { + lock (s_traceListenerSync) + { + if (m_traceListener != null) + return; // Already set up + + // Trace.Listeners is process-wide. Share a single render benchmark + // listener so multiple toggle instances do not duplicate log entries. + if (s_sharedTraceListener == null) + { + var existingListener = Trace.Listeners[TraceListenerName]; + if (existingListener != null) + { + Trace.Listeners.Remove(existingListener); + existingListener.Dispose(); + } + + var directory = Path.GetDirectoryName(m_traceLogPath); + if (!string.IsNullOrEmpty(directory) && !Directory.Exists(directory)) + { + Directory.CreateDirectory(directory); + } + + s_sharedTraceWriter = new StreamWriter( + m_traceLogPath, + append: true, + encoding: Encoding.UTF8) + { + AutoFlush = true + }; + + s_sharedTraceListener = new TextWriterTraceListener(s_sharedTraceWriter, TraceListenerName); + Trace.Listeners.Add(s_sharedTraceListener); + } + + m_traceListener = s_sharedTraceListener; + m_traceWriter = s_sharedTraceWriter; + s_sharedTraceListenerRefCount++; + } + } + + private void RemoveTraceListener() + { + lock (s_traceListenerSync) + { + if (m_traceListener != null) + { + if (s_sharedTraceListenerRefCount > 0) + s_sharedTraceListenerRefCount--; + + if (ReferenceEquals(m_traceListener, s_sharedTraceListener) && s_sharedTraceListenerRefCount == 0) + { + Trace.Listeners.Remove(s_sharedTraceListener); + s_sharedTraceListener.Dispose(); + s_sharedTraceListener = null; + s_sharedTraceWriter.Dispose(); + s_sharedTraceWriter = null; + } + + m_traceListener = null; + } + + if (m_traceWriter != null) + { + m_traceWriter = null; + } + } + } + + /// + /// Releases all resources used by the toggle. + /// + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + /// + /// Releases the unmanaged resources and optionally releases the managed resources. + /// + /// True to release both managed and unmanaged resources. + protected virtual void Dispose(bool disposing) + { + if (m_disposed) + return; + + if (disposing) + { + RemoveTraceListener(); + } + + m_disposed = true; + } + } +} diff --git a/Src/Common/RenderVerification/RenderEnvironmentValidator.cs b/Src/Common/RenderVerification/RenderEnvironmentValidator.cs new file mode 100644 index 0000000000..b6cff89d52 --- /dev/null +++ b/Src/Common/RenderVerification/RenderEnvironmentValidator.cs @@ -0,0 +1,326 @@ +// Copyright (c) 2026 SIL International +// This software is licensed under the LGPL, version 2.1 or later +// (http://www.gnu.org/licenses/lgpl-2.1.html) + +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Globalization; +using System.Runtime.InteropServices; +using System.Security.Cryptography; +using System.Text; +using System.Windows.Forms; +using Microsoft.Win32; + +namespace SIL.FieldWorks.Common.RenderVerification +{ + /// + /// Validates that the rendering environment is deterministic for pixel-perfect comparisons. + /// Checks fonts, DPI, theme settings, and other factors that affect rendering output. + /// + public class RenderEnvironmentValidator + { + /// + /// Gets the current environment settings. + /// + public EnvironmentSettings CurrentSettings { get; private set; } + + /// + /// Initializes a new instance and captures current environment settings. + /// + public RenderEnvironmentValidator() + { + CurrentSettings = CaptureCurrentSettings(); + } + + /// + /// Gets a hash of the current environment settings. + /// + /// A SHA256 hash string of the environment settings. + public string GetEnvironmentHash() + { + var settingsPayload = BuildStableSettingsPayload(CurrentSettings); + using (var sha256 = SHA256.Create()) + { + var hashBytes = sha256.ComputeHash(Encoding.UTF8.GetBytes(settingsPayload)); + return Convert.ToBase64String(hashBytes); + } + } + + /// + /// Validates that the current environment matches the expected hash. + /// + /// The expected environment hash. + /// True if the environment matches; otherwise, false. + public bool Validate(string expectedHash) + { + if (string.IsNullOrEmpty(expectedHash)) + return true; // No validation required + + return GetEnvironmentHash() == expectedHash; + } + + /// + /// Gets a detailed comparison between current and expected environment. + /// + /// The expected settings to compare against. + /// A list of differences found. + public List Compare(EnvironmentSettings expectedSettings) + { + var differences = new List(); + + if (expectedSettings == null) + return differences; + + if (CurrentSettings.DpiX != expectedSettings.DpiX || CurrentSettings.DpiY != expectedSettings.DpiY) + { + differences.Add(new EnvironmentDifference + { + Setting = "DPI", + Expected = $"{expectedSettings.DpiX}x{expectedSettings.DpiY}", + Actual = $"{CurrentSettings.DpiX}x{CurrentSettings.DpiY}" + }); + } + + if (CurrentSettings.FontSmoothing != expectedSettings.FontSmoothing) + { + differences.Add(new EnvironmentDifference + { + Setting = "FontSmoothing", + Expected = expectedSettings.FontSmoothing.ToString(), + Actual = CurrentSettings.FontSmoothing.ToString() + }); + } + + if (CurrentSettings.ClearTypeEnabled != expectedSettings.ClearTypeEnabled) + { + differences.Add(new EnvironmentDifference + { + Setting = "ClearType", + Expected = expectedSettings.ClearTypeEnabled.ToString(), + Actual = CurrentSettings.ClearTypeEnabled.ToString() + }); + } + + if (CurrentSettings.ThemeName != expectedSettings.ThemeName) + { + differences.Add(new EnvironmentDifference + { + Setting = "Theme", + Expected = expectedSettings.ThemeName, + Actual = CurrentSettings.ThemeName + }); + } + + if (CurrentSettings.TextScaleFactor != expectedSettings.TextScaleFactor) + { + differences.Add(new EnvironmentDifference + { + Setting = "TextScaleFactor", + Expected = expectedSettings.TextScaleFactor.ToString(CultureInfo.InvariantCulture), + Actual = CurrentSettings.TextScaleFactor.ToString(CultureInfo.InvariantCulture) + }); + } + + return differences; + } + + /// + /// Refreshes the current environment settings. + /// + public void Refresh() + { + CurrentSettings = CaptureCurrentSettings(); + } + + private static string BuildStableSettingsPayload(EnvironmentSettings settings) + { + if (settings == null) + return string.Empty; + + var builder = new StringBuilder(); + builder.Append("DpiX=").Append(settings.DpiX.ToString(CultureInfo.InvariantCulture)).Append('\n'); + builder.Append("DpiY=").Append(settings.DpiY.ToString(CultureInfo.InvariantCulture)).Append('\n'); + builder.Append("FontSmoothing=").Append(settings.FontSmoothing ? "1" : "0").Append('\n'); + builder.Append("ClearTypeEnabled=").Append(settings.ClearTypeEnabled ? "1" : "0").Append('\n'); + builder.Append("ThemeName=").Append(settings.ThemeName ?? string.Empty).Append('\n'); + builder.Append("TextScaleFactor=").Append(settings.TextScaleFactor.ToString("R", CultureInfo.InvariantCulture)).Append('\n'); + builder.Append("ScreenWidth=").Append(settings.ScreenWidth.ToString(CultureInfo.InvariantCulture)).Append('\n'); + builder.Append("ScreenHeight=").Append(settings.ScreenHeight.ToString(CultureInfo.InvariantCulture)).Append('\n'); + builder.Append("CultureName=").Append(settings.CultureName ?? string.Empty); + return builder.ToString(); + } + + private EnvironmentSettings CaptureCurrentSettings() + { + var settings = new EnvironmentSettings(); + + // Capture DPI settings + using (var graphics = Graphics.FromHwnd(IntPtr.Zero)) + { + settings.DpiX = (int)graphics.DpiX; + settings.DpiY = (int)graphics.DpiY; + } + + // Capture font smoothing + settings.FontSmoothing = GetFontSmoothing(); + settings.ClearTypeEnabled = GetClearTypeEnabled(); + + // Capture theme + settings.ThemeName = GetCurrentTheme(); + + // Capture text scale factor + settings.TextScaleFactor = GetTextScaleFactor(); + + // Capture screen info + var screen = Screen.PrimaryScreen; + settings.ScreenWidth = screen.Bounds.Width; + settings.ScreenHeight = screen.Bounds.Height; + + // Capture culture + settings.CultureName = CultureInfo.CurrentCulture.Name; + + return settings; + } + + private bool GetFontSmoothing() + { + try + { + bool smoothing = false; + SystemParametersInfo(SPI_GETFONTSMOOTHING, 0, ref smoothing, 0); + return smoothing; + } + catch + { + return false; + } + } + + private bool GetClearTypeEnabled() + { + try + { + int type = 0; + SystemParametersInfo(SPI_GETFONTSMOOTHINGTYPE, 0, ref type, 0); + return type == FE_FONTSMOOTHINGCLEARTYPE; + } + catch + { + return false; + } + } + + private string GetCurrentTheme() + { + try + { + using (var key = Registry.CurrentUser.OpenSubKey(@"Software\Microsoft\Windows\CurrentVersion\Themes\Personalize")) + { + if (key != null) + { + var appsUseLightTheme = key.GetValue("AppsUseLightTheme"); + if (appsUseLightTheme != null) + { + return (int)appsUseLightTheme == 1 ? "Light" : "Dark"; + } + } + } + } + catch + { + // Ignore errors reading theme + } + return "Unknown"; + } + + private double GetTextScaleFactor() + { + try + { + using (var key = Registry.CurrentUser.OpenSubKey(@"Software\Microsoft\Accessibility")) + { + if (key != null) + { + var textScaleFactor = key.GetValue("TextScaleFactor"); + if (textScaleFactor != null) + { + return (int)textScaleFactor / 100.0; + } + } + } + } + catch + { + // Ignore errors + } + return 1.0; + } + + #region Native methods + private const int SPI_GETFONTSMOOTHING = 0x004A; + private const int SPI_GETFONTSMOOTHINGTYPE = 0x200A; + private const int FE_FONTSMOOTHINGCLEARTYPE = 0x0002; + + [DllImport("user32.dll", SetLastError = true)] + private static extern bool SystemParametersInfo(int uiAction, int uiParam, ref bool pvParam, int fWinIni); + + [DllImport("user32.dll", SetLastError = true)] + private static extern bool SystemParametersInfo(int uiAction, int uiParam, ref int pvParam, int fWinIni); + #endregion + } + + /// + /// Captures the current rendering environment settings. + /// + public class EnvironmentSettings + { + /// Gets or sets the horizontal DPI. + public int DpiX { get; set; } + + /// Gets or sets the vertical DPI. + public int DpiY { get; set; } + + /// Gets or sets whether font smoothing is enabled. + public bool FontSmoothing { get; set; } + + /// Gets or sets whether ClearType is enabled. + public bool ClearTypeEnabled { get; set; } + + /// Gets or sets the current theme name. + public string ThemeName { get; set; } + + /// Gets or sets the text scale factor. + public double TextScaleFactor { get; set; } + + /// Gets or sets the primary screen width. + public int ScreenWidth { get; set; } + + /// Gets or sets the primary screen height. + public int ScreenHeight { get; set; } + + /// Gets or sets the culture name. + public string CultureName { get; set; } + } + + /// + /// Represents a difference between expected and actual environment settings. + /// + public class EnvironmentDifference + { + /// Gets or sets the setting name. + public string Setting { get; set; } + + /// Gets or sets the expected value. + public string Expected { get; set; } + + /// Gets or sets the actual value. + public string Actual { get; set; } + + /// + public override string ToString() + { + return $"{Setting}: expected '{Expected}', got '{Actual}'"; + } + } +} diff --git a/Src/Common/RenderVerification/RenderModels.cs b/Src/Common/RenderVerification/RenderModels.cs new file mode 100644 index 0000000000..87efe57aa9 --- /dev/null +++ b/Src/Common/RenderVerification/RenderModels.cs @@ -0,0 +1,77 @@ +// Copyright (c) 2026 SIL International +// This software is licensed under the LGPL, version 2.1 or later +// (http://www.gnu.org/licenses/lgpl-2.1.html) + +using System; + +namespace SIL.FieldWorks.Common.RenderVerification +{ + /// + /// Represents the timing result for a single render operation. + /// + public class RenderTimingResult + { + /// Gets or sets the scenario identifier. + public string ScenarioId { get; set; } + + /// Gets or sets whether this was a cold render. + public bool IsColdRender { get; set; } + + /// Gets or sets the render duration in milliseconds. + public double DurationMs { get; set; } + + /// Gets or sets the timestamp of the render. + public DateTime Timestamp { get; set; } + } + + /// + /// Specifies which view constructor pipeline a scenario exercises. + /// + public enum RenderViewType + { + /// Scripture view (StVc / GenericScriptureVc). + Scripture, + + /// Lexical entry view (LexEntryVc with nested senses). + LexEntry + } + + /// + /// Represents a render scenario configuration. + /// + public class RenderScenario + { + /// Gets or sets the unique scenario identifier. + public string Id { get; set; } + + /// Gets or sets the human-readable description. + public string Description { get; set; } + + /// Gets or sets the root object HVO for the view. + public int RootObjectHvo { get; set; } + + /// Gets or sets the root field ID. + public int RootFlid { get; set; } + + /// Gets or sets the fragment ID for the view constructor. + public int FragmentId { get; set; } = 1; + + /// Gets or sets the path to the expected snapshot image. + public string ExpectedSnapshotPath { get; set; } + + /// Gets or sets category tags for filtering. + public string[] Tags { get; set; } = Array.Empty(); + + /// + /// Gets or sets the view type (Scripture or LexEntry). + /// Determines which view constructor pipeline is used for rendering. + /// + public RenderViewType ViewType { get; set; } = RenderViewType.Scripture; + + /// + /// Gets or sets whether to simulate the XmlVc ifdata double-render pattern. + /// Only applies to scenarios. + /// + public bool SimulateIfDataDoubleRender { get; set; } + } +} diff --git a/Src/Common/RenderVerification/RenderScenarioDataBuilder.cs b/Src/Common/RenderVerification/RenderScenarioDataBuilder.cs new file mode 100644 index 0000000000..055dfb1fd5 --- /dev/null +++ b/Src/Common/RenderVerification/RenderScenarioDataBuilder.cs @@ -0,0 +1,260 @@ +// Copyright (c) 2026 SIL International +// This software is licensed under the LGPL, version 2.1 or later +// (http://www.gnu.org/licenses/lgpl-2.1.html) + +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using Newtonsoft.Json; + +namespace SIL.FieldWorks.Common.RenderVerification +{ + /// + /// Provides helpers for building and loading render scenario configurations. + /// + public class RenderScenarioDataBuilder + { + private readonly List m_scenarios = new List(); + + /// + /// Gets the test data directory path. + /// + public static string TestDataDirectory + { + get + { + // Handle different output path depths (e.g. Output/Debug vs. bin/Debug/net472) + var baseDir = AppDomain.CurrentDomain.BaseDirectory; + + // Try 2 levels up (Output/Debug -> Root) + var path2 = Path.Combine(baseDir, "..", "..", "Src", "Common", "RootSite", "RootSiteTests", "TestData"); + if (Directory.Exists(path2)) return Path.GetFullPath(path2); + + // Try 3 levels up (bin/Debug/net -> Root) + var path3 = Path.Combine(baseDir, "..", "..", "..", "Src", "Common", "RootSite", "RootSiteTests", "TestData"); + if (Directory.Exists(path3)) return Path.GetFullPath(path3); + + // Fallback to 2 levels and let it fail with full path for debugging + return Path.GetFullPath(path2); + } + } + + /// + /// Gets the default scenarios file path. + /// + public static string DefaultScenariosPath => Path.Combine(TestDataDirectory, "RenderBenchmarkScenarios.json"); + + /// + /// Gets the default flags file path. + /// + public static string DefaultFlagsPath => Path.Combine(TestDataDirectory, "RenderBenchmarkFlags.json"); + + /// + /// Gets the snapshots directory path. + /// + public static string SnapshotsDirectory => Path.Combine(TestDataDirectory, "RenderSnapshots"); + + /// + /// Creates a new scenario builder. + /// + /// A new builder instance. + public static RenderScenarioDataBuilder Create() + { + return new RenderScenarioDataBuilder(); + } + + /// + /// Adds a simple scenario (minimal entry with one sense). + /// + /// The root object HVO. + /// The root field ID. + /// The builder for chaining. + public RenderScenarioDataBuilder AddSimpleScenario(int rootHvo, int rootFlid) + { + m_scenarios.Add(new RenderScenario + { + Id = "simple", + Description = "Minimal lexical entry with one sense, one definition", + RootObjectHvo = rootHvo, + RootFlid = rootFlid, + ExpectedSnapshotPath = Path.Combine(SnapshotsDirectory, "simple.png"), + Tags = new[] { "baseline", "minimal" } + }); + return this; + } + + /// + /// Adds a medium complexity scenario. + /// + /// The root object HVO. + /// The root field ID. + /// The builder for chaining. + public RenderScenarioDataBuilder AddMediumScenario(int rootHvo, int rootFlid) + { + m_scenarios.Add(new RenderScenario + { + Id = "medium", + Description = "Entry with 3 senses, multiple definitions, example sentences", + RootObjectHvo = rootHvo, + RootFlid = rootFlid, + ExpectedSnapshotPath = Path.Combine(SnapshotsDirectory, "medium.png"), + Tags = new[] { "typical", "multi-sense" } + }); + return this; + } + + /// + /// Adds a complex scenario with many senses. + /// + /// The root object HVO. + /// The root field ID. + /// The builder for chaining. + public RenderScenarioDataBuilder AddComplexScenario(int rootHvo, int rootFlid) + { + m_scenarios.Add(new RenderScenario + { + Id = "complex", + Description = "Entry with 10+ senses, subsenses, extensive cross-references", + RootObjectHvo = rootHvo, + RootFlid = rootFlid, + ExpectedSnapshotPath = Path.Combine(SnapshotsDirectory, "complex.png"), + Tags = new[] { "stress", "multi-sense", "cross-refs" } + }); + return this; + } + + /// + /// Adds a deep-nested scenario. + /// + /// The root object HVO. + /// The root field ID. + /// The builder for chaining. + public RenderScenarioDataBuilder AddDeepNestedScenario(int rootHvo, int rootFlid) + { + m_scenarios.Add(new RenderScenario + { + Id = "deep-nested", + Description = "Entry with deeply nested subsenses (5+ levels)", + RootObjectHvo = rootHvo, + RootFlid = rootFlid, + ExpectedSnapshotPath = Path.Combine(SnapshotsDirectory, "deep-nested.png"), + Tags = new[] { "nested", "hierarchy", "stress" } + }); + return this; + } + + /// + /// Adds a custom-field-heavy scenario. + /// + /// The root object HVO. + /// The root field ID. + /// The builder for chaining. + public RenderScenarioDataBuilder AddCustomFieldHeavyScenario(int rootHvo, int rootFlid) + { + m_scenarios.Add(new RenderScenario + { + Id = "custom-field-heavy", + Description = "Entry with many custom fields of various types", + RootObjectHvo = rootHvo, + RootFlid = rootFlid, + ExpectedSnapshotPath = Path.Combine(SnapshotsDirectory, "custom-field-heavy.png"), + Tags = new[] { "custom-fields", "extensibility" } + }); + return this; + } + + /// + /// Adds a custom scenario. + /// + /// The scenario to add. + /// The builder for chaining. + public RenderScenarioDataBuilder AddScenario(RenderScenario scenario) + { + if (scenario == null) + throw new ArgumentNullException(nameof(scenario)); + + m_scenarios.Add(scenario); + return this; + } + + /// + /// Builds and returns the list of scenarios. + /// + /// The built scenarios. + public List Build() + { + return m_scenarios.ToList(); + } + + /// + /// Saves the scenarios to a JSON file. + /// + /// The output file path. + public void SaveToFile(string outputPath = null) + { + outputPath = outputPath ?? DefaultScenariosPath; + + var directory = Path.GetDirectoryName(outputPath); + if (!string.IsNullOrEmpty(directory) && !Directory.Exists(directory)) + { + Directory.CreateDirectory(directory); + } + + var wrapper = new ScenariosWrapper { Scenarios = m_scenarios }; + var json = JsonConvert.SerializeObject(wrapper, Formatting.Indented); + File.WriteAllText(outputPath, json, Encoding.UTF8); + } + + /// + /// Loads scenarios from a JSON file. + /// + /// The input file path. + /// The loaded scenarios, or empty list if file not found. + public static List LoadFromFile(string inputPath = null) + { + inputPath = inputPath ?? DefaultScenariosPath; + + if (!File.Exists(inputPath)) + return new List(); + + var json = File.ReadAllText(inputPath, Encoding.UTF8); + var wrapper = JsonConvert.DeserializeObject(json); + return wrapper?.Scenarios ?? new List(); + } + + /// + /// Creates the standard five-scenario suite. + /// + /// The root object HVO for all scenarios. + /// The root field ID for all scenarios. + /// A builder with all five standard scenarios. + public static RenderScenarioDataBuilder CreateStandardSuite(int rootHvo, int rootFlid) + { + return Create() + .AddSimpleScenario(rootHvo, rootFlid) + .AddMediumScenario(rootHvo, rootFlid) + .AddComplexScenario(rootHvo, rootFlid) + .AddDeepNestedScenario(rootHvo, rootFlid) + .AddCustomFieldHeavyScenario(rootHvo, rootFlid); + } + + /// + /// Gets scenarios filtered by tag. + /// + /// The scenarios to filter. + /// The tag to filter by. + /// Scenarios matching the tag. + public static IEnumerable FilterByTag(IEnumerable scenarios, string tag) + { + return scenarios.Where(s => s.Tags != null && s.Tags.Contains(tag, StringComparer.OrdinalIgnoreCase)); + } + + private class ScenariosWrapper + { + [JsonProperty("scenarios")] + public List Scenarios { get; set; } = new List(); + } + } +} diff --git a/Src/Common/RenderVerification/RenderSnapshotVerifier.cs b/Src/Common/RenderVerification/RenderSnapshotVerifier.cs new file mode 100644 index 0000000000..7cf86e6588 --- /dev/null +++ b/Src/Common/RenderVerification/RenderSnapshotVerifier.cs @@ -0,0 +1,692 @@ +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Drawing.Imaging; +using System.Drawing.Text; +using System.Globalization; +using System.IO; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Text; +using Newtonsoft.Json; + +namespace SIL.FieldWorks.Common.RenderVerification +{ + public static class RenderSnapshotVerifier + { + private const string UpdateBaselinesEnvVar = "FW_UPDATE_RENDER_BASELINES"; + private const string FontQualityEnvVar = "FW_FONT_QUALITY"; + private const int MaxAllowedPixelDifferences = 4; + private const string DeterministicRenderFontFamily = "Segoe UI"; + private const int DpiAwarenessInvalid = -1; + private const int DpiAwarenessUnaware = 0; + private const int DpiAwarenessSystemAware = 1; + private const int DpiAwarenessPerMonitorAware = 2; + + [DllImport("user32.dll")] + private static extern IntPtr GetThreadDpiAwarenessContext(); + + [DllImport("user32.dll")] + private static extern int GetAwarenessFromDpiAwarenessContext(IntPtr dpiContext); + + public static string GetSourceFileDirectory([CallerFilePath] string sourceFile = "") + { + return Path.GetDirectoryName(sourceFile); + } + + public static RenderBaselineVerificationResult Verify(Bitmap actualBitmap, string directory, string name, string scenarioId) + { + if (actualBitmap == null) + throw new ArgumentNullException(nameof(actualBitmap)); + if (string.IsNullOrEmpty(directory)) + throw new ArgumentException("A snapshot directory is required.", nameof(directory)); + if (string.IsNullOrEmpty(name)) + throw new ArgumentException("A snapshot name is required.", nameof(name)); + if (string.IsNullOrEmpty(scenarioId)) + throw new ArgumentException("A scenario identifier is required.", nameof(scenarioId)); + + string snapshotBasePath = Path.Combine(directory, name); + string verifiedPath = snapshotBasePath + ".verified.png"; + string verifiedMetadataPath = snapshotBasePath + ".verified.json"; + string receivedPath = snapshotBasePath + ".received.png"; + string receivedMetadataPath = snapshotBasePath + ".received.json"; + string diffPath = snapshotBasePath + ".diff.png"; + string diffMetadataPath = snapshotBasePath + ".diff.json"; + + var currentArtifact = CreateCurrentArtifact(actualBitmap, scenarioId, name, receivedPath, receivedMetadataPath); + RefreshVerifiedBaselineIfRequested(actualBitmap, currentArtifact, verifiedPath, verifiedMetadataPath); + + DeleteIfPresent(diffPath); + DeleteIfPresent(diffMetadataPath); + + if (!File.Exists(verifiedPath)) + { + actualBitmap.Save(receivedPath, ImageFormat.Png); + SaveJson(receivedMetadataPath, currentArtifact.Metadata); + + return new RenderBaselineVerificationResult + { + Passed = false, + FailureMessage = BuildMissingBaselineMessage(scenarioId, verifiedPath, currentArtifact), + VerifiedPath = verifiedPath, + VerifiedMetadataPath = verifiedMetadataPath, + ReceivedPath = receivedPath, + ReceivedMetadataPath = receivedMetadataPath, + DiffPath = diffPath, + DiffMetadataPath = diffMetadataPath + }; + } + + using (var expectedBitmap = new Bitmap(verifiedPath)) + { + var savedArtifact = LoadSavedArtifact(expectedBitmap, verifiedPath, verifiedMetadataPath); + var diffSummary = CompareBitmaps(expectedBitmap, actualBitmap); + if (diffSummary.DifferentPixelCount <= MaxAllowedPixelDifferences) + { + DeleteIfPresent(receivedPath); + DeleteIfPresent(receivedMetadataPath); + DeleteIfPresent(diffPath); + DeleteIfPresent(diffMetadataPath); + return new RenderBaselineVerificationResult + { + Passed = true, + VerifiedPath = verifiedPath, + VerifiedMetadataPath = verifiedMetadataPath, + ReceivedPath = receivedPath, + ReceivedMetadataPath = receivedMetadataPath, + DiffPath = diffPath, + DiffMetadataPath = diffMetadataPath, + DiffSummary = diffSummary + }; + } + + using (var diffBitmap = CreateDiffBitmap(expectedBitmap, actualBitmap)) + { + diffBitmap.Save(diffPath, ImageFormat.Png); + } + + actualBitmap.Save(receivedPath, ImageFormat.Png); + SaveJson(receivedMetadataPath, currentArtifact.Metadata); + + var comparisonReport = new RenderSnapshotComparisonReport + { + ScenarioId = scenarioId, + SnapshotName = name, + AllowedDifferentPixelCount = MaxAllowedPixelDifferences, + SavedBaseline = savedArtifact, + CurrentRun = currentArtifact, + Diff = diffSummary, + Differences = BuildDifferences(savedArtifact, currentArtifact) + }; + SaveJson(diffMetadataPath, comparisonReport); + + return new RenderBaselineVerificationResult + { + Passed = false, + FailureMessage = BuildFailureMessage(scenarioId, diffPath, diffMetadataPath, comparisonReport), + VerifiedPath = verifiedPath, + VerifiedMetadataPath = verifiedMetadataPath, + ReceivedPath = receivedPath, + ReceivedMetadataPath = receivedMetadataPath, + DiffPath = diffPath, + DiffMetadataPath = diffMetadataPath, + DiffSummary = diffSummary + }; + } + } + + private static RenderSnapshotArtifact CreateCurrentArtifact( + Bitmap actualBitmap, + string scenarioId, + string snapshotName, + string receivedPath, + string receivedMetadataPath) + { + return new RenderSnapshotArtifact + { + ArtifactKind = "current", + ImagePath = receivedPath, + MetadataPath = receivedMetadataPath, + ImageWidth = actualBitmap.Width, + ImageHeight = actualBitmap.Height, + MetadataAvailable = true, + Metadata = CaptureMetadata(actualBitmap, scenarioId, snapshotName) + }; + } + + private static RenderSnapshotArtifact LoadSavedArtifact(Bitmap expectedBitmap, string verifiedPath, string verifiedMetadataPath) + { + var artifact = new RenderSnapshotArtifact + { + ArtifactKind = "saved baseline", + ImagePath = verifiedPath, + MetadataPath = verifiedMetadataPath, + ImageWidth = expectedBitmap.Width, + ImageHeight = expectedBitmap.Height + }; + + var fileInfo = new FileInfo(verifiedPath); + if (fileInfo.Exists) + artifact.FileLastWriteUtc = fileInfo.LastWriteTimeUtc; + + artifact.Metadata = LoadMetadata(verifiedMetadataPath, out var loadError); + artifact.MetadataAvailable = artifact.Metadata != null; + artifact.MetadataLoadError = loadError; + return artifact; + } + + private static RenderSnapshotMetadata CaptureMetadata(Bitmap actualBitmap, string scenarioId, string snapshotName) + { + var validator = new RenderEnvironmentValidator(); + return new RenderSnapshotMetadata + { + ScenarioId = scenarioId, + SnapshotName = snapshotName, + CapturedAtUtc = DateTime.UtcNow, + ImageWidth = actualBitmap.Width, + ImageHeight = actualBitmap.Height, + MachineName = Environment.MachineName, + OsVersion = Environment.OSVersion.VersionString, + EnvironmentHash = validator.GetEnvironmentHash(), + Environment = validator.CurrentSettings, + DpiAwareness = GetDpiAwarenessDescription(), + FontQuality = Environment.GetEnvironmentVariable(FontQualityEnvVar) ?? string.Empty, + DeterministicFontFamily = DeterministicRenderFontFamily, + DeterministicFontInstalled = IsFontInstalled(DeterministicRenderFontFamily) + }; + } + + private static void RefreshVerifiedBaselineIfRequested( + Bitmap bitmap, + RenderSnapshotArtifact currentArtifact, + string verifiedPath, + string verifiedMetadataPath) + { + if (!string.Equals(Environment.GetEnvironmentVariable(UpdateBaselinesEnvVar), "1", StringComparison.Ordinal)) + return; + + bitmap.Save(verifiedPath, ImageFormat.Png); + SaveJson(verifiedMetadataPath, CloneMetadata(currentArtifact.Metadata)); + } + + private static RenderSnapshotMetadata CloneMetadata(RenderSnapshotMetadata metadata) + { + if (metadata == null) + return null; + + return new RenderSnapshotMetadata + { + ScenarioId = metadata.ScenarioId, + SnapshotName = metadata.SnapshotName, + CapturedAtUtc = metadata.CapturedAtUtc, + ImageWidth = metadata.ImageWidth, + ImageHeight = metadata.ImageHeight, + MachineName = metadata.MachineName, + OsVersion = metadata.OsVersion, + EnvironmentHash = metadata.EnvironmentHash, + Environment = metadata.Environment == null + ? null + : new EnvironmentSettings + { + DpiX = metadata.Environment.DpiX, + DpiY = metadata.Environment.DpiY, + FontSmoothing = metadata.Environment.FontSmoothing, + ClearTypeEnabled = metadata.Environment.ClearTypeEnabled, + ThemeName = metadata.Environment.ThemeName, + TextScaleFactor = metadata.Environment.TextScaleFactor, + ScreenWidth = metadata.Environment.ScreenWidth, + ScreenHeight = metadata.Environment.ScreenHeight, + CultureName = metadata.Environment.CultureName + }, + DpiAwareness = metadata.DpiAwareness, + FontQuality = metadata.FontQuality, + DeterministicFontFamily = metadata.DeterministicFontFamily, + DeterministicFontInstalled = metadata.DeterministicFontInstalled + }; + } + + private static List BuildDifferences(RenderSnapshotArtifact savedArtifact, RenderSnapshotArtifact currentArtifact) + { + var differences = new List(); + AddDifference(differences, "image", FormatImageSize(savedArtifact.ImageWidth, savedArtifact.ImageHeight), FormatImageSize(currentArtifact.ImageWidth, currentArtifact.ImageHeight)); + + if (!savedArtifact.MetadataAvailable || currentArtifact.Metadata == null) + return differences; + + AddDifference(differences, "environmentHash", Shorten(savedArtifact.Metadata.EnvironmentHash), Shorten(currentArtifact.Metadata.EnvironmentHash)); + AddDifference(differences, "DPI", FormatDpi(savedArtifact.Metadata.Environment), FormatDpi(currentArtifact.Metadata.Environment)); + AddDifference(differences, "screen", FormatScreen(savedArtifact.Metadata.Environment), FormatScreen(currentArtifact.Metadata.Environment)); + AddDifference(differences, "textScale", FormatTextScale(savedArtifact.Metadata.Environment), FormatTextScale(currentArtifact.Metadata.Environment)); + AddDifference(differences, "dpiAwareness", savedArtifact.Metadata.DpiAwareness, currentArtifact.Metadata.DpiAwareness); + AddDifference(differences, "fontSmoothing", FormatBoolean(savedArtifact.Metadata.Environment != null && savedArtifact.Metadata.Environment.FontSmoothing), FormatBoolean(currentArtifact.Metadata.Environment != null && currentArtifact.Metadata.Environment.FontSmoothing)); + AddDifference(differences, "clearType", FormatBoolean(savedArtifact.Metadata.Environment != null && savedArtifact.Metadata.Environment.ClearTypeEnabled), FormatBoolean(currentArtifact.Metadata.Environment != null && currentArtifact.Metadata.Environment.ClearTypeEnabled)); + AddDifference(differences, "theme", savedArtifact.Metadata.Environment != null ? savedArtifact.Metadata.Environment.ThemeName : string.Empty, currentArtifact.Metadata.Environment != null ? currentArtifact.Metadata.Environment.ThemeName : string.Empty); + AddDifference(differences, "culture", savedArtifact.Metadata.Environment != null ? savedArtifact.Metadata.Environment.CultureName : string.Empty, currentArtifact.Metadata.Environment != null ? currentArtifact.Metadata.Environment.CultureName : string.Empty); + AddDifference(differences, "FW_FONT_QUALITY", savedArtifact.Metadata.FontQuality, currentArtifact.Metadata.FontQuality); + AddDifference(differences, "deterministicFontInstalled", FormatBoolean(savedArtifact.Metadata.DeterministicFontInstalled), FormatBoolean(currentArtifact.Metadata.DeterministicFontInstalled)); + return differences; + } + + private static void AddDifference(List differences, string label, string savedValue, string currentValue) + { + if (string.Equals(savedValue ?? string.Empty, currentValue ?? string.Empty, StringComparison.Ordinal)) + return; + + differences.Add(string.Format(CultureInfo.InvariantCulture, "{0} saved={1} current={2}", label, savedValue ?? "(null)", currentValue ?? "(null)")); + } + + private static string BuildMissingBaselineMessage(string scenarioId, string verifiedPath, RenderSnapshotArtifact currentArtifact) + { + var builder = new StringBuilder(); + builder.AppendFormat(CultureInfo.InvariantCulture, + "Missing verified render baseline for '{0}'. Review and accept {1} as the new baseline.", + scenarioId, + currentArtifact.ImagePath); + builder.AppendLine(); + builder.AppendLine(FormatArtifactLine("Current run", currentArtifact)); + builder.AppendFormat(CultureInfo.InvariantCulture, + "Expected baseline location: {0}. Current metadata: {1}.", + verifiedPath, + currentArtifact.MetadataPath); + return builder.ToString(); + } + + private static string BuildFailureMessage( + string scenarioId, + string diffPath, + string diffMetadataPath, + RenderSnapshotComparisonReport report) + { + var builder = new StringBuilder(); + builder.AppendFormat(CultureInfo.InvariantCulture, + "Render output for '{0}' differed from baseline by {1} pixels; {2} or fewer differences are allowed.", + scenarioId, + report.Diff.DifferentPixelCount, + report.AllowedDifferentPixelCount); + builder.AppendLine(); + builder.AppendLine(FormatArtifactLine("Saved baseline", report.SavedBaseline)); + builder.AppendLine(FormatArtifactLine("Current run", report.CurrentRun)); + builder.AppendFormat(CultureInfo.InvariantCulture, + "Diff composition: inBounds={0}; savedOnly={1}; currentOnly={2}; region={3}.", + report.Diff.InBoundsPixelDifferences, + report.Diff.ExpectedOnlyPixelDifferences, + report.Diff.ActualOnlyPixelDifferences, + FormatDiffRegion(report.Diff)); + builder.AppendLine(); + if (report.Differences.Count > 0) + { + builder.Append("Key differences: "); + builder.Append(string.Join("; ", report.Differences)); + builder.AppendLine(); + } + builder.AppendFormat(CultureInfo.InvariantCulture, + "Artifacts: diff={0}; received={1}; currentMetadata={2}; comparison={3}.", + diffPath, + report.CurrentRun.ImagePath, + report.CurrentRun.MetadataPath, + diffMetadataPath); + return builder.ToString(); + } + + private static string FormatArtifactLine(string label, RenderSnapshotArtifact artifact) + { + var builder = new StringBuilder(); + builder.Append(label); + builder.Append(": image="); + builder.Append(FormatImageSize(artifact.ImageWidth, artifact.ImageHeight)); + if (artifact.FileLastWriteUtc.HasValue) + { + builder.Append("; lastWriteUtc="); + builder.Append(artifact.FileLastWriteUtc.Value.ToString("O", CultureInfo.InvariantCulture)); + } + if (!artifact.MetadataAvailable || artifact.Metadata == null) + { + builder.Append("; metadata unavailable"); + if (!string.IsNullOrEmpty(artifact.MetadataLoadError)) + { + builder.Append(" ("); + builder.Append(artifact.MetadataLoadError); + builder.Append(")"); + } + return builder.ToString(); + } + + builder.Append("; captured="); + builder.Append(artifact.Metadata.CapturedAtUtc.ToString("O", CultureInfo.InvariantCulture)); + builder.Append("; envHash="); + builder.Append(Shorten(artifact.Metadata.EnvironmentHash)); + builder.Append("; DPI="); + builder.Append(FormatDpi(artifact.Metadata.Environment)); + builder.Append("; screen="); + builder.Append(FormatScreen(artifact.Metadata.Environment)); + builder.Append("; textScale="); + builder.Append(FormatTextScale(artifact.Metadata.Environment)); + builder.Append("; dpiAwareness="); + builder.Append(artifact.Metadata.DpiAwareness); + builder.Append("; fontSmoothing="); + builder.Append(FormatBoolean(artifact.Metadata.Environment != null && artifact.Metadata.Environment.FontSmoothing)); + builder.Append("; clearType="); + builder.Append(FormatBoolean(artifact.Metadata.Environment != null && artifact.Metadata.Environment.ClearTypeEnabled)); + builder.Append("; theme="); + builder.Append(artifact.Metadata.Environment != null ? artifact.Metadata.Environment.ThemeName : string.Empty); + builder.Append("; culture="); + builder.Append(artifact.Metadata.Environment != null ? artifact.Metadata.Environment.CultureName : string.Empty); + builder.Append("; FW_FONT_QUALITY="); + builder.Append(string.IsNullOrEmpty(artifact.Metadata.FontQuality) ? "(unset)" : artifact.Metadata.FontQuality); + builder.Append("; font='"); + builder.Append(artifact.Metadata.DeterministicFontFamily); + builder.Append("' installed="); + builder.Append(FormatBoolean(artifact.Metadata.DeterministicFontInstalled)); + builder.Append("; machine="); + builder.Append(artifact.Metadata.MachineName); + builder.Append("; os="); + builder.Append(artifact.Metadata.OsVersion); + return builder.ToString(); + } + + private static string FormatDiffRegion(RenderPixelDiffSummary diffSummary) + { + if (!diffSummary.MinX.HasValue || !diffSummary.MinY.HasValue || !diffSummary.MaxX.HasValue || !diffSummary.MaxY.HasValue) + return "none"; + + return string.Format( + CultureInfo.InvariantCulture, + "x={0}..{1}, y={2}..{3}, size={4}x{5}", + diffSummary.MinX.Value, + diffSummary.MaxX.Value, + diffSummary.MinY.Value, + diffSummary.MaxY.Value, + diffSummary.DiffRegionWidth, + diffSummary.DiffRegionHeight); + } + + private static string FormatImageSize(int width, int height) + { + return string.Format(CultureInfo.InvariantCulture, "{0}x{1}", width, height); + } + + private static string FormatDpi(EnvironmentSettings settings) + { + if (settings == null) + return "unknown"; + return string.Format(CultureInfo.InvariantCulture, "{0}x{1}", settings.DpiX, settings.DpiY); + } + + private static string FormatScreen(EnvironmentSettings settings) + { + if (settings == null) + return "unknown"; + return string.Format(CultureInfo.InvariantCulture, "{0}x{1}", settings.ScreenWidth, settings.ScreenHeight); + } + + private static string FormatTextScale(EnvironmentSettings settings) + { + if (settings == null) + return "unknown"; + return settings.TextScaleFactor.ToString("0.###", CultureInfo.InvariantCulture); + } + + private static string FormatBoolean(bool value) + { + return value ? "true" : "false"; + } + + private static string Shorten(string value) + { + if (string.IsNullOrEmpty(value)) + return "unknown"; + return value.Length <= 12 ? value : value.Substring(0, 12); + } + + private static string GetDpiAwarenessDescription() + { + try + { + var context = GetThreadDpiAwarenessContext(); + int awareness = GetAwarenessFromDpiAwarenessContext(context); + switch (awareness) + { + case DpiAwarenessUnaware: + return "Unaware"; + case DpiAwarenessSystemAware: + return "SystemAware"; + case DpiAwarenessPerMonitorAware: + return "PerMonitorAware"; + case DpiAwarenessInvalid: + return "Invalid"; + default: + return string.Format(CultureInfo.InvariantCulture, "Unknown({0})", awareness); + } + } + catch (DllNotFoundException) + { + return "Unavailable"; + } + catch (EntryPointNotFoundException) + { + return "Unavailable"; + } + catch + { + return "Unknown"; + } + } + + private static bool IsFontInstalled(string fontFamily) + { + try + { + using (var installedFonts = new InstalledFontCollection()) + { + foreach (var family in installedFonts.Families) + { + if (string.Equals(family.Name, fontFamily, StringComparison.OrdinalIgnoreCase)) + return true; + } + } + } + catch + { + } + + return false; + } + + private static RenderSnapshotMetadata LoadMetadata(string metadataPath, out string loadError) + { + loadError = null; + if (!File.Exists(metadataPath)) + return null; + + try + { + return JsonConvert.DeserializeObject(File.ReadAllText(metadataPath, Encoding.UTF8)); + } + catch (Exception ex) + { + loadError = ex.GetType().Name + ": " + ex.Message; + return null; + } + } + + private static void SaveJson(string path, T value) + { + var directory = Path.GetDirectoryName(path); + if (!string.IsNullOrEmpty(directory) && !Directory.Exists(directory)) + Directory.CreateDirectory(directory); + + File.WriteAllText( + path, + JsonConvert.SerializeObject(value, Formatting.Indented, new JsonSerializerSettings + { + NullValueHandling = NullValueHandling.Ignore + }), + Encoding.UTF8); + } + + private static void DeleteIfPresent(string path) + { + if (File.Exists(path)) + File.Delete(path); + } + + private static RenderPixelDiffSummary CompareBitmaps(Bitmap expectedBitmap, Bitmap actualBitmap) + { + int maxWidth = Math.Max(expectedBitmap.Width, actualBitmap.Width); + int maxHeight = Math.Max(expectedBitmap.Height, actualBitmap.Height); + var summary = new RenderPixelDiffSummary(); + + for (int y = 0; y < maxHeight; y++) + { + for (int x = 0; x < maxWidth; x++) + { + bool expectedInBounds = x < expectedBitmap.Width && y < expectedBitmap.Height; + bool actualInBounds = x < actualBitmap.Width && y < actualBitmap.Height; + + if (!expectedInBounds || !actualInBounds) + { + summary.DifferentPixelCount++; + if (expectedInBounds) + summary.ExpectedOnlyPixelDifferences++; + else if (actualInBounds) + summary.ActualOnlyPixelDifferences++; + UpdateDiffBounds(summary, x, y); + continue; + } + + if (expectedBitmap.GetPixel(x, y) == actualBitmap.GetPixel(x, y)) + continue; + + summary.DifferentPixelCount++; + summary.InBoundsPixelDifferences++; + UpdateDiffBounds(summary, x, y); + } + } + + if (summary.MinX.HasValue && summary.MaxX.HasValue) + summary.DiffRegionWidth = summary.MaxX.Value - summary.MinX.Value + 1; + if (summary.MinY.HasValue && summary.MaxY.HasValue) + summary.DiffRegionHeight = summary.MaxY.Value - summary.MinY.Value + 1; + + return summary; + } + + private static void UpdateDiffBounds(RenderPixelDiffSummary summary, int x, int y) + { + if (!summary.MinX.HasValue || x < summary.MinX.Value) + summary.MinX = x; + if (!summary.MaxX.HasValue || x > summary.MaxX.Value) + summary.MaxX = x; + if (!summary.MinY.HasValue || y < summary.MinY.Value) + summary.MinY = y; + if (!summary.MaxY.HasValue || y > summary.MaxY.Value) + summary.MaxY = y; + } + + private static Bitmap CreateDiffBitmap(Bitmap expectedBitmap, Bitmap actualBitmap) + { + int maxWidth = Math.Max(expectedBitmap.Width, actualBitmap.Width); + int maxHeight = Math.Max(expectedBitmap.Height, actualBitmap.Height); + var diffBitmap = new Bitmap(maxWidth, maxHeight); + + for (int y = 0; y < maxHeight; y++) + { + for (int x = 0; x < maxWidth; x++) + { + Color expected = x < expectedBitmap.Width && y < expectedBitmap.Height + ? expectedBitmap.GetPixel(x, y) + : Color.White; + Color actual = x < actualBitmap.Width && y < actualBitmap.Height + ? actualBitmap.GetPixel(x, y) + : Color.White; + + diffBitmap.SetPixel(x, y, CreateDiffPixel(expected, actual)); + } + } + + return diffBitmap; + } + + private static Color CreateDiffPixel(Color expected, Color actual) + { + return Color.FromArgb( + 255, + ScaleDiffChannel(expected.R, actual.R), + ScaleDiffChannel(expected.G, actual.G), + ScaleDiffChannel(expected.B, actual.B)); + } + + private static int ScaleDiffChannel(int expected, int actual) + { + return Math.Min(255, Math.Abs(expected - actual) * 4); + } + } + + public sealed class RenderBaselineVerificationResult + { + public bool Passed { get; set; } + public string FailureMessage { get; set; } + public string VerifiedPath { get; set; } + public string VerifiedMetadataPath { get; set; } + public string ReceivedPath { get; set; } + public string ReceivedMetadataPath { get; set; } + public string DiffPath { get; set; } + public string DiffMetadataPath { get; set; } + public RenderPixelDiffSummary DiffSummary { get; set; } + } + + public sealed class RenderSnapshotMetadata + { + public string ScenarioId { get; set; } + public string SnapshotName { get; set; } + public DateTime CapturedAtUtc { get; set; } + public int ImageWidth { get; set; } + public int ImageHeight { get; set; } + public string MachineName { get; set; } + public string OsVersion { get; set; } + public string EnvironmentHash { get; set; } + public EnvironmentSettings Environment { get; set; } + public string DpiAwareness { get; set; } + public string FontQuality { get; set; } + public string DeterministicFontFamily { get; set; } + public bool DeterministicFontInstalled { get; set; } + } + + public sealed class RenderSnapshotArtifact + { + public string ArtifactKind { get; set; } + public string ImagePath { get; set; } + public string MetadataPath { get; set; } + public int ImageWidth { get; set; } + public int ImageHeight { get; set; } + public DateTime? FileLastWriteUtc { get; set; } + public bool MetadataAvailable { get; set; } + public string MetadataLoadError { get; set; } + public RenderSnapshotMetadata Metadata { get; set; } + } + + public sealed class RenderSnapshotComparisonReport + { + public string ScenarioId { get; set; } + public string SnapshotName { get; set; } + public int AllowedDifferentPixelCount { get; set; } + public RenderSnapshotArtifact SavedBaseline { get; set; } + public RenderSnapshotArtifact CurrentRun { get; set; } + public RenderPixelDiffSummary Diff { get; set; } + public List Differences { get; set; } = new List(); + } + + public sealed class RenderPixelDiffSummary + { + public int DifferentPixelCount { get; set; } + public int InBoundsPixelDifferences { get; set; } + public int ExpectedOnlyPixelDifferences { get; set; } + public int ActualOnlyPixelDifferences { get; set; } + public int? MinX { get; set; } + public int? MinY { get; set; } + public int? MaxX { get; set; } + public int? MaxY { get; set; } + public int DiffRegionWidth { get; set; } + public int DiffRegionHeight { get; set; } + } +} \ No newline at end of file diff --git a/Src/Common/RenderVerification/RenderTraceParser.cs b/Src/Common/RenderVerification/RenderTraceParser.cs new file mode 100644 index 0000000000..0dad2492e0 --- /dev/null +++ b/Src/Common/RenderVerification/RenderTraceParser.cs @@ -0,0 +1,259 @@ +// Copyright (c) 2026 SIL International +// This software is licensed under the LGPL, version 2.1 or later +// (http://www.gnu.org/licenses/lgpl-2.1.html) + +using System; +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using System.Linq; +using System.Text.RegularExpressions; + +namespace SIL.FieldWorks.Common.RenderVerification +{ + /// + /// Parses trace log files to extract rendering stage durations. + /// Expects trace entries in the format: [RENDER] Stage=StageName Duration=123.45ms Context=optional + /// + public class RenderTraceParser + { + /// + /// The regex pattern for parsing render trace entries. + /// Format: [RENDER] Stage=StageName Duration=123.45ms [Context=value] + /// + private static readonly Regex TraceEntryPattern = new Regex( + @"\[RENDER\]\s+Stage=(?\S+)\s+Duration=(?[\d.]+)ms(?:\s+Context=(?.+))?", + RegexOptions.Compiled | RegexOptions.IgnoreCase); + + /// + /// The regex pattern for parsing timestamped trace entries. + /// Format: [2026-01-22T12:34:56.789] [RENDER] Stage=... + /// + private static readonly Regex TimestampedEntryPattern = new Regex( + @"\[(?[\d\-T:.]+)\]\s+\[RENDER\]\s+Stage=(?\S+)\s+Duration=(?[\d.]+)ms(?:\s+Context=(?.+))?", + RegexOptions.Compiled | RegexOptions.IgnoreCase); + + /// + /// Known rendering stages in order of expected execution. + /// + public static readonly string[] KnownStages = new[] + { + "MakeRoot", + "Layout", + "PrepareToDraw", + "DrawRoot", + "PropChanged", + "LazyExpand", + "Reconstruct" + }; + + /// + /// Parses trace entries from a log file. + /// + /// Path to the trace log file. + /// A list of parsed trace events. + public List ParseFile(string logFilePath) + { + if (!File.Exists(logFilePath)) + return new List(); + + var lines = File.ReadAllLines(logFilePath); + return ParseLines(lines); + } + + /// + /// Parses trace entries from log content. + /// + /// The log content string. + /// A list of parsed trace events. + public List ParseContent(string logContent) + { + if (string.IsNullOrEmpty(logContent)) + return new List(); + + var lines = logContent.Split(new[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries); + return ParseLines(lines); + } + + /// + /// Parses trace entries from an array of log lines. + /// + /// The log lines. + /// A list of parsed trace events. + public List ParseLines(string[] lines) + { + var events = new List(); + double cumulativeTime = 0; + + foreach (var line in lines) + { + var evt = ParseLine(line, ref cumulativeTime); + if (evt != null) + { + events.Add(evt); + } + } + + return events; + } + + /// + /// Parses a single trace log line. + /// + /// The log line. + /// Running cumulative time for calculating start times. + /// The parsed trace event, or null if line doesn't match. + public TraceEvent ParseLine(string line, ref double cumulativeTime) + { + if (string.IsNullOrWhiteSpace(line)) + return null; + + // Try timestamped pattern first + var match = TimestampedEntryPattern.Match(line); + if (!match.Success) + { + // Fall back to simple pattern + match = TraceEntryPattern.Match(line); + } + + if (!match.Success) + return null; + + var stage = match.Groups["stage"].Value; + if (!double.TryParse(match.Groups["duration"].Value, NumberStyles.Float, CultureInfo.InvariantCulture, out double duration)) + return null; + + var evt = new TraceEvent + { + Stage = stage, + StartTimeMs = cumulativeTime, + DurationMs = duration + }; + + // Parse context if present + if (match.Groups["context"].Success && !string.IsNullOrWhiteSpace(match.Groups["context"].Value)) + { + evt.Context = ParseContext(match.Groups["context"].Value); + } + + cumulativeTime += duration; + return evt; + } + + /// + /// Aggregates trace events by stage. + /// + /// The trace events to aggregate. + /// A dictionary of stage name to aggregated statistics. + public Dictionary AggregateByStage(IEnumerable events) + { + var stats = new Dictionary(StringComparer.OrdinalIgnoreCase); + + foreach (var evt in events) + { + if (!stats.TryGetValue(evt.Stage, out var stageStat)) + { + stageStat = new StageStatistics { Stage = evt.Stage }; + stats[evt.Stage] = stageStat; + } + + stageStat.Count++; + stageStat.TotalDurationMs += evt.DurationMs; + stageStat.MinDurationMs = Math.Min(stageStat.MinDurationMs, evt.DurationMs); + stageStat.MaxDurationMs = Math.Max(stageStat.MaxDurationMs, evt.DurationMs); + } + + // Calculate averages + foreach (var stat in stats.Values) + { + stat.AverageDurationMs = stat.Count > 0 ? stat.TotalDurationMs / stat.Count : 0; + } + + return stats; + } + + /// + /// Gets the top time contributors from trace events. + /// + /// The trace events. + /// Number of top contributors to return. + /// A list of contributors sorted by share percentage. + public List GetTopContributors(IEnumerable events, int count = 5) + { + var eventList = events.ToList(); + var totalTime = eventList.Sum(e => e.DurationMs); + + if (totalTime <= 0) + return new List(); + + var stats = AggregateByStage(eventList); + + return stats.Values + .OrderByDescending(s => s.TotalDurationMs) + .Take(count) + .Select(s => new Contributor + { + Stage = s.Stage, + AverageDurationMs = s.AverageDurationMs, + SharePercent = s.TotalDurationMs / totalTime * 100 + }) + .ToList(); + } + + /// + /// Validates that all expected trace stages are present. + /// + /// The trace events to validate. + /// The required stages (defaults to KnownStages). + /// A list of missing stage names. + public List ValidateStages(IEnumerable events, string[] requiredStages = null) + { + requiredStages = requiredStages ?? new[] { "Layout", "DrawRoot" }; // Minimum required + var presentStages = new HashSet(events.Select(e => e.Stage), StringComparer.OrdinalIgnoreCase); + + return requiredStages.Where(s => !presentStages.Contains(s)).ToList(); + } + + private Dictionary ParseContext(string contextString) + { + var context = new Dictionary(StringComparer.OrdinalIgnoreCase); + + // Parse key=value pairs separated by spaces or semicolons + var pairs = contextString.Split(new[] { ';', ' ' }, StringSplitOptions.RemoveEmptyEntries); + foreach (var pair in pairs) + { + var parts = pair.Split(new[] { '=' }, 2); + if (parts.Length == 2) + { + context[parts[0].Trim()] = parts[1].Trim(); + } + } + + return context; + } + } + + /// + /// Contains aggregated statistics for a rendering stage. + /// + public class StageStatistics + { + /// Gets or sets the stage name. + public string Stage { get; set; } + + /// Gets or sets the number of occurrences. + public int Count { get; set; } + + /// Gets or sets the total duration across all occurrences. + public double TotalDurationMs { get; set; } + + /// Gets or sets the average duration. + public double AverageDurationMs { get; set; } + + /// Gets or sets the minimum duration. + public double MinDurationMs { get; set; } = double.MaxValue; + + /// Gets or sets the maximum duration. + public double MaxDurationMs { get; set; } = double.MinValue; + } +} diff --git a/Src/Common/RenderVerification/RenderVerification.csproj b/Src/Common/RenderVerification/RenderVerification.csproj new file mode 100644 index 0000000000..1b7b619495 --- /dev/null +++ b/Src/Common/RenderVerification/RenderVerification.csproj @@ -0,0 +1,53 @@ + + + + RenderVerification + SIL.FieldWorks.Common.RenderVerification + net48 + Library + 168,169,219,414,649,1635,1702,1701 + false + false + false + + + DEBUG;TRACE + true + false + portable + + + TRACE + true + true + portable + + + + + + + + + + + + + + + + + + + + + + + + + + Properties\CommonAssemblyInfo.cs + + + diff --git a/Src/Common/RootSite/RootSiteTests/App.config b/Src/Common/RootSite/RootSiteTests/App.config new file mode 100644 index 0000000000..d895f0dfac --- /dev/null +++ b/Src/Common/RootSite/RootSiteTests/App.config @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Src/Common/RootSite/RootSiteTests/DummyBasicView.cs b/Src/Common/RootSite/RootSiteTests/DummyBasicView.cs index ed76b3e131..5cde473061 100644 --- a/Src/Common/RootSite/RootSiteTests/DummyBasicView.cs +++ b/Src/Common/RootSite/RootSiteTests/DummyBasicView.cs @@ -310,6 +310,21 @@ public virtual void CallLayout() OnLayout(new LayoutEventArgs(this, string.Empty)); } + /// + /// Force layout with a specific width, useful for headless testing. + /// + public void ForceLayout(int width) + { + CheckDisposed(); + if (m_rootb != null && m_graphicsManager != null) + { + using (new HoldGraphics(this)) + { + m_rootb.Layout(m_graphicsManager.VwGraphics, width); + } + } + } + /// ------------------------------------------------------------------------------------ /// /// Add English paragraphs @@ -484,6 +499,22 @@ public override void MakeRoot() MakeRoot(m_hvoRoot, m_flid); //, DummyBasicViewVc.kflidTestDummy); } + /// ------------------------------------------------------------------------------------ + /// + /// Override to provide width even if control is not fully realized/visible (headless tests). + /// + /// ------------------------------------------------------------------------------------ + public override int GetAvailWidth(IVwRootBox prootb) + { + // If base returns 0 (likely due to ClientRectangle.Width=0 in headless mode), + // try to return the explicit Width property. + int width = base.GetAvailWidth(prootb); + if (width <= 0 && Width > 0) + return Width; + + return width; + } + /// ------------------------------------------------------------------------------------ /// /// Creates a new DummyEditingHelper diff --git a/Src/Common/RootSite/RootSiteTests/DummyBasicViewVc.cs b/Src/Common/RootSite/RootSiteTests/DummyBasicViewVc.cs index a5352cb9d8..405986a056 100644 --- a/Src/Common/RootSite/RootSiteTests/DummyBasicViewVc.cs +++ b/Src/Common/RootSite/RootSiteTests/DummyBasicViewVc.cs @@ -172,6 +172,19 @@ public override void Display(IVwEnv vwenv, int hvo, int frag) m_wsDefault); vwenv.AddString(tss); break; + case 20: // Full book (Sections + Footnotes) + // Main body (sections) + vwenv.AddObjVecItems(ScrBookTags.kflidSections, this, 21); + // Footnotes + vwenv.OpenDiv(); + vwenv.AddObjVecItems(ScrBookTags.kflidFootnotes, this, 8); + vwenv.CloseDiv(); + break; + case 21: // Function used to display a Section + // Just display the content (paragraphs) for now, skipping heading to match test data structure + // (The test data setup AddParaToMockedSectionContent puts text in Content, not Heading) + vwenv.AddObjProp(ScrSectionTags.kflidContent, this, 3); + break; case ScrBookTags.kflidSections: vwenv.AddObjVecItems(ScrBookTags.kflidSections, this, ScrSectionTags.kflidContent); diff --git a/Src/Common/RootSite/RootSiteTests/GenericLexEntryView.cs b/Src/Common/RootSite/RootSiteTests/GenericLexEntryView.cs new file mode 100644 index 0000000000..c9fd361585 --- /dev/null +++ b/Src/Common/RootSite/RootSiteTests/GenericLexEntryView.cs @@ -0,0 +1,229 @@ +// Copyright (c) 2026 SIL International +// This software is licensed under the LGPL, version 2.1 or later +// (http://www.gnu.org/licenses/lgpl-2.1.html) + +using System; +using SIL.FieldWorks.Common.ViewsInterfaces; +using SIL.LCModel; +using SIL.LCModel.Core.KernelInterfaces; +using SIL.LCModel.Core.Text; + +namespace SIL.FieldWorks.Common.RootSites.RenderBenchmark +{ + /// + /// A benchmark view that renders lexical entries with nested senses for timing tests. + /// The exercises the same recursive nested-field pattern + /// that causes exponential rendering overhead in the production XmlVc + /// (visibility="ifdata" double-render at each level of LexSense → Senses). + /// + public class GenericLexEntryView : DummyBasicView + { + private readonly int m_rootHvo; + private readonly int m_rootFlid; + private bool m_simulateIfDataDoubleRender; + + /// + /// Gets or sets the root fragment ID for this view. + /// + public int RootFragmentId { get; set; } = LexEntryVc.kFragEntry; + + /// + /// Gets or sets whether to simulate the XmlVc ifdata double-render pattern. + /// When true, each sense level renders its children twice (once as a visibility + /// test, once for real output), modelling the O(N · 2^d) growth. + /// When false, renders once per level — the target after optimization. + /// + public bool SimulateIfDataDoubleRender + { + get => m_simulateIfDataDoubleRender; + set => m_simulateIfDataDoubleRender = value; + } + + /// + /// Initializes a new instance of the class. + /// + /// The HVO of the root lex entry. + /// The field ID (typically ). + public GenericLexEntryView(int hvoRoot, int flid) : base(hvoRoot, flid) + { + m_rootHvo = hvoRoot; + m_rootFlid = flid; + m_fMakeRootWhenHandleIsCreated = false; + } + + /// + public override void MakeRoot() + { + CheckDisposed(); + MakeRoot(m_rootHvo, m_rootFlid, RootFragmentId); + } + + /// + /// Creates the view constructor for lexical entry rendering. + /// + protected override VwBaseVc CreateVc(int flid) + { + int defaultWs = m_cache.ServiceLocator.WritingSystems.DefaultVernacularWritingSystem.Handle; + int analysisWs = m_cache.ServiceLocator.WritingSystems.DefaultAnalysisWritingSystem.Handle; + var vc = new LexEntryVc(defaultWs, analysisWs) + { + SimulateIfDataDoubleRender = m_simulateIfDataDoubleRender + }; + return vc; + } + } + + /// + /// View constructor that renders objects with recursive sense nesting. + /// This exercises the same Views engine pattern that causes exponential overhead in XmlVc: + /// at each sense level, the engine calls back into for each subsense, + /// creating O(branching^depth) total Display calls. + /// + /// + /// + /// When is true, each sense's subsense vector + /// is processed twice — once via a pass (testing whether + /// data exists), then again for real rendering. This models the production XmlVc behaviour + /// where visibility="ifdata" parts call ProcessChildren into a throw-away + /// environment before re-rendering into the real . + /// + /// + /// Toggling off shows the target performance + /// after the ifdata optimization ships. + /// + /// + public class LexEntryVc : VwBaseVc + { + /// Fragment: root-level entry display. + public const int kFragEntry = 200; + /// Fragment: a single sense (recursive for subsenses). + public const int kFragSense = 201; + /// Fragment: the morpheme form (headword) of an entry. + public const int kFragMoForm = 202; + + private readonly int m_wsVern; + private readonly int m_wsAnalysis; + + /// + /// When true, each sense level renders its subsense vector twice to simulate + /// the XmlVc visibility="ifdata" double-render pattern. + /// + public bool SimulateIfDataDoubleRender { get; set; } + + /// + /// Initializes a new instance of the class. + /// + /// Default vernacular writing system handle. + /// Default analysis writing system handle. + public LexEntryVc(int wsVern, int wsAnalysis) + { + m_wsVern = wsVern; + m_wsAnalysis = wsAnalysis; + } + + /// + /// Main display method — dispatches on fragment ID. + /// + public override void Display(IVwEnv vwenv, int hvo, int frag) + { + switch (frag) + { + case kFragEntry: + DisplayEntry(vwenv, hvo); + break; + + case kFragSense: + DisplaySense(vwenv, hvo); + break; + + case kFragMoForm: + DisplayMoForm(vwenv, hvo); + break; + + default: + break; + } + } + + /// + /// Renders a lexical entry: bold headword, then numbered senses. + /// + private void DisplayEntry(IVwEnv vwenv, int hvo) + { + vwenv.OpenDiv(); + + // --- Headword (bold) --- + vwenv.OpenParagraph(); + var bldr = TsStringUtils.MakePropsBldr(); + bldr.SetIntPropValues((int)FwTextPropType.ktptBold, + (int)FwTextPropVar.ktpvEnum, (int)FwTextToggleVal.kttvForceOn); + bldr.SetIntPropValues((int)FwTextPropType.ktptFontSize, + (int)FwTextPropVar.ktpvMilliPoint, 14000); // 14pt + vwenv.set_IntProperty((int)FwTextPropType.ktptBold, + (int)FwTextPropVar.ktpvEnum, (int)FwTextToggleVal.kttvForceOn); + vwenv.set_IntProperty((int)FwTextPropType.ktptFontSize, + (int)FwTextPropVar.ktpvMilliPoint, 14000); + + // Display LexemeForm → MoForm + vwenv.AddObjProp(LexEntryTags.kflidLexemeForm, this, kFragMoForm); + vwenv.CloseParagraph(); + + // --- Senses --- + vwenv.AddObjVecItems(LexEntryTags.kflidSenses, this, kFragSense); + + vwenv.CloseDiv(); + } + + /// + /// Renders a single sense: gloss, definition, then recursive subsenses with + /// indentation. When is true, the + /// subsense vector is iterated twice per level to model the XmlVc ifdata cost. + /// + private void DisplaySense(IVwEnv vwenv, int hvo) + { + // Indent each nesting level by 18px + vwenv.set_IntProperty((int)FwTextPropType.ktptLeadingIndent, + (int)FwTextPropVar.ktpvMilliPoint, 18000); // 18pt indent + + vwenv.OpenDiv(); + + // --- Gloss line --- + vwenv.OpenParagraph(); + vwenv.AddStringAltMember(LexSenseTags.kflidGloss, m_wsAnalysis, this); + vwenv.CloseParagraph(); + + // --- Definition line --- + vwenv.OpenParagraph(); + vwenv.set_IntProperty((int)FwTextPropType.ktptItalic, + (int)FwTextPropVar.ktpvEnum, (int)FwTextToggleVal.kttvForceOn); + vwenv.AddStringAltMember(LexSenseTags.kflidDefinition, m_wsAnalysis, this); + vwenv.CloseParagraph(); + + // --- Subsenses (recursive!) --- + // This is the critical path: each level of nesting causes the Views engine + // to call Display(kFragSense) for each child sense, creating O(b^d) calls. + if (SimulateIfDataDoubleRender) + { + // SIMULATION of XmlVc visibility="ifdata": + // First pass — iterate subsenses to "test" whether data exists. + // XmlVc does this via TestCollectorEnv which is a full ProcessChildren traversal. + // We simulate by doing AddObjVecItems into a discarded context. + // The Views engine still walks the vector and calls Display for each item. + vwenv.AddObjVecItems(LexSenseTags.kflidSenses, this, kFragSense); + } + + // Real render pass — always done + vwenv.AddObjVecItems(LexSenseTags.kflidSenses, this, kFragSense); + + vwenv.CloseDiv(); + } + + /// + /// Renders the morpheme form (headword text). + /// + private void DisplayMoForm(IVwEnv vwenv, int hvo) + { + vwenv.AddStringAltMember(MoFormTags.kflidForm, m_wsVern, this); + } + } +} diff --git a/Src/Common/RootSite/RootSiteTests/GenericScriptureView.cs b/Src/Common/RootSite/RootSiteTests/GenericScriptureView.cs new file mode 100644 index 0000000000..1d56e2b062 --- /dev/null +++ b/Src/Common/RootSite/RootSiteTests/GenericScriptureView.cs @@ -0,0 +1,80 @@ +using System; +using SIL.FieldWorks.Common.ViewsInterfaces; +using SIL.LCModel; +using SIL.LCModel.Core.KernelInterfaces; +using SIL.LCModel.Core.Scripture; + +namespace SIL.FieldWorks.Common.RootSites.RenderBenchmark +{ + /// + /// A benchmark view that uses the production-grade StVc (Standard View Constructor) + /// instead of the simplified DummyBasicViewVc. This ensures rendering matches + /// actual FieldWorks document views (margins, styles, writing systems). + /// + public class GenericScriptureView : DummyBasicView + { + private readonly int m_rootHvo; + private readonly int m_rootFlid; + + public int RootFragmentId { get; set; } = 1; + + public GenericScriptureView(int hvoRoot, int flid) : base(hvoRoot, flid) + { + m_rootHvo = hvoRoot; + m_rootFlid = flid; + m_fMakeRootWhenHandleIsCreated = false; + } + + public override void MakeRoot() + { + CheckDisposed(); + MakeRoot(m_rootHvo, m_rootFlid, RootFragmentId); + } + + protected override VwBaseVc CreateVc(int flid) + { + // We define the VC inline or via helper to handle the Book -> Text bridge + int defaultWs = m_cache.ServiceLocator.WritingSystems.DefaultVernacularWritingSystem.Handle; + var vc = new GenericScriptureVc("Normal", defaultWs); + vc.Cache = m_cache; // Inject cache + return vc; + } + } + + /// + /// Extends StVc to handle Scripture hierarchy (Book -> Sections -> StText). + /// When it reaches StText, it falls back to standard StVc formatting. + /// + public class GenericScriptureVc : StVc + { + private const int kFragRoot = 1; + private const int kFragSection = 21; + + public GenericScriptureVc(string style, int ws) : base(style, ws) + { + } + + public override void Display(IVwEnv vwenv, int hvo, int frag) + { + // Handle Scripture Hierarchy + switch (frag) + { + case 100: // Matches m_frag in RenderBenchmarkTestsBase + // Assume Root is Book, iterate sections + vwenv.AddObjVecItems(ScrBookTags.kflidSections, this, kFragSection); + break; + + case kFragSection: + // Section: display heading first, then content body + vwenv.AddObjProp(ScrSectionTags.kflidHeading, this, (int)StTextFrags.kfrText); + vwenv.AddObjProp(ScrSectionTags.kflidContent, this, (int)StTextFrags.kfrText); + break; + + default: + // Delegate to StVc for standard StText/Para handling + base.Display(vwenv, hvo, frag); + break; + } + } + } +} diff --git a/Src/Common/RootSite/RootSiteTests/RealDataTestsBase.cs b/Src/Common/RootSite/RootSiteTests/RealDataTestsBase.cs new file mode 100644 index 0000000000..d3327eaeda --- /dev/null +++ b/Src/Common/RootSite/RootSiteTests/RealDataTestsBase.cs @@ -0,0 +1,113 @@ +using System; +using System.IO; +using NUnit.Framework; +using SIL.FieldWorks.FwCoreDlgs; +using SIL.FieldWorks.Common.FwUtils; +using SIL.LCModel; +using SIL.LCModel.Core.KernelInterfaces; +using SIL.LCModel.Infrastructure; +using SIL.TestUtilities; +using SIL.WritingSystems; + +namespace SIL.FieldWorks.Common.RootSites.RootSiteTests +{ + /// + /// Base class for tests requiring a real file-backed LcmCache (not Mock/Memory). + /// This ensures full schema validation and behaviors (like StVc) work correctly. + /// + [TestFixture] + public abstract class RealDataTestsBase + { + protected FwNewLangProjectModel m_model; + protected LcmCache Cache; + protected string m_dbName; + + [SetUp] + public virtual void TestSetup() + { + m_dbName = "RealDataTest_" + Guid.NewGuid().ToString("N"); + var dbPath = DbFilename(m_dbName); + if (File.Exists(dbPath)) + File.Delete(dbPath); + + // Init New Lang Project Model (headless) + m_model = new FwNewLangProjectModel(true) + { + LoadProjectNameSetup = () => { }, + LoadVernacularSetup = () => { }, + LoadAnalysisSetup = () => { }, + AnthroModel = new FwChooseAnthroListModel { CurrentList = FwChooseAnthroListModel.ListChoice.UserDef } + }; + + string createdPath; + using (var threadHelper = new ThreadHelper()) + { + m_model.ProjectName = m_dbName; + m_model.Next(); // To Vernacular WS Setup + m_model.SetDefaultWs(new LanguageInfo { LanguageTag = "qaa", DesiredName = "Vernacular" }); + m_model.Next(); // To Analysis WS Setup + m_model.SetDefaultWs(new LanguageInfo { LanguageTag = "en", DesiredName = "English" }); + createdPath = m_model.CreateNewLangProj(new DummyProgressDlg(), threadHelper); + } + + // Load the cache from the newly created .fwdata file + Cache = LcmCache.CreateCacheFromExistingData( + new TestProjectId(BackendProviderType.kXMLWithMemoryOnlyWsMgr, createdPath), + "en", + new DummyLcmUI(), + FwDirectoryFinder.LcmDirectories, + new LcmSettings(), + new DummyProgressDlg()); + + try + { + using (var undoWatcher = new UndoableUnitOfWorkHelper(Cache.ActionHandlerAccessor, "Test Setup", "Undo Test Setup")) + { + InitializeProjectData(); + CreateTestData(); + undoWatcher.RollBack = false; + } + } + catch (Exception) + { + // If setup fails, ensure we don't leave a locked DB + if (Cache != null) + { + Cache.Dispose(); + Cache = null; + } + throw; + } + } + + protected virtual void InitializeProjectData() + { + // Override to add basic project data before CreateTestData + } + + protected virtual void CreateTestData() + { + // Override in subclasses to populate the DB + } + + [TearDown] + public virtual void TestTearDown() + { + if (Cache != null) + { + Cache.Dispose(); + Cache = null; + } + var dbPath = DbFilename(m_dbName); + if (File.Exists(dbPath)) + { + try { File.Delete(dbPath); } catch { } + } + } + + protected string DbFilename(string name) + { + return Path.Combine(Path.GetTempPath(), name + ".fwdata"); + } + } +} diff --git a/Src/Common/RootSite/RootSiteTests/RenderBaselineTests.cs b/Src/Common/RootSite/RootSiteTests/RenderBaselineTests.cs new file mode 100644 index 0000000000..077c521261 --- /dev/null +++ b/Src/Common/RootSite/RootSiteTests/RenderBaselineTests.cs @@ -0,0 +1,356 @@ +// Copyright (c) 2026 SIL International +// This software is licensed under the LGPL, version 2.1 or later +// (http://www.gnu.org/licenses/lgpl-2.1.html) + +using System; +using System.Drawing; +using System.Drawing.Imaging; +using System.IO; +using NUnit.Framework; +using SIL.FieldWorks.Common.RootSites.RenderBenchmark; +using SIL.FieldWorks.Common.RenderVerification; + +namespace SIL.FieldWorks.Common.RootSites +{ + /// + /// Render harness and infrastructure tests. + /// Validates that the capture pipeline, environment validator, and diagnostics + /// toggle work correctly. Pixel-perfect snapshot regression is handled by + /// using committed PNG baselines. + /// + [TestFixture] + [Category("RenderBenchmark")] + public class RenderBaselineTests : RenderBenchmark.RenderBenchmarkTestsBase + { + private RenderEnvironmentValidator m_environmentValidator; + private RenderDiagnosticsToggle m_diagnostics; + + /// + /// Creates the test data (Scripture book with footnotes) for rendering. + /// + protected override void CreateTestData() + { + SetupScenarioData("simple"); + } + + /// + /// Sets up each test. + /// + [SetUp] + public override void TestSetup() + { + m_environmentValidator = new RenderEnvironmentValidator(); + base.TestSetup(); + m_diagnostics = new RenderDiagnosticsToggle(); + } + + /// + /// Tears down each test. + /// + [TearDown] + public override void TestTearDown() + { + m_diagnostics?.Dispose(); + m_diagnostics = null; + base.TestTearDown(); + } + + /// + /// Tests that the harness can render a simple view and capture a bitmap. + /// + [Test] + public void RenderHarness_CapturesSimpleView_ReturnsValidBitmap() + { + // Arrange + var scenario = new RenderScenario + { + Id = "simple-test", + Description = "Basic view for harness validation", + RootObjectHvo = m_hvoRoot, + RootFlid = m_flidContainingTexts, + FragmentId = m_frag + }; + + using (var harness = new RenderBenchmarkHarness(Cache, scenario, m_environmentValidator)) + { + // Act + var coldTiming = harness.ExecuteColdRender(width: 400, height: 300); + var bitmap = harness.CaptureViewBitmap(); + + // Assert + Assert.That(coldTiming, Is.Not.Null, "Cold timing result should not be null"); + Assert.That(coldTiming.DurationMs, Is.GreaterThanOrEqualTo(0), + "Cold render duration should not be negative."); + Assert.That(coldTiming.IsColdRender, Is.True, "Should be marked as cold render"); + + Assert.That(bitmap, Is.Not.Null, "Captured bitmap should not be null"); + Assert.That(bitmap.Width, Is.EqualTo(400), "Bitmap width should match view width"); + Assert.That(bitmap.Height, Is.GreaterThanOrEqualTo(300), + "Bitmap height should honor the requested view height and may grow to fit content."); + } + } + + /// + /// Tests that warm renders complete in a reasonable time relative to cold renders. + /// With rich styled content, Reconstruct() can be close to or exceed cold render time, + /// so we use a generous multiplier. The real value is that both complete successfully. + /// + [Test] + public void RenderHarness_WarmRender_IsFasterThanColdRender() + { + // Arrange + var scenario = new RenderScenario + { + Id = "warm-vs-cold", + Description = "Compare warm vs cold render timing", + RootObjectHvo = m_hvoRoot, + RootFlid = m_flidContainingTexts, + FragmentId = m_frag + }; + + using (var harness = new RenderBenchmarkHarness(Cache, scenario, m_environmentValidator)) + { + // Act + var coldTiming = harness.ExecuteColdRender(); + var warmTiming = harness.ExecuteWarmRender(); + + // Assert + Assert.That(warmTiming, Is.Not.Null, "Warm timing result should not be null"); + Assert.That(warmTiming.IsColdRender, Is.False, "Should be marked as warm render"); + + // With rich content (styles, chapter/verse formatting), Reconstruct() + // can be comparable to initial layout. Allow up to 5x cold time to + // accommodate style resolution overhead on warm renders. + Assert.That(warmTiming.DurationMs, Is.LessThan(coldTiming.DurationMs * 5), + $"Warm render ({warmTiming.DurationMs:F2}ms) should not be much slower than cold ({coldTiming.DurationMs:F2}ms)"); + } + } + + /// + /// Tests that the environment validator produces consistent hashes. + /// + [Test] + public void EnvironmentValidator_SameEnvironment_ProducesConsistentHash() + { + // Arrange + var validator1 = new RenderEnvironmentValidator(); + var validator2 = new RenderEnvironmentValidator(); + + // Act + var hash1 = validator1.GetEnvironmentHash(); + var hash2 = validator2.GetEnvironmentHash(); + + // Assert + Assert.That(hash1, Is.Not.Null.And.Not.Empty, "Hash should not be empty"); + Assert.That(hash1, Is.EqualTo(hash2), "Same environment should produce same hash"); + } + + /// + /// Tests that diagnostics toggle enables trace output. + /// + [Test] + public void DiagnosticsToggle_Enable_WritesTraceEntries() + { + // Arrange + m_diagnostics.EnableDiagnostics(); + + // Act + m_diagnostics.WriteTraceEntry("TestStage", 123.45, "test context"); + m_diagnostics.Flush(); + + var content = m_diagnostics.GetTraceLogContent(); + + // Assert + Assert.That(content, Does.Contain("[RENDER]"), "Trace log should contain render entry"); + Assert.That(content, Does.Contain("TestStage"), "Trace log should contain stage name"); + Assert.That(content, Does.Contain("123.45"), "Trace log should contain duration"); + + // Cleanup + m_diagnostics.ClearTraceLog(); + } + + /// + /// Tests that multiple toggle instances do not duplicate process-wide trace output. + /// + [Test] + public void DiagnosticsToggle_MultipleInstances_DoNotDuplicateTraceEntries() + { + m_diagnostics.DisableDiagnostics(); + + var tempDirectory = Path.Combine(Path.GetTempPath(), "RenderDiagnosticsToggleTests", Guid.NewGuid().ToString("N")); + Directory.CreateDirectory(tempDirectory); + var flagsPath = Path.Combine(tempDirectory, "flags.json"); + var traceLogPath = Path.Combine(tempDirectory, "trace.log"); + + File.WriteAllText( + flagsPath, + "{\"DiagnosticsEnabled\":false,\"TraceEnabled\":false,\"CaptureMode\":\"DrawToBitmap\"}"); + + try + { + using (var diagnostics1 = new RenderDiagnosticsToggle(flagsPath, traceLogPath)) + using (var diagnostics2 = new RenderDiagnosticsToggle(flagsPath, traceLogPath)) + { + diagnostics1.EnableDiagnostics(); + diagnostics2.EnableDiagnostics(); + + diagnostics1.WriteTraceEntry("DuplicateStage", 42.0, "duplicate-test"); + diagnostics1.Flush(); + diagnostics2.Flush(); + + var content = diagnostics1.GetTraceLogContent(); + var occurrenceCount = content.Split(new[] { "Stage=DuplicateStage" }, StringSplitOptions.None).Length - 1; + + Assert.That( + occurrenceCount, + Is.EqualTo(1), + "Only one RenderBenchmark listener should receive each trace entry."); + } + } + finally + { + if (File.Exists(traceLogPath)) + { + File.Delete(traceLogPath); + } + + if (File.Exists(flagsPath)) + { + File.Delete(flagsPath); + } + + if (Directory.Exists(tempDirectory)) + { + Directory.Delete(tempDirectory); + } + } + } + + /// + /// Tests that restoring diagnostics preserves the initial enabled state across repeated restores. + /// + [Test] + public void DiagnosticsToggle_RestoreOriginalState_CanBeCalledRepeatedly() + { + // Arrange + var tempDirectory = Path.Combine(Path.GetTempPath(), "RenderDiagnosticsToggleTests", Guid.NewGuid().ToString("N")); + Directory.CreateDirectory(tempDirectory); + var flagsPath = Path.Combine(tempDirectory, "flags.json"); + var traceLogPath = Path.Combine(tempDirectory, "trace.log"); + + File.WriteAllText( + flagsPath, + "{\"DiagnosticsEnabled\":true,\"TraceEnabled\":true,\"CaptureMode\":\"DrawToBitmap\"}"); + + try + { + using (var diagnostics = new RenderDiagnosticsToggle(flagsPath, traceLogPath)) + { + // Act + diagnostics.DisableDiagnostics(); + diagnostics.RestoreOriginalState(); + diagnostics.RestoreOriginalState(); + + // Assert + Assert.That(diagnostics.DiagnosticsEnabled, Is.True, "Restore should preserve the initial enabled state"); + Assert.That(diagnostics.TraceEnabled, Is.True, "Trace output should remain enabled after repeated restore calls"); + } + } + finally + { + if (File.Exists(traceLogPath)) + { + File.Delete(traceLogPath); + } + + if (File.Exists(flagsPath)) + { + File.Delete(flagsPath); + } + + if (Directory.Exists(tempDirectory)) + { + Directory.Delete(tempDirectory); + } + } + } + + [Test] + public void RenderSnapshotVerifier_MismatchMessage_IncludesConfigAndAnalysisFiles() + { + var tempDirectory = Path.Combine(Path.GetTempPath(), "RenderSnapshotVerifierTests", Guid.NewGuid().ToString("N")); + Directory.CreateDirectory(tempDirectory); + const string snapshotName = "render-mismatch"; + string verifiedPath = Path.Combine(tempDirectory, snapshotName + ".verified.png"); + + try + { + using (var verifiedBitmap = CreateSolidBitmap(2, 2, Color.White)) + using (var actualBitmap = CreateSolidBitmap(2, 5, Color.White)) + { + verifiedBitmap.Save(verifiedPath, ImageFormat.Png); + + var result = RenderSnapshotVerifier.Verify(actualBitmap, tempDirectory, snapshotName, "mismatch-scenario"); + + Assert.That(result.Passed, Is.False, "The verifier should fail when the bitmap height drifts beyond tolerance."); + Assert.That(result.FailureMessage, Does.Contain("Saved baseline:")); + Assert.That(result.FailureMessage, Does.Contain("Current run: image=2x5")); + Assert.That(result.FailureMessage, Does.Contain("Diff composition:")); + Assert.That(File.Exists(Path.Combine(tempDirectory, snapshotName + ".received.json")), Is.True, + "Current run metadata should be written next to the received image."); + Assert.That(File.Exists(Path.Combine(tempDirectory, snapshotName + ".diff.json")), Is.True, + "Comparison analysis should be written when the snapshot differs."); + } + } + finally + { + if (Directory.Exists(tempDirectory)) + Directory.Delete(tempDirectory, true); + } + } + + [Test] + public void RenderSnapshotVerifier_UpdateBaseline_WritesVerifiedMetadata() + { + var originalUpdateValue = Environment.GetEnvironmentVariable("FW_UPDATE_RENDER_BASELINES"); + var tempDirectory = Path.Combine(Path.GetTempPath(), "RenderSnapshotVerifierTests", Guid.NewGuid().ToString("N")); + Directory.CreateDirectory(tempDirectory); + const string snapshotName = "render-refresh"; + + try + { + Environment.SetEnvironmentVariable("FW_UPDATE_RENDER_BASELINES", "1"); + + using (var actualBitmap = CreateSolidBitmap(3, 4, Color.White)) + { + var result = RenderSnapshotVerifier.Verify(actualBitmap, tempDirectory, snapshotName, "refresh-scenario"); + + Assert.That(result.Passed, Is.True, "Refreshing a baseline should leave the verifier in a passing state."); + string verifiedMetadataPath = Path.Combine(tempDirectory, snapshotName + ".verified.json"); + Assert.That(File.Exists(verifiedMetadataPath), Is.True, + "Refreshing a baseline should also persist the baseline metadata sidecar."); + string json = File.ReadAllText(verifiedMetadataPath); + Assert.That(json, Does.Contain("\"ImageWidth\": 3")); + Assert.That(json, Does.Contain("\"ImageHeight\": 4")); + Assert.That(json, Does.Contain("\"DpiAwareness\"")); + } + } + finally + { + Environment.SetEnvironmentVariable("FW_UPDATE_RENDER_BASELINES", originalUpdateValue); + if (Directory.Exists(tempDirectory)) + Directory.Delete(tempDirectory, true); + } + } + + private static Bitmap CreateSolidBitmap(int width, int height, Color color) + { + var bitmap = new Bitmap(width, height); + using (var graphics = Graphics.FromImage(bitmap)) + { + graphics.Clear(color); + } + return bitmap; + } + } +} diff --git a/Src/Common/RootSite/RootSiteTests/RenderBaselineVerifier.cs b/Src/Common/RootSite/RootSiteTests/RenderBaselineVerifier.cs new file mode 100644 index 0000000000..3adf25c125 --- /dev/null +++ b/Src/Common/RootSite/RootSiteTests/RenderBaselineVerifier.cs @@ -0,0 +1,19 @@ +using System.Drawing; +using System.Runtime.CompilerServices; +using SIL.FieldWorks.Common.RenderVerification; + +namespace SIL.FieldWorks.Common.RootSites +{ + internal static class RenderBaselineVerifier + { + internal static string GetSourceFileDirectory([CallerFilePath] string sourceFile = "") + { + return RenderSnapshotVerifier.GetSourceFileDirectory(sourceFile); + } + + internal static RenderBaselineVerificationResult Verify(Bitmap actualBitmap, string directory, string name, string scenarioId) + { + return RenderSnapshotVerifier.Verify(actualBitmap, directory, name, scenarioId); + } + } +} \ No newline at end of file diff --git a/Src/Common/RootSite/RootSiteTests/RenderBenchmarkHarness.cs b/Src/Common/RootSite/RootSiteTests/RenderBenchmarkHarness.cs new file mode 100644 index 0000000000..6be98cc7e5 --- /dev/null +++ b/Src/Common/RootSite/RootSiteTests/RenderBenchmarkHarness.cs @@ -0,0 +1,496 @@ +// Copyright (c) 2026 SIL International +// This software is licensed under the LGPL, version 2.1 or later +// (http://www.gnu.org/licenses/lgpl-2.1.html) + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Drawing; +using System.Drawing.Imaging; +using System.IO; +using System.Windows.Forms; +using SIL.FieldWorks.Common.ViewsInterfaces; +using SIL.FieldWorks.Common.RenderVerification; +using SIL.LCModel; + +namespace SIL.FieldWorks.Common.RootSites.RenderBenchmark +{ + /// + /// Harness for rendering lexical entries offscreen and capturing timing/bitmap output. + /// Uses DummyBasicView infrastructure with Views engine rendering for pixel-perfect validation. + /// + /// + /// Bitmap capture uses IVwDrawRootBuffered to render the RootBox directly to a GDI+ bitmap, + /// ensuring accurate capture of Views engine content including styled text, selections, and + /// complex multi-writing-system layouts. This approach bypasses WinForms DrawToBitmap which + /// doesn't work correctly for Views controls. + /// + public class RenderBenchmarkHarness : IDisposable + { + private const int CapturePaddingPx = 4; + + private readonly LcmCache m_cache; + private readonly RenderScenario m_scenario; + private readonly RenderEnvironmentValidator m_environmentValidator; + private readonly List m_traceEvents = new List(); + private DummyBasicView m_view; + private bool m_disposed; + private double m_traceTimelineMs; + + // Cached GDI resources for offscreen layout (avoid per-call allocation). + private Bitmap m_layoutBmp; + private Graphics m_layoutGraphics; + private IntPtr m_layoutHdc; + private IVwGraphics m_layoutVwGraphics; + + /// + /// Gets the last render timing result. + /// + public RenderTimingResult LastTiming { get; private set; } + + /// + /// Gets the last captured bitmap (may be null if capture failed). + /// + public Bitmap LastCapture { get; private set; } + + /// + /// Gets a snapshot of per-stage trace events captured for this harness instance. + /// + public IReadOnlyList TraceEvents => m_traceEvents.ToArray(); + + /// + /// Gets the environment hash for the current rendering context. + /// + public string EnvironmentHash => m_environmentValidator?.GetEnvironmentHash() ?? string.Empty; + + /// + /// Initializes a new instance of the class. + /// + /// The LCModel cache. + /// The render scenario to execute. + /// Optional environment validator for deterministic checks. + public RenderBenchmarkHarness(LcmCache cache, RenderScenario scenario, RenderEnvironmentValidator environmentValidator = null) + { + m_cache = cache ?? throw new ArgumentNullException(nameof(cache)); + m_scenario = scenario ?? throw new ArgumentNullException(nameof(scenario)); + m_environmentValidator = environmentValidator ?? new RenderEnvironmentValidator(); + } + + /// + /// Executes a cold render (first render after view creation). + /// + /// View width in pixels. + /// View height in pixels. + /// The timing result for the cold render. + public RenderTimingResult ExecuteColdRender(int width = 800, int height = 600) + { + ResetTraceEvents(); + DisposeView(); + + var stopwatch = Stopwatch.StartNew(); + + m_view = MeasureStage( + "CreateView", + () => CreateView(width, height), + new Dictionary { { "phase", "cold" } }); + + MeasureStage( + "MakeRoot", + () => m_view.MakeRoot(m_scenario.RootObjectHvo, m_scenario.RootFlid, m_scenario.FragmentId), + new Dictionary { { "phase", "cold" } }); + + MeasureStage( + "PerformOffscreenLayout", + () => PerformOffscreenLayout(width, height), + new Dictionary { { "phase", "cold" } }); + + if (EnsureViewSizedToContent(width, height)) + { + MeasureStage( + "PerformOffscreenLayout", + () => PerformOffscreenLayout(width, m_view.Height), + new Dictionary { { "phase", "cold-resized" } }); + } + + if (m_view.RootBox != null && (m_view.RootBox.Width <= 0 || m_view.RootBox.Height <= 0)) + { + throw new InvalidOperationException($"[RenderBenchmarkHarness] RootBox dimensions are zero/negative after layout ({m_view.RootBox.Width}x{m_view.RootBox.Height}). View Size: {m_view.Width}x{m_view.Height}. Capture will be empty."); + } + + stopwatch.Stop(); + + LastTiming = new RenderTimingResult + { + ScenarioId = m_scenario.Id, + IsColdRender = true, + DurationMs = stopwatch.Elapsed.TotalMilliseconds, + Timestamp = DateTime.UtcNow + }; + + return LastTiming; + } + + /// + /// Executes a warm render (subsequent render with existing view/cache). + /// + /// The timing result for the warm render. + public RenderTimingResult ExecuteWarmRender() + { + if (m_view == null) + { + throw new InvalidOperationException("Must call ExecuteColdRender before ExecuteWarmRender."); + } + + var stopwatch = Stopwatch.StartNew(); + + // Force a full relayout to simulate warm render + MeasureStage( + "Reconstruct", + () => m_view.RootBox?.Reconstruct(), + new Dictionary { { "phase", "warm" } }); + + MeasureStage( + "PerformOffscreenLayout", + () => PerformOffscreenLayout(m_view.Width, m_view.Height), + new Dictionary { { "phase", "warm" } }); + + if (EnsureViewSizedToContent(m_view.Width, m_view.Height)) + { + MeasureStage( + "PerformOffscreenLayout", + () => PerformOffscreenLayout(m_view.Width, m_view.Height), + new Dictionary { { "phase", "warm-resized" } }); + } + + stopwatch.Stop(); + + LastTiming = new RenderTimingResult + { + ScenarioId = m_scenario.Id, + IsColdRender = false, + DurationMs = stopwatch.Elapsed.TotalMilliseconds, + Timestamp = DateTime.UtcNow + }; + + return LastTiming; + } + + /// + /// Performs layout using an offscreen graphics context matching the target bitmap format. + /// This prevents dependency on the Control's window handle or screen DC. + /// + private void PerformOffscreenLayout(int width, int height) + { + if (m_view?.RootBox == null) return; + + // Use the same width the site reports to Reconstruct, so the + // PATH-L1 layout guard can detect truly redundant calls. + int layoutWidth = m_view.GetAvailWidth(m_view.RootBox); + + // PATH-L4: Cache the offscreen GDI resources across calls to + // eliminate ~27ms per-call Bitmap/Graphics/HDC allocation overhead. + // Layout itself takes <0.1ms when the PATH-L1 guard fires. + if (m_layoutBmp == null || m_layoutBmp.Width != width || m_layoutBmp.Height != height) + { + DisposeLayoutResources(); + m_layoutBmp = new Bitmap(width, height, PixelFormat.Format32bppArgb); + m_layoutGraphics = Graphics.FromImage(m_layoutBmp); + m_layoutHdc = m_layoutGraphics.GetHdc(); + m_layoutVwGraphics = VwGraphicsWin32Class.Create(); + ((IVwGraphicsWin32)m_layoutVwGraphics).Initialize(m_layoutHdc); + } + + m_view.RootBox.Layout(m_layoutVwGraphics, layoutWidth); + } + + private bool EnsureViewSizedToContent(int width, int minimumHeight) + { + if (m_view?.RootBox == null) + return false; + + int requiredHeight = Math.Max(minimumHeight, m_view.RootBox.Height + CapturePaddingPx); + if (requiredHeight <= 0 || requiredHeight == m_view.Height) + return false; + + ResizeHostedView(width, requiredHeight); + return true; + } + + private void ResizeHostedView(int width, int height) + { + if (m_view == null) + return; + + var newSize = new Size(width, height); + m_view.Size = newSize; + + if (m_view.Parent is Form form) + form.ClientSize = newSize; + } + + /// + /// Captures the current view as a bitmap using the Views engine's rendering. + /// + /// + /// Uses IVwDrawRootBuffered to render the RootBox directly to a bitmap, + /// bypassing DrawToBitmap which doesn't work correctly for Views controls. + /// + /// The captured bitmap, or null if capture failed. + public Bitmap CaptureViewBitmap() + { + if (m_view == null) + { + throw new InvalidOperationException("No view available. Call ExecuteColdRender first."); + } + + if (m_view.RootBox == null) + { + throw new InvalidOperationException("RootBox not initialized. MakeRoot may have failed."); + } + + try + { + var width = m_view.Width; + var height = m_view.Height; + + Bitmap bitmap = null; + MeasureStage( + "PrepareToDraw", + () => bitmap = new Bitmap(width, height, PixelFormat.Format32bppArgb), + new Dictionary { { "phase", "capture" } }); + + // Create bitmap and get its Graphics/HDC + using (var graphics = Graphics.FromImage(bitmap)) + { + // Fill with white background first + graphics.Clear(Color.White); + + MeasureStage( + "DrawTheRoot", + () => + { + IntPtr hdc = graphics.GetHdc(); + try + { + using (var vdrb = new SIL.FieldWorks.Views.VwDrawRootBuffered()) + { + var clientRect = new Rect(0, 0, width, height); + const uint whiteColor = 0x00FFFFFF; + vdrb.DrawTheRoot(m_view.RootBox, hdc, clientRect, whiteColor, true, m_view); + } + } + finally + { + graphics.ReleaseHdc(hdc); + } + }, + new Dictionary { { "phase", "capture" } }); + } + + LastCapture = bitmap; + return bitmap; + } + catch (Exception ex) + { + Trace.TraceWarning($"[RenderBenchmarkHarness] View capture failed: {ex.Message}"); + return null; + } + } + + private void ResetTraceEvents() + { + m_traceEvents.Clear(); + m_traceTimelineMs = 0; + } + + private void MeasureStage(string stage, Action action, Dictionary context = null) + { + var stopwatch = Stopwatch.StartNew(); + action(); + stopwatch.Stop(); + RecordStage(stage, stopwatch.Elapsed.TotalMilliseconds, context); + } + + private T MeasureStage(string stage, Func func, Dictionary context = null) + { + var stopwatch = Stopwatch.StartNew(); + T result = func(); + stopwatch.Stop(); + RecordStage(stage, stopwatch.Elapsed.TotalMilliseconds, context); + return result; + } + + private void RecordStage(string stage, double durationMs, Dictionary context) + { + m_traceEvents.Add(new TraceEvent + { + Stage = stage, + StartTimeMs = m_traceTimelineMs, + DurationMs = durationMs, + Context = context + }); + m_traceTimelineMs += durationMs; + } + + /// + /// Saves the last captured bitmap to the specified path. + /// + /// The file path to save the bitmap. + /// The image format (default: PNG). + public void SaveCapture(string outputPath, ImageFormat format = null) + { + if (LastCapture == null) + { + throw new InvalidOperationException("No capture available. Call CaptureViewBitmap first."); + } + + var directory = Path.GetDirectoryName(outputPath); + if (!string.IsNullOrEmpty(directory) && !Directory.Exists(directory)) + { + Directory.CreateDirectory(directory); + } + + LastCapture.Save(outputPath, format ?? ImageFormat.Png); + } + + /// + /// Validates that the current environment matches the expected deterministic settings. + /// + /// The expected environment hash. + /// True if the environment matches; otherwise, false. + public bool ValidateEnvironment(string expectedHash) + { + return m_environmentValidator.Validate(expectedHash); + } + + private DummyBasicView CreateView(int width, int height) + { + // Host in a Form to ensure valid layout context (handle, client rect, etc.) + var form = new Form + { + FormBorderStyle = FormBorderStyle.None, + ShowInTaskbar = false, + ClientSize = new Size(width, height) + }; + + DummyBasicView view; + + switch (m_scenario.ViewType) + { + case RenderViewType.LexEntry: + view = CreateLexEntryView(width, height); + break; + + default: // Scripture + view = CreateScriptureView(width, height); + break; + } + + // Ensure styles are available (both StVc and LexEntryVc rely on stylesheet) + var ss = new SIL.LCModel.DomainServices.LcmStyleSheet(); + ss.Init(m_cache, m_cache.LangProject.Hvo, SIL.LCModel.LangProjectTags.kflidStyles); + view.StyleSheet = ss; + + form.Controls.Add(view); + form.CreateControl(); // Creates form handle and children handles + + // Force handle creation if not yet created (critical for DoLayout) + if (!view.IsHandleCreated) + { + var h = view.Handle; + } + if (!view.IsHandleCreated) + throw new InvalidOperationException("View handle failed to create."); + + return view; + } + + private DummyBasicView CreateScriptureView(int width, int height) + { + var view = new GenericScriptureView(m_scenario.RootObjectHvo, m_scenario.RootFlid) + { + Cache = m_cache, + Visible = true, + Dock = DockStyle.None, + Location = Point.Empty, + Size = new Size(width, height) + }; + view.RootFragmentId = m_scenario.FragmentId; + return view; + } + + private DummyBasicView CreateLexEntryView(int width, int height) + { + var view = new GenericLexEntryView(m_scenario.RootObjectHvo, m_scenario.RootFlid) + { + Cache = m_cache, + Visible = true, + Dock = DockStyle.None, + Location = Point.Empty, + Size = new Size(width, height), + SimulateIfDataDoubleRender = m_scenario.SimulateIfDataDoubleRender + }; + view.RootFragmentId = LexEntryVc.kFragEntry; + return view; + } + + private void DisposeView() + { + DisposeLayoutResources(); + if (m_view != null) + { + var form = m_view.Parent as Form; + m_view.Dispose(); + m_view = null; + form?.Dispose(); + } + } + + private void DisposeLayoutResources() + { + if (m_layoutVwGraphics != null) + { + m_layoutVwGraphics.ReleaseDC(); + m_layoutVwGraphics = null; + } + if (m_layoutHdc != IntPtr.Zero && m_layoutGraphics != null) + { + m_layoutGraphics.ReleaseHdc(m_layoutHdc); + m_layoutHdc = IntPtr.Zero; + } + m_layoutGraphics?.Dispose(); + m_layoutGraphics = null; + m_layoutBmp?.Dispose(); + m_layoutBmp = null; + } + + /// + /// Releases all resources used by the harness. + /// + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + /// + /// Releases the unmanaged resources and optionally releases the managed resources. + /// + /// True to release both managed and unmanaged resources. + protected virtual void Dispose(bool disposing) + { + if (m_disposed) + return; + + if (disposing) + { + DisposeLayoutResources(); + DisposeView(); + LastCapture?.Dispose(); + LastCapture = null; + } + + m_disposed = true; + } + } +} diff --git a/Src/Common/RootSite/RootSiteTests/RenderBenchmarkTestsBase.cs b/Src/Common/RootSite/RootSiteTests/RenderBenchmarkTestsBase.cs new file mode 100644 index 0000000000..5a6659ceff --- /dev/null +++ b/Src/Common/RootSite/RootSiteTests/RenderBenchmarkTestsBase.cs @@ -0,0 +1,1024 @@ +using System; +using System.Drawing; +using System.IO; +using System.Linq; +using NUnit.Framework; +using SIL.LCModel; +using SIL.LCModel.Core.KernelInterfaces; +using SIL.LCModel.Core.Scripture; +using SIL.LCModel.Core.Text; +using SIL.LCModel.Core.WritingSystems; +using SIL.LCModel.Infrastructure; +using SIL.FieldWorks.Common.RootSites.RootSiteTests; +using SIL.FieldWorks.Common.RenderVerification; +using SIL.LCModel.DomainServices; +using SIL.LCModel.Utils; +using SIL.WritingSystems; + +namespace SIL.FieldWorks.Common.RootSites.RenderBenchmark +{ + /// + /// Base class for benchmark tests, handling data generation for scenarios using Real Data. + /// Creates Scripture styles in the DB and produces rich test data with chapter/verse markers, + /// section headings, and diverse paragraph styles so StVc renders formatted output. + /// + public abstract class RenderBenchmarkTestsBase : RealDataTestsBase + { + protected const string DeterministicRenderFontFamily = "Segoe UI"; + protected ILgWritingSystemFactory m_wsf; + protected int m_wsEng; + protected int m_wsAr; // Arabic (RTL) + protected int m_wsFr; // French (second analysis WS) + protected int m_hvoRoot; + protected int m_flidContainingTexts; + protected int m_frag = 100; // Default to Book View (100) + + [SetUp] + public override void TestSetup() + { + base.TestSetup(); // Creates Cache and DB and calls InitializeProjectData/CreateTestData + m_flidContainingTexts = ScrBookTags.kflidFootnotes; // Default, can be overridden + } + + protected override void InitializeProjectData() + { + m_wsf = Cache.WritingSystemFactory; + m_wsEng = m_wsf.GetWsFromStr("en"); + if (m_wsEng == 0) throw new Exception("English WS not found"); + + // Create Arabic (RTL) writing system for bidirectional layout tests + CoreWritingSystemDefinition arabic; + Cache.ServiceLocator.WritingSystemManager.GetOrSet("ar", out arabic); + arabic.RightToLeftScript = true; + Cache.ServiceLocator.WritingSystems.VernacularWritingSystems.Add(arabic); + Cache.ServiceLocator.WritingSystems.CurrentVernacularWritingSystems.Add(arabic); + m_wsAr = arabic.Handle; + + // Create French writing system for multi-WS tests + CoreWritingSystemDefinition french; + Cache.ServiceLocator.WritingSystemManager.GetOrSet("fr", out french); + Cache.ServiceLocator.WritingSystems.AnalysisWritingSystems.Add(french); + Cache.ServiceLocator.WritingSystems.CurrentAnalysisWritingSystems.Add(french); + m_wsFr = french.Handle; + + NormalizeDeterministicWritingSystemFonts(arabic, french); + + // Ensure Scripture exists in the real project + if (Cache.LangProject.TranslatedScriptureOA == null) + { + var scriptureFactory = Cache.ServiceLocator.GetInstance(); + var script = scriptureFactory.Create(); + script.Versification = ScrVers.English; + Cache.LangProject.TranslatedScriptureOA = script; + } + + // Populate the DB with Scripture styles so the stylesheet can resolve them + CreateScriptureStyles(); + } + + private void NormalizeDeterministicWritingSystemFonts(params CoreWritingSystemDefinition[] additionalWritingSystems) + { + var writingSystems = new[] + { + Cache.ServiceLocator.WritingSystems.DefaultVernacularWritingSystem, + Cache.ServiceLocator.WritingSystems.DefaultAnalysisWritingSystem + } + .Concat(Cache.ServiceLocator.WritingSystems.CurrentVernacularWritingSystems) + .Concat(Cache.ServiceLocator.WritingSystems.CurrentAnalysisWritingSystems) + .Concat(additionalWritingSystems) + .Where(ws => ws != null) + .GroupBy(ws => ws.Handle) + .Select(group => group.First()); + + foreach (var writingSystem in writingSystems) + { + writingSystem.DefaultFont = new FontDefinition(DeterministicRenderFontFamily); + writingSystem.IsGraphiteEnabled = false; + } + } + + #region Scripture Style Creation + + /// + /// Creates the essential Scripture paragraph and character styles in the DB. + /// These mirror definitions from FlexStyles.xml and are required by StVc to + /// produce formatted output (bold headings, superscript verse numbers, etc.). + /// Without these, the Views engine falls back to plain black text. + /// + private void CreateScriptureStyles() + { + var styleFactory = Cache.ServiceLocator.GetInstance(); + var styles = Cache.LangProject.StylesOC; + + // Find or create the base Normal style (may already exist from template) + IStStyle normalStyle = FindStyle(ScrStyleNames.Normal); + if (normalStyle == null) + { + normalStyle = styleFactory.Create(styles, ScrStyleNames.Normal, + ContextValues.Internal, StructureValues.Undefined, FunctionValues.Prose, + false, 0, true); + var normalBldr = TsStringUtils.MakePropsBldr(); + normalBldr.SetIntPropValues((int)FwTextPropType.ktptFontSize, + (int)FwTextPropVar.ktpvMilliPoint, 10000); // 10pt + normalBldr.SetStrPropValue((int)FwTextPropType.ktptFontFamily, DeterministicRenderFontFamily); + normalStyle.Rules = normalBldr.GetTextProps(); + } + + // "Paragraph" - the main Scripture prose style (first-line indent 12pt) + CreateParagraphStyle(styleFactory, styles, normalStyle); + + // "Section Head" - bold, centered, 9pt + CreateSectionHeadStyle(styleFactory, styles, normalStyle); + + // "Chapter Number" - large drop-cap character style + CreateChapterNumberStyle(styleFactory, styles); + + // "Verse Number" - superscript character style + CreateVerseNumberStyle(styleFactory, styles); + + // "Title Main" - large bold centered style + CreateTitleMainStyle(styleFactory, styles, normalStyle); + } + + private void CreateParagraphStyle(IStStyleFactory factory, ILcmOwningCollection styles, IStStyle basedOn) + { + if (FindStyle(ScrStyleNames.NormalParagraph) != null) return; + + var style = factory.Create(styles, ScrStyleNames.NormalParagraph, + ContextValues.Text, StructureValues.Body, FunctionValues.Prose, + false, 0, true); + style.BasedOnRA = basedOn; + style.NextRA = style; // next is self + + var bldr = TsStringUtils.MakePropsBldr(); + bldr.SetIntPropValues((int)FwTextPropType.ktptFirstIndent, + (int)FwTextPropVar.ktpvMilliPoint, 12000); // 12pt first line indent + style.Rules = bldr.GetTextProps(); + } + + private void CreateSectionHeadStyle(IStStyleFactory factory, ILcmOwningCollection styles, IStStyle basedOn) + { + if (FindStyle(ScrStyleNames.SectionHead) != null) return; + + var style = factory.Create(styles, ScrStyleNames.SectionHead, + ContextValues.Text, StructureValues.Heading, FunctionValues.Prose, + false, 0, true); + style.BasedOnRA = basedOn; + + var bldr = TsStringUtils.MakePropsBldr(); + bldr.SetIntPropValues((int)FwTextPropType.ktptBold, + (int)FwTextPropVar.ktpvEnum, (int)FwTextToggleVal.kttvForceOn); + bldr.SetIntPropValues((int)FwTextPropType.ktptFontSize, + (int)FwTextPropVar.ktpvMilliPoint, 12000); // 12pt bold + bldr.SetIntPropValues((int)FwTextPropType.ktptAlign, + (int)FwTextPropVar.ktpvEnum, (int)FwTextAlign.ktalCenter); + bldr.SetIntPropValues((int)FwTextPropType.ktptSpaceBefore, + (int)FwTextPropVar.ktpvMilliPoint, 8000); // 8pt space before + bldr.SetIntPropValues((int)FwTextPropType.ktptSpaceAfter, + (int)FwTextPropVar.ktpvMilliPoint, 4000); // 4pt space after + bldr.SetIntPropValues((int)FwTextPropType.ktptForeColor, + (int)FwTextPropVar.ktpvDefault, (int)ColorUtil.ConvertColorToBGR(Color.FromArgb(0, 51, 102))); // dark blue + style.Rules = bldr.GetTextProps(); + } + + private void CreateChapterNumberStyle(IStStyleFactory factory, ILcmOwningCollection styles) + { + if (FindStyle(ScrStyleNames.ChapterNumber) != null) return; + + var style = factory.Create(styles, ScrStyleNames.ChapterNumber, + ContextValues.Text, StructureValues.Body, FunctionValues.Chapter, + true, 0, true); // isCharStyle = true + + var bldr = TsStringUtils.MakePropsBldr(); + bldr.SetIntPropValues((int)FwTextPropType.ktptBold, + (int)FwTextPropVar.ktpvEnum, (int)FwTextToggleVal.kttvForceOn); + bldr.SetIntPropValues((int)FwTextPropType.ktptFontSize, + (int)FwTextPropVar.ktpvMilliPoint, 24000); // 24pt large chapter number + bldr.SetIntPropValues((int)FwTextPropType.ktptForeColor, + (int)FwTextPropVar.ktpvDefault, (int)ColorUtil.ConvertColorToBGR(Color.FromArgb(128, 0, 0))); // dark red + style.Rules = bldr.GetTextProps(); + } + + private void CreateVerseNumberStyle(IStStyleFactory factory, ILcmOwningCollection styles) + { + if (FindStyle(ScrStyleNames.VerseNumber) != null) return; + + var style = factory.Create(styles, ScrStyleNames.VerseNumber, + ContextValues.Text, StructureValues.Body, FunctionValues.Verse, + true, 0, true); // isCharStyle = true + + var bldr = TsStringUtils.MakePropsBldr(); + bldr.SetIntPropValues((int)FwTextPropType.ktptSuperscript, + (int)FwTextPropVar.ktpvEnum, (int)FwSuperscriptVal.kssvSuper); + bldr.SetIntPropValues((int)FwTextPropType.ktptBold, + (int)FwTextPropVar.ktpvEnum, (int)FwTextToggleVal.kttvForceOn); + bldr.SetIntPropValues((int)FwTextPropType.ktptForeColor, + (int)FwTextPropVar.ktpvDefault, (int)ColorUtil.ConvertColorToBGR(Color.FromArgb(0, 102, 0))); // dark green + style.Rules = bldr.GetTextProps(); + } + + private void CreateTitleMainStyle(IStStyleFactory factory, ILcmOwningCollection styles, IStStyle basedOn) + { + if (FindStyle(ScrStyleNames.MainBookTitle) != null) return; + + var style = factory.Create(styles, ScrStyleNames.MainBookTitle, + ContextValues.Title, StructureValues.Body, FunctionValues.Prose, + false, 0, true); + style.BasedOnRA = basedOn; + + var bldr = TsStringUtils.MakePropsBldr(); + bldr.SetIntPropValues((int)FwTextPropType.ktptBold, + (int)FwTextPropVar.ktpvEnum, (int)FwTextToggleVal.kttvForceOn); + bldr.SetIntPropValues((int)FwTextPropType.ktptFontSize, + (int)FwTextPropVar.ktpvMilliPoint, 20000); // 20pt + bldr.SetIntPropValues((int)FwTextPropType.ktptAlign, + (int)FwTextPropVar.ktpvEnum, (int)FwTextAlign.ktalCenter); + bldr.SetIntPropValues((int)FwTextPropType.ktptSpaceBefore, + (int)FwTextPropVar.ktpvMilliPoint, 36000); // 36pt space before + bldr.SetIntPropValues((int)FwTextPropType.ktptSpaceAfter, + (int)FwTextPropVar.ktpvMilliPoint, 12000); // 12pt space after + bldr.SetIntPropValues((int)FwTextPropType.ktptForeColor, + (int)FwTextPropVar.ktpvDefault, (int)ColorUtil.ConvertColorToBGR(Color.FromArgb(0, 0, 128))); // navy blue + style.Rules = bldr.GetTextProps(); + } + + private IStStyle FindStyle(string name) + { + foreach (var s in Cache.LangProject.StylesOC) + { + if (s.Name == name) return s; + } + return null; + } + + #endregion + + protected override void CreateTestData() + { + // Individual tests call SetupScenarioData + } + + protected void SetupScenarioData(string scenarioId) + { + m_frag = 100; + m_flidContainingTexts = ScrBookTags.kflidFootnotes; + + switch (scenarioId) + { + case "simple": + case "simple-test": + CreateSimpleScenario(); + break; + case "medium": + CreateMediumScenario(); + break; + case "complex": + CreateComplexScenario(); + break; + case "deep-nested": + CreateDeepNestedScenario(); + break; + case "custom-heavy": + CreateCustomHeavyScenario(); + break; + case "many-paragraphs": + CreateManyParagraphsScenario(); + break; + case "footnote-heavy": + CreateFootnoteHeavyScenario(); + break; + case "mixed-styles": + CreateMixedStylesScenario(); + break; + case "long-prose": + CreateLongProseScenario(); + break; + case "multi-book": + CreateMultiBookScenario(); + break; + case "rtl-script": + CreateRtlScriptScenario(); + break; + case "multi-ws": + CreateMultiWsScenario(); + break; + case "lex-shallow": + CreateLexEntryScenario(depth: 2, breadth: 3); + break; + case "lex-deep": + CreateLexEntryScenario(depth: 4, breadth: 2); + break; + case "lex-extreme": + CreateLexEntryScenario(depth: 6, breadth: 2); + break; + default: + CreateSimpleScenario(); + break; + } + } + + protected RenderScenario CreateConfiguredScenario(string scenarioId) + { + var scenarioConfig = RenderScenarioDataBuilder.LoadFromFile() + .FirstOrDefault(s => s.Id == scenarioId); + + return new RenderScenario + { + Id = scenarioId, + Description = scenarioConfig?.Description ?? $"Render scenario for {scenarioId}", + Tags = scenarioConfig?.Tags, + RootObjectHvo = m_hvoRoot, + RootFlid = m_flidContainingTexts, + FragmentId = m_frag, + ViewType = scenarioConfig?.ViewType ?? RenderViewType.Scripture, + SimulateIfDataDoubleRender = scenarioConfig?.SimulateIfDataDoubleRender ?? false + }; + } + + internal RootSiteScenarioExecutionResult ExecuteScenarioAndCapture( + string scenarioId, + bool includeWarmRender, + RenderEnvironmentValidator environmentValidator = null, + int width = 800, + int height = 600) + { + RenderScenario scenario; + using (var uow = new UndoableUnitOfWorkHelper(Cache.ActionHandlerAccessor, + "Setup Scenario", "Undo Setup Scenario")) + { + SetupScenarioData(scenarioId); + scenario = CreateConfiguredScenario(scenarioId); + uow.RollBack = false; + } + + using (var harness = new RenderBenchmarkHarness(Cache, scenario, environmentValidator)) + { + var coldTiming = harness.ExecuteColdRender(width, height); + + using (var bitmap = harness.CaptureViewBitmap()) + { + if (bitmap == null) + throw new InvalidOperationException($"Failed to capture render bitmap for scenario '{scenarioId}'."); + + string directory = global::SIL.FieldWorks.Common.RootSites.RenderBaselineVerifier.GetSourceFileDirectory(); + string snapshotName = $"RenderVerifyTests.VerifyScenario_{scenarioId}"; + var verification = global::SIL.FieldWorks.Common.RootSites.RenderBaselineVerifier.Verify( + bitmap, + directory, + snapshotName, + scenarioId); + + var warmTiming = includeWarmRender ? harness.ExecuteWarmRender() : null; + + return new RootSiteScenarioExecutionResult + { + Scenario = scenario, + ColdTiming = coldTiming, + WarmTiming = warmTiming, + Verification = verification, + CaptureWidth = bitmap.Width, + CaptureHeight = bitmap.Height, + TraceEvents = harness.TraceEvents.ToList() + }; + } + } + } + + protected static string[] GetConfiguredScenarioIds(params string[] fallbackScenarioIds) + { + try + { + var scenarios = RenderScenarioDataBuilder.LoadFromFile(); + if (scenarios.Count > 0) + return scenarios.Select(s => s.Id).ToArray(); + } + catch (Exception ex) + { + TestContext.Error.WriteLine($"Error discovering scenarios: {ex.Message}"); + } + + return fallbackScenarioIds; + } + + private void CreateSimpleScenario() + { + var book = CreateBook(1); // GEN + m_hvoRoot = book.Hvo; + AddRichSections(book, 3, versesPerSection: 4, chapterStart: 1); + } + + private void CreateMediumScenario() + { + var book = CreateBook(2); // EXO + m_hvoRoot = book.Hvo; + AddRichSections(book, 5, versesPerSection: 6, chapterStart: 1); + } + + private void CreateComplexScenario() + { + var book = CreateBook(3); // LEV + m_hvoRoot = book.Hvo; + AddRichSections(book, 10, versesPerSection: 8, chapterStart: 1); + } + + private void CreateDeepNestedScenario() + { + var book = CreateBook(4); // NUM + m_hvoRoot = book.Hvo; + AddRichSections(book, 3, versesPerSection: 12, chapterStart: 1); + } + + private void CreateCustomHeavyScenario() + { + var book = CreateBook(5); // DEU + m_hvoRoot = book.Hvo; + AddRichSections(book, 5, versesPerSection: 8, chapterStart: 1); + } + + /// + /// Stress: 50 sections, each with a single verse — forces massive paragraph layout overhead. + /// + private void CreateManyParagraphsScenario() + { + var book = CreateBook(6); // JOS + m_hvoRoot = book.Hvo; + AddRichSections(book, 50, versesPerSection: 1, chapterStart: 1); + } + + /// + /// Stress: 8 sections each containing 20 verses plus footnotes on every other verse. + /// Forces footnote callers and footnote paragraph creation en masse. + /// + private void CreateFootnoteHeavyScenario() + { + var book = CreateBook(7); // JDG + m_hvoRoot = book.Hvo; + AddRichSectionsWithFootnotes(book, 8, versesPerSection: 20, chapterStart: 1); + } + + /// + /// Stress: Every verse run uses a different character style combination. + /// Forces the style resolver to compute many distinct property sets. + /// + private void CreateMixedStylesScenario() + { + var book = CreateBook(8); // RUT + m_hvoRoot = book.Hvo; + AddMixedStyleSections(book, 6, versesPerSection: 15, chapterStart: 1); + } + + /// + /// Stress: 4 sections, each with a single paragraph containing 80 verses — very long + /// unbroken paragraph that forces extensive line-breaking and layout computation. + /// + private void CreateLongProseScenario() + { + var book = CreateBook(9); // 1SA + m_hvoRoot = book.Hvo; + AddRichSections(book, 4, versesPerSection: 80, chapterStart: 1); + } + + /// + /// Stress: Creates 3 separate books with sections each, then sets root to the + /// first book. Verifies the rendering engine handles large Scripture caches. + /// + private void CreateMultiBookScenario() + { + var book1 = CreateBook(10); // 2SA + AddRichSections(book1, 5, versesPerSection: 10, chapterStart: 1); + + var book2 = CreateBook(11); // 1KI + AddRichSections(book2, 5, versesPerSection: 10, chapterStart: 1); + + var book3 = CreateBook(12); // 2KI + AddRichSections(book3, 5, versesPerSection: 10, chapterStart: 1); + + m_hvoRoot = book1.Hvo; // render the first; the others stress the backing store + } + + /// + /// Stress: Creates sections where all prose text is in Arabic (RTL), exercising + /// bidirectional layout, Uniscribe/Graphite RTL shaping, and right-aligned paragraphs. + /// Section headings remain English to force bidi mixing within the view. + /// + private void CreateRtlScriptScenario() + { + var book = CreateBook(13); // 1CH + m_hvoRoot = book.Hvo; + AddRtlSections(book, 4, versesPerSection: 10, chapterStart: 1); + } + + /// + /// Stress: Creates sections that alternate between English, Arabic, and French runs + /// within the same paragraph, forcing the rendering engine to handle font fallback, + /// writing-system switching, and mixed bidi text. + /// + private void CreateMultiWsScenario() + { + var book = CreateBook(14); // 2CH + m_hvoRoot = book.Hvo; + AddMultiWsSections(book, 5, versesPerSection: 8, chapterStart: 1); + } + + #region Rich Data Factories + + protected IScrBook CreateBook(int bookNum) + { + var bookFactory = Cache.ServiceLocator.GetInstance(); + return bookFactory.Create(bookNum); + } + + /// + /// Creates sections with formatted section headings (bold centered "Section Head" style), + /// chapter numbers (large bold red), verse numbers (superscript bold green), and body + /// text (indented "Paragraph" style). This produces richly styled output from StVc. + /// + protected void AddRichSections(IScrBook book, int sectionCount, int versesPerSection, int chapterStart) + { + var sectionFactory = Cache.ServiceLocator.GetInstance(); + var stTextFactory = Cache.ServiceLocator.GetInstance(); + int chapter = chapterStart; + + // Sample prose fragments for realistic text variety + string[] proseFragments = new[] + { + "In the beginning God created the heavens and the earth. ", + "The earth was formless and empty, darkness was over the surface of the deep. ", + "And God said, Let there be light, and there was light. ", + "God saw that the light was good, and he separated the light from the darkness. ", + "God called the light day, and the darkness he called night. ", + "And there was evening, and there was morning, the first day. ", + "Then God said, Let there be a vault between the waters to separate water. ", + "So God made the vault and separated the water under the vault from the water above it. ", + "God called the vault sky. And there was evening, and there was morning, the second day. ", + "And God said, Let the water under the sky be gathered to one place, and let dry ground appear. ", + "God called the dry ground land, and the gathered waters he called seas. And God saw that it was good. ", + "Then God said, Let the land produce vegetation: seed bearing plants and trees on the land. ", + }; + + for (int s = 0; s < sectionCount; s++) + { + var section = sectionFactory.Create(); + book.SectionsOS.Add(section); + + // Create heading StText and add a heading paragraph + section.HeadingOA = stTextFactory.Create(); + var headingBldr = new StTxtParaBldr(Cache) + { + ParaStyleName = ScrStyleNames.SectionHead + }; + string headingText = $"Section {s + 1}: The Account of Day {s + 1}"; + headingBldr.AppendRun(headingText, StyleUtils.CharStyleTextProps(null, m_wsEng)); + headingBldr.CreateParagraph(section.HeadingOA); + + // Create content StText and add body paragraphs with chapter/verse + section.ContentOA = stTextFactory.Create(); + + var paraBldr = new StTxtParaBldr(Cache) + { + ParaStyleName = ScrStyleNames.NormalParagraph + }; + + // First section gets a chapter number + if (s == 0 || s % 3 == 0) + { + paraBldr.AppendRun(chapter.ToString(), + StyleUtils.CharStyleTextProps(ScrStyleNames.ChapterNumber, m_wsEng)); + chapter++; + } + + // Add verses with prose text + for (int v = 1; v <= versesPerSection; v++) + { + // Verse number run + paraBldr.AppendRun(v.ToString() + "\u00A0", + StyleUtils.CharStyleTextProps(ScrStyleNames.VerseNumber, m_wsEng)); + + // Prose text run (cycle through fragments for variety) + string prose = proseFragments[(s * versesPerSection + v) % proseFragments.Length]; + paraBldr.AppendRun(prose, StyleUtils.CharStyleTextProps(null, m_wsEng)); + } + + paraBldr.CreateParagraph(section.ContentOA); + } + } + + /// + /// Creates sections with footnotes on every other verse, stressing the footnote + /// rendering path (caller markers, footnote paragraph boxes, and layout). + /// + protected void AddRichSectionsWithFootnotes(IScrBook book, int sectionCount, + int versesPerSection, int chapterStart) + { + var sectionFactory = Cache.ServiceLocator.GetInstance(); + var stTextFactory = Cache.ServiceLocator.GetInstance(); + var footnoteFactory = Cache.ServiceLocator.GetInstance(); + int chapter = chapterStart; + + string[] proseFragments = new[] + { + "The Lord is my shepherd, I lack nothing. He makes me lie down in green pastures. ", + "He leads me beside quiet waters, he refreshes my soul. He guides me along right paths. ", + "Even though I walk through the darkest valley, I will fear no evil, for you are with me. ", + "Your rod and your staff, they comfort me. You prepare a table before me. ", + "You anoint my head with oil; my cup overflows. Surely your goodness and love will follow me. ", + "And I will dwell in the house of the Lord forever. Hear my cry for mercy as I call to you. ", + }; + + string[] footnoteTexts = new[] + { + "Or righteousness; Hb. tsedeq", + "Some manuscripts add for his name's sake", + "Lit. in the valley of deep darkness", + "Gk. adds in the presence of my enemies", + }; + + for (int s = 0; s < sectionCount; s++) + { + var section = sectionFactory.Create(); + book.SectionsOS.Add(section); + + section.HeadingOA = stTextFactory.Create(); + var headingBldr = new StTxtParaBldr(Cache) { ParaStyleName = ScrStyleNames.SectionHead }; + headingBldr.AppendRun($"Psalm {s + 1}: A Song of Ascents", + StyleUtils.CharStyleTextProps(null, m_wsEng)); + headingBldr.CreateParagraph(section.HeadingOA); + + section.ContentOA = stTextFactory.Create(); + + var paraBldr = new StTxtParaBldr(Cache) { ParaStyleName = ScrStyleNames.NormalParagraph }; + + if (s == 0 || s % 3 == 0) + { + paraBldr.AppendRun(chapter.ToString(), + StyleUtils.CharStyleTextProps(ScrStyleNames.ChapterNumber, m_wsEng)); + chapter++; + } + + for (int v = 1; v <= versesPerSection; v++) + { + paraBldr.AppendRun(v.ToString() + "\u00A0", + StyleUtils.CharStyleTextProps(ScrStyleNames.VerseNumber, m_wsEng)); + + string prose = proseFragments[(s * versesPerSection + v) % proseFragments.Length]; + paraBldr.AppendRun(prose, StyleUtils.CharStyleTextProps(null, m_wsEng)); + + // Add a footnote caller on every other verse + if (v % 2 == 0) + { + var footnote = footnoteFactory.Create(); + book.FootnotesOS.Add(footnote); + var footParaBldr = new StTxtParaBldr(Cache) + { + ParaStyleName = ScrStyleNames.NormalParagraph + }; + string fnText = footnoteTexts[(s + v) % footnoteTexts.Length]; + footParaBldr.AppendRun(fnText, StyleUtils.CharStyleTextProps(null, m_wsEng)); + footParaBldr.CreateParagraph(footnote); + } + } + + paraBldr.CreateParagraph(section.ContentOA); + } + } + + /// + /// Creates sections where each verse uses a different combination of character + /// formatting (bold, italic, font-size, foreground colour). This forces the style + /// resolver and text-properties builder to compute many distinct property sets, + /// stressing the rendering property cache. + /// + protected void AddMixedStyleSections(IScrBook book, int sectionCount, + int versesPerSection, int chapterStart) + { + var sectionFactory = Cache.ServiceLocator.GetInstance(); + var stTextFactory = Cache.ServiceLocator.GetInstance(); + int chapter = chapterStart; + + string[] proseFragments = new[] + { + "Blessed is the one who does not walk in step with the wicked. ", + "But whose delight is in the law of the Lord, and who meditates on his law day and night. ", + "That person is like a tree planted by streams of water, which yields its fruit in season. ", + "Not so the wicked! They are like chaff that the wind blows away. ", + "Therefore the wicked will not stand in the judgment, nor sinners in the assembly. ", + "For the Lord watches over the way of the righteous, but the way of the wicked leads to destruction. ", + }; + + // Colour palette for rotating foreground colour + int[] colours = new[] + { + (int)ColorUtil.ConvertColorToBGR(Color.FromArgb(0, 0, 0)), // black + (int)ColorUtil.ConvertColorToBGR(Color.FromArgb(128, 0, 0)), // maroon + (int)ColorUtil.ConvertColorToBGR(Color.FromArgb(0, 0, 128)), // navy + (int)ColorUtil.ConvertColorToBGR(Color.FromArgb(0, 100, 0)), // dark green + (int)ColorUtil.ConvertColorToBGR(Color.FromArgb(128, 0, 128)), // purple + (int)ColorUtil.ConvertColorToBGR(Color.FromArgb(139, 69, 19)), // saddle brown + }; + + int[] fontSizes = new[] { 9000, 10000, 11000, 12000, 14000, 16000 }; // millipoints + + for (int s = 0; s < sectionCount; s++) + { + var section = sectionFactory.Create(); + book.SectionsOS.Add(section); + + section.HeadingOA = stTextFactory.Create(); + var headingBldr = new StTxtParaBldr(Cache) { ParaStyleName = ScrStyleNames.SectionHead }; + headingBldr.AppendRun($"Varied Styles Section {s + 1}", + StyleUtils.CharStyleTextProps(null, m_wsEng)); + headingBldr.CreateParagraph(section.HeadingOA); + + section.ContentOA = stTextFactory.Create(); + + var paraBldr = new StTxtParaBldr(Cache) { ParaStyleName = ScrStyleNames.NormalParagraph }; + + if (s == 0 || s % 3 == 0) + { + paraBldr.AppendRun(chapter.ToString(), + StyleUtils.CharStyleTextProps(ScrStyleNames.ChapterNumber, m_wsEng)); + chapter++; + } + + for (int v = 1; v <= versesPerSection; v++) + { + // Verse number + paraBldr.AppendRun(v.ToString() + "\u00A0", + StyleUtils.CharStyleTextProps(ScrStyleNames.VerseNumber, m_wsEng)); + + // Build a custom text props for this verse + int idx = (s * versesPerSection + v); + var bldr = TsStringUtils.MakePropsBldr(); + bldr.SetIntPropValues((int)FwTextPropType.ktptWs, + (int)FwTextPropVar.ktpvDefault, m_wsEng); + bldr.SetIntPropValues((int)FwTextPropType.ktptFontSize, + (int)FwTextPropVar.ktpvMilliPoint, fontSizes[idx % fontSizes.Length]); + bldr.SetIntPropValues((int)FwTextPropType.ktptForeColor, + (int)FwTextPropVar.ktpvDefault, colours[idx % colours.Length]); + + // Alternate bold / italic + if (idx % 3 == 0) + { + bldr.SetIntPropValues((int)FwTextPropType.ktptBold, + (int)FwTextPropVar.ktpvEnum, (int)FwTextToggleVal.kttvForceOn); + } + if (idx % 4 == 0) + { + bldr.SetIntPropValues((int)FwTextPropType.ktptItalic, + (int)FwTextPropVar.ktpvEnum, (int)FwTextToggleVal.kttvForceOn); + } + + string prose = proseFragments[idx % proseFragments.Length]; + paraBldr.AppendRun(prose, bldr.GetTextProps()); + } + + paraBldr.CreateParagraph(section.ContentOA); + } + } + + /// + /// Creates sections where all body text is Arabic (RTL). Section headings are + /// English to create bidi mixing from the view's perspective. Chapter and verse + /// numbers remain LTR (standard Scripture convention). + /// + protected void AddRtlSections(IScrBook book, int sectionCount, + int versesPerSection, int chapterStart) + { + var sectionFactory = Cache.ServiceLocator.GetInstance(); + var stTextFactory = Cache.ServiceLocator.GetInstance(); + int chapter = chapterStart; + + // Arabic prose fragments (Bismillah-style phrases and common Quranic vocabulary) + string[] arabicProse = new[] + { + "\u0628\u0650\u0633\u0652\u0645\u0650 \u0627\u0644\u0644\u0651\u0647\u0650 \u0627\u0644\u0631\u0651\u064E\u062D\u0652\u0645\u0646\u0650 \u0627\u0644\u0631\u0651\u064E\u062D\u064A\u0645\u0650. ", // Bismillah + "\u0627\u0644\u0652\u062D\u064E\u0645\u0652\u062F\u064F \u0644\u0650\u0644\u0651\u0647\u0650 \u0631\u064E\u0628\u0651\u0650 \u0627\u0644\u0652\u0639\u064E\u0627\u0644\u064E\u0645\u064A\u0646\u064E. ", // Al-hamdu lillahi + "\u0645\u064E\u0627\u0644\u0650\u0643\u0650 \u064A\u064E\u0648\u0652\u0645\u0650 \u0627\u0644\u062F\u0651\u064A\u0646\u0650. ", // Maliki yawm al-din + "\u0625\u0650\u064A\u0651\u064E\u0627\u0643\u064E \u0646\u064E\u0639\u0652\u0628\u064F\u062F\u064F \u0648\u064E\u0625\u0650\u064A\u0651\u064E\u0627\u0643\u064E \u0646\u064E\u0633\u0652\u062A\u064E\u0639\u064A\u0646\u064F. ", // Iyyaka na'budu + "\u0627\u0647\u0652\u062F\u0650\u0646\u064E\u0627 \u0627\u0644\u0635\u0651\u0650\u0631\u064E\u0627\u0637\u064E \u0627\u0644\u0652\u0645\u064F\u0633\u0652\u062A\u064E\u0642\u064A\u0645\u064E. ", // Ihdina al-sirat + "\u0635\u0650\u0631\u064E\u0627\u0637\u064E \u0627\u0644\u0651\u064E\u0630\u064A\u0646\u064E \u0623\u064E\u0646\u0652\u0639\u064E\u0645\u0652\u062A\u064E \u0639\u064E\u0644\u064E\u064A\u0652\u0647\u0650\u0645\u0652. ", // Sirat alladhina + }; + + for (int s = 0; s < sectionCount; s++) + { + var section = sectionFactory.Create(); + book.SectionsOS.Add(section); + + // English heading (LTR in an otherwise RTL view) + section.HeadingOA = stTextFactory.Create(); + var headingBldr = new StTxtParaBldr(Cache) { ParaStyleName = ScrStyleNames.SectionHead }; + headingBldr.AppendRun($"Section {s + 1}: Arabic Scripture", + StyleUtils.CharStyleTextProps(null, m_wsEng)); + headingBldr.CreateParagraph(section.HeadingOA); + + section.ContentOA = stTextFactory.Create(); + var paraBldr = new StTxtParaBldr(Cache) { ParaStyleName = ScrStyleNames.NormalParagraph }; + + if (s == 0 || s % 3 == 0) + { + paraBldr.AppendRun(chapter.ToString(), + StyleUtils.CharStyleTextProps(ScrStyleNames.ChapterNumber, m_wsEng)); + chapter++; + } + + for (int v = 1; v <= versesPerSection; v++) + { + paraBldr.AppendRun(v.ToString() + "\u00A0", + StyleUtils.CharStyleTextProps(ScrStyleNames.VerseNumber, m_wsEng)); + + // Arabic prose (RTL) + string prose = arabicProse[(s * versesPerSection + v) % arabicProse.Length]; + paraBldr.AppendRun(prose, StyleUtils.CharStyleTextProps(null, m_wsAr)); + } + + paraBldr.CreateParagraph(section.ContentOA); + } + } + + /// + /// Creates sections where each verse contains runs in three different writing systems + /// (English, Arabic, French) within the same paragraph. This forces the rendering + /// engine to handle font fallback, writing-system switching, mixed bidi text, and + /// line-breaking across WS boundaries. + /// + protected void AddMultiWsSections(IScrBook book, int sectionCount, + int versesPerSection, int chapterStart) + { + var sectionFactory = Cache.ServiceLocator.GetInstance(); + var stTextFactory = Cache.ServiceLocator.GetInstance(); + int chapter = chapterStart; + + string[] englishProse = new[] + { + "In the beginning was the Word. ", + "The light shines in the darkness. ", + "Grace and truth came through Him. ", + }; + + string[] frenchProse = new[] + { + "Au commencement \u00E9tait la Parole. ", + "La lumi\u00E8re brille dans les t\u00E9n\u00E8bres. ", + "La gr\u00E2ce et la v\u00E9rit\u00E9 sont venues par Lui. ", + }; + + string[] arabicProse = new[] + { + "\u0641\u064A \u0627\u0644\u0628\u062F\u0621 \u0643\u0627\u0646 \u0627\u0644\u0643\u0644\u0645\u0629. ", // In the beginning was the Word + "\u0627\u0644\u0646\u0648\u0631 \u064A\u0636\u064A\u0621 \u0641\u064A \u0627\u0644\u0638\u0644\u0627\u0645. ", // The light shines in the darkness + "\u0627\u0644\u0646\u0639\u0645\u0629 \u0648\u0627\u0644\u062D\u0642 \u0628\u0650\u0647. ", // Grace and truth through Him + }; + + for (int s = 0; s < sectionCount; s++) + { + var section = sectionFactory.Create(); + book.SectionsOS.Add(section); + + section.HeadingOA = stTextFactory.Create(); + var headingBldr = new StTxtParaBldr(Cache) { ParaStyleName = ScrStyleNames.SectionHead }; + headingBldr.AppendRun($"Multi-WS Section {s + 1}", + StyleUtils.CharStyleTextProps(null, m_wsEng)); + headingBldr.CreateParagraph(section.HeadingOA); + + section.ContentOA = stTextFactory.Create(); + var paraBldr = new StTxtParaBldr(Cache) { ParaStyleName = ScrStyleNames.NormalParagraph }; + + if (s == 0 || s % 3 == 0) + { + paraBldr.AppendRun(chapter.ToString(), + StyleUtils.CharStyleTextProps(ScrStyleNames.ChapterNumber, m_wsEng)); + chapter++; + } + + for (int v = 1; v <= versesPerSection; v++) + { + paraBldr.AppendRun(v.ToString() + "\u00A0", + StyleUtils.CharStyleTextProps(ScrStyleNames.VerseNumber, m_wsEng)); + + int idx = (s * versesPerSection + v); + + // Rotate: English → Arabic → French within each verse + paraBldr.AppendRun(englishProse[idx % englishProse.Length], + StyleUtils.CharStyleTextProps(null, m_wsEng)); + paraBldr.AppendRun(arabicProse[idx % arabicProse.Length], + StyleUtils.CharStyleTextProps(null, m_wsAr)); + paraBldr.AppendRun(frenchProse[idx % frenchProse.Length], + StyleUtils.CharStyleTextProps(null, m_wsFr)); + } + + paraBldr.CreateParagraph(section.ContentOA); + } + } + + #endregion + + #region Lex Entry Scenario Data + + /// + /// Creates a lexical entry scenario with nested senses at the specified depth and breadth. + /// This is the primary scenario for tracking the exponential rendering overhead in + /// XmlVc's visibility="ifdata" double-render pattern. + /// + /// Number of nesting levels (2 = senses with one level of subsenses). + /// Number of child senses per parent at each level. + /// + /// Total sense count = breadth + breadth^2 + ... + breadth^depth = breadth*(breadth^depth - 1)/(breadth - 1). + /// With the ifdata double-render, each level doubles the work, so rendering time + /// grows as O(breadth^depth * 2^depth) = O((2*breadth)^depth). Depth 6 with breadth 2 + /// produces 126 senses and ~4096x the per-sense overhead of depth 1. + /// + private void CreateLexEntryScenario(int depth, int breadth) + { + // Ensure LexDb exists + if (Cache.LangProject.LexDbOA == null) + { + Cache.ServiceLocator.GetInstance().Create(); + } + + var entryFactory = Cache.ServiceLocator.GetInstance(); + var senseFactory = Cache.ServiceLocator.GetInstance(); + var morphFactory = Cache.ServiceLocator.GetInstance(); + + // Create the entry with a headword + var entry = entryFactory.Create(); + var morph = morphFactory.Create(); + entry.LexemeFormOA = morph; + morph.Form.set_String(m_wsEng, MakeRenderString("benchmark-entry", m_wsEng)); + + // Recursively create the sense tree + CreateNestedSenses(entry, senseFactory, depth, breadth, "", 1); + + // Set root to entry HVO with LexEntry.Senses as the containing flid + m_hvoRoot = entry.Hvo; + m_flidContainingTexts = LexEntryTags.kflidSenses; + m_frag = LexEntryVc.kFragEntry; + } + + /// + /// Recursively creates a tree of senses/subsenses. + /// + /// The owning entry or sense. + /// Factory for creating new senses. + /// Remaining nesting levels to create. + /// Number of children at each level. + /// Hierarchical number prefix (e.g., "1.2."). + /// Starting sense number at this level. + private void CreateNestedSenses(ICmObject owner, ILexSenseFactory senseFactory, + int remainingDepth, int breadth, string prefix, int startNumber) + { + if (remainingDepth <= 0) + return; + + for (int i = 0; i < breadth; i++) + { + var sense = senseFactory.Create(); + string senseNum = prefix + (startNumber + i); + + // Add sense to entry or parent sense + var entry = owner as ILexEntry; + if (entry != null) + entry.SensesOS.Add(sense); + else + ((ILexSense)owner).SensesOS.Add(sense); + + // Set gloss and definition + string gloss = $"gloss {senseNum}"; + string definition = $"This is the definition for sense {senseNum}, which demonstrates " + + $"nested rendering at depth {remainingDepth} with {breadth}-way branching."; + + sense.Gloss.set_String(m_wsEng, MakeRenderString(gloss, m_wsEng)); + sense.Definition.set_String(m_wsEng, MakeRenderString(definition, m_wsEng)); + + // Recurse for subsenses + CreateNestedSenses(sense, senseFactory, remainingDepth - 1, breadth, + senseNum + ".", 1); + } + } + + private static ITsString MakeRenderString(string value, int writingSystemHandle) + { + var propsBuilder = TsStringUtils.MakePropsBldr(); + propsBuilder.SetIntPropValues((int)FwTextPropType.ktptWs, + (int)FwTextPropVar.ktpvDefault, writingSystemHandle); + propsBuilder.SetStrPropValue((int)FwTextPropType.ktptFontFamily, + DeterministicRenderFontFamily); + + var stringBuilder = TsStringUtils.MakeStrBldr(); + stringBuilder.Replace(0, 0, value, propsBuilder.GetTextProps()); + return stringBuilder.GetString(); + } + + #endregion + } + + internal sealed class RootSiteScenarioExecutionResult + { + public RenderScenario Scenario { get; set; } + public RenderTimingResult ColdTiming { get; set; } + public RenderTimingResult WarmTiming { get; set; } + internal global::SIL.FieldWorks.Common.RenderVerification.RenderBaselineVerificationResult Verification { get; set; } + public int CaptureWidth { get; set; } + public int CaptureHeight { get; set; } + public System.Collections.Generic.List TraceEvents { get; set; } + } +} diff --git a/Src/Common/RootSite/RootSiteTests/RenderTestAssemblySetup.cs b/Src/Common/RootSite/RootSiteTests/RenderTestAssemblySetup.cs new file mode 100644 index 0000000000..575ec8ed09 --- /dev/null +++ b/Src/Common/RootSite/RootSiteTests/RenderTestAssemblySetup.cs @@ -0,0 +1,46 @@ +using System; +using System.Drawing.Text; +using System.Linq; +using System.Runtime.InteropServices; +using NUnit.Framework; + +namespace SIL.FieldWorks.Common.RootSites +{ + [SetUpFixture] + public sealed class RenderTestAssemblySetup + { + private const int DpiAwarenessContextUnaware = -1; + private const string DeterministicRenderFontFamily = "Segoe UI"; + + [DllImport("User32.dll")] + private static extern bool SetProcessDpiAwarenessContext(int dpiFlag); + + [OneTimeSetUp] + public void OneTimeSetup() + { + // Force grayscale antialiasing (ANTIALIASED_QUALITY=4) for deterministic + // rendering across dev machines and CI (Windows Server 2025). + // The native VwGraphics reads this env var when creating GDI fonts. + Environment.SetEnvironmentVariable("FW_FONT_QUALITY", "4"); + + try + { + SetProcessDpiAwarenessContext(DpiAwarenessContextUnaware); + } + catch (DllNotFoundException) + { + } + catch (EntryPointNotFoundException) + { + } + + using (var installedFonts = new InstalledFontCollection()) + { + bool hasDeterministicFont = installedFonts.Families.Any( + family => string.Equals(family.Name, DeterministicRenderFontFamily, StringComparison.OrdinalIgnoreCase)); + TestContext.Progress.WriteLine( + $"[RENDER-SETUP] DPI unaware requested. Font '{DeterministicRenderFontFamily}' installed={hasDeterministicFont}"); + } + } + } +} \ No newline at end of file diff --git a/Src/Common/RootSite/RootSiteTests/RenderTimingSuiteTests.cs b/Src/Common/RootSite/RootSiteTests/RenderTimingSuiteTests.cs new file mode 100644 index 0000000000..ef07c20da5 --- /dev/null +++ b/Src/Common/RootSite/RootSiteTests/RenderTimingSuiteTests.cs @@ -0,0 +1,135 @@ +using System; +using System.Collections.Generic; +using System.IO; +using NUnit.Framework; +using SIL.FieldWorks.Common.RootSites.RenderBenchmark; +using SIL.FieldWorks.Common.RenderVerification; + +namespace SIL.FieldWorks.Common.RootSites +{ + /// + /// Main benchmark suite that executes all scenarios and generates a timing report. + /// Each scenario is timed and also checked against the committed pixel baselines + /// so performance and correctness are validated together. + /// + [TestFixture] + [Category("RenderBenchmark")] + [Category("Performance")] + public class RenderTimingSuiteTests : RenderBenchmarkTestsBase + { + private static List m_results; + private RenderBenchmarkReportWriter m_reportWriter; + private RenderEnvironmentValidator m_environmentValidator; + + private static readonly string OutputDir = Path.Combine( + TestContext.CurrentContext.TestDirectory, + "..", "..", "Output", "RenderBenchmarks"); + + [OneTimeSetUp] + public void SuiteSetup() + { + m_results = new List(); + m_reportWriter = new RenderBenchmarkReportWriter(OutputDir); + m_environmentValidator = new RenderEnvironmentValidator(); + + if (!Directory.Exists(OutputDir)) + Directory.CreateDirectory(OutputDir); + } + + [OneTimeTearDown] + public void SuiteTeardown() + { + var run = new BenchmarkRun + { + Results = m_results, + EnvironmentHash = m_environmentValidator?.GetEnvironmentHash() ?? "Unknown", + Configuration = "Debug", + MachineName = Environment.MachineName, + FeatureFlags = GetActivePerfFlags() + }; + + m_reportWriter?.WriteReport(run); + TestContext.WriteLine($"Benchmark report written to: {OutputDir}"); + TestContext.WriteLine($"Summary: {Path.Combine(OutputDir, "summary.md")}"); + } + + [Test, TestCaseSource(nameof(GetScenarios))] + public void RunBenchmark(string scenarioId) + { + var execution = ExecuteScenarioAndCapture( + scenarioId, + includeWarmRender: true, + environmentValidator: m_environmentValidator); + + TestContext.WriteLine($"Running Scenario: {scenarioId} - {execution.Scenario.Description}"); + + if (!execution.Verification.Passed) + TestContext.WriteLine($"[VERIFY] {execution.Verification.FailureMessage}"); + + m_results.Add(new BenchmarkResult + { + ScenarioId = execution.Scenario.Id, + ScenarioDescription = execution.Scenario.Description, + ColdRenderMs = execution.ColdTiming.DurationMs, + WarmRenderMs = execution.WarmTiming.DurationMs, + ColdPerformOffscreenLayoutMs = SumStageDuration(execution.TraceEvents, "PerformOffscreenLayout", "cold"), + WarmPerformOffscreenLayoutMs = SumStageDuration(execution.TraceEvents, "PerformOffscreenLayout", "warm"), + PixelPerfectPass = execution.Verification.Passed, + MismatchDetails = execution.Verification.FailureMessage, + SnapshotPath = execution.Verification.VerifiedPath, + TraceEvents = execution.TraceEvents + }); + + if (!execution.Verification.Passed) + Assert.Fail(execution.Verification.FailureMessage); + } + + public static IEnumerable GetScenarios() + { + return GetConfiguredScenarioIds("simple", "medium", "complex", "deep-nested", "custom-heavy"); + } + + private static Dictionary GetActivePerfFlags() + { + return new Dictionary + { + { "FW_PERF_P125_PATH1", GetPerfFlagState("FW_PERF_P125_PATH1") }, + { "FW_PERF_P125_PATH2", GetPerfFlagState("FW_PERF_P125_PATH2") }, + { "FW_PERF_P125_PATH5", GetPerfFlagState("FW_PERF_P125_PATH5") } + }; + } + + private static string GetPerfFlagState(string variableName) + { + var value = Environment.GetEnvironmentVariable(variableName); + if (!string.IsNullOrEmpty(value)) + return value; + + if (string.Equals(variableName, "FW_PERF_P125_PATH5", StringComparison.OrdinalIgnoreCase)) + return "not-implemented"; + + return "default-on"; + } + + private static double SumStageDuration(IEnumerable traceEvents, string stage, string phasePrefix) + { + if (traceEvents == null) + return 0; + + double total = 0; + foreach (var traceEvent in traceEvents) + { + if (!string.Equals(traceEvent.Stage, stage, StringComparison.OrdinalIgnoreCase)) + continue; + + if (traceEvent.Context == null || !traceEvent.Context.TryGetValue("phase", out var phase)) + continue; + + if (phase.StartsWith(phasePrefix, StringComparison.OrdinalIgnoreCase)) + total += traceEvent.DurationMs; + } + + return total; + } + } +} diff --git a/Src/Common/RootSite/RootSiteTests/RenderTraceParserTests.cs b/Src/Common/RootSite/RootSiteTests/RenderTraceParserTests.cs new file mode 100644 index 0000000000..f9fcbc7b05 --- /dev/null +++ b/Src/Common/RootSite/RootSiteTests/RenderTraceParserTests.cs @@ -0,0 +1,45 @@ +// Copyright (c) 2026 SIL International +// This software is licensed under the LGPL, version 2.1 or later +// (http://www.gnu.org/licenses/lgpl-2.1.html) + +using NUnit.Framework; +using SIL.FieldWorks.Common.RenderVerification; + +namespace SIL.FieldWorks.Common.RootSites +{ + [TestFixture] + public class RenderTraceParserTests + { + [TestCase("Perform-Offscreen-Layout")] + [TestCase("Layout.v2")] + [TestCase("cold/Layout")] + public void ParseLine_StageNameContainsSeparators_ParsesStageName(string stageName) + { + var parser = new RenderTraceParser(); + double cumulativeTime = 0; + + var traceEvent = parser.ParseLine( + $"[RENDER] Stage={stageName} Duration=12.34ms Context=phase=cold", + ref cumulativeTime); + + Assert.That(traceEvent, Is.Not.Null); + Assert.That(traceEvent.Stage, Is.EqualTo(stageName)); + Assert.That(traceEvent.DurationMs, Is.EqualTo(12.34).Within(0.001)); + } + + [Test] + public void ParseLine_TimestampedStageNameContainsSeparators_ParsesStageName() + { + var parser = new RenderTraceParser(); + double cumulativeTime = 0; + + var traceEvent = parser.ParseLine( + "[2026-01-22T12:34:56.789] [RENDER] Stage=warm/Layout.v2 Duration=7.5ms Context=phase=warm", + ref cumulativeTime); + + Assert.That(traceEvent, Is.Not.Null); + Assert.That(traceEvent.Stage, Is.EqualTo("warm/Layout.v2")); + Assert.That(traceEvent.DurationMs, Is.EqualTo(7.5).Within(0.001)); + } + } +} \ No newline at end of file diff --git a/Src/Common/RootSite/RootSiteTests/RenderVerifyTests.VerifyScenario_complex.verified.png b/Src/Common/RootSite/RootSiteTests/RenderVerifyTests.VerifyScenario_complex.verified.png new file mode 100644 index 0000000000000000000000000000000000000000..2f2314e31177d33f57e5f33fadc8140e3da0a23c GIT binary patch literal 134025 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

niaWVv~mSfWFW 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 Y7k5%@7u%h%4g6fXXmNq~+pUNH2f9v_nE(I) literal 0 HcmV?d00001 diff --git a/Src/Common/RootSite/RootSiteTests/RenderVerifyTests.VerifyScenario_deep-nested.verified.png b/Src/Common/RootSite/RootSiteTests/RenderVerifyTests.VerifyScenario_deep-nested.verified.png new file mode 100644 index 0000000000000000000000000000000000000000..fdb8500c76b415ff8171b0ec9d6a35f042a17f69 GIT binary patch literal 58042 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Ν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

Qkd=258Ida%csja)dM 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 OfWXt$&t;ucLK6UBDt8h9 literal 0 HcmV?d00001 diff --git a/Src/Common/RootSite/RootSiteTests/RenderVerifyTests.VerifyScenario_lex-deep.verified.png b/Src/Common/RootSite/RootSiteTests/RenderVerifyTests.VerifyScenario_lex-deep.verified.png new file mode 100644 index 0000000000000000000000000000000000000000..f2c72a7bea93be73a9819e3720d0174297f1bccc GIT binary patch literal 82877 zcmdqJ2T)UM+y0B9C@LZ%AkvhoL{LBx2qdT=f)tSw5CU7uMv)>lfT5_U)KDWJgh-KY zB0+ky0HJ6?5$PQay#$aBXC~h@M zLG~%oS#rxW{xm*vfG}A~R(wBHI<4&&tuj8D|Ix}saL3jT-h+P4qFY^CwBKi7SU$A% ziIx6}p=`hGar&!Ssdhj5i?_tz7nEBHaFUA?9Xk^h54?}BOCd!-*?|EH>6~o#1k@Zv{WIU?Rz{7dvnYNei4Cu zxV=~3+ANP|ne=Iort8N!v^1eZ9hDz0LnB*ZE64!(pa$#dynfq~ZL5uKE8NUp zIcsZ2=4Pg8pNBqA=(NXfot*vib=mA&!Hq1jqcsow%U@kR1ZP( znnAvL&3{-c2e{iB^cf@Vt8cNN?0F7($0s?S&%zqex8+-Go!W)to%gE9m_bjz6&nNE zIEGo9`KIs3;=0}69H${__R0$(hm?3yFOio5o*u@%HtCJClMmix-l`Stc`mnUY`zNH zh^^P6kOtk~e>|cC+K_35T8K>d`%I6f=PAG}zG;(ITb-=e;nubj;3+Q-#M;?0Y$rbh zZmx+XU>f-QUHut8E<|r6j8)=e;8(ta9L34&_7MU#9!yIkd}Z%RV#$G5S>J}lA~|3~ zV;URiqSD~(T(A61u-x4iz75x>B$>&AF@s9ezK*%{&~R#9c9BIJ{a~5DSiZUz4ZdE_ z4{t09#>npSYjcvghE-wKXFi*xIZ=h}D{*lY^;297}41tkqlbYm^d@XjgSmH($K}+K9Z=Xy?nw`@_W4yhzxX z*{5r|(1o${p`b$haU0?UZj~dKcc`ej5WK1KCc-YO9`_Y>st}tCy0^g%ZR-#%>oG7a zzJ!$#hgBEWH|&|&qg!ppi@=q?wm&3oF(Ar)0w2XzCs*rp)wkeOL+wa+3{snrXC|VlC2J8mQ-p~! z>AALeOi%; zN35j<8H8~xi50>ODyjJ9Db0eJT6lilM*YUH{#0`vW!^lBA@=8G*|m{T zZSc8kQW(n%#L|iRIjK-+(rRuvY2}@99iJX}vJ)*YUTP6vc)y@^-tM!LaLU9}@o%CS zz0-+xud)fC_!3~!zD{Mw?lZ~{?ApxZVp+br>sYsL#q$MB4^_S?fW%oBF?Ff#3USco z3I#dH952e<94Gd8@~K^YlujFD`r4NX*-X3I*kN!7iK7^k@OJICZAu-9Po906tfKj* zB$AUotv2|vWTFZO7fB!LB0F6cRu(FhX1MB=@90m=>XKR!a^9$`)F^D}r~o0V(}XH{ z9b>c|qF(`1<*#cfaVeLpOd)q&bG6R)aZf9WGGC3ie$w-P@f8Z1Ru?U2nc4Y!~3Av6quVisLM3fV@A@g^`Ugsg$nL53}o1ka&Lg~P;iv5YLs zMKY?A_+1%0`b5s*t-($rtV{ET{j|b z?r%p`S6j8X6i=J7P;u`wj$SoA9xeCj+Og|UonR)hPMDi8c)W&kQmdr6%fwb1-WF@dtp4U}k7L1xe6PMHPQU|*@lM{9^wmmpQL z$%Bau=e$@e9oZeqWTKiz{@ZNa^(w!%;)KtSQ4>fv^sU0OT4qavYLt4#&E^62u->Oy zQ3ncz#{D1)ZeUU0DqY^+O%ZOA>;*IR@Z7Olyk?su zx?2dUfWee$AW$7}@5H4?v?H3NUpRklsMWsCa{Q!Z>0G*3E2t|5IGo|&$##*{6cc|K zZ7<)4;8%MdpRSuhW~|4%PFGo6AIor_N7>wBG!X73X7a`}GT|x}P9VeH3)Wo`oU!tdCi&>c7rd5_$wt;m6V??^Xi@nJT_Pv! zJyjNT+pc80^Vh|NBP%b-B~htTRukoeA~=079@kuqeJe;bKeNI`blS9{Fn8GhVF`@L1b!R@@31@GuHFtnRkJ&jVo(i<(;+34@v%Q|h&JK?IG z>mgcLAxIJdSA5#xS2@4L@jkvu`OAw>x8Huv-s|~R?M9=G2oDR=ds;NFhkA)wW#mmj ztR0&Ip5UcbXW*tUI&2+>KCty%Zf#&usQA8og!i0FQd^fL?J|}eHDPbuw5Z#9B?<#} z7S)&3TZs>p+i!&>UgOe%Z{0o|9O#o}p38%fG@o%em*UVBaW(L>D^U}{^_AL) znh~#c;1ZUruIXc4;+{EN!nZfzD!9gI0lOww zJ<_ziUmvC*Dr{5FmnZ-n;)~R55D#w$C-4(7Qwm(3IfAlm2GAnki|H+k_fKEp&H4HT zRwd7K$S*F;QTfG{x=o(Q*24A`aVm#CgWOY27aeZ3xloQW)-Cse^x0IoJst{n%KQ&; zyR=}ziSL1d`&?D+R=+Va*ir>GEw93!VjtoRKdc2{1vmU3FGmgW_K$@J?qKMDIgFK4 zx}*CQiha;_80xZms_(4QdD4!G9sdTGLj>}7G(m$6mN@s&5XX=FmT5S2RQq@{7ovXD zNP_<6?9_Tj>vTE*MAt`+4>yDDPa8JSF$oFw?Y4z24WibZC+_5UwhZtbDu)#pA&O;p zJm{s|M+)#^je3l7wlQnja5JM7Cwt`PTVhnnqE)j4V>3EbEZ+8yd}(-rGkb)#9t;&| zsBM0>qbSm)(O$VMN0whHHHBg`rpg1z%=S)O82CtfOz`+cFp+;XA?pHy;PRRvYd0id~>X0txTz_ z0^#G>`o&PS{H9S9Y`NwVbfB53X3m+mSO(u?zy?@q!<+j`49>r@&t?f|WD=Qv_)_bE zEXT$5j~e)OEp-I){RPf#nC(xes^Q%?1h%(czu9IxOF+e^#tSU1o)Gz_F&QLezh>9zZHO9_FpSb!IH*J13SR- z6EGrr4uQ^mHS=b|pnK{=s;}*RKgW@>s)#J+Hq6wsZe*zJupMI2Grdgo1SU8JH?C8#S7any-h2NG7bg+*kvy{G zhpBMZ>8HIgSylO%6UDt>nt3SmgPxICC%(BOYuY%wMo`5@*63<&*U5T!;JzHUcSSAd znO^*ex~UuWz1ZsQpwcXX6wT#xt@!ppofAB+rdT&g(cyJ@M~%|h_OZ)hg#qc}Y25;K zS>sRbr?C^bSUWC|Gs5mLaP?0Ae$x`gpvyFtY&U~elXUQROpER57w}emz{pV|x}s+; zMt3929Ognix5qTMVbNyY)Fyt`9cDbT&zs~r^@2)$w{}rKmx~CuseNwYbfK^UMA|W( zW|r$MA8}UZ*n)MC^hbhhBU)gpXZ z!G%EfsZCSNbe$Tiuqt!RoBsuVRw~P1#FP4d6G3QBy}k485mt#8CdHrw(OCIqkCE-SadHy)Z)aaoj0<|A7%P{wFCAthRlAu%FKGmHpf#S zNIcDDqfQ`VLTA&U1Vj1;F9yl-t&Dh-x;m>;h^a1-loA&urz=<&{VzkpGObEfP>Ks1 z5l8NN!Q+dvDzT4yJ#Z4S3pN$$YrE$RyM1a5SqWpWSGs?N->am$GIsUd2Dn+iI+^n7 zt($(au_i$*o*}VTfGer>{i_n{Ax2|L^mQ2p+7Cqra+hS!Yyy`{Gd%4HM)H7|fZ4bD5rLUqIi~`9T6*@2GiX(H`??TL!(t1#J z0!~Np+--17ga1^iGt5qb3Tnx}CbCo;rVSj?%@|8}7?#X>(V$?$#wM$4<>lOX!LXFu zk(i!k7kvc5TLj?>?Bf_$*WlS8p{_J{GR2^>v|nTe!;1EeB4LaUi1QgZ^hUf|;x}Q? zNg->PYoI659@N$cis5d!V;L26&) z=+?U$&$CjbPn>DUv084c>|n(UsCP94P6lK5m-q71w!{$(aHI#}!m_r{?Ih3_3H0{g9j=TGkHGPg-b8~n#nTl`0I2A** z-G_1Q!lISZ@KSweIBHF5EN9rD1U4U2yLzq{=~Js&;2E!=*HeF{BUy@bg96cZk`Jvk z8hz4z%5iU9obyx4(>!<8^7Zk0Cba_9I9!i)DM^(-J3vdN6+rREG1m?LV75Kk#fuzH zy`Q8Q5c5QP07liYU@YF#7&lc#;)m-o6JNqhfx$_pEn zt21wI{o#Xdm8Evnn*GG7?C(4(&lgth{bFgQw?~aAW_aNMUXl*AulHwvWO4v@&y=@Tk`XV;YQXDFaC)}pA58a!>ju(bn(UB-}H$k zO9sXp9}w%GHJ}swN`~08d7i*x=%Qo$V}q|utL~SeFY8_7Q8+s!rQP0`3 zl5MD!%#ps(_~a5#@Ny+;`RRf!<6Y{;Z@noeaH2o*>vsQ@0jdyp4%VTpgKVmx8Wb!=z%|z=dbo|I9IZb|7gc?4zCI| z#prvFd#EI<2IB>tWi{EcFI98o)#l1^qP~Lyg0qkv(r^R|+EAj2ps0a=5J7+A0#@oz zEP9m2q92(5i$&$OSriu2HDZf2%d9+11VqVibWzfNTa(y?r_#4dE z+>=t9-s!fxBW1r8BDduU1FYy7+UKN(hlUZi$N}g#b?UD9gC@gyxMaShVYl<1W|-43 zkH;9D%dAzOuUv$^esc#nOpD>T8VY(f+X=}9v)r=XK-{ZI1Fw!9#MpG)X@M=fS^MZt z2bg9r)r;W=Gu<(&@h|uU%sx5r>@>Zl6#Nd_^j;HYCS7tPr}{ZAiw>Z=bO5zM7|;Ne z>nDJAeFxCTSN{q?lRf?xK+8%JI%RbRv!b{lO)+{%!wo*`_e+^R)!MxKJ6;T}=D0|m zppZT1JF7|B=J!pnbQ|PSHm@2QKbLiE_AwDO6<$C1AS93RZ0S9MpR&X4VB`|Go=ujRq~qr#KrRv&)dP zK8Fk@tDV}o328>%pI*%bxhxld28kaHREcf+&G1Ih(6K713>Qy<435$fA?{sj1u7ll zQcNd=IB!O>Q5Co&6dz4KU9gEKgqV`N>nOtD34@0%!^cHeP+jtMtxn#C0(cGpR?rx4seCUS8y0qFU0$z)4xpuzhd~9Nr8Xu? zj%s{r(j`6_7LEX!0C%bq@lrx&u*-4>FaGy_$KhRU%Vhm?%9j1MXRoZ-M!LH=)U?7fj~HG%&;b0aa}5qq^eSiFm42Q-0W5iCw5S^wCrZ8@BE#HcRMhqD+aD5DcJTy`H)=8=s^B z60uQS(QZ+X!BFYXYG<^As$cmGJFd&Js z5$eR4$AXz}N6uJ*!vHcd^bpXpKi5$#lzw^R^ja8j9v)x4=4N&Gb0}FiEr@JdIUe&H zeY%q7l=)r9q;7T;9gFI1OAgvF^`)u}uSNlTHa*W9HXWp;<|E%Li7{;gj_8Ep;%QTz zgeD3vdQq-U(=BYhe$=!ocVb?4w8s3neDeh~8(sA5wT8WkFoUSM(RllFVp6)vdT^#d zccl=ZYkT$XGgU*!R}0@KFdx5cWp_iOHVd>*O4&_2P&#Eu!5q%fE^&s+fVFGd6^(ar z%`i1n8TD>IS9cGbtlf?cRK=`y)nzO^F^^gg%CU?z$+uRUPSN;XGRg@I8`kvbb1N$` zeUY2=Kh)V`oAZM@hkjCL6a=UAZJRpV{)sw;enp+^^^83hZFJ4EtVPnvs_XOgO4&Gq zt46qTK8fnsT+AMP@nuT=Coo~L*K+^yQ5o)NeRWf2k(t$bhSp+RhE)q;KjdHb|oEKn3&&A6Ll0PJMVt3DOU zVrxVDZho~Z7ScB(yf-X|tyiNp99tZ6tojy%)a|oo5&|t_X1qn^Pq+l};l_1OFF45&aN+_)HZ4jy;hgm`7#O&?Bq!Rxs-lKEUYLV_UOpO^5IJdVW&fe zVv&2hOtFOzP;NtK8sN7?5Grdv&62qmCT%uOn$py?D&0+%tukOI%YE5?g7j8RxaNMI z_?A2}BO@4cyZ=tO^|`lH9F(>3Xw_=Y@QVjoNu0;#k1R@4;ZLf zUov}UTsMn%%M&nzM&`z_cW^-NlMo^EO`-&HK?Zd{51<~!*!s0p9qdKgqx&EeGiHu|$u?5x55nnY7 zOS>DRfopJrepd_<*^RL^@noU6I$1|On=F$R5tDN@$y?pTQ)WpI+eu<{eNEu={xqc`$2``oc{ss!8dQ z_!m3h%D;)dUoRKrnA7jQT(}?lSgcxJkyZBi>|xiD-%Cp7j{pP3l0gAj%0CW`Isv1)dmfl)9Q1)y&u0?0%$ylb-L9+k9a|+aQCHYQgP47NPgUMNm*E?1O zA>})oFyPcP({@cxFghD8LyUU7*=Uf-_`(JXKqgyJHXX~50y)$CPo^<^OHE%|^yYsS z*Mq+)&&(?ohoN+G9Cl5M(;>5uF}rk65>Q_6o=bI5Qh(Fs=W0Eqp4w@;PV`+TLaq1o z%mucFzJ=2PtpEORZcE1({=Tek)U&tSfWG1tdkhh*f{tgiEPK|nayBEtKDIBhZo7Z+ zi&OqS8t5@uK6uA6lW@S6kg<|kZpqK-umaQZmp#&HRJG++1x`sga#JDq>hCXBw*}6(h3}b$FVZ*@{0GiNf`1B| zzrss;)t|0@R_s+0QXw;CHqI*zCi#OVpCLp|NXfqMp#=3pQIzkOm`wv{nsZBWUJ+(i zGfmDcFgSCQ4K#Of$wdu{X)QjShj9LaM}dZB#Pv-2?zCkWbv;$z`uuHH33&QAR04>g zyFrz%rrn;`%#_}oWnD(J6R3?B^HqJ04smzKAZGW0u>qpHlo(_z2tzoU=s83aJvStA zsEF*vzIVp)KusU)ns}>F3%@$D>Q3w{rPgwkE*$FhP=37$86m|G)VP|bEz(&Az{Ss4 z`Xx?AoMN+%-n-r|R>w{R+eMH|6x{tIn_E*o+zy-mD7CW};xz9Zo+--imV^y0YizW7 zR0d~T4*!BQ`MqHLY_Q2l2`SiU`D7{2PpPx7&g+|BSdvO6NSqs9tV{jedRW3?F$g45 zj7%W+CCGtC&fgg|Eps*SC8(YZeDZP3gaH!_f{J6k-MJl}BJV*LDhQ|Qix1Q-7Ch^f z!-{39`_#Bq=}m%*2^Y`gr<4Ax&^|4m4ylbQ8XtbFv#@f6Xke-mcRPhfnq_|^&8V*G zc5O|M^(#n2squeBnz#OnG=HlX$_6k~kJKq*>RUs0D`0j+pbc=1l#qIZxmUl^ItS)I zgZPWkSMPDN+z^SE!@c8vbUtQjhY?U`XY$;xvzq~R_8lVhI=i~mpTtf{5pStFL^nwt zhnmP+eeuUayMMV_w}EzT+i}qs>&6xQ)lM8-%>veGtE4y&#EKXGu`=?@TH}T4b_Y#; z%PPyy8+B6#t@!n9S8&u6*coQ;3?R0=0U(8m0at8HnKt5cS5x{>&-)zluEo3|H`w|O zO-lQxx#?9TQgi5xOSBrGjC?+5Gj&+a8fG`|PA>5B2~$8>xo%vq?gh%P)iT9y2JY5+ zT$FpP#B7#jInVw*oB6p+W(Tga5KfwFRgfH36#G?ef`@C}lP=;d=j2md+*jw0tDPF&^`qt-ch6U0T3pN`xfT5;_N=PeX;-Jy zSst!wt8saA)42oQJh^3uEwiOgAVZ4yqM(9pSlUc6-!-s?Irp*QD;@P=>XeAG9B^Ck zJb1ONTm@Dz4ya(@m6w&qzqd=6_Kh#QbW7UMbk2KUaAikl%O28u9-cH-8ri^Jh^j7AmrhS=R%5#N8GuM@ml6Fgru( zvQFVLmmVN|sVSrzEtGK-p~No)tADd%S7h`WzNODhD7kTnQHK)EK$kfke1ZBpBZ8pH zeyzf`DaqN>>BSNtWq+6oP`KqQ%6WI%Q7omI$483_BB0bATA%S1hl$4(Yt{gow#9+45@e!`Oa{i~LbHTEDf%jxT60^2H=A>2(MGM9xykrZ;^b51!nV!Idh+Fn1wF zaP6+!05TmRfFWs{y#x~{aS*KI!(WuyW1LC>l~1khV5z&hTH#*29O2W(JS2ENs}HUm zwN83kU#U*fKFx#%<~mdR<$jn%5f<|3t%QD^aiHML*ZH?C#kRk#2nqq%X?29z@CSAl zz?;z_R|O*`1(N{mJoR7LdGy!Vc>}=CdZVvB+fpYMkUEb6Qs-2u6uRpwKKAqXbGf%L zl3hCe=)9LjP@rvyM@R|OOJKFkhhi@J7w57@A#oA~%zoz?@b;-3^w^0viuG1J@PN^n z>#%NZNUhbF4)|7X0sDqPb99wJf-NH>E{LG0j?0vd{>|!KZOV~g8|MkopeZ3+o(V$k zvk@%fU^&T>7{a98`-$>^>yaMz{OEax#o~B<_lEr}R_GQhNQa=Snf2oH$b|6>&DsWO z5cj5={kIPjYLSc1f@_16OZY;faGw)cRjjRxkUWu+we1(mFipGmbw(1F?;<(~zFz8) z;O^92{a7?Nb~JsJqjYYXx(Hc{U+b%mowykoc&BVn6tuV^V|~Ka#uOJ;$_FU=fpv6) zg=x$X@F)rLL{GOOPZA)Z7qE`fQTDxQfXRY-t>AWu>Q-@>o+*E5rSf7}c)}@!hmYJ{ z*yjd3&hDO-N%UAJykNp~I5((WMIYD#yD{2rGr32dUOzW6XQTA+GGZwn=XNSGi1avK zJ=SMIDUA9H{9FfYr?VWRK_6XPzn(${WBNjH0a|@N49Z$&{&xCt+?+bu|ri? znfK3$5#`tSUjg{@E$i`L^5@pUf2oX}xwNHk(DR6g#-IHrfY7Rn^kPf~|9;iHTQ_+K zJwm-4zR;}H;9HLY(}wu$TogaVUq>szpB#8WV-6eF!P+)sXC zw)?&P?H&9}c+_qWI|U?T@{%}Lu&cy0V>x;0JwyQ_Wq(u}FDd3;Pt*3^&fl_LIu7Wc z7T}5%qVFxg_PhT5aM;q=3eKcfn9C^T7W+48N1LL4| z{#@fqU#0KXqA^dX?LaTB(0;azkgy(sA;fIawccfySlEMEUF!FuyloRdG{2c#@(`%o z*FU*fmX%Pk(pYoZov;G@Ji~I{C@|RR&FGguRp(K%2i}3|tD%`&tBVafw7I?&P%hu+ zZ}LlNlqu<_G`JdW+7pR%W`A zq!p0tP1<*6djJGH`$He?JIE9MG}%#RQ1UwMLk8b{fL+5MDAq@%c$n=$JlNh&%>Tx9 z0XUh>{ePC~!Q}dOi5bm;1l28nU#lnwE#9r1GaK1Hnj>j0HcsGyI8CRr!(4hBLWYBU z(-f4CLbi*@?=!bHQ zd)5Jt#H(dUP(K_c_g9oXg0-)xoI5ePBbF_S4}UuSseTRPxy2T?H(P921Oz-Z(&Y)ryHb^d z_2kbS=n!1@NzZZHK+Zz1YILM2gakU_4)b)czuVkc>@k+LX%&3^FiTuZA%g-J%ts%x zHYweGaHZd8)Z1Dw+JzgiQc09ML3D0Jt%pnmq_-oStsj}qO~F*#)OxSz7UTi4nMy5m zuyw@0bLsZOZ_<$%Kq#f?@xq+gtdm32Ryn|Pl2(rZ+9Or_CqOA$4qTRCsew73IpgY# zH6dezjn|(xTzWX7rYuyaQCjZ-$0Ts^`lD6!>9$oA`X{UC!&7}ZUr~3olqOr+n1!lV_g+j8^%F0?5FfF70Sn==b~H|3)jdMo~Y}{F4JY@WG79Ap73w4ny*c zE-@kmCy>=1ziltW)#L2O0kj+N$loC##=8EtQufQ+;2oJ4IY+YV+Bzh#d&)-bB6vF_ z&yBjBhS<1Dirt{quTy2jD0HW&^4~i}b%@ywBX#2evA5kswA|j~%Zx?`jr8Y6H5X-U zhI%YNtjStoA>dxNl``X9Hj_O`aV_A%2X}QD`^+J6b0uuFV4Z5G#OV9c665rmgZ#! zxfB6%32PPpMwJvxmNMg+=|d3>AhtXGZh@+k&z97S@>Hc=wav#ABZdE;aqL`{^Ya%a>b93?Fq^@%pBfvTRe-P2x9QXGbK(Zgnbj>ZpM$`p z-7VUPm0@g!mQ*#~YTp_+7)AQl8V=CXQ0ssgcB4*-n$pq%7zin`J*|{^t?THi)sDDv zcb_|DB@&*ReAU($Hl-b4)f&^IowwR>J?rjPfQQ_hlUA|!6a7`i{vOnu>48Z`WZq#_ z8pEZ#w7#XPUU_X|R(JAn&VqKq?RjDO2)oi$5O;)%V2A3ZDJzc~AOF)WDy8`gx9B?Z zrS>->I`<=RPgU_`szc|@s?TtwJH2e~s^HNp4qf=JpdtVT6+}}|r2qvrHlrqhn6Z|! zlti9DY+7F`l@sFuyN+28*-JvzT4`qMb7*z2YV@wW#|8p=dq zm(L;fawEaX-uQMm(aKltUlxsdqe99~IYs+^fX?h$I)icpo?H~8XcQL-|D-zWxd~x^ z_v*Itoms1M_oxmK*0Q4st2r0(J2J>UsRTeoJr0Pd^FKt?Vf~*X>Rq~sn)6R0s>N(Yf7-6rQb{ElsbBQ2|Td?Z_?r1Jo1$ZUVqUxQk1E3`% zT-cC_Lrr^U8KPY)Pu!s~s&>W0eGHUFi|JECCo6IvE)Dcat{+J}LYY0&?)Mh<0wmpH z5T8CP;qD_-A}H&&H)$$^;>687n7)8r^w9S z9JJAfj_{V2fsNi$b?So9#`wW*;IAa9 z?q4jbbUppq^1H9p=;K}XL!;gmu*Igiz&n-^#uDFImLcc;J{Ly&lW$IjIqqBV|FrEa zb+vU#!ph6j^w3Z5ZRI<1oLAL3>1zOzHw%3aZMwi-AwMd6+{}=N6|=Rmwq%aYZ_40Y zrVFUm8uA^dHVBWlQPvM8gTFG+SNkKzRPFtV#AKU^8I`Z*}BU- zHxnlQ6lqf93I0u-Yb$kgqU{WHH*H;JrN>)OM&G`i6so#zuC{*JD<8--qHz7+gVl^?p5bBc4_Ys66lFdDSf z2+E*?T{eSQj%-gED7NkRuD~+H-ePn<>>baB2;Q#ppKtfGd%>c%e(qFa+q<4*+7}qU z-1>L%JL;vMNvC$tv>FFb8^XxxRk3xUc-Omw%QoI)=8Kl%7ck)9E@rHC5E;FhI4+QT zn0OBgSV4_3AgTLeHXGwb(wjKx{6&m=c~Gf$?1GLx>+AhI;Vd+az5WM`W&iLijCI<^ zSkTBqc)iEjw9N`C$`Lj+4}_lNDuB?F?=M16q~-fI{GM5GSh!M&vOCRbdhhXFf}$H?%XxCJZtOTb*O*egz;;YJEiLYGbzvWkp{DkYJd|HiWR|xZf)6_YLoK*=pO(8U=spTJ? zre>w>9bugtNJ8XADrRF26Fu$t!6tfr5) zt)?}{t*S0vlfGmoCKPECz7f7@r}r$Pq4>;7f|X6V#=YmfRe#N|xi__kk3J7)y{M_Y zl82O|Z3AnY=(usP&0zb;L^;jp#(X5W~36VV@Bn z=PW>()CRx??1`DqC`{2ImOeJ7x$}UK*Ye9)Qf~ZE&*I8*ED(`E!)ZaMvId}5xE*tH z|7FbSDfZKxEz{-|?L!X^KV~v}vEvvc?2%MGEb2|32}F#ksY6hn06!@|YJ?<>nrasb z+C8_rYNI{a!P*fm7L4=mj>&1WztIs6sLlio$QdmEV5#Zzb}FJ93ml=I1Oq4mHkYaD`&s0^q*x zDST#vv^cnqf;gUOLcgM6jkeF2<1=pe{cVK`n+Yk3gh+6jyGIOs@NeOjLH4-VY&JI_ zz@BMj2nDMH0<6)o7x0}lpDE$H0Ly&xaC%BAE;XSJb_C2VU-wnv62uA~DF9P-F0SV~ z5s!=vuZRVBNxNYFDz4D_@sHUmd?phBBfGOL<5;Mi*@@L_1naw_0sqH}{;!{_y?>I@ z%~sZcqk$`G{2v5Z|J4*n6=|rY&hL`mE}#^Sur&cj@mHOm!Zw$v^BhVY0^OhoKWa^mX^d>!&q!!&c*7)yF1F9rKVS}EDlYPt&=Q%MduoBSaC;0h^{&U*_fdnqiF;`FfD&gJc#r2kU?6)FNA6e`D?>(I@Y&E4a6X@X zB{x}SgnWV)*f|GvP%a+)R{Q`KUWoJ^Tu4=o+d?v#U0eS+mX7?e@LBGu&HKLz#ry$Y zhl3lT2!o}a^wRt?XS*MgR^J~b@d4)2f>EPWF#?3tnCZaY9&RgDU~vo#NU@yhiU1m_ z?r6*t_>QW>!4${QBu%IL?}IozX`^N_uS@P9y_rGueq))$AAhjVZ?wF=+QRHV3;~7> zfoKBAnl`?_lvd{l==UMG;#6al%C_{XLX%#c_;4*|VwiZ~V10AZxb| z0%_qU^!kRjyGG^Y=;j__qlj(q!EV5N5OLvXYwonSfno64awgj63kO}=-KjRR@ad^6 zf3xqKl|yRVi&&$tlw8}N^jE_RJN1f})2Zf_J}a5e)PHW6zc3B3{EulsgXgG?_=TPu z2!rh}L21T`iW80hh zsn-|muXIb$dRs8`>pWnoebo3w$jAK%dBUjJWSe&j-~Q`ELgvzfUHCqwJ|TXMqW6Et zuVkyBA#_nJjbCT}iC_B|dBXQ3m71+QT3z@Vm{RQTqXnk+{Fh1f(6&hx?d-K|rFc}& zHyvE@suujARj%TOuSoCA;P}yET8t@wJI2KA-nEcrj&nq;mxIDgbMK0=`Wyzls&{B! z)me;b1Jf*LbZvBiw8k!<$*AGLA-;lI8#o{MlKPnKjWPvh9L=xrgg+oN&;*utE)bFP ztfd&Zhrw2Y3_QPk7lwX%7r4KB7p&8@%m>=go}+M26=0F)fkpl+8v*RnB#t^6-Iki< zGS_TCb2|wilTLTs;VOw+&p>|burA`GzT0SAt4}*gkrr<2y6H89OiUGB;cjEo$(2%_i!0CeA_n;+TF4;cch z3(srNU9$8_+(wWQ%E@%Bi_iBRP*4X_Q|Sr$*NQenuoHIdz0=~^rb%ROboQXh$jGCm zM;R7pP^F~s^VNe64&JbY50p%p;yqAAzx1(G4OswYWti>)F#8&S*#p#Vm@NZfcBjTR z%v$^jW=%C#|2{b7e86q8HVVIuvr0ij;*zP*dd)?Q46O=hw*SF$&Qg+NP;Sq6?dE@j zv*uqJj##go5YVH*f`ri;OZ(#$yOF=^ZT@hCPzfJBhy<-}F zuxt<{mv)ikc7HXWptGllAWNBKZa@ze!i*@m`h+z0vg$B%lPTfhJYs^1+Srd0C zQO{=WGKQZD03=EcKW@IZ72Co}fNUQCxECm5o=+oNx&I*B^Z!h?f$8x`an!KN)#965v4z%K8&W{>Um-wl82z%?%xub5r3y=lR4N|4% z=&zqu(GFo9eBO}0U1sj|ek9B2`G=^wr>{Q&of}4t0AU*BX+?9kn&sZDf5ZnWaP#IQ z3JW=E@Q(D&lGomC1Y2TAr#Q*OK$^YS3g&VEnOI3yxd%FS{g@&*OF~&Znehx$I^=HS zU50U&3z?J8xQ^9|r`I6~s-tD~TXo~YW2_CO*C#qBpSFbwPmHL1t0q4-a|~0j z7;+EN2A<@AdYi#^D)f4>X3WQQ=cYX?9PYUK>`r<1Ilc_IqIRj=^x&l*9#@)Y3cL0R z@VI_-dsS6+uJ=DYu06l@xI&K5J+2pi;c*SCF@LeDc9j$jR)hklJ+Kx2MU-mR6Qw5f zmhpP?#*@@JKyL-F>=S25xEx%Z9+I+Lv#@y*G3Ecxx-K&<>m zv}0`IG0N=BACQ*b#OW`xR4alDItHyuMRd`yVmDB7uA&LEmQMg-R)j9h@&LkY1Pn3! zJ?G!2UVhVGjY{h+b;RrIB|9cy(3qje9P)tDfm06qN4JCgelw|N62Ed9*zer=(`j&8 zI(wwbwxgA9`JCl@O}Kvu=;4&h*T*o*oY=#Z3gXdWX#IK#YVJ%+MaBEIIundX7WA?M zzkfrC7tc9hIU3L0$Lq>-=uCF#Qxec&Y7I~Bysf`~X*>G=GGQ{>r$cJPk+_{^T9*9U zDu|3OdzXQ7o5?2Jd_&ZEwUCFS1-S^hhXCXaeIk3L8EP-S-M!%LQWLO@q1#Qbus5tr zwA5g-6+4&*x2_t7!FcUYKg={;k6H!#Nv(gb%)Pm7xQ+74-&^?NSKR?vF8%Bd5DIh$ zh^yBs9EESEviev-r!((b?v3qb z2>_M8KQr&{|6*QefO-43?Fh4Cf1j+Q9|e9u{0?{u`hmQb6l3nv5lr2)yix3Im|gR$ zz#;77OW)S8%x>4|(+*;aQKwL_L5nQkDvh!a8{JJhHg348Nle0G_E7zDY5nIfh|Wdv z>2J51q4`QkR+<}P+G~WhzvUXS8dEsjdU^l6pD$npSls(dx2)yM1bzrNYt84rX_RC3 z2;m~49drnLRe5 zZjqg|cvjUMJ)VW)OGt{Tx>J>=uc@@~OVa)VRL~k~-+Lo5nngeoLb3R-! zVlAylLCE(W1%#F~{Om-%;+y9&qYJU~d58fu>at*Ri{!J?qx zlkE2NRso1V3b@XtN4o-B{LB!a~Dt(t@X$I#|cZvew+i32TvLb@wmXRWDP| z{7q1+74RQ40{p*ntZG*@w4p6U4mWsdQ-z+^qE+gCq_w09c)s5k|5qIYct>9Tsb4_f zulogbf0(mnglO|GKk&8BdBDYZp;F0043gnPSjVq3yZ{Vw5>=o0ROe<9%> zehzd=pgC#JwK7*yEs}yQb*ockXx*C-VJtIU0VC+6CZWs&mR0|o)Yg!@JUz6P=l*KA zkS6kR5hQwb+&z&a1Rn=g8;)Qbmx-WBQkpnv0MhQKc&JhX$ZcipWGO4U4CJ;{QXjO5 zaME&H1K)F7MuI04G`?sQ#35h4269_AKXP07Lfg5msLF-vDnRNZ04efv3DA!g2`x!J z&oiZ z)-8(t(tyE%0sI&0iGYAz#qCYfH4cmVsJ~Q;4mK(cP6d+V4e!A7;C|tw?lU zJ%epfpiSSF+}I+qS^b%Hx-SBNA0@}#I3U<$5vkO%i|ohmdDP%x4(>?R+ZK6|w;@2g zs{F1#Aiwn%W7kv_iN8t9Z}I*yzg7MGAM#tg=$5J$El6CeGpZ(>bGPmV&S9xj2KMHm znWV7HiXmyk!Scu%_S;CD)npYe%y;_%M=oe9WCBOBe*e8!0=*J_e^@P@*29S;1(cB} z@h@lwahcYs^=1z@6KbqNPy;aMZd?$$yD9$z4qgg4PGpzJYo|%sK8PJ!RIq^fmM8|C zdsJT`tGi6dWJal=-)Hr}&cf>=HX=bZ)YGA4Js1fN`K_=lQdih$44Cm(b!Wj2cXgPw zV4w;i*uS%GHZ^u5L)QM53t*a#w6d#7kwUMvPb?eHY0HU-)%;K+A=2lYGh5{VxdWc3|K%K<%g%ZLX%hf|$Y6Pz`i%!3)KX_;v)}1~B zBUO3!*`FTVQWz9y&Str~2tD2kMNjYq+NLz|;b&O_fJhljNUTHC_7v0Sh_8@~S`RrF zRyd1(8V}NrZ>^t_W%^+}U=pU;XRpw<34`xp-)<)1p)Dgi(=seki4Mv%>DGXbu?> zXwAm}>GnMhV{td=-ysi#b^6g?z0LbO4}#BUCKdADro4;d3&=2xjpN_OzK*38nT!$X zu`lL-h-H_}H|uYI@MCpgB(<_Pv9F6pF{c&>G{5k39YL{EQp0_m^rR^j_@H?|wCO6+|z*Jz;}AAS(C zzi)BVAo%G&HN0}>*X?ae8!#xV$HBh-fn$M1F50cC-cF*_8Nw3L{%(tO7ef6tnhW8# z((KQG3xRp;M+EHD)9(>5^}lo>bo`wQ!TjQs)47ZHx$8)PYMXLuI?E?SdY}ccS&2a& z+ci3Qe<_X)pQn_anzFD+XI1JIOw0m$J_%=M2^19j;z}(D@SNJ7T=gRJMDQaVT)bHA zM}A+4?_M`D+6LF5J@c zQo(Mi9V2AI)Jb6a(HPy|X<22R82r-By;U~ltloN>lizM}wD9Xq>p0-Ed`5r-{x7r2 zZY3$bCI-*?&hz1}l8os*XD`Fzjk z-1qPPuSZR0-ZPAAuGe)vuYgo0Q~hjPIojw92@~D?%Y+SSOQ8+9p+OR$lSk2*3OKp!$KMuf*x}b}0VX|i%{v?wlLWRyBu<s%CGw;(1AGn z{W&2bCRn}jv%Nvsw<4V=Eki2@kS(Wu^2He~YF1;rTIt9*Z=Fz(cwio|hAiL){xm&v z-*yXZR0`b!lV|!!O4J0E-l#$OF?k!XAm_58_Eo-;w`y$C^$Ni{ZEN~*vr>q+iU7P- zOH>mKywnhHwIvBO!Ol#bS12?4yS&vpUzuz+A|A>CubxB%!rlV{t%jpOtG4)OJA1Wc zKre<0RMH#fRC<7vJIU1QFN-1H@9j~4+X;@ac6CZNl}>=%+R;&9U-}XO>=9F=hz+Yqo>Yh9@g^t|Yc4l4FJ0p^aMo9i#RPO)7OGRqgMBE?21~oBDYgnxss@xTI!#AxF1|>ljwrPB`7`1MwkWCv!zDn^wySA z8sKB7#H{Du&Z=pKkUwkI=-^#7Yjp(BtamvT!q1s7!VK!~mnmz!n9mw57yT-=)d5>F zTkax-I$%N5Hrk`_SmVwDXdn35)-0OiAj%7?`bw3X#FML)8xfiaA~ycu^9g9cwd+_& z0@RmNU>L+pf!Pntr2H6n_3Q8~mFb~k|E1OUYXdhOFU;bdJ~9VEzjR)KFoG-gYY;~G z1i}cVktSCuWwH*0!PVZx#l8?=C7MltFa6kIJ!E})#rO4_(8|K4-1@NzsM0Fe0DY$q zuOw_?lvx9-{LjC>YyW5?5y3^^?X)(XGuoRnCMm1U*&q)9+I@`!V|Ir6i$xwd&6yuv z8kY_+IhfcfEH{tT=4j9`gG#Fbp}$rz^hVBJu^wcmGRxYTw0ud|j@(FCM32(i>+3bZ(`9Wi^PpLcK`0ujgq5P>9|6SHS( z+oRowc=>pdV5bQtx}OY4vyF?h^1k0&v=~GNq9_UT8`)W$t^-`f#%46#4quI>KTgU$Q_NfGi+&o9K z*zUE@Zl?xjkFJ4Df*M#_#&uPe{43B71V+yxG-3*OZt21~dCCbMT12ar_6r`;75;!m zRHv(w1lcH`&ZIJc63yc!tfpAIcfjZ&*lO#ki$(p?_KPC4Z`~nK1BN5_tLhHgZAbwR z=8Ph2JsCFaB~N+x7%GC`cYh~>fKdy5b++CG#YCCxk>TocUfOeOG*zQB?zi3@*;GP> zW}CRGcAg1{-c?SwkxIXD{7svq(k8%TDdraXCh(AV&K&GMH5{+fR_r?RG%r`99R27E z4uYpk9ad|Z{l>DQ!J%z#!8;#b660E}8QUZ1BG zr~a=B_R!QTy@4;zw>{QQm2>BCO!WY2KY=Wz4aSX9-A9lSTkxrSM9vU43yfG{$cXLB z&mmvktpw&-6lR-Iqd1WVT-bf-DDeu@sF4;q$|%H`>`C|-YJfekMm4}1ye`k?Jrhcm zd%DvAi;0A(ww*Q`)>ukeWYtPzH403cu?E0a%I>nJmZDvNty(H`AIQRQH>vGQ2&b<3H85>E#OGY>N_S4+x@Tf?f#eRkNRI6 z?#w?49TYui>$};DKn|rVF>}~PbHpztuLxEU3*NDR84_rB&d#r9g%6uv7)V@Fv0m<3r%i0}=u6?&l}*bD zQST-mnl^m_S2{)Lb}Hs=a_rHHGp;(9hh~K@1N&8y>j27r)jkC5*VkzK)%rX8b#Hvt zIdo$r36Q^phYLAhK-3)+Hvjt6L4F~3vP{3JdkbIy0cUmq2DOG-@U$sF z3G4rwI0}bIp1c0Six(W77;c;~ysiQjWuV`9EODmegI1Py!oqPgLo#}Bh+i<3ekmCp zHYlLlJ#3(FTJX%N$d^dGM?|p!$e;&a4v%4S5@9t@hkFTsFz=!p9zze0w{hlglreT zh_?p<#8$Myx%Mst0W}*q%S_gtVRBrsS*`}HM0)iYL&$Qq9Rwet_M#HQ7HG@00a&g< z^MxeJ<3lUElN;P?0l0yo&V0zG*Hd^XA-O{8M&kW`_=O=lFGNK4Io^#2O}1#^im;HN z7#T2C(gz$Vu?eytVp_Sx%bA)UBv0n*S-`#|(8+fyXbgNZ7Iv_n~ z-89ASDP=!&exN(nl$qqAGysEH0(gG~iD2|wOS*!eS-O=#bm&$J$cJnHlF{lE zQPZt2eypLmk+$Zh;{d{eI+D|ML9OZ>mU2XXm40?Xy(64ocEz7fY)Dxpm4z(PtJ=BX zWQN}tt+5*-1@;U&9L(t)_U!XE_o3%O(F{6U$P-T7;@?&4nSAul`jA@REqjwpj2&oW+xF!N}SY+eK%2^Wn!z!kL;7|~v(=!C(teOw} z=6D$bjnd{`^urP`?j2?u4CnIdrGQz{Y)q8Me~|*TE3k`IuosaVoH8l&2;9)^uc?B+ zC{`hSE)b_Irl=Az{vOc!j{9d`TZcb2MjJTofYhqh@GC|RWxBZkB$7c2`(c=xQlK=Pc@&QmsI4-D?t zD?o){ZP7_usqd4tB4y>GJ4ssWcSnZSi0k&NwQg-NI8M2Mhd1MJ5}kmy04I4zp&l3# z)dO2ngxCSEzqm$FmCXsLOtPXIYJiWnlO6a)+~l`6uegJItr*$kRwR>41v~1%AeG9H z^!u(VwIYEO&!QxmyLR!2)Lugxrgg>kcZ*<=;vC?;ZitG!`8^Dm7(UW-zvk$a8FMzV zwRYwfA`AHkBI_@%Z0F2kijYZJN|^1kl&&{>Y-gDqMTw;e8%44DWjaN=>JtP@Y4U!| zUY0F%5$5LO2N<6xNzIHhSgD~3R3U#&Gyl+#=ikB~RkD3b_q<9P;<)us79cz^;RKuTn?5z3p3@SG@ht}rUq zCytr))>U432M!I*;WAks#JPezIG_fs2mu8F&&R)3TJ!n+Gc*_0>*JeGr*veYSc;?Y zQWMWU>F&uT+&H21XM%D31IdVzKMxQjXb^X^a?ljeh!fv8?l6B0+KiT_WBI+5!t!r= zoz&g-1~$+tr@Qr$hjOX{{;MP4zv}qxNAX|3>;wGQ%V_@V(eL=Ly;nYxLd5RS{?Q!a zB>X%hnMC1H^sfZ*mV7auv1UCd%EixI5W3JA(V?llUJbUP zb}d1VnMuB(vJ>cHd!Lw&K+WfHl$m*TQck7RRaBhb;F5&0b`Z1b8((&DcVBk#UO}6q zxBq_o9xaMHJ!OucXgy||`p3qf)?sOyWnJ_#ASIs{Ac^1>2qb!O05yT-Z~FB-&wy0q z9hybPG4l{59$i$=-@QXlu4g+|inAC`FV7B|1)!3ElD9n0TGnaxWoZe$4Z)-OwdMI0 zj~DNj&Psc}EO(yf?6r{DHBCyP2Lo|Z$=UQt4UXEW;kmDbh}Oi2uosj4fg3l1uV>%0 zOX{mL&JW$nP^iof_(C-PR+1^^e4#=UHIeM-4EM5(TyqHveMRD-do&ardls@Tugo^PFW4lb@m6oc?D(+^2+2dn=YdLMc z02z9qwZBShMOzyfci&H7p%pGc1QBeu^fti4Dx3E!qOq`j01I1$!omWK1%!o7(*Ri5 zd}^X-a(V#4-L)7OJ*V@Lzsj^TH=Hk~j-PeR*e`gLdKuY}>#EZ{bhrLV(R*oX911TJ z$$L#H>{=Hfm8GwWn)ihg zWfiVU%|29=mJQt#TfHq~zO_lP_>Z8vCI)Nh+dD+2GWft6*1prbS+oyUN4O7kh#^Cf zC!l7(P*@W7Qx2{NowL#xe6KwRT(S`6DmUGBMnsh>17Q_A;ce!3{@Pz-+Fn2U0AkaZ zp85_9xm`z(+8Nc*M*~pF)y%nzwa)!RF!OYg6wk6!72g^?CTlVdOXuoKDoe48?u|KD zM(%b$dC_sfrYx2Rnz_rbSu8|``tX+pH4`ark@tQN6KhMfgNd!B5n!Sz;Q=pvqz*bn zjqD(pxL=mSqGgf%E64%oKMgtH50-2ngbz>oZ7^{3{ae`rz25*GfLQVW*`R~M1M7;) z=JE^yxPxr>mduCFOBK0Y{ePBK~$O+1Pt=6 zCLd9o9L-)$vdTpHqf5f0%CsGiNqUSoM^znnG6ol$dxfEl!8nvLc>Gok__a(e=%7KJ z3lb>I$6_86OW30F)8i=1c25GZY?u8|mhE1YWt+gH$%bxEx%>*;g*I(B8a53IuA+-t z_;ajBgr&FR25fCRYg&A5r-nlg-aX1-sh2T*8{K|8JD()F#CO%~d)z_e zI?;x&Y~C5;wT!~~)D=!-NNrfzgtIu2;? z=|cW@#Q9yp-6^#9&5lp7TeKZ1^uN=J(e;2Zm{8$@Td}vDpOA6EJCfz(Bpt~UEC^Y5 zIP+U#kauXT$KpI=JXRgRG=qvBXb!+M*?@a%Yzy4m0^r_qnn0`t9rVC##`x#A-ZjH1t#PY59aPvMu*0gObVHWEv^h)oR43a*Cx zd|MdP-Qpi~e#1Y|$>&sfLg20NAFaI>y;msQ>QG&xL?Y5Yw4ZGsT|PU?=hv`sp7_2$ zx=y0pij+l!z5`i*o}RvbCz_?^a&jw9+B22Wwr7?F@(1P|NyFIu=-VG*zws&?@~j;Y zXDtB-(`JMHq3b@f)`Y`t6?RoNolHnPGJjiUa2}oQPqe)NpkJ~+Qt4k)nzZHN{y)O+ za<=s^aIJHL*WgBLF{%qc^7<#sVj(+aG4+3|EM|H-%FJK7ENK9xZ^b+RsEVz|p*FYv zDSZn<(*Gyu+uCYDF%U$s{dm9Z78FF7DpxY3f1`aR1j3qh4&3jSma7caem~~M!j#C_ z3y|8wcEfWkVGhCdyN@`tc2Z{uuGkjh6pVjDZ8*ccEvdeR(F&pL+?(Ani?AxAUslBc zyy~B=ipdQ&WGxe~VG8pHZ>auDGlgH|2DXfr_>0;R5B z)yyOkZ@3i(Pk%U32--Wg1Y0W+)(KvSE<%Wf}YWy~k3><;m2#Aeu#T8C8aX!q8Gx%bGX z=^*2-s`m7jsui6lVue(#N7vS)Nqs;(#I*8Q6nDWEx8pVz-RpC1`PXixML2vuifjL7 zmX{H5$ZlZ~LI&=-DhukGr&(JZHNJ}?YyrD=q6o5JL*ZWb3Dl<)^WRjn1xI!!6fDAD zfFeh*0l&uv&SoW3=QF+yHLVr+dQi3OP;IY8iGFae>GPs^$hzhHg>{QHUV^QQ)wxhj z^C>>i%R|tpD#?Xpuyh*qv&IO1nnReBGei}_ew9P89Q6IWTV3Vn!B!W}NPX@!VoJFX z?GgiM7@#g}L&N?eWQz)5-mc)@NOsT%_Z}^r#NHIgJ&UjgJ+KTChrGn-vX`315{!Y~ zbJC%m%A;Yk&os=~HS-chTIm7|&JWJBIo6gD(;@4G^ABa87tW!v(P}+9pz#=xUM?Ah z)_IJ7v!Rf>^ff7ZjNT~bL_1hC(x>ZBjr^(_Yz42jCTsQi&*r*>DzKrg!5tNA&5lyB z#-rb<*m6^GOF$I|LY8>y)urERfvstb5)*rh)4jiW3dT}qjMsbYQ*HtNC-=@--$M`R z)uRoN#~%6+;IdU6unzOQ7=G^S`IQV=wF~S+h5e>}VGFEpZ=2rZ(jFm}# z>W}{o#cM$R|JM{RAskuMYV4@=vr*?akW(9<(EA?c)TS-wE~=FdOOGdi&75wr{7)dX zlmouo<77YCi&YNAdWFgFr1b&Vw6;#zH#?+&O-FQ|uIc~H;V%AXR(Vy- z8CPo?TI!=|N6Q}wF+ER|O-lQ?%-LkAQ7%mhpS9cbqz>sB7Bp`>kv0XH@i95IIg_Ir zOxx3Js1&87y&0g=Atxy_@>guBaZqOuik-C_PvF^%-Y;Tu#>*pGs_0Rq14{t$0Kl@d z5dd>g60{rU0CTS$(?dU2H&|3ZbObK|#}n1^+?zjud`(AiX-e0FN8XP}D)&;YA3+t9 zpEg66++*gtammbExFM#w)qyAJYwCz9(ICFAr;_3{=67G;9`X&vsj7p|>pEzh^T2rp z-fsy$a;RNT>Vj?bNduL{QMuufyA3B&krMgqLSGK4pnW{sBut2k)9!TBA$ z!JSSBZ=gH=3%r5c3QDuWYm_Gf-E#2yQ!BJcBM=UE2tC~F6SdMPDgaH})FEdRF`kox zEDSFuHCoMCGjO*K-W`=O zhZX61l&j81tn!r&oZg5Nx)NooI61vG&5~dGE97hjCMHmg|93*X5-RcKKVDiCNS#~) zxX0vS=mgtw%DJf%W!3Uv*nB;2K+bBG^ae`JW*yC@G6RQT#BU(2^lOUOxWQhPnv?)_ z7F7138^UX$r@dsI!Wr7`ih{Bg!JbK2XFW=6zmnv3ftLGFs9krP-wUy+I{op`Qy2baoU+0_hLz* zizvhgs4OuL(_PwM2TDaePzws{6yUAZUlY3dlH3pT2jn~X0~~bzU^3W*tQmbB_(}OL zQAP(|57%Z#zvQ76qX@{seM&O3tS_6^1CXtXAE_dypNMvyD&==5GZnF@(bM37?hTb% z@Z8iv&8rn>18+8JxZN{ni`W&h2O?$x3hnrb@a8m=EddK`_5;xW#jpjF38+6zbMB^T z!KB-7kIjZx9j$;Fb3$XYUB4QeE!+<{3}TjVX7?|QJn!qRRi7P=dSqQ(^zJFr<#6I| zdkVxh3A#elR~+&Mb6-NQV%@K?22<7a@bR{)hY{lc!J>iyY2nzLYB==WmS2Nnhn@L@ z9hQb>hpAb#%@f-rf?c|hlBLA?Dsw%|4NNyHT;Lh)fE|{skH2(GIv_9FuK`KHD34%k z=v7J0x#Cw-Va-@N$yz68ElVyy%7JJCEm!I2sa-qrdMh{x^6X*%%Vq#C%J zu%9=1^YS@w?U2;%pDoYA63(hHeL|Wf*&v?&zq<(r>u(8CWyy|#7h*%bu-SzZ0A}X1 zae^CtIN5xkZEtTzmrEf_xrGimj;4xY|#2L2ZC@_l8uDS z>pVZE)-UjXejN-cWCd-Nie;6pRVwtNkyJD+IN$)&|t%bfE@nncu)e%fUeHs-esP&qo+jCNwV% zfF+AB`<>sjlox~tX`_F(f0I=kvcsx1(X9W5RjUQY;Xu?D@@8eNU+MfhY+EHexARwdNN zQzW(t2?zCmV=$~aV87t+1a9Xjy)QWKkBnW#lj>6+U$dAcR>I(OAu*LFlbm@%T!6o6 z@g;sbme0ij5S9w}Abf*U+E9txkngCqux`0x>)!Z_BG->^^h5u_6&QC*nEeraXKyJC zibOay6N;Fwuymg~d#3hF_x~Vro0xe2-d`fO6^B6NRvJWZNkHV*6K>gNWsXu-OLC*i zj6!}8wHBDOq}trTob4zx<(T)0$?1%k8$~0z!agNQ=ispw_iZ$#VR*~B7>Ukn4ru$P zd=QIVT-I!ntYD7AbIrK=wP^rST|I)=ezg{sE-^4ql;{QzgdV2j)E6sd9GdgpGE0Mz z?T%JzcZJM07N@!$>^@(Jxte1M_QiN;KXT;yiLBR^C)Ggb@x_*$sjOdOcI?^cvwyN@ zU({bXXA=LRWb4L&-Nm{)yGw?`XNh?M1*>)F+kW&f;K*O34n((72OeG9SKxx|dRLEh z08dehN+-7X&4MUknPChdM;IPeyGF}g4DtT+XsF< z7&i7V4~7BMK^j+7VR~qw?@Q}1M0Uc^+^Ygp+fDHCo@h#pXE;ZAOhcw}*|e+Qf-{SV zh`NX%LK!SY`YAWzgJZ>J1ZOL|O8;aFLkCA)*|}zRWCuOSS|SUi7jJLzx`gt-=XEXL z`FD9;{bjmwqX6&2Bxu<$rKPoY=RRiLImjtnQt&)f-PuE$V0wemTaBYJ#OwQ;Xss0sz2c%(qh8=v; zT~^Ybzl%MrG<<=AwDtnnU@I#?+}CyxIr0V7!?> zr5z;lxvYXjzvvpP1Z897!PC>dhY4~E2z{|N164~6ts|TT)fvtY&0o=Wa~?jS25Y@B zi!715AQztN<%6#l*k94)1)%&Al}z#*0C!OHGu**7!h$>vrWNI^>iAdu!ji$PUZ(4b zn-5T2-hA7zI-;AUCVG9h$8BU>Z+n8v-gWW!m%TAA*fPw3ubS$ua(><#31ryn{lc*Q z2k5luz`4;(K#D5qH{u2rlvs z1gzUox240M*s0?Yl$OR(QYV>Kz?Qiocn;pwtq*Qkat`LHXls*Cz3rDz;b7eq=p+jq z>ob%DKj_-Cu*S?wjLic%J6#F)Wcj`iLm}^VL$Y6RH@#f*VY*Dyoh8-k)`VOY`7AdK&vkCL#ror`2vLRZ7STmjWE z1E?By(M5NRSq=3yr-g;{Fn1pU<2lqhbGS;`x~b1W6m{FK8cAN-4I-Gx=QpX8*t+uFJ6-0O&ioS07ZbkuXJ=L{#XTcVuIAm!UG~#xFZ-sb3@GbmabwbqF zTcV`VavG!9&$hNLLkTV4e%!p(A0btSErzOkb+~bXoi9|_7o#8?JV{*Ji?!4GrtR1e zuAnm>^~HMhryBs=mvTli9$Ku8K-a$bZOyi}zC^Ir0gg3|hWG)0 z0mqg*Yz#SU%$<9>vRWDQThm?Vnc>V1rn9Nf;z?H{r&A!Ng)%QH`msKN_wYlCCAQ z+n1O$D*YLia=i(qT*WE7L-_z;OKk_RWxWm9lKT;0EA{=4W3G~wbulYGo z{@T|du^RBTSh6G1V86LhyWep$T9cqK_+l~{<9^0mzLeM_;0SrqNh?iV*zeLk-Ae&4 z3GW`^(*D9kc0ARepo*{3{-Q$`OHJiKN1&}-dWI&Wj4aRgE`qmI&T4t=w&bMrU9}Yx zco^h3t3M*-9-rvYFNw|t)c%of{nVUqr&yL);r^ekdtF{vy*RYigHmA@6V*EjS8JYK z6RudrMXKsg-UNl-+rvnW*Ds1COz4Dd2@qR$5Mt}}7Gf(Mh1lYcutH~CrH(^xYJcO; z+*I-KWUno?**{b!Mk*iej;o&-!B1h?CD~O@pa`>j)5cq()AXN^Ve4}O?T=F^W$Qq# zwO2au8;mIUQohgK8T<5_K3L#_DNGz37FlCry)S><`y8fo{m898ACun_wqqKW_sp{ZN?Vsr7gym01%yR-;2&i1}eFe zUMGkf3TM^Qb>0$0#K;iK=h`=Uy@gcvq())w5YB1s#B}2`j|+^%iIe_rgG*$YDg^)d zy5jpsc#^sFV0^wFJyI(-@{6r6jCotz*qiqxxo{I%`U*_q9w`UJEPdM#`mCM7`z z4Z41*PtBG}V-^8i?A?T`z;y>E61Pbs=9rHZ_Oi3EbT28xrl(Z7-mJm7GUXE*zKT(( zov))cSC4MzTh9@KIXYKBqokK_ZxNRlrbV7=c!^q3(zx}BNK=w#YvFs;L~R9oS_q1yhDr&D zJ>4}WASxTt+AV&D<;1yxqyyH)V;W~7?Tm@WpTY?}OWEJ}v$Y9H$uTUmw+_Ls`|8sB zT5<`I>5C-Fs<(uK7>F*Jntiwr8uz@AB}50IMwA7;`}rWY*4N4kpO=g7fly(qzRV&^ zc?(dGW4hc`4gm@ZzXCu(2&>9jmEQyu46X0Drhi`eir~I`pcL#co2(}Og#=6S?ECeD zifn$2Y0Hg5F)MEJO7hoacrCWX$MKgg9$ZP*jd4n?>(tFs*F52r5K2O@4JpX|15!Yw z4?zkne*!7+BD(uj>v;AoFOe}xrLcD(dwAYP!}c64`0nl+`U>V~3oQ^ZJMJg>-_Fr4 zb?+VwxCDX$+VAJ=e=tXzVkYy)?19lQXAf$z_g)+9gNRz`n~!xD*enX&e?-&@KTP4{ z5(zuk*c1)T(E{U?Af#{|!|_?cfyQGWo4&+HCN)h9@0g|gtps$nF)*xHmYL<`uLdmF z>Gx!o)`i+v^UBCSF?BR@{GEf~KFPbH^L5%yZ^}?YvWFW~e2A8hU$PkqAMOl0XQp9M zMs)@yg*KGzKiyvRr#RB-#}OVF<-%1qfdezss0(%dfP#}2M^w{fw>6cBOx950Znl^$ zVT(^Gv-9k4+q>5$Vrs_DY|RzY|nUwJldY|f}!wPtk8lN8a9Uh z!ne~>|2k)|e@1=)4IcQ@4R_m|HC2E%XWyD#LaZ}fqBypd9$p(+GfqO-^+ih97G~bf z#3X2oEJeI}%~C1i?~doJxg6p*nM0%pkp{LLZ4qA)o6NEAu&;K1!M>KG7Q0qai(MGD zj{&_G-MFfI{FB#u>024v8|4i9sTKOSz^`u|{^(vo;8(qY6~_gg9N?Je>{lmcv3dav_B!sj#^VwY=5LZKn&|;jL!|-pWVI)_dWn z-pIzo+}Qg$V}vwnUnsLWLP3S_a}z0>;etDiBiA+*{$L_Scq*WoA$EJRE0%I=vWww` z?e3FZnnLnFY+pgL)QxwXuSD+!#2BEFHHI(f1mHx(0cASF@{KZ;y+ukSXg54VGNV)$ zu&XldAp5g2P5mJ|t0{HG9P&boiSsoa%InOtaEvUG$|?0jGR=o~MGW*9juN*A65(*i zoJ;K|t~k@8GY!yLkq|oTBO0Bx2T$xmVF~f90GY4ucZ31DPYiTF7%reUiLi9mf>mar zxLH|LWr!y4Ep8S7MgGCfDmA20;hf+c_>Z_*fo_`%bH{L0Aa)k$ok{A!4dyKBvTTIC z1iW<3)-RWJ#iI5q&6O?m6iJ6LVY zNU(LrueNo@FAS;D*pEL~rOr$pQ-Cdy+2S+)iXQCF<`5~b@j(=+rTN17Le~~`H@7C? zqi7!J-`$6?OhD@`qw4$iobxA(5=23Ek?$A(nQRMMdUnf*Tr^=IlgUlVqtf=yMH$u&@GYORrXhov_GWh-M7HpF@G=N$q|WpAKimesBVt>VVvjE{j=81FNN+nUqj>jJ7kBF9yTDq!gQ3Qz?Y?UN{~ z@-OxJ5lFH4=`#$2F-jH$R!l$KEks}&2a|~s7mLt zO5qV=|2Cy=exeBW?o}}pvB9H6n({Jss%5V$0#;)dqw2;iH}u4Ir-dY$-G4thJhyy& zI$aS33rP(nHIor`zME3lE?SW{6G+<58dxD&1_bJ$qjG+nP)nM&db7T<4A*R2slo={ zW&t2b@qGrM-x(Q0JBiRs7H29jIzDvk4{}Iio%S<|bP9s_x0DYN5lHdVkqfyYu@*JB zjM&J=-fPsU7wV2z#lNr2Tj`ok=&-@^Z4wQizCmADZ0?7O~1kNgyxGj3(# zB4AMb352uG4eQ)wXVPevrjhI84qB^PkQmU47wj{!3mvaSq)Exxqdt=4Q7&$~3>>}- zw+fcme1Z+;c+BJSkXq>yIwx1^>_U4@$Q{z^@p2Wrj`(pyL$vx6&t|Xv4o;xB^Zz#V zD>E!kCX>-m;15Bv)ep|^oFlrGH!o+kg7R@K|AB) z);v|uNx*V#0D?99PlEMo$9^DKJ5hpF_MJ4@)~&CRssvL2eAXjtNV0mNC2QJWC2JCe z$5ve_A8=encRkK;J7rcO$N(QuPFj7Nud48ppgCa}7T1xvPCQ53R7*F_OGRSg6h5O4 zqKOWy&Ag=0@+`GXc6F0{`fDd++wDivqYNIqcsJio<3G^@zRuOfYGXyA=mC@BWDaF> z=TvyM??rQ8(tF%(azODR3Lk$cs=6grliz|`(_OyaA*q=HFJ!(v>a#{Mln#L|<_BwR zs2id7w;m0X9k=1R_$Yje0H0Cg`p?h-bzEgb(hl+vIzZZ2%NB!vz zy2sBwo;9Leq|sfw)LwNdU#KYsI>x7kj`8>Alw>B)pI0bREU7+m9fimWLLstgJ*lS#2kr!HE$}jo9X19M4gKR1>PC0gGJn2*_2P0j}!$_pT~(S?>%-*q0X; zVG<#cR5Y3&3@P?#TtDmaR-~as2Cm7KcO|*(SxO>mc1r;@yQOcbYz=0&NOxwp+P7x6 z9$oy=>{hhZ4-=~VV)oRs3D+wKk_I&5QTfz?qY=sulEKq<&>4Qkw`ceT7HJuc&D4Pe zmdfL~yPV;tcF1p4G-L!|prX+vM2cE0$T9hDv7nDXT9Ca}8NAuMTedK+Y3PScTfo%@ z4%*fJkd9@~zTkfF0v*AP(?Q4pFj-)HXcSBq+=eC#u+ftRp64oEA3fD|E|9yxP)ECZ ze7!a9Bz>T%)+~Qjtqrp0G`}k}!zgEBt`X6+zmu0q85A~7gUZ>EYsV1PmuB!3INKi3 z-cubh@J_*2Wu0w{jivJq8*6<0D|&AIKbkG5RkDCg#%a{nde>yDN?p4`g|BA{O=3%k znOvF`Q+7&qios|vr9ID`B(f!5lLrUZ^jXOxIq#i07GrxxN-%%GRQm`T8Q}L2jSO&x zq3u+La0nTY{!?TC9l&BuT7r-!YGJnO@he`SU6+n3hw`Hcs9%K_g*}cT+`^g)Nzh2p zzpGtCV+vmT3C39fCT1@rXdW4OEczp;wQ`dq)Em^wdRsg4=<+jOxSL||&@xXakr~T8 z=BGXAPT0Wo1+gdYuD z!X&qv^mvG^pHE?sW53$-ziKU=+c8jv;fIpP0P}r*EP7pR{6iywo~9t1v02MdmFe+rl*(ydt)fB*7BsROL*e7) zf>BG-a)zS0s9B?rxkMi4o`XFx!SsbL9bDRBZn6L+DGeOPsg*g5rrg^YE7}Y#Y^kxt zZmKrS>aVT+LN8V$OrCmPA2)TUN@b2KOwsPvsayX&2$m4x4_v<)oL?g{}a;>Y^_Ziw{>xD+Iz6Pli{$Om#J_N*O%1l)Gkk!I=P02ru0e zTNOgzl0Q_9KvJH*4D_lk(5rY>$i`Sup*7RgTX^OdHJTt(S;GY*+sHKh`ff~;>#GUf zYVVL(YIX%A-6fd8XS3+Bm_$?%iLc?tGO9-C<{({JwHAq1pB zga8^q2oOxU^E@@)nDSdfK==;`0ih^D0QD|}0RAUMEF8+i9nhGpZ8doH)dNP_5Lsgy z{b}wk;!0qcV_%qD^Hka~<5$nrwFrhfDX~OId1$8z144_A=h}LN$unx5+vjL{lXEe^ z_-ME4+tq0!Qu~AQ?xt4MV9|haxcY;c`49_qL-D`T0fuj%Dezum`6#dID#Bm;#oEUj z2$HUg8*YvMBzhZjWL9i5-0=~!c#VpEl;JqP9X;IaQ0~Mti zy%Rn)jg+_#!l&UKk`>;nt%s5W2vXTmy?1nR3hxm~$IOR^f2vw#uz;%7aVo!;5xTO; zhQ~A!hamx0xF2dk{f=0DH@y{yJ^LrjtJ*f^wLq-f_GVwytYip&THf{TM~|YmvVHw- zr+{_?2Ti-uGyn4!-jxiXfg%H(>f8etsREm^GkEW|v#sw&C$A5KBmca)mp6B23M6bd zf|U$t(K7{MC;C#Yge$8bf7wd7u3k4^ytYPzO44E!Qh}hU#2?508%IGb^#Bm8`jX!W zRtVk;JzE&R8mTBeumcD9rQiCuqNm>qRw#O!EM)dq!78yMSP!EFEBIyu3bFzy$kJ7W z1{M8oGX-8nmIJ;pi;4awdAk2G>Z+6q%x|Y$RvvyE{H(`Zb3i~7Vfahb)f+$vfLXj8 zZ2H4%{UWGVM?K9MaKc;yOcn4-hv!{IF#?`5K#Ty_PUUdG2spjN2oT?51R!aC#0c>J z#30fq(97~QOrtdtZo8`7u;81m5HK;`;cM!=CiLvYJ1=@oMD1P0uzzMLRwMWOkd+~`;^(BJLDCLHe4k^4)af_t5}h08T5Smf+nuhQu1Pyk$YNaP(rzDMZ$j+ z2GANj0ktk(P}PE3b#)4Qu3(LN_qhV<&ngtt3bV!dYjnapJvkmKwx75aly;r1$=?a@?j zU*;z`i}~P3LL618Qh%2U%@wFB%?zUo^PM{HR(Z6o8Ov34#Fma3|0k4y97HW}qS^rW z24=nRQ{|e258i`HQ?G!#inv4G%KkGY!!SS*mr*;*`kdePO(FVpWXlNJkD zEa(s3UM!fX9AMRQHkj?_u;WZaA#8m$jA{;UPm3v4-avZfgj^HorX?cU9F<><3e2H(^vR2CC$ACe@&0$-QDvF1WP z?oGe$<;%;wBOPvKkslQX2B}(YrqcE;HtHYAdBn;OQ|RxsrM3dRfRkFf5HG-!?yd9| zFQ6*xQXX(!8T=3opMdLH_7~Un-EOXHGUU3JbEVU3HQWc$Qzgyxl7FyF72fcpGF9fk zT&9wHt!DqIgFQG&1_Y1)rFq!fzvH?7Ux;w6!n(8(>GVb6T+D`-W4+cSHdYE9<*8y73kHu{PMakMw4;YnyCKqRd;K1vNi8be>Full z$q3qdeFRyrw;GQCJ)1O8Du)W5S_vnQQ#_l|4{}&k7DIX0a{7uYenQEu%9}nzZ!9izlzwPjV$Jal?19;9n z7_3FLP!Lo(w)HG@CWgdMv=<1-pjy?`f{*)Z(2zwxEX0z`AA>{bnB;T=Ka z7z^0d7FFXWdA~ScYs+1O5Vy-}*g002h@WDBht5^aFap zTSO#E*UCTmNsi#!R@eaGUB7_`RMcj0S=0#nv*|a8e4%NLRVS(t8N0NZNTZlL(xKKN zXT_vQnOa(=wCRepa#_udiKrdbaBCIhAA?sQXDpE~UQWFpQ|_2}7wd5Q{t`7LyCM8l z@i+J@%+2rdS9oVn?&JxKhoL+H6>Pv_e$wQO7c|7Rn4cqXA!V0P0hI%6c@XM4>D%Xn zEv`qep)IZ@xfDGtD_m(^X>l^fJtAMFW=m(lU1p?sQANd?ong@o+Y7gP6efS3$Pz%Y z^Td>+_Uqq%&}@wygTC1;e<^bRZJsMCQNT6Mr=1z9+AyZaAP6S8>f-rQdg-dgDP+O+ zU@xK)o2pqq%mattp*Ez0z1%{(q>r~Z!(CxfGCgtSI_L)H!I;|1+&id3oL7;nEKnYQ zvC>;gpE330n`ihj_QQ>L$Q=yZQ3S*Vm^Od8@pB`~wS9_(Y9FW?Lrp%je_7$SPsxzA z%1=r*c_gf_l;UoL48-rkk9L2Zs`}kx$^UJ9fOz<65G?=(-WEO}PT;?S4_LGK_wWH|o0bV}(?0L;>H^yZ z=>v+xu5}7=?*GtsLE+AJK@n=9>%YETa8UMWr>?>myAER|L%2~SXRO4zPfzw)%SbD? z!*vofj1s4EJdswZ{i}P)BVc5LX=8oe6|U&$tH>{+uggpc)fP~tPO#{-X6I9(IIrGx z3J0?6ByC1Zvx!%Cnhos*(?6`w346>Xb|Xan*J@p=i=>9+PGTdySb3)^Ki~Ie%ZU(v zSj?tWrRGLAH8@w?n0x!$G95i|Y;}*~sBAm7S%{BF&x>@v<8)ELv1R#-V|#2j$M!np z*m6ORt$SCniGLS81N?`IcVn}=i>!w)WlY*^vp9M1u6EXf!cZWB}(09x>^6u4$EKD!uK91;RCLKS)mO}k;0l#jh zEM>cLoq7UZ#)GpQ>y7r8H?5KrGd#-Za~ItCTqX_JxfbW9f-8j%Vjsnp-;2dOIoMa+ z*Hfy0$mWo!Z3+_-VeRO2h+k$fj16PxxCcD2|1vh$CsOkp0`p^S!!A$t{gnBS*fp3Y z!`ovTQxn1>KPKG`R#;H@d?74M(B^2CnyrEn^8Ille!AwSkW5qO8QFSv@_1!RxUrLz zCy^aoSckVuS){ANUU4(&SYsX&XTuZAkIO_g58oFhPP&dZ8E3~>Y7-5wxhqZhjVPZT z1y4X6N7DUg_~(-G`(%egF6xJ5z4(ayu=arMn9jJ!LYhZS(-QrOqCGZw9Z}0)62SU$ zl4|RP;Ka`Bg0-C9diRKY7ap!iCJJQQKanVZdpcW_V5mt$cT)c>`4el*i+SBXr@_Fi z5wqsGGv$<69=X|`^!7S>!Y=mt(~4G#p&<^_*rm4na_AZnnbx@7+C#h#VcMP9H042| zIS1YyD{17`~%8g8Dn1_jj$Zw4s01@yx|D5@p}JIUmqT-;TcB+@=+l z$#F|V(cX6trc2(uNfOlP;T!J_JI-Y>Plo=Q0k&suA2uGs-kbfjZ;omD-tn#*99R`I z<9iL+|9m6qSC@y@pXXj4iaXCsYlY9xKA46>Yeh4q{6?TKx?RJ^?NF=l8R%hf-f)Kp zQCvIkB*9e#f9*H%L4IdaCcy-x3JL?0eVNo3I+K210zLdelzBJ?B9iUV} zTs`bjH`mhXm=K<@byrE#*!_D~ya!NETX_(*k?7$EM%-4}C$?VOLq?)J#g89~$o9?& z*lz#r;GbS_^wYta{RPhz^-aJz$Wwrc{!@9!V_sU)2l~!Et+ZrTg%!2jXDkMgwNGPu zBBtRyUp|+v>Dzr0S%~o;tEG~dIKB9>Y$&!Ue-_4MY!E)=W-oAch~Y*=e}WdVetEZA zUY7mGlq9P*mz0f^i6^aP6h3(OnqhXAX*Br`hZit%P+vVp^p4rUDHT>vGIQNi^0Joj zTVjhsJRv1N{Pfc9$-{Spu1!bElpB_N6(VZOhk|GQ`Rv^@(j2nZnE7ru60OgRhe@{F zZOpL0WhdA-f&>)smwxHs*sduzSb2wM~2F0y6y zcFb-wKWgy6!ZznwC(r4@Lvtr@Z0skwmorQFmRRrP=so3q9_j^F5{%VzLWKI}3)Yg< z{kCIlvn_ksZfqWy(dtPu?S{geQs@wZ*FN;hIXSkUpV%cQARN$zqC^L;0i8h~R z`HIwRaU?BTuTEIG*zTH+1n++;#dS^2(t=Df^DhpWRXoC9P4}ovE@C;~oj*$^Xng1z zmRBElt+AL_MBiYhI~b?^oTJ;JmlnSv3Relwdf{-@@`Ao#&~RrOPJ-4m9jPYv;4UN$ zA}qKtdGc1cj`e33IPb=%tdt01Ho*mtwD-oLP1%AQbkFD$`|866ybM#8oDrgR%2}9q zEi38ZJ*In2)NIdF3*QuRJo(j1V=Oj>9oq1U@9kLAm?cKux=!bL?G!!B3?DYt{>K_~)O)@)W?KixC)SE|wN?Uj zkG>^OVONjZi=QQxDaO$XH zl09pli^-`TVV#Aw+FCmD>uwWBWZhcLsERmH8GirmM1eQ3nNRzfe>S`;}+YM7GOBCN=|HZ?6 z<#hz19yp}+adP`dJ*9+JFhhEE6*9e72*;E|XfIKP*)z8BH>i&sZ<9ozE_cM$|B}lJ zg0pEqUqi1nd3AkPj%q?Lk*;x^*#Ny{pX#c{swby_Ti7ivtS5GvF?0J%XTu!SI;Hhi zQ@Y$_VMRyp21;}2af2&`uV{CsQPxd;il5lW+L|1JOfeWD-MA3;n&PHi<4k<=Y$XHG zLjV|AT%DEDiD}TcTFd?<^+eJTllhG_tJB$XW^f)oV?$3~+WqxOWI~VMN}dw6W_CN_ z?feMyDkJSHSgOCd9n7vv1CE8YZ*_;rJ)4WRk!&sMAo{e(0nRV z4nv&0-9>j*@@dGq`238jAXj=Fe}gYi5ehvRW&8})2fX@hEtIdpsY@}tS|8w?(Ckcb z)X)&`IeT~1EP?9e`Bi$2PcMp)Udfs(O(S)#=4Lh-S;?+;0VAGV1evDM%veOyXI|*u zq=DtH94N;o*>|#LA3yW+WZ8_gE3M5)xKag!7x%h=)2wNn4l|Rv#+~sbsxXmj#LWaR z1qDf?Ch~2Vd0wI=3}RWKNo}NN)QdA;J))ML!T;ro+DNsE{q=%GHe;EWz3Jo**OiH_*3xvSY0Vf9LC9& zK8&(l1B_8^=kaR#Tbu+jU9}_z;gK#L#cb?)HRy%wb~2ZfZz>^(M79$CF-d%fYTnE-xE zXjkFke-*CDPgs$twR*@VA;W`;ZGYa@kMG<2pW_E$n{>(QBL>|Kf|*k5?(4C-6IVti z)`mxu=k?6*yr29OKX*U@WQoDs)(p(clJX(`YuT|zp5nCIYk&kRH90)!F5kNE*TPjK z(4o#XZXXu@!;=p%Ni5fm9Zin(arr#Y@9bG7y)@w-|=X}bNE$5#UIh#`vxq~uDSUuU+tzM9B-MGA&)Y6d0WY_sb=Ud%6^LlsPIwXqHt-ibHR>L)O zYX+<#lx}4QKiE9gN)w0MjlHZ-J`8b9ruigtrRl}Oos(RL;~?ptI!HHX3dEzvp6xB# zm!+_T@*tgSoQqG5OO2A>57k4#1S9ZnCk!-0pd*a8vnebaDti%V5R4VBpDOP!l{i*@ zB;|0?K8=?=5f67Xt2Irn5D+cz_q%~L+Qw)Z2VtF*M`$$Gn=`c^1ph~xweY~2DcpkN z9$NGi?lS_Tw1T{}Gf@|fHO1!x ztOVa4qO9Pi%gL?Gxf+2IKg)6jdH2aw6Xt~5G!jf3qbQCPxKNVLslFyE@LufKq|)MS zJtU)BDQ-cxb+5RolbU;Zj;h|93)v$i^}5YbDczQkg@<%0*#8RElqgmGlZeaaGQ5X& z9>hbqCC8p_nc>06HphgMKx}NTE>3OQmtUY)?}1mqB1vaYz}M@rgAIB}T)_WV-h0PW{r~^}_J{~s znIVJ-WgQtIBO@7y%#4)mt!yppAWkVWWEPoO8D*Z#jO>|B9HWr&dmM-A^?G@|dVR+0 z{eFMGzkgkh^Bm{!yghFB>+SX+(}@{N)eN_6S8rINJMwmi^$8=#CdVSMa;MWD+Pt$X zkk~!@gRo43Le5~?TXc1!W*#W9m6J~oXH{^nIjMMAN8nv`nzUofzj*Mru z?wt-3I32w5ki-zmCy)-T}Ksl56Bw9>!uRd_dn0&Bz zuq|*flNF}-A?O?JQikb%a!ttJHArCh)0wcXq6?$;J&f<|Qa$Oc{F%xeE%ILv|A|7~ z{jJ)lKCo^=uUb&+91k+L3j}e8ANo$-UVL_k;;(e;LUPcUqQ28ORC#njyoF-RDZg2< zQKCV;f~z^WBG1WsE7<^w%qKP2GU$t5*gdyW!)gDG#kcm0pH8_WTi=QdOJ05d>6!oa zptaMrtZ97l!-pV4c#KpH_`0LEuJ?tM>D?}|n+lIvddiE?)mb3aMz>Bj!@~2%C9Bk< zqFnd`ewpkSsTOU8zU(ypUx zyV|u*oB3p{N}vTt)vk6uZQssOR!5mZEG|MpA>J&LHEQWu8WS=mIG&2!K59`{-?J1y z{6Ix*rJcf=(L7ZpdvUf=d?j5RtGWAZlfSDUDjtSvf}Maou^@G%Q-~}|B(H+gv8m~w zsv4!@GdvlvBp!N42W-w2UYG3a=rNMvWkDoG{=E6K9!AUAaBv zL`+}Ysq1w0FWs~5fVXr9xMI-R(Z}1vC>%EFg^RUNThP|>jR^*+ui}^FF6FCiwU-Er z^;O9(z*MBbL*Qt7?}_%(rKC*3_Q##)n(p(oY%I>y!h5?`^AgQdz4#xA!t%h*TujqT z^=Dk291-fJK3z<0j&N(KK8DPi2GtDoZ={O|e~rj? zYfL&_C3jjO+{%sKKf?bkViu#Z8$QX*!L7#`eM0;^gT9nB{;HN()KSG1>{a>bL>Omk zd9`CJ!>rus`49N9UUKtuE2AP3Nu(LJ%DLc4n3e~wKd^g}a^>dR&W&O25uBrv?>=hL zTiE+tN)@T=Wji|w{T;U;PA?m9fg-~sYWnj=8`0&$m&g)n86fr#2 zC;&ENMLqq9_!&%vYfHOQ$CBv0!?hTnpr*R8UR>>5ioX1Tq?b>JbT9bAGMI9^XJ_V2 zkP0@jGtE{Rqy6IVtO~B$oFMT?G@>&dwwE#qQh3e_J}|QXiF!>lK%msCT}PH8qkd0U z0mR4JW2omjlG1#&Ke?HQDs-YN;4>nHr@6_|4SVVQ3KwqZ)k|c=;)BOo5UgZZhqVH5 z=Mb}O`aM_-BKN7ui6|2N%tFlQ0-%Su8Tj361u!J4OA_LtkVO3nA|I8fo9av)k5ntj z=k-yK_*SsHFzVA)!?U`l?`-jqz--u}u5*KB4jSpJ#`7K}U`2p{4c!&62515M9tha( z&M1r?nt*YLw-nFN`s2=*nuQB9vEBJg7u#IYSNss6SxM)qKwZY6 zIFmGWz?G9eyUh|Iex6Rd*gvKq6X9>gTIR%?3A7zU!Z}^Ff;D^t$u#dwu~MCmGP!&h zkFdY0t3`x6{^#(=;V0_nlrZrbn~!5&u%n;M8`#bge}Mfu50~O%nWZ{ragj*n?cR>* zOAwuVU*wB)G`zVPbl2yl!nM;=xE-1fB16Lc(F?BWfhc{-9QRZ!5?x$w6`X>;3e6CD+FSe~$?h$}XRAzr z%9jBdXc$>~e&|rW47KOm+tnwtH7$Wt%~eQd7}HU*ga~(oZuP!ym5DV7z9HILBP(>_ z%!N*-G7HZuHVWkDSz z?=VYgPcqO$Z~A$1NHE;}C^08-908tce^Z@rT~$B}%?gdrn!XBG=@JGutwU5JL=U4` zhANx4;Tf@68sAK#)6~a;HquiqY?%(s8;O%T*@g0{M(Pmh=g>ZZq?x1_Az~2M6;7+X zwZuWLCo=5hKpi~(x0tYuFMeslf_w0P!-NHbRzu5$)aLhs_NuJg$lypP!x@yIZKj~r z@YE396L6n0<(8E`_xlWYIeWz6G8$I*t(gyt#5Gl_$kb{MX*TaFBM**s%QkU5s^K#4 zv(&@=PE&X|3&-o^#Dp+$7RKJZg4RKuqKO2;k8AX#$DqX-Nm=e~vhGX9IZd`0i#RQo z*q0lY2ot*XhbJ#8IhSEOO9^`&>*OEcQC?LUN6WOYuMAH;?W+`~C=pE)V&)18!EfH# z-uhM%pVL-P^|=#yXzH#w;^j8AX)flInP|kWiyXC(XmskSUckN^n;84Ujg>OS25v07 zaly|oPeL7|Dv?g|d7x%AOzF{(&yj7Wh82+!NjT`(x~K+sq6XRw7&zsOZ0EExK04qdTby35x_7rE4X57_>#x^g zi4XRo_3f+aN_&*Rg%^eWBydwrU9l5yae3a7*uR`QpkR}BbZqvN>)7G?i&d{_%ZMV; z#;P~bpidcrmB?BIt3>uYS6{U7^``i>J^#b4t*7?=Vax((;V+EY|CYeTUi+=UCGs%v zEqp*~D(<(jM40tz*?RbDxJTHDZ5P+;@2Y+A%>`TpQ#Mi@{)WPhD08|a=;A3*fwE`M z_oD3Cb=78b>}9gB`mhHq3OKjsR7b0kgnGk*S+JK75zVsjGMf|k-N_R0Me_h|x)xeZM( z2)2+kL_!~=$(}Bl#hq)kW>y~!RKkJUgo)c1;Gitp=WHm8*2EcZ0W4a)eT!Bxa?hgm z`ZJ4GF{7QSO>FJxHzhu+%Ag@Hb4|}=YuO$ISm|>QPg*7>Gf=Q^RLZKF8_Vdgy=o~H zX&&_xuu97Es8ub)?)Cw;rejRl*kn<|OVkduXS`_Rb%Qe`TjB6j>zVkj*tQ-L_FJx2 zSTm0&OfDB(OmRioS?Dp9ZrtifXNX3@%UP6Lxn;uRNN=$^50m^b{`>|oIwF%?Fkeb0 zPIC466hh3xxfeyTih0V9lQQKqNm1Pv&vL#DrAE;T8um7yIgF4|@>l(WjKf%Z7Dezl z@NY(b#Eb$at+eW{N$UnoS|7AYd-4w^ZS~z`Qnc4oWAAZ+sk+9D4Hd#bJs*J4Whh+% zJZj%`dXEz^KBE?EC4pl+yu+mCdk;sq(7PCtW9MdPO{|33bNLhbGq$V0AP^SY=FZ%) z^N?GqLg_|1@sTeKxZcD9e;Qt%Ve_ajowP3Vt}eSCO5byM9ZxZxt9ARh;pE{o#+Qq@ z7}4KW@J_w7Qpv?6y6|?s)-vQhXRG?E4ApG|;N>wkywn(YqM{WOZ4vcSsPSdBuiDB@ zQ(|!v1!4h&MMQQkHxs^inw2kOH_7QK``~z15o(H)2`aH99kdaSE7(FciV2oXt0%fL zg`^*eiESz6J0`yVAd?Tap`V%SZ)+#x2q9T5HOa8$+Ba&mQARC|88Qtm`%GoNJ<1Ue z$ho16ftEoJ#vwboC2+(SgEth>+FmDndEthLYhF&ySt~UqrlN5}>1usMnz_1?+y*_( ze48O+H-uX^QpVKOOCy1w)eGj35u1g%FK@bH^sSZWT^!>^%oHoe>hdr)y`&g`tLVl= zPl935-6^d@jPDXyXxz$VWFzHS-d1Lk6LrHsDi-D9irJCyu~D(h;x-&>5F*b$sx4-+ z6l{*+@xWPHGTTMAxRDwo`pkNggenipmM%t(VV~_Qd*W{5;+bYPviiyv82HDle`o6u z-7tmqhy}vTp8mbXmONVEZ`ezyCIpW+*4~)2RQ9n72JZBK&#ettG)z34*)QGPt2HhR zRF>FdtwQH{lGeBv_|Do+K>fS~s~PoWsy4CQeqynKSd|HeB6-6LkC^kgap~Pe?&Hu@ z*~hfFd@EgICh2dcQszNs$l-n(9mQCA1 za&t+_7LfsIu@vWMqc}4fSY*EGpdMl;X=HSczT%<&6cd?S*ix$r{x}WQ86wU6w)Vy0v-qMyhA+GN+M&l>av3eq%*ebF2=V zE`zSkU|Y!7V|o+rGsGs0$1gT39JLo_0@~gj`yw^18I-Z%0U_0@OQG>H&N<~mtq*re z*vZ%->>Wz?*=wfc3vVPfsq-$Mn0c@xc@1*@Fi!x&z1ZAgj|JGMa_E|H(E3#~A8{v8~%T@(W6u^ilVAA z044fGM3A)pjMzuwGZoFDjK<6|BoXcwM3wIKqn#&2BYlZizIc zEoqt*ZjF;MM%hZ_9yz=H+LUXLMG#(wT1$=Mu|l-pw3y`(4y(Of%;UYx&{8RUtoxEw zd7q{-S||svyKHA1CZIyDozzP1b<)h;#JjV&qmWWZxD6Kdp!MK+>bCLzn+{bPfqQfi zQV_n26uh-n6j;>YwlbFD*gK7(TBFxXHNu2Ct;<>3ouIYN|81%9RgELw+tneMhREoL zGezfVJ(0ys{XSFcoIm{%X26u>BRcfTBW^rOM8hpTo8x=sr~~&Jxg(vxoBK zJZQ$qIv%Up-Ho-yCXN5(&x3qjBGae&nZRP~v+}y4heS_H<#qujhmB(E`J14M!$Cghv*RCAk$d-{U6Yx$Mx7$%d zdz{UGQmn_8g-^Gn7~y1XUeB$8Mk~B6+VHD6WmvXEKJLy)_-H7G6S5R_#}3A)-??Cg zsetI{@g(wbEPIHvK9x6f2{P=z;rsQ8N~8uuYo>L`EqBHR#lM0I8mb}T8noTC)Dm+^ zyq|Nul8HTM5EgUQ96pCdU@anbgrZ)s=nq`%E*qD|LXeR)ksH_sy6(Lx+cySiW9N+% zUF+Bryl#AELz_8H&ewpMle!)>uFGT?mU*eK#7jGWu7j^upw3=<=<`}of=5?&JNW00 zX)*U*gbo*j>MvU_oKXTZ~}tvO&&iL`CsrIe4kBbMUeLvf0V zj#CCQYVs@)5>^xX0Uk;pqBehVo~U+^jXlMa;7m#Y1PWirN?0C{E?*8C0x-<@6S!y ztf3J1rxhSS3_a&Y>>p{&ybPmIXAC%uU96;O3^n9fMNmx*C;Q6Q;AAqdv%1S)*GOe$ zAJf6BystyOvOJ?0`Q8Kbl_Cd4M_oWhd$uf4E(NCq_l0=`X7q9B!1NvEah5s!{KHn2 zLu*e2bo*M2+O2KK$muG+MX77FGplO}*gCUAEaM5!sHvmH+aydTt zVW&udlR4B&&JJe(V)X`{=9rqVYQd@RhO8~hko}yFGGr@VyEIO1OMfJt8Omtpr8;X% z_LB8|Q$qVdk69z#`Yg*)|3`{}K&y#_*^>~S^&1n3H#pY~$LA+=Dl|?Egi3QUQ&ZEq zsYQzcQs{l_HUYKwjO}yQ%*S5N8-gYbv4by8ahoui&#lBPVPMESQWho??<=C{E@%x8C|)WJX~%e?j1T%gvKu&uWPV1}(^3Z$b2sHjw6w zElD2ERYV)yOaeP4Vy-6PX3l2C?()KeH?3%wg}~hYxmg2a0EZ#N18iC_?#c+F%HEK;F;4!Gaa zER)h>xz8Qqs3h)g;kE`MwfnF^KIQ@$6eUu%LVTwv_B`1&&8=Q)lqaivU9@%eDpmV2 zjlT=VGW`h{ODcApl$p9tz7|X$94kArSl6vh^g1oX@fhqi5}9{CNY3N0hSp^OA71>S z9%w(9nxHprj9&ZNxH)d@Bd|_RTy ziF)x4QepUhtrn%LmZS;!nCuXku!X2~hJMY7?cCvF&(Bh1av6(o+OA$=Ue3;dB;In4 znVX93#u2O7HRQEIH`+R%0IVc#g73)eJGb`r;~#obtTUX<1uKk+YH7ZydCs9gYW=Cp zwvUA|R-B4umci<~WK%mQH$*_I^qotLDdYQLc9vOi2Q-~6w~hq```@quV*L#!zwJ1X zZ&CDYNLz*TfOsAFGt9u0s|<7f`0yb$SIVhVp#Q+tkJ}_OGpaVqn}Yf(jZBf)CY4=5 zuLsHY(P<8z>LL2cT1^q`W2V9D+yRnuf5Z$zrhhXsMoXN(L}PIt4G8w{NueKTYy?1K zoAV%E%HtTYcV2_)?{;4im5Jn9K990wwQqYE;xQIh_mOaEi297VP2dP~qm{0H2=qxb zO1E17tXoa()fOcNOK&@S)Ht=D4v(%!AJGvfTR^z-9u|?KSCS70Oq(uD>5&>w%>&prAz2y>D#iCn zJ!@l#8k3fdV7Ph6qB0g&uuccE8oi^s8-UmNC4uOlU0{S(kPOs}4-4UO|hZg+q)_85M zQwZa^)z~U!j2$vxshRY$GkrG6U99{X?W{t_v?d6@vjzO;27TyphORAUUEYHPXa{|) zd;nSyw~H2Vq0xfib?@IGuY0fkEl}{|+Yv@oC3t?(DvVfs$e;8?3?SW{3h8lo?tnDi zYxW7r*`)1srdWN~&zzR2#gBO`2-X_Mu|BX$4D?>zZyZJ-GYJ`hH zO}m8Cs;jkaBQNUQ09t^(^}~6MqLBb-!N{H8p#@yKXo2(n!gTsd**o}_0=3zrRvvLD zB?HD%Md-d+y!ZA?5<1tWrq!i-E+sgfWx3%KI#Df_TCyU~wXl{wC)UAJqDv*5aA!mLiihz}-Q9(%@Cfz8_ zFz%diZ4Mzw8wNiW*+kCzjD$Bo!GD8`K{<|X!*?S|MO{8p!)R1=3bx8pb=3jmC#qmH zQSjj^aB5KCq;|E$LR5X*4&l#8?1ioWhmqJiP1U|se~MFC$_1uZm55#3L|oNeufLc|Unu3r{fPRewA&IhLJ$W2wxUc-ckO(<&8#cRa2L$TDi zOPIkM!8Nq2Ujh1yf+iU%g~}J^KCA`i-m*y&?;=mS?$tv+De1gENPdJzIs^St}VJ?rP276G8 zj>IhWu4Xsw3|+RzG7r8cq-uKk+cC2oCLq~;fQkjoNV*l;b$px%a7kPg=p8HZ67mRJ zenvw(_ZUZb)*K?6pqU?5AYtuqxfy<={29t)l`yC7BjAfo;_54L!N0E7xdWoxtZOR1s1H5i>vD*=Zk%GGK`Z|1h(9xemsiB|p?2!2+uCBex2B<~lB`{A(@nj(EML@91QD_w%>i-5%AB3aT z;I#k9gwF}Q)l1Z@K(8wX1<>q!s|YQJdnD|1>~idbz*}wkt+$Hv;Q(*d3gxY~rZ|vw zXF>@e%%leSlnZ3uD9L&y1U?1XldK}zTfG)2$vTIUtj<*5j@|ydl2!h@WaZ}@{wd3q z{a$$2R;AoU+J6NRc=7JUk*N^jG2-dsVDq4m;Bn?!3pRXWO_1b@2T3kWQc-18s9`tB zMXbJ`Ix| zY!ms}rz_6FFvUqV9#Vmwj1txiXk9xDAnpmvyK5BaYTEZ019px?uyCwAORRNoiV{?4 znW)e>IA^D$j+eI-`Efj&IA+%2{>1&#IV|ozPK^SHRh{TW4zUeOF8GcsXr*>#=hTZt zO>}XOmOV9XY^k9;;z+2_JQSu6LR_!OvlEV)!hCD`^=io~as=XKDh$?6mYr;F`UaGx zK2}!06V!F^?d$IK3wClZzI}N|6Y(cPb;46*8Kp3o*tV;uRe}Vz)`N?wwi~BYJ>IQ! zi3l(3%dX$YwSLTl_x(4J-dSf^Y%%D0Q@ICNQlWkVbZGT`mXW)+qbyvPq7az$_qWP4 zF6>*Y9!!Plz-!qGccEQ_&lq=46<@$%0(;c$nS@UMtyuV@vqFkg3U)09e zF0k}n*Q`@?CDPyQI7CNt8Xh!NYqICqmZRBN#XqvK@kRWVKiJr>{&aZfj2g^K8uk$l zNyC9RG+T8Jd+Y~;t(4)R@}^;f=je}mT@Ot0^{K>BULDc|nI3f`r#4upjBpcf zS(cS#cU+9Vj@qz+<2%dE=v&_`D3%`{S31+o*FJ&Vp`8NtW5si@RSm6wg0R zvZmH8;6BCN%OVksB$#>6v8yTX%PmPiTGJbNX3d3vx@y?>X)rP{y`R@&Yz>&PWs)^L z{0;{MyGq9vG~7Q08$i~VREK$1SW7S9E39iM_n*#O9PB@>oL^u_xEw zYN4V5Y)Y{MuQ5dGxFy3vB{E40uqD!%+~Rv=MLRLy^me5^o*ZNA{7WgTj*_zAZ?G!> zC1xcSMn!^%5U)Z?K)?%0@>9Tz{dHhYY*g!-xyLmyK0hGfl@q_m*6rJ|VJJIxpy=}N z?O0X=#wQan8&y$D>ek=7v0?8=>6R9yzhRo?)Qw%?aCXiqiq?~)oSg7lq6~FE%3ef( zck``7Toy`5h=&T>p#?T$23f&;iyzII{m@bO0>k3)N~gN$e79;Ags} zDp01ZX;@9tuE28*IXtgdyTn$T!jI_`oCab*2j!hkMz6PZ7Jr}yfhRYwR0(UoOAXhy zUO1UUDi(!jk_V(_qhXSA^OxC+lWyKma#2|t|I3tD+&cg?B|=XELpIQO7)e3~3|Ru~ zY$YC)Av*#L*-Fu}FrBC)lx#QI`V`78>r6jr5PXEWc)SaDtE`u7T)+s!>cgkd4UrtD zKZ$uogr(E_5citaXu@6@spCoH?8@3PAZsPjSB;jnJQhIKLQS#EOxZxl3p2-K5@3>- zd&)CiP1+HBa(&M~5OINU8^rU9D-S-bBlU&ZSydK;9=H)%j4Az1&t5z*N>^SYu+|wT zap=n8GRh5E{80P?g-!T;F+0~e%Ji>e2L#}($B4jC(vSa+9H#Y%Urfa1t}i`N88h<; z?hI4%g(qIIQtP7aITWR0+s?b6voYn)ui{?92gSX}3b;X9Kf|TF;HI!qmX*d%ev2F9 zcqY;HR-^T>^^cvPjg~DFc+ij%q@n41akW_KMpm;1+5i?*QvY4CmGLx-KZtzM@>eD9 zMZOvel}cKx*xs7e-MKQ|noRTC$QR84kuO4S5cxuMYw}{<9)nk;_y5DB?Dn6LvPS<2 zq-<1UssmZQY>I;}M4n~{XFk#X3TlV&sA`cm*Kt9YF#v^o&Izwp1oFSUNlr1~#t|!- zBVNCmIRi^GWN?Lmte7aPUAFSZrPxNDfuo zE0NPJ7L5gq7OIltbSbZEi`OY^r4CfJXoGJzlm5e?`xI0usb&6k7)=gLpu|y7ks~%a z(}g?KpBdr?q)oZ-?dZQOlTgy`CI1`0hG%0naThyc`{{i|x>LEik=c%=qO997T9ST! zv$?6gkeGb=p);YrxFQQiO}HY$3?-OVx9jc0VKwKfzPa(ubs{MTQjQA%b2f}Y7tP>$ z{Vi4&9&N*wf-WIw1gtFXFIidVogjWVcEsU&*j|3>+)AdDBlo^dtCPR{!=@#$!T>fc zR*Hk!kMe@@`?n~s+u#S;{FPO!@T0%LgLIv%RUGReyY}$;?{@8tqq}x(+u?f6y}+DT z*@xS-MN6T$Ze`}yg_xM#3C8WdV>;D!@!a;uL!p}~$zoZTE*N>J;tLbsDu4LiDI)!Q zAPjrypg`Cj7yBa+<^WvVHQr0RAOD2y+drwWIPlv8)cB1ryc|R&4YRjcy@aXW=O2T41f@iw8JdeVs5H$ z+=@OP*tTC&MIaZNAMN1CTi;5Ik4sx7D7C)T#rG1_PN^(4ku`U(Hf*}!b^8jpMzNkh`Y0yr={zs{>5Bkbro0^p@Fsy9^(O|XZ@M|xw z=BBMr+>Fbd%64SLm)YnT>xMrWhb)O<2)c}m);A!i5Z4GpFX2;PYL)hcld#K?Z%J*n zrKGVU()p0|PIb4!i^5ie6n|W%YV^WkkEf98x74NsQOg`CnC@yUh z8$s=3YH;V0!PXa|;03pq!IEkJz4Ab7qO9VUtIHq>2jtaxGbJkL{pp@V&u`%A>b zf{V{z17kDq1GKZr0kS&cR&e?~DoK++SIt-L6g)t)a3vlVYO^V)jdH(ATtqCXbsALB zy#`(u2lpBf=XKsIhKno)cv%Pg)?o%nUs$(V(sCIe^TCIoYQ^ru#5)H=I^s;4u;2ot z&sWUU0p?YiB0{J+pHyCbtCPL{G6;|axTvmZ-+Hj0^cNdVZsUiye@Ty;K_|n^r~U=W zu)l&3{w2vUasfDYnDlL@xhd8;=+r&67yj`lBWmn<;#Zlb5%REF5CB{k@fCO^NSB(E z$&Z=KPyXMva^=|9?+Lwdz!$vP#xiu%IC9vQ&UX7xGN0d3C0RP>>Dj#|4@)z4wZ|#@7PoM zK@P76E-zr>C-)}yRJXV^X@oW0>6yRcody_T!G~vx{2Srcz1JN9Y!V=rxGlnut|!T~ zF7^X|#cdtUaK^h7+IVx5@SJpgoG-Q9-Wr}D(p@q|G03Xw{`_)Z`7w>0kj2sDE_BlK zWBFZ1fUhdQ_vPKg--pl5wlBfG$+})T6)sH0_9lDPcwNo~K|mLv_)yWfv)5c_+Sl); zS$%8?d=$GzSqFht;rFHh_+(fI+<>RH0$_0$t&!rw&|pi^mmx96KlLD*9C!Wk_6?x- z#I-wnYDUBRZ^^~TxC&7}`L_O5*^Chv`;b3}pD%^$vi-2V-KZemIXq_2bbtU&2U7Rw z*_Zd54jjHW9XMN~nhqK=e${j!%)Sh6gg|(D`HNWAU|Ts-_f~ zwSkoQ61`zm6V-J#Ai$<9qB&lN(QI4GSza?6R>}aNc&W) zG`3)qFy)`OG1?}(a z4(>L*rkD`f+}((wLbSO_(ybcBR7(1+QKSl=Laa;*PFz_-@5G=t*1s9BH!1&piv7pX z`KPunhvRFhsdJ1ydn$MbgpG)RoF!+X0-AR|c3@=G5}gV&Z5}>cf49FFv+CveS{b3Z z{)5*&8d;C_m|0>lZuYw?w!qhPS8QM2@`vK5k%5AP3{Y@TWy`Cre`=2mB{95e;{%Y{ z@y!$rwQe*r+loSFCzAJ&Sq@DG=zBB|ninL@Og9`&I6$vScLZKji#_QLB49%;-Pg^C zHfP*$SI#qzm+bTuT|wupqFCLqbEW^Z*1$FTZsr~`D;fyi*w`Kxe_1X=MgGKlTPcE_ zP_tVx!`^as+aI%yZq1PX=JLQ93sG%WkZjA`D#UEq#%KGM>fq5HW_>1O?9R|bvtbU+ z?n)o-PiVndd?;H45C=G*^I?ye^;5xzndUHgcU9v`{y=8k8T)mn)>$3Uw_pFRFf&K1 zHxFt>1Kwu^4F8UJL|2u{p>KuhHE?a10GPc&jsj-)ekxe^Uy-iGN5oliTJRbwm(RJx zrRV%_;|4!B8K7{3KL)*?Jwye)v|X>4UP0lq%fO+f2M%qwpQng z$qL52SCTx+CeHSPfczd~X@p3X$6Knk;LPjXVP(ziEqM{+U=v>tx}9}^$xc!Xjwxx^ zb~=FKf)-F*V840P!gR-KUCpjKg=1qnKrA%3Jq5bve9dcJlMxfp44mCK^J{izORcXr z(oX0$Zjy?x(?bne))3^-PWzu*w>T<9)m=XE7Z1}L6=e+dV1-$w=Y6BXm~^{Ku+(PJ z`OKvfe-(Q{Fq$(}ECJegY;{R|FhUh1lZQ3txZk|OY;Bs1qm1)6-~BM4WO zMB%=Y{{UZrTYTt0o-Zi6LLzZQRSGHSp;KegHFTYNmyxx9@e?E4Y-41RlMTAY{wGN; zwP`aBlt;N+*K?y(Uhk}JUN9DemZVwENAwd+tTVPp6ZjB4joN|}q$YmM3P)+&z~mj9 z+CO}$hwbGYqOKZ)OD_Sx5StC3er%GUx#kWLfJU*MYuOmLd{pdn(|YAS16DIs!k)uW zA^w=Dmn%o+ld^WBYfjY-&&Mo9D+8#YA1>YdQd@JLGM+g|@Hsb==&`!q$zF@#HpMyR zZ^y3h7Bc;Jomg`?h;pN^5(P_=7}E{8y4>)P(>*7gE*MmkRP3BsntL+H(Xg|JAZB*{nwzr-fc|8td+J1(YGu zAO7F0+Ulir;2vgjYSS*0-$W`sFT8P9J8@w@tEIDgGhP~GwQ`cir9OVtox2H8D7Ti4 ze2;OXJAabCd|?yP6T9KWc$}*b9loqV!b}%^3vU32T|_&iVnAG=fnh)&3EJbT3o}~W zh{Z-zWTm&Cd-sygFokM?W4W=RdQn@OL~Cgl7iin^jfby>$(^no&5|U!L}KD`!J$&B zX3}!02aZp(81^n1{KK|m%yn~aIAYE$7;&t7f-4u@9Mt!dCR>3)x=}gG= zruPx(moeYPW#q3$*HEw4CVSu2|4;1K`ifW0Ip`C0QOaTa-lru{ngw^m?WA!e=9w52 zfUSkV*XcLr->QwM*xL-=2YQp-Zak&5WSI(Z2f~1R{cRmi97Vc&0eDg{upxf|G$4g7=pbVnE2E`J^A90>Z8 z27|`{e7U=Wh^#qRAhrEy`|AklNzWKPA66L0|v2IP+QV02R6zUx|)w z4O@OkU%kP6^$o#6)dSJ@_NoW$kQ7{2#+988WP8T<_AX|zb`K-yvm1A>6*kr@>8cd$ zx||20k~c^Fn6lSY6rJ^-1(&ahliJX%Z0Z&hpfT3QU9#cAP7az-jAUB(7Qx>Q%!w*t9I(rY1idQ#}_!znVGPxCXiSu}iJjnNsar zYv)kGn{`IixfRXACDKUw=<(GCA5xQ^3dY{1C{$(?dvH+kz^)!8F=lz|FDyz0fYe|4 zsGeM*V2;m0I!HKIbvHj1?3Az^8}lA-f|WV^IGJ1+!ESzQY&XBfpy!+HBy=(^7H2oV zRavbPzsLwp6Uch>&R-52e`6xE5ltsn5)n<5r3quKRkd=sKq{EJ|-xerse$q?1f_7G8KG&cu=am-;kdNlA30 z;JouQ<$t7b;138aC>#j?4=NlOw0}Ypcs>JUw-wf@{a;WvAYSzEE*tn{ zDT+ax-*@y2H=>f`(fB`CHNd!w!J?`Lr2l2_+JDIkp6pN0q{s% zdyb}I|G}04cg&w#2Er9l6?rzQPr#hKD)3h=1E&9Y%K%-(I=Bt>vbip>)8&M{a%1^{ zV_dwa1MCwQKpYn}BKX#AJL64hdgUV-?Xkx0XqP+Res*nw4Y<*^U6F;MyOcSoR^+sIeb1c4wH( z7ATKRj8V0i!FO>|Gj1{3i0L&Qt{ zYc)9R(QsZ%6Fi<8R;|*L*J;Se^%C^vjFZcncu7fLb9m4*Bh#2g&v)0y@(E zYajn_cVq#ndRqx)o&ExDB_+BdUisK@Mk^*~He!7qmDKuxN@_K^I`Gm(h5E?elRYZU z(rW5T&H+>F#)`Lhw!(e*p(okRg*;}r*nmP9mDGBMa8vqqDb}Ktk(GFuWSD#w0BYkA zwicD_*X!^cV#*9VywYj^8{JQuC?5bHaS zo6X_Y2Bp~f9JA7~l>f5g*9YP!(5vJZh(WV}Sv5`&XclQ?u2-z$!ox_2F_SOD?& ziUs1v|KY;dsK$lJ_r0QT*VwO9hqQCSGK(tNY6Hr-<8$axjFM?Z`i@rc4TFfNsanYN zX27`ggpro3?CMNWUmGNc(8)^XW$eJxnG1e?u zvSi8F_pua{<$GqPy1K5bYkPlwfBpWrZkM7t=gc|g+|T{_c)WtOG*tJ~9;PKDBipZb zLHP<98HksR>_Gn>YT$3G2ODRB|B*XgQ9VnR+r~Kq{DIO+>9P_TS$+iF)-@{N&wK4J z7&?)W(Z419N8WHd!-9-#_nDfqlCGP{e3DYZs!V&*?*8jMhRP>D!E0anwMw>cB<*zV zlWY}*T$pv9T?GQgKmhp#&iU)X=A|H4?+uf+fupz?07&a%S-6u4JFMvNy z>bZf;Nne-kzpeP~Z(n`dAN1|}QkCSSuP`6)OY@RmA#QM)y6)R+aSZ#CzCzf&GB)@fZ8K zEQpmPQ zq*%79>37a~l#n;=&Teg3b8vEMFFE5|u%N)Gy+ zkHPJ8LC|ao(mB|&u^ak+Sypj;e^0=_zN|4uwu;MP2jn>fK(!BxK-*N4eYMHBFdzy})AYs(h!W>Re*od<^G$_E_r%fr?&95CjBgL=5lbo;Y6zxBV3{#0z*>lRfUow#|5*K_7>yvQrJ2Jqh5Qf_`+agl> zrVUBS#K`U26jvEih;x3vC9s%0W|NbAVwV;*u%-+>qdmpwI=Gf&dUa%R3bRg?Z|7%(!7`EKV8c(G zrlpQO{S=XvnT20jculARJl70eGPstNwrjq&3N~lbPxq9Ze=X0$+Ml!&)LWb02lKcF zGTHhpk~Yh4%ipZ;x;QG;@aZmA&LsiC!(0iz_-C?Fx(m@W@XgMi_?ed33pA1S+!42ux_j!!?CiYs5;+h%(9MwLdhz`8k(`m^Zk%d zsE{>~QRt+qNwbjTE4NoDWrN)%ckK8aPq$`#Zl$BZqAqk8aipf*tsP%pHN21@s()I) z8{KDOxY=5rWB07kOLeJRa9!kcOmy+3XRlV%vJ2nCdfqug)<3xwi?>*0d+Qg?*PX0$ z4jW=yx{5|c*lj6U8Hc6X)C(Y;7hWPB6+|cXJzwCq?U8Shpmo;Wj;uFRVd8uWO~POM#@Pq$%u|7qgUJFCR{Edj%{MnFgM^JzXi7i=92%!++v+Llt##5t zE*P~Vc=Cj?ah>7_{J}ZB1l~(rN!~{XWIK&!jtr>6Ia~;5TFXaHrgQA#VIlPctaN(v zexhOzay`ebKi=TE!6Erv(Cf?sM@oK{tMiVpLDlNXY@iXnF#GRvrN~>Rz`Nj1u?51#Boq4CdhGtZ!}1dDb$sxpkaoo#*=ium*r+s6f~>} zM_cwj+cy4*S9h_t)f6h3c1>~~{pPa@`}B1~@8{|)n)#l+sHY-4vWJmbJX2W8=D22? zL`>x8{f*|QA1-Z?=X*|>>c6_uUzLqC?`l4&GWhI0oiMaq4&rqcDN2LtPS3G8t-%NH zk2PgXL~!2n8ldjkIL8j3K3ft38F<;uHJ$;d+^JQFy~gqBnbSo}qYsN@3r!wHm-*n( z44-Vd3WM%Sl_Hd=bbtoZDhB*~@^e)5iRA*3L!8Spfpr|U4vFo#67$UgapH1D;!)0~ znM{rKYBWnXbkff)n6VG=eB#sIe&KAf{ytB`=X_3DS3 zA{vtA+Luq4g1X6=oL}(b))zPKiEKK<{`)5;&!73wQ^pi3kj>xn4pNRYLA0>N=vaMb zjk-*GK?^5*7C72R`>o+0BjN4>N`kK4gZ=)&lpb;8*%l03>L%(1>f^EWmoc3YHeKfv z(u^lBbu+Fv?9J@T%ScKxv29_VPs<8_?wY&itmsp0*61tm`P8mbwQ~95vl1od!A|{3 znM{|7Sbm3ed~rB7HEZtH37Yb%CUZT6%69FY-t-BPUA`Qn8Jm$#NU_>>$o5kU;KE+m znx4&Bvvj%Dy4VdIcZSV}_K=538};|V5w$b}&)08oj2fKYA!~cGZ&aF|8Mw43K4-!^ zM~*WMW+`C7(?JObsTR)d7V&gLxwB{I&2bm(Uh}m*Nf?=AL+ms`VS7$egW~r-Hmkv8 z?{TP+JU%KJy`Ne^0T$DrE3Zi5$H~H&bb@T^NGR-)u{O0tH>=BaxwTtk(}54I9AUBt zygHq7V1sFd<4+-6-P-Hgz2}pXARcnOtW8_t;%$58yWBFzGG}?z%@e09R@f_mW5+3! zpz)^b#l5Fz66`)kwV@5TEq3%=RCV((yC~pu%xDZca^ww}QQPl~U~S-fFFk*^?% zIkluJH&}EzHrHm7)uxsWv6~qIH_pZIuvQ#nC~Lm%y9!_I*s|{ydl;H`@nMclntIRT zORlN728q((M!eECzh2VSY78IN?6FZ^kQ0CgGi6>NbH~Ve=n+G&kR%vmUdmwv%CG)o zMHqkBj2*(PEp0^1lWytI6s8g~>|43F^k6sqga@laeVa%PbN=EW143QH`0llRpJtaU ze6xEdU6#`?jJ!PHGbJNEIpiQH1@QK9oRG#+(XlRcd)%#0?TJ+r9M6&AP6!3^e;|{e zfO{ir|DGK~(TZ24-@u2vlHC1BDbt==Y?6fVb4L>Qc*>a;54^qu^50LDeALgQBD`L= zjY#Klno|ugTpdo@4L{=0M1&{M5BZLs8FyQ9w4vBD+;GP;4~0~hX3>!)@w-ASPw_xK zfShg$nH-veFQj;5MbS1P@9L{}*7K^JV`kkNoDtwyN#aH)bvCuL;hvID5&~|5QVaUr zMz@wms&}`-!ZAEPTeuJI0MW(SiT>C{Vd%|b4r#Xj{8=x-P@jEMnlF|M#eVTKp|^#W zb+RrL&tzC^?%(riH%dLi>KFUSLAPT{vwP&sps&R)D0*8*whGrMb+`w&Z^&R&$hfcO zn6MQQA6qrCz&k)>PdP?z|95?2;(l2zuj#p8Uc&n9qmL7*F7h2KiT*;KU4Y_pqZ) zMk`}a?t%R(-#lzOx37~0cP&g+%haTn*|my4&TN@X9b-|iYxk(o0SN%80(#6w9sLUc zZQD54FT-H&cZb<({>?eJO-0i!uSXEQH{8Y>9wA9mrzVB$#UNG3FN9sNVH99F<0|C9 z=W*}EGCOQgpSLOLa)Fgl&t6#HrroGtT%VTN5#M(zKQ?;mw~hXRK{+D5^ytqZSRD^9 zy!k33eO|Rz(7GWoyWjR4!kc2%2CrmB9w>5((O4UkN)Iz70;mZAKx_43XaGR>)@N&# zW{m&<`hWnSWK(WO_pWqW^*nK{p;-qlNhTaimrH>S9$sJZG?qu=`LEKT%}rMu)655U9JCpxY>98`@jUB1TS;_zsl-*Q?9rhpJqAh)S;@WjY!G~%3$ zwe-OGU4e&hhoy@?@8+3qZtjv=*PLscwxMBq4Ur-TcueQ%%}44>%@Mh6>ZbZ%PWj}^ z&%Mp&fZa4Aex~E=4JKvUW(V1Qx~LWa1a+!G!9#j^I-O!|6$iNrtU-T+psS}gLl)j% zdlP2X!S9Zfp@z`-JorGKlrPf$R7t-?OX^a}UAa=;0Q%W%XYr=!X`0yxDHSel4X@y- z6i9EVa*!IOGoHD)uqzb15vGul``OYe6Q$?ub%uurC>!vNBb8#nl&K9^jbk9uA>mn=;u4LtR(_r6l#nz`oc?F`(# zv&s$a(iJ%KSgyz0^bl`j_u^3b99Z~V7p^lL`e1_ZkmV@_J|dr?;LR6Z%@a!Q6zQ#k zTaI;Tub*SN15bjBayPxu8H&FQaQ7;G4(t-o1$6;spEiHLR&tcmrA-?NnCk?Bf;{#_ z2WXHydJhWcL^)+{PFDh-$EmFZR6mrz$%#NdZ18tB{vnQyicfV;p8 zwp8~#)-;N3_AU!WVYFGbsBH2G#t=pz#2M>i(KRO~JAJ^E40q_KUW( zKWG{gd)PjZ;5@;viq%=idL}Be--!?JGU!sEG*oX`NrLhMDB3csFFc4`*RZ*|`OLaP z*F$MS6=s#LIft64iNZgK&B3TW6{%Pe@plSCywDs>IqbuJRrBtYepx_bG2PA+F5UaK zcOSK#iM54SfQp3XG6C^0DD*i1|0=66ROOwK@?4{%%&ou%EY9)%GZ|c!_qnXCpXQoLzVFs${ z(zjYd`c&iFjxlLNggoSmmVo;uB{)KbTu4T&QTDi{ZEUz-)^KiRs+=G$e&)m82WUwy zNd9xI9^&f4^cH!xTe$U5f7u>e(sKsv+i!1H+eK4-WLW5K z7)M6A^^uB|3wG*#8LtYd5`?C&t>i|_IEx<#yGtm+pVU_E<`H_V zQJw1Q>QQ_G_A(+%>M`)J(M7(EYv!4siY*Che&H+c+(})jYK#L=RPQu(s-~O6mAPgS z)iIs*Tc(N(F0SAw6N(=K4b^X{XF`F;$|BDR)4MJrNed8A)XTPqJe^)YG$B?v4yDibN&hhtZx1RX|atKEcg^MV!W zW6oO9)wnl~^&GwYz;EBWN>V)iHeMS4WFo#uk6zhyjdQN&^Yog?O`(jnn?~1ly&in~ z2y0ZyYEqgga19pc-n-RNnl+X?tNNWsahU`jEySDF-vxN|t(|A|Pdti>;d;%Kpg2W5 z^Lew{z~h#rm*G&?7L~ad+if|h@}GIs70a-r#M6AXdR8wby@l&B4{D&^5vSJ_9c%j_ zbAYP^%eiVmEzM{MJaj$H(wX~UV8N;GG{@{<@(zrVe-|<68^6a3PdFN94tanxgfSW2U?K z52od6E|rM#Yo%Aeu`ax_`6Jng`t)SVfNzGV6t~Ro*Dp&@C?XBl01&B5vTg(9Imi9% z2@C(eD~8X`QNKo_}PVa?0@?cY7193%lqvh%1B#$ z-oOzVFgm!;Gazz1r_2@nMVrhEg?fE^Mi)vqDn0MC7(3E%J`>sz8=G!Bi|$S8?57v>K-y5u z!sgR2^oYd|$9{jzPDZ%*2EwFsyGwG>%qJl0q4}*2i9N3%J7j}Z9DQS3+)!Y~+KDI#D_rdY5wI)eX`9Dcf|F`30-=(O=;~r^2LmoZbZUT;{JsywE zo*?t&P4peJ+ISh#o>Q$2wJcw0j*`*ec8j=22F0G4n=`k1l~>sJp-;!h{Ep>>bS?RPKCp-kvrvs#w7`;O18CZ94_B*(Gz7RE{H!>`hibA8Q(t zAJzTtN3-go(||iN>glgfojj51Vo}EKTnZhs8jHJHZ+Uu0OYDxySK#qV zn{bNBTy#U1!w4AOuzJiC&K9uK9N1c&+m>V?V8~@?H{2Qi<**SZQZ6R`foL%QlRCH$ zX9^%k72#n7IeJ3SoFGTvF|COohc(HXl$l?#7<=Jty%Oeaksvj|IU!-1ipqd$@Fsby zEX)HumTLz50-q{&dX^5tW0}wNwToCsr8$c5GQf+Nml%C2uVmU@4Ue6Mm?U<8`&}Ne z>NuAKpSPCnSa)Ihdic&P!*HR(3DZs1YeN^UzM_URF9RQ8LPu{sx_EmEcmjC_j06y_ z>A;}}HM?%-Soa5;8ndmkd8XK2MVFAH^st&UQj})VkiIIb`H&rr_&)u0_6Q}_j}MMD zRSHb zyE0R{S0_832ppQ zZBn*6&qNY7sf@%ieLk}Y)<@YmRV@}5XGP6NkW*03;?Rk)?C7H+gU57=AvO)NlllAX z_zJwWb}#6q_vYm{%EV0q??B~aMC+Ha{Xu1v0#lk7!~h(vIQWww^+s5l1bSC2pQzMH zO!xxK|DE=hI(ET_+zEOV`Azpf$8=Qj^kl5g@Z4*QO_ab-jxOETOplHkyj+hoY=0P?otOY)jR9#sI;~brMDz$xWzB+bMqeBC5j+j z`IjG%XmgXZviuJJ@&cvzMdnN?u2|7(@*`W&=owttFLpAVYBw)nH!|5)v0xXN%x7|r zxLI(7&$`{Wqg-YZvoU+{4awu$8?q~;u^;kGeZ zx%zk}3ORk=>^Io)+#Ih%Y!UOv^xs~tx9S?0W?KBI1d>pr%6M;|nc6J;pOUp=_JTo)q zc94|-rEb#y0Hu>o%Y=P{=ee=wY`k$;9zWrZ>v$tGYI?0@{7Hay=!Q6kKjUQHC@o}! zQGJganINKI?06Zx4TFnciE;A@DMXChY{Kljp9|q@Fb_#(|j>^ zxO0@`Nqx--p41fZq!;cGJSn=V%*M=w;voA$ZOUN9h#|E^8Ix;to|v9|<_j0CV#fN_ z?B4)pmLskvpS)%~{GDRGj$=h)I975Z9k+AHs-dxeC2ut7vgTSBlMAvnEEEZ`3J=V#-jXO1EbM z&8zYU&0UJ!RJmiQ+i>@?2_Ix?59BItliQF&O3zPb-+9bnn7sa}CtRfX#hjH& zi^jIOs1v8v`U0wYPqWpw+&iwJL`RI+3ux+;@StxA#3D*$S@udXX#7*aXHcVgL_@L0 z?5w$i^s6f2ws+g(BHXLT)a@DfT@m2mZWtXm3ty2VlXRVsZER|0X}-QULQA!hPsJ;i zUQp%Ww&Hf@^9=sx%#%1y=LV0c(#SQXbW?2z z|4EXjkCO>q6_t{?=3i=%F~(+r%OGk)IO5#bhxzis`8U+bxcCX<+@J{v0l%9+!vUG1 z?|pngEY_s?Iv|8|*Xqj=vdJTvnuBz@1%`xqZrjPNaJd`O9r)+i2wtI4z0FI4Wofqp z;T0E*!(cf!a|2v8QdLXy?>9mUJnXJmv4pBR%_$=-bv`UjdINK@b8Es>5!bXB_sI_* z;cMn+yf&&AOf}y;Ct%!9!KJ=(K~z16Hri$DJ{dsYs_M!4`+OPl#iplvP{$r^QkcaE z`gAu0KkLdkjf2U5kY@8di+* z3@BOlop+lt)+b{4Qcn8St$$l4M{E3<4* zzgOHJD}!G6j09M;6wsswV|t+kO-lZ=CVl)5niM!zwsXIY>p%C$Wz8-$i)4Y8DoR1| z-bsp^vR(O16>>W+VHsRWP&4LT#upF>>yw2F4(gK9% ztC?nf?`xG=CmhsYj1?UAp>1|8(fp+;wf<&Ge?P02*E~b}j^Cn*J(zEC5?k{Y_$Zy> z3z%=_X9w4&4!5z`B&P&6m0T?Es1f9vYFmPXlf=LS`cNqV3n4>h)4@LSwGNOk@u(Wto0u z@yI9)1p_ntxJFD6CIcVvB}cObwxeS3>V1Dz8uDfgp82a<)4;R$gFwuPaOk~pLz$XW z9H|9xsK`~#?{GmA}1tWvG8@Q*Sz$4bqM&yt%FQM zZbC`WeEG($>{(QX2^SIqoOZvqJc3Rz=}7~AwXXw7jr7d}b$Ib%=c-`mk{b!a@c!15 zeg0s~jt);n={zvDFYg|l*iUxmKTPdcZ=%3ou=|5H_e45FkKFJKNkVH>`rizbrDkzj zl0a>Q$GUUj7v8*D)^M=f376)bmjZ+PduNhod_5|tc7FPf7kjCY6iZhrR4O^-uryaWdF`FXPcp1n$|daU5*Q#e z>9&xMNW=JBm05VcmrrWWKGvMYFrCfbf8l70P?)(BE)R%^o*V)~onZKAbp;6`4Y7JX ztbVrzot?C76?IuS7!r54zkWfZ^E)@N5zrkuO@ajdZBI^{=y@?Z1VnLV4_g&%(Ae&D z(?aL?2wY6DJ4BMHt%vins`hw7{LoiavM#G0ZMm(uXE(yaLmp9H>m&sS zt&Ql057$=Unhh|uXSncLb7BL-KWMGnAnEKEfwsQ}N~;Vd?WQaWre}&Fic<9kqt@R< zsqF7WDb>zzcuf2!VLwD^9)=_GB-P0E(GZ`{g~CKHjWD?<&1*_2#knQRi2lIn^KGQx znvMG}$>vtmQT8KlQWvO`mudqKYV^gz?;0_!qSv)|yCXDmA;?3;U7k|# zO3kr!k!o`Zv42XA8UhlR)$b3Zdk5ZXV08bM^7o_r3u`1O9hz{JsoCv*cS!2Y+@s!Ck~_;UjTBz8`s7tIO;ilHQ1=DU*=go?-M=2;l-A)X za6#*WIO9Hh!qEP#8*ym=TA#N+@v^Ix(5vr5dxJh~2ouXD^O6`~X5FAV-g08eWAg@b zfAXYB@p+MuxC$IM;AV$=a?^eo(td=(&36&xbjOX42ah(3vA{}c{p(MdR8kzAaOV!r zEvK#Ik7y#B+IXY44Sax&Uq~8yMJCfAA{QBEkT~a{EO|Iv;A!XO}66>@D#XQ+K;FVUmbL=ISz|7vt znCvG<%ARZPAmnX`LnPcNfRi$MfZDf#eZQ)w-Op*0+Xt5 z>zHdt&mH{auuqQu&9OX?2m+QI@F>UTiOs{tJuddwD7m^}GiC++oebSPwjpw*JE^8D`Vff%}+**iX?>gOA}! zHljCx1J8e5uoCZM_-n6{mz6N#I{OxP^V-8EeUexSnqjK|4;L$N@eFO~$n_KS=qEi_ zzhK*e#ZLVs8iVtGs4Sj>zBy9hENQmQCTnbK&>)YxHG-esIu$BX>pQ0ScJzs-RHksn ziUV%|Nsb1v6XhsaiDIC8MllIIa~^7@qrRy3HREKyN%7u-Zs5L^n#A-vmOJ%(jFNsm zeQam~AW>sA?A^U%=1)S9k@YVKqL7RA@VUdFuuU~l4Ft`!!Il4m9ldD0b{&}LexT1Q zp!*vLWtkcY0zO-UOuRmg8OcLBD28N%0m;qFPsB1S2ospYe8%u;nC??x%} z<7myE@e9@)P}c++u&%8NpMTKeN&ZqTMs5~+mw2Rqw4!f!fZspWzTIP>5yOY*<1zJj zMA7S#GtH_f6dlQmwpsyJ)EGfyfjIuZhDP~20`PL|iX6bezOq@YgwaH9N{^6|?MVJB z1f3alxa7&+Pa#}EQA2*u2}l5OHf-9kR*Nu<`Oe$a-et@?ud67gf&bZuUi$|h3jF%| z=imP^srPyi{+cwYU#<$(jQl>U2j{wCO5Mv#y{v@EuPc1CC;Qf;( zF?^KmfVC5FW`pHYcjA^I#Gv;d`O_ZY&q}@}zE>109V#O@Zd|KK?0{-dU#M*`t57iz z`L;05@D3-RegX)}V$NxEA&yIjTmG#Nee@ST^yF-kIDtJO3lu+vMK>Sq+yI8t^7^Ew zNDr07b4aNMPo~{O^417y5LE!5KRF|E#zE1c-xtnx@~dmk5T7S9r5H)~f<^d>x}Z)SyJ zW-E9?Y0^{=sk}bB@v#$o#dp2(e7lzGup{=p1r+vg z+F6rQ%k2jJuPcZSwDrp<;BCW!B2sA=HINcLChQ$T1gch{(Vj5kHw<244fkifGAi9Y zL}ar#&6;d>r{kp`PO~(XE}c$x{fRdF0opuMM5N6xXg;E;Ty1kZjSvHI(27QGKDCqI zWI`7bc{A|$y!qqRkr?3B+5f?V!vFB&KY+90)^EW1W;?x+oxpLGk|yusT54V~Z5-DV zuoE8p`txl5(~izKamGK)o_D>~6414OX+p(5;)o_xGls~~o641s!H-tvKIB1Jn{d7P z{nV6Z0dFeIu62fArux*Lvm7$=07wxye^U5C)2%{dJz?(bKTIfa;!G&2-qplz&0Fb_ z=>HDDmd4Zoa>gI{2|2_5Q>)Gn^shB2WExX1&{n=8B8Y8}Z)e(eE^1S2RcO+#7H$ix zE_AltehP=-iWuPA@WE=yVPD{F{G$d{Bxukhe!thC0`~G`F0*QAnpr%@hQ+$y0!>3m6mm6Shq0(yf|J5WpVrUzN9+k zU0S12$=vHN6c5TK)U|0`Wy*cII#dG!gMl*0LBXLAG#`MR4i3+^oVVob`@zVPEfE>> zE~f1@a*}z#=6oexYgyXPxG{W9rcOxV;>o@KYCrVerZxEbo`W2@zRLE` zsG8_u(!`Xg6p#{axUKPk%U!@d5laVKhZvDXbGx{XP>gcsbt@|1bL6_|H&VPuy{%3Kla%Tg821Sa&~P`Hjg5w^$eBq1_VXCYeuik#u*!ER5%eecPx{k3^6B5` z&#gnUz9syGp?uNMO=Am(`y~Gv#?uq=#bD2}a3AUY3Nnue=&(NvL@c)QPzq#x4x`LbE|tdWSDt{*U(4rOJ$*N-oR0(L67^Ftnb( z%q0s_m>IHKVbI=-u{lU1+?nSN){^lRKXwd#`C)UeCud4Z0hNatq=vU1?2Q^VR`>Lk za*@-rQh(mb(03@twMSw0QVz`4U)04JA8S3OeEV6THIEA^fpBg+bK|(9FVl(Krw(r@ z9rCrp=_2c25t$Qu_|{<&PL7zkBn(>zIQ@SvE6ME~D!vpyj>_di4KTA}nMDT6U1?s1 zFF`6!Ri)-6Cv?Zxk9B^O>xB0|sNYNiK61oV^Mse#sL5*;mEMoa`q%mST{%keQY0_t zx+R_SD5uE4v?#+l`0#0u*P+tMk zb3YE2Vte0L7;tXi$SAQFF}AEoS{67kwpig536WT=Dp7vQN=a~}Ba{&PED&PTzH$k$+}~#LZ3Z2lsR#{XN)&gf zv%JuWae&m!B1$kIQ=>;nN-nY$R;<)yl~?e-W(Fe}$RX@RIXkj9nn*YD&c?!5fN$ zMGCec&TNdSMYO75S-`>_Oz!m3gJ4@dG>*-=?sBmIuk)dcqv-e#aZF}pynXz8)=Iyk zK=%UnqQMuyX3J%dfy@axHTSsqrfUgVVxXuA{K{GOMlI9s_?eD8SQ^jOWHs#x#Wj`o zd=uLULQK~GVqS^m`5sk6Qt!~$`02$ewBVz4qr2F9DM_anvmLbS*#*HGYw*pmAzT^| z5XJZb0nwb^)4};-K9N5MM6rJn5TzvsM155L91sNxOG=x}9bFUj?-*1U%*!^iESj37 znspcG2OUuEq5%m(IY3wIN>AqcEl~;j=Vj|5GI^765Cc^-c=FVRXwCgATnhCXtH?2C zT|_JRW!#-d4t2M4TIV`$vsT?h1`~=+W#q<6Gr0wobZGPRP3b>zsNjf392V#*EdgDn z(@Te^Q1%3%^5i0Pl?sl5eh;FH|4Did)vOv zK%mmTedTtUQy>9;y#+V38sb>(0WnHQBIjx?y8W+AH3YyeKnsl3OBCTdVQgqLlFjKzkP?Xx-dQf89* zj=aNnK6N#B@F(h+PME_|~7HsN>Y~_RkbSOyYxt!~`F$v;e*jRW+JWz!sj~+y;pn(AP zk5zhu6U$AIW*oX3Xed2PC+$qMC-B4MfX&7D?|!KDxzH}f+rJCcoODqlJN@U=mk_PlfDM2GQNF9Fsl@9JZYwkGraD zau=(#9g$4YK+$Z{a{7DM2{7F5dpD#4khY{c{e8lX1q77rm4n*nmf;D+y;J{B=?w5I zKdZZ={k-gMRSj*0CtN3D+a9KkqL*P(pL*-Ith~CR>uE7_ZCok~r$&^d#RMICV@<*A z&`I~?>GU)g4fD@xD7>D-^{u35x8{Tv%0tq-)#{_mY;Vxr2g(SzyuPGy0VkoNf8H zm$_G9_O8Z>$Dv$MO$XQ3BtpIF4^5|AU7k*NC0$<&S0|DG8+hgS(}P*Mjz^6@aXRMqVsjCyaL*sE}YeZj0WKSzQkXCpu^RXZ5!_4uAm|ObEMQ-GqEKDe_=4F zAeK^sDqubBR(h|~815`yjLCM)Rpn=6mmE4-CJ>vx%_vJl1yvYpbaizU# zaJcB=WG}3KlWSar8lh2h_fT!hS;tX_eS-A4fH4&$7}IE?F--xCX)TCoOb`Camc>{WWes_=_n7zj!50`67OR&r65sBBzXeNOr7;EIba38I-RI_Js~yX~Xh~$* zJsiwrXvn^2NC@H)Y7$4DBjzz~AMnne&e)R$&C=f*KsDb(rBiedwNuh&14TcV19fcq zXruIU$%HJK>dHXF(f1{6(t#m9hN^MQh-ede!cT`Yqr%l%H4yuz<8=NH z>NI5F8PS}oE<7H8MeO|aVZJ2651VT1w_l!ZHOE=oB~9nrG>>g*03)(TX)tD>Z0~E9 z!h2(xQ)#S5G4mjKU+f39!U8Hed-{_C6oTSZP0UT;gL(6Ma^?l0mSmnmE=tfm4dt>{ zR>=CknN+3Co_Ob_Wat7p?pr6E9ipg9+_ZgOPIHcJ<1^msAKD5 zPf9dNe;eaxZDFL|T$;i(m*ftS55%nNhWd1@|GDdQrhb(rjz{HTM?umV8rrra*Hr8| zrwWHQbLE3TFAAxclq#FG$jfBnv1e>&oin&Z&wb@LHqNY$Mdg^_duG~$T%0`$OLBs| z9?XPEFcv$drl0$oI|iQ+SJI2orNIcWP>Hrs$qGHoIavt4+W#RIrb{!7bl4}cE$6r5 z^c-O&YOT;odRXak3;Bo2(+=M+Do>#qaG=lz#7cAF6`Qt}z}g#L7(%Et@|U4fO|1wv z1byUDoqh8JlB1d`@Jk7$C=iJlue}@O0Wo^%?$0gQAgp$lhUQER6O-Aqb1?>M{DVcE zlR!-4po{W0I0{K@D`wl4`2$78&hEC@Wcuj{Sg#p0&q8Hb8^tuin8I2P#3v$3r(!QI zwA>8CNHvfq`4Zl`)fn0}Ei2Z-tMty`hvBl}?&~y5hUkZRTcIz1y?6$Ys0LT)pxaE9 zEh~s?XXMEYJM2^FkOKN`WDQw3)=tluZ)1F}rrZA{Q(1>uKZIl;}sSP@3gpcziQb}S zJc{r{4yNzk6~11as}|<68Q{EAx5B%cmjy}naNz`cn|+jWq(v9>BJe*f#DTfDZe5!q z@B5$IW;t6*R-4gb*uH9d&5t>r-r3Wf=bJ2swDy*{341gmtY4!2{3fyw<LHDe(@-ymkL5?L}nl z1flEnuDbS*-Ftxh-*5&3GyA}M8`xF?1r~wYS(TJJ-0xorWC4KC=@FXhPYhctyQJlk64MF$ zr1H_sq9N-`yeJFyM;j_8oUGJ{e#FxZOYT#-DNf+VvilzEmfoDe?*EBqZ7Ca*9Jhql zO{=|Uj+1uAA9zc=1%TE!qIP#~6#CSPBXZtHvA{>TK^jD&Sq}28aRSY1lr6HnCW7fC zkctG-52+FNTq>DuOUTLlQkKOG3=$jAM;!c6u&w7nprO;2k`LL8OROqALdrli0Flnn zP9ITe(o6IJExBhvOKNziiFj_}DhS^v#8Hm|aa2#F5NY>>{!9BUXp`6IuD*J@FKg&ir#qS$Z$`LeX5`rShk#Ell zZ>C({dc8vLXocNY-)t&%15&9ozf7f$h^#jLkAr{UIu2oy0x@egec~MCTsq=IMcmrV zZ(FPTmVqtkdJfxgxnAX=$4$O;^Mm$}#iHiHJjIg@zErHa50vex*h0mPscOeqPMVMh zugFIz!{8@|qZ%xHojgBfd0WvbIzDY%G$KpHGIKSmqV)m?$a%UMD%)*R6K8!*Y;Se9 ztUBZm&O}&qd4_mBW0e}Mzg_*O45}hDN6 za2AEeUM~%)PwMNGvEsDK&)HFg=_i+D`dmexw}Qk?59RO807|dl7M}SQXL663Fyt`- z2Hu0^gquM3NsL5;gFdh{SEw~A19cAh5K>+?#q3Ic2G&nqG;}1?*sq`W+6pBiD|D8dx6vf->R8kfB8l3&UJ={I<9p#OhrNToX$ z5IHt`9vC7P4W+%1V|e+i9O~w)e3SigJgS@>lpqe!Ju^jzlxxdc3JJQg@J*RWB}=-s z8du-iFvJ#TZCM;IIe0MbSlh}R>%s( z>);+3C+6ter`E@wdhlcy(6RN9#xZ@;R6P7hI5}oZfF(U2+ml*N*SB+=Eg{v*(z8#86z399P|H|AR{=>>SU=TYuNiebboF)}@SCih zrvSKEIw0hb#FHw2a38g9tawdsrA96gxb<^#J916D^Z11~7gD3#s9plSDD&^VC}w_A zFG`JT-Qf-KSP3`xeG6&1#B-~gg1)vJA~fFdd^rGXPVtqe{1aqu)T-G6$K7JJtxgoO zXGv+)RUnPZ_Mwlw-yr0FO`|rRis-nnx5%4U5K1WQyZ=G_h5=3Fv+#ZR0EjVK!&6b9>;nge8bAx7fY>arP`BST{peu|;0#Qj4I zb@Aa_O1;ZhxY%wP9C|6rI-dBTK%p69VrdF9(dKd+sTXQoo1<)Qk4Gi3eUN{GP$TMC zhlBs1V=I+^p<`)WR~iM7x(mw}D{2U^j&*;KCsw57GjVRx6gH(H8l3~IjkPq5xfA~4 z_H*vCN!941Z~@=aOA#R2sRHt}P#OSV1>V*Lf5+EO;rO#OF`yVWCQATc;lIb%Prt_3 zQ2<}vR2Cm#mE9?)?}_12UxKVmGP@PBFeWyazO5aFJ-dEuAEB_HpE04x`t28ZIeGoY zW^?tPIeoc79Tl zrlnS)1o17t$NG+?ytUeQeV-^$iV7u^qG)B+-+wPfRcifMGpdhJidxbAr&82flH+{W zM(T*6kFpH?o&im4S;!Y*?;q$2#9Y4Q`}FJzvjFHi@9ggPGrD>%{u*5`6VcWE_@B|W zfWrsQ-BeRXK-bb1v6ltm5_%PHT@w-9Eu(^bz*Qch>vD7ZaA;V-4Z^Zn*=5rS02RiK z^K1;qYUZyR1;Mn!!3{O$i*O8Mb-qO2xoY?Z%kc5G5yApbYCC>Q@XbSzYI0-7xvFh( z%y^v&8|FYReKlR_Ra+AppOCfvbT}kx6jOnU-Mf1vA?9C&<#C;Zr|k|6Lz1niyyBam5W>G+PZz%o*+2Z80M zmKH6D-`@9gmH=E<5kq{dH-S~bh+lyJO{WUDNZiivN!}mrH+5(E$z7)Z@2za_AFOOl zAZ6-_vA1jyDOHvJBJ-ZAku^Bt%2P~^ZW{tTMZwiWT;qax6v>ma|K>^mv<~VWJ#JaV z2Mz8@rvKf`${!7MvT>>m^u*|nh*>q%$FFqZR)KQW$6u7IDnDn*Q?&J+eiwlBzubXh zfE5k`CfKuxO_DNrKTMIY^u51DU^a)r$FX`54(;TrsG6*73CPNYl^RTO2SRYw?jig*-R?#So5T!FEMR+O#lIe61-hSbI}i62oB&xqs%`u@QIBF%HY zO?|ObDFVd4|1qHNzpO}H1hwwM9~VJQRf?u2jVH%s6w(;7ZmSpkwg@U5=#>S54fE3& zY*l5*>)Wj>dP*C|_O0tY7s=yfhXMhy`~#y_z(5k-x`-i-C;v~Yp{nQ;?ug~CGB;Tb znlx;>Tq88g2(J=rxa0BS`EP^EI1KC&#sPX4A^wS5g$$iah0p;&m`f z(G4a8`c+R2fqs=tAnQSLra1rcka4zP*k@rbaDV;x#ZZMv3sF7J(dH5I*Qh?YU`!~V zbbP0HDm?q=Jh!v-wzN746xo$K@YUf1uRbGw~$jG6b$n0dUP@5l3gm#9VW3P!SKnTt@LL`ez^0{#}$KCu1| zhVUV{-J=Vy0H`Q>1~6|M&kj&0nmmi)7l5AmSxhKQ@fiv}Lj^ zsK)VE$u!k^J|!E^_sSpOo4ypJj5-(P2J@7~|I&kjqdsY+eYv@9CA4F6+lrt1WE6H3 zUu-NY`)XoL^BxZJfT3lAWl1$?1s;wXy9KVg2P(WCHG08yb?N?e((5u(RoSLg zANh#{2xQSInvujZkDZ*^|JV&>pG)*daLV- z3}Jib?*6pWb65I@XY$-Xc3msB@4DUuUDr%7xG^WF4jui6I|usO#oKodc*xa%xou@h zvQb@tiohepD`Aw1Mt9oKAEj4V^pWzycdu(^OXnizn__-g3Fursq6X8WkM>tdK3I;a zRe0$1_Rw1WjDi;@Ner*O-@Nf%=$aGdC1|5CNxTXNcJ60Un|XWD&+(AX+}$MJFK>3D zNu}U7I}m*_Ui_PEDyUuK=tBsWt~9{X6;f-R`TM0S^iP(qs4z=c>t26cy3+KOaGT-U z#8Nd6lz9CbN@bJoCyuPX5x^F8s2>g%t_CN!r&8@70%J5w!W_2`T80n=Kxx+OwrtAE z!aLd^N*X;{=^T+&9)-e4KJ;hhz%ISR>&9KDY8gI5X>3WPS2?1~P<6-L5dYwnMgDlR zr3WKgeI0*?0RXNtJG)g)gqdO@QXz?%WVLC>Tl^9R9u=lZJk{xYnhrS>+Br0K)^dJ{ z*e+~*K$@SA9X=Kaz`sAo7W({oQ`$ExFvZ7K@hsv5mU6muV5T_`MpEK-5X4@y-$<`* z#@?7i-qs-Yb^#&-L+2UhnPB?RDkbbPR2Nm60j70Y4ohq4^9)~%FqP!g5YM0tCtdA0 z3l`}WXvUQ*pY3IS7( zByf=(kObgR5dnAnAiKPA3OrPvkqTeD+9`F5)8<}QUoRNoF4}mnvK2!ny^pI8(hrG%ba-yzTNWpMcPYb zCjAs80ZaP;4v~Y~4@l##Tb>$4CANKpuFc0g!5$0yWi4BynMP(lKh6Gt6&s9I zS*kn=IUZcI|G+ac9@}X5WljbKeYR!Std0E#&D?I1=?u4li%c#ilA{SG zu8b{Yd}qylqF9A!D4C)aBgvW$2Hlt=6exeL^$XI~(?{MxD(FjO*m15NyuAGMDIQ7c zZishvXZ3o@jg;Fa3i{TEkdo+#e}%x>!~>RopoIU4t?1>?xdPNfHV_1d{%uk*l9q^w z@V?C*z+a`OJ*vin2l%Tu)B%6B_Vaz2Vxl@8n)UP(&W@cWNkLuwg%)6zrV^4{0WTKZg)EShup8C}XJ{t+1H&yH)V1#oo=njMmbH zJ4{~}llTDfib(4KM7$zrm)Rs<39HNR7ZDl`iwMQzV)(5rhN(5qS3oYe`bh%osJ~~y zb~=E9%pEIsN4PBF={bsh5<7M`k!zW-7RYtXo_n!ickz*3`8Q$-k7g>)M5!mN-JX`vl zprz%Me7W^ZSW>4RycXtfc$+d16msN}M6#WHWl<$3-)K_|HAh&Hd;!DJh#m4XiBg5{ z;#+R4Zx0&aF^3AWf-YP~JJlZBe7-n#a%0EuVXUS7?Yk`L!QvMKb#K}rNVXJ^*C;d% zTKv+YHk5Q0N2cDFuv~s@779Y~+rKf#18k%Xncz;#Hth9nYrHjg*&vDeWh z+#RT{GZK>C?n(pq3cL>vTV&I>1fIhD(n)`WwHcAXfy*Ydba%?mqcuTmC==HHNqK;PW}*MMAh<8m?iTQ1fyt=r(Mrs$i{rF3J6v32%C1I5~7lKQu}f`u*;*f`4FSH9v6GJdAd}fSK=N zJFXHg(81zwhb7o?7>gx%=Mr@WU8_nN0qGrKmqGd00pAQ z#dB!9+quAOmut5Dpe{MjbFp$IfUoM;6yW2<_uS)o)J-ND0=d#dAlJUpmfdVGvgD`7 z*n~a#F(O+CPRqt|#B^&8vibMnDMc5G#%Ni%+;?0dJi z#*X5)##Vo}HRj#>{dCu9B}8>T@HK@Y7j&^+Wy1@gOxtWuNhR;OgT7C`QsCXk%>zce zqhPdK2LC?dc5tGs^-uRbnGP#Y_)BYJ(%7{z{jmb@bmFQyL@!FOCf0&U1;$tR&zdJEO|w%@*dFS4upoz4rz`(}CIwu!>$)sI7p? zM?F|LjJmr^#)LJZq3HOx>qBcfHvSIc)-fN$V` zwRWrQs+4{FG{h~4$WE>@1M%t(PckOj+x%>*YtTjbwIUo`Sj^-irneP(NJNX7>aIXj z-3~C-<(^KG1ykK#yzdss^c8=xK!&K)b4y}RB=b4Uz5DWG49>OP2$__bhQYZOY~ftT zMi)Q9VxSd4wN<%a40O8#wi)OiJKEkVUdf;aA8X4F?}lnAjCHXNR``3DxtLCD2Fi@L7MQ zcN?~{G^Aj_NKEKe`AD}1^DNLufPt<*zDHg2^Gq<%4LJO;vS4$dOTRVH)uMw2x|zQk z=$Q>M_~rCj065O*e?5n z_G;GVZ(XCFrCE%BImXzHiI^x&Ky4c2g_g%x}y?QDM)4wIX;Y8@daSuyiCD_15T(fxzW`meIOsvG*jR&32*yVZgpz@eViR{w4yt9zw zpt$H9wt@>sgp;R#z*HrWgSKk(vbqhv+c3AlJ8|RE`j=0ZsB@rt}fo2X1B9Qzb#&I8B|kHOe(-bWSb1FN#xV@l3_jxw2Y_ z#`B6ZZ5|3e8a&5mHZnS}rzQvhwtC`b#&1h=6w|szPLx88SFlpfQM_abXRr$jXztg~^9ik99Ae>#8u3s5}4m##gr$^Nn@orI?2seb(48pfeB z&z8;xLU%vrDUdX_*kvdtxYaMMmm~`gL{T6_3=C5*GIaf#gR#7 zPqL<+03bmV01`6pYy(KpQJk%z_@BdZd3QVguESs~?6RQst;3MfP=1$MB3SRLH8jg5 z{yyk_=A^dKm+Ol#k0{UlOF>uhCwv6n7~vQZvQ7<9V|a>aA)eDTq^q}n$ZbI^F30?& zTyQ%)Y>}sftiIDp1x<=Q;%pR*=;%IXpBa&K2#{cl0VH_(06@YSEFb~?2S7qVK=q#h z5;TvK=%=WS4NHgbQ<9wKZ!@5p)L4yn!VYsmZ*wc{mUp&Pq8_0#|D|EB#EYOvh##PB zNE3>cx!SoH9vDtoKJ5KA70WqKoT!fDtS$1LH!fZk>UCjX&f34{DA~z9j9`?T1dVb} z;6}NjxKS<}Zj^fq8s+wD|6-Jz`WQ3HWx}|$>J>No{uww|6=(N<2%8I0_3WiCQ{P); z3~%YW+`+}#OepGhfv6iL4~?%u`#Qp(@+eX~%luH^AviPL`Ty!1mnm$J4kL9{v(E6H z`XHPJET=Xu3kG7%y-at&y3I=fUQ?Z=ZV<`r*dx*zso3pzwfB7mwMr`$9@)_dX?<_Z z5O)z8;u?SKbsx*?Dg2U8!aX{Jzt>=Hd3s{xeWryM-6j92%k$3sWRm=t+pi zCUl4eYkcv+N%8dIci|2S!X91=R8~!*tS#kv?nj;@0M^zC}FU20faPy`aO8=9j}; z`dLLVGED$_5xRb)1E3UEdBfYC*&n3-c53i0-3p3cZ?C)3MLB^18UgpOK z4bm67_o%D0f)jn&HzMot@}Gp@>P;$275+Wh@ZXHU#Ay~nyJ!1+@FkwbV%z9c3~(@KN$A5e!Tab_FjFAdPrhG{h!6pM2nutU`L6ND-E4tb@?&GqPhsY}qWdTTZ;4Is z!^@m2WJBP?mVC)4u`m%xyZ&N*_sPGlzKe~%2^SqN3csZMKU&~5&!+dtP=_@Oh7kS$ zSV)Na=Ku?=|8BrS@<4C@2h1@;@~*uC>5+g>dx(bF+w29V&U*6WNp&Fsb{O0j7L8>| zfjkJ9Xct3)$a$M}vb-FH@x z89%`R(QZECML@7tUAk@?>l+TT8e)Qp{NClUxmGdxnP5E)4s8$kX{!N1ErFY>+w&4j zB2PlX7w3p{5!xIzfWliWToAA`wDNj~9zE0tGFrrQiH?t5Eab z3=ZS!7s@cC2VbALQ~?hGFSv_!!tTX|mCQr288y?r&p!fJG++RxWe|upwU(zmCe-pV zL@FV**Glewj340IU`g5DfnsQNvwET_ewIeH6=Nfu<{BiYcPD?P2#PGl8KBL~j@?=_ z8XKK4EXVm}d*fuJ)?YZc0fwu;8rYGuWrHr~*GJaCY^Lg}Z&vT(!`nATL1Yg#noCRW z)zLnuz*fAFfYdpT~2!q zgwd*SDd-|c>}YHXcI8%*=faV0uKpIpw5+q=uy=yyM>7gP8aL~YIcX?aDx<@A= zEeXiQSs)jq@>Zq3&&7T}$;DilT)ay4$6TCy$eCyWv1#>6e*Xke0)OT7n$Tr%M1?jo z%Zs0?uz_$2-P@0Uk3c_kTD%KCruSU# zVm(X2ZU5;}B|5|x?79`vjG8};w+EzX>IK^~1T>RWh^o)jHV%F}7%hl|gWu;|!LEvN z1f<#f2=An>1}rY8Moqpg_(Jn#9|*pX3c(ks7Xyq^%7wS+0xX*Ogwx`x3#5 z&m5N+a1Y7O=p*2kJ?IJF)k%MeZeK__if{-(7}kc2OipIrx5kcjFOaPlE4Ab=NBJgW zC$0tjYk)+y<)zK27*u{amBj<~D7dFe)GQX`25wHwO!D zV)xcy048R65NK;TPCIBnoNUAHxUu}rld12J45ojIWFX5khk0g!MqK40>=%NtNr2}a zJaPLIm!mGD_LjAlWSGmuHI1vDdRos%PDMw%1h~3b&-P$d450FG2~&BPsJ)H&@)zQ; zV5Oj(&{pB08Y(a%$CB1#4v=y-rS2cPl}_Tte0gHQtcziybo!M$ONx zi%I4QC;7vV#*0KF+7HdoI7D0$S)+LAuAGrJSGuF1{;AND?FtXiv|lP4M#F)eLAn#{ za`~JvnFZ>@+C}_yeDw6eA)&+QI`c-&@-Zc!5nJ5?BY@lb3xtNHke?75ShWhn2K{dN zi5Sz=FSFXGX70V7FHN0G5XBnszL#!hN@@k)AOqcZg~JM95yG$PPz~7xq|y2a<5ONB za^GF)iiU*><-`<_g+iT&bC}M98%t9OF*yd%An)^s(!(LP8^0<&P$9njn1%mW!^SXK z*gRXj7@+Y!s5}@yKttM`gQwxZrL|PiFddr_mr_G!mRUsTvemF@{tO^H`%C&Bjts}JSy8M+KIr#J-x9{nY5MyUF5XB9gSMxVLXcZd7BkE=;_`ONl& z3Moj17q1Ke6~%$e!67Lq`R70?%;je3g9Hew=tItd@`ca#CU;2Hwy6yW{@c*Gp!sk* zkv+sGd7i>YeyjWd5p*%-hkuTsYdzauB`~kN;xnXLn8!@A7D688tQ85*IGYJ3;03XC zlc!!kjb?@yuXSgM#1#D09^E4&vuEdEFFyB> zJ!4qz^^MpXz(+nZ>amPunVjP?Hi}2ITM(}R(Mn<@ml#7mQ(8)ilXj&S_@ebZ-e>H{ z^?#W=mKK22DW_S>y`uB)Nx){mPQc#(k0juAf{o|FosGC=FLYUawH(4YxDw1ylkElB zw*294fN^j!vMCL%!d|Kun^F61=^Us?=*GGj(cTW!0Ta4gQs^Pgp2IQ$(!z$E*w(;8 z1>(ja+U@=+AQodfN%L`&rduvZ{S^|6y?|)Cd!_rqcsL{y_p2Gx5(;;M*|5i8h@&V) z7N+1E!ww3*8kmAF&qNxw;QLY}4!g^Bt;Rm&n$w=`dAd>{Vu#+MO$~OJNT*z|-dbma z@h^iTP~B?z!hYZKh1S{9v$odRsw1E~*&ahiTS2vnA=_GKgWc^3M*U0KjqBT4x&+>T+@TCde%~ zWF}d70GbBFvD08n8u0%qK=h55fub)C?=bQA=(^6|(RKOx{*2=grARXwv^Y|g7V1Mf zD+>Iv4I&({6*jrGBq9Fw+7H?DLDpL3jpBFaZA{HRfh4Ma_|)<1FNaerY7r4wD0Q1pZ=1&D$6+?%fEw`-7}f zZl~QmbzQz>z&$BTLDH_v8Oif~{sYYs@+;1*2`5{QNplT%00n5Ax$B8*xQy`PT5Y76T$X9gN9UG_PQy_BHo$)D7EV&B*Cjf_aU+`Cbf4G^1 z@ty8rT9txX>0mjx5|^a?J3!61G8+fj-NPnsRc8QI>kEJn<@~DK7h_$}v>^{iq;MOCXHvpV>JiQH&M)^?{#Cyf@!Y@b}y(lpScKJ$Rg1a+OF{bmuP!?4P)|#3$0m`YNMvzy{$10NB7Sj{!DJV5htB>I@fiZ(td`x%OS~)t$ zNSt*!#$K+!A^dhIHfYF(wy8I}>@yp$zNkTiyO+w(bbC#X>KeUC46O=O!`{)K;mUNt zfR`Gx&bCZPA60_JgND1{hcBc*_1L@5e!c8Ud1dbMvQd4(M8=cjR?xQL?1|H^c zsbgNT1PeCoS`V;X!QSWg8nm9yNNl;`Fh(>6;JcInzRPZ7gWZXP93hy(11Q$~h3fA= zEJ2$qvA6v!WIOY?!1lTxeRNv7;Y@(!D_IBHK8mI%2uSX*bH5OyOJ!&Zc=wTq^b?+( zev`-FafwV}RIC)EC^Pt`C^N<>%34etvz%@?=J!pi+4cKq!R@A$z;@feJnV(uhWQZ; zG{F3et^w0@EqP`q7%-nC@7ne6oc5l0rqmxdpTraF`Hz?- zQnxWn$o(goC7LamQCHA1x8k*5F<_Lush3{zB#=q|T^EpRPJNX65s z#@n?N|DKf8l1b(z5PtE9apCtEHvIMyV#DtVO!$5E7s9W_NNAPf7h+8LA+J^G9~Y&a zs&xMwp0v*l41mo`vg2IHPKeF>8;;FO!RLDHZ0cFRKwHB!z~3bzL*M@k5VPcdzGs($&KYpZsn2uL1_4qp*%r@XOWFHR@f^Sl z{_o{E+^6Sw?E`&(+7S0Y1EA!u9(Mto6v)v$l$h%(_jMwZnK ztNgQvED84D5#1$nWwhxwkG{;d-PVqotrcBg0W-n93g+p_o08$TUa<*r%R7me@+6b_i2w~fzAA=t=tTRWJra#Po z&9k?dZ!y29J^ioBMAKs5!{L-?JWmBI0POw**ZVB-g1qUJ*H&vO*IN^Hd<^~i zQb6TeE^qZz4MQirRTEG2yxd<|f}3R4fzetLus`3qgX$5XKa$VX+*&f_^L%~jd& zNxqmO@JH~^Ha`gY&|sYmJq4?A3J7gspk|WjLLM%zv#nds3+?pHFsZ%)6muDGGiSme z3764|Uss~yC}ND`$jv9`%!a@<@fT@H;RDvA@1~9Q9#^VENA9WPF+!UU>&g~qVCr1- zPMP@x4M%S`@uWYB#O}c@xox`#H>odnl`c!3K0&5vuw3#pUTJi+gMbDEd~k6C#aP#I zJof`w;KMXNU|mT@!otn~;DbV&+DZa%hIaO@%%+ABL`)>*+YrVW$EIvmqanYiWb^U8 z#<@bdcfcpA5b#+as`?)(0b^hQf3XBy3Kx;FVuNON(9~%bU4n}N znt}AJ(^c9pSlRP0?(vt8j>s#W=q-W*XQsW-W@_>9&Pnnm&F5dkdv8)!?GYAfa|i|4X-=j z^X8g=^C7VLe38i7!3;kovyYFdGW<_OscvX`q&&FS7X3ZQS7sI}K&Ly_wOFwg zDViiN`=Fy)Z=E~Pud^Hv)*q)YLvj*1i!W5>WSy-Y*8e!j7t4JZGS2;vHLkt+f5W)e ze|kz;yjAQOc7Y1E!DJ@M(+_RN^|&nCK6Ll;)O2Ve)6NlGc++vX6w?mwkSjcN>LHYT z_YyzFFIJQ;mmzy|t#6iT>NaCn99Fm%%2kPojUytp>QW9Pwb}%l=`)7oK|r%=2xx|4 zIT1n#&&19m6{dGv5`yXJ(IG)%+Zcmv$XX$D4p=MrIUs9AC%3|YF8`Ko4Vh~2_RuNk zpYY5Up=CRiJ_`w4Rbp%kXIl$R9znzonr$^5%|@tF1D=m#+uGLl;%sZAtM_)( z(Y^@!a;xDc<_@aWY|C?Z6&@}=E!Nd0(C&g~qGC(K&Arf9_ghX6n#<`TNcqD8)PYKV zLv!VOv0O43qGxZ#uB}}+m{^w!JyG|ysavYJdG5h37ZVq-?DiX2c3a&1uhn4x`e8$TJIst z2X@r_&aTAtk8Thlf-@4NEy^M5nkr;nE7Q<&1PzCNw@vF><_ny4jpb+7wdp@?IDm=Q z^*7B#FHh7n(1?${=Mm3ZkK5x287j(P-_spFaavn1U+H^f{-pfrU!pq*{{&-3p6;uA zksS`At)_VyPt0G7wl!ZLr6nkkQtA=8AC&h*!#so&0LiQgw0hYIF|A&GHlSUj#%kAs z{?O_bQXt!mwnNV~9FdRa!3EMt$e)}fuN_w9N-NDU<%%Jhz2gK=zyln~?DBVPhse&t zT74a)^1oDWV3M@sd5&~a!I&Gg@>w=vy*2IJv66Dl=Ztsw>rGMYQR$LrsbbaB zb5Y;56KE<7v~Ze=eU$NT&;6d$dm;{SF~BNOo0-abx&n#DuO0`#$7B|LhI+6fgG@d@)>7@kE6)wRhY!-NwVE!1u?)Yf z)vcc??bfAX8Q1SL6{_*S&{TxbvnLoo8ZB-qj&U)}WgdDSoP9$;opU8`#%naR%sftq zL&d4~&RE%Vzni{}7*cPqNQ{-y5X&n^#AI1q2zJ+>OCky5B7|9?3doZoqFDn zMDv`1st(kYu+6GNaB@F=nkMYniD|%jusibu=Yb;tOWw{tj!5@U68Nnx_d_H8+O!wr z*bvpLvm9v8nVt2dTCb=kDVzc1!Ssr6$S_hNuAjG}UO9Ak zl)NiT{J72%jo$WWs^HC!w2l{#l=G;v#-6B}7xd9OM4MiTdX4X=)~7roK%@(p)Vcb` zp8{6}el^n#T+&__X8nzNkLaGvojWdf%%kzEq0i|>A?GZ66u_BDS~Ag80s4b$ZE*t#z$wamRAW>T^c8AH}|vSb`SSRVQP}N(407blluf& z9HgU58)TV%3&;sP_?1hPkKO~)L+Z~+4})vq+Oj4=YR4UfP1k(@J!ANTMA#*{dC+Pq z{%m*pKIb7J!O4gG{?IbpX~<1+Lp4q!3ihcqO4#wepu*&#p+T{~6=TGAu393jd2eIM zSK`EGlHwkaMc9&Lv@h~FC%eV;;q$hipAI)iZaToKje46qNgyQ~0P3!|hCcuiy8hUEzfK*O^dbNmbUE2ONe&sp|+e*BJLt}vH$)vu6c@)LU z3F)q?BDoWf^Dg2Z((Lr;L`|_E(d9ens}0|5Y!0g$lr*cGHZ}^-N{+!o9dK?uSd>4) zW;X>SKQ*cki$H4&PCGe+6~8`=NZAjVEu0i+%dm z(;-hMkt;)N*P{9pbf}C_-5PnXoj#-{+qOMST~8ga83GZV&J{o%+?T%tne{**vuEx< zg3J_lVs_Z{Ss*b*N$6sG=d@|efcUv85Vz zV4oe+yG2OKqv)4I;Pc!w`3OeLb_5c$?MqHBhtGtbyzR%U**s~2e>SG6)sfW2vS5aA zX*g?C1>WPn?D{oKG58`weX^;qy`4CZHT=6(w#9M8nP$1RGr=#%IvN_K)Z~XOd zw(-lCXsXKo5qR&p|7>{gMd5wO1bsOsha(X#y+(_9UI1RKB7tf2+9K9${qN&R^of1> zqHiL|o(YSAC9Rh&R8<*4wywx=xP81pB5*7RrvP79B$HNTNMX{g$L)#a=;Zqv>{lTz z2Zz()IOG`0_S5nmhdY2)rsZ5t=%qE7PJpy*eOgHAmB$&Po*6e3@EBPC zg*7&RW{w`UCG5d!T1Gh3gBCzLpxt8579k>u2I}Ebc4`sT(@ZJO5!vcFqyt9^M(mKxquz!}>qC zht2gtcV(L`wkEK}cF_BdMFbvy+_JhPW8N@j7poEgIkXoZx(Gg&u^@-C{LxQ^_aU~K z0$`ir{;2;N+idBGQILQ5|&>Ml7>OX;l;+6A^Mu4E7cG^^_UyvEL&JB*Y;=LhQOnSYdEe zLfpS4A^y?^Nr)e*{YpY?$AK32;B6Cbev)l@Z(6aQ=TN*FJ;K~o-iOi=A&wLT%<3+* z)5VQs+D0I#Xz;c9K~V8#dqD*`R!|YXjiBPzs`<0?Z?(GczQteNU&misO9{}a^v9F` zO8E!{;_t{$<8LLmcj0`pLLOWq(RUvB9OBkMQ`e(ZL#n7A_``PE)i5`OmOVl09T zRXv?F`o8!ygZGUNrtt5lyWZwtx~ts|rn`X83p$zx94B;fJ8&OyEZqAii;fjjo=)C- z_Q-n>FPXI>X$iNTb@EuPDIau}fRCW{SoGmkAZ@x*s#;?>PLZ`${uGwl6v*G^wdI-5O` zV6e1z=jV+;1%D%eB#xxt&{+MHremM{}<@Kb~pZ2x^EohYAc0YZQvbfEsR;HLzjc1@A>VDzRf3rA5Lpr zWcOyx_cyV@*pI8U=>er7k9MYx>6_nAX2wKeW+(~|CnXnyD7N0& z!Yc90aTZrNpfHS#^#u{Du)K3a6MLS@nYY1#@Q&?NuL11h1!P?ra|6pr7d^qe+Y;B>?1eglq zytxP*h7$3sO3tpVMX5E6&;oEl(RaCt77tEp=m2MOMv(6jU&DEh*9diSXfQfr(%k^h zmItc3=LTRjIu42*DRXL8SshA_LfXfxPqZdQQ5}a*lfoE~f~fqD@qMv$&gVGbl?+;N zumr`2EBWGWTk>_L`_k;PWL}1^IA?T(R)zjLt!Qu^yP6?FoXkL_l|U?=L6@(ORzmJJ z5Bph3>;SkE8URahq$?hy0lgY+x^Jb_W@4CvW9@JjwjIIG`)@-Tye zc``;*d><8n!b3Xk_ik*#$KqeNllA@up+!_?)p-ofEqM&H07a7SI|lcW(tv41&pakNbUH$>~~hRmNRA2$RmyLVUANIKCNQ=rY`me(F~N1x}0(?8%GJdH68<9+rPZ!_I0D> zE}<4eFY?C9`U^*$mDf%+OQ$A>_|ew%(ULYpfl1A7NO+0Bu5kja*R3senW{t_mC@D+ zOPKLj__E*eax>Y?u_7UmnT6A4UeejPOh1n_o*~cci(b3h3TU)ns8#7SOrZ)yybhXm z8fie8Ft!_ya`%c#3rmaNS}Ug$m=WI_b12!xs_mQLqA5DkC+0YMCxOXCdV@9M-VMM5 z4%1qIq;95n?6WdbJkS`a+bAS;W6bvop;tQEEPn(EAv%^Kp!N8CLTFK{TWWDAEi9BGxcq-Fm{hIf5x6Qng!@SaNaOf#+G8diNlOtub) zz|VvF0Q$kB(4*?5i|Cz3hLgCG+fL1~q*`17_ z0YLX&Aep?O+>TiDu7CYusW8@NG-!c~k>dy*Xf}QFuZ0f&B`hDQTz6i^FuyP5db@m) z{#voXoNHmC7z3e6@=RLt`GY}iCDU&kdHJSaid^g1!Cdgl#@hX=MK~Os4Z|A&jXjS6*qqpGT2vj20L*wj)=d+6FOCxR9 z*4%h2V2l#uNSY^Fz}c67tmqyM7Wk`PSYD@dSX=58ik>hi_f0=VQO1cV=_0K~s;&b=X2qoYkdK^u?s9ea z4)MBh>36M?UE+@JUVq1QeFsyRIC%~Q6ya3?ZRIJUC(|);oLhHCm*)%fYKy& z9-QOq=6idpw%ZNdA?9*7*lr@&y6~;-g1rQey!8&;74{0esV%<#Ey4|-kk0&e%>P{_ z)5cKG@ZI31#f+0Os<1$Ba@kVSuY73}{jdg-&2H)r(Qw!s^REO%l-8ojuHKkQ@iS;r zeE3{Jq%KN^Dd!5N1TjcAWdc^a*hfRz`U*cqBv>{)Bi&c#h?ZC0A>L_&!K{Stza*X`)GPPZZD2_YcKAB$um{c zx_VEz)9L%fJ|8Nr-V}?)@LFIa?;zbY^yGnt1e6{&?4IG(UsS=PZ>*j7uAPfXA72cW>jn^0hCEEL#@ zg!da1nD`qM7!O>OfR3c&!4L1OKSF_Lu~1-TEEISl9)bcp%Bf1!nAH!Iv(@G;aIr5T z!Th-IPSYSXKfVr{68&I)oZ<8#E!j4YJaX;USho)i4uPh^q}@XHwBQIY;}u%UIm$u> z#{C`{9^^<-w}k;p&Cf%0Qut^>zJozjl)|FikH}GF-4lLhl#V^dxmvY@CF@-TbAmi6R!Lw8%VrjwuWi*l14?mI=I@e778tXL9=l z8}+jCqMLXhU;-Zq%#s}&gBWN|g?j-L7`pacD*r~G^PwX>C`&k?E`c{;engEo|9Je; z>;WUo36mA&+hy?_evOm@{+ax7h`BG-cH@A%e}+FaId;H5YLAJ_js+J8ms$V>%_$mq zfeY#!Vj@Oev>9%;46NH;7@3o6+7YF%GjgBYR!=m8H&*0~2pAo&ZjFxnUW=$I&1)Tx zFMOsL0d;{3APgG)Y^ozlX&rCTWqi@cQ53?UHDEAkH^lk6vO+%r4BE%1g*P^utj`R= zLx(%3cU>>)HTSyI_h>|GJ~k_C{F<2{5N^rE zWyiwh80JY6);uPX9SB7x0%Ttn5AE#FTznw99F2xBXye8~d3l#RUcQX-nuS*w?LkGj z5Fc}Ue%idpnvF7utLkPckQ?(KtE{4_x<>4!Lc$@6@nKNI_OIZtG{h&cR^8C)6(9Dq zR=uwB9P(jEz~8n2Rr3xYH*SR`p%P{-<&;U*v_NG9_JA{PIrT9iExeRcWz{F+>Hsi2 zr-QXP@RjKdm4R768CdzQR`mqx@?*fZ1qDtokctW~T z!579k9mDW(>oL8%r(o|5lCj^J`x;@^$bw|C8h@S*mSm9=i42`W^z)=C1{{SWIdVGl z4kZG+?_5FyDMsxzP#HA-a>-`!BEY|8h(l#yg-bCyvn;Bil4pV5nBzPM% z8yOG8p6&#v2y>PIA9O<6Usdo-WE9+<^LE7N4RGxeg=dY4%ss{s5}3}1qJ4(nFtfm8 zJj<3@Yo(%LRdua}NjbXOw;Fwe2awRXhxAucC754NEHEaI&_dkQyH9>{}Gsfz8+IMbL*(CGIxzuIVRxm|=jjWz%Ys5&7`%>w1>{^HaLNl@OaN2Ufd|Fm6r8iqvVDlhDr)^rsJdqU&NRCrN zSu*-Y;q1E?3_YWR2*4D%x5RB{ekAW@Q7Lk7q#D~Zclo;BGH{Yq&qBQtc)V@cGWh-S zek+-^i~t*u1G5^Fk-2W@ghR23QJX9@XTUEt+UG9>Tg5yL?JL`k_dEXtQ;+cLw*+$-!(1@TcBZII45+bx7@3hPM}^Ug=B= z9c#_GWS{SJM}W&Q%+$A);jaBU3uilnk!-utGS!zoub+|6DUOfO>Rt^25IlykCNjUt zgGG6HS75))#2qCY>e@&p7b3}YxqZXt^9+>tEAQ2vy}$;R;y7Hv6uHcuUa2sW7jNaT zHv$n{zvDy`jny@gxi8Hvu19jKs454tHS5m^+w&23@%5|s z_Ut}q6Ebkz!8>Yj!}a&!cnb-v$FhE->(G!Nrt`2$Kh2?J78Z=Zw&asby@u_Vvl#`|GeXC@`h0(khmPDF#wMVY(E2Z+FvQ=?>u zz?nJA8zh!zKv!WThH`KLKN;H6cW_rk0RoJXzlex45t8$|(YF}_yM||npB5$@nlVSs z(^~FR2!+X`*5ZWq24kdYphAUG66_#UsL*=b*43am#d;Cv&DiuG+p#`{7UbLrf;JcA zFdjpGEXRhnwiu4KFPwy+R9gn zsEqmw_BJT?5;?PwNa!&+rL5CHc8`ARu|v=!EeLb^h^*dW?iy&C++~y*YJek1ytYwb zU(^LjnK>QLWv!A0*fUc4t;cbwzS0fWuv>MP6{qAmAc(~5 zkpBed$egT5E~_=>Y3@=G{{kDtyR4$CSF-V?N8-5=X~3AXWTrDGnrZ_Zmv@OfRo%nJ z{JcjW|2{O?$F0Bc-4 z5~1@v=;GamR4Cq73-%IwEYU9e4`8z{I5QF_fIP|J*tg4JaAE|WZg&X^K$39y#11_r zw3HxMW6!EA>3(*8_3hnOZQ672u&uz^9Zx4SW=*_-MB~3VF9T%o4|zE{jf)S146ZM9 zaN}BaU_FXO219iV*{!+-<`tf>5a6wS71a-z4mG)1;}RvRQBQ@Glv_kgCqkc&KWS^P zDUyFHTzarbTm#gLop0++9J5AET@|8PL$O6qMc}hb7W_eXspwUogKnh{xR@z4Z%AdlYu>AH zYq~eY_h{YPQQc;>Fb2B=c4K{{h7cP!uQm&Y`)I5oR@PlSj;AqZp5OL7m518q=9l>1RkHt&y*H1CdT-qS ztszCS7K0FqvQ_r2NJ@t6Su>=CWLI{QeUOw2gBDq`mOV>hkWiK^31bN%W6SRMde01X zPR{Av_x-ugeSbfn-+$+Evdr6zalNnCbv>`CU49~bW{Sa_DH?1Au-eLj;HmpigHG*a z&Xj+Sfe(NOQ{myk%Au8><(@P9Mg#3T?-tM&Jv3(6&47akH>wNe^@|}DXTwyTLsLaY zakma$dTN6Tp^3p@`-Cl~o%}b#c`{1W*lqB{D#Vje@C+QOXi?Ohch8^U;iaPszBXV@4heV?aX?Rnx3qyZx#ax~U(G!ro~hix*zo1xNYs7gAvAIr#zX2zx%!_O|e>#vDjYv z#q_*kiaSUgV=uM}DWjn^jdY+Nqf0MH=k>3`+@wqrZoNh3zJD>k2(4+XY`J86-z#|W zF_2Q?G%73iTk@lAy9-F?tG~sW?l#rb{dU^=e75WJJatDsIZHcFKIon3UE0=kZ7 zt5lSi=Bb<&ZkImixGi-#L~V3CWFy1>h(SZ~38H>g>DB=bN3`NneojYK zQrm%~BRQSWupAuBX;2KIxCAbA)Wrw+dhqMhS)*62oxq%id6H9UFJVq2z8)Jd=Oooa zo0qsor=Ib=EE-vVaH(~qG4P1g%MN|rO2qAvP*J*Bhot0V;l@=bY50OiEh4kutLWMn zJ5$;3j3UV!yb;UycufDiFy_{eA%)NPaM5N#IdFH_yMX%O?bg#I#ar!*>!qSg?9j$9bCQNh%%Gx0G2k}y;DZ|!9Nl1=So%k8Vv zCv}0HOeFy9F$z z#jgo_XdNmAz1xFH4aOdIB$~5y_%oeHqYrbZdaVHoy9Uk;~f z>LK^|ySl;u7g!Vfjd8d}v8uYSIQa$MLDU2PxFA1a;@wNbkcF0p;uV3iWty}R zVOpZPzShcgh_BF%*q59r{#?1LC)BOG(?2aRd3DdH^Fjc3jZ-hcOtRa@x+C7JPs)8Vy#C_lLqkfXCpd3;520oEq*^SMgM@mkTGBO34tQlc z6KAv_>S<6Fx#yin+FjC5qLxzF+;6gZ9&H8Kc-(d7o|gsR2Z9Q3Vl3Y%0mia1r5fH? zZe6opzlih^a1ki34O`i6!&a_6N|Zh@d77MQYnHsh`kqF0dJ6RMq)`{4w%vj6ZM*SZ zY5qh|+iuWnb@`p~Uc$?y6zh-8#3; zm=ZvR^~?F=j9gB26J|cZu=34W1b_r!CjM{44W7aQxD@DP{OHCbL zt3Rb18<@%KYBJ7GwQ&bs~(_sls{p+`yH#cO zxW8ha*`@bVH=#ZDfU^}GY${Jq+w}Ux=o9q@(=(AWYDtduv-HUhh-I|pzv*z5Z}z;; z47WRSw;^whOvU{=Mnd-7G`}?Bx^h`VY^I!!O1a^R)K(@%X^(>Y-6DtF>T}zc#mrv$ z3+$ycBCh7yrl*KAkrf~lxk*Pa#AU!vv|O(As!rK7d4j|lt8WL0=CHvu0|=B(z@m@b z1^G$2=^*=5((6v?=k6}`TjV!$XtKHodpu^A>#eda6HP@tLMV0A0eJvxDKp?z?JVA#)9X?A8%KH#s^5_xOU$O|nT|F&7jI7XxNJ^Sj-eHUSgq&W@ks z;q&BkQOMG8hR9ygdw`2v*sN&BuI*e1tz2%-x~d%E&d>D``3SM| z__fpNQ0Gp_VBu&-dIa5QZzZMF)6Dl3<|^j$X7Y;+PD+yFr#@12zdN{fXRstlERI?w zGk0Nkp*huea{ufhXS7iW^WNY~nBRrKQ-%2~i{|PgOEf?RIS9%ikAqncR%wHS7X>eS zVO%Z8b5||@z+;NG$?M7v7;mi5gi`1 zZNF&(MJXwdSRU4aY{}e*4ETz~53+}=Jdl`0jF(p#i}zl%!peAfkJmDcT4 zsps;HT7|CmBL!zUdZ8hWrkg9_Km>nMWXi{hV4*`d4{c$Yj?#~G~hK$EKCk5gbaHa#vYz`Ew?^eh%OdC-J+Hx)p*7M_nGIb~NKK;b#$a+!`z# ze1XS=INh-_iKUBZW>2TDr%6?yy@4r_`}-ssHyJ2!G5q;tCerdI`@<_Z6`N-&sg)&~xv_JYb2ryFwVmnar) zn}WlnnOMDrwlL{(*Y`Bmx|?a=GNcLyUBi18K!tf3<`T1%vtUcPI?EX{fm9s}zVydS zc54zBx`I*V#g-8b`SzQuDiT!9plT;tJf@c{&)qpZa~@$p7q0n4tWK$=F({r!)|pX2 zGFBrs>ST56A}&Hfki9IHg?c#Ii{=s95WW8c0Sf3T{;vs85VkX1N>pT~Pd;XUxc?hQ zA5#@|_JfJ!E#_2H1kv@Uxgp9n6h-Z|_J9t)+@&&^YcMzSLRR!;2QMbZQ zJB-*ikzjiXjwb3#UG93u{a4cy%qxFWdZOg4 zsk01MJ*h9Y*);?6GMFQ_(lzO8r`6aHG^yF!h=0n4^=ABPb9nww2X6E6rX4 zXG?MOWJMrx4$cZv*~e9^#G3DR#J8Q^F}|l~223iuH;d>L51O@)cJ7QA*DL%`nja&dt}68SS7+Dp4bLj5j636eC2cS4Yutd*a9 z8EuQ5)(h0r2oph{7+d7Dc&{3S$*Q-32IDTCS?}1b)QPLvhE3-Kix)3d!4~cx9D9E^ z{9?MwQ^fj48{BD{d$U}Ur?xxe_8F8UC(9p^upmLa>`G~kWsd3 zIaHs}ZWl6v>&iEQ_k<&Y#*}amU}zlrEK(qDBOr0RTKUcJaQD}f(U zzT}2>#FXB8EzYRVU%q-Nn`oj9e>K~2k82Zc+Z^NuOkfhc30$a!-^$DH{lmC~&qiEg zis1j2dz{37mN*7{7K70{^iNrd2nofXvl8)WdVI4Fc*f`J(M?{0Q1Tqy!%**-rkk|c zvc8P54LH0;TbS6E@9jW+5GgFi56CURe*NOWzf5px8wXa`f?@4~P8qio5@*=Wlx)O6JbCbLe+ zvCw-JOP9(ff}-6tMr}!TRi>&VR=R7Io^5s{sDI|hTkbLBNQY<2%kJeRZJ1>L2X$Bp zJ&?B!ki6}ARX8lpOYBeK&+S{;YU8q#dWFwj5oLGyGI?-K2bc34G@UHpvxPk{2%1jr zdt@jQ{aOx5_vx5i|2~hu9Fm~;PlqJr9>bmfUx-MgncN&AB3heKRZ`Ucx5XvmTLQAV zWr(X9S&DT`EbO){-5%)_P?=HzhzVYj<KU9rf3AL0=7Rg)*>W_ZW2%Vry^?-3v zkN2Kc{f{jALAH4D9XL+b$?Ld+X3x{32m2XP4Z(SFGlXn$XY=y#lu%A8`1|-S?6qcD z`AKKY1EkxGP9w85z)Lu><+Ojn8$kdsA*W;K$^0evg~)?SrM-)Xg?9Q=-FTGX?hGM> z5x%~4%)>rkiByAamf0#w_2-E|p0xbD;FD~Q$$d=Ym)xHVy~|i6GZ=+&ZCRbNA)l0`+04_3DUi7aCGHjJ*_q z?FmAY+NEDd2p|@-5OFBCZth&9&Iqv>AV6FCOk=Bh`*Ir zUOB`2;vs9mL(kKry>qMfo`Xr+K#G*W-eoYh-S$*`$0 zjb8KM7iw?#+4OVae7;aP#Au{7yS{1tg153+&6k1mAQ5k4(6pmpSJ$A^qnx)46Ajn9Ng0KV>iJ5|M3&}cV46wT=g`R>Z zd2A+Syq$(En}C<-(kbI=M@#6sNo~ z5e9=7*c?h+&wRoEQm=D^#{oCkpy6WuWv|Kjx#u3OWt27oabH1&R_-E5f1Swz!5C*? zZt8+#tlhcNb2AV(SQ_^`Ezm}8eT-xH0f>p0=j~tPih?3gY&~M0PEJ|o7(=J}g6&e6 zBqhZa%e5I0nJst*41RDMdtEv9n2R&A&~NQoNp&m{mA6?qXA>?f5=DiId~|}vJwqK@ zO%9@vjCBWxdvjnlIfFlO`^IW=Hb-Z?vgV+|SjfafV^}xd!1 zbljyS+5P5|Q1FpANW&WoM}-@9f73D1w!0a{0-rHn3hf5LAXkolg(cIf^v?U0`g-yw zKA_s!EmqR3RkSmQut<=JO8BA&c^8?Z??6aI%;VnpMGx|K>{F*3O(Pq`VOozbKbWO1 zEm@7ZJYac8VR#DljcM)8%j4cff7}C{}TA z0sd~CJNc6bJnyejWCS|(c(NeuF+AHOZ=}7pJvTLeLz2cTc;;r%eDbx8$z%se0b8Eg zGV@t%=wp~8Ivm>~_E(IOs=C)qMhbwr9#RNUAVW%1GWKK=QF zQjWyF-y-@S?T&JW7;3F)3v|(hy=&Vw!DsZ8V3}#nW$;U)|S3~^^!v*MxK5S zzEiV*xe|@%E4gL;6`|^A&^f~Wm~4|#uwA)|MrIaWso(Ai@^&nzFnYErr;fv-{D}Z} zf|XK`$jmE;vfyOTdaC!Sl?s?nR>e&xGr^(-%ZT?Z%ikKA3vE5>?P$N8JcSPs3(OEo zfTjNK&KC8=;DTQHu6?NRI?>3)*|7%vUTvhnYRA!so$-m(#LKs-r~zHAKmXt^RLh52 z91y~tJH8|4R7Lc4wV3{A7jnrd%Sp&XXspqXq*qG<>1|6e;(LL@zp`h?$N-cdR!1k# zjI8qGHG3EofVjDeD8%0m0jU}8Z7b$V2tFVJp^$D?Z!i4DdCtR~PqR8+gBFxmf>l>zK3~H~z+OlOb?`}c zW(JEbxZJstj+*(hKYrqvRT=A&cs~f~Z2LHSk|QR7InR&Jwl*YyshVsB1QWh&4aKc$ zJQqUs0*Okw6~C$xQ`2`Y(p{K$)!D_p_)L%X#II%XgONU_AW)_pE>&zxoE5HjiIZa~9h{5KC@ul=1RO`6Kx{Am$N}FUw;I^l zt2HL@a*|lcb17OA#tj1?VJJolK*FG5W@i}3pV>yiYrmhA0|VUi7AQJMz+(ohs!C$G}V`Oep7UL z9&*%=YrE7+@M6bEm9u-bNMKaiiJyZIX|p~lY}Lp~G6s3XnC>+I6J9*_Z_5uC9r|y` z4})_zEqs1BaXWgSI#X&1Zb%u*(Z17f)<1Ve&D?o6Lcu|OWq5OKXqgNCRO&4zjkhD0 zT*gLReNG;cZaDcN?+dglH^ch$<;B%~qjw2e>C0z&bW5H3X?j_ETs$wjD;so+XG4{{ zPEfg90F}Eq@b+|2C38P;fW0|2T~&Ys{K`iuWh*h{0G}r~z+{4ETZ09H5j-XxX^xfV z%Xx@D0f9vqX!&d6&vz?56CbHpSPRiRZ2j__oo%m7IO}g;sx1OUcG+iED;%BS6SE zJ;ez_z+D?3SqQPnX|>ZW%F`)}$Q(UY4{_HPm^I5p!5z@<0OK;}FI{!w<0y79s7>d~ zHlz1*o9?==6e3hoL02uZ9m>p-FXbpTsS3&tk|RAukK)l~7w%FY}Z z{uk&%R%)1RW+dw@J%Xf?R`qM7alh29*+vxz?XY((jnVNm!{K^uz4DnB%2JZ?S)y_& znNfzsOMh$j;qgC^eaQX0vJZT-PWBykA;PAV)du~gbs_s3HtKXB_VX3Nc3~|oM#nIU z<;y6=$Rd50U%FTHc;INO%%^wKSSrUATrosPwi6Tzp9tm3KFj3nJXSigAn<CSgnZXwibe8l>M`xb~6O z(rT`Lv$KYofzzY0P845;#j0bsC{LyE^xy&wr%QYVJ65aCw36K zmG~X4QaUJCPa*WtO}d!0iU2rp=UcFTS8@xahV?aicaa)x1N!;u7jZdL656#so5|aF zof^8JKGl(QZJS#8wX*Z-hlv9A66ao|k1e`NwP0+*|p_Grmfc94#7{5czZKoD>c zz0Tll;YA^W&>oVmwF()c+e`)9?#S^!{zCQ`Gt>M<1}5Q?d>^`#TnNyOQjW$MlPwv` z2oiQ%n+FFJh?t;lIbJOG^U2s6+_oI<2L`^O$B#40OCUE;H7tJz3c>&)-?%IB)EUSY zCc!u5>dQdMQiz0_W_2L2@yn!f0xtbhkL!BkUIc%odI{E!zvqFWqv=1+151x!Tz4`X zFEK{BiZ@PI+DTn<*qIBre-8L-Q(pzU_2oxC=*V;jGCG=3zk0NMy+7xU>(7lMZM6!yW5fEz#`&${ zMYb&ICss?3=bWeT_%)G2fM4_U$SI8@UhO^FsWldwxS-ykLpn{TQKJ#a#ZLwj!I+?a z`qG5P0;xO_O58MmFWkRMITcU6%8>Qpr*iO`|TA3o|fWqx+z0V~u!J@&u8F$R=Lzpvf zD_xsVQB2Q}`&!fg$j8IIFV*uiwE`WEIXu=M%~6AvOQV@3^=R_!^%$Zb)TWpj)qj2P z8@kpZSw88=Jj2pSA@}l-9#2bc^a*rePBf?%Nj>$d(xx%{$jgUYRSuBA_KAGONQ6+= zT@5Xo+a-;q=_Lj6**WYDHhHx26-I=#NFw&le7(8$5~;C)+v1ZIt*%{hU(J$S(0mCi z!RUR2+BxBkGQb+{=IV4UwbTiU!!~=0+_{Io2WVq(tq4xF^WLOF z=inf}5Q>)BN^L}@8f^Z0{DeC1<=Y>~>f58OZbd~4-F~~3JrU`u9K5(6CK${!M>_Wq zuBmdnxwO)w2{xW|HE|dMPIx+B&xWDwwqYzpZ^0g3!e``~dcZF*0I(tU2bAuN2e^qD zCq}e^QGz_q62=(+UMiV2g(UY(a1hq6iJLAoLBTTbgpx3t&$}q)%~>dZygP`w{wxC(_JR@R2tN zhnk5oeQu|nXMmHm&R;N1GM**uX`pa>8tbW8SSKnt#Ylzb z6J(Fh@Bk>X%hto$mV$6|>)rGU4od%m0H$jpD@k3w1;stieGn2&vBlNMCINS%4B}2q zJZP^s$6m0B8_sYaMHUxw2q~BZnmq13!o#SD!P3xavinm8=`k{831ss10T1tD_n-^0vLc@G9PPy#Qd?(A9*KWq8)Z(9Sc z72z#eZzM8e>XcoL`bZa*Oy_Y3wz&>0H&mblxIL&q7di+EbYqv)yaiSM*#aFvu#Fnx zVi1rs+ymhx3e$1UaA~vp;RT9ryQbA=!2W;g6!H`#V*S)zK1W@nkmC~Keoz1qY%#9w z0VFIH&SQ~a21oHE*F^+>&y1)k+%)5KF7Kwn4IeAIL_FLL$Jjw zEJ!wI(-+@gyU&d)&jAG6FUoVWQQHeWB!pl?P|LP-RK?_x8WVo4E8IGp=XBP% zo)xDcyrXH-S5ZZ7i<@;Lgz`Sy)0z6^CsJ?*1mj*LF@n+#AU*CUJlS_hLY+W7sXX8hUIlFW*y4_W6(Z)*4P>68%LY<@??YobzP~nHR3+ zzF;a>0T2A*6dqC^Zf7;Mh~gAJT96st%8AX+DU3IpnD@1eTdQ$k(soQqoH+^O;L zfgbgj9fQw2Aw}%l1u5c=ej}#)nPlW!$$5RrK7hCcoDwxj?oq9i$;f}iDx|w3s_O=* z=CQhR^776VU~Yi4yEe@dc;BU62u=CeGI7wVe?@KSq6vs-7)e194J#7Cd(#36Lpz$@ zewmH=M+VzCt)u1m$b&h!jg@1mU(hEQ${Ub~lA+E709{HwxK~;~_xwtZ?08@6VDw@e zu6n&xrGK8?YR-9DDCuxgCr!5j=*P*TCaH%@>%cV(E)vpT)EO_+PKkeojH_K~w=|KvUZTl$lj#F}ym(SqX4C~5v41InGjE}nr? z{K6-mrka6yIoU$pQU!{+K7Zeeqsa-B4+D>57|Tzp2nJ_wSKvrGF#K63l>hE5c{$&K z(JVCm@nq8=&kP`x&JT->;<+K@NU>!AB!10Oez3m)JlVX?+%l^d{7Q47phU>Gb~)(= zTqzE~rl3-s2x>th%q|QTF?i;mEyZy+Uq8m7`@+w?P6$b7a=jr9f@zq^T%J=~c(hjWsEQ>Njzx+TUj}S39w_Dh{>8IJe|H^IbMIO=QIa2>V9*-g z)CqoobAqq!+r$YzxK?yM%Etre1m86^`*lLX^cCnAts~PicVs5)Mj(A^KN?O2_UPYh zOzb(hywx@sB?O?2DftU(B^Rd4h0B~eA(5wmcYq^B`8RRLUm{%$c=E>i&E z8DuO>2tE7`t>y!ba1hXH5yzx0p*Nq3^&|lvuGWi(t9ft0)kb~~SKBWg`Jl#oJ?H>Y z#kMdp#Bff7osR{2R4&dC4)|^eS9*Lmgr7JQY~(-VtKntvcfJ~42K)Z_4UcamB*r%q z63szNCuw>vm?;u3bpt0*Mc28OaAi0s8)?*)pW1LgCWawvII`i21tC{*9ttG`Rn4?M z(LuC6(cu?y;85!LE-5=S{9%?iG||CSpfbP}*Bywb8H1d}TPP>trFN_T83LD+@OP!yL@v!#efAuyQM`xk{`$s6#+Zd|EwIhyv5i=4U-O)Ck9yHcI;~Hxo_{JJ# zG2(ij=_Nn_1C_Og`4?J3U&&T`Uws6!xG(?e!No9Dg+9f;Ku$ZSuDHshYgDF9Rz`2n z`f%Cj1;)urJ_3rlAh=`W*~MjEIAJPf`cNGOpl!Vr$4JCQi$!8>@L(gWxbNNbOl5(U^IfyTnAa zL)5=hDiHmL$3WL zZCv^X+Bn?N$>OYZkwc4SnRjRSUy;UTe(u#~^;G&1TqpK3P+U{7kcqmL z?w)9^n?UJw^%W_sMQ_B6jyszpi^C&WDk*ku?}XpP1!n&(%DW*xXKr%{fX5*;z(C#4 zW-*ue3+d?pYrwVrxQmv72AJJ@|Bf8-;GYTPzb{7&?qJo%d{fxY#U^a84zz)0J4`C) z3}hl8uN-hf#=`kDhK>*QA7VaKt#HR7+v5YrjxLv#H`W5t1kw0-7~r=QTfzBpGTa93 z+#4vn34R#Zdnbfjwx%2Kb_io8127>46!gz}ARM|m{?=u}S~pzEE@5A3YDBsT2m zA}3ol%^u?woStAQ;0E|(iDtO+T z&li%DPh?+$P;A8Xqua1If+_;VP;R2vgBi{F?@3M!{x>8ikTtl!hla%0hB2VXjEUFV zKdY|`b_v;p;#;6nEJ)Pu7J!!P>Muz*RpF_M93{!JHm0*eNB@8hQ=eBohLn}{qKh8K zcVdHQNq+=K)I0)BLJIV^P*dZV>A%*@e^+>duJDAFIKUDANAeRUy1&d%usQs{ke}G$ zz&g+ObS%E(yIjK6=05h3%(+qoLX*rabS4EZuFe!;DQpGr@eHs0h{o%o3q&qL3c}fF zv7HjvGC{br&Bx}Dl|?IGv{nV~1_TKBw79>5 zT)RRi9L=qVH<1^%j2eWCJTSWziaMj5s;sj2jjaOZTDV1#EaGqlA8yH`5hY*rr3@VD zWn|$W9LQs{BWS!g5za=~MjT2auD3r~4MIt*TWU`%Y<-+6flxi@K@%}4F!r5*YvO8MJ_m{;O_0(_K6TAW&tcV zKungHr{5!&`P#)s6!)Cb{TkSZ`#5m_2GsQrbYkhoy#IO0JoJN$3?wu4Vi5^~j-%R@ zZ2S!$(5~XXBuEM~QC<*kch%?N2n{N0h4tWGe<~6<={mImJ^Q_jJk;|DPd!VwweprP z5dOv>jhH_W8{&!Bso|<2!F9r@+nF!B$qPr7$kj~x#eW-V&k)}-HsD^nPh6!aJl)q!wnGUNCk0@zXeZ> z?aB-tWf@`7%$tJ9ytA1xb;O}v14@#S#hn>-3NHT^I`QfzbYj~l|3Nyj-4t^zQu8p5 zTPrpE6&wczinNGCF5NH=h4oSKdseqUo8k%)n^*m}rHikN{WqkG5&KLUkJ@ z29qvKm{r0@$#oYPG`l)VDLwE&JsedFoDl5?{J?tW&<Ddd z*~kN}R8cBO=XgfJc~DbEf5*A}Y4Q-h;d6HB!90$_BL=bhL;|q0mFDs}%B&tpz!FJ9 zK9y&h!Uv|D1ob9abP$JT9Udo>F7`(so^KQ|h*U@NrH69cM?M6evXCQS+_Bp=3PfKQ zOk)c}AerHpjPU@)Fvj7;hJ)u{z=q8Q-$;f5AK+7Sd|u`vbK)P6$IpXtXLNjg85noQ z^AoGw(LaoJ2qn$(0>Yd`snxR7nI7I!9du|{0{6j_3@xT}@Nkf!& zqt)jm>G__z%k@+dM3i%sB(fQ$h$P{Ale<)dZ&Z99<;fDDjc|>4T?>91X7U!;(cqn( z3O5&%8q@+jU+!K?95-Olp{Xn#mg{WALg*a6r_c$CHkuy~7KBBFXjkP&^@{`wEnZVP zXy0iA9m*!rxMA7q|tJz}&^Q4Zl<*T;?!yV#k zmGW-^JdF+#JTWNl)yk0rQKAWig=ai{0{U|Jgz@hnYIs%iyVUVA$2?#Y#<$`B(a0Z2 zsI>wBO_SCD!yQc;&~OJe819&Bn7C^90#|Vh?cheey@whA0SqPv*PFzA3jlNT@hq}2 zv;4I`XMl4ZVM*hBxcd>SRRiJdY7ngO8>+m&9;{fX=JE!?iu@Uf5|$MRMxM3j@EaE_ z&HcMtX@U95`>rG>oX;Get7xeNxr$S`Tt)2)K39=AN>~P|PB&;As+T7%z1LKw_<~5& zKu{)Y4cfL_2=zaHWDf+mU}mD1oTplve7J-PBW!QfhkAmCwhu$X-KG1o(L!X`XZW+p z+=CGASWvJWn915^i9}1?=6!^RC6*lj_MR7w+7sNc-SEb+UA|R16BA$_%BQR?Oslx8 zFcYRnVq~W}Vt>I^)8F8#g?w6nSave67e%frbI@P@)S7x08tTXzE_YUI=x_W^pBQFh z0&fJ6e|*hoAFgDFK!N}T?Zb5yT%Qa=$0`-TJ0@TzL|pp7ze6(}Co4ZY%}=P~p6em? ze>8*hJ!QP@PgBM&%~eZ0p3q9iwR68%>39n<;3%P*UHT6-JEhglYId^h-nB95;7%;@ z7F4s-1vR^~pkxOH8&tms8-B;0h+AH=fL%*7g%ofv*mg!-n3K5cKO~^&bJQn@vjXyr z>0jZ<6Rm(e@wUU>PRBI)+T_K*YZoLJ`wT80`z{4Ho5fD%k2P4;x=>+#29A&kukhYFS~$VdiUqh ze!)9`i7{MMi(?Eo{+=-m*qecuq#dn*{{80uN+{v4K!)$uSn&*@Zu$%O4jiNFbLN3X z3D;dV2UB)p*Kpe${-I!-<2ZhsL;9y}jtGtVAGbN|Zn6BVe(hecRo}oh>(q2XdysbV zG*0^h;?~A8hu}oD`khm|-~4OK9Jke-A-?eZZBsJ>YJzlA)WquLbSu&!6gTf7MRRUV z5H1M1Igse?d`1VrCb<0Yu!-7GJZyrK7!R8$!oeoK{RP;BkrbFB!I{LJS!;GV8dcIY z7+stI{Bg+c{wXMGx|vP7?*T|#7QSZ&KIz9Y1RPDRoznqzt&Gbi#YZ3YD2$(;h8wg- zt`p?`3@yAG0%{I^!>troj^*s&VfeZXP!nbm8afpaYQp{*9yLMk=dZ3vcbqP)QotLa zCKwRws0kJVYN7?8CPIIKny6~Er(^e;4=!!C`tRbZUHLa~)xZuEdEre};x7B64N+&D zLvuc+Eke_D|Esxbg^ZK*|IYNpCS0|5ac**hzfMnd{axt^lLL2Q;gr+fX3K}-(_Aw# z6zlllYl#3K%x*gF#Tatw@=j@EW6mE_#Gq!fS&G<+9+x5(Qr;{@Y^tXsnw6ObJIgTv zp%Z^mq5C*@3PSfT=gqtYiyCD|H?7a@12c1A?u%!w{2Ok$j!3Vv$W}g7L~`@sa2c`H zeMr1sfu!x}DAC`pZj_P#L)!M^mepMX#V+|cHH?F8;l}1%I=y8-1tpntF>?gpV4gS^ z-(A~(Nm3a5SI}y=(+0~c<#8UaZ3S40+XukG!1^`$4LJDLX<+>xb0d(_d{V}u?dfqO zg_wN8hMTbBP_)PILKAy&zVCWyLc_`EfcPx_A>m^TJ!-?4gtOjH1)12}*S>x2S#z&G z%Kach58#IBzXh=^-|(2%Txr}=aF#}G84qQXhM;VL)S=dfvvN^Y7P0a#UNsh-z&$L} z+P(){1sTlB3op!0&)6u@W z^x;#~kofSF`A#dSRJSbhi&C8};KDiVD)bt(ANz(CyRq@EZu z26hG{dy;q-H5vKJwBW^_+%B}i=kbQp^aS+ zI>N3;T|s8@$2e;lcOESMA0({-`D=zTyFC2vLzNY zpv@-Km4O5DrU0FBPOFvFQBE|akgPZksUaNyob&+aHI*LmwoGXP?D5^QpO!_fi;E!9$xb26}W}w?0Wm>xP@jkkJkoX z_x#@QY;oK)ddeuI&eRRs&UWZgS}z{lg&?&gopE~ z{yKO#JKV(*L;NlgC*|n7nyvMKq2}pb)M3_1#=yuuD9CF+Nk7-8@~w;ojt7~Q#Cd{G z+H`x4iD_ed?h4%`;abEsz_oOcMOplmA5QZpht@PkacdfDRa$sN21tW+iT?TKoIg2X za}H~GH+20+`+aY&Bu(c95wU)P**l-{7)LaU*$xw?xBTQ081FkE24yOU+@Lrc2 zx!3HTtnhfnW2_tEY}Tldi!+sW*Iy0MIiqK+%UV8NSv@`ak*;BWwsz4On$-B$nZtxJ z=;rTZ(7(eD|8 zN$0!@yE6OI{41RmFg28<64#wi)Q%Q791-rJ3n-+E2`lAG^?Y?HG{ddgH;pI4`J&am zlx!yV%|)Bcdo!1<)cw3McUt{6ye4JaBE!FBU+&xQy<1JUaOMimj}nuH&_40mkjh=JNS(L`EyycuNYFOQq3?10_%QQ& zsTnJ|RBC@jm5EhuNEP=Br&Q_bl;G)NeblqC4j$h9im$kcDgWn5!?y_L@6}k0MPeOw zL{&bXxf^ykjB%)%=X|ormP4Og!Z#l#K63=j4mdm(0?Wh&Ug&rv^HYml2sBXa*=O6L zTISRFU#Sv8K*iPI|-2qkTE)ptqN6Sf`Borh`9LGez1Qj~x^$J~U5TQcX1}b#GPLgq_?>?d%0diYrl2kvRR`_#J;oNo&M*;x(ddo7ZSS*fsr zbWC;bpj_Cg|NV)FS*wfN zg;PKEUn3iX*EGQlhgqMG+l+%o_|wvgJDpT?FJf9hUec0x{I)qI}c?c>)N`s*81 zVU7@Th$>tQQH4pAIwJ8{hM}(cEiwZLr97+glVxxC$@0p%1F%s8$m_N38FtfO|$@|GKuYbTy`i4~DkuBom-!QMA`FoPG; zU3d90K)(5tuVwnJMZ_Oa$XO$rLt^TYP8#V&%(EZ-X-CpCFdJ}ADY5^v(KH2z8-z8^sQ;e6-wZki1 z!tY))-lxovK}-dt3B`QGR0#-a#xH4_rKPn3TngeMUt!sKO^I5Mp52a{kQ}j+$3eB{#z=VDUOP^ko;RJTHNvj^$W=$xRpZZEf(XLJ@dWV|ytZQ$6J^ z_NtJs$T785{!FU4Y=OokMI0G80g!?B_~FRFHMf2u0|!P?{;&#{P}F(%ho&2q$PuYt zRw%Q3(>AT(4U&8L5hPxBqJ9vsyw2h0n3{KM{cE{}raMs@&)>}l;-=E1J@*N8;Ai2U zp*M{$T&ZW(Z@g0)p?@N9b&Ncyo=oNa89C{D0>x9=-ro51f-+gxyri#3wlFDJ4fB4h zKZcO+)sjik?tkbJjA+NN%K- zY|b@l6q*HzHi5m_CVRY_#Ri+(nTr6cm3uGDi7|vHH?nmI*6o^^ZCT&-RABV( zEk-wncvmM*UeP(rpwuX)9D#65weR-gI3ax*McNP-oytT%<)Er4@}l>N%17q74WGaJ z3~o>Mjs`CF2R+$z26>Pc%pkMEZ>xBl3@6dLh8JL>Pr}jw*9A3+QGIqflPw6|nu#WX z=HRHn92_F1>Us6;If}0r;az$wAx)d#g@R!ikzxeAkygpFxIg_umui`LDdGp{1BF|t zP)$XqHRcp}kxNskt$dH^`ibt^jDa>J2|7sFGOHmW3aVg>P)<4oF*2y$0&T@W$8!iU z&{6;c?G=$^EQ1tb9^*pN#ymzDZXUz%7xNf0l2@(!L*{brf`r+r78C7ss*Ii3>~{7C zm4YA|EA(#GFL4?0e>DuF5bc9}KT;oLIyR?1nBw`rdp4y$G|3MiGaS}?xpl_z#j!77 z`KM@6H~SaUaDc>XJBTv$j$vcK+VUUm!F=xCbo}@M=3~rO5L6^H>Kn-*c?mMQ)9OD( zbPLYf$WefG3~G9;IJ!`TF~b|^%vDtkJoab)nF#D3G2v?bdr{>%Za4AxGsLP_2~lAL z;QJQ5rWnK0uBxKviTj7nZ<;U*1 zy1fbw!VeN78hQCrD@vMT#lrsQj;iNW;7j3yAR`*ypZ>mxIfKRZfAX;jo zUTIzPj#z&@Nbq+vc`rvj)nr_HqB=&*^-du%6NA3~OSnK@a_Dk@NX*lVz;4TTFmr35MayLdKEh_g7b{`h){ zpso-*I%yrTO{T|>c5f`8bpD|!TX^@N93Q$EU>tU$e}QrM6k}XM)IkJc92UQK(z1o! zU)`;JO(nvFJr}CdRO;>vFk{>jcD>NZ@irO2`z@*LnNYt%?*XW0C_pvC%zB5&@+h%hR#BA9T=rKS*Q^wTaX*7Fu7qcBZnoFYVce<(@(}Xjipn*hpASFtbMaMf zQs>Ax@3JjS@^wk@y){yLF@|Q!3 zKa1p2v4pn!iE-u;iIS?joOFJyE|(<&hx+ACq)~sK z;0LjO<9}lPmiG-1t#{!tRM9pqlmThZnMoRS)wxKSA%lFb2t$)rxM z3{#fenaQs!WgZ!}u5N<~>Q)t0r%5(dw-f49L>_*nqw0K-L8X-8%$?Kn+?%+ihvd`9`5fcvZG*u zcc$>JC2Zo)it=J=+Ib#CSn4svB(yV!2$uugZ^qU!5Kicg6XIXRjvn`q=bwxR&vgrJ zUg8>^`snkrXk`7trPh(gz#~#GJM?uc5w}M|Md@Z8l9G>w$NAF3ou+E_N3c2}yPASBNLa^ThOy=vb-`i;zwoIdJ{+vl&spqcM zo)#fT7TE@KN|j)m;CaFWS<(=NzUZgBAEuxLWMNGlnZp%cCW`%3!rXPr+C5uqjxl>w zxm9vxYLCX~7VcbHFQT!fdCH#u|HwP@c&hfr{hNmrnaNZLA=;FANRf0zDmEuW*+iv5 z=FCH7+(=H!m6ukYWHz4oy7v!3-l z?+0Qv3|cEz^9+bj@0ot8>a6S9T-a~s_a_79x6g+(@wi^$-6q-slN#q(2gq{nGE5#G z>f<Z!7{h4=3(uvy z<1T&2^oi_I0ifF#SE~4S1+RH%f zkXGb<`w`>9va07y>(U|2)_j{2zYhAD1^5aHS#(;AD+WtBXOQ4XJ_Yx_`a#$*CDmF)(G zs$o+qp~-?!8R1D|`(84Nk!^S_RiPn@5rT3a$j>^mkwMFEtN-n*?0j~pgx0!nfK-?1 zF+BUG9tdXN=pP&hXi4{}e`O+vl|` zzSL92*QQ_F7qmLQ(b3cv1Q5k^bW3K`%iEMsfTcI`8;i%}3&Y>QI0h4%jwA!aVy|I? zJUt2Ui;s|Y->ipHzANX95NX7)vskkYDcO^~pG}_Z3J6v8>?|S4m^rNV?B#xTGTT?h zVCiB)O^7aNWl;qBMbupA7sOw8Q#AD|U|HkiPGo@B6g(ndRYf?M8;M+6bf5T#7-oeu ztAT`>BPF!?W%8oh{azzXTFrJGN?OWQ|>U2P4u|qR9iMCC;|1*#xDG-hxQeI zY+wZ0+r#;kqVxD41xag@Z_Tu{m7h;!&;}$iE<7ZE z7Xj4w%{uaTsEaQysf_xo`DNGbRtwF^x17j4FKrvz;fSkt6Yfdzo~0475K(7jAp=l` zvC=UZW5#pBJJCKzBu<%D2gaB&%dwHjxnNL7yxj*CKcR)^lM9nu0or#4pnVHe%bK|5 z*FpR820GAAQ3PE}&8^5tUxP8*-CkaBC90*^@3$acK;F8YU&~CPgW{=Iu3g?uzLnCd&Uep&Iz3L z)y>S9ETJx#8A5+YF%v$iWFTA*9&Svtdi1|%?cygD{J*<)k+Mbt)6Xex!yPC)-hP}u zA;V8NVTRM)q|BC${fRDINdqT3b=>M~ zLkrKkTdkK&u$$O8&~z;?Hfl!Q)5E6}vyZ=ABtF(H(quMjG+~_bN{8a!S`3$}<`YS_ zqkF+P?i0=+yFqHVKw_f;tvC&s1nH9+Etx!DM;hzK$RceVp^E-T z$%PPwKG`F#bqfNIXr1*Jx5L?lbTf;il8`D|fAFoI$H`6=oRv1eJOu1rQJ+!*4?nPX z8JRLf#UXpQ1hRMeLrY409wivwYdp|2NNW z^DW5bHa0|&7-7L-uPgt5mCIG7RA_ik<8IhMfB8d3is|Lx(ONqrIG5p`6nl1@VI97& z@C3b^y6FL#nu>ImU1MPGZ5KTEHVw_awSu`f!%qDmF!xqYx_0jE&R@^H9lNwISx1yp z%pH)+!uA6J%&zmsj7g06Hz zAsB-f)p{_7%87a-Yu;^Q??qUkg$IWDtkPO7DzNp2GWWi^vh|iD`U1S+7>4hgi0Btd>ELH5X zH92R0kb*SNoWuFS>p528`tqCS6X&hb_mB#)OVv@Q~z zi!Jo8uq1Gwa$^n-!kuBo>l=3n;+Wk(s$gWHQyiY~a52MN`}|?^#J5hhQ^GmaM$4it zj18$S&+j>PGWQ~k=hQ18QTR^V?6m9e3~EoWyVXq`zCUpof4r~x^rDaC8x*hV5QhDh z$&zj2Z!b;SNUG}^=pQp^F823ZmQ~1B94FAXXNEe6`v&Ce?Ew_78EN3KEK3M5aa#h=M?z5eVvFIOE~OXKDtoFgvU^;WEz6tr1jV*OGUM>R z^kxXjFcJNVHM2oq8&kQ=w1Q;#-tV3Dlp}-yBm>{pC6=FiYthS~_(QzCeIDw}!De6H zra!xDy-dAyMl2tX6xUGb&y@bNsvwHcf#n8a1p^RPfRVpwfc)(xUqKGY$LZgOS22X9 zogczt_$n-hMaCR`fEeyrK^Z{X3*^jKv>)1f+UWGI4!?P5<7mO~+j&4t7}OpW&SK`g zM8rK95sVNfLoFnSX%IQQ>zf>Ac3Y9dBgDUvjRSv!Y~8-v2^yfFg_zwMubcK}EK&Pu zPkOJw54KdLc=+cQzsb=bkv0-1n>i-7kQM}f+JM>3ZNmF1^<+95-^mA|#yb&%_5+xo z*ng5K^hZJ&z^zRXn`(y?+{4%Y?=<2fPo8uvJB;$x0$B01>eeRJNCH=Y&0W3oRn@dA z9%rvoZtT6_%?0Xhg>Ura;TOz~8$7IyZV_JP_621&IZ!xvRKhSS1|P3#d&&#R=H6vq z$lctb;yyOJHG=Xr5r5Gw2ZlR#eUrlw>0qrKwqrN-TG$MTzCG#?(Kr1lBAX!s2Qi=m z;m6kVf7iZ~mKgrF93FWX^i^xYeh95SUZPaRjPHB&PODO-yv9R6ro1TI9G5^q0tA=}O8yPoP>Vj2wNjhUH0Np zSH;=q$BG>PSujI@G5|B&FoR|Aeicm0$jTr53oyf;$7Y(&sb-q5_^p!|(AkRDPKUaD zxZ_EsegDz}K_9XFDC5tfG>`(`a1c_!FZxACfdZylRlu4=1zhu|3b^!_3b-PHXkPx0(7m^=CXUvVmjbs`8n=+CB2(UOZ3M zBi0#iZ)3LhFipNmIWO_)T$A%h(d6|L)1Y$0gGOXy~pYqzdV(+<+In!7da@>oq*gIwZU6) z`}T81tm&ue_-E>&8l0YS7e{S|Cf|a~MFE?_+r7emC{h3_GxIW&df;4}2h43{9kYyU z4L>ZEj#V^UK}grw5ydM>Drbs1ZI5QzCQmv7S!ggP+G6t@!_bl%U<8?E8ZA0=SEI0* zTm+M$GamM{N%mQ=C`?))BSv$1*N^6!VU)RcEpwyp1}vpf(3Yw1A3vg^m<)}*g%ii# zEO5x!TNrWdtqrn(gIxEhG~cpDyZeYc!0W&27av?--Fmn_ox~rvTjAl{3YNjma+zRp zH_$1p>@l3or3={>LW)}uWJ}5<-+k*}N#UzxuP?0^eHU6abtdd*_nL6J|h z+bZrAZ@ru1L+bcts_XYzGM>ik>>H@)Vtx37`L_h10iG&T1Sdn{?w^wok47aLe_$tx zfBNV(uP#Td$M(5ANC@0r*|uYqdp}x4?(VCCvjPT9?(f*qnR}b&-seF1hEJIJLAeNs z+G~nXdvR`n+Kb!cxc86W{@Hv(sP+ImqWJ7-=NzoS^?9LM_$HCeFSB|-FU=jvwvA2#_x=$7|(5!>D0P- z#`E@9vNO~C@gjAcmi+xa>blo?6)A-S`z^vVYc)Y9?adzT4ZYIH%(2MZmx%IpZZ8vl zv!Z=b=??qsw4hBt0~e-WkjPBeBawN>&h1I&X^?ZPm3*?g@^*f`mA8Rg$BT}!2b@MH1F8) zUuoXmi018vghJkbZrWll^8d`V#T$PHMF1WX${4Oj)lkRXfRP5XKg?QyWWyFH+3-5t zIl34m8&;cJ9ZkV`EZV&&Eu4FX{N0|!{p?$v8RT{5P~}3-d?RLIvD ze@A8D_gbYg?6Jkm@)29#~ZAPy5EbLc5$2;C%Pt(iz*wJ)fO`nEX5%4_l`%M~k`hwqmw zh&uPbYq=tjVS?~o5A9a@ezNZ)4=ph`4KJZe9nh1-1=n^%{>Jh zGj=X%=@ae3tE+iQjhwG9em0)uitsA&En!sa><5X5t4r{@@ttR68eKMwimtVH;B{k= zcnDxa-?&u!xL9SHXJlJEs^RNR;P*~+0>5_&Ou5Ab93C zoe1XiDY+)LmC^W&TITD9P1+a6IwM0wsuo2~Ht65xaba;;-E!k4Zn@R}*_K<}afLNo zZXCLUZ@=rIQ3T`rDdfOojhQAr-&uMcRsThU&FbdoC}{d}oVu7AXv0AQt-J>|s9W^3 zlezYUHvn`MOjEzenw|uN%^Yck_E+j7Slzwztf9y5Z@HxntRbQ&VAd2jJ=#Bh$bA5U zxhE}}i%W+}yXMbozEF^Q%+n^{|Hy3b_shmxZ&Qm#vVg={U1WlV# z?MuzsTSz9iHT!s&#`*&uD~VgJ`6gE-Mp)Y)%D`G)TL~>6?~r@FOh374jw7B2I4e8k zOXSqJf*E0}x4?fW+j%Qwaf7h}Xx6wg1k4&sSO{qbo zeAna2rp3@pmme%XwzqI>%FyvV@U*7y9WINX_nx-Z&45So%*s4h23cZAQX=-^4)M7h zg6Antw##kn(b}Q-hY{AmF@HL+zj$5(tM<@LH(?>Bud$r+vG5%`c-Xii=~u(X?CT60 zOD1|)f)LLh`h1U}5ABf`n^l!h!pksqU&w~}riWTdzP zA&5^&eU`q#LhD=Apmh?>yLD{q^@xi-bj2QTIvZHGKlR=?r4f6Ze(}nl>HRI)A}QSd z?ltaDQwcR-*iQFIUqfc)BdnebLKWZ29#D1*!)5l=jI|HQjk^D(Hrmqv5e7r>OxU)9 zOS+@|?>WFJ=1?9Fk(=f1_5p)n7y^`G3#YIdkyOhx}A$alD;dlSQretUH|_Y z&TzV8TbNtN_9aKB%hBL|1i(-IjWIW&scsspg*gj%Me_dvUF`I%wZ6#YeRmm%1OFAF zLH0jOXuvVgOQm4$W7L}}s(6%n>QzYznF^#jQzkp9g_e>x+T+2_@&7!gEdIxx<52sl z)BinNZlK{N3frR0%Op4~Oz0gna0xHtM4E2@7EHs-{|~# zT}ZQL3=mvb=EKaA)~M3K-8irAn13M-ajag_5($2MykGbjn)@x5EgV^>oe9i(anW2l zsO;V|hs6Bx9YGU{5QGJ5s^1|aNUD}Nilx`%y-FT%l$8t=3WVQ*MqjZ?!4Vq6Vip!O z3;tk17P`;BOd^N0cmGq$#R3IJ5E3PsxnH(r+L<4;8UL*6hEh=!nk$aHthn^Qw@#t6 zXO{Xu#3@Vapg0msAqCtU{mc1Fj1Z@cSbKvwW#btj5lmk&(#c`5k_k4hzLF@P1Vq!2YJt|RUhNx#!PldmZ;L`4%c8}&5n z`RH7d%=A!>y2)%Llx(MX_DVBf`TV3 zlm({Fcb;&l%-y8WnW(O|Xt_KIf&jUXvzp2}!<(;Y#O!x+lz8F0{I~!YLqh9yGIVP- ze8CVw8y|lEActGJ4q5&Lof^~#ogp^r7g?8BangFVsMnUKg??zy3ojL|>jzLJ$jaTT-P92R|h z0vfYeCjSxSyKC05g!{Ux#+BFV3v~s1-t&Bh{L5K+C>$)cgM4m+({AU&?Ya!N*OMQh z|L#|}w!eiWDwn-Ik5&wyK{k*p^+AGSDHJNekyC;K+$K6@bHRT z@a>4I!b)AZ1xKRv+ACsVW2+Rl>Ot{-U+4J(;1%x*Z^?wG%P`$t*^(1gJ^_1#>T>yZ z3x8P22$##k8R3@?Kt}k*RWGUVSg?M~-AE)l?1|G`+zbq3rgviV&itpJLCiAs!+=?q zEeJEqT3@rj`JAN3bIko%Ua|=sCdfXmJTJApapv?scIpN)b<51r;w1nrTk4T!+tTD$ z07z#>G{q{D`Z5JCVZ30S4j%Ji^)i?2nT_vaMq2MXUHLasD}>8 zyL`9DA=YFzo=EW`(rpW>H~OZ7FKjFJWLuu-2^|&%=_Q3c0Y_N(SKe`(wp`NsE0ixg z8I1Bx$k)GcGsu39Ki1glBm5$ACFVGL!IJz)CGN>*$@U1R~3SV!+ZC@xf;U+!$ zMCFTh*_~E)64unrHoOQaDJ?8OnaknJk zrb)ouv>Ak(rss&84D^VVHv?|9*Yi0CmKBPx^>mcg<5{a>KRWaw{#>$PEsk^_c0|#~;M|XGH>Bxxyn)G91PsF{VEnS~8FH9+n$BWn&MG zH(1L30rlkyNY?b_%yR?FVjFAZthlW*(-ytc)0ExomXe2p-#hK9$tN&ZgKrR)WZd?; z{C-U<>AG7@aUTxnBqtXgF{X1>B zB6Sr3)beg|V@5%~K$_z6ek>1$3`-_2it#aIh+7>YDVAPjtlih|@w#g7W4Q*UOU!d&f3b+fwPS28N zYre$Smg}6=l%8@=UI9mVfVAS#=eta3$6ck@v_#Dwc<`B2v5V$MQTF{g<&Av2|W5qu%Bl^dQ^sY*$e&rvZGb6s-z-9eiD8z4n0)=>f0tWkVdjKy5Plrs3P~qy#yIEmW84aAwVrh zJs}uvis`cI_~7i8PQ{BYZJ{^~;5Nb?OGKKm7KpbW4Oq>(@KX=T?AbU0e}1 z0BFYB41i{eU}*x_#bB~c-H{)bv=fd>(FnZv4K&&2Nrd-y9r-4NbJqyrRN^EtXVvLS z%k}vX%;OLrqLUusLzn|T#4c#a6#8pO;v#q@B&>~_{T32-awGSqBmp5|QVr%0V zwP`o9oe^>7=hj?l>~ibkN^8#ka{N=`$TIPG*w_||=$H0i$ss9Uq86M_y6h$$wsUvN z5T}AIUN>$@b^1NkM+Y9OoC)gp1@E8ortqbxemZ+2(FX5$;VkJZ9h*Satb@Pl$F(<# zML)@i>lBHSov%4U6EYFP1RS@(TTtVPQ<1pHffy}cx_=At&)28Ioq6alFKm&P^+RCAQ=9x(a#ritHi`u?7k z$v5Vm>4Kl{pYV1MMgkYIk@?NTe;&D*>|?c!mCt}wv$V(IfsWXdj8B=t?A!D|PyR(g zvKeK~?HoU=F5f`~bx^23~Pf~tXVG0;!Ygn9oy zsA0#^KhDo(b@NpGI-!fRmBYcPchuOgHkId;sw1BzUEH#UoE9R+n{=>2^7bcv?)5_# zwzhvBy70IzewI>2bL*{;i*E#|KDVg_|+^UZ~ppMv<&t~%pUk^1eeO4RGnjSP?rzcKI}Ve&3=_iV+&GA z4;q>Y#vF0S+~B#F5~`r;G-+SmPHSs(9O|1DM>>+u!M^gn5#TF_NdKI>xKKHa%@psk z2Zx_olr?SSc6((R6&$?q_5pzZW!JRIuKfu$!NiWU=gzk+NL79pDzVI;3W*F8RqiRe zGz;OvGew$aQ*N(hHrOA>Z{q^W`GPnYMLpJbTem^3C}^swISN!?m=^D_2b56kI|?$! zMo`9BjhHbOEJHHJZp4gn9S11cY2^3wg{-5SRp3j7yJN>oBh>KV(r)-{KI|*|UYI8O z$}7nW{2eUd|5{Y);5n*ej;X$I2B?X$TTKR{2z#LHfpyXGD?6ggYMPAuf^sm5!|j<# zi>=0x@jh5Y7?>ma%EaV_3|r`j4*|m!NjCp9|92x)vg=pB z`PQ6tR4ZuD;Fvn7UnRziy==b42`&}jLq6tB*to2?nQPM4&5`)s#e`*ks>YYOQ}vk8 z+n`1jE{6N(_~h>Z*7H1p_GVuAtlT?F9)tiK1XT>7mwMbCJyM#aZyY!ctsdLj%P6{^ zRm>sR9NZyh!~?A!i>A{|+k(~OA$avzVIPE;fL4!v2Z^i4Q;K^%Yl*({jDbvk<|Buo zMU7ob{=VWtI9X6_zxb9E@ja`xm(ii<~tFl4J+o208~z#p($q0$iSbZ|1Q}WRG;npqAbCuRHQ7FZubx)%>Fda`h7B=iPFhPUB+jzLqXMFO zRP8cFZ&bg!Z)Ix^u9d7AgKUYY3B$F!$Im38-DCIfcaN1Ak-%|nxydOfxNPV5m1D(L zZtPiOD`%1^*EfY20k9hCk1sJ;mk0IS*QN0xB5oqlZxuI@fs=cx9Fz#=dxD1VnGA(O>1&@u z8Pk^FET4sZ)=BdYiWd&9+RCx5tUyMyohsZsnT>^PW!q~J9J-UhBxwV=BWFImH_j}? z=-D1ljLG6w6QxY$H=U_An#VJ`$6)3}kl4|w-yQ;6dG!>JbnVcfYc~&d?QCDMcX5Qq z;~GQW>Mt=qH6v9v8LFNGv8!}s1fyYOlxN-$FO}>62J4H{6pcP>hUdq>dYWU3dY@`n z$&;oTkLunnazl6fEPZ=t(yZ|MwzBOor9Vp6OH8Cq{|^W`apzaIvO|okALJEw_xP*Y zUU_?eV{esJ<+D*Mouctgbtmw7|4@1A0{JpUWSevgY+^3Zn|ejHz|+UZVEULOoRLoo zti#cowsB%W!N2RFV-ga`1uGAVQr+aOFG*gJkyIV*=u#$sexG0`IeLWuQ=H^_Kf5(* z7c>%g*si2f<2pd*@?MTPj;YlFBXRjxp1r(xf<^?vPk^Pk<6uA>9NlAQA&dk$-3D!} zOBt_jYiW-Sj0=v1aKQ&4T(H8K>kuwD4irotUOtwOASI$?v*UO;r76~J-bGsj7h8yq z6l&g?Eryms*9eD)bdd1xCmmHqsnfoz!aD1lu%;t*%k~OTp41Wg3Y~srpD7|didm}u zrf^jB$s55xHSkW*jK-J2TX9eWPY3vp2#I52XIHiWhTe;k@+Wa^JXW;|rO-AkCh>^A z!3fpx4hqXYYeCjK+yvs9!1YPw740a(W9w{6nqo4_AbK18eZ{2$f98uwLKzF}ZHP-D z>&Omfl68jk9UVMx{@3I&c4KwYTbx*?>K3R>Oto>}k7Wcm3CnLm#xg#BgvT=Q)lDOF zOYgw#4heF|XzpHPG^+ul+1$jt(4PULC?ck|u;Y+-BJN_;LJ}9;dJ>j$nCGx}y|YS38S`4hjjO zZ+`SEZ;Z4$dIJWuu>e4uGXiKc7sQdy*Cag>s5m2zH1l?g)UIvj$;}2?;2-thdk^JO zCY|$5>T&I=|KPz~S#O0(vrEP9Zw7utKI~sPXmmS@S>24e&-aIT5+L9ugWui1j>n zqlO1sL%nmKADNxpt~hphUU@F1hb~7i;hqA0Q{w>g#R@~(aI+?9RUdFROw5tJ9}5n$ z2yMRMGu~8wv?(%_b_2p_6WozAW=An^{+S%)SxKWaqi}K^$HbfUm#xKX(&s3Q`r(K| zz^6kDHJJJ-y&ecO9Rdn^8&}VtNN{=6{0=~=035`XSO(@WeuEuG>U0ujBci9a=8QlG z966E?=2ahe9(`&i`ts(x&b5?^r4>pAJNwds*h#KOFV8IP=)Xn0R5*9E9qgwqB7}-Q zVl0DeCAci}egq1J$zRd;ZV98H2q;lhPUN0RXB2ZH9E8(zvN72dBH+O$4(8;@#eAwIB?QTclK|lJL|2)#iMfxF7c)*3Zxv*s-vP zD3&KXk-nbP+Zs`9`pZNGq1lMOkIW*fRtk=n)dm8f7)}|v!7R&~wjL|`em|%qh++{` z8y+H6tj00|iKw;^K&l|dG8TzE;)i2>D1yh+42d^to~--X%&hFJ#BWp{Fo<@tC%nWy z7Jej+iz2ruV+r6vx1;o)Nd86<%L0+w7}(TTNNwDy{IopUSJ;HviVt09%jD3^vA$QO zClLhEh%wtnCdK-#lF;*)DMR%dG>-u^i9&*^sgdt;!HqIzy#vVo+Sd9D!q3U30j=WS zC!nER#zp{aJHrP7+ZZ4J2B9jJlnEch=VZnnE1Yhn;<43BOjwdqQKsL*_go)bJ2~Hn zRO4MmMXR<~%Lb+x9WRRFlc6UQ@C{DdEJDmG0$Sm_W{hJg9KVnX<9lKz7N5<`lu5n|h1qp3@B|yn}~_l_k<4kHoa$9=LpzcE3Gz#+?$TwwVEH+t9HG=c3DyV8#}V?E1kB z{i4@SgBYH-9sK-?;F(CaNpa^1;-;=^zETEI6-G`^c-?VPbqNPmBD)lU9o-$jE}HlR z4wAgBBLWi%6)3d)?@iEvP&BfGI8bC@G7!* zVtHUi?kZUvs<><~)rCG>&w-A+Dg`f1aNqqD<|Nts`8{@I?^iVQeavNDpqb}gAkDlB z*32vG8Y6gV1liWIKt-aPmIinCoT1EeA)HwbB7ri?ekp{r?r=n)+tm;}j`M$FK!5!P zC{A5&%KbeaPVCO|&KV`-MXqY(<~16b%I%oyoAX^qR8!7 z_N|hX?Wad2jvxVw1;AwM(tu(Y+)(U-4xty%$^sAx@*CYUzXle&F|LVSfIH(q$1b>u z({V1sZE|tJK_GTf?kr23Q2rAS*>yr0BtrNveG~)SQ`1KJxPtAHyuWiWg9hE!53IdG zGrMpC*5dIU8&unAbZ9_j5Au*jS3Km@siDh`-0^2rIY)GDWi;RCEK_K@U+I)nJ~cs; z?|wx_;@R^EPv}d!2>p#4SRQ0+j16jCg2NXv#hFKn%ejKCZ5YH1I-A7~W_$pFXj`|3i}veK+7Jtw zp-jQ&g|EhIed8}5Ba!WmQm~@zZe1ARGPUcucff5nP2(L0YDycJ;O5>9sJZ9gp#O!( zC1&@NP)XwkK(Q1_tZ#Cs^Kvg3C!ghjC~cd4ao%5V>)t%ZQ=RI*DZiCZcpXylkU)h2 zSSRR9SfcF>ZJ?bx>n=*(X50B1^C^U2V|?VAdp#gjaE`2%!CeLz8!PSJnJ+VyxJNj0 z6C>BThhuA^7rC9bfyWnb^qBycr4qO-NmF4%XBaXhmg}FxKFbz%ywrqT_VZ{@#-~-- zfv1l4JvXI2l9Ba|=8-Us$HhGd8yLbgH(uf1D}w+kWZ9g~4J6_6^5Wfa7~ZRt5Rm%sPh6JWgk(M5UIK_+uXSuBiWFAK!0%|`eXdtd^$6W{>!UC3) zeel_T%{&H-wmnuLstYVtgwf`)hS3)C^8IPqmEgtMm}o1*Dw)cm(o$iFQq0TDq;+6+ zuqzc%iv6eow2Zu+^ad}oy%9!+Y;VM1xJP%yQKT%@7$%xb(Pq_yPETSy^UFxyMEs)x zME7seg&1wdj~PbQgUYFzccp{U9uD;ecMk$o@Qf(POg3H?*Tps3Ym>ZVoVvHJe|js+ z2?RZBa;mU=knY7gHH0pXQB-8c%*yfPD+ulVLjY)A2LGY_nQv^mT$Z6*ha?{X z(eF4{?`T7fZ9Ha>rJ%!a(xPw7I7pB)aBZg6U)oWfT&S^H+Y50AwY|3hPV7PLAM2P> zt_pG&xaV0-A!`>nDiuc=T{xTk#Pg39m%dhEDTbZnX2?0VRW!R~9)R8noMU0?wa)Rm zUpdDxpA9`A@Mha;=Ay9bata(q#+HAhvtiH^W_Id}y`7|~V|>5RysLD!wVIbmXG;Mu za`WShprPooN@v?>;*-#IM_R0!nao3q@o_?2w@;JTN!hU zuXtgFqx#g@PeZ-2GZZg!`Spt|uIPv2R!--e)m`7nDz~dEv_I7aI7T*hH#O|o%$eY} z+`;isW|RJ*ek!lHbVqA_*Yfe9y^{QX1* zM^8iEn^rKD&@HyNX7O6$*iH`*#dZDShqf1%7{KZ++DlBTO+OlPj6I}t`EylEB5@0a@eA}KocT~CK@xW_5}rEcgqtO|f?nIJEX=YM(T=)>>jZg>3O;IVy+m39|( z#OGwWx*>U0J67NsFGCSyr!Js)GeHJ}g;uilb-{}WJTp=8@+Nbwe1zT&$nVuI*RygHP-F&*v&AE$vJeNW-Z zuNb}!IK@aX`u68lEE|x#Yq4yIxz+8C!YkuFX5OV|CBWP~~(JO287mCnJoR*23cSZH1QK*G^4Ec$k#cq3oyg3uVuN zNc6U!^zJNkp*F9O|M&JUgkpp2U&9sqH?A5Ozl23FGG_{K5ylGNjm%B=HRaZS(peg+ zk2d+#|Bvxkl(968B<@DhY0_8X-&+bo@a9|^;bN?)0JU1Db`#vV)A?W>GoEi`T<8p|=g#*SP zy#iR$Z>nFiWRDOtrhL`KCTU6}T-CoyN!)s4CD?7Yi4ILsex1K$=%9ko zshb~5D}dEIj##~%!0HV~tX{{Ttll3WY;sz`KU%%I{rlr#1lwf!*#av9H8RGrHdqYu z8W`cX+j-t@(H#T>$!y=oIKIDws-M$z0neL*X3mDXNdP`qdKJZkzral#<9HAe3#mSp zFYHk>4;Oje8zx9vM5^_8uG|tR~qqny(tinw-@$!hkxnu?pBDarFKp%i`?CNdcij9NQhHd$cYC~NPu18 zn*GL0mAbf2`$3X-+y4cHYpH(`Om7Wb*PW&OOLNzg5l|pEznlY93N|0V&R9NxAKu86 zBFX{bhtq+Q_jY%_d-6&34v`X(#BgWIC$)@0<~HP;;m%zklK>#*$s}mj%wPk)v6k}&A@qHX0Gs&}z1Bde0jfAMNf&ffi5=ewx zDvis!(O}Ee*PPxNc#;pF32u%*8V3NjO+)}&qb34i8*uVkx{oA^e^Ry{JYS(ial${8 zC>}FVkjf8U;jb00%U`p7u0ol2Z8Z)NoYk5N$01PVLE1%eduQeAGNp0PbgU(iFof{0 z!VpX=D2g><2!_G>Xt265_c;Pek(w0Yp@N;Y?~>>>@xu4r?+pcSgXqUdFV2L?J%d{o!y$EW+q2PZFVD-ddIct6GyS`=K8o^hyYVVdw;E2#+^8kg! zCBsq0#lX3yzJ@~MSK!jLroJjNj=nb(-O-_%;XLLS3GRxPN0fK@v;A&Mvxj8^ksBOC*VZVZ)kX%JjY>~kclf;Jh zd_!kFA#u-q{K_*)=@iUO;uZQE4fF8R?Kt)!blF1PTo#-no{Y!#oGm~TsD)8+z2G#S z4}m0Ac+EnJwgjC$C*}C!#oiar=B{C7=qBtV(|1)oAO*9R9k%f^`fI>_s@sK?(@)o= zh^L`eT_=JX4$0&Ks9}dGA@cbb&3C6hOB5ADkm1F(kYTs`S;^B5;+NqRF`+;KzrX}! zL&O4k`-xdLRnM!=lnoqq8@0PX-OyaXRk+bFI(|kw*U5R3ul*^~A3fXemNp0ro8;;s zrDDf5CaiPu&dt8>LJzb5*n&dk`HuL^ELSI3!bY{f0=JvEoFw;NO4`&&h!v6Qe2pC~ zd0C#SXs>h^>>9uVsgM-Jb9~LY|5iMKP3T46yP$uwQM1S{x9KNvm0gi7Uu;Zc&Zw5hC&@+I zS+#ij+*47ujfs2W;@764%yp}|?i5ZiOx1i@Q>MPZl(J>Gl){0@9>V2tLZ$%r1OHc5f9F^m5UO0`)xF}!;-+7q@)e=-IVxkUbO}&~$1GPysdlG3$J|T< z_w`MHvw6tOGJ42y@RaKw)LV;GczxBFqt12^H^zI~$v$oy7N##j=r^Ve0y0DOou*g+a_+X#5OI8TusDPj) z%E-;EZj?NaQI(62GN@&bO)j4tO`|d+#PkCBwm$Ax2l1Iu< zn#%2VT~Rra@fdhnf!3n+aj5nen#)WPWOF6(m@-6_$ZC0pK2H6~iSRR3 zV$4flMPtpQ4j@H_~r#J;r|h-%AB>XA&$YO^(XIwY8GsQP3Rs#^A0lDpS={Ur?{2e6>iSY)*T zZA+9s?~k(OvM<#L@R@r%1CSDKtp?y_hmaCwa@U6kx$UTzPq>80lQNO`D*JfzLNSgg z?U`Ufjgk&K2d2hI>VryeK6kaul0D(ea(2+5J->CoyPnm<{Y9oBw$`p}8j<8Ewl>ZD zX1-VtjYWz`)1kM){T!C=^-#fs{BpRVThsF~jd}g>!eeIYU$XvJlE0=fdhP#I@|Q4# zSdWE&ja_R&d`36&*))8V@5z#2EvaGIceK*%JTFLIxxTSI8d5IzYTkLIABfotJ{i!g zvIS)3DrUjX^2JhVPCHJ3lDJ$cHtpOgq+&%EcIXe?!O~7LRoSE99)6vcqMJ9j$9Vmi zBVy+MBfPceNFu>SdJ#OhO{?m+y!)H_9UXf|CNy2Gc)PX81h#%Fqm!+aaW+0$Qa{HR ze5yRjkoba2K0GBIB^yz7C0L$h9p!6Vrh3Bqc#E{XPiVZh zL-JURlktA?pUjbsRY7uNI5Cf7N6(M+3eB`8Nve2aoL(hdQ9%skZZ5zs za@)ANvkZ~eNI`xf{V?LxgE{6(ODMiT1H~7J#I=Bb%;=XH4c@H8B}iWNwb3P~EWMz1 z_A<)?^HPOy>z%0OG=}-Qf2{!*b)7xOSNLLi&~-K()PVDMpq%4Z2_B=_@>Up(y~+BJ zVX04E)?UL_bIk{X$GAIE)ionpl_M+eoj?=QS z2cktRkglOcB<5|&R>T0*FhQ9Md^gxz4)sOj)}V%gt+@m0L^uK83!z1zzo$hQa}#M1 z;pv~W!L%|~p`ZN-GOhfyePvpiz%}j`Quk=)7-r22Vc`&^`g{Pv(>N- zE){c)#2OBob9r$j?(FSp2oSkd22IMH1Cw$fo()aP0mlnW${}C;@TA;UnO?%oAb5>S zY{}Ys1>nGf3uB8F!5d*KBa6ziQhZ5y37Cx*^6Wt5u6NizqS*JRlXSsRclaw?Zcil$ z);=>SV|}H9#Q@231cJ?8{64M#QHDLJdv%+=-vtf>$s-osW?271qaNf|)spfj`gX*9 zEnY}{v*GugEUUzmd>afXS~68n#EyV1W$Rc;ImXh|jjUlo!gd8o00lDTd%oAxFG4Kj zd2M);rE%<1u=TyV=qXDLr31I$i!ke{3SUu}Y}_G7dR*8$_&JCxXsyN-Ft@*06A=*$ zg_MJs=}tb_A7mITaN=oA4|s*4F}YQ~ z@DFi?HGJVui7+(n->7h-M!sveA<(o%Ko|ZyQH5{Nw102Atw_Vnv6a7)-N)mDt=Sii zJ?}3u5dsQ96(bsyI!6d{)gY>n3Ze=SFf9mLk#mb2^6zg@`c$JhMr)5098-8h?q%Nw z8eexn%zrxU;+3U9`@%Evq9!fk5;H#Bgt0n~eA~PVRiA0GgrroS-@ys3q2YNTgov11 zi-?$k7UTvDyX2xid=SIAH~@0oRIfBHhDu{RS+M={iG|(Ef~IPFaNOh(dC$8Ti!!C+ z_ZOMWuzr$y|B?jNO?8R#L4L(JTVa{*gl9*f;n$(-C?R2;lCb@`3JYvP?K)9}(WHYH zqx?PZJjdFFUV<103*3;$d;2Eo;%smp+frp8y71JMfqxK~=J`r>hvnC&GO!%#76tlf z`O7dR&G24Q*Mj}~54h26HqEtia_9*Z1BGei9ysr;_`3x`U<5xoQY^huuDq&vCt=2T zgVJvQ=T&cWj}nbn++cWBZDkRgb{gt7ZZSbVbCoJwh{}Vg!aE_V@J^1K026Ud+mcwB zdx)0?gK(hEmgr*1r(24|b00zR+&>VcuqzbL-3`TaiQ~wCl=hqS@|MweeiHO4l>Qaw zpS>3WC~dLIN_=+~El2=kvQB!r_g-CUST;9KUfE$jJ(<0GB7<*`{Xn#^ssAtUTU`zth;kBou8m?oHuglCQ(Nm68Y2zclFt#87aB7n8EsSXk zp4|&VSFx(N zF%qp{hV}6*F`M-}!8{Q^b;@(q;Vq25P@s#`{pe99C|Nn7WE+ERj`@@3+NU%yICZ@k zj4HpnvSw7d3$Paq(Fxz<9wv!VUAC2|F7(F4UUDn|Vcqf|VDSF7p21sQr28Qp;L4}~ z>EVKIX5IDEp>{^rg-k3WEKxK}#z5;TZF4JOFAYvL6+2?{o-IFH_&F_lW>#i&ueLbL zr7~J#MwekWI2HUoM|s6hRlwdY1NQEN_3YgSVDAz)<32(@i zMWy|)A(t}#XB%?CMh=ho{M87>^OeFC$@IMqh1X1mLnAtMJk`&S?wF1=o$+EXTC4!W z8qSgO5-PAE;J?Lb{4Sg>(g3?7j=>3a%5<^-kuV^MlyI_jC<_qF4354*R=c zU~JXj&CFFK-v9hp{M};;O>j%?7_>UoJW_*JW_S`p#?xT?24`xO4SHK=2aY>+AKOD@ zqYe1e9u8|f$N~s&iQ8O&;yn&2-ZwgOfzG~%IM@NuVX_Sb;8dRZ}NcJ#$52Fv%RE^o_m9g`)8=7 zy9cy%#o(Y15O`oats|n^Eed0ckl}f87v%ik!aI~d!PG$8X|cm#E9yqf2;9*9dE|X( zt1-g{6?DmpE|$nKWx)mAK&YU*85DF&{84-m+F@#GLHGD-1>N}j>MZOiFu>pP9TtsQ z<(-ihBJ3L$4Q=q{V&_$OEp3@ZZl$#}(FI!Y(u!`8I%JAT;+E@S)dN>Gu8>f}SG+sb zw7m6;)j+WF)y8tm5sY>IyR@+vZz506h5tQ?947%4EOPxmUvDU7A;ARM|AJW-T(2Gm zbNn8!ITuR0xsgCt4Lx?P?RLHe>eiHf`&iL9*I)~y2XD|i9Y%eJ@?DO6c`vLoym#yi zn-|~&W8<^PVay>e9ed&Hlf?ey3En3QoI_iP6Aac6`#~EULRv^eoZxc-L{4ykaHmYx z<~39Iz$pLmqsqdM5YGWn9^t>{B@Q`!k8RBa1PKl);{&c>*dh0Y;E+RIP*Oaiba{hq zI2U7}s$cbi6Z|Z4D8V4Zb6ym_oa(QmMMbL<*k!a!YjyHh`c5KKB`vLorc7s|2{^1(+VX?EPW#v%h z^eU}q$i!0KfU`r!JUCl5`+&m0ksWDRe)g}=I!kXZ^l~S${I@_a*AMRHmbycuT;SCkH0ldLN6^1w1!tjO!>6Et;;kVxJhHggC!WBs{K9#)B z!m~BVmuh@|cKWM)Y+6mZKs!jV6{U#r+pJT`^JP3J0vr^&T8PMo9CWJ@(OR~GT%Ddy z0Gz=k4f04Po)mi!j;~E_kCwK_c-BwJj?BaCS z;I_?HRxRQ$&>#8*o>k@!Yj^q509SU4r0dh<;= zc>b~M_UJ`EFyMzxu3eISFTrR8TDmzk|LQLhABfo(B6<9c-fr&t)fCEY-R)1^RkY+^ z+0=BDnMFB53S}HoptHgW8Vm!NxL8+HRU+cDIXAm>%m`$ zc3xi8t01xd#K{pR3;O}9X^pd`iGr9qM)A<}xskg>Eqm?L|ZlDNv2+O6!##2qqs-(9lx3R;Sl0*Nt(~I;nX_ zk$~E7z*I}Fu^nawg1KcShm^Ne0(LS^waym><0jbMvnzwFqKf7IIaj?cg|H~P&phgTrDL#EQ?V-zAeB17v8YLIKvqk{f^ zr}s|LW(pFL`B7CRMIE@`E4uRm-{^5&nR5NYBP?MW4D)Y?|vOEl$W zVN##!64m{tip59eODe*#$9l^9cBT-Ob5koT=b(X&nK?>P-Smh8N7Ut!JJ%2|L{x-ecm!ccEKR3hr?UqvohQnrU(recvTiHgjm-;9<>{Bymr2UwA`vlC)m7TT0XdFS{}0uCOYTR zy5-*2&jCV9ui*VrOXCwdI3ePK>gAx)))xgZI(U>Bya^aGZy~bRj`+sKI(|T%(+Uxb zDs_n;d~ea$32-ITl61S~EMF!)s$l!lOV!gF(67j1Y%UXjes?G^inx&(8eB;--uWy^ zrEP)DLleKJ{Z>pNZ?w((#Dnj|gJ=tQa4s{uu+|1C!=Z7rG~GRxesBE}VE9`Hhk4R3 zqcVEHWDh6{Br0BU+gjlaDKg{(R*K8n!S*2G=8_sH_N1ie`$EnQ?i}8??$gJED+0oH zv~NhEEA*|%X6%#%iJ3#7HMa9n+Xuc6P@s`lnF**nCSb1MDThw+mA9V?w~6>94NaQi z;Q77xfRKUgIhLg%dyWag`+YHugsAE~L{T1q4Fu}T!XtY15ImxF#Vd#9_fS~&A%(&+ zY94KSw;-7?NCk|upr0|$)+{p4P(2HG!f_wm$;uUoB?O1P%bz_7XmK1bp8wJ!e+QH} z`aBiVJ-6bR=NB0cl@}@3wPbH0T>J{R6WY}b)mAU>wjA6e@G?JHHS^xJ}|r@*e+7n)W2zfRDria86naoZQ$xLUC> zlIj`_vL)8BF(HTg`#YQOcpyFp8^=DhvGDqr3&7CZkLY{ewPR6~`R5zJ9@F7k2)^$a4nvke87UR+oeD4xkbPOaO6a*9^f}p1??n&tWCM=T zZibWfRec128{VYn9Bc$%8*##?HJW$HWk%Od(g~b*b|c$_l2wO4GLsk9Bnr~^^nb4J z$RG;l+FJEaa9M!M5FnU4{heTLmQMc-jT=T`J4f?M7>7wjyVx4EdXW#4;*r~uXJxJi zR4{k!KEBhbBl4PA2d#MqnezP$j9lGu1qZ2u*aB>eJVv+l`rBW|BhrP@y})B)W4mLd5&Kp0eG)}D+suL zD&;ykoQ>cAkCcGV{Fh{7)C*-v^%mhNf4LDc^K{6-{BKOg3u)MRAq`Jq|I=wW<@yf* zvrqrm1I!F=57Oi^4>A6uN!Sf1UaHXiCT5&8OLvmB7H&a9_+P{W8^-1&H1%h2i@6Od^9a`g>w4zIo` zPtmxe$_YxjZVSX$T_c^gbqmXHlL=t?4MPr=-!j1R8}{jx;?m`}ww0IPmMG=EUw%uT z;X7GKb{<}SyKijho~$>yKQgKLv&?uJ#{4Y96$DjCsE&Aj0Y({f;S_{HMs;P$=!MFm zU!KzBk3BeyfSL~)t;{;;m&hHFu7|kr9Ks_~qfNfXpSQJr06X>8Bq+_N$s#szm4Yh8 z-?7<)4Q;nTayUNRe^H9gGjQ}$z(nFXP=Z)10W!_YYG`tNU6s8iwmRbU=jter4vu@E zKk;`4$L)KEG~^oh+$J2VBj*7SYkND?kZ2)s&3~@A-_4)SD5uNOsmqVB3l@yDD7Sdj zxdG}&3>Arynxl!%SIeBySH;e0U=R{c6g7r5s zu>R&iyTN=bk)Vq_K~=p&qR59V%+5pGOYq=Pxb=GnYW>>7t=}>-sP$`Ek0k7RAy3>G zdssii>LzwO=z=9_e7c^C$$T^L$BnSlhFJL+pBao0Q83{?f4gwH8ME-PRl32$<}Rh& zpY`Z`Y=x;^b?l#?Ee!9x|CIKpR}05_5uv#3V>-k&zhJ3@drt43Cl~1YapR40?Y!zN zwDIRqF($KQie2ga&fYCtShs~uf*j%Kv=M$O4 zF)tDkO&3-Xwehy7$Zz5-C&ci~^{!CAmxzAU;-TP(JB$m;Ss*=BTCekx1d{Ky4K+nbEwWAQzE7TukZhGpiy)9>0#$G6=-wa9O zy!*B|P1Qt*MI|4Ur=j5jg*?iAPzj=p{YwDbnWz3Rin6*ui% z!zxTQnEtj+Y^lP`{@8$E?qU^TiKAkiPXtikJr8r_-yGk4es-0a>S%)MEC88 z{bxJa!{nJz5T}ee9O9Hk)$8^GPMN_Xr!0%O<+hjNXPmOerCV+*WZa4XXWqn}Lz~sz zTtxElkqDd09pfqP*ec02OFF-;nVV!}aDU?dz!{2%aKztX z%DmhuVs|#4>hG>%R+-_ol#id@+U&I&u(#8>!b0bsukQ{Yv;A7FPW;F)>B`gbfK-;j zb{Pit@&Ss&69UB{<_C(ySxG4`hy(9*J}p}CRWCmUiz6&9swwaD;&>)_EZ z@*&p3DW8D=>a~41h38@<^}xEm|AMU=NUOpYVD^Lvj-%enK}A@i9d7xl>DDHzY&3mS za)7?TF@%M3lX`1O1O_dEA=u%#6>g#?grHFi!R8^T^p!|NY4nv&lgenYhGEptu;94p{hw{|8S|D z?||kfRo==3lg*0BWB^w>W@b1^hG_6(rP)B6=o62L=L|qG2_w?VvEn31rDHYK$-DsI zN?9bhN41DcLt#Z=*+*3_PykLIaM%mRUtFRSB*s0oKy|?po96ChZ~(aR95|EVRX0p6 zU^+y+L9b6wJWPVl&rRFDQOyy>j6@P<{A-6>un;L^xUDIhdn z#=Gt@Vmc!kcyxILT)JojJ@cPx-4>)-+5(ndtp$wN5sWR@QCGA!IZ~7bk9@~YT^H8n zgh#$u+k3_uaWhdp4eVhz-${?xhi>P3yy@L)Xos~cp&k0uQKMkw3GKQ~P&$2Ss?1Jl zhDp7_E0KD)p$`~Vs2x07s-@YQBoCgfIraT827q^nFWb9r0q~uy8-}?&@_Z$YfW@eDR_6ZOEvKa%vp1~N7 z!hBC__ME3*QjB z#VPODBhyu;yuenW1!BbwuhyCMWgW+6+=PFIDf{FH25%eBcHGN*Is)pyV4p|W^kX(R zHX=%rdLP~A-l1bf^_C-26WVu-Bm4``Mcw-Pxe}Vaxm})MOq4iWIoc)G`R9aKqVeRV z9x(sS|69h}_MjqpXY;RQP*?_=nGno12o_s71F?k_5L?6mv4vyIM?88fl>kxy>)hJ- zkrk>=(2~ebdk0-w_rVgvls&)h(xhm<{KsAtDMf#+?No|hs6#~J?nHw+gdoJtt=em{ zRp!dAa(KEJF<6p8;PQT$xksY0@e$1BRSE>f-%hyrOG^qBf8Qjbw@MJj#RXK=14ci= zlodmmG8VGO^v`OHXKkn=AWJMfupBXTar(-;xZ0Nc4eYRuVkiWlC2E?sZH3N|2)<%B z?wF6y)~Z$EwUZ8HcHcLfT)+17{1vrq3kO=#xr~Wec~6IT@)4EF(u5L2rwqPtK-omm z+m~`a^}_t+m~9H_^Q0AX4>+55nbC$=x?b8&F~qo4#6-b4`2!y~q#!7m3%J2ESp%Z( z9hpyogzYvc>b5S8x;4HE20PBi7EF8yHO%!VG(nKfp%%`f`{&c(nLjqd2JkR%_<)&i zwh&=DJGTu&;DVuUHD)3oQ}Hn#p7aJ!viz;YD@s4+f z#nhxks>2@;)#1@VyEs(5QIV9vfD&%-S5W%pTOsu}RmjU~1kn$awT~aHn#k0q8l;$O z+529*Z}j%0dX+Bu2!m$1ra!L`1%NxW2DAY#@CgING4FVXETNb^)aqcjF58_bm51n?| zi-~RH&EABTLGQ(h;w;4X|D^`7-%t1sL2)2zBxWYaBu3#6^{Xr;m?e35tyFz@HQO%6 zH6kQ(mVtju;QDMnsmO=Gj=TfdkyX`UJF?3~=~m_~y~z%bg|4zu^{K?hV}ugZO5JM^ z{qbjScV8d|Uqr0!x>mED-&x)q)Y_f;c#p!83O!VtBnRtbjYwcoHOo)_*8W9i$q=EQ z|4REe$i%Lx{_6L`-LYtb9a(%_8f-+#9yylyR4g{h);i|+o~9kyjEu3})f$&w)DG~o zcVvX6rVDd3a_JN((7RC`IB(U~wRXI0FHN_0BDpx)7GqnK=(6$tlnOe)sa~-B2msdy z0OQxu^ZpA|FNc$|%=q@#NYE1lwFlF5(vQKyKv7}4E**a#+W*4kVb<@-;(QT?6h|;B z5csVtSQ_qHv8Y(s-xUR#h8#~^%sA_Pvy8Tf4rlUmh9r9LG%NHU9tn*TXwfY@M2z|6 zzqGs!wMU*tZ+mOPJtOV#HH9O=|9!coShs_-T%>ag-|)`#fTK=#y#oB)g}fN7aC26fg~Ifvtxg3k zr5jWK)KS>3PB#=I=LjlJS-0mI)Zgymo3}TZ@oeVO32I7U$FZjd zo!D~mNVExg(WRaxWfKTEjhHe9VHL0-MrV*y#`VfZOC(X*v{a zhLqm`(z>+iu;paaq}&4FfeHnlEZ5frcSq9oQ^{=U6VkV2&{xa=<g7W6;qmvg<)c zjqKi|QCdQ+mU04ISb~z1UWMFXT2v2Dmk##fszBGKBk+k z{x6msnm4Rma`+zA3#?{pZpj$-Y(*7=YeM%6gEc}gU~y-liVILUqJr(atE!Nl9&=yS z%(y72%S=@-OWN+{W(=(es6KF>p9l1T!$BWd=@O@U=RzO2eX$Sxnw9$Te)e^Zuy7uRgX9k4kkwu`c_+LqCot}E zkDPTqdyX$xY_hkX5Z=kBQio2h&xbf#jcn7e5A_a^7O2aS7Z>a`aOftZ7~G7jkQHd7 z7;Jl%1t?@r0uyjA7zmT$jP`OjjA`Jo=y@PQ;xdaS&y=)>DLdX;TN1a6(Jdx=-6G2^SoB zAb$E4`CO0}Y#osna1J8w$Uz&Be|Z=T-X@Fehn9WRf_;_3(V{BF@}E=PN*)DFR!=>a z4@n67GLBH5-PL?p;*(%oA_P2RT?Ke%^A9 zMS%lW{50TM)LxdoR;`{?nc}8qra4KrX9&R)nHCbu*T7249|t%A4Z+G1SkhQi+tk%k z@f|P%zx6(PfqS-N4$@c1lw%)3`S2AjVxROH$xcBuh=*Q;rK#WKo~0)p0yDC)=ZQ09 zFc4uVWKgEi!A)8JqeNO{NLfOrV|?E57LKk$P_~lyH*#+g=ciTNi?5>B;-Xwbt;@Xb zv2d#3yGqvXBDs9c9eUkNOvjmO59E{S_4q3zvq=3nzxVMlD)YC~7a@^5rRBFLW(Pd| zhV)hYLbcw(3qxDaMt%0AGQA*&sRp0g5e<~uQYCGn;{MTRCL?z?x`g&;w5dU5U_d{G z%D_^cV%&*n0~}qs-Im|Cx_OINM_OEKhYVBX4 zq%dW(ttv;IDs(VB??5INCA5DNM80k%wtsmS+P}fJj~H(r>Q!N-*XvMKI%6@-J4)0% z6FW>>fs*j06K6)=_-MY;&c1JKCeXkehC#ev z5e6ZuZILpGy2@n>Urjhg4Ye==)#o7kE#pl<`; zaoTsj;~Byg?svXpX32?aVI$e&=A2i89Gv*J{?nY_G4f@c-y1sxGB5l$aelc8zlIx# z(6u98aq|wcsJ3UDbwE!vk~pw6Q3%xCnkkg6tvyKPI4^$DcT<}5N9*ryU_tV z8>>L84Of>Gy=U5 z{A~sAqVC(*f&>42KTg4s2s6g~(62Q{X9gQ0b2Q8a?HJk5X8r*Cy+!sN>{n_D>^HMF z0w`n`O2Q{(Z-J8VFG6sD%(4({Kr9!-w_7w=RP6a?uxQ2D?0OvM^~qWb8O|r1*KR2V zT_!|GKjib{Ou-xYfvsAl15ocA)D*TL9qO84EL zxo4l?zyvij%Z|9b%zlR40~Qi?%do#-K+G@oN&4G>7|_qYbs=g3T%%g-i38&AZo2{i z&033)au)$;)UeP(nP3@#SkHuuq3;U5gaI-#d%52&+uPz|OCt}vO92)4LCNF45V%dQ zf0`c=oB;%Gs&f%t=UOEZnNsW-8g{!<0>vhsucxHOj(*u1gSnm2JT`j^Ts#`A890BJ zzV|t8Q*l^!d)Yo(w2w#0jf#C_waZEoOlM_D!q7X(>Al;@Me*5B!SvY@)VdFD2Gbt*^oXCMOpH2qmLqb zsZ47mhvY^A?2^dOXQm#%G2Nzmw~kwj!!6MLE~{LN?_6mCKt!J6*2)?N99XI`4Fyj% zbuUJ6<(S;@M&kdK#khJ2f$yrnIH0xtYALmxh(ZcmC`?#^H~z`T#)%FeMTUF=YneE-K`Xm=i(;ObFtyE*A}4^A9i# zaU7$NJ>Q7!O_xeUmQ+$-P`ao_pu5OTg9sTwcM)wlO#c*gK_3BM zwbmCFEe`!NYoZ6L5))lMkpmKu@X5x?m;fJlAw76N>{tK>#PN;=ElL|wcY*zASwx}>B%!pl@L(rEOro{hNiLs&KoLcdIqRic^G=IAXTxm z_oR+50@IR^><}=`5CWzh9twZZr)14b4o0{tZ{gNPh>HM$B7r$q#-;IrNRbGL1{8^| z{V+x16iktbk%rdx!N8bscM=&fV{Bp+E1NM+!e$IN$c!;Khckt09mPu4xD;qM`tnu} zg#6vGsCyIt7M6kTjb%rg-zRH3c_=KK{gHi|K+<^iCW8wtUd+$_3+vnL1qda<(bJA0 z{Pxa?O#%=x`AUOh)Jz5;F;7fvVPx6i)qKy4a3vgVU_rP;4*W|DwWReA-NRM zlN11KwqLUdPv{X-EcS?{cBIilpa5s7)o2nnM+h+Ax7lJv+y)V@fzfg^EL9;M=#82# znv%Q+41f$St;Q1us_6@BDpj$hWe7f60IEd+`vA4zM_76cfNBpuycrFJlCv}Pp+Gu?f!S(MJGh=A?YTVf}B>Z6kos)->Ix{dOrEwBQVT& ztEhr_K{zau=+>)CEBO!++}OiLe$yVBFRmm5HqQV%lEUt_PFA>Cneiuu3V+-}Slm6` zROVZ#B{;jr(&naT;M85>mBP(8*)U6C0{b=ESh^to;lQnim)O?Y_tLe7lh;BIhr^~PP?=x zX6;`XBs1nB@-DVfJgrrEQVbdv!@OD5SaJeQ8HTKxTbs$L+biPO%I&uQ<|w(a{LZJv zegy~AuaJN(c{Q<5$Zs)!1n8}!Kn8f*@16`rm>Vd{Zo! z*nrA(uMg)a3TcLS6nDn*R#=&3o>P(d^rhjvk2E@1O5v#5l?K}}1ki@0E7hoyHioO< zO%yMFtYQ_3iSsK<+j_O8_>P6GDJd8!GkiBv9$s;z9KIWjl=Wp9h$Ch2Me0mBy7!;d zX#6jL48!^PPS}^e6S!?9Zkzub*XZK^SFF)N9SiXHqj8!rR{Yknpko3Zi(Q~&K>|7! zP8QB7pkpCSNMR9sh8u58szL*1QZEa(vsYuik74n-OfDxk*u*A+q#aJIBy&yny_h*& zT)HXj)Cc;TjHkCtJCOQ(z1-H$5$5Fc760iqXg_@1s}NbK-Y&4yj1Zf#Z(R1nr3BSo zseNq$5%pwuu68i)PRl8(zIqMRlO62njd}cH_dBX}q+}6#x^Ev^75Irdo*!&3oSzK#-7miRTjjWURurp4XK;$pA%58n-AdWO#H=alYov%k+sp%IkGIM| z){*Q>Qs7-gMshw+xkv|NKuq1;6$pD~=>020a((oNdv+}cp~^AD{cT_5{(cXVXm1w$QvREz z3KkMjswh)fEL99x0>&C*5G?kMv~H>DeBC%6+u~2;x|t_xr22n(IoYf2NReNknqb24 zgz$kE8>2j1xE` z5q6I}gUFD9S|mDIGO+WUc?7YfNYQK!L6!$Tj6mh6RlIQqqldss9k8e<#`A39J>U=3 zNy_d#x8N7sNDFrA%D_&Y&t5vgo`sz{qs5)N-B!>}olDXxJ9WITpq)B-UREhf2^lVi zPEy7B9+woX>u!%ltp+Qk)xg(JB&Xd6T8+eH+ND~JnGY*#H3VR-hS3UIjm8dRl*-P> zsgPDfa-Z-z!R70IK`zYY*= z8ig0Y*bu5mw5W4{jH?AQE&^oSFbn5yIOF;R5Ts}}#To3dSb4{BT*fBIr|}3sVX$77 zGa#E<2aX*k@zwC87s3&P8pT^ejY4m+M$x=NjRNu}LpQ?aBY=|G91KyZcY>f>5jzpJ zO<}9PoD@?K?Tm;j5C*FW4h&J+O`Ouf>43GbgiuTd)J>{W-4F+&V~>*fjDB3RTSr*4Q~!Vu6BIEaDLh;u z$;+BsVy#5c{D#b8ysh zUweY8dm6%n431006YrJ*+%2wVp;8Q>WFrhiXVwf3n89P;b#PsQg>xoyL+m?bZeAGt zzJW>8D-M9+7YB&Cm*rx64wwCFW7c2w?s6TveUZ_rBfRQHLQCurO78R9(isc)hFENE zh2u0P-s5I-+>4+J$uI9yBicjH#Q^lK)~zt)G`~t)l4O{tMbFffYGF!i51aI~VRIon zq`89%#U^`}?Amohg<}5i3dN+vLh*(rh2n59{BLGhRVfF04N`6I)DiiNz_MWvSvHzW za%*kW$Y|(kR44+HL8X{w3OGF?YXdAuwDxq(*huJn-D%Cv+<0a;C_)AOl zLIVDry`!21eJSqoXPN^Ps6RFP&N`AqTXyDr(3YK^qwWb6E@iIii4t9C{WxAF`eQap z15SAN@xU>9hCm9>18y-+A2=dVjrKS;1>s?xEIfWA=LFYq@x< zjxJ0LU2m+{TtpO!pdG3yx>wuqBqK0w>@x&jwcwq7BVf-?eU4S_A;=;1c)Cidt-lXz#GU>ra#FcGb*3r3=*IxZtaqX#yycXZcw zjCrT+2^)#|11Obypir!W7^A&E>pzg}M*e>Avht&%uC?vy`1R*X<8Y*A=+LHm0Y^u) zZFZK2WmL1G9C}A5g~$O0e&#^(Y`(|{1F&Z&0PWeS!h3d_7o{aXd(%OScK%nsU$m=< zJFslgu3hxUMZ1)&yaal86&JF=*jndgNUqnXeeZNC=Re|>gT6NZ({4HRR_Dx*59DCi zhN8su7O-oVPtrJXlt9`=AI8zxqj#Q2M6V;v27lMJ(R%}&DjUjkj-5UNuV2x%a5Ou6 z^h^Y%KeaIx16q;OUzD6Xw8g6iA%nZrd0p?O%M^eYCnK$Nj){){pzhkDl>C@o!p3pr z(?feVn~-X28fbCy;VX^q^0DMKtl_zIl6LBxBX6a78p*_+vQ6VIykG~bwi*)4u3OOQ zJt(rhG>`CKKP4$AO#DU?EwS|x@8-+u0KScXNHV9gAenQ#3>i26W0JXYXgG7@;pi5q zNpbQ5qg~9kbjUPko_#v?K1OxUY-)_6vN{qIZBTPQo*)zaH`tWHtNkCgDcdRm@y190 z-eb_h9rx!w*gYT94`YhKPp|6GstZ))z22LRy-h?6F*cBG$B(uu7ZC)>RW7jUH(66i!77Dv+5x zR@qV0)+-}G6Gk0-<<0>%w-j|i79k0sl8SNz3)SQMSW;7jZm&1HFWURkq5EAjlI~1( z{CztfZ2a^|)HG1c+>ecWo$MZ|g-Cc9Dh-L06t-^+5}g(=I63bR99?+~^*8=MRQP`a zDhx>c+EPQ;7Hbg*_7PIz6qx_)aE$k{*Z5pk7a@lB8uiFZ@5DaBnLYVrU-`;TWmTC) zr}E}FHMnKGGd!B$YRhM?HiP4F1u_-5HE$8)aT+6t#~%*B@wgv~#}(Qj9&aIV9)MI? zX6K2uD-VKeQx@41&9k9pI&`vx!EWcP(F{JcxIb;M)v+6MyT9>KksYk>yvowck>1 zn0%+);Caj39W=26%Xd;Fwgn{9wKS4kUKPklZ$E`$?;8`xK31IBN)?ly_o6Xhvd-hG zyoRlKS5?+Lg^K(6R>?ibN7m-KpBLYrnSIMM?5V>=F%S3jf@spYmXZ&EI`KLCto0~I zm{-Y#5(dTA-Yl5_-#HjM@#;@+Ub`&+=sl+n!_WyT(^gQ=RF&*GYQhbKN97i39gBB) z^V?mz5$;k*#{ImqfkoBnI>J3BfqM*!i)KqXkqwN_=dwV@$9FwSfj8&1kEvfWN5qHL zGGPv_m}#w|q~x74!$N@R#+uUWTtLFKr?;J%Enf}}L1j}RZFdhZ)6 zEC){T+z7EL=UcOfj)%kbLyGu=WR9S`%rWh@8MwELQDW;}(&@{e#K{>co(nNlW$x%rvY2gzAz1zFRR!a4ls+&2jOO|!^0lEMKmf>&*VvlIHti9^{!4 zujG|ykHFL51dqeLFnf#Ct!=tW6k)7&^y^`(6KMR&Gtu2CZk5={Xvp=WlDhRQ$5k&L zEf*C(q0ka2?9_4je^EU*8T1qNod4UqKrUi3AA|pL!2Q;00XXA-ECAOzWwfyzFW4}eftlVa znq+%v0k<}z1>AEuZ{VKO2ktqv;p{T^9DZfonlZsWhx!R_&6sqLVSmjO(5j~t=&n8) zev5dh5{vBIC3IEek4d`b*2GD{6{o}3Z2_4LDd8n7^ilVE_RuzuoAczT(x*1^!AL3F zjh8q}>cRYI(y4^gPhR=_bETQOe8(u)i%{#gvkTg@dvRx7ceTaK%pnW)!r}FG$8foS zXU%R{xh2*=-BlfK5wndzbS~u&&q#_9ye6T}n&tlVJ;k(N-&75V*b;W&f+y97_3xhh zgUAwIlfwpB!XGC-td)J^mz}Mha$O9bEHvYwt z-umiH%Pnd{P953};bkS{(?GC19b2t;(u@&8xtWoYP1n%Qew?==uG66lf;^6%vi@Vy zuk7^AuS`bKtYdPU?NB2k~Q)?TXjYVG)A8 z%6NR&!Km_uHZbi5s14j@dzT<%p7h8kIftAI?I6r=-DHfs@|oOj73V3yTXJk8HpR4; zS-mN#Jnc%m94EGG5)KNQFaFK<#5ZNe!{A>jGol^ZTy}1Ulo@RwR{;vY`r1NS9t0Vc zN!^whl_yp(Dobu|A&uY+V|TgF&+QUW2&xV#*JVl?ZQbt8n&r!vHF8QpgV!;_;FYg$ zyr(he%_sG_&*%PhJ1Z)Xjk3e0Y7lzB2cRDCuI7qdOA|RV8g?2j3SR{XDr`$IE2D)q zuT`;>We66-Mc}h!xDs+f8F0 z*c)!QmE5?k)DM@>fosf(TQ_|li08#VkuGt{l|RBZR7KR_U*ID{v{oAUp4uj$TWEG3 z1?J;wG|2+AH#n>bGv=CdC_ENU0ufNln0&ML|Lpir2*w}IzQ~1ajc{{@e zE~?8Rd#q8n-qeSbeSAOlz}9*|Fcu%7a@;$JM^(!Tq}&R#kl~wNP|CG~Q*JTe8-~;a zT2RQn@Kq4xowtGr3ax=FT)p0fR!V&g-5;YgW!A+$+o8(Faq zoO!nS$$MUfZlC9!X;wt=fg|Fl9+JJRdKKz!bsnJwmhKiDl+sCUmqVUa5foDo23{sw zM%}W|s}_IRUs@_CL~=mLrxd-Hw*r`z-5|5_5YepsnrK!&LNqJe!$4t$RolNeFv%Sx z8c!mu;?}o;-mfL+1uI$DtBg-U?+e|A8#W6*jH9UG)cSp(FyDP@7hOCIkvsklpk{4; zzB%_mW}p-LblQAA+^6ZX4n+V?MhVP&dHIcW^`Lq0MKJHZpv>j#OR1%pwm&VTCQ)5Q zBqnXW!n#_P(Gg3PYcEVmhg5^)`|zc&p^k^}v-daH&j&x1>jm#|ZSS^q^D-MaMs=Nc zYzE2<7lY5jrt#G?YLQl)xba3jAG9opPa*Ilu0#9?6po_Yj{i4Hzw(sQ_1SCP_3G*D z-lh^k!ul{sIIWJ(>Zk)yi5&yn==itW;sI%Fo%F|OjZVabe}1r)&ke&ZCauT0X-p`Z z(&Ufz4_01?$cYw}Oe;-hVZIy`M!u9Jyn8j0@NFHz@bY>)8oRY&WLX^-qXh3h9L$JH zYVC*WzB@mO&7LRg=u*Q~HPp|%gJ0$%%Ndn7PFbRRo1Mqh-To|NCZ67;>-W5{!Xfic zYg9|{hdqL>WFEEdEl3hYCLV1|uau`eBhxIHnb7NJSh$oU9JeAzctqBb<)%t`pcsv^ z!7E(p^8%4HhpUQC9a_P9Cdac!D1!vMkEcBf+z!rd9yg@L9hH6}gq2KJ=5WUVOo*1s z8*Ytt1R9K`aY_qN-<<62I;cT4iW7DmibY{vOkd>uX-zqEaXa?nSGL6bBM;n-J9PT^ zi18Mi*ZU4lyXQ?~2=WZoQ{8_8$6}agu*MIJl5mZTq`rC+7^gYt(dy|x~Z(T z@!_a>mgCEThPsjUKOqU%P@f~ojo@a7Xu{fmktSR{Txh{NB6L8A<&aNlK=NdSi<-LI z{?~k@_+04+eU;?=JKN9h9CRaXpx4iT%Ihb7`F6p5vAWyF@34|j_5?kw^kxehNHFXV zg^JHU(2nSS$KZ7MyqRx4Joz_^6MonGl)`d_f7K5DvLgAmly-Ay>JC z_Un%7fp*(W&WH)vO@$ z&;u&kI<+EXBz87UinJ?!A1jXwy_EWE!h&2TSddE-D~_!++9Gj_dnf_7l7E03?i~;3n9W8%dTtuuB%Y z@=A*p-~MkEUuwC62Ss~H&*znu)Z3YL#KI2?0>aUIt4eqrWPZSc2p1_N-8>_IwP!ro z+Nau+Y<{FGbYO}KeDF%o!_9)1Trs+{8&=e3tR?6(7~N)e!TJocuVHo!#Am{Z1DrN; z)EqJrlO6Gjg@=TeNksZFB5Y*B{txwbd|>l6ohBIvA8uA?vMX2JrftVSWTTA$Ufc6U zm-5J|e3D5msOdmvPIx?q5T6Y4XfVRi2x1(zXI@ri_!|}9)v6AI_c#W_@O7ES$O_sK zSq;v_1aU$1xGDy#Yb!8c^?Gb9%)_v(4(TwSS0Hg3JlM^UNrPmGNrQ0`vMCFEXH%|e zBLrW)Z^4(GaUOGab#mJIjDHh3t=>+1-bo5B6?ZO{iW!J@x=Qs}BZha8BlS-{aejW} zfuLL%>%QU|dANIi(~c`8;aAtD^qJcECiB2~mj}wb-ATzsAn&p-=3P!=-c|l--Zfn{ z?{ACk_|2rzI?zyIr;1C* zGENJhjxD>I|^@n`C>LB z$T>&C(j*Zw3ihhA-L0g*#}d}iufGLTleIm(f4S;rTnf7TN~v;Ss_V;h+ocOkb;&MV zOrlu>O?6Kbr@Cw+4m5!~0#EWAfxV~Fc(#S9t|@Vq z@mRlh1&Hvh^gsYN-z^1m6iI|;gI@_tu~T35Q9Pv0FzcdKXTw`6QMR|Lau4=sC+?dy z;h5t7%&*q=$id8s9hE50_r81dgu6aNsMbBPN~Jf|0WoxYoM_aU>MMA`lhvP0gn?-U zh%nsp{Rk`K&Rto+Ltt~>Qos6xpiAao1tM&;k}lah`n(v#5O#Yl`WWCazUFZEC)1v( zF)q7Y_O9^*dk}xdmHJM^N0(Iemm3en-pvSC1a7BMFu04mSW+Nz++kP cEz$%VMf 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 HF~R=?%z+u0 literal 0 HcmV?d00001 diff --git a/Src/Common/RootSite/RootSiteTests/RenderVerifyTests.VerifyScenario_lex-shallow.verified.png b/Src/Common/RootSite/RootSiteTests/RenderVerifyTests.VerifyScenario_lex-shallow.verified.png new file mode 100644 index 0000000000000000000000000000000000000000..ebe0ae0724d6ffe9d9375d55eb918c5480ba4d8a GIT binary patch literal 34286 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 z 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

unxIR^c!;>Snl0wI!2Z{%=fHz?dYdT| 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

private Point? cachedAutoScrollPosition = null; + private bool m_fWarmingScrollViewport; + private bool m_fDeferredScrollWarmupPending = true; + private bool m_fDeferredScrollWarmupQueued; + private int m_lastScrollWarmDirection; + private int m_scrollWarmRangeTop = int.MinValue; + private int m_scrollWarmRangeBottom = int.MinValue; + private int m_deferredScrollWarmupTargetTop = int.MinValue; + private int m_deferredScrollWarmupTargetBottom = int.MinValue; + private int m_deferredScrollWarmupGeneration; /// Used to draw the rootbox private IVwDrawRootBuffered m_vdrb; @@ -195,6 +252,9 @@ public void OnInputLanguageChanged(IKeyboardDefinition previousKeyboard, IKeyboa /// True if we are waiting to do a refresh on the view (will be done when the view /// becomes visible); false otherwise protected bool m_fRefreshPending = false; + private bool m_fForceNextRefreshDisplay; + private RefreshPhase m_refreshPhase; + private bool m_fRefreshReplayRequested; /// True to show range selections when focus is lost; false otherwise protected bool m_fShowRangeSelAfterLostFocus = false; @@ -473,6 +533,8 @@ protected override void Dispose(bool disposing) if (m_vdrb != null && Marshal.IsComObject(m_vdrb)) Marshal.ReleaseComObject(m_vdrb); + else if (m_vdrb is IDisposable disposableVdrb) + disposableVdrb.Dispose(); m_vdrb = null; if (m_styleSheet != null && Marshal.IsComObject(m_styleSheet)) Marshal.ReleaseComObject(m_styleSheet); @@ -952,6 +1014,56 @@ public virtual ISilDataAccess DataAccess get { return (m_rootb == null) ? null : m_rootb.DataAccess; } } + /// + /// Updates the root box data source without implying that the current box tree is stale. + /// Use this for initial wiring and other source swaps that should remain cheap. + /// + /// The data access to install on the current root box. + protected void SetRootBoxDataAccess(ISilDataAccess dataAccess) + { + CheckDisposed(); + if (m_rootb == null) + return; + + m_rootb.DataAccess = dataAccess; + } + + /// + /// Updates the root box data source and marks the current display for an explicit refresh + /// when the new data source changes the meaning or visible set of the current view. + /// + /// The data access to install on the current root box. + protected void SetRootBoxDataAccessAndRefresh(ISilDataAccess dataAccess) + { + CheckDisposed(); + if (m_rootb == null) + return; + + m_rootb.DataAccess = dataAccess; + NotifyDataAccessSemanticsChanged(); + } + + /// + /// Signals that the current root box tree is semantically stale after an explicit + /// post-construction DataAccess swap. This keeps DataAccess assignment cheap while + /// routing the rebuild through the normal managed refresh pipeline. + /// + protected void NotifyDataAccessSemanticsChanged() + { + CheckDisposed(); + if (m_rootb?.Site == null) + return; + + m_fForceNextRefreshDisplay = true; + if (!Visible || FindForm() == null) + { + m_fRefreshPending = true; + return; + } + + RefreshDisplay(); + } + /// ------------------------------------------------------------------------------------ /// /// Helper used for processing editing requests. @@ -998,7 +1110,15 @@ protected virtual EditingHelper CreateEditingHelper() protected internal Point Dpi { get { return m_Dpi; } - set { m_Dpi = value; } + set + { + if (m_Dpi == value) + return; + + m_Dpi = value; + if (m_dxdLayoutWidth > 0) + m_dxdLayoutWidth = kForceLayout; + } } /// ------------------------------------------------------------------------------------ @@ -1264,11 +1384,28 @@ public virtual void ReleaseGraphics(IVwRootBox prootb, IVwGraphics pvg) public void SelectionChanged(IVwRootBox rootb, IVwSelection vwselNew) { CheckDisposed(); + Stopwatch stopwatch = null; + if (s_enableInteractionTrace) + stopwatch = Stopwatch.StartNew(); - Debug.Assert(rootb == EditingHelper.EditedRootBox); - Debug.Assert(vwselNew == rootb.Selection); + try + { + Debug.Assert(rootb == EditingHelper.EditedRootBox); + Debug.Assert(vwselNew == rootb.Selection); - EditingHelper.SelectionChanged(); + EditingHelper.SelectionChanged(); + } + finally + { + if (stopwatch != null) + { + stopwatch.Stop(); + TraceInteractionTiming( + "SelectionChanged", + stopwatch.ElapsedMilliseconds, + $"Control={Name} RootBoxNull={rootb == null} SelectionValid={vwselNew != null && vwselNew.IsValid}"); + } + } } /// ----------------------------------------------------------------------------------- @@ -1489,19 +1626,39 @@ public virtual bool ScrollSelectionIntoView(IVwSelection sel, VwScrollSelOpts scrollOption) { CheckDisposed(); + Stopwatch stopwatch = null; + if (s_enableInteractionTrace) + stopwatch = Stopwatch.StartNew(); + + bool result; switch (scrollOption) { case VwScrollSelOpts.kssoDefault: - return MakeSelectionVisible(sel, true); + result = MakeSelectionVisible(sel, true); + break; case VwScrollSelOpts.kssoNearTop: - return ScrollSelectionToLocation(sel, LineHeight); + result = ScrollSelectionToLocation(sel, LineHeight); + break; case VwScrollSelOpts.kssoTop: - return ScrollSelectionToLocation(sel, 1); + result = ScrollSelectionToLocation(sel, 1); + break; case VwScrollSelOpts.kssoBoth: - return MakeSelectionVisible(sel, true, true, true); + result = MakeSelectionVisible(sel, true, true, true); + break; default: throw new ArgumentException("Unsupported VwScrollSelOpts"); } + + if (stopwatch != null) + { + stopwatch.Stop(); + TraceInteractionTiming( + "ScrollSelectionIntoView", + stopwatch.ElapsedMilliseconds, + $"Control={Name} Option={scrollOption} DidScroll={result}"); + } + + return result; } /// ----------------------------------------------------------------------------------- @@ -1552,6 +1709,7 @@ public virtual Point ScrollPosition set { CheckDisposed(); + int previousViewportTop = -AutoScrollPosition.Y; Point newPos = value; if (this.AutoScroll) { @@ -1569,7 +1727,451 @@ public virtual Point ScrollPosition AutoScrollPosition = newPos; else cachedAutoScrollPosition = newPos; + + int scrollDelta = newPos.Y - previousViewportTop; + if (scrollDelta != 0) + m_lastScrollWarmDirection = Math.Sign(scrollDelta); + + WarmScrollViewportIfNeeded(); + } + } + + // Tunable scroll warmup settings. Percent values are relative to the current viewport height. + protected virtual int ScrollWarmupImmediatePercentInScrollDirection => 100; + protected virtual int ScrollWarmupImmediatePercentAgainstScrollDirection => 25; + protected virtual int ScrollWarmupDeferredPercentInScrollDirection => 100; + protected virtual int ScrollWarmupDeferredPercentAgainstScrollDirection => 0; + protected virtual int ScrollWarmupSymmetricImmediatePercent => 50; + protected virtual int ScrollWarmupSymmetricDeferredPercent => 50; + protected virtual int ScrollWarmupDeferredChunkPercent => 50; + protected virtual int ScrollWarmupDeferredTimeBudgetMs => 50; + protected virtual int ScrollWarmupDeferredMaxChunksPerIdle => 2; + protected virtual IdleQueuePriority ScrollWarmupDeferredIdlePriority => IdleQueuePriority.Low; + + protected virtual void WarmScrollViewportIfNeeded() + { + WarmScrollViewportIfNeeded(false, true); + } + + private void WarmScrollViewportIfNeeded(bool preferSymmetric, bool restartDeferredWarmup) + { + if (m_fWarmingScrollViewport || m_fInPaint || m_fInLayout || m_rootb == null || + m_dxdLayoutWidth <= 0 || !AllowPainting || ClientRectangle.Height <= 0) + { + TraceInteractionEvent( + "WarmScrollViewport.Skip", + $"Control={Name} InPaint={m_fInPaint} InLayout={m_fInLayout} RootBoxNull={m_rootb == null} AllowPainting={AllowPainting} ClientHeight={ClientRectangle.Height}"); + return; + } + + if (restartDeferredWarmup) + m_deferredScrollWarmupGeneration++; + + int viewportTop = -ScrollPosition.Y; + int viewportBottom = viewportTop + ClientRectangle.Height; + GetScrollWarmupMargins(preferSymmetric, + out int immediateWarmMarginTop, + out int immediateWarmMarginBottom, + out int deferredWarmMarginTop, + out int deferredWarmMarginBottom); + + int desiredImmediateTop = viewportTop - immediateWarmMarginTop; + int desiredImmediateBottom = viewportBottom + immediateWarmMarginBottom; + bool warmImmediateRange = !IsScrollWarmRangeCovered(desiredImmediateTop, desiredImmediateBottom); + TraceInteractionEvent( + "WarmScrollViewport.Plan", + $"Control={Name} PreferSymmetric={preferSymmetric} RestartDeferred={restartDeferredWarmup} Direction={m_lastScrollWarmDirection} ViewTop={viewportTop} ViewBottom={viewportBottom} ImmediateTop={desiredImmediateTop} ImmediateBottom={desiredImmediateBottom} DeferredTop={desiredImmediateTop - deferredWarmMarginTop} DeferredBottom={desiredImmediateBottom + deferredWarmMarginBottom} WarmImmediate={warmImmediateRange} ChunkPercent={ScrollWarmupDeferredChunkPercent} ChunkBudgetMs={ScrollWarmupDeferredTimeBudgetMs} MaxChunksPerIdle={ScrollWarmupDeferredMaxChunksPerIdle}"); + + if (warmImmediateRange) + { + Stopwatch immediateStopwatch = Stopwatch.StartNew(); + using (new HoldGraphics(this)) + { + m_fWarmingScrollViewport = true; + try + { + Rectangle rcSrcRoot; + Rectangle rcDstRoot; + GetCoordRects(out rcSrcRoot, out rcDstRoot); + + if (!WarmScrollViewportRange(rcSrcRoot, rcDstRoot, immediateWarmMarginTop, immediateWarmMarginBottom, + Math.Max(1, ClientRectangle.Height))) + return; + } + finally + { + m_fWarmingScrollViewport = false; + } + } + + viewportTop = -ScrollPosition.Y; + viewportBottom = viewportTop + ClientRectangle.Height; + desiredImmediateTop = viewportTop - immediateWarmMarginTop; + desiredImmediateBottom = viewportBottom + immediateWarmMarginBottom; + ExpandScrollWarmRange(desiredImmediateTop, desiredImmediateBottom); + immediateStopwatch.Stop(); + TraceInteractionTiming( + "WarmScrollViewport.Immediate", + immediateStopwatch.ElapsedMilliseconds, + $"Control={Name} WarmTop={desiredImmediateTop} WarmBottom={desiredImmediateBottom}"); + } + + m_deferredScrollWarmupTargetTop = desiredImmediateTop - deferredWarmMarginTop; + m_deferredScrollWarmupTargetBottom = desiredImmediateBottom + deferredWarmMarginBottom; + m_fDeferredScrollWarmupPending = !IsScrollWarmRangeCovered( + m_deferredScrollWarmupTargetTop, + m_deferredScrollWarmupTargetBottom); + + if (m_fDeferredScrollWarmupPending) + { + TraceInteractionEvent( + "WarmScrollViewport.DeferredQueued", + $"Control={Name} Generation={m_deferredScrollWarmupGeneration} TargetTop={m_deferredScrollWarmupTargetTop} TargetBottom={m_deferredScrollWarmupTargetBottom} CoveredTop={m_scrollWarmRangeTop} CoveredBottom={m_scrollWarmRangeBottom}"); + QueueDeferredScrollWarmup(); + } + else + { + TraceInteractionEvent( + "WarmScrollViewport.Complete", + $"Control={Name} Generation={m_deferredScrollWarmupGeneration} CoveredTop={m_scrollWarmRangeTop} CoveredBottom={m_scrollWarmRangeBottom}"); + } + } + + private void GetScrollWarmupMargins(bool preferSymmetric, + out int immediateWarmMarginTop, + out int immediateWarmMarginBottom, + out int deferredWarmMarginTop, + out int deferredWarmMarginBottom) + { + int symmetricImmediateMargin = GetScrollWarmupPixels(ScrollWarmupSymmetricImmediatePercent); + int symmetricDeferredMargin = GetScrollWarmupPixels(ScrollWarmupSymmetricDeferredPercent); + if (preferSymmetric || m_lastScrollWarmDirection == 0) + { + immediateWarmMarginTop = symmetricImmediateMargin; + immediateWarmMarginBottom = symmetricImmediateMargin; + deferredWarmMarginTop = symmetricDeferredMargin; + deferredWarmMarginBottom = symmetricDeferredMargin; + return; + } + + int leadingImmediateMargin = GetScrollWarmupPixels(ScrollWarmupImmediatePercentInScrollDirection); + int trailingImmediateMargin = GetScrollWarmupPixels(ScrollWarmupImmediatePercentAgainstScrollDirection); + int leadingDeferredMargin = GetScrollWarmupPixels(ScrollWarmupDeferredPercentInScrollDirection); + int trailingDeferredMargin = GetScrollWarmupPixels(ScrollWarmupDeferredPercentAgainstScrollDirection); + if (m_lastScrollWarmDirection > 0) + { + immediateWarmMarginTop = trailingImmediateMargin; + immediateWarmMarginBottom = leadingImmediateMargin; + deferredWarmMarginTop = trailingDeferredMargin; + deferredWarmMarginBottom = leadingDeferredMargin; + } + else + { + immediateWarmMarginTop = leadingImmediateMargin; + immediateWarmMarginBottom = trailingImmediateMargin; + deferredWarmMarginTop = leadingDeferredMargin; + deferredWarmMarginBottom = trailingDeferredMargin; + } + } + + private int GetScrollWarmupPixels(int viewportPercent) + { + if (viewportPercent <= 0 || ClientRectangle.Height <= 0) + return 0; + + long pixels = (long)ClientRectangle.Height * viewportPercent / 100; + return Math.Max(1, (int)pixels); + } + + private bool IsScrollWarmRangeCovered(int targetTop, int targetBottom) + { + return targetTop >= m_scrollWarmRangeTop && targetBottom <= m_scrollWarmRangeBottom; + } + + private void ExpandScrollWarmRange(int warmTop, int warmBottom) + { + m_scrollWarmRangeTop = (m_scrollWarmRangeTop == int.MinValue) + ? warmTop + : Math.Min(m_scrollWarmRangeTop, warmTop); + m_scrollWarmRangeBottom = (m_scrollWarmRangeBottom == int.MinValue) + ? warmBottom + : Math.Max(m_scrollWarmRangeBottom, warmBottom); + } + + private bool WarmScrollViewportRange(Rectangle rcSrcRoot, Rectangle rcDstRoot, + int warmMarginTop, int warmMarginBottom, int chunkSize) + { + if (PrepareToDrawForScrollWarmup(rcSrcRoot, rcDstRoot) == VwPrepDrawResult.kxpdrInvalidate) + return false; + + chunkSize = Math.Max(1, chunkSize); + if (!WarmScrollViewportOffsets(rcSrcRoot, rcDstRoot, warmMarginTop, -1, chunkSize)) + return false; + if (!WarmScrollViewportOffsets(rcSrcRoot, rcDstRoot, warmMarginBottom, 1, chunkSize)) + return false; + + return true; + } + + private bool WarmScrollViewportOffsets(Rectangle rcSrcRoot, Rectangle rcDstRoot, + int warmDistance, int direction, int chunkSize) + { + if (warmDistance <= 0) + return true; + + int lastOffset = 0; + for (int offset = chunkSize; offset <= warmDistance; offset += chunkSize) + { + lastOffset = offset; + if (PrepareToDrawForScrollWarmup(rcSrcRoot, OffsetRootRect(rcDstRoot, direction * offset)) == VwPrepDrawResult.kxpdrInvalidate) + return false; + } + + if (lastOffset != warmDistance) + { + if (PrepareToDrawForScrollWarmup(rcSrcRoot, OffsetRootRect(rcDstRoot, direction * warmDistance)) == VwPrepDrawResult.kxpdrInvalidate) + return false; + } + + return true; + } + + private static Rectangle OffsetRootRect(Rectangle rect, int dy) + { + rect.Offset(0, dy); + return rect; + } + + protected virtual VwPrepDrawResult PrepareToDrawForScrollWarmup(Rectangle rcSrcRoot, Rectangle rcDstRoot) + { + VwPrepDrawResult xpdr = VwPrepDrawResult.kxpdrAdjust; + while (xpdr == VwPrepDrawResult.kxpdrAdjust) + xpdr = PrepareToDraw(rcSrcRoot, rcDstRoot); + + return xpdr; + } + + private void QueueDeferredScrollWarmup() + { + if (IsDisposed) + return; + if (!m_fDeferredScrollWarmupPending) + return; + if (!IsHandleCreated || !Visible || m_rootb == null || !AllowPainting) + return; + + if (m_mediator != null) + { + TraceInteractionEvent( + "WarmScrollViewport.IdleQueueAdd", + $"Control={Name} Generation={m_deferredScrollWarmupGeneration} Priority={ScrollWarmupDeferredIdlePriority} TargetTop={m_deferredScrollWarmupTargetTop} TargetBottom={m_deferredScrollWarmupTargetBottom}"); + m_mediator.IdleQueue.Add( + ScrollWarmupDeferredIdlePriority, + ContinueDeferredScrollWarmupOnIdle, + m_deferredScrollWarmupGeneration, + true); + return; + } + + if (m_fDeferredScrollWarmupQueued) + return; + + m_fDeferredScrollWarmupQueued = true; + TraceInteractionEvent( + "WarmScrollViewport.BeginInvokeAdd", + $"Control={Name} Generation={m_deferredScrollWarmupGeneration} TargetTop={m_deferredScrollWarmupTargetTop} TargetBottom={m_deferredScrollWarmupTargetBottom}"); + BeginInvoke((MethodInvoker)delegate + { + m_fDeferredScrollWarmupQueued = false; + if (IsDisposed || !m_fDeferredScrollWarmupPending) + return; + if (!IsHandleCreated || !Visible || m_rootb == null || !AllowPainting || m_fInLayout) + return; + + if (!ContinueDeferredScrollWarmupOnIdle(m_deferredScrollWarmupGeneration)) + QueueDeferredScrollWarmup(); + }); + } + + private bool ContinueDeferredScrollWarmupOnIdle(object generationState) + { + if (IsDisposed || !m_fDeferredScrollWarmupPending) + return true; + if (!IsHandleCreated || !Visible || m_rootb == null || !AllowPainting || m_fInLayout) + { + TraceInteractionEvent( + "WarmScrollViewport.IdleDeferred", + $"Control={Name} Action=defer Visible={Visible} InLayout={m_fInLayout} RootBoxNull={m_rootb == null} AllowPainting={AllowPainting}"); + return false; + } + if (m_deferredScrollWarmupTargetTop == int.MinValue || m_deferredScrollWarmupTargetBottom == int.MinValue) + { + TraceInteractionEvent( + "WarmScrollViewport.Bootstrap", + $"Control={Name} Generation={m_deferredScrollWarmupGeneration}"); + WarmScrollViewportIfNeeded(true, true); + return true; + } + + int generation = generationState is int intGeneration ? intGeneration : m_deferredScrollWarmupGeneration; + if (generation != m_deferredScrollWarmupGeneration) + { + TraceInteractionEvent( + "WarmScrollViewport.Cancelled", + $"Control={Name} Reason=stale-generation ScheduledGeneration={generation} CurrentGeneration={m_deferredScrollWarmupGeneration}"); + return true; + } + + if (IsScrollWarmRangeCovered(m_deferredScrollWarmupTargetTop, m_deferredScrollWarmupTargetBottom)) + { + m_fDeferredScrollWarmupPending = false; + TraceInteractionEvent( + "WarmScrollViewport.Complete", + $"Control={Name} Generation={generation} CoveredTop={m_scrollWarmRangeTop} CoveredBottom={m_scrollWarmRangeBottom}"); + return true; + } + + int viewportTop = -ScrollPosition.Y; + int viewportBottom = viewportTop + ClientRectangle.Height; + int chunkPixels = GetScrollWarmupPixels(ScrollWarmupDeferredChunkPercent); + if (chunkPixels <= 0) + { + m_fDeferredScrollWarmupPending = false; + return true; + } + + Stopwatch stopwatch = Stopwatch.StartNew(); + int chunksProcessed = 0; + string stopReason = "covered"; + using (new HoldGraphics(this)) + { + m_fWarmingScrollViewport = true; + try + { + Rectangle rcSrcRoot; + Rectangle rcDstRoot; + GetCoordRects(out rcSrcRoot, out rcDstRoot); + + while (!IsScrollWarmRangeCovered(m_deferredScrollWarmupTargetTop, m_deferredScrollWarmupTargetBottom)) + { + if (chunksProcessed >= ScrollWarmupDeferredMaxChunksPerIdle) + { + stopReason = "chunk-budget"; + break; + } + if (stopwatch.ElapsedMilliseconds >= ScrollWarmupDeferredTimeBudgetMs) + { + stopReason = "time-budget"; + break; + } + + bool warmBottomNext = m_lastScrollWarmDirection >= 0; + if (!WarmDeferredScrollViewportChunk( + rcSrcRoot, + rcDstRoot, + viewportTop, + viewportBottom, + chunkPixels, + warmBottomNext)) + { + m_fDeferredScrollWarmupPending = false; + TraceInteractionEvent( + "WarmScrollViewport.Cancelled", + $"Control={Name} Reason=invalidate Generation={generation} CoveredTop={m_scrollWarmRangeTop} CoveredBottom={m_scrollWarmRangeBottom}"); + return true; + } + + chunksProcessed++; + } + } + finally + { + m_fWarmingScrollViewport = false; + } + } + + m_fDeferredScrollWarmupPending = !IsScrollWarmRangeCovered( + m_deferredScrollWarmupTargetTop, + m_deferredScrollWarmupTargetBottom); + stopwatch.Stop(); + TraceInteractionEvent( + "WarmScrollViewport.IdleChunk", + $"Control={Name} Generation={generation} DurationMs={stopwatch.ElapsedMilliseconds} ChunksProcessed={chunksProcessed} StopReason={(m_fDeferredScrollWarmupPending ? stopReason : "complete")} CoveredTop={m_scrollWarmRangeTop} CoveredBottom={m_scrollWarmRangeBottom} TargetTop={m_deferredScrollWarmupTargetTop} TargetBottom={m_deferredScrollWarmupTargetBottom}"); + return !m_fDeferredScrollWarmupPending; + } + + private bool WarmDeferredScrollViewportChunk(Rectangle rcSrcRoot, Rectangle rcDstRoot, + int viewportTop, int viewportBottom, int chunkPixels, bool warmBottomFirst) + { + if (warmBottomFirst) + { + if (!WarmDeferredScrollViewportChunkForDirection( + rcSrcRoot, + rcDstRoot, + viewportTop, + viewportBottom, + chunkPixels, + true)) + { + return false; + } + + return WarmDeferredScrollViewportChunkForDirection( + rcSrcRoot, + rcDstRoot, + viewportTop, + viewportBottom, + chunkPixels, + false); + } + + if (!WarmDeferredScrollViewportChunkForDirection( + rcSrcRoot, + rcDstRoot, + viewportTop, + viewportBottom, + chunkPixels, + false)) + { + return false; + } + + return WarmDeferredScrollViewportChunkForDirection( + rcSrcRoot, + rcDstRoot, + viewportTop, + viewportBottom, + chunkPixels, + true); + } + + private bool WarmDeferredScrollViewportChunkForDirection(Rectangle rcSrcRoot, Rectangle rcDstRoot, + int viewportTop, int viewportBottom, int chunkPixels, bool warmBottom) + { + if (warmBottom) + { + if (m_scrollWarmRangeBottom >= m_deferredScrollWarmupTargetBottom) + return true; + + int nextBottom = Math.Min(m_deferredScrollWarmupTargetBottom, m_scrollWarmRangeBottom + chunkPixels); + int offset = nextBottom - viewportBottom; + if (PrepareToDrawForScrollWarmup(rcSrcRoot, OffsetRootRect(rcDstRoot, offset)) == VwPrepDrawResult.kxpdrInvalidate) + return false; + + ExpandScrollWarmRange(m_scrollWarmRangeTop, nextBottom); + return true; } + + if (m_scrollWarmRangeTop <= m_deferredScrollWarmupTargetTop) + return true; + + int nextTop = Math.Max(m_deferredScrollWarmupTargetTop, m_scrollWarmRangeTop - chunkPixels); + int topOffset = nextTop - viewportTop; + if (PrepareToDrawForScrollWarmup(rcSrcRoot, OffsetRootRect(rcDstRoot, topOffset)) == VwPrepDrawResult.kxpdrInvalidate) + return false; + + ExpandScrollWarmRange(nextTop, m_scrollWarmRangeBottom); + return true; } /// ----------------------------------------------------------------------------------- @@ -1915,6 +2517,13 @@ public virtual bool RefreshDisplay() if (m_rootb?.Site == null) return false; + if (m_refreshPhase == RefreshPhase.Refreshing) + { + m_fRefreshReplayRequested = true; + m_fRefreshPending = true; + return false; + } + var decorator = m_rootb.DataAccess as DomainDataByFlidDecoratorBase; decorator?.Refresh(); @@ -1926,24 +2535,81 @@ public virtual bool RefreshDisplay() return false; } + // PATH-L5: Skip the expensive selection save/restore and drawing + // suspension when the VwRootBox reports no pending changes. + // The root box's NeedsReconstruct flag is set by PropChanged, + // OnStylesheetChange, and other mutation paths. When false, + // Reconstruct() would be a no-op (PATH-R1), so we can avoid + // the managed overhead entirely. + if (!ShouldReconstructDisplay()) + { + m_fRefreshPending = false; + return false; + } + // Rebuild the display... the drastic way. SelectionRestorer restorer = CreateSelectionRestorer(); try { + m_refreshPhase = RefreshPhase.Refreshing; + m_fRefreshReplayRequested = false; + Stopwatch reconstructStopwatch = null; + if (s_enableInteractionTrace) + reconstructStopwatch = Stopwatch.StartNew(); using (new SuspendDrawing(this)) { m_rootb.Reconstruct(); m_fRefreshPending = false; + m_fForceNextRefreshDisplay = false; + } + if (reconstructStopwatch != null) + { + reconstructStopwatch.Stop(); + TraceInteractionTiming( + "RefreshDisplay.Reconstruct", + reconstructStopwatch.ElapsedMilliseconds, + $"Control={Name} ReplayRequested={m_fRefreshReplayRequested}"); } } finally { + m_refreshPhase = RefreshPhase.Idle; restorer?.Dispose(); + if (m_fRefreshReplayRequested) + QueueRefreshDisplay(); } //Enhance: If all refreshable descendants are handled this should return true return false; } + private void QueueRefreshDisplay() + { + if (m_refreshPhase == RefreshPhase.QueuedForReplay || IsDisposed) + return; + if (!IsHandleCreated) + { + m_fRefreshPending = true; + return; + } + + m_refreshPhase = RefreshPhase.QueuedForReplay; + BeginInvoke((MethodInvoker)delegate + { + m_refreshPhase = RefreshPhase.Idle; + if (IsDisposed) + return; + if (Visible && m_fRootboxMade && m_rootb != null) + RefreshDisplay(); + else + m_fRefreshPending = true; + }); + } + + private bool ShouldReconstructDisplay() + { + return m_fForceNextRefreshDisplay || m_rootb.NeedsReconstruct; + } + /// ------------------------------------------------------------------------------------ /// /// Creates a new selection restorer. @@ -2030,6 +2696,8 @@ public bool AllowPainting Update(); Invalidate(); } + + QueueDeferredScrollWarmup(); } } else @@ -3166,6 +3834,8 @@ protected override void OnVisibleChanged(EventArgs e) base.OnVisibleChanged(e); if (Visible && m_fRootboxMade && m_rootb != null && m_fRefreshPending) RefreshDisplay(); + if (Visible) + QueueDeferredScrollWarmup(); } /// @@ -3733,7 +4403,10 @@ protected override void OnLayout(LayoutEventArgs levent) using (new HoldGraphics(this)) { if (DoLayout()) + { Invalidate(); + QueueDeferredScrollWarmup(); + } } } @@ -5449,6 +6122,13 @@ protected bool UpdateScrollRange(int dxdRange, int dxdPos, int dydRange, int dyd /// ----------------------------------------------------------------------------------- protected virtual bool DoLayout() { + m_fDeferredScrollWarmupPending = true; + m_deferredScrollWarmupGeneration++; + m_deferredScrollWarmupTargetTop = int.MinValue; + m_deferredScrollWarmupTargetBottom = int.MinValue; + m_scrollWarmRangeTop = int.MinValue; + m_scrollWarmRangeBottom = int.MinValue; + if (DesignMode && !AllowPaintingInDesigner) return false; diff --git a/Src/Common/SimpleRootSite/SimpleRootSiteTests/SimpleRootSiteTests_DpiLayout.cs b/Src/Common/SimpleRootSite/SimpleRootSiteTests/SimpleRootSiteTests_DpiLayout.cs new file mode 100644 index 0000000000..9463343bd2 --- /dev/null +++ b/Src/Common/SimpleRootSite/SimpleRootSiteTests/SimpleRootSiteTests_DpiLayout.cs @@ -0,0 +1,62 @@ +// Copyright (c) 2026 SIL International +// This software is licensed under the LGPL, version 2.1 or later +// (http://www.gnu.org/licenses/lgpl-2.1.html) + +using System.Drawing; +using NUnit.Framework; + +namespace SIL.FieldWorks.Common.RootSites.SimpleRootSiteTests +{ + internal class DpiLayoutDummyRootSite : SimpleRootSite + { + internal int LayoutWidth + { + get { return m_dxdLayoutWidth; } + set { m_dxdLayoutWidth = value; } + } + + internal Point CurrentDpi + { + get { return Dpi; } + set { Dpi = value; } + } + } + + [TestFixture] + public class DpiLayoutTests + { + [Test] + public void DpiSetter_DoesNotForceLayout_WhenDpiIsUnchanged() + { + var site = new DpiLayoutDummyRootSite(); + try + { + site.LayoutWidth = 320; + site.CurrentDpi = new Point(96, 96); + + Assert.That(site.LayoutWidth, Is.EqualTo(320)); + } + finally + { + site.Dispose(); + } + } + + [Test] + public void DpiSetter_ForcesLayout_WhenDpiChangesAfterLayout() + { + var site = new DpiLayoutDummyRootSite(); + try + { + site.LayoutWidth = 320; + site.CurrentDpi = new Point(144, 144); + + Assert.That(site.LayoutWidth, Is.EqualTo(SimpleRootSite.kForceLayout)); + } + finally + { + site.Dispose(); + } + } + } +} \ No newline at end of file diff --git a/Src/Common/SimpleRootSite/SimpleRootSiteTests/SimpleRootSiteTests_RefreshDisplayNeedsReconstruct.cs b/Src/Common/SimpleRootSite/SimpleRootSiteTests/SimpleRootSiteTests_RefreshDisplayNeedsReconstruct.cs new file mode 100644 index 0000000000..4c524ccdf8 --- /dev/null +++ b/Src/Common/SimpleRootSite/SimpleRootSiteTests/SimpleRootSiteTests_RefreshDisplayNeedsReconstruct.cs @@ -0,0 +1,152 @@ +// Copyright (c) 2026 SIL International +// This software is licensed under the LGPL, version 2.1 or later +// (http://www.gnu.org/licenses/lgpl-2.1.html) + +using System.Windows.Forms; +using Moq; +using NUnit.Framework; +using SIL.FieldWorks.Common.ViewsInterfaces; +using SIL.LCModel.Core.KernelInterfaces; + +namespace SIL.FieldWorks.Common.RootSites.SimpleRootSiteTests +{ + internal class RefreshDisplayDummyRootSite : DummyRootSite + { + public bool RefreshPending => m_fRefreshPending; + + public void SetRootBoxDataAccessForTest(ISilDataAccess dataAccess) + { + SetRootBoxDataAccess(dataAccess); + } + + public void SetRootBoxDataAccessAndRefreshForTest(ISilDataAccess dataAccess) + { + SetRootBoxDataAccessAndRefresh(dataAccess); + } + + public void NotifyDataAccessSemanticsChangedForTest() + { + NotifyDataAccessSemanticsChanged(); + } + + protected override SelectionRestorer CreateSelectionRestorer() + { + return null; + } + } + + [TestFixture] + public class RefreshDisplayNeedsReconstructTests + { + private RefreshDisplayDummyRootSite m_site; + private Mock m_rootbMock; + private Form m_form; + + [SetUp] + public void Setup() + { + m_site = new RefreshDisplayDummyRootSite(); + m_rootbMock = new Mock(MockBehavior.Strict); + m_form = new Form(); + m_form.Controls.Add(m_site); + m_site.Dock = DockStyle.Fill; + m_form.Show(); + m_site.CreateControl(); + + m_rootbMock.SetupGet(rb => rb.Site).Returns(m_site); + m_rootbMock.SetupGet(rb => rb.DataAccess).Returns((ISilDataAccess)null); + m_rootbMock.Setup(rb => rb.LoseFocus()).Returns(true); + m_rootbMock.Setup(rb => rb.Activate(It.IsAny())); + m_rootbMock.Setup(rb => rb.Close()); + m_site.RootBox = m_rootbMock.Object; + } + + [TearDown] + public void TearDown() + { + m_form?.Close(); + m_form?.Dispose(); + m_site?.Dispose(); + } + + [Test] + public void RefreshDisplay_SkipsReconstruct_WhenRootBoxDoesNotNeedReconstruct() + { + m_rootbMock.SetupGet(rb => rb.NeedsReconstruct).Returns(false); + + Assert.That(m_site.RefreshDisplay(), Is.False); + Assert.That(m_site.RefreshPending, Is.False); + m_rootbMock.Verify(rb => rb.Reconstruct(), Times.Never); + } + + [Test] + public void RefreshDisplay_Reconstructs_WhenRootBoxNeedsReconstruct() + { + m_rootbMock.SetupGet(rb => rb.NeedsReconstruct).Returns(true); + m_rootbMock.Setup(rb => rb.Reconstruct()); + + Assert.That(m_site.RefreshDisplay(), Is.False); + Assert.That(m_site.RefreshPending, Is.False); + m_rootbMock.Verify(rb => rb.Reconstruct(), Times.Once); + } + + [Test] + public void NotifyDataAccessSemanticsChanged_Reconstructs_WhenRootBoxDoesNotNeedReconstruct() + { + m_rootbMock.SetupGet(rb => rb.NeedsReconstruct).Returns(false); + m_rootbMock.Setup(rb => rb.Reconstruct()); + + m_site.NotifyDataAccessSemanticsChangedForTest(); + + Assert.That(m_site.RefreshPending, Is.False); + m_rootbMock.Verify(rb => rb.Reconstruct(), Times.Once); + } + + [Test] + public void NotifyDataAccessSemanticsChanged_DefersUntilVisible() + { + m_rootbMock.SetupGet(rb => rb.NeedsReconstruct).Returns(false); + m_rootbMock.Setup(rb => rb.Reconstruct()); + m_site.Visible = false; + + m_site.NotifyDataAccessSemanticsChangedForTest(); + + Assert.That(m_site.RefreshPending, Is.True); + m_rootbMock.Verify(rb => rb.Reconstruct(), Times.Never); + + m_site.Visible = true; + Assert.That(m_site.RefreshDisplay(), Is.False); + Assert.That(m_site.RefreshPending, Is.False); + m_rootbMock.Verify(rb => rb.Reconstruct(), Times.Once); + } + + [Test] + public void SetRootBoxDataAccess_DoesNotReconstruct_WhenSwapIsCheap() + { + var replacementDataAccess = Mock.Of(); + m_rootbMock.SetupSet(rb => rb.DataAccess = replacementDataAccess); + m_rootbMock.SetupGet(rb => rb.NeedsReconstruct).Returns(false); + + m_site.SetRootBoxDataAccessForTest(replacementDataAccess); + + Assert.That(m_site.RefreshPending, Is.False); + m_rootbMock.VerifySet(rb => rb.DataAccess = replacementDataAccess, Times.Once); + m_rootbMock.Verify(rb => rb.Reconstruct(), Times.Never); + } + + [Test] + public void SetRootBoxDataAccessAndRefresh_Reconstructs_WhenSwapChangesDisplaySemantics() + { + var replacementDataAccess = Mock.Of(); + m_rootbMock.SetupSet(rb => rb.DataAccess = replacementDataAccess); + m_rootbMock.SetupGet(rb => rb.NeedsReconstruct).Returns(false); + m_rootbMock.Setup(rb => rb.Reconstruct()); + + m_site.SetRootBoxDataAccessAndRefreshForTest(replacementDataAccess); + + Assert.That(m_site.RefreshPending, Is.False); + m_rootbMock.VerifySet(rb => rb.DataAccess = replacementDataAccess, Times.Once); + m_rootbMock.Verify(rb => rb.Reconstruct(), Times.Once); + } + } +} diff --git a/Src/LexText/Discourse/DiscourseTests/InterlinRibbonTests.cs b/Src/LexText/Discourse/DiscourseTests/InterlinRibbonTests.cs index f3bc486c6b..2458eb7e74 100644 --- a/Src/LexText/Discourse/DiscourseTests/InterlinRibbonTests.cs +++ b/Src/LexText/Discourse/DiscourseTests/InterlinRibbonTests.cs @@ -7,11 +7,13 @@ using System.Diagnostics; using System.Drawing; using System.Windows.Forms; +using Moq; using NUnit.Framework; using SIL.FieldWorks.Common.FwUtils.Attributes; using SIL.FieldWorks.Common.RootSites; using SIL.FieldWorks.Common.ViewsInterfaces; using SIL.LCModel; +using SIL.LCModel.Core.KernelInterfaces; using SIL.LCModel.DomainServices; using SIL.LCModel.Infrastructure; using XCore; @@ -158,6 +160,37 @@ public void ClickExpansion() m_ribbon.RootBox.MouseUp(1, 1, rcSrc, rcDst); Assert.That(m_ribbon.SelectedOccurrences, Is.EqualTo(new[] { glosses[0] })); } + + [Test] + public void SetRoot_AssignsDecoratorBeforeChangingExistingRootObject() + { + EndSetupTask(); + var orderingRibbon = new OrderingTestInterlinRibbon(Cache, m_stText.Hvo); + var rootbMock = new Mock(MockBehavior.Strict); + var installedDecorator = false; + rootbMock.Setup(rb => rb.Close()); + + rootbMock.SetupSet(rb => rb.DataAccess = It.IsAny()) + .Callback(sda => installedDecorator = ReferenceEquals(sda, orderingRibbon.Decorator)); + rootbMock.Setup(rb => rb.SetRootObject( + m_stText.Hvo, + It.IsAny(), + InterlinRibbon.kfragRibbonWordforms, + orderingRibbon.StyleSheet)) + .Callback(() => Assert.That(installedDecorator, Is.True, + "InterlinRibbon should install its decorator before changing an existing root object")); + + orderingRibbon.InstallRootBoxForTest(rootbMock.Object); + orderingRibbon.SetRoot(m_stText.Hvo); + + rootbMock.VerifySet(rb => rb.DataAccess = It.IsAny(), Times.Once); + rootbMock.Verify(rb => rb.SetRootObject( + m_stText.Hvo, + It.IsAny(), + InterlinRibbon.kfragRibbonWordforms, + orderingRibbon.StyleSheet), Times.Once); + orderingRibbon.Dispose(); + } #endregion } @@ -221,6 +254,11 @@ internal void CallOnLoad(EventArgs eventArgs) base.OnLoad(eventArgs); } + internal void InstallRootBoxForTest(IVwRootBox rootBox) + { + m_rootb = rootBox; + } + protected override void Dispose(bool disposing) { Debug.WriteLineIf(!disposing, "****** Missing Dispose() call for " + GetType() + " ******"); @@ -228,4 +266,21 @@ protected override void Dispose(bool disposing) base.Dispose(disposing); } } + + internal class OrderingTestInterlinRibbon : TestInterlinRibbon + { + public OrderingTestInterlinRibbon(LcmCache cache, int hvoStText) + : base(cache, hvoStText) + { + } + + protected override void SetRootInternal(int hvo) + { + EnsureVc(); + } + + public override void MakeInitialSelection() + { + } + } } diff --git a/Src/LexText/Discourse/InterlinRibbon.cs b/Src/LexText/Discourse/InterlinRibbon.cs index 918706ba31..3b97711151 100644 --- a/Src/LexText/Discourse/InterlinRibbon.cs +++ b/Src/LexText/Discourse/InterlinRibbon.cs @@ -249,7 +249,7 @@ protected void SelectUpTo(int end1) protected override void AddDecorator() { - m_rootb.DataAccess = Decorator; + SetRootBoxDataAccess(Decorator); } public override void SetRoot(int hvoStText) @@ -261,8 +261,8 @@ public override void SetRoot(int hvoStText) if (RootBox == null) return; SetRootInternal(hvoStText); - ChangeOrMakeRoot(HvoRoot, Vc, kfragRibbonWordforms, StyleSheet); AddDecorator(); + ChangeOrMakeRoot(HvoRoot, Vc, kfragRibbonWordforms, StyleSheet); MakeInitialSelection(); } @@ -284,7 +284,7 @@ public override void MakeRoot() Vc.LineChoices = LineChoices; SetRootInternal(HvoRoot); - m_rootb.DataAccess = Decorator; + SetRootBoxDataAccess(Decorator); m_rootb.SetRootObject(HvoRoot, Vc, kfragRibbonWordforms, this.StyleSheet); m_rootb.Activate(VwSelectionState.vssOutOfFocus); // Makes selection visible even before ever got focus. diff --git a/Src/ManagedVwDrawRootBuffered/VwDrawRootBuffered.cs b/Src/ManagedVwDrawRootBuffered/VwDrawRootBuffered.cs index 4abdc1bf23..f44e30e8b6 100644 --- a/Src/ManagedVwDrawRootBuffered/VwDrawRootBuffered.cs +++ b/Src/ManagedVwDrawRootBuffered/VwDrawRootBuffered.cs @@ -3,6 +3,7 @@ // (http://www.gnu.org/licenses/lgpl-2.1.html) using System; +using System.Diagnostics; using System.Drawing; using System.Runtime.InteropServices; using SIL.FieldWorks.Common.ViewsInterfaces; @@ -16,8 +17,11 @@ namespace SIL.FieldWorks.Views /// [ComVisible(true)] [Guid("97199458-10C7-49da-B3AE-EA922EA64859")] - public class VwDrawRootBuffered : IVwDrawRootBuffered + public class VwDrawRootBuffered : IVwDrawRootBuffered, IDisposable { + private GdiMemoryBuffer m_cachedBuffer; + private bool m_isDisposed; + private class GdiMemoryBuffer : IDisposable { public IntPtr HdcMem { get; private set; } @@ -93,6 +97,36 @@ private struct RECT private const int SRCCOPY = 0x00CC0020; private const uint kclrTransparent = 0xC0000000; + private void ReplaceCachedBuffer(GdiMemoryBuffer newBuffer) + { + if (ReferenceEquals(m_cachedBuffer, newBuffer)) + return; + + m_cachedBuffer?.Dispose(); + m_cachedBuffer = newBuffer; + } + + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + ~VwDrawRootBuffered() + { + Dispose(false); + } + + protected virtual void Dispose(bool disposing) + { + if (m_isDisposed) + return; + + m_cachedBuffer?.Dispose(); + m_cachedBuffer = null; + m_isDisposed = true; + } + /// /// See C++ documentation /// @@ -117,7 +151,9 @@ public void DrawTheRoot(IVwRootBox prootb, IntPtr hdc, Rect rcpDraw, uint bkclr, IVwGraphicsWin32 qvg = VwGraphicsWin32Class.Create(); Rectangle rcp = rcpDraw; - using (var memoryBuffer = new GdiMemoryBuffer(hdc, rcp.Width, rcp.Height)) + var memoryBuffer = new GdiMemoryBuffer(hdc, rcp.Width, rcp.Height); + bool keepBuffer = false; + try { IntPtr hdcMem = memoryBuffer.HdcMem; try @@ -184,9 +220,16 @@ public void DrawTheRoot(IVwRootBox prootb, IntPtr hdc, Rect rcpDraw, uint bkclr, if (xpdr != VwPrepDrawResult.kxpdrInvalidate) { + ReplaceCachedBuffer(memoryBuffer); + keepBuffer = true; // We drew something...now blast it onto the screen. BitBlt(hdc, rcp.Left, rcp.Top, rcp.Width, rcp.Height, hdcMem, 0, 0, SRCCOPY); } + else if (m_cachedBuffer != null) + { + Trace.WriteLine("[FW_PERF_INTERACTION] [VwDrawRootBuffered] Stage=ReuseLastFrameOnInvalidate Path=Managed"); + BitBlt(hdc, rcp.Left, rcp.Top, rcp.Width, rcp.Height, m_cachedBuffer.HdcMem, 0, 0, SRCCOPY); + } } catch (Exception) { @@ -200,12 +243,20 @@ public void DrawTheRoot(IVwRootBox prootb, IntPtr hdc, Rect rcpDraw, uint bkclr, qvg.ReleaseDC(); } } + finally + { + if (!keepBuffer) + memoryBuffer.Dispose(); + } } public void ReDrawLastDraw(IntPtr hdc, Rect rcpDraw) { - // TODO-Linux: implement - throw new NotImplementedException(); + if (m_cachedBuffer == null) + throw new NotImplementedException(); + + Rectangle rcp = rcpDraw; + BitBlt(hdc, rcp.Left, rcp.Top, rcp.Width, rcp.Height, m_cachedBuffer.HdcMem, rcp.Left, rcp.Top, SRCCOPY); } /// diff --git a/Src/views/Test/TestLayoutPage.h b/Src/views/Test/TestLayoutPage.h index 6bcea16ea1..390588d0a8 100644 --- a/Src/views/Test/TestLayoutPage.h +++ b/Src/views/Test/TestLayoutPage.h @@ -425,6 +425,27 @@ namespace TestViews unitpp::assert_true("should have found a box", pboxFound != NULL); } + void testConstructAndLayoutUpdatesCachedDpiWhenWidthIsUnchanged() + { + CreateBoringStrings(); + CreateTestStTexts(2); + SetupRootWithoutMargins(); + + const int kdxpLayoutWidth = 200; + CheckHr(m_qvg32->put_XUnitsPerInch(96)); + CheckHr(m_qvg32->put_YUnitsPerInch(96)); + m_qlay->ConstructAndLayout(m_qvg32, kdxpLayoutWidth); + unitpp::assert_eq("initial layout should cache X DPI", 96, m_qlay->DpiSrc().x); + unitpp::assert_eq("initial layout should cache Y DPI", 96, m_qlay->DpiSrc().y); + + CheckHr(m_qvg32->put_XUnitsPerInch(144)); + CheckHr(m_qvg32->put_YUnitsPerInch(144)); + m_qlay->ConstructAndLayout(m_qvg32, kdxpLayoutWidth); + + unitpp::assert_eq("same-width ConstructAndLayout should refresh X DPI", 144, m_qlay->DpiSrc().x); + unitpp::assert_eq("same-width ConstructAndLayout should refresh Y DPI", 144, m_qlay->DpiSrc().y); + } + void testFindPageBreakStuffNoMargins() { CreateBoringStrings(); diff --git a/Src/views/Test/TestViewCaches.h b/Src/views/Test/TestViewCaches.h new file mode 100644 index 0000000000..aaa0193e41 --- /dev/null +++ b/Src/views/Test/TestViewCaches.h @@ -0,0 +1,182 @@ +/*--------------------------------------------------------------------*//*:Ignore this sentence. +Copyright (c) 2026 SIL International +This software is licensed under the LGPL, version 2.1 or later +(http://www.gnu.org/licenses/lgpl-2.1.html) +-------------------------------------------------------------------------------*//*:End Ignore*/ +#ifndef TESTVIEWCACHES_H_INCLUDED +#define TESTVIEWCACHES_H_INCLUDED + +#pragma once + +#include "testViews.h" +#include "ColorStateCache.h" +#include "FontHandleCache.h" + +namespace TestViews +{ + class TestColorStateCache : public unitpp::suite + { + HDC m_hdc; + ColorStateCache m_cache; + + void testApplyOnFirstUse() + { + bool fApplied = m_cache.ApplyIfNeeded(m_hdc, RGB(1, 2, 3), RGB(4, 5, 6), TRANSPARENT); + unitpp::assert_true("First color apply should update", fApplied); + } + + void testNoApplyWhenUnchanged() + { + m_cache.ApplyIfNeeded(m_hdc, RGB(10, 20, 30), RGB(40, 50, 60), OPAQUE); + bool fApplied = m_cache.ApplyIfNeeded(m_hdc, RGB(10, 20, 30), RGB(40, 50, 60), OPAQUE); + unitpp::assert_true("Repeated identical color apply should be skipped", !fApplied); + } + + void testApplyWhenChanged() + { + m_cache.ApplyIfNeeded(m_hdc, RGB(7, 8, 9), RGB(11, 12, 13), TRANSPARENT); + bool fApplied = m_cache.ApplyIfNeeded(m_hdc, RGB(17, 18, 19), RGB(11, 12, 13), TRANSPARENT); + unitpp::assert_true("Changed foreground color should update", fApplied); + } + + void testInvalidateForcesApply() + { + m_cache.ApplyIfNeeded(m_hdc, RGB(1, 1, 1), RGB(2, 2, 2), OPAQUE); + m_cache.Invalidate(); + bool fApplied = m_cache.ApplyIfNeeded(m_hdc, RGB(1, 1, 1), RGB(2, 2, 2), OPAQUE); + unitpp::assert_true("Invalidate should force next apply", fApplied); + } + + public: + TestColorStateCache(); + virtual void Setup() + { + m_hdc = GetTestDC(); + m_cache.Invalidate(); + } + virtual void Teardown() + { + if (m_hdc) + ReleaseTestDC(m_hdc); + m_hdc = NULL; + } + }; + + class TestFontHandleCache : public unitpp::suite + { + struct DeleteTracker + { + Set m_failing; + Vector m_deleted; + }; + + FontHandleCache m_cache; + + static bool TryDeleteForTest(HFONT hfont, void * pContext) + { + DeleteTracker * pTracker = reinterpret_cast(pContext); + if (pTracker->m_failing.IsMember(hfont)) + return false; + pTracker->m_deleted.Push(hfont); + return true; + } + + LgCharRenderProps MakeProps(int n) const + { + LgCharRenderProps chrp; + memset(&chrp, 0, sizeof(chrp)); + chrp.ttvBold = (n & 1) ? kttvForceOn : kttvOff; + chrp.ttvItalic = (n & 2) ? kttvForceOn : kttvOff; + chrp.dympHeight = 10000 + (n * 10); + swprintf_s(chrp.szFaceName, L"CacheFont_%d", n); + return chrp; + } + + void FillToCacheMax(DeleteTracker & tracker) + { + for (int i = 0; i < FontHandleCache::kcFontCacheMax; ++i) + { + HFONT hfont = reinterpret_cast(static_cast(100 + i)); + LgCharRenderProps chrp = MakeProps(i); + m_cache.AddFontToCache(hfont, &chrp, NULL, TryDeleteForTest, &tracker); + } + } + + void testFindCachedFont() + { + DeleteTracker tracker; + HFONT hfont = reinterpret_cast(static_cast(200)); + LgCharRenderProps chrp = MakeProps(1); + m_cache.AddFontToCache(hfont, &chrp, NULL, TryDeleteForTest, &tracker); + HFONT hfontFound = m_cache.FindCachedFont(&chrp); + unitpp::assert_eq("FindCachedFont should return added handle", hfont, hfontFound); + } + + void testEvictionDeletesOldest() + { + DeleteTracker tracker; + FillToCacheMax(tracker); + HFONT hfontNewest = reinterpret_cast(static_cast(999)); + LgCharRenderProps chrp = MakeProps(99); + m_cache.AddFontToCache(hfontNewest, &chrp, NULL, TryDeleteForTest, &tracker); + + unitpp::assert_eq("Cache size should stay bounded", FontHandleCache::kcFontCacheMax, + m_cache.CacheCount()); + unitpp::assert_true("Oldest entry should be deleted on eviction", + tracker.m_deleted.Size() >= 1 && + tracker.m_deleted[tracker.m_deleted.Size() - 1] == reinterpret_cast(static_cast(100))); + } + + void testFailedDeleteIsDeferredAndRetried() + { + DeleteTracker tracker; + HFONT hfontVictim = reinterpret_cast(static_cast(100)); + tracker.m_failing.Insert(hfontVictim); + FillToCacheMax(tracker); + + HFONT hfontNewest = reinterpret_cast(static_cast(1000)); + LgCharRenderProps chrpNewest = MakeProps(100); + m_cache.AddFontToCache(hfontNewest, &chrpNewest, NULL, TryDeleteForTest, &tracker); + + unitpp::assert_eq("Failed delete should queue one deferred font", 1, + m_cache.DeferredDeleteCount()); + unitpp::assert_true("Victim should be in deferred queue", + m_cache.IsDeferredDeleteQueued(hfontVictim)); + + tracker.m_failing.Delete(hfontVictim); + m_cache.TryDeleteDeferredFonts(NULL, TryDeleteForTest, &tracker); + unitpp::assert_eq("Deferred queue should drain after successful retry", 0, + m_cache.DeferredDeleteCount()); + } + + void testDeferredDeleteSkipsActiveFont() + { + DeleteTracker tracker; + HFONT hfontVictim = reinterpret_cast(static_cast(100)); + tracker.m_failing.Insert(hfontVictim); + FillToCacheMax(tracker); + + HFONT hfontNewest = reinterpret_cast(static_cast(1001)); + LgCharRenderProps chrpNewest = MakeProps(101); + m_cache.AddFontToCache(hfontNewest, &chrpNewest, NULL, TryDeleteForTest, &tracker); + tracker.m_failing.Delete(hfontVictim); + + m_cache.TryDeleteDeferredFonts(hfontVictim, TryDeleteForTest, &tracker); + unitpp::assert_eq("Active deferred font should not be deleted", 1, + m_cache.DeferredDeleteCount()); + + m_cache.TryDeleteDeferredFonts(NULL, TryDeleteForTest, &tracker); + unitpp::assert_eq("Deferred queue should delete when no longer active", 0, + m_cache.DeferredDeleteCount()); + } + + public: + TestFontHandleCache(); + virtual void Setup() + { + m_cache = FontHandleCache(); + } + }; +} + +#endif // TESTVIEWCACHES_H_INCLUDED diff --git a/Src/views/Test/TestViews.vcxproj b/Src/views/Test/TestViews.vcxproj index c495982749..033270aa47 100644 --- a/Src/views/Test/TestViews.vcxproj +++ b/Src/views/Test/TestViews.vcxproj @@ -180,6 +180,8 @@ $(ViewsObjDir)VwSelection.obj; $(ViewsObjDir)VwTableBox.obj; $(ViewsObjDir)VwGraphics.obj; + $(ViewsObjDir)FontHandleCache.obj; + $(ViewsObjDir)ColorStateCache.obj; $(ViewsObjDir)VwTxtSrc.obj; $(ViewsObjDir)AfColorTable.obj; $(ViewsObjDir)AfGfx.obj; @@ -308,6 +310,8 @@ $(ViewsObjDir)VwSelection.obj; $(ViewsObjDir)VwTableBox.obj; $(ViewsObjDir)VwGraphics.obj; + $(ViewsObjDir)FontHandleCache.obj; + $(ViewsObjDir)ColorStateCache.obj; $(ViewsObjDir)VwTxtSrc.obj; $(ViewsObjDir)AfColorTable.obj; $(ViewsObjDir)AfGfx.obj; @@ -395,6 +399,7 @@ + @@ -426,11 +431,11 @@ - - diff --git a/Src/views/Test/TestVwRootBox.h b/Src/views/Test/TestVwRootBox.h index 71c16d46d5..c4ba1d66c8 100644 --- a/Src/views/Test/TestVwRootBox.h +++ b/Src/views/Test/TestVwRootBox.h @@ -1237,6 +1237,674 @@ namespace TestViews qrootb->Close(); } + void testSetRootObjectReconstructsConstructedView() + { + class SwitchingRootVc : public DummyBaseVc + { + public: + STDMETHOD(Display)(IVwEnv * pvwenv, HVO hvo, int frag) + { + switch (frag) + { + case 1: + pvwenv->OpenDiv(); + pvwenv->OpenParagraph(); + pvwenv->AddStringProp(kflidStTxtPara_Contents, NULL); + pvwenv->CloseParagraph(); + pvwenv->CloseDiv(); + break; + case 2: + pvwenv->OpenDiv(); + pvwenv->OpenParagraph(); + pvwenv->AddStringProp(kflidStTxtPara_Contents, NULL); + pvwenv->CloseParagraph(); + pvwenv->OpenParagraph(); + pvwenv->AddStringProp(kflidStTxtPara_Contents, NULL); + pvwenv->CloseParagraph(); + pvwenv->CloseDiv(); + break; + default: + return E_INVALIDARG; + } + return S_OK; + } + }; + + ITsStrFactoryPtr qtsf; + qtsf.CreateInstance(CLSID_TsStrFactory); + IVwCacheDaPtr qcda; + qcda.CreateInstance(CLSID_VwCacheDa); + qcda->putref_TsStrFactory(qtsf); + ISilDataAccessPtr qsda; + CheckHr(qcda->QueryInterface(IID_ISilDataAccess, (void **)&qsda)); + CheckHr(qsda->putref_WritingSystemFactory(g_qwsf)); + + IRenderEngineFactoryPtr qref; + qref.Attach(NewObj MockRenderEngineFactory); + + ITsStringPtr qtss; + StrUni stuPara(L"Short paragraph text"); + CheckHr(qtsf->MakeString(stuPara.Bstr(), g_wsEng, &qtss)); + HVO hvoPara = 1; + CheckHr(qcda->CacheStringProp(hvoPara, kflidStTxtPara_Contents, qtss)); + + IVwRootBoxPtr qrootb; + VwRootBox::CreateCom(NULL, IID_IVwRootBox, (void **)&qrootb); + IVwGraphicsWin32Ptr qvg32; + HDC hdc = 0; + try + { + qvg32.CreateInstance(CLSID_VwGraphicsWin32); + hdc = GetTestDC(); + CheckHr(qvg32->Initialize(hdc)); + + IVwViewConstructorPtr qvc; + qvc.Attach(NewObj SwitchingRootVc()); + CheckHr(qrootb->putref_DataAccess(qsda)); + CheckHr(qrootb->putref_RenderEngineFactory(qref)); + CheckHr(qrootb->putref_TsStrFactory(qtsf)); + CheckHr(qrootb->SetRootObject(hvoPara, qvc, 1, NULL)); + + DummyRootSitePtr qdrs; + qdrs.Attach(NewObj DummyRootSite()); + Rect rcSrc(0, 0, 96, 96); + qdrs->SetRects(rcSrc, rcSrc); + qdrs->SetGraphics(qvg32); + CheckHr(qrootb->SetSite(qdrs)); + + CheckHr(qrootb->Layout(qvg32, 300)); + int dySinglePara = 0; + CheckHr(qrootb->get_Height(&dySinglePara)); + unitpp::assert_true("single-paragraph height should be positive", dySinglePara > 0); + + ComBool fNeedsReconstruct = true; + CheckHr(qrootb->get_NeedsReconstruct(&fNeedsReconstruct)); + unitpp::assert_false("layout should clear reconstruct flag", fNeedsReconstruct); + + // This is the PATH-R1 regression: switching fragments on an already-constructed root + // must rebuild immediately even when the caller does not issue another explicit Layout(). + CheckHr(qrootb->SetRootObject(hvoPara, qvc, 2, NULL)); + + int dyTwoParas = 0; + CheckHr(qrootb->get_Height(&dyTwoParas)); + VwRootBox * prootb = dynamic_cast(qrootb.Ptr()); + VwDivBox * pdivRoot = dynamic_cast(prootb); + unitpp::assert_true("root should be a div box", pdivRoot != NULL); + VwDivBox * pdivInner = dynamic_cast(pdivRoot->FirstBox()); + unitpp::assert_true("root should contain an inner div after fragment change", pdivInner != NULL); + unitpp::assert_true("fragment change should produce a second paragraph", + pdivInner->FirstBox() != NULL && pdivInner->FirstBox()->Next() != NULL); + unitpp::assert_true("changing the root fragment should rebuild the view immediately", + dyTwoParas > dySinglePara); + + CheckHr(qrootb->get_NeedsReconstruct(&fNeedsReconstruct)); + unitpp::assert_false("successful reconstruct should clear reconstruct flag", fNeedsReconstruct); + } + catch(...) + { + if (qvg32) + qvg32->ReleaseDC(); + if (hdc != 0) + ReleaseTestDC(hdc); + qrootb->Close(); + throw; + } + + qvg32->ReleaseDC(); + ReleaseTestDC(hdc); + qrootb->Close(); + } + + void testPropChangedDirtiesConstructedView() + { + class SimpleParagraphVc : public DummyBaseVc + { + public: + STDMETHOD(Display)(IVwEnv * pvwenv, HVO hvo, int frag) + { + pvwenv->OpenDiv(); + pvwenv->OpenParagraph(); + pvwenv->AddStringProp(kflidStTxtPara_Contents, NULL); + pvwenv->CloseParagraph(); + pvwenv->CloseDiv(); + return S_OK; + } + }; + + ITsStrFactoryPtr qtsf; + qtsf.CreateInstance(CLSID_TsStrFactory); + IVwCacheDaPtr qcda; + qcda.CreateInstance(CLSID_VwCacheDa); + qcda->putref_TsStrFactory(qtsf); + ISilDataAccessPtr qsda; + CheckHr(qcda->QueryInterface(IID_ISilDataAccess, (void **)&qsda)); + CheckHr(qsda->putref_WritingSystemFactory(g_qwsf)); + + ITsStringPtr qtss; + StrUni stuPara(L"Paragraph before PropChanged"); + CheckHr(qtsf->MakeString(stuPara.Bstr(), g_wsEng, &qtss)); + HVO hvoPara = 1; + CheckHr(qcda->CacheStringProp(hvoPara, kflidStTxtPara_Contents, qtss)); + + IRenderEngineFactoryPtr qref; + qref.Attach(NewObj MockRenderEngineFactory); + + IVwRootBoxPtr qrootb; + VwRootBox::CreateCom(NULL, IID_IVwRootBox, (void **)&qrootb); + IVwGraphicsWin32Ptr qvg32; + HDC hdc = 0; + try + { + qvg32.CreateInstance(CLSID_VwGraphicsWin32); + hdc = GetTestDC(); + CheckHr(qvg32->Initialize(hdc)); + + IVwViewConstructorPtr qvc; + qvc.Attach(NewObj SimpleParagraphVc()); + CheckHr(qrootb->putref_DataAccess(qsda)); + CheckHr(qrootb->putref_RenderEngineFactory(qref)); + CheckHr(qrootb->putref_TsStrFactory(qtsf)); + CheckHr(qrootb->SetRootObject(hvoPara, qvc, 1, NULL)); + + DummyRootSitePtr qdrs; + qdrs.Attach(NewObj DummyRootSite()); + Rect rcSrc(0, 0, 96, 96); + qdrs->SetRects(rcSrc, rcSrc); + qdrs->SetGraphics(qvg32); + CheckHr(qrootb->SetSite(qdrs)); + + CheckHr(qrootb->Layout(qvg32, 300)); + ComBool fNeedsReconstruct = true; + CheckHr(qrootb->get_NeedsReconstruct(&fNeedsReconstruct)); + unitpp::assert_false("layout should clear reconstruct flag before PropChanged", fNeedsReconstruct); + + StrUni stuUpdated(L"Paragraph after PropChanged"); + CheckHr(qtsf->MakeString(stuUpdated.Bstr(), g_wsEng, &qtss)); + CheckHr(qcda->CacheStringProp(hvoPara, kflidStTxtPara_Contents, qtss)); + CheckHr(qrootb->PropChanged(hvoPara, kflidStTxtPara_Contents, 0, 0, 0)); + + CheckHr(qrootb->get_NeedsReconstruct(&fNeedsReconstruct)); + unitpp::assert_true("PropChanged should dirty reconstruct state on a constructed view", fNeedsReconstruct); + } + catch(...) + { + if (qvg32) + qvg32->ReleaseDC(); + if (hdc != 0) + ReleaseTestDC(hdc); + qrootb->Close(); + throw; + } + + qvg32->ReleaseDC(); + ReleaseTestDC(hdc); + qrootb->Close(); + } + + void testPutrefOverlayRelayoutsWithoutDirtyingConstructedView() + { + class TaggedParagraphVc : public DummyBaseVc + { + public: + STDMETHOD(Display)(IVwEnv * pvwenv, HVO hvo, int frag) + { + pvwenv->OpenDiv(); + pvwenv->OpenMappedTaggedPara(); + pvwenv->AddStringProp(kflidStTxtPara_Contents, NULL); + pvwenv->CloseParagraph(); + pvwenv->CloseDiv(); + return S_OK; + } + }; + + class OverlayAwareRootSite : public DummyRootSite + { + public: + int m_cOverlayChanges; + + OverlayAwareRootSite() + : m_cOverlayChanges(0) + { + } + + STDMETHOD(OverlayChanged)(IVwRootBox * prootb, IVwOverlay * pvo) + { + ++m_cOverlayChanges; + return S_OK; + } + }; + + ITsStrFactoryPtr qtsf; + qtsf.CreateInstance(CLSID_TsStrFactory); + IVwCacheDaPtr qcda; + qcda.CreateInstance(CLSID_VwCacheDa); + qcda->putref_TsStrFactory(qtsf); + ISilDataAccessPtr qsda; + CheckHr(qcda->QueryInterface(IID_ISilDataAccess, (void **)&qsda)); + CheckHr(qsda->putref_WritingSystemFactory(g_qwsf)); + + IRenderEngineFactoryPtr qref; + qref.Attach(NewObj MockRenderEngineFactory); + + ITsStringPtr qtss; + StrUni stuPara(L"Tagged paragraph text"); + CheckHr(qtsf->MakeString(stuPara.Bstr(), g_wsEng, &qtss)); + HVO hvoPara = 1; + CheckHr(qcda->CacheStringProp(hvoPara, kflidStTxtPara_Contents, qtss)); + + IVwRootBoxPtr qrootb; + VwRootBox::CreateCom(NULL, IID_IVwRootBox, (void **)&qrootb); + IVwGraphicsWin32Ptr qvg32; + HDC hdc = 0; + try + { + qvg32.CreateInstance(CLSID_VwGraphicsWin32); + hdc = GetTestDC(); + CheckHr(qvg32->Initialize(hdc)); + + IVwViewConstructorPtr qvc; + qvc.Attach(NewObj TaggedParagraphVc()); + CheckHr(qrootb->putref_DataAccess(qsda)); + CheckHr(qrootb->putref_RenderEngineFactory(qref)); + CheckHr(qrootb->putref_TsStrFactory(qtsf)); + CheckHr(qrootb->SetRootObject(hvoPara, qvc, 1, NULL)); + + OverlayAwareRootSite * pdrs = NewObj OverlayAwareRootSite(); + DummyRootSitePtr qdrs; + qdrs.Attach(pdrs); + Rect rcSrc(0, 0, 96, 96); + qdrs->SetRects(rcSrc, rcSrc); + qdrs->SetGraphics(qvg32); + CheckHr(qrootb->SetSite(qdrs)); + + CheckHr(qrootb->Layout(qvg32, 300)); + ComBool fNeedsReconstruct = true; + CheckHr(qrootb->get_NeedsReconstruct(&fNeedsReconstruct)); + unitpp::assert_false("layout should clear reconstruct flag before overlay changes", fNeedsReconstruct); + + IVwOverlayPtr qvo; + VwOverlay::CreateCom(NULL, IID_IVwOverlay, (void **)&qvo); + + CheckHr(qrootb->putref_Overlay(qvo)); + + IVwOverlayPtr qvoRoundTrip; + CheckHr(qrootb->get_Overlay(&qvoRoundTrip)); + unitpp::assert_eq("root box should retain the installed overlay", qvo.Ptr(), qvoRoundTrip.Ptr()); + unitpp::assert_eq("site should be notified of overlay changes", 1, pdrs->m_cOverlayChanges); + + CheckHr(qrootb->get_NeedsReconstruct(&fNeedsReconstruct)); + unitpp::assert_false("putref_Overlay should remain on the relayout-only path", fNeedsReconstruct); + } + catch(...) + { + if (qvg32) + qvg32->ReleaseDC(); + if (hdc != 0) + ReleaseTestDC(hdc); + qrootb->Close(); + throw; + } + + qvg32->ReleaseDC(); + ReleaseTestDC(hdc); + qrootb->Close(); + } + + void testPutrefDataAccessDoesNotImplicitlyDirtyConstructedView() + { + class SimpleParagraphVc : public DummyBaseVc + { + public: + STDMETHOD(Display)(IVwEnv * pvwenv, HVO hvo, int frag) + { + pvwenv->OpenDiv(); + pvwenv->OpenParagraph(); + pvwenv->AddStringProp(kflidStTxtPara_Contents, NULL); + pvwenv->CloseParagraph(); + pvwenv->CloseDiv(); + return S_OK; + } + }; + + ITsStrFactoryPtr qtsf; + qtsf.CreateInstance(CLSID_TsStrFactory); + IVwCacheDaPtr qcda1; + qcda1.CreateInstance(CLSID_VwCacheDa); + qcda1->putref_TsStrFactory(qtsf); + ISilDataAccessPtr qsda1; + CheckHr(qcda1->QueryInterface(IID_ISilDataAccess, (void **)&qsda1)); + CheckHr(qsda1->putref_WritingSystemFactory(g_qwsf)); + + IVwCacheDaPtr qcda2; + qcda2.CreateInstance(CLSID_VwCacheDa); + qcda2->putref_TsStrFactory(qtsf); + ISilDataAccessPtr qsda2; + CheckHr(qcda2->QueryInterface(IID_ISilDataAccess, (void **)&qsda2)); + CheckHr(qsda2->putref_WritingSystemFactory(g_qwsf)); + + ITsStringPtr qtss; + StrUni stuPara(L"DataAccess baseline text"); + CheckHr(qtsf->MakeString(stuPara.Bstr(), g_wsEng, &qtss)); + HVO hvoPara = 1; + CheckHr(qcda1->CacheStringProp(hvoPara, kflidStTxtPara_Contents, qtss)); + CheckHr(qcda2->CacheStringProp(hvoPara, kflidStTxtPara_Contents, qtss)); + + IRenderEngineFactoryPtr qref; + qref.Attach(NewObj MockRenderEngineFactory); + + IVwRootBoxPtr qrootb; + VwRootBox::CreateCom(NULL, IID_IVwRootBox, (void **)&qrootb); + IVwGraphicsWin32Ptr qvg32; + HDC hdc = 0; + try + { + qvg32.CreateInstance(CLSID_VwGraphicsWin32); + hdc = GetTestDC(); + CheckHr(qvg32->Initialize(hdc)); + + IVwViewConstructorPtr qvc; + qvc.Attach(NewObj SimpleParagraphVc()); + CheckHr(qrootb->putref_DataAccess(qsda1)); + CheckHr(qrootb->putref_RenderEngineFactory(qref)); + CheckHr(qrootb->putref_TsStrFactory(qtsf)); + CheckHr(qrootb->SetRootObject(hvoPara, qvc, 1, NULL)); + + DummyRootSitePtr qdrs; + qdrs.Attach(NewObj DummyRootSite()); + Rect rcSrc(0, 0, 96, 96); + qdrs->SetRects(rcSrc, rcSrc); + qdrs->SetGraphics(qvg32); + CheckHr(qrootb->SetSite(qdrs)); + + CheckHr(qrootb->Layout(qvg32, 300)); + ComBool fNeedsReconstruct = true; + CheckHr(qrootb->get_NeedsReconstruct(&fNeedsReconstruct)); + unitpp::assert_false("layout should clear reconstruct flag before DataAccess swaps", fNeedsReconstruct); + + CheckHr(qrootb->putref_DataAccess(qsda2)); + + CheckHr(qrootb->get_NeedsReconstruct(&fNeedsReconstruct)); + unitpp::assert_false("putref_DataAccess should remain a cheap wiring operation", fNeedsReconstruct); + } + catch(...) + { + if (qvg32) + qvg32->ReleaseDC(); + if (hdc != 0) + ReleaseTestDC(hdc); + qrootb->Close(); + throw; + } + + qvg32->ReleaseDC(); + ReleaseTestDC(hdc); + qrootb->Close(); + } + + void testStylesheetChangeDirtiesConstructedView() + { + class SimpleParagraphVc : public DummyBaseVc + { + public: + STDMETHOD(Display)(IVwEnv * pvwenv, HVO hvo, int frag) + { + pvwenv->OpenDiv(); + pvwenv->OpenParagraph(); + pvwenv->AddStringProp(kflidStTxtPara_Contents, NULL); + pvwenv->CloseParagraph(); + pvwenv->CloseDiv(); + return S_OK; + } + }; + + ITsStrFactoryPtr qtsf; + qtsf.CreateInstance(CLSID_TsStrFactory); + IVwCacheDaPtr qcda; + qcda.CreateInstance(CLSID_VwCacheDa); + qcda->putref_TsStrFactory(qtsf); + ISilDataAccessPtr qsda; + CheckHr(qcda->QueryInterface(IID_ISilDataAccess, (void **)&qsda)); + CheckHr(qsda->putref_WritingSystemFactory(g_qwsf)); + + ITsStringPtr qtss; + StrUni stuPara(L"Styled paragraph text"); + CheckHr(qtsf->MakeString(stuPara.Bstr(), g_wsEng, &qtss)); + HVO hvoPara = 1; + CheckHr(qcda->CacheStringProp(hvoPara, kflidStTxtPara_Contents, qtss)); + + IRenderEngineFactoryPtr qref; + qref.Attach(NewObj MockRenderEngineFactory); + + IVwStylesheetPtr qss; + VwStylesheet::CreateCom(NULL, IID_IVwStylesheet, (void **)&qss); + + IVwRootBoxPtr qrootb; + VwRootBox::CreateCom(NULL, IID_IVwRootBox, (void **)&qrootb); + IVwGraphicsWin32Ptr qvg32; + HDC hdc = 0; + try + { + qvg32.CreateInstance(CLSID_VwGraphicsWin32); + hdc = GetTestDC(); + CheckHr(qvg32->Initialize(hdc)); + + IVwViewConstructorPtr qvc; + qvc.Attach(NewObj SimpleParagraphVc()); + CheckHr(qrootb->putref_DataAccess(qsda)); + CheckHr(qrootb->putref_RenderEngineFactory(qref)); + CheckHr(qrootb->putref_TsStrFactory(qtsf)); + CheckHr(qrootb->SetRootObject(hvoPara, qvc, 1, qss)); + + DummyRootSitePtr qdrs; + qdrs.Attach(NewObj DummyRootSite()); + Rect rcSrc(0, 0, 96, 96); + qdrs->SetRects(rcSrc, rcSrc); + qdrs->SetGraphics(qvg32); + CheckHr(qrootb->SetSite(qdrs)); + + CheckHr(qrootb->Layout(qvg32, 300)); + ComBool fNeedsReconstruct = true; + CheckHr(qrootb->get_NeedsReconstruct(&fNeedsReconstruct)); + unitpp::assert_false("layout should clear reconstruct flag before stylesheet changes", fNeedsReconstruct); + + CheckHr(qrootb->OnStylesheetChange()); + + CheckHr(qrootb->get_NeedsReconstruct(&fNeedsReconstruct)); + unitpp::assert_true("stylesheet changes should dirty reconstruct state even after relayout", fNeedsReconstruct); + } + catch(...) + { + if (qvg32) + qvg32->ReleaseDC(); + if (hdc != 0) + ReleaseTestDC(hdc); + qrootb->Close(); + throw; + } + + qvg32->ReleaseDC(); + ReleaseTestDC(hdc); + qrootb->Close(); + } + + void testLayoutUpdatesCachedDpiWhenWidthIsUnchanged() + { + class SimpleParagraphVc : public DummyBaseVc + { + public: + STDMETHOD(Display)(IVwEnv * pvwenv, HVO hvo, int frag) + { + pvwenv->OpenDiv(); + pvwenv->OpenParagraph(); + pvwenv->AddStringProp(kflidStTxtPara_Contents, NULL); + pvwenv->CloseParagraph(); + pvwenv->CloseDiv(); + return S_OK; + } + }; + + ITsStrFactoryPtr qtsf; + qtsf.CreateInstance(CLSID_TsStrFactory); + IVwCacheDaPtr qcda; + qcda.CreateInstance(CLSID_VwCacheDa); + qcda->putref_TsStrFactory(qtsf); + ISilDataAccessPtr qsda; + CheckHr(qcda->QueryInterface(IID_ISilDataAccess, (void **)&qsda)); + CheckHr(qsda->putref_WritingSystemFactory(g_qwsf)); + + ITsStringPtr qtss; + StrUni stuPara(L"Paragraph for DPI cache regression"); + CheckHr(qtsf->MakeString(stuPara.Bstr(), g_wsEng, &qtss)); + HVO hvoPara = 1; + CheckHr(qcda->CacheStringProp(hvoPara, kflidStTxtPara_Contents, qtss)); + + IRenderEngineFactoryPtr qref; + qref.Attach(NewObj MockRenderEngineFactory); + + IVwRootBoxPtr qrootb; + VwRootBox::CreateCom(NULL, IID_IVwRootBox, (void **)&qrootb); + IVwGraphicsWin32Ptr qvg32; + HDC hdc = 0; + try + { + qvg32.CreateInstance(CLSID_VwGraphicsWin32); + hdc = GetTestDC(); + CheckHr(qvg32->Initialize(hdc)); + + IVwViewConstructorPtr qvc; + qvc.Attach(NewObj SimpleParagraphVc()); + CheckHr(qrootb->putref_DataAccess(qsda)); + CheckHr(qrootb->putref_RenderEngineFactory(qref)); + CheckHr(qrootb->putref_TsStrFactory(qtsf)); + CheckHr(qrootb->SetRootObject(hvoPara, qvc, 1, NULL)); + + DummyRootSitePtr qdrs; + qdrs.Attach(NewObj DummyRootSite()); + Rect rcSrc(0, 0, 96, 96); + qdrs->SetRects(rcSrc, rcSrc); + qdrs->SetGraphics(qvg32); + CheckHr(qrootb->SetSite(qdrs)); + + CheckHr(qvg32->put_XUnitsPerInch(96)); + CheckHr(qvg32->put_YUnitsPerInch(96)); + CheckHr(qrootb->Layout(qvg32, 300)); + + VwRootBox * prootb = dynamic_cast(qrootb.Ptr()); + unitpp::assert_true("expected concrete VwRootBox", prootb != NULL); + unitpp::assert_eq("initial layout should cache the starting X DPI", 96, prootb->DpiSrc().x); + unitpp::assert_eq("initial layout should cache the starting Y DPI", 96, prootb->DpiSrc().y); + + CheckHr(qvg32->put_XUnitsPerInch(144)); + CheckHr(qvg32->put_YUnitsPerInch(144)); + CheckHr(qrootb->Layout(qvg32, 300)); + + unitpp::assert_eq("same-width layout should still refresh cached X DPI", 144, prootb->DpiSrc().x); + unitpp::assert_eq("same-width layout should still refresh cached Y DPI", 144, prootb->DpiSrc().y); + } + catch(...) + { + if (qvg32) + qvg32->ReleaseDC(); + if (hdc != 0) + ReleaseTestDC(hdc); + qrootb->Close(); + throw; + } + + qvg32->ReleaseDC(); + ReleaseTestDC(hdc); + qrootb->Close(); + } + + void testLayoutWithChangedWidthRelayoutsWithoutDirtyingConstructedView() + { + class SimpleParagraphVc : public DummyBaseVc + { + public: + STDMETHOD(Display)(IVwEnv * pvwenv, HVO hvo, int frag) + { + pvwenv->OpenDiv(); + pvwenv->OpenParagraph(); + pvwenv->AddStringProp(kflidStTxtPara_Contents, NULL); + pvwenv->CloseParagraph(); + pvwenv->CloseDiv(); + return S_OK; + } + }; + + ITsStrFactoryPtr qtsf; + qtsf.CreateInstance(CLSID_TsStrFactory); + IVwCacheDaPtr qcda; + qcda.CreateInstance(CLSID_VwCacheDa); + qcda->putref_TsStrFactory(qtsf); + ISilDataAccessPtr qsda; + CheckHr(qcda->QueryInterface(IID_ISilDataAccess, (void **)&qsda)); + CheckHr(qsda->putref_WritingSystemFactory(g_qwsf)); + + ITsStringPtr qtss; + StrUni stuPara(L"A paragraph with enough repeated words to wrap differently when the available width shrinks substantially in a relayout-only scenario."); + CheckHr(qtsf->MakeString(stuPara.Bstr(), g_wsEng, &qtss)); + HVO hvoPara = 1; + CheckHr(qcda->CacheStringProp(hvoPara, kflidStTxtPara_Contents, qtss)); + + IRenderEngineFactoryPtr qref; + qref.Attach(NewObj MockRenderEngineFactory); + + IVwRootBoxPtr qrootb; + VwRootBox::CreateCom(NULL, IID_IVwRootBox, (void **)&qrootb); + IVwGraphicsWin32Ptr qvg32; + HDC hdc = 0; + try + { + qvg32.CreateInstance(CLSID_VwGraphicsWin32); + hdc = GetTestDC(); + CheckHr(qvg32->Initialize(hdc)); + + IVwViewConstructorPtr qvc; + qvc.Attach(NewObj SimpleParagraphVc()); + CheckHr(qrootb->putref_DataAccess(qsda)); + CheckHr(qrootb->putref_RenderEngineFactory(qref)); + CheckHr(qrootb->putref_TsStrFactory(qtsf)); + CheckHr(qrootb->SetRootObject(hvoPara, qvc, 1, NULL)); + + DummyRootSitePtr qdrs; + qdrs.Attach(NewObj DummyRootSite()); + Rect rcSrc(0, 0, 96, 96); + qdrs->SetRects(rcSrc, rcSrc); + qdrs->SetGraphics(qvg32); + CheckHr(qrootb->SetSite(qdrs)); + + CheckHr(qrootb->Layout(qvg32, 300)); + int dyWide = 0; + CheckHr(qrootb->get_Height(&dyWide)); + + ComBool fNeedsReconstruct = true; + CheckHr(qrootb->get_NeedsReconstruct(&fNeedsReconstruct)); + unitpp::assert_false("layout should clear reconstruct flag before width-driven relayout", fNeedsReconstruct); + + CheckHr(qrootb->Layout(qvg32, 120)); + int dyNarrow = 0; + CheckHr(qrootb->get_Height(&dyNarrow)); + + unitpp::assert_true("narrower layout should relayout to a taller height", dyNarrow > dyWide); + CheckHr(qrootb->get_NeedsReconstruct(&fNeedsReconstruct)); + unitpp::assert_false("width-driven relayout should stay on the relayout-only path", fNeedsReconstruct); + } + catch(...) + { + if (qvg32) + qvg32->ReleaseDC(); + if (hdc != 0) + ReleaseTestDC(hdc); + qrootb->Close(); + throw; + } + + qvg32->ReleaseDC(); + ReleaseTestDC(hdc); + qrootb->Close(); + } + public: TestVwRootBox(); diff --git a/Src/views/Views.idh b/Src/views/Views.idh index b052958cc9..d4a07d57df 100644 --- a/Src/views/Views.idh +++ b/Src/views/Views.idh @@ -1712,6 +1712,14 @@ Last reviewed: // Pass in the repository that will be used to get spell-checkers. HRESULT SetSpellingRepository( [in] IGetSpellChecker * pgsp); + + // PATH-L5: Tells whether this root box needs a Reconstruct. + // When true, data or structural changes have occurred since the last + // Reconstruct completed. Managed callers (e.g. SimpleRootSite.RefreshDisplay) + // can check this to skip selection save/restore and drawing suspension + // overhead when no reconstruction is actually needed. + [propget] HRESULT NeedsReconstruct( + [out, retval] ComBool * pfNeeds); } #ifndef NO_COCLASSES diff --git a/Src/views/Views.mak b/Src/views/Views.mak index fd633d1513..556a8936e4 100644 --- a/Src/views/Views.mak +++ b/Src/views/Views.mak @@ -61,6 +61,8 @@ OBJ_VIEWS=\ $(INT_DIR)\autopch\VwSelection.obj\ $(INT_DIR)\autopch\VwTableBox.obj\ $(INT_DIR)\autopch\VwGraphics.obj\ + $(INT_DIR)\autopch\FontHandleCache.obj\ + $(INT_DIR)\autopch\ColorStateCache.obj\ $(INT_DIR)\autopch\VwTxtSrc.obj\ $(INT_DIR)\autopch\ModuleEntry.obj\ $(INT_DIR)\autopch\AfColorTable.obj\ diff --git a/Src/views/ViewsGlobals.cpp b/Src/views/ViewsGlobals.cpp index e657887355..da41fddf93 100644 --- a/Src/views/ViewsGlobals.cpp +++ b/Src/views/ViewsGlobals.cpp @@ -12,6 +12,11 @@ Last reviewed: -------------------------------------------------------------------------------*//*:End Ignore*/ #include "Main.h" +#include "VwRenderTrace.h" + +#ifdef TRACING_RENDER +FILE * g_fpRenderTrace = NULL; +#endif // Nothing should directly reference this. static ViewsGlobals g_views; diff --git a/Src/views/VwLayoutStream.cpp b/Src/views/VwLayoutStream.cpp index fdb43dedb5..b26b24653a 100644 --- a/Src/views/VwLayoutStream.cpp +++ b/Src/views/VwLayoutStream.cpp @@ -29,11 +29,13 @@ DEFINE_THIS_FILE VwLayoutStream::VwLayoutStream(VwPropertyStore * pzvps) : VwRootBox(pzvps) { + m_dxsLayoutWidth = -1; } // Protected default constructor used for CreateCom VwLayoutStream::VwLayoutStream() : VwRootBox() { + m_dxsLayoutWidth = -1; } @@ -42,15 +44,17 @@ VwLayoutStream::~VwLayoutStream() } /*---------------------------------------------------------------------------------------------- - Ensure that the view is constructed and laid out at our specified width (TODO: and DPI). + Ensure that the view is constructed and laid out at our specified width and source DPI. ----------------------------------------------------------------------------------------------*/ void VwLayoutStream::ConstructAndLayout(IVwGraphics * pvg, int dxsAvailWidth) { // Todo: Layout should delete all pages if the width changed. if (!m_fConstructed) Construct(pvg, dxsAvailWidth); // Does NOT lay out to this width. - // Todo: also save and check the dpi of the VwGraphics. Layout if changed. - if (m_dxsLayoutWidth != dxsAvailWidth) + int dpiX, dpiY; + CheckHr(pvg->get_XUnitsPerInch(&dpiX)); + CheckHr(pvg->get_YUnitsPerInch(&dpiY)); + if (m_dxsLayoutWidth != dxsAvailWidth || m_ptDpiSrc.x != dpiX || m_ptDpiSrc.y != dpiY) Layout(pvg, dxsAvailWidth); } diff --git a/Src/views/VwPropertyStore.cpp b/Src/views/VwPropertyStore.cpp index 20a047f005..40e74a9107 100644 --- a/Src/views/VwPropertyStore.cpp +++ b/Src/views/VwPropertyStore.cpp @@ -43,6 +43,25 @@ static int g_rgnFontSizes[] = { // kvfsSmaller and kvfsLarger don't have absolute values static int knDefaultFontSize = 10000; // 10 point default +// Returns the lfQuality value to use for LOGFONT creation. +// If the FW_FONT_QUALITY env var is set to a valid value (0-6), that value is used. +// This allows tests to force ANTIALIASED_QUALITY (4) for deterministic rendering. +static BYTE GetFontQualityOverride() +{ + static BYTE s_quality = []() -> BYTE { + wchar_t buf[16] = {}; + DWORD len = ::GetEnvironmentVariableW(L"FW_FONT_QUALITY", buf, _countof(buf)); + if (len > 0 && len < _countof(buf)) + { + int val = _wtoi(buf); + if (val >= 0 && val <= 6) + return static_cast(val); + } + return DRAFT_QUALITY; + }(); + return s_quality; +} + // The order of these is signficant--it is the order the font properties are recorded in // for each writing system, in the wsStyle string. // A copy of this list is in VwPropertyStore.cpp -- the two lists must be kept in sync. @@ -358,7 +377,7 @@ int VwPropertyStore::AdjustedLineHeight(VwPropertyStore * pzvpsLeaf, int * pdymp lf.lfCharSet = DEFAULT_CHARSET; // let name determine it; WS should specify valid lf.lfOutPrecision = OUT_TT_ONLY_PRECIS; // only work with TrueType fonts lf.lfClipPrecision = CLIP_DEFAULT_PRECIS; // ?? - lf.lfQuality = DRAFT_QUALITY; // I (JohnT) don't think this matters for TrueType fonts. + lf.lfQuality = GetFontQualityOverride(); lf.lfPitchAndFamily = 0; // must be zero for EnumFontFamiliesEx wcscpy_s(lf.lfFaceName, LF_FACESIZE, pchrp->szFaceName); qzvpsWithWsAndFont->Unlock(); @@ -513,16 +532,28 @@ void VwPropertyStore::InitChrp() ILgWritingSystemPtr qws; if (!m_chrp.ws) CheckHr(m_qwsf->get_UserWs(&m_chrp.ws)); // Get default writing system id. - Assert(m_chrp.ws); - CheckHr(m_qwsf->get_EngineOrNull(m_chrp.ws, &qws)); - AssertPtr(qws); - ComBool fRtl; - CheckHr(qws->get_RightToLeftScript(&fRtl)); - m_chrp.fWsRtl = (bool)fRtl; - m_chrp.nDirDepth = (fRtl) ? 1 : 0; + // A ws of 0 can arrive during PropChanged-driven box rebuilds when + // a view constructor emits runs without an explicit writing system, + // or when get_UserWs fails to provide a valid ws. + // get_EngineOrNull may also return null for an unknown ws. + if (m_chrp.ws) + CheckHr(m_qwsf->get_EngineOrNull(m_chrp.ws, &qws)); + AssertPtrN(qws); // null is recoverable — default to LTR below + ComBool fRtl = false; // default LTR for unknown/zero ws + if (qws) + { + CheckHr(qws->get_RightToLeftScript(&fRtl)); + m_chrp.fWsRtl = (bool)fRtl; + m_chrp.nDirDepth = (fRtl) ? 1 : 0; - // Interpret any magic font names. - CheckHr(qws->InterpretChrp(&m_chrp)); + // Interpret any magic font names. + CheckHr(qws->InterpretChrp(&m_chrp)); + } + else + { + m_chrp.fWsRtl = false; + m_chrp.nDirDepth = 0; + } // Other fields in m_chrp have the exact same meaning as the corresponding property, // and are already used to store it. @@ -1328,14 +1359,18 @@ STDMETHODIMP VwPropertyStore::put_IntProperty(int tpt, int xpv, int nValue) if (m_chrp.ws != nValue) { m_chrp.ws = nValue; - Assert(m_chrp.ws); + // A ws of 0 can arrive during PropChanged-driven box rebuilds when + // a view constructor emits runs without an explicit writing system. + // This is recoverable — we default to LTR below. // Recompute m_chrp.fRtl and m_chrp.nDirDepth EnsureWritingSystemFactory(); ILgWritingSystemPtr qws; - CheckHr(m_qwsf->get_EngineOrNull(m_chrp.ws, &qws)); - AssertPtr(qws); - ComBool fRtl; - if (qws) // If by some chance we're trying to use an unknown WS, default to LTR. + if (m_chrp.ws) + CheckHr(m_qwsf->get_EngineOrNull(m_chrp.ws, &qws)); + // An unknown or zero ws yields a null engine; default to LTR. + AssertPtrN(qws); + ComBool fRtl = false; // default LTR for unknown/zero ws + if (qws) CheckHr(qws->get_RightToLeftScript(&fRtl)); m_chrp.fWsRtl = (bool)fRtl; m_chrp.nDirDepth = (fRtl) ? 1 : 0; diff --git a/Src/views/VwRenderTrace.h b/Src/views/VwRenderTrace.h new file mode 100644 index 0000000000..71a554b044 --- /dev/null +++ b/Src/views/VwRenderTrace.h @@ -0,0 +1,169 @@ +/*--------------------------------------------------------------------*//*:Ignore this sentence. +Copyright (c) 2026 SIL International +This software is licensed under the LGPL, version 2.1 or later +(http://www.gnu.org/licenses/lgpl-2.1.html) +-------------------------------------------------------------------------------*//*:End Ignore*/ +#pragma once +#ifndef VWRENDERTRACE_INCLUDED +#define VWRENDERTRACE_INCLUDED + +#include +#include + +/*---------------------------------------------------------------------------------------------- + Render trace timing infrastructure for Views engine performance analysis. + + Usage: + #ifdef TRACING_RENDER + VwRenderTraceTimer timer("Layout"); + // ... do layout work ... + timer.Stop(); // or let destructor handle it + #endif + + Output format (compatible with RenderTraceParser): + [RENDER] Stage=Layout Duration=123.45ms Context=VwRootBox + + Enable by defining TRACING_RENDER before including this header. + The output goes to OutputDebugString and optionally to a file. + + Hungarian: rtt (render trace timer) +----------------------------------------------------------------------------------------------*/ + +// Uncomment to enable render tracing globally for debug builds +// #define TRACING_RENDER + +#ifdef TRACING_RENDER + +// File output for render trace (optional - set to NULL to disable file output) +// Can be opened via VwRenderTrace::OpenTraceFile() +extern FILE * g_fpRenderTrace; + +/*---------------------------------------------------------------------------------------------- +Class: VwRenderTrace +Description: Static helper for render trace configuration and output. +----------------------------------------------------------------------------------------------*/ +class VwRenderTrace +{ +public: + // Open a trace file for persistent logging + static bool OpenTraceFile(const wchar_t * pszPath) + { + if (g_fpRenderTrace) + CloseTraceFile(); + + _wfopen_s(&g_fpRenderTrace, pszPath, L"a"); + return g_fpRenderTrace != NULL; + } + + // Close the trace file + static void CloseTraceFile() + { + if (g_fpRenderTrace) + { + fclose(g_fpRenderTrace); + g_fpRenderTrace = NULL; + } + } + + // Write a trace message + static void Write(const char * pszFormat, ...) + { + char szBuffer[1024]; + va_list args; + va_start(args, pszFormat); + vsprintf_s(szBuffer, sizeof(szBuffer), pszFormat, args); + va_end(args); + + ::OutputDebugStringA(szBuffer); + if (g_fpRenderTrace) + { + fputs(szBuffer, g_fpRenderTrace); + fflush(g_fpRenderTrace); + } + } + + // Check if tracing is enabled at runtime + static bool IsEnabled() + { + // Could check environment variable or registry here + return true; + } +}; + +/*---------------------------------------------------------------------------------------------- +Class: VwRenderTraceTimer +Description: RAII timer for automatic stage duration measurement. +Hungarian: rtt +----------------------------------------------------------------------------------------------*/ +class VwRenderTraceTimer +{ +public: + VwRenderTraceTimer(const char * pszStageName, const char * pszContext = NULL) + : m_pszStageName(pszStageName) + , m_pszContext(pszContext) + , m_fStopped(false) + { + if (VwRenderTrace::IsEnabled()) + { + QueryPerformanceCounter(&m_liStart); + } + } + + ~VwRenderTraceTimer() + { + if (!m_fStopped && VwRenderTrace::IsEnabled()) + { + Stop(); + } + } + + void Stop() + { + if (m_fStopped || !VwRenderTrace::IsEnabled()) + return; + + m_fStopped = true; + + LARGE_INTEGER liEnd, liFreq; + QueryPerformanceCounter(&liEnd); + QueryPerformanceFrequency(&liFreq); + + double durationMs = static_cast(liEnd.QuadPart - m_liStart.QuadPart) * 1000.0 + / static_cast(liFreq.QuadPart); + + if (m_pszContext) + { + VwRenderTrace::Write("[RENDER] Stage=%s Duration=%.3fms Context=%s\r\n", + m_pszStageName, durationMs, m_pszContext); + } + else + { + VwRenderTrace::Write("[RENDER] Stage=%s Duration=%.3fms\r\n", + m_pszStageName, durationMs); + } + } + +private: + const char * m_pszStageName; + const char * m_pszContext; + LARGE_INTEGER m_liStart; + bool m_fStopped; +}; + +// Convenience macros for conditional tracing +#define VWRENDERTRACE_CONCAT_INNER(a, b) a##b +#define VWRENDERTRACE_CONCAT(a, b) VWRENDERTRACE_CONCAT_INNER(a, b) +#define RENDER_TRACE_TIMER(name) VwRenderTraceTimer VWRENDERTRACE_CONCAT(__rtt_, __LINE__)(name) +#define RENDER_TRACE_TIMER_CTX(name, ctx) VwRenderTraceTimer VWRENDERTRACE_CONCAT(__rtt_, __LINE__)(name, ctx) +#define RENDER_TRACE_MSG(fmt, ...) VwRenderTrace::Write(fmt, ##__VA_ARGS__) + +#else // !TRACING_RENDER + +// No-op macros when tracing is disabled +#define RENDER_TRACE_TIMER(name) ((void)0) +#define RENDER_TRACE_TIMER_CTX(name, ctx) ((void)0) +#define RENDER_TRACE_MSG(fmt, ...) ((void)0) + +#endif // TRACING_RENDER + +#endif // VWRENDERTRACE_INCLUDED diff --git a/Src/views/VwRootBox.cpp b/Src/views/VwRootBox.cpp index d3599d47ea..4c087c0d66 100644 --- a/Src/views/VwRootBox.cpp +++ b/Src/views/VwRootBox.cpp @@ -1,4 +1,4 @@ -/*--------------------------------------------------------------------*//*:Ignore this sentence. +/*--------------------------------------------------------------------*//*:Ignore this sentence. Copyright (c) 1999-2019 SIL International This software is licensed under the LGPL, version 2.1 or later (http://www.gnu.org/licenses/lgpl-2.1.html) @@ -37,6 +37,21 @@ const CLSID CLSID_ViewInputManager = {0x830BAF1F, 0x6F84, 0x46EF, {0xB6, 0x3E, 0 //:> Forward declarations //:>******************************************************************************************** +namespace +{ + void DeleteMemoryDcAndBitmap(HDC hdcMem) + { + if (!hdcMem) + return; + + HBITMAP hbmp = (HBITMAP)::GetCurrentObject(hdcMem, OBJ_BITMAP); + BOOL fSuccess = AfGdi::DeleteObjectBitmap(hbmp); + Assert(fSuccess); + fSuccess = AfGdi::DeleteDC(hdcMem); + Assert(fSuccess); + } +} + //:>******************************************************************************************** //:> Local Constants and static variables //:>******************************************************************************************** @@ -66,6 +81,9 @@ void VwRootBox::Init() m_fInDrag = false; m_hrSegmentError = S_OK; m_cMaxParasToScan = 4; + m_fNeedsLayout = true; + m_dxLastLayoutWidth = -1; + m_fNeedsReconstruct = true; // Usually set in Layout method, but some tests don't do this... // play safe also for any code called before Layout. m_ptDpiSrc.x = 96; @@ -193,6 +211,9 @@ STDMETHODIMP VwRootBox::PropChanged(HVO hvo, PropTag tag, int ivMin, int cvIns, { BEGIN_COM_METHOD; + // Any data change makes a subsequent Reconstruct() valid work. + m_fNeedsReconstruct = true; + int ivMinDisp; if (m_qsda) { @@ -318,7 +339,10 @@ STDMETHODIMP VwRootBox::SetRootObjects(HVO * prghvo, IVwViewConstructor ** prgpv m_chvoRoot = chvo; m_qss = pss; if (m_fConstructed) + { + m_fNeedsReconstruct = true; // root data changed — ensure PATH-R1 guard allows reconstruction CheckHr(Reconstruct()); + } END_COM_METHOD(g_fact, IID_IVwRootBox); } @@ -397,7 +421,10 @@ STDMETHODIMP VwRootBox::putref_Overlay(IVwOverlay * pvo) m_qvo = pvo; m_qvrs->OverlayChanged(this, m_qvo); if (m_fConstructed) + { + m_fNeedsLayout = true; // overlay changes may affect layout LayoutFull(); + } END_COM_METHOD(g_fact, IID_IVwRootBox); } @@ -2488,10 +2515,27 @@ STDMETHODIMP VwRootBox::get_IsPropChangedInProgress(ComBool * pfInProgress) BEGIN_COM_METHOD; ChkComArgPtr(pfInProgress); - *pfInProgress = m_fIsPropChangedInProgress; + *pfInProgress = m_fIsPropChangedInProgress ? true : false; END_COM_METHOD(g_fact, IID_IVwRootBox); } + +/*---------------------------------------------------------------------------------------------- + PATH-L5: Reports whether this root box needs a full Reconstruct. + Returns true when data or structural changes (PropChanged, OnStylesheetChange, etc.) + have occurred since the last Reconstruct. Managed callers can use this to skip the + overhead of selection save/restore and drawing suspension when nothing has changed. +----------------------------------------------------------------------------------------------*/ +STDMETHODIMP VwRootBox::get_NeedsReconstruct(ComBool * pfNeeds) +{ + BEGIN_COM_METHOD; + ChkComArgPtr(pfNeeds); + + *pfNeeds = m_fNeedsReconstruct ? true : false; + + END_COM_METHOD(g_fact, IID_IVwRootBox); +} + /*---------------------------------------------------------------------------------------------- Discard all your notifiers. In case this happens during a sequence of PropChanged calls, mark them all as deleted. @@ -2576,6 +2620,7 @@ void VwRootBox::Reconstruct(bool fCheckForSync) Invalidate(); // new InvalidateRect(&vwrect); //old + m_fNeedsReconstruct = false; // reconstruction complete } /*---------------------------------------------------------------------------------------------- @@ -2601,9 +2646,15 @@ STDMETHODIMP VwRootBox::OnStylesheetChange() if (!m_fConstructed || Style() == NULL) return S_OK; // no Style() object exists to fix. (I think the second condition above is redundant, but play safe.) // Redraw the boxes based on stylesheet changes. + // This is intentionally nontrivial: LayoutFull() is enough to keep the current display + // usable, but a stylesheet change can also invalidate construction-time state such as + // notifier/property-store assumptions. Leave m_fNeedsReconstruct set so later callers + // like SimpleRootSite.RefreshDisplay() can still observe that a full rebuild may be needed. + m_fNeedsReconstruct = true; // style changes warrant reconstruction Style()->InitRootTextProps(m_vqvwvc.Size() == 0 ? NULL : m_vqvwvc[0]); Style()->RecomputeEffects(); + m_fNeedsLayout = true; // style changes invalidate layout LayoutFull(); return S_OK; @@ -2691,6 +2742,7 @@ STDMETHODIMP VwRootBox::SetTableColWidths(VwLength * prgvlen, int cvlen) pbox = pbox->NextOrLazy(); } } + m_fNeedsLayout = true; LayoutFull(); END_COM_METHOD(g_fact, IID_IVwRootBox); @@ -2838,12 +2890,23 @@ STDMETHODIMP VwRootBox::Layout(IVwGraphics * pvg, int dxAvailWidth) int dpiX, dpiY; CheckHr(pvg->get_XUnitsPerInch(&dpiX)); CheckHr(pvg->get_YUnitsPerInch(&dpiY)); + + // PATH-L1 guard: skip full layout when the box tree is already laid out at this width + // and source DPI, and no structural mutation has occurred since the last successful layout. + if (m_fConstructed && !m_fNeedsLayout && dxAvailWidth == m_dxLastLayoutWidth + && dpiX == m_ptDpiSrc.x && dpiY == m_ptDpiSrc.y) + return S_OK; + m_ptDpiSrc.x = dpiX; m_ptDpiSrc.y = dpiY; if (!m_fConstructed) Construct(pvg, dxAvailWidth); VwDivBox::DoLayout(pvg, dxAvailWidth, -1, true); + + // Layout succeeded — cache the width and clear the dirty flag. + m_fNeedsLayout = false; + m_dxLastLayoutWidth = dxAvailWidth; #ifdef ENABLE_TSF if (m_qvim) CheckHr(m_qvim->OnLayoutChange()); @@ -4140,6 +4203,16 @@ void VwRootBox::RelayoutRoot(IVwGraphics * pvg, FixupMap * pfixmap, int dxpAvail int dyOld = FieldHeight(); int dxOld = Width(); RelayoutCore(pvg, dxAvailWidth, this, pfixmap, -1, NULL, pboxsetDeleted); + + // Incremental relayout succeeded — update layout guard state. + int dpiX, dpiY; + CheckHr(pvg->get_XUnitsPerInch(&dpiX)); + CheckHr(pvg->get_YUnitsPerInch(&dpiY)); + m_ptDpiSrc.x = dpiX; + m_ptDpiSrc.y = dpiY; + m_fNeedsLayout = false; + m_dxLastLayoutWidth = dxAvailWidth; + if (dyOld != FieldHeight() || dxOld != Width() || dyOld2 != Height()) CheckHr(m_qvrs->RootBoxSizeChanged(this)); } @@ -4189,6 +4262,11 @@ void VwRootBox::Construct(IVwGraphics * pvg, int dxAvailWidth) // about everything being closed, etc... qvwenv->Cleanup(); m_fConstructed = true; + m_fNeedsLayout = true; // newly-constructed boxes require layout + m_fNeedsReconstruct = false; // construction complete — no need to reconstruct + // until PropChanged, OnStylesheetChange, or another mutation sets the flag. + // Previously this was left true from Init, causing the first Reconstruct() + // call to redo all work even when no data had changed (PATH-R1 guard bug). ResetSpellCheck(); // in case it somehow got called while we had no contents. } @@ -4885,40 +4963,22 @@ STDMETHODIMP VwDrawRootBuffered::DrawTheRoot(IVwRootBox * prootb, HDC hdc, RECT IVwGraphicsWin32Ptr qvg32; Rect rcp(rcpDraw); CheckHr(qvg->QueryInterface(IID_IVwGraphicsWin32, (void **) &qvg32)); - - // Clean up any previous cached bitmap and DC - if (m_hdcMem) - { - HBITMAP hbmpCached = (HBITMAP)::GetCurrentObject(m_hdcMem, OBJ_BITMAP); - if (hbmpCached) - { - BOOL fSuccessBitmap = AfGdi::DeleteObjectBitmap(hbmpCached); - Assert(fSuccessBitmap); - (void)fSuccessBitmap; // Suppress C4189 warning in Release builds - } - BOOL fSuccessDC = AfGdi::DeleteDC(m_hdcMem); - Assert(fSuccessDC); - (void)fSuccessDC; // Suppress C4189 warning in Release builds - m_hdcMem = 0; - } - - // Create a new memory DC and bitmap for double buffering - m_hdcMem = AfGdi::CreateCompatibleDC(hdc); - HBITMAP hbmp = AfGdi::CreateCompatibleBitmap(hdc, rcp.Width(), rcp.Height()); - Assert(hbmp); - HBITMAP hbmpOld = AfGdi::SelectObjectBitmap(m_hdcMem, hbmp); + HDC hdcPrevious = m_hdcMem; + HDC hdcNew = AfGdi::CreateCompatibleDC(hdc); + HBITMAP hbmpNew = AfGdi::CreateCompatibleBitmap(hdc, rcp.Width(), rcp.Height()); + Assert(hbmpNew); + HBITMAP hbmpOld = AfGdi::SelectObjectBitmap(hdcNew, hbmpNew); Assert(hbmpOld && hbmpOld != HGDI_ERROR); (void)hbmpOld; // Suppress C4189 warning in Release builds (variable only used in Assert) - // We don't delete hbmpOld (the stock bitmap from the DC) - // The new bitmap (hbmp) will stay selected in m_hdcMem for caching + bool fPromotedCache = false; if (bkclr == kclrTransparent) // if the background color is transparent, copy the current screen area in to the // bitmap buffer as our background - ::BitBlt(m_hdcMem, 0, 0, rcp.Width(), rcp.Height(), hdc, rcp.left, rcp.top, SRCCOPY); + ::BitBlt(hdcNew, 0, 0, rcp.Width(), rcp.Height(), hdc, rcp.left, rcp.top, SRCCOPY); else - AfGfx::FillSolidRect(m_hdcMem, Rect(0, 0, rcp.Width(), rcp.Height()), bkclr); - CheckHr(qvg32->Initialize(m_hdcMem)); + AfGfx::FillSolidRect(hdcNew, Rect(0, 0, rcp.Width(), rcp.Height()), bkclr); + CheckHr(qvg32->Initialize(hdcNew)); VwPrepDrawResult xpdr = kxpdrAdjust; IVwGraphicsPtr qvgDummy; // Required for GetGraphics calls to get transform rects @@ -4985,10 +5045,24 @@ STDMETHODIMP VwDrawRootBuffered::DrawTheRoot(IVwRootBox * prootb, HDC hdc, RECT if (xpdr != kxpdrInvalidate) { + DeleteMemoryDcAndBitmap(hdcPrevious); + m_hdcMem = hdcNew; + hdcNew = 0; + fPromotedCache = true; // We drew something...now blast it onto the screen. // The bitmap in m_hdcMem is kept around for potential ReDrawLastDraw calls. ::BitBlt(hdc, rcp.left, rcp.top, rcp.Width(), rcp.Height(), m_hdcMem, 0, 0, SRCCOPY); } + else if (hdcPrevious) + { + ::BitBlt(hdc, rcp.left, rcp.top, rcp.Width(), rcp.Height(), hdcPrevious, 0, 0, SRCCOPY); + } + + if (!fPromotedCache) + { + DeleteMemoryDcAndBitmap(hdcNew); + m_hdcMem = hdcPrevious; + } END_COM_METHOD(g_factVDRB, IID_IVwRootBox); } diff --git a/Src/views/VwRootBox.h b/Src/views/VwRootBox.h index 4c8c634863..2b01bd5d2b 100644 --- a/Src/views/VwRootBox.h +++ b/Src/views/VwRootBox.h @@ -198,6 +198,8 @@ class VwRootBox : public IVwRootBox, public IServiceProvider, public VwDivBox STDMETHOD(SetSpellingRepository)(IGetSpellChecker * pgsp); + STDMETHOD(get_NeedsReconstruct)(ComBool * pfNeeds); + // IServiceProvider methods STDMETHOD(QueryService)(REFGUID guidService, REFIID riid, void ** ppv); @@ -398,6 +400,15 @@ class VwRootBox : public IVwRootBox, public IServiceProvider, public VwDivBox bool m_fConstructed; // true when we have called Construct() successfully. + // PATH-L1 layout guard: skip redundant full-layout passes when width and source DPI + // haven't changed and no structural mutation has occurred since the last successful Layout(). + bool m_fNeedsLayout; // true when internal state requires a full relayout + int m_dxLastLayoutWidth; // width used for last successful Layout(), -1 if none + + // PATH-R1 reconstruct guard: skip redundant Reconstruct() calls when no data + // or structural change has occurred since the last successful construction. + bool m_fNeedsReconstruct; // true when data changed and full rebuild is warranted + ISilDataAccessPtr m_qsda; // data access object, for getting and setting properties IVwOverlayPtr m_qvo; // controls overlay/tagging behavior for all text @@ -433,7 +444,7 @@ class VwRootBox : public IVwRootBox, public IServiceProvider, public VwDivBox // When it changes, we try to increase laziness. int m_ydTopLastDraw; - Point m_ptDpiSrc; // x and y resolutions of most recent Layout. + Point m_ptDpiSrc; // x and y resolutions of most recent successful Layout/Relayout. StrUni m_stuAccessibleName; diff --git a/Src/views/VwTextBoxes.cpp b/Src/views/VwTextBoxes.cpp index c3c55766dd..5e46be52cf 100644 --- a/Src/views/VwTextBoxes.cpp +++ b/Src/views/VwTextBoxes.cpp @@ -19,12 +19,16 @@ Last reviewed: Not yet. #include "Main.h" #pragma hdrstop // any other headers (not precompiled) +#include "lib/LayoutCache.h" +#include "VwRenderTrace.h" using namespace std; #undef THIS_FILE DEFINE_THIS_FILE +__declspec(thread) LayoutPassCache * g_pCurrentLayoutPassCache = NULL; + // #define _DEBUG_SHOW_BOX /*********************************************************************************************** @@ -793,6 +797,10 @@ typedef enum class ParaBuilder { public: // we can make anything public since the whole class is private to this file + ParaBuilder() : m_pPrevLayoutPassCache(NULL) + { + } + ParaBuilderState m_zpbs; // state of the builder, controls next step in MainLoop() VwParagraphBox * m_pvpbox; // the thing we are laying out. @@ -916,6 +924,8 @@ class ParaBuilder int m_dyTagBelow; // extra height to insert below lines for closing tags bool m_fSemiTagging; // displaying styles on text itself but not the tags IVwOverlay * m_pxvo; + LayoutPassCache m_layoutPassCache; + LayoutPassCache * m_pPrevLayoutPassCache; // Picture box we are trying to fit into line VwPictureBox * m_pboxpic; @@ -1187,6 +1197,8 @@ class ParaBuilder } Assert(!(fComplete && pboxStartLayout)); m_pvpbox = pvpbox; + m_layoutPassCache.Reset(); + m_pPrevLayoutPassCache = SetCurrentLayoutPassCache(&m_layoutPassCache); m_pboxOriginalFirst = m_pvpbox->FirstBox(); // Need to set the first box of the paragraph to null. This is needed since we can call // EditableSubStringAt() while laying out the paragraph (possibly trying to get an @@ -1591,6 +1603,22 @@ class ParaBuilder ------------------------------------------------------------------------------------------*/ virtual ~ParaBuilder() { + LayoutPassCache * pLayoutPassCache = GetCurrentLayoutPassCache(); + if (pLayoutPassCache) + { + RENDER_TRACE_MSG("[RENDER] Stage=LayoutPassCache AnalysisReq=%d AnalysisHit=%d AnalysisMiss=%d AnalysisEvict=%d AnalysisMissMs=%lu ShapeReq=%d ShapeHit=%d ShapeMiss=%d ShapeEvict=%d ShapeMissMs=%lu\r\n", + pLayoutPassCache->AnalysisCache().RequestCount(), + pLayoutPassCache->AnalysisCache().HitCount(), + pLayoutPassCache->AnalysisCache().MissCount(), + pLayoutPassCache->AnalysisCache().EvictionCount(), + pLayoutPassCache->AnalysisCache().ComputeMs(), + pLayoutPassCache->ShapeCache().RequestCount(), + pLayoutPassCache->ShapeCache().HitCount(), + pLayoutPassCache->ShapeCache().MissCount(), + pLayoutPassCache->ShapeCache().EvictionCount(), + pLayoutPassCache->ShapeCache().ComputeMs()); + } + SetCurrentLayoutPassCache(m_pPrevLayoutPassCache); Assert(m_vmpbox.Size() == 0); // Delete any discarded string boxes that have not been reused while (m_psboxReusable) diff --git a/Src/views/lib/ColorStateCache.cpp b/Src/views/lib/ColorStateCache.cpp new file mode 100644 index 0000000000..44767b719e --- /dev/null +++ b/Src/views/lib/ColorStateCache.cpp @@ -0,0 +1,47 @@ +/*-----------------------------------------------------------------------*//*:Ignore in Surveyor +Copyright (c) 2026 SIL International +This software is licensed under the LGPL, version 2.1 or later +(http://www.gnu.org/licenses/lgpl-2.1.html) +-------------------------------------------------------------------------------*//*:End Ignore*/ + +#include "main.h" +#pragma hdrstop + +#include "ColorStateCache.h" + +ColorStateCache::ColorStateCache() +{ + Invalidate(); +} + +void ColorStateCache::Invalidate() +{ + m_clrForeCache = CLR_INVALID; + m_clrBackCache = CLR_INVALID; + m_nBkModeCache = -1; + m_fColorCacheValid = false; +} + +bool ColorStateCache::ApplyIfNeeded(HDC hdc, COLORREF clrForeNeeded, COLORREF clrBackNeeded, + int nBkModeNeeded) +{ + if (!m_fColorCacheValid + || clrForeNeeded != m_clrForeCache + || clrBackNeeded != m_clrBackCache + || nBkModeNeeded != m_nBkModeCache) + { + SmartPalette spal(hdc); + bool fOK = (AfGfx::SetTextColor(hdc, clrForeNeeded) != CLR_INVALID); + fOK = fOK && (AfGfx::SetBkColor(hdc, clrBackNeeded) != CLR_INVALID); + fOK = fOK && ::SetBkMode(hdc, nBkModeNeeded); + (void)fOK; + + m_clrForeCache = clrForeNeeded; + m_clrBackCache = clrBackNeeded; + m_nBkModeCache = nBkModeNeeded; + m_fColorCacheValid = true; + return true; + } + + return false; +} diff --git a/Src/views/lib/ColorStateCache.h b/Src/views/lib/ColorStateCache.h new file mode 100644 index 0000000000..cd8ef52130 --- /dev/null +++ b/Src/views/lib/ColorStateCache.h @@ -0,0 +1,25 @@ +/*--------------------------------------------------------------------*//*:Ignore this sentence. +Copyright (c) 2026 SIL International +This software is licensed under the LGPL, version 2.1 or later +(http://www.gnu.org/licenses/lgpl-2.1.html) +-------------------------------------------------------------------------------*//*:End Ignore*/ +#pragma once +#ifndef COLORSTATECACHE_INCLUDED +#define COLORSTATECACHE_INCLUDED + +class ColorStateCache +{ +public: + ColorStateCache(); + + void Invalidate(); + bool ApplyIfNeeded(HDC hdc, COLORREF clrForeNeeded, COLORREF clrBackNeeded, int nBkModeNeeded); + +private: + COLORREF m_clrForeCache; + COLORREF m_clrBackCache; + int m_nBkModeCache; + bool m_fColorCacheValid; +}; + +#endif // COLORSTATECACHE_INCLUDED diff --git a/Src/views/lib/FontHandleCache.cpp b/Src/views/lib/FontHandleCache.cpp new file mode 100644 index 0000000000..f69b6b6727 --- /dev/null +++ b/Src/views/lib/FontHandleCache.cpp @@ -0,0 +1,165 @@ +/*-----------------------------------------------------------------------*//*:Ignore in Surveyor +Copyright (c) 2026 SIL International +This software is licensed under the LGPL, version 2.1 or later +(http://www.gnu.org/licenses/lgpl-2.1.html) +-------------------------------------------------------------------------------*//*:End Ignore*/ + +#include "main.h" +#pragma hdrstop + +#include "FontHandleCache.h" + +#include +template Vector; // VecHfont; + +FontHandleCache::FontHandleCache() +{ + m_cfceUsed = 0; + memset(m_rgfce, 0, sizeof(m_rgfce)); +} + +HFONT FontHandleCache::FindCachedFont(const LgCharRenderProps * pchrp) const +{ + const int cbFontOffset = (int)offsetof(LgCharRenderProps, ttvBold); + const int cbFontSize = isizeof(LgCharRenderProps) - cbFontOffset; + + for (int i = 0; i < m_cfceUsed; i++) + { + if (m_rgfce[i].fUsed && + memcmp(((byte *)pchrp) + cbFontOffset, + ((byte *)&m_rgfce[i].chrp) + cbFontOffset, + cbFontSize) == 0) + { + return m_rgfce[i].hfont; + } + } + return NULL; +} + +void FontHandleCache::AddFontToCache(HFONT hfont, const LgCharRenderProps * pchrp, + HFONT hfontActive, TryDeleteFontProc pfnTryDelete, void * pDeleteContext) +{ + TryDeleteDeferredFonts(hfontActive, pfnTryDelete, pDeleteContext); + + if (m_cfceUsed >= kcFontCacheMax) + { + int iEvict = 0; + HFONT hfontEvicted = m_rgfce[iEvict].hfont; + if (hfontEvicted == hfontActive) + { + Assert(false); + for (int i = 1; i < m_cfceUsed; ++i) + { + if (m_rgfce[i].hfont && m_rgfce[i].hfont != hfontActive) + { + iEvict = i; + hfontEvicted = m_rgfce[iEvict].hfont; + break; + } + } + } + if (hfontEvicted == hfontActive) + { + Assert(false); + return; + } + if (hfontEvicted) + { + bool fDeleted = pfnTryDelete ? pfnTryDelete(hfontEvicted, pDeleteContext) : true; + if (!fDeleted) + QueueFontForDeferredDelete(hfontEvicted); + } + if (iEvict < m_cfceUsed - 1) + { + memmove(&m_rgfce[iEvict], &m_rgfce[iEvict + 1], + (m_cfceUsed - iEvict - 1) * sizeof(FontCacheEntry)); + } + m_cfceUsed--; + } + + m_rgfce[m_cfceUsed].hfont = hfont; + m_rgfce[m_cfceUsed].chrp = *pchrp; + m_rgfce[m_cfceUsed].fUsed = true; + m_cfceUsed++; +} + +void FontHandleCache::QueueFontForDeferredDelete(HFONT hfont) +{ + if (!hfont) + return; + + for (int i = 0; i < m_vhfontDeferredDelete.Size(); ++i) + { + if (m_vhfontDeferredDelete[i] == hfont) + return; + } + + m_vhfontDeferredDelete.Push(hfont); +} + +void FontHandleCache::TryDeleteDeferredFonts(HFONT hfontActive, TryDeleteFontProc pfnTryDelete, + void * pDeleteContext) +{ + for (int i = m_vhfontDeferredDelete.Size() - 1; i >= 0; --i) + { + HFONT hfont = m_vhfontDeferredDelete[i]; + if (!hfont) + { + m_vhfontDeferredDelete.Delete(i); + continue; + } + if (hfont == hfontActive) + continue; + + bool fDeleted = pfnTryDelete ? pfnTryDelete(hfont, pDeleteContext) : true; + if (fDeleted) + m_vhfontDeferredDelete.Delete(i); + } +} + +void FontHandleCache::Clear(HFONT hfontActive, TryDeleteFontProc pfnTryDelete, void * pDeleteContext) +{ + for (int i = 0; i < m_cfceUsed; i++) + { + if (m_rgfce[i].hfont) + { + bool fDeleted = pfnTryDelete ? pfnTryDelete(m_rgfce[i].hfont, pDeleteContext) : true; + if (!fDeleted) + QueueFontForDeferredDelete(m_rgfce[i].hfont); + m_rgfce[i].hfont = NULL; + } + m_rgfce[i].fUsed = false; + } + m_cfceUsed = 0; + + TryDeleteDeferredFonts(hfontActive, pfnTryDelete, pDeleteContext); + for (int i = 0; i < m_vhfontDeferredDelete.Size(); ++i) + { + HFONT hfont = m_vhfontDeferredDelete[i]; + if (!hfont || hfont == hfontActive) + continue; + if (pfnTryDelete) + pfnTryDelete(hfont, pDeleteContext); + } + m_vhfontDeferredDelete.Delete(0, m_vhfontDeferredDelete.Size()); +} + +int FontHandleCache::CacheCount() const +{ + return m_cfceUsed; +} + +int FontHandleCache::DeferredDeleteCount() const +{ + return m_vhfontDeferredDelete.Size(); +} + +bool FontHandleCache::IsDeferredDeleteQueued(HFONT hfont) const +{ + for (int i = 0; i < m_vhfontDeferredDelete.Size(); ++i) + { + if (m_vhfontDeferredDelete[i] == hfont) + return true; + } + return false; +} diff --git a/Src/views/lib/FontHandleCache.h b/Src/views/lib/FontHandleCache.h new file mode 100644 index 0000000000..5a775ab5c1 --- /dev/null +++ b/Src/views/lib/FontHandleCache.h @@ -0,0 +1,45 @@ +/*--------------------------------------------------------------------*//*:Ignore this sentence. +Copyright (c) 2026 SIL International +This software is licensed under the LGPL, version 2.1 or later +(http://www.gnu.org/licenses/lgpl-2.1.html) +-------------------------------------------------------------------------------*//*:End Ignore*/ +#pragma once +#ifndef FONTHANDLECACHE_INCLUDED +#define FONTHANDLECACHE_INCLUDED + +class FontHandleCache +{ +public: + typedef bool (*TryDeleteFontProc)(HFONT hfont, void * pContext); + static const int kcFontCacheMax = 8; + + FontHandleCache(); + + HFONT FindCachedFont(const LgCharRenderProps * pchrp) const; + void AddFontToCache(HFONT hfont, const LgCharRenderProps * pchrp, + HFONT hfontActive, TryDeleteFontProc pfnTryDelete, void * pDeleteContext); + void TryDeleteDeferredFonts(HFONT hfontActive, TryDeleteFontProc pfnTryDelete, + void * pDeleteContext); + void Clear(HFONT hfontActive, TryDeleteFontProc pfnTryDelete, void * pDeleteContext); + + int CacheCount() const; + int DeferredDeleteCount() const; + bool IsDeferredDeleteQueued(HFONT hfont) const; + +private: + struct FontCacheEntry + { + HFONT hfont; + LgCharRenderProps chrp; + bool fUsed; + }; + + typedef Vector VecHfont; + FontCacheEntry m_rgfce[kcFontCacheMax]; + int m_cfceUsed; + VecHfont m_vhfontDeferredDelete; + + void QueueFontForDeferredDelete(HFONT hfont); +}; + +#endif // FONTHANDLECACHE_INCLUDED diff --git a/Src/views/lib/LayoutCache.h b/Src/views/lib/LayoutCache.h new file mode 100644 index 0000000000..6dc1ed16b4 --- /dev/null +++ b/Src/views/lib/LayoutCache.h @@ -0,0 +1,453 @@ +#pragma once +#ifndef LAYOUTCACHE_INCLUDED +#define LAYOUTCACHE_INCLUDED + +class TextAnalysisEntry +{ +public: + TextAnalysisEntry() : + m_pts(NULL), + m_ichMin(0), + m_cch(0), + m_ws(0), + m_fWsRtl(false), + m_fTextIsNfc(true), + m_cchNfc(0), + m_citem(0) + { + } + + bool Covers(IVwTextSource * pts, int ichMin, int cch, int ws, bool fWsRtl) const + { + return m_pts == pts && m_ichMin == ichMin && m_cch >= cch && m_ws == ws && m_fWsRtl == fWsRtl; + } + + int RequestedNfcLength(int cchRequested) const + { + if (cchRequested <= 0) + return 0; + if (m_fTextIsNfc) + return cchRequested; + if (m_vichOrigToNfc.Size() == 0) + return cchRequested; + if (cchRequested >= m_vichOrigToNfc.Size()) + return m_vichOrigToNfc[m_vichOrigToNfc.Size() - 1]; + return m_vichOrigToNfc[cchRequested]; + } + + int OffsetInNfc(int ich, int ichBase) const + { + Assert(ich >= ichBase); + if (m_fTextIsNfc) + return ich - ichBase; + int ichRelative = ich - ichBase; + if (ichRelative <= 0) + return 0; + if (m_vichOrigToNfc.Size() == 0) + return ichRelative; + if (ichRelative >= m_vichOrigToNfc.Size()) + return m_vichOrigToNfc[m_vichOrigToNfc.Size() - 1]; + return m_vichOrigToNfc[ichRelative]; + } + + int OffsetToOrig(int ich, int ichBase) const + { + if (m_fTextIsNfc) + return ich + ichBase; + if (ich <= 0) + return ichBase; + if (m_vichNfcToOrig.Size() == 0) + return ich + ichBase; + if (ich >= m_vichNfcToOrig.Size()) + return m_cch + ichBase; + return m_vichNfcToOrig[ich] + ichBase; + } + + void CopyScriptItemsTo(Vector & vscri, int & citem) const + { + citem = m_citem; + int cscri = m_vscri.Size(); + if (vscri.Size() < cscri) + vscri.Resize(cscri); + if (cscri > 0) + ::memcpy(vscri.Begin(), const_cast &>(m_vscri).Begin(), + cscri * isizeof(SCRIPT_ITEM)); + } + +public: + IVwTextSource * m_pts; + int m_ichMin; + int m_cch; + int m_ws; + bool m_fWsRtl; + bool m_fTextIsNfc; + int m_cchNfc; + int m_citem; + Vector m_vchNfc; + Vector m_vscri; + Vector m_vichOrigToNfc; + Vector m_vichNfcToOrig; +}; + +class ShapeRunEntry +{ +public: + ShapeRunEntry() : + m_hfont(NULL), + m_cch(0), + m_cglyph(0), + m_dxdWidth(0), + m_fScriptPlaceFailed(false) + { + ::ZeroMemory(&m_sa, sizeof(m_sa)); + } + + bool Matches(const OLECHAR * prgch, int cch, HFONT hfont, const SCRIPT_ANALYSIS & sa) + { + if (m_hfont != hfont || m_cch != cch) + return false; + if (::memcmp(&m_sa, &sa, sizeof(SCRIPT_ANALYSIS)) != 0) + return false; + if (cch == 0) + return true; + return ::memcmp(m_vch.Begin(), prgch, cch * isizeof(OLECHAR)) == 0; + } + + HFONT m_hfont; + SCRIPT_ANALYSIS m_sa; + int m_cch; + int m_cglyph; + int m_dxdWidth; + bool m_fScriptPlaceFailed; + Vector m_vch; + Vector m_vglyph; + Vector m_vsva; + Vector m_vadvance; + Vector m_vcst; + Vector m_voff; + Vector m_vcluster; +}; + +class TextAnalysisCache +{ +public: + TextAnalysisCache(int cEntriesMax = 16) : + m_cEntriesMax(cEntriesMax), + m_ientryReplace(0), + m_cHit(0), + m_cMiss(0), + m_cEvict(0), + m_msCompute(0) + { + } + + void Reset() + { + m_ventry.Delete(0, m_ventry.Size()); + m_ientryReplace = 0; + m_cHit = 0; + m_cMiss = 0; + m_cEvict = 0; + m_msCompute = 0; + } + + TextAnalysisEntry * Find(IVwTextSource * pts, int ichMin, int cch, int ws, bool fWsRtl) + { + TextAnalysisEntry * pbest = NULL; + int cchBest = INT_MAX; + for (int ientry = 0; ientry < m_ventry.Size(); ++ientry) + { + TextAnalysisEntry & entry = m_ventry[ientry]; + if (!entry.Covers(pts, ichMin, cch, ws, fWsRtl)) + continue; + if (entry.m_cch < cchBest) + { + pbest = &entry; + cchBest = entry.m_cch; + } + } + if (pbest) + ++m_cHit; + else + ++m_cMiss; + return pbest; + } + + TextAnalysisEntry * Store(IVwTextSource * pts, int ichMin, int cch, int ws, bool fWsRtl, + const OLECHAR * prgchNfc, int cchNfc, bool fTextIsNfc, const SCRIPT_ITEM * prgscri, + int citem, const Vector * pvichOrigToNfc, const Vector * pvichNfcToOrig) + { + TextAnalysisEntry * pentry = NULL; + for (int ientry = 0; ientry < m_ventry.Size(); ++ientry) + { + TextAnalysisEntry & entry = m_ventry[ientry]; + if (entry.m_pts == pts && entry.m_ichMin == ichMin && entry.m_cch == cch && + entry.m_ws == ws && entry.m_fWsRtl == fWsRtl) + { + pentry = &entry; + break; + } + } + + if (!pentry) + { + if (m_ventry.Size() < m_cEntriesMax) + { + TextAnalysisEntry entry; + m_ventry.Push(entry); + pentry = &m_ventry[m_ventry.Size() - 1]; + } + else + { + pentry = &m_ventry[m_ientryReplace]; + m_ientryReplace = (m_ientryReplace + 1) % m_cEntriesMax; + ++m_cEvict; + } + } + + pentry->m_pts = pts; + pentry->m_ichMin = ichMin; + pentry->m_cch = cch; + pentry->m_ws = ws; + pentry->m_fWsRtl = fWsRtl; + pentry->m_fTextIsNfc = fTextIsNfc; + pentry->m_cchNfc = cchNfc; + pentry->m_citem = citem; + + pentry->m_vchNfc.Resize(cchNfc); + if (cchNfc > 0) + ::memcpy(pentry->m_vchNfc.Begin(), prgchNfc, cchNfc * isizeof(OLECHAR)); + + int cscri = citem + 1; + if (cscri < 2) + cscri = 2; + pentry->m_vscri.Resize(cscri); + if (cscri > 0) + ::memcpy(pentry->m_vscri.Begin(), prgscri, cscri * isizeof(SCRIPT_ITEM)); + + if (pvichOrigToNfc) + { + pentry->m_vichOrigToNfc.Resize(pvichOrigToNfc->Size()); + for (int i = 0; i < pvichOrigToNfc->Size(); ++i) + pentry->m_vichOrigToNfc[i] = (*pvichOrigToNfc)[i]; + } + else + pentry->m_vichOrigToNfc.Delete(0, pentry->m_vichOrigToNfc.Size()); + + if (pvichNfcToOrig) + { + pentry->m_vichNfcToOrig.Resize(pvichNfcToOrig->Size()); + for (int i = 0; i < pvichNfcToOrig->Size(); ++i) + pentry->m_vichNfcToOrig[i] = (*pvichNfcToOrig)[i]; + } + else + pentry->m_vichNfcToOrig.Delete(0, pentry->m_vichNfcToOrig.Size()); + + return pentry; + } + + int HitCount() const { return m_cHit; } + int MissCount() const { return m_cMiss; } + int EvictionCount() const { return m_cEvict; } + int RequestCount() const { return m_cHit + m_cMiss; } + DWORD ComputeMs() const { return m_msCompute; } + void AddComputeMs(DWORD ms) { m_msCompute += ms; } + +private: + Vector m_ventry; + int m_cEntriesMax; + int m_ientryReplace; + int m_cHit; + int m_cMiss; + int m_cEvict; + DWORD m_msCompute; +}; + +class ShapeRunCache +{ +public: + ShapeRunCache(int cEntriesMax = 32) : + m_cEntriesMax(cEntriesMax), + m_ientryReplace(0), + m_cHit(0), + m_cMiss(0), + m_cEvict(0), + m_msCompute(0) + { + } + + void Reset() + { + m_ventry.Delete(0, m_ventry.Size()); + m_ientryReplace = 0; + m_cHit = 0; + m_cMiss = 0; + m_cEvict = 0; + m_msCompute = 0; + } + + ShapeRunEntry * Find(const OLECHAR * prgch, int cch, HFONT hfont, const SCRIPT_ANALYSIS & sa) + { + for (int ientry = 0; ientry < m_ventry.Size(); ++ientry) + { + ShapeRunEntry & entry = m_ventry[ientry]; + if (entry.Matches(prgch, cch, hfont, sa)) + { + ++m_cHit; + return &entry; + } + } + ++m_cMiss; + return NULL; + } + + ShapeRunEntry * Store(const OLECHAR * prgch, int cch, HFONT hfont, const SCRIPT_ANALYSIS & sa, + const WORD * prgGlyph, const SCRIPT_VISATTR * prgsva, const int * prgAdvance, + const int * prgcst, const GOFFSET * prgoff, const WORD * prgCluster, int cglyph, + int dxdWidth, bool fScriptPlaceFailed) + { + ShapeRunEntry * pentry = NULL; + for (int ientry = 0; ientry < m_ventry.Size(); ++ientry) + { + ShapeRunEntry & entry = m_ventry[ientry]; + if (entry.Matches(prgch, cch, hfont, sa)) + { + pentry = &entry; + break; + } + } + + if (!pentry) + { + if (m_ventry.Size() < m_cEntriesMax) + { + ShapeRunEntry entry; + m_ventry.Push(entry); + pentry = &m_ventry[m_ventry.Size() - 1]; + } + else + { + pentry = &m_ventry[m_ientryReplace]; + m_ientryReplace = (m_ientryReplace + 1) % m_cEntriesMax; + ++m_cEvict; + } + } + + pentry->m_hfont = hfont; + pentry->m_sa = sa; + pentry->m_cch = cch; + pentry->m_cglyph = cglyph; + pentry->m_dxdWidth = dxdWidth; + pentry->m_fScriptPlaceFailed = fScriptPlaceFailed; + + pentry->m_vch.Resize(cch); + if (cch > 0) + ::memcpy(pentry->m_vch.Begin(), prgch, cch * isizeof(OLECHAR)); + + pentry->m_vglyph.Resize(cglyph); + pentry->m_vsva.Resize(cglyph); + pentry->m_vadvance.Resize(cglyph); + pentry->m_vcst.Resize(cglyph); + pentry->m_voff.Resize(cglyph); + if (cglyph > 0) + { + ::memcpy(pentry->m_vglyph.Begin(), prgGlyph, cglyph * isizeof(WORD)); + ::memcpy(pentry->m_vsva.Begin(), prgsva, cglyph * isizeof(SCRIPT_VISATTR)); + ::memcpy(pentry->m_vadvance.Begin(), prgAdvance, cglyph * isizeof(int)); + ::memcpy(pentry->m_vcst.Begin(), prgcst, cglyph * isizeof(int)); + ::memcpy(pentry->m_voff.Begin(), prgoff, cglyph * isizeof(GOFFSET)); + } + + pentry->m_vcluster.Resize(cch); + if (cch > 0) + ::memcpy(pentry->m_vcluster.Begin(), prgCluster, cch * isizeof(WORD)); + + return pentry; + } + + int HitCount() const { return m_cHit; } + int MissCount() const { return m_cMiss; } + int EvictionCount() const { return m_cEvict; } + int RequestCount() const { return m_cHit + m_cMiss; } + DWORD ComputeMs() const { return m_msCompute; } + void AddComputeMs(DWORD ms) { m_msCompute += ms; } + +private: + Vector m_ventry; + int m_cEntriesMax; + int m_ientryReplace; + int m_cHit; + int m_cMiss; + int m_cEvict; + DWORD m_msCompute; +}; + +class LayoutPassCache +{ +public: + LayoutPassCache() : m_analysisCache(16), m_shapeRunCache(32) + { + } + + void Reset() + { + m_analysisCache.Reset(); + m_shapeRunCache.Reset(); + } + + TextAnalysisCache & AnalysisCache() + { + return m_analysisCache; + } + + ShapeRunCache & ShapeCache() + { + return m_shapeRunCache; + } + +private: + TextAnalysisCache m_analysisCache; + ShapeRunCache m_shapeRunCache; +}; + +extern __declspec(thread) LayoutPassCache * g_pCurrentLayoutPassCache; + +inline bool IsPerfFlagEnabled(const wchar_t * pszName) +{ + wchar_t rgchValue[16] = {0}; + DWORD cchValue = ::GetEnvironmentVariableW(pszName, rgchValue, _countof(rgchValue)); + if (cchValue == 0) + return true; + return _wcsicmp(rgchValue, L"0") != 0 && _wcsicmp(rgchValue, L"false") != 0 && + _wcsicmp(rgchValue, L"off") != 0; +} + +inline bool IsPath1ShapeCacheEnabled() +{ + static int s_nEnabled = -1; + if (s_nEnabled < 0) + s_nEnabled = IsPerfFlagEnabled(L"FW_PERF_P125_PATH1") ? 1 : 0; + return s_nEnabled == 1; +} + +inline bool IsPath2AnalysisCacheEnabled() +{ + static int s_nEnabled = -1; + if (s_nEnabled < 0) + s_nEnabled = IsPerfFlagEnabled(L"FW_PERF_P125_PATH2") ? 1 : 0; + return s_nEnabled == 1; +} + +inline LayoutPassCache * GetCurrentLayoutPassCache() +{ + return g_pCurrentLayoutPassCache; +} + +inline LayoutPassCache * SetCurrentLayoutPassCache(LayoutPassCache * pLayoutPassCache) +{ + LayoutPassCache * pPrev = g_pCurrentLayoutPassCache; + g_pCurrentLayoutPassCache = pLayoutPassCache; + return pPrev; +} + +#endif // LAYOUTCACHE_INCLUDED \ No newline at end of file diff --git a/Src/views/lib/UniscribeEngine.cpp b/Src/views/lib/UniscribeEngine.cpp index d69d570f61..4ff897ec08 100644 --- a/Src/views/lib/UniscribeEngine.cpp +++ b/Src/views/lib/UniscribeEngine.cpp @@ -28,6 +28,7 @@ POSSIBLE OPTIMIZATION HINT: #include "Main.h" #pragma hdrstop // any other headers (not precompiled) +#include "LayoutCache.h" #undef THIS_FILE DEFINE_THIS_FILE @@ -411,8 +412,11 @@ STDMETHODIMP UniscribeEngine::FindBreakPoint( // end at a line break opportunity. In particular if a run contains sequences of PUA // characters from plane 0 Uniscribe creates new items for these for reasons which are not // clear. + // PATH-N1: Get NFC flag to avoid redundant OffsetInNfc/OffsetToOrig normalization below. + bool fTextIsNfc = false; + const TextAnalysisEntry * pAnalysis = NULL; int cchNfc = UniscribeSegment::CallScriptItemize(rgchBuf, INIT_BUF_SIZE, vch, pts, ichMinSeg, - ichLimText - ichMinSeg, &prgchBuf, citem, (bool)fParaRtoL); + ichLimText - ichMinSeg, &prgchBuf, citem, (bool)fParaRtoL, &fTextIsNfc, &pAnalysis); Vector vichBreak; ILgLineBreakerPtr qlb; @@ -504,7 +508,7 @@ STDMETHODIMP UniscribeEngine::FindBreakPoint( } ichLim = min(ichLimNext, ichLimBT2); // Optimize JohnT: if ichLim==ichBase+m_dichLim, can use cchNfc. - ichLimNfc = UniscribeSegment::OffsetInNfc(ichLim, ichMinSeg, pts); + ichLimNfc = UniscribeSegment::OffsetInNfc(ichLim, ichMinSeg, pts, fTextIsNfc, pAnalysis); if (ichLimNfc == ichMinNfc) { // This can happen if later characters in a composite have different properties than the first. @@ -528,7 +532,7 @@ STDMETHODIMP UniscribeEngine::FindBreakPoint( { // Script item is smaller than run; shorten the amount we treat as a 'run'. ichLimNfc = (pscri + 1)->iCharPos; - ichLim = UniscribeSegment::OffsetToOrig(ichLimNfc, ichMinSeg, pts); + ichLim = UniscribeSegment::OffsetToOrig(ichLimNfc, ichMinSeg, pts, fTextIsNfc, pAnalysis); } // Set up the characters of the run, if any. @@ -750,7 +754,7 @@ STDMETHODIMP UniscribeEngine::FindBreakPoint( vdxRun.Pop(); ichLimBT2 = ichMin; ichLim = *(vichRun.Top()); - ichLimNfc = UniscribeSegment::OffsetInNfc(ichLim, ichMinSeg, pts); + ichLimNfc = UniscribeSegment::OffsetInNfc(ichLim, ichMinSeg, pts, fTextIsNfc, pAnalysis); vichRun.Pop(); cglyph = *(viglyphRun.Top()); viglyphRun.Pop(); @@ -855,7 +859,7 @@ STDMETHODIMP UniscribeEngine::FindBreakPoint( vdxRun.Pop(); ichLimBT2 = ichMin; ichLim = *(vichRun.Top()); - ichLimNfc = UniscribeSegment::OffsetInNfc(ichLim, ichMinSeg, pts); + ichLimNfc = UniscribeSegment::OffsetInNfc(ichLim, ichMinSeg, pts, fTextIsNfc, pAnalysis); vichRun.Pop(); cglyph = *(viglyphRun.Top()); viglyphRun.Pop(); @@ -969,11 +973,11 @@ STDMETHODIMP UniscribeEngine::FindBreakPoint( } } } - ichLim = UniscribeSegment::OffsetToOrig(ichMinUri + ichRun, ichMinSeg, pts); + ichLim = UniscribeSegment::OffsetToOrig(ichMinUri + ichRun, ichMinSeg, pts, fTextIsNfc, pAnalysis); break; } - int ichLineBreak = UniscribeSegment::OffsetToOrig(ichLineBreakNfc, ichMinSeg, pts); + int ichLineBreak = UniscribeSegment::OffsetToOrig(ichLineBreakNfc, ichMinSeg, pts, fTextIsNfc, pAnalysis); if (ichLineBreak <= ichMin) { @@ -990,7 +994,7 @@ STDMETHODIMP UniscribeEngine::FindBreakPoint( viglyphRun.Pop(); } ichLim = ichMin; // Required to get correct values at start of loop. - ichLimNfc = UniscribeSegment::OffsetInNfc(ichLim, ichMinSeg, pts); + ichLimNfc = UniscribeSegment::OffsetInNfc(ichLim, ichMinSeg, pts, fTextIsNfc, pAnalysis); ichLimBT2 = ichLineBreak; fRemovedWs = false; fBacktracking = true; @@ -998,12 +1002,12 @@ STDMETHODIMP UniscribeEngine::FindBreakPoint( } ichLim = ichLineBreak; // We limit the segment to not exceed the latest line break point. Assert(ichLim <= ichLimBacktrack); - ichLimNfc = UniscribeSegment::OffsetInNfc(ichLim, ichMinSeg, pts); + ichLimNfc = UniscribeSegment::OffsetInNfc(ichLim, ichMinSeg, pts, fTextIsNfc, pAnalysis); fOkBreak = true; // Means we have a good line break. // Store the glyph-specific information: stretch values. int cchRunTotalTmp = uri.cch; - uri.cch = UniscribeSegment::OffsetInNfc(ichLim, ichMinSeg, pts) - ichMinNfc; + uri.cch = UniscribeSegment::OffsetInNfc(ichLim, ichMinSeg, pts, fTextIsNfc, pAnalysis) - ichMinNfc; UniscribeSegment::ShapePlaceRun(uri, true); viglyphRun.Push(cglyph); cglyph += uri.cglyph; @@ -1029,7 +1033,7 @@ STDMETHODIMP UniscribeEngine::FindBreakPoint( if (twsh == ktwshNoWs) { fRemovedWs = RemoveTrailingWhiteSpace(ichMinUri, &ichLimNfc, uri); - ichLim = UniscribeSegment::OffsetToOrig(ichLimNfc, ichMinSeg, pts); + ichLim = UniscribeSegment::OffsetToOrig(ichLimNfc, ichMinSeg, pts, fTextIsNfc, pAnalysis); // Usually the worst case is that ichLimNfc == ichMinUri, indicating that the whole run is // white space. However, in at least one pathological case, we have observed uniscribe // strip of more than one run of white space. Hence the <=. @@ -1053,7 +1057,7 @@ STDMETHODIMP UniscribeEngine::FindBreakPoint( dxSegWidth = *(vdxRun.Top()); vdxRun.Pop(); ichLim = *(vichRun.Top()); - ichLimNfc = UniscribeSegment::OffsetInNfc(ichLim, ichMinSeg, pts); + ichLimNfc = UniscribeSegment::OffsetInNfc(ichLim, ichMinSeg, pts, fTextIsNfc, pAnalysis); vichRun.Pop(); cglyph = *(viglyphRun.Top()); viglyphRun.Pop(); @@ -1082,7 +1086,7 @@ STDMETHODIMP UniscribeEngine::FindBreakPoint( Assert(irun == 1); Assert(ichMinUri == 0); RemoveNonWhiteSpace(ichMinUri, &ichLimNfc, uri); - ichLim = UniscribeSegment::OffsetToOrig(ichLimNfc, ichMinSeg, pts); + ichLim = UniscribeSegment::OffsetToOrig(ichLimNfc, ichMinSeg, pts, fTextIsNfc, pAnalysis); if (ichLim == ichMinSeg) return S_OK; // failure to create a valid segment fOkBreak = true; diff --git a/Src/views/lib/UniscribeSegment.cpp b/Src/views/lib/UniscribeSegment.cpp index ea45848da5..77176a7216 100644 --- a/Src/views/lib/UniscribeSegment.cpp +++ b/Src/views/lib/UniscribeSegment.cpp @@ -16,6 +16,7 @@ Last reviewed: Not yet. #include "Main.h" #pragma hdrstop // any other headers (not precompiled) +#include "LayoutCache.h" #undef THIS_FILE DEFINE_THIS_FILE @@ -27,6 +28,9 @@ DEFINE_THIS_FILE //:>******************************************************************************************** //:> Forward declarations //:>******************************************************************************************** +static void BuildNfcOffsetMaps(const StrUni & stuOrig, Vector & vichOrigToNfc, + Vector & vichNfcToOrig); +static void ApplyShapeRunCacheEntry(ShapeRunEntry & entry, UniscribeRunInfo & uri); //:>******************************************************************************************** //:> Local Constants and static variables @@ -283,6 +287,19 @@ STDMETHODIMP UniscribeSegment::QueryInterface(REFIID riid, void **ppv) void UniscribeSegment::ShapePlaceRun(UniscribeRunInfo& uri, bool fCreatingSeg) { HRESULT hr; + LayoutPassCache * pLayoutPassCache = IsPath1ShapeCacheEnabled() ? GetCurrentLayoutPassCache() : NULL; + HFONT hfont = (HFONT)::GetCurrentObject(uri.hdc, OBJ_FONT); + if (pLayoutPassCache && uri.psa) + { + ShapeRunEntry * pShapeEntry = pLayoutPassCache->ShapeCache().Find(uri.prgch, uri.cch, hfont, *uri.psa); + if (pShapeEntry) + { + uri.sc = g_fsc.FindScriptCache(uri); + ApplyShapeRunCacheEntry(*pShapeEntry, uri); + return; + } + } + DWORD dwStartMs = (fCreatingSeg && pLayoutPassCache && uri.psa) ? ::GetTickCount() : 0; // Enhance JohnT: (multithread) lock static buffers. // Make sure buffers are big enough. int cglyphMax = uri.CGlyphMax(); @@ -418,6 +435,14 @@ void UniscribeSegment::ShapePlaceRun(UniscribeRunInfo& uri, bool fCreatingSeg) } } + if (fCreatingSeg && pLayoutPassCache && uri.psa) + { + pLayoutPassCache->ShapeCache().AddComputeMs(::GetTickCount() - dwStartMs); + pLayoutPassCache->ShapeCache().Store(uri.prgch, uri.cch, hfont, *uri.psa, + uri.prgGlyph, uri.prgsva, uri.prgAdvance, uri.prgcst, uri.prgoff, + uri.prgCluster, uri.cglyph, uri.dxdWidth, uri.fScriptPlaceFailed); + } + if (uri.sc && uri.sc != sc) { g_fsc.StoreScriptCache(/**uri.pchrp, uri.sc*/uri); @@ -1077,6 +1102,29 @@ int UniscribeSegment::OffsetInNfc(int ich, int ichBase, IVwTextSource * pts) #endif } +// PATH-N1: NFC-aware overload. When fTextIsNfc is true (text already in NFC form), +// skip the expensive Fetch + NormalizeStrUni and return the identity offset directly. +// This eliminates redundant COM calls and NFC normalization when the text source +// already provides NFC text (the common case in FieldWorks). +int UniscribeSegment::OffsetInNfc(int ich, int ichBase, IVwTextSource * pts, bool fTextIsNfc) +{ + Assert(ich >= ichBase); + if (fTextIsNfc) + return ich - ichBase; + return OffsetInNfc(ich, ichBase, pts); +} + +int UniscribeSegment::OffsetInNfc(int ich, int ichBase, IVwTextSource * pts, bool fTextIsNfc, + const TextAnalysisEntry * pAnalysis) +{ + Assert(ich >= ichBase); + if (fTextIsNfc) + return ich - ichBase; + if (pAnalysis) + return pAnalysis->OffsetInNfc(ich, ichBase); + return OffsetInNfc(ich, ichBase, pts, fTextIsNfc); +} + // ich is an offset into the (NFC normalized) characters of this segment. // convert it into a (typically NFD) position in the original paragraph. // This is complicated because it isn't absolutely guaranteed that the original is @@ -1115,6 +1163,76 @@ int UniscribeSegment::OffsetToOrig(int ich, int ichBase, IVwTextSource * pts) #endif } +// PATH-N1: NFC-aware overload. When fTextIsNfc is true, original offsets equal NFC offsets, +// so we can return directly without the expensive iterative Fetch + normalize loop. +int UniscribeSegment::OffsetToOrig(int ich, int ichBase, IVwTextSource * pts, bool fTextIsNfc) +{ + if (fTextIsNfc) + return ich + ichBase; + return OffsetToOrig(ich, ichBase, pts); +} + +int UniscribeSegment::OffsetToOrig(int ich, int ichBase, IVwTextSource * pts, bool fTextIsNfc, + const TextAnalysisEntry * pAnalysis) +{ + if (fTextIsNfc) + return ich + ichBase; + if (pAnalysis) + return pAnalysis->OffsetToOrig(ich, ichBase); + return OffsetToOrig(ich, ichBase, pts, fTextIsNfc); +} + +static void BuildNfcOffsetMaps(const StrUni & stuOrig, Vector & vichOrigToNfc, + Vector & vichNfcToOrig) +{ + int cchOrig = stuOrig.Length(); + vichOrigToNfc.Resize(cchOrig + 1); + vichOrigToNfc[0] = 0; + for (int ich = 1; ich <= cchOrig; ++ich) + { + StrUni stuPrefix(stuOrig.Chars(), ich); + StrUtil::NormalizeStrUni(stuPrefix, UNORM_NFC); + vichOrigToNfc[ich] = stuPrefix.Length(); + } + + int cchNfc = vichOrigToNfc[cchOrig]; + vichNfcToOrig.Resize(cchNfc + 1); + int ichOrig = 0; + for (int ichNfc = 0; ichNfc <= cchNfc; ++ichNfc) + { + while (ichOrig + 1 <= cchOrig && vichOrigToNfc[ichOrig + 1] <= ichNfc) + ++ichOrig; + vichNfcToOrig[ichNfc] = ichOrig; + } +} + +static void ApplyShapeRunCacheEntry(ShapeRunEntry & entry, UniscribeRunInfo & uri) +{ + if (uri.CGlyphMax() < entry.m_cglyph) + uri.UpdateGlyphSize(entry.m_cglyph); + if (uri.CClusterMax() < entry.m_cch) + uri.UpdateClusterSize(entry.m_cch); + + uri.cglyph = entry.m_cglyph; + uri.dxdWidth = entry.m_dxdWidth; + uri.fScriptPlaceFailed = entry.m_fScriptPlaceFailed; + if (uri.psa) + *uri.psa = entry.m_sa; + + if (entry.m_cglyph > 0) + { + ::memcpy(uri.prgGlyph, entry.m_vglyph.Begin(), entry.m_cglyph * isizeof(WORD)); + ::memcpy(uri.prgsva, entry.m_vsva.Begin(), entry.m_cglyph * isizeof(SCRIPT_VISATTR)); + ::memcpy(uri.prgAdvance, entry.m_vadvance.Begin(), entry.m_cglyph * isizeof(int)); + ::memcpy(uri.prgcst, entry.m_vcst.Begin(), entry.m_cglyph * isizeof(int)); + ::memcpy(uri.prgoff, entry.m_voff.Begin(), entry.m_cglyph * isizeof(GOFFSET)); + } + if (entry.m_cch > 0) + ::memcpy(uri.prgCluster, entry.m_vcluster.Begin(), entry.m_cch * isizeof(WORD)); + if (uri.prgJustAdv && entry.m_cglyph > 0) + ::memcpy(uri.prgJustAdv, uri.prgAdvance, entry.m_cglyph * isizeof(int)); +} + int OffsetInRun(UniscribeRunInfo & uri, int ichRun, bool fTrailing) { int dxdRunToIP; @@ -2454,9 +2572,43 @@ void UniscribeSegment::AdjustEndForWidth(int ichBase, IVwGraphics * pvg) ----------------------------------------------------------------------------------------------*/ int UniscribeSegment::CallScriptItemize(OLECHAR * prgchDefBuf, int cchBuf, Vector & vch, IVwTextSource * pts, int ichMin, int cch, OLECHAR ** pprgchBuf, - int & citem, bool fParaRTL) + int & citem, bool fParaRTL, bool * pfTextIsNfc, const TextAnalysisEntry ** ppAnalysis) { * pprgchBuf = prgchDefBuf; // Use on-stack variable if big enough + if (ppAnalysis) + *ppAnalysis = NULL; + + LayoutPassCache * pLayoutPassCache = IsPath2AnalysisCacheEnabled() ? GetCurrentLayoutPassCache() : NULL; + TextAnalysisEntry * pCachedAnalysis = NULL; + int cchOrig = cch; + int ws = 0; + bool fWsRtl = false; + DWORD dwStartMs = 0; + if (pLayoutPassCache && cch > 0) + { + int ichMin1, ichLim1; + LgCharRenderProps chrp; + CheckHr(pts->GetCharProps(ichMin, &chrp, &ichMin1, &ichLim1)); + ws = chrp.ws; + fWsRtl = chrp.fWsRtl; + pCachedAnalysis = pLayoutPassCache->AnalysisCache().Find(pts, ichMin, cchOrig, ws, fWsRtl); + if (pCachedAnalysis) + { + if (pfTextIsNfc) + *pfTextIsNfc = pCachedAnalysis->m_fTextIsNfc; + *pprgchBuf = pCachedAnalysis->m_vchNfc.Size() > 0 ? pCachedAnalysis->m_vchNfc.Begin() : prgchDefBuf; + pCachedAnalysis->CopyScriptItemsTo(g_vscri, citem); + g_cscri = citem; + if (ppAnalysis) + *ppAnalysis = pCachedAnalysis; + return pCachedAnalysis->RequestedNfcLength(cchOrig); + } + } + if (pLayoutPassCache && !pCachedAnalysis) + dwStartMs = ::GetTickCount(); + + Vector vichOrigToNfc; + Vector vichNfcToOrig; #ifdef UNISCRIBE_NFC if (cch) @@ -2466,9 +2618,18 @@ int UniscribeSegment::CallScriptItemize(OLECHAR * prgchDefBuf, int cchBuf, OLECHAR * pch; stu.SetSize(cch, &pch); CheckHr(pts->Fetch(ichMin, ichMin + cch, pch)); + StrUni stuOrig(stu); StrUtil::NormalizeStrUni(stu, UNORM_NFC); if (cch != stu.Length()) cch = stu.Length(); + // PATH-N1: Only treat offsets as identity when normalization leaves the text + // byte-for-byte unchanged. Length equality alone is not sufficient because NFC + // can preserve length while still changing code-unit composition. + bool fComputedTextIsNfc = (stu == stuOrig); + if (pfTextIsNfc) + *pfTextIsNfc = fComputedTextIsNfc; + if (!fComputedTextIsNfc && pLayoutPassCache) + BuildNfcOffsetMaps(stuOrig, vichOrigToNfc, vichNfcToOrig); if (cch > cchBuf) { cchBuf = cch; @@ -2477,7 +2638,21 @@ int UniscribeSegment::CallScriptItemize(OLECHAR * prgchDefBuf, int cchBuf, } ::memcpy(*pprgchBuf, stu.Chars(), isizeof(OLECHAR) * cch); } + else + { + if (pfTextIsNfc) + *pfTextIsNfc = true; // Empty text is trivially NFC + if (pLayoutPassCache) + { + vichOrigToNfc.Resize(1); + vichOrigToNfc[0] = 0; + vichNfcToOrig.Resize(1); + vichNfcToOrig[0] = 0; + } + } #else + if (pfTextIsNfc) + *pfTextIsNfc = true; // No NFC mode means offsets are always identity if (cch > cchBuf) { cchBuf = cch; @@ -2574,6 +2749,18 @@ typedef struct tag_SCRIPT_STATE { g_vscri[0].iCharPos = 0; g_vscri[1].iCharPos = 0; } + g_cscri = citem; + + if (pLayoutPassCache) + { + pLayoutPassCache->AnalysisCache().AddComputeMs(::GetTickCount() - dwStartMs); + TextAnalysisEntry * pStoredAnalysis = pLayoutPassCache->AnalysisCache().Store(pts, ichMin, + cchOrig, ws, fWsRtl, *pprgchBuf, cch, pfTextIsNfc ? *pfTextIsNfc : true, + g_vscri.Begin(), citem, vichOrigToNfc.Size() ? &vichOrigToNfc : NULL, + vichNfcToOrig.Size() ? &vichNfcToOrig : NULL); + if (ppAnalysis) + *ppAnalysis = pStoredAnalysis; + } return cch; } #undef MAX_WS_GROUP @@ -2624,8 +2811,11 @@ template int UniscribeSegment::DoAllRuns(int ichBase, IVwGraphics * pv Vector vch; // Use as buffer if 1000 is not enough int citem; // actual number of items obtained. OLECHAR * prgchBuf; // Where text actually goes. + // PATH-N1: Get NFC flag from CallScriptItemize to skip redundant OffsetInNfc calls below. + bool fTextIsNfc = false; + const TextAnalysisEntry * pAnalysis = NULL; int cchNfc = CallScriptItemize(rgchBuf, INIT_BUF_SIZE, vch, m_qts, ichBase, m_dichLim, &prgchBuf, - citem, m_fParaRTL); + citem, m_fParaRTL, &fTextIsNfc, &pAnalysis); // If dxdExpectedWidth is not 0, then the segment will try its best to stretch to the // specified size. @@ -2683,7 +2873,7 @@ template int UniscribeSegment::DoAllRuns(int ichBase, IVwGraphics * pv if (ichLim - ichBase > m_dichLim) ichLim = ichBase + m_dichLim; - ichLimNfc = OffsetInNfc(ichLim, ichBase, m_qts); + ichLimNfc = OffsetInNfc(ichLim, ichBase, m_qts, fTextIsNfc, pAnalysis); if (ichLimNfc == ichMinNfc && m_dichLim > 0) { // This can happen pathologically where later characters in a composition have different diff --git a/Src/views/lib/UniscribeSegment.h b/Src/views/lib/UniscribeSegment.h index ee0abcd76c..297fbe0bb5 100644 --- a/Src/views/lib/UniscribeSegment.h +++ b/Src/views/lib/UniscribeSegment.h @@ -29,6 +29,8 @@ typedef Vector OffsetVec; // Hungarian voff typedef Vector ScrItemVec; // Hungarian vscri; typedef Vector ScrLogAttrVec; // Hungarian vsla. +class TextAnalysisEntry; + /*---------------------------------------------------------------------------------------------- Class: UniscribeRunInfo Description: This is the block of information that is passed to all our functors. @@ -231,7 +233,13 @@ class UniscribeSegment : public ILgSegment } static int OffsetInNfc(int ich, int ichBase, IVwTextSource * pts); + static int OffsetInNfc(int ich, int ichBase, IVwTextSource * pts, bool fTextIsNfc); + static int OffsetInNfc(int ich, int ichBase, IVwTextSource * pts, bool fTextIsNfc, + const TextAnalysisEntry * pAnalysis); static int OffsetToOrig(int ich, int ichBase, IVwTextSource * pts); + static int OffsetToOrig(int ich, int ichBase, IVwTextSource * pts, bool fTextIsNfc); + static int OffsetToOrig(int ich, int ichBase, IVwTextSource * pts, bool fTextIsNfc, + const TextAnalysisEntry * pAnalysis); protected: // Static variables @@ -298,7 +306,7 @@ class UniscribeSegment : public ILgSegment static void ShapePlaceRun(UniscribeRunInfo& uri, bool fCreatingSeg = false); static int CallScriptItemize(OLECHAR * prgchDefBuf, int cchBuf, Vector & vch, IVwTextSource * pts, int ichMin, int cch, OLECHAR ** pprgchBuf, int & citem, - bool fParaRTL); + bool fParaRTL, bool * pfTextIsNfc = NULL, const TextAnalysisEntry ** ppAnalysis = NULL); int NumStretchableGlyphs(); int StretchGlyphs(UniscribeRunInfo & uri, diff --git a/Src/views/lib/VwGraphics.cpp b/Src/views/lib/VwGraphics.cpp index 9e30a945c2..ced86193f9 100644 --- a/Src/views/lib/VwGraphics.cpp +++ b/Src/views/lib/VwGraphics.cpp @@ -28,6 +28,25 @@ DEFINE_THIS_FILE Local Constants and static variables ***********************************************************************************************/ +// Returns the lfQuality value to use for LOGFONT creation. +// If the FW_FONT_QUALITY env var is set to a valid value (0-6), that value is used. +// This allows tests to force ANTIALIASED_QUALITY (4) for deterministic rendering. +static BYTE GetFontQualityOverride() +{ + static BYTE s_quality = []() -> BYTE { + wchar_t buf[16] = {}; + DWORD len = ::GetEnvironmentVariableW(L"FW_FONT_QUALITY", buf, _countof(buf)); + if (len > 0 && len < _countof(buf)) + { + int val = _wtoi(buf); + if (val >= 0 && val <= 6) + return static_cast(val); + } + return DRAFT_QUALITY; + }(); + return s_quality; +} + /*********************************************************************************************** Two local classes, copied from AfGfx.h. Maybe we should move them to somewhere they can be shared more easily? @@ -76,11 +95,10 @@ VwGraphics::~VwGraphics() m_hfontOld = NULL; } Assert(!m_hfont); - if (m_hfont) - { - fSuccess = AfGdi::DeleteObjectFont(m_hfont); - m_hfont = NULL; - } + // PATH-C1: Font cache owns all created fonts. Don't double-delete m_hfont + // here — ClearFontCache handles it. Just null the pointer. + m_hfont = NULL; + ClearFontCache(); if (m_hdc) { @@ -105,6 +123,7 @@ void VwGraphics::Init() Assert(m_hfont == NULL); Assert(m_hfontOld == NULL); // m_chrp should contain zeros too; don't bother checking. + m_colorStateCache.Invalidate(); // Initialize the clip rectangle to be as big as possible: // TODO: decide if we want to do this. @@ -124,6 +143,11 @@ static GenericFactory g_fact( _T("Apartment"), &VwGraphics::CreateCom); +static bool TryDeleteCachedFont(HFONT hfont, void *) +{ + return AfGdi::DeleteObjectFont(hfont) != 0; +} + void VwGraphics::CreateCom(IUnknown *punkCtl, REFIID riid, void ** ppv) { @@ -1084,10 +1108,13 @@ STDMETHODIMP VwGraphics::ReleaseDC() // original one back into the DC to prevent GDI memory leaks and similar problems. HFONT hfontPrev; // Fixed release build. hfontPrev = AfGdi::SelectObjectFont(m_hdc, m_hfontOld, AfGdi::OLD); - fSuccess = AfGdi::DeleteObjectFont(m_hfont); + // PATH-C1: Don't delete m_hfont here — ClearFontCache handles lifecycle. m_hfont = 0; m_hfontOld = 0; } + // PATH-C1: Delete all cached fonts now that they're deselected from the DC. + ClearFontCache(); + m_colorStateCache.Invalidate(); Assert(m_hfont == 0); if (m_hfontOldMeasure) { @@ -1214,62 +1241,62 @@ STDMETHODIMP VwGraphics::SetupGraphics(LgCharRenderProps * pchrp) memcpy(((byte *)&m_chrp) + cbFontOffset, ((byte *)pchrp) + cbFontOffset, isizeof(m_chrp) - cbFontOffset); - // Figure the actual font we need. - LOGFONT lf; - lf.lfItalic = pchrp->ttvItalic == kttvOff ? false : true; - lf.lfWeight = pchrp->ttvBold == kttvOff ? 400 : 700; - // The minus causes this to be the font height (roughly, from top of ascenders - // to bottom of descenders). A positive number indicates we want a font with - // this distance as the total line spacing, which makes them too small. - // Note that we are also scaling the font size based on the resolution. - lf.lfHeight = -MulDiv(pchrp->dympHeight, GetYInch(), kdzmpInch); - lf.lfUnderline = false; - lf.lfWidth = 0; // default width, based on height - lf.lfEscapement = 0; // no rotation of text (is this how to do slanted?) - lf.lfOrientation = 0; // no rotation of character baselines - - lf.lfStrikeOut = 0; // not strike-out - lf.lfCharSet = DEFAULT_CHARSET; // let name determine it; WS should specify valid - lf.lfOutPrecision = OUT_TT_ONLY_PRECIS; // only work with TrueType fonts - lf.lfClipPrecision = CLIP_DEFAULT_PRECIS; // ?? - lf.lfQuality = DRAFT_QUALITY; // I (JohnT) don't think this matters for TrueType fonts. - lf.lfPitchAndFamily = 0; // must be zero for EnumFontFamiliesEx - #ifdef UNICODE - // ENHANCE: test this path if ever needed. - wcscpy_s(lf.lfFaceName, pchrp->szFaceName); - #else // not unicode, LOGFONT has 8-bit chars - WideCharToMultiByte( - CP_ACP, 0, // dumb; we don't expect non-ascii chars - pchrp->szFaceName, // string to convert - -1, // null-terminated - lf.lfFaceName, 32, - NULL, NULL); // default handling of unconvertibles - #endif // not unicode - HFONT hfont; - hfont = AfGdi::CreateFontIndirect(&lf); - if (!hfont) - ThrowHr(WarnHr(E_FAIL)); - SetFont(hfont); + HFONT hfontCached = FindCachedFont(pchrp); + if (hfontCached) + { + SetFont(hfontCached); + } + else + { + // Figure the actual font we need. + LOGFONT lf; + lf.lfItalic = pchrp->ttvItalic == kttvOff ? false : true; + lf.lfWeight = pchrp->ttvBold == kttvOff ? 400 : 700; + // The minus causes this to be the font height (roughly, from top of ascenders + // to bottom of descenders). A positive number indicates we want a font with + // this distance as the total line spacing, which makes them too small. + // Note that we are also scaling the font size based on the resolution. + lf.lfHeight = -MulDiv(pchrp->dympHeight, GetYInch(), kdzmpInch); + lf.lfUnderline = false; + lf.lfWidth = 0; // default width, based on height + lf.lfEscapement = 0; // no rotation of text (is this how to do slanted?) + lf.lfOrientation = 0; // no rotation of character baselines + + lf.lfStrikeOut = 0; // not strike-out + lf.lfCharSet = DEFAULT_CHARSET; // let name determine it; WS should specify valid + lf.lfOutPrecision = OUT_TT_ONLY_PRECIS; // only work with TrueType fonts + lf.lfClipPrecision = CLIP_DEFAULT_PRECIS; // ?? + lf.lfQuality = GetFontQualityOverride(); + lf.lfPitchAndFamily = 0; // must be zero for EnumFontFamiliesEx + #ifdef UNICODE + // ENHANCE: test this path if ever needed. + wcscpy_s(lf.lfFaceName, pchrp->szFaceName); + #else // not unicode, LOGFONT has 8-bit chars + WideCharToMultiByte( + CP_ACP, 0, // dumb; we don't expect non-ascii chars + pchrp->szFaceName, // string to convert + -1, // null-terminated + lf.lfFaceName, 32, + NULL, NULL); // default handling of unconvertibles + #endif // not unicode + HFONT hfont; + hfont = AfGdi::CreateFontIndirect(&lf); + if (!hfont) + ThrowHr(WarnHr(E_FAIL)); + SetFont(hfont); + AddFontToCache(hfont, pchrp); + } } + m_rgbForeColor = pchrp->clrFore; + m_rgbBackColor = pchrp->clrBack; - // Always set the colors. - // OPTIMIZE JohnT: would it be useful to remember what the hdc is set to? + // PATH-C2: Reuse HDC color state when the requested colors and background mode + // already match the previous SetupGraphics call. { - SmartPalette spal(m_hdc); - - bool fOK = (AfGfx::SetTextColor(m_hdc, pchrp->clrFore) != CLR_INVALID); - if (pchrp->clrBack == kclrTransparent) - { - // I can't find it documented anywhere, but it seems to be necessary to set - // the background color to black to make TRANSPARENT mode work--at least on my - // computer. - fOK = fOK && (::SetBkColor(m_hdc, RGB(0,0,0)) != CLR_INVALID); - fOK = fOK && ::SetBkMode(m_hdc, TRANSPARENT); - } else { - fOK = fOK && (AfGfx::SetBkColor(m_hdc, pchrp->clrBack)!= CLR_INVALID); - fOK = fOK && ::SetBkMode(m_hdc, OPAQUE); - } + COLORREF clrBackNeeded = (pchrp->clrBack == kclrTransparent) ? RGB(0,0,0) : pchrp->clrBack; + int nBkModeNeeded = (pchrp->clrBack == kclrTransparent) ? TRANSPARENT : OPAQUE; + m_colorStateCache.ApplyIfNeeded(m_hdc, pchrp->clrFore, clrBackNeeded, nBkModeNeeded); } #if 0 // DarrellX reports that this was causing some weird failures on his machine. @@ -1612,7 +1639,6 @@ int VwGraphics::GetYInch() ----------------------------------------------------------------------------------------------*/ void VwGraphics::SetFont(HFONT hfont) { - BOOL fSuccess; if (hfont == m_hfont) return; // Select the new font into the device context @@ -1630,21 +1656,16 @@ void VwGraphics::SetFont(HFONT hfont) if (!hfontPrev) ThrowHr(WarnHr(E_FAIL)); - if (m_hfontOld) - { - // We have previously created a font and now need to delete it. - // NB this must be done after it is selected out of the DC, or we get a hard-to-find - // GDI memory leak that causes weird drawing failures on W-98. - Assert(m_hfont); - fSuccess = AfGdi::DeleteObjectFont(m_hfont); - } - else + if (!m_hfontOld) { // This is the first font selection we have made into this level; save the old one // to eventually select back into the DC before we RestoreDC. m_hfontOld = hfontPrev; } + // PATH-C1: Don't delete the previous font here — the font cache manages + // all created HFONT lifecycles. m_hfont = hfont; + m_fontHandleCache.TryDeleteDeferredFonts(m_hfont, TryDeleteCachedFont, NULL); } /*---------------------------------------------------------------------------------------------- @@ -1866,4 +1887,19 @@ int VwGraphics::GetFontHeightFromFontTable() } #include -template Vector; // VecHfont; +template Vector; // VecHRgn; + +HFONT VwGraphics::FindCachedFont(const LgCharRenderProps * pchrp) +{ + return m_fontHandleCache.FindCachedFont(pchrp); +} + +void VwGraphics::AddFontToCache(HFONT hfont, const LgCharRenderProps * pchrp) +{ + m_fontHandleCache.AddFontToCache(hfont, pchrp, m_hfont, TryDeleteCachedFont, NULL); +} + +void VwGraphics::ClearFontCache() +{ + m_fontHandleCache.Clear(m_hfont, TryDeleteCachedFont, NULL); +} diff --git a/Src/views/lib/VwGraphics.h b/Src/views/lib/VwGraphics.h index 583cd67b15..3329a4aa81 100644 --- a/Src/views/lib/VwGraphics.h +++ b/Src/views/lib/VwGraphics.h @@ -23,6 +23,9 @@ Last reviewed: Not yet. #ifndef VWGRAPHICS_INCLUDED #define VWGRAPHICS_INCLUDED +#include "ColorStateCache.h" +#include "FontHandleCache.h" + #if !defined(_WIN32) && !defined(_M_X64) #include "VwGraphicsCairo.h" #else @@ -162,11 +165,17 @@ class VwGraphics : public IVwGraphicsWin32 HFONT m_hfontOldMeasure; HFONT m_hfont; // current font selected into DC, if any LgCharRenderProps m_chrp; + FontHandleCache m_fontHandleCache; + ColorStateCache m_colorStateCache; // Vertical and horizontal resolution. Zero indicates not yet initialized. int m_xInch; int m_yInch; + HFONT FindCachedFont(const LgCharRenderProps * pchrp); + void AddFontToCache(HFONT hfont, const LgCharRenderProps * pchrp); + void ClearFontCache(); + void Init(); int IntFromFixed(FIXED f) diff --git a/Src/views/views.vcxproj b/Src/views/views.vcxproj index 91fc36f294..bc15e8bf27 100644 --- a/Src/views/views.vcxproj +++ b/Src/views/views.vcxproj @@ -111,6 +111,8 @@ + + @@ -154,6 +156,8 @@ + + diff --git a/Src/views/views.vcxproj.filters b/Src/views/views.vcxproj.filters index e2d597b9b2..24cac1b3b5 100644 --- a/Src/views/views.vcxproj.filters +++ b/Src/views/views.vcxproj.filters @@ -73,6 +73,12 @@ lib + + lib + + + lib + lib @@ -153,6 +159,12 @@ lib + + lib + + + lib + lib diff --git a/openspec/changes/render-speedup-benchmark/.openspec.yaml b/openspec/changes/render-speedup-benchmark/.openspec.yaml new file mode 100644 index 0000000000..d0ec88b291 --- /dev/null +++ b/openspec/changes/render-speedup-benchmark/.openspec.yaml @@ -0,0 +1,2 @@ +schema: spec-driven +created: 2026-02-20 diff --git a/openspec/changes/render-speedup-benchmark/PERFORM_OFFSCREENLAYOUT_PATHS_1_2_5_PLAN.md b/openspec/changes/render-speedup-benchmark/PERFORM_OFFSCREENLAYOUT_PATHS_1_2_5_PLAN.md new file mode 100644 index 0000000000..e7de0ba491 --- /dev/null +++ b/openspec/changes/render-speedup-benchmark/PERFORM_OFFSCREENLAYOUT_PATHS_1_2_5_PLAN.md @@ -0,0 +1,747 @@ +# PerformOffscreenLayout Optimization Plan (Paths 1+2+5) + +## Purpose + +Define the implementation plan for three native text-layout optimization paths targeting `PerformOffscreenLayout`: + +- Path 1: ShapePlaceRun result caching (revised from FindBreakPoint memoization) +- Path 2: Text analysis cache (`ScriptItemize`, NFC buffers, and non-NFC offset maps) +- Path 5: Common-case fast path in line breaking + +This plan includes: + +- concrete code changes, +- phased task list, +- expected savings grounded in the current render run, +- edge-case test coverage (unit + render/timing), +- explicit pre-implementation decisions that still need to be made. + +## Current Evidence (2026-03-11) + +Source artifacts: + +- `Output/RenderBenchmarks/summary.md` +- `Output/RenderBenchmarks/results.json` +- `Output/RenderBenchmarks/summary.cache-on-final.md` +- `Output/RenderBenchmarks/results.cache-on-final.json` +- `Output/RenderBenchmarks/summary.cache-off.md` +- `Output/RenderBenchmarks/results.cache-off.json` + +Latest cache-enabled timing-suite run `aeead2c451e2426e92a8b945790d5e80` (`2026-03-11 15:53:56Z`): + +- Flags: `FW_PERF_P125_PATH1=1`, `FW_PERF_P125_PATH2=1`, `FW_PERF_P125_PATH5=not-implemented` +- Avg cold render: 110.90 ms +- Avg warm render: 43.72 ms +- Avg cold `PerformOffscreenLayout`: 90.54 ms +- Avg warm `PerformOffscreenLayout`: 1.81 ms +- `PerformOffscreenLayout` remains the dominant traced stage (55.6% of traced stage time) + +Matched cache-disabled control run `e2167ab0e60f4dd0a944601e266ca3aa` (`2026-03-11 15:52:23Z`): + +- Flags: `FW_PERF_P125_PATH1=0`, `FW_PERF_P125_PATH2=0`, `FW_PERF_P125_PATH5=not-implemented` +- Avg cold render: 156.44 ms +- Avg warm render: 77.04 ms +- Avg cold `PerformOffscreenLayout`: 136.80 ms +- Avg warm `PerformOffscreenLayout`: 2.27 ms + +Observed cache-on improvements versus control: + +- Avg cold render: 156.44 → 110.90 ms (`-45.54 ms`, about `-29.1%`) +- Avg cold `PerformOffscreenLayout`: 136.80 → 90.54 ms (`-46.26 ms`, about `-33.8%`) +- Avg warm render: 77.04 → 43.72 ms (`-33.32 ms`, about `-43.2%`) + +Representative heavy-scenario cold `PerformOffscreenLayout` wins from the matched control pair: + +- `footnote-heavy`: 459.00 → 139.65 ms +- `many-paragraphs`: 194.56 → 63.61 ms +- `complex`: 191.27 → 68.40 ms +- `deep-nested`: 97.05 → 30.76 ms +- `medium`: 89.49 → 28.11 ms +- `custom-heavy`: 84.70 → 35.16 ms + +Some scenarios were noisy or slightly worse in the single-run control pair (`lex-deep`, `lex-extreme`, `multi-book`, `multi-ws`). Treat the current pair as strong directional evidence, not the final tuned benchmark set. + +Historical pre-implementation benchmark reference `1b193fb08a1b477f9419b59b0ec8d78f` (`2026-03-10 19:33:16Z`): + +- `long-prose`: 149.90/152.92 ms (98.0%) +- `mixed-styles`: 109.37/115.23 ms (94.9%) +- `rtl-script`: 67.28/70.09 ms (96.0%) +- `lex-extreme`: 82.12/86.39 ms (95.1%) + +## Branch Context: Optimizations Already Landed + +This plan was originally drafted against an older benchmark snapshot. On the current +`001-render-speedup` branch, several related optimizations have already changed the baseline: + +- `PATH-L1` width-invariant layout guard is complete and validated. +- `PATH-L4` harness GDI resource caching is complete. +- `PATH-R1` reconstruct guard is complete. +- `PATH-C1` HFONT cache and `PATH-C2` color-state cache are complete. +- `PATH-N1` NFC-aware fast path is complete in the Uniscribe pipeline. + +Implications for this plan: + +1. Warm-path protection is already excellent and must not regress. +2. Cold-path numbers must now be evaluated against the current 49.22 ms baseline, not the older 64.98 ms run. +3. Path 2 is no longer "cache NFC work from scratch"; `PATH-N1` already removes redundant normalization work for the common `fTextIsNfc == true` case. +4. The remaining native opportunity is still real because `PerformOffscreenLayout` now dominates an even larger share of cold render time. + +## Validated Implementation Status + +Implemented and validated on this branch: + +- `LayoutPassCache` is owned by `ParaBuilder` and exposed through a thread-local pointer. +- Path 2 is implemented: `CallScriptItemize` analysis reuse, cached NFC text, cached non-NFC offset maps, and `DoAllRuns` reuse of cached analysis. +- Path 1 first slice is implemented: `ShapePlaceRun` result reuse keyed by NFC text content + font + `SCRIPT_ANALYSIS`, with deep-copied shaping buffers. +- Shape-cache hits are allowed for all `ShapePlaceRun` callers, while new cache stores remain restricted to `fCreatingSeg` calls. +- Layout-pass telemetry is implemented and emitted from `ParaBuilder` teardown: analysis/shape request counts, hit/miss counts, evictions, and miss compute time. +- Runtime kill switches are implemented for the validated paths: + - `FW_PERF_P125_PATH1` + - `FW_PERF_P125_PATH2` +- Render benchmark artifacts now record active P125 flag states and per-scenario cold/warm `PerformOffscreenLayout` totals. + +Explicitly attempted and rejected: + +- Broad reuse of cached `ScriptBreak` / `ScriptGetLogicalWidths` results from the shape cache was implemented experimentally and then fully reverted after it caused large pixel-output regressions across 12 render scenarios. + +Still pending: + +- Path 5 fast path is not implemented. +- A native runtime flag for Path 5 is not yet needed because there is no Path 5 code to gate. +- There are no new native unit tests yet for the new cache layers; current confidence comes from existing native tests plus render/timing/baseline validation. + +## Design Goals and Constraints + +Goals: + +1. Reduce cold `PerformOffscreenLayout` by at least 20% in heavy scenarios. +2. Preserve exact line-break and pixel output behavior. +3. Keep warm-path gains intact (no regressions to `PATH-L1`, `PATH-L4`, or `PATH-R1`). + +Constraints: + +1. Text pipeline correctness (bidi, surrogates, trailing whitespace, fallback) is non-negotiable. +2. Optimizations must be safely disableable (feature flags or compile-time guard). +3. Cache invalidation must be conservative; stale cache is worse than a miss. +4. Existing `PATH-N1` NFC fast path should remain the common-case fast path for already-normalized text. + +## Scope + +In scope: + +- `Src/views/lib/UniscribeEngine.cpp` +- `Src/views/lib/UniscribeSegment.cpp` +- `Src/views/lib/UniscribeSegment.h` +- `Src/views/lib/UniscribeEngine.h` (if new helper declarations are required) +- `Src/views/Test/*` for native unit coverage +- `Src/Common/RootSite/RootSiteTests/*` for render/timing assertions + +Out of scope: + +- DataTree architectural virtualization changes +- Graphite engine redesign +- DirectWrite migration + +## Architectural Analysis: Why Full FindBreakPoint Memoization Was Discarded + +Deep-dive analysis (traced `ParaBuilder::MainLoop` → `AddWsRun` → `GetSegment` → `FindBreakPoint` +and the `BackTrack` re-entry path) revealed that memoizing the complete `FindBreakPoint` result +has a near-zero hit rate: + +- **Pattern A — Sequential segments (most common):** `AddWsRun` calls `GetSegment` with advancing + `ichMinSeg` positions. Each call starts where the previous one ended. Non-overlapping calls mean + no repeated `(ichMinSeg, dxMaxWidth)` tuple. +- **Pattern B — Backtracking:** `BackTrack()` re-calls `GetSegment` with the same `ichMinSeg` but + different `ichLimBacktrack` and potentially different width. No exact-parameter match. +- **Pattern C — Bidi ws toggle:** `AddWsRun` may retry with `ktwshOnlyWs` after `ktwshNoWs` fails. + Same text, different `twsh`. +- **Pattern D — Re-layout:** Same paragraph at different `dxAvailWidth` — all parameters differ. + (Already handled by `PATH-L1` guard when width is unchanged.) + +The expensive operations inside `FindBreakPoint` — `CallScriptItemize`, `ShapePlaceRun`, +`ScriptBreak`, `ScriptGetLogicalWidths` — depend only on text content + font/HDC + writing system. +They do not depend on `dxMaxWidth`, `ichLimBacktrack`, `lbPref`, `twsh`, or any layout-policy +parameters. The policy parameters only control how the main loop uses those results to pick a +break point. + +This means the valuable cache target is the sub-result level (analysis products and shaped runs), +not the full `FindBreakPoint` output. + +## Invalidation Contract + +`IVwTextSource` has no version stamp or change counter (confirmed by inspecting `VwTxtSrc.h`). +This is intentional: the architecture guarantees text immutability during a layout pass. + +- `PropChanged` → `VwNotifier::PropChanged` → regenerates boxes → `DoLayout`/`Relayout` is a + sequential pipeline. Text source content cannot change while `ParaBuilder::MainLoop` is running. +- The `IVwTextSource *` pointer identity is stable throughout the entire `ParaBuilder` lifetime. +- `UniscribeEngine` instances are shared (cached per writing system + font + bold/italic in + `RenderEngineFactory`), so cache must be scoped to the layout pass, not the engine. + +**Invalidation strategy:** Clear all caches at layout-pass boundary. No version stamps needed. +Within a pass, `IVwTextSource *` pointer + character range is a sufficient identity key. + +## Cache Ownership + +Because `UniscribeEngine` is shared across paragraphs and layout passes, caches cannot live on +the engine instance. Two viable ownership models: + +1. **Stack-scoped context object** passed through `FindBreakPoint` (requires signature change or + thread-local) — cleanest lifecycle, automatic cleanup. +2. **Layout-pass context on `VwParagraphBox` or `ParaBuilder`** — passed via `IVwTextSource` + extension or side-channel. Cleared when `ParaBuilder` is destroyed. + +Preferred direction: thread-local or RAII-managed layout-pass context, because it keeps cache +lifetime explicit without changing the COM-facing `IRenderEngine::FindBreakPoint` signature. + +Research refinement: `ParaBuilder` already owns the full layout-pass lifetime and has a +destructor in `VwTextBoxes.cpp`, so the cleanest implementation is a `ParaBuilder`-owned cache +with a thread-local scope helper only if needed to reach `FindBreakPoint` without a COM signature +change. + +## Path 1: ShapePlaceRun Result Caching (Revised) + +### Intent + +Cache per-run glyph shaping results (`ScriptShape` + `ScriptPlace` outputs) within a layout pass, +so that when backtracking re-encounters a run that was already shaped, it reuses the +widths/glyphs without calling the expensive Win32 shaping APIs again. + +### Why this replaces full FBP memoization + +`ShapePlaceRun` is the single most expensive call inside the `FindBreakPoint` main loop +(each invocation calls `ScriptShape` + `ScriptPlace`, both of which hit the font rasterizer). +During backtracking (Pattern B), the loop re-shapes runs it already shaped in the previous +attempt. Caching the shaped results eliminates this redundant work. + +### Cache key + +``` +ShapeRunKey = { + const OLECHAR * prgch, // NFC text slice (content, not pointer — memcmp) + int cch, // length of the NFC text slice + HFONT hfont, // font handle (from VwGraphics font cache) + SCRIPT_ANALYSIS sa // Uniscribe script analysis (from ScriptItemize) +} +``` + +### Cache value + +``` +ShapeRunValue = { + WORD * prgGlyphs, // glyph indices + int cglyph, // glyph count + int * prgAdvance, // advance widths + GOFFSET * prgGoffset, // glyph offsets + WORD * prgCluster, // cluster mapping + SCRIPT_VISATTR * prgsva, // visual attributes + int dxdWidth, // total run width + int * prgcst, // stretch types + bool fScriptPlaceFailed // whether ScriptPlace failed +} +``` + +### Implementation approach + +1. Introduce a `ShapeRunCache` class with a small fixed-capacity map (initially about 32 entries). + Key comparison is `memcmp` on the NFC text content + `HFONT` + `SCRIPT_ANALYSIS` bytes. +2. At the start of `FindBreakPoint`, accept or create the cache context. +3. Before `ShapePlaceRun(uri, true)`, probe the cache. On hit, copy cached values into `uri`. + On miss, call `ShapePlaceRun` as before, then store the result. +4. Cache lifetime: created by `ParaBuilder` at layout-pass start, destroyed when `ParaBuilder` + goes out of scope. Passed to `FindBreakPoint` via thread-local or added parameter. +5. Sub-task: deep-copy the owned `UniscribeRunInfo` buffers. Current code shows + `UniscribeRunInfo` owns its glyph/advance/cluster/offset storage via `realloc`, so the cache + should copy those owned buffers directly rather than trying to alias any transient `g_v*` state. + +### Scenarios that benefit + +- **Backtracking** (Pattern B): runs shaped in the first attempt are reused when the loop retries + with `ichLimBacktrack` reduced. +- **Bidi ws toggle** (Pattern C): the same text is shaped twice with different `twsh` — the + shaping result is identical. +- **Multi-line paragraphs**: runs near the end of line N that did not fit may be re-shaped at + the start of line N+1 with the same text content. + +### Expected savings + +- `PerformOffscreenLayout`: about 5-12% reduction (concentrated in backtrack-heavy scenarios) +- Best gains in `long-prose`, `lex-extreme` (many lines, frequent backtracking) +- Modest gains in simple scenarios (little backtracking) + +## Path 2: Text Analysis Cache (`ScriptItemize` + NFC buffers + non-NFC maps) + +### Intent + +Compute and reuse the expensive text-analysis products (`ScriptItemize`, NFC text buffers, +and non-NFC offset maps) once per paragraph text source, instead of recomputing them on every +`FindBreakPoint` call. + +This is still the main analysis-layer optimization, but it is now narrower than the original +idea because `PATH-N1` already removes redundant normalization work when the source text is +already NFC. The main remaining target is repeated `CallScriptItemize` work plus the +non-NFC offset-map case. + +### Call-chain analysis: where the redundancy is + +During a single `ParaBuilder::MainLoop` pass for one paragraph: + +1. `AddWsRun` calls `GetSegment` → `FindBreakPoint` once per line segment. +2. Each `FindBreakPoint` call re-runs `CallScriptItemize` on the same text range + (`ichMinSeg..ichLimText`). For a 10-line paragraph, this means 10+ calls to + `ScriptItemize` on overlapping or identical text windows. +3. `BackTrack` re-calls `FindBreakPoint` on the same text with different limits, + triggering another full `CallScriptItemize`. +4. `UniscribeSegment::DoAllRuns` also calls `CallScriptItemize` again when the + segment is drawn, so the same paragraph can be itemized once in `FindBreakPoint` + and again in the segment path. + +The text content does not change between any of these calls. The `IVwTextSource *` is the +same object with the same content throughout the entire `ParaBuilder` lifetime. + +### Cache key + +``` +AnalysisKey = { + IVwTextSource * pts, // pointer identity — stable within layout pass + int ichMinSeg, // start of text region in source + int ichLimText, // end of text region in source + int ws, // writing system (from chrp.ws) + ComBool fParaRtoL // paragraph direction (affects ScriptItemize) +} +``` + +Note: `HFONT` is not part of this key — `ScriptItemize` and normalization are font-independent. +Font only matters for shaping (Path 1). + +Research refinement: match the key to the actual `CallScriptItemize` inputs in the current code. +`UniscribeSegment::CallScriptItemize(...)` derives bidi state from `GetCharProps(ichMin)` +(`chrp.fWsRtl`) and does not currently consume `fParaRtoL` when building `SCRIPT_STATE`. +That means the cache key should be based on text source identity/span plus the effective initial +bidi state used by `CallScriptItemize`, not on `HFONT` and not necessarily on paragraph RTL alone. + +### Cache value + +``` +AnalysisValue = { + OLECHAR * prgchNfc, // NFC-normalized text buffer (owned copy) + int cchNfc, // NFC text length + bool fTextIsNfc, // whether source text was already NFC + SCRIPT_ITEM * prgscri, // ScriptItemize results (owned copy) + int citem, // script item count + // Offset maps (only populated when fTextIsNfc == false): + int * prgichOrigToNfc, // original→NFC offset map + int * prgichNfcToOrig, // NFC→original offset map +} +``` + +### Implementation approach + +1. **Introduce `TextAnalysisCache` class** with a small map (initially about 8-16 entries, + keyed by `AnalysisKey`). + - Owns allocated buffers; entries freed on cache destruction. + - Supports `Lookup(key) → AnalysisValue*` and `Store(key, value)`. + +2. **Refactor the `CallScriptItemize` call site in `FindBreakPoint`** (currently around + `UniscribeEngine.cpp` line 414): + - Before calling `CallScriptItemize`, probe the cache. + - On hit: copy `prgchNfc`, `cchNfc`, `fTextIsNfc`, `prgscri`, `citem` from cache + into local variables. Skip the `CallScriptItemize` call entirely. + - On miss: call `CallScriptItemize` as today, then store results in cache. + +3. **Refactor offset conversion calls** (`OffsetInNfc`, `OffsetToOrig`): + - When the analysis cache entry exists with `fTextIsNfc == true`, these are identity + (already optimized by `PATH-N1`). No extra conversion cache is needed. + - When `fTextIsNfc == false`, use the cached offset maps instead of re-normalizing. + Currently `OffsetInNfc` calls `StrUtil::NormalizeStrUni` on each call. + +4. **Wire `DoAllRuns` to consume cached analysis** when the same text source + is still active. `DoAllRuns` in `UniscribeSegment.cpp` still calls + `CallScriptItemize`; if the cache is available via thread-local or parameter, + it can skip re-itemization there as well. + +5. **Cache lifetime:** Same as Path 1 — created by `ParaBuilder`, destroyed when + `ParaBuilder` goes out of scope. Same context object can hold both caches. + +### Concrete code changes + +| File | Change | +|------|--------| +| New: `Src/views/lib/LayoutCache.h` | `TextAnalysisCache` and `ShapeRunCache` class definitions, key/value structs | +| `Src/views/lib/UniscribeEngine.cpp` | `FindBreakPoint`: probe analysis cache before `CallScriptItemize`, store on miss | +| `Src/views/lib/UniscribeSegment.cpp` | `CallScriptItemize`: extract into cacheable form; `DoAllRuns`: probe analysis cache before itemizing | +| `Src/views/lib/UniscribeSegment.h` | Updated `CallScriptItemize` signature or overload accepting cache | +| `Src/views/VwTextBoxes.cpp` | `ParaBuilder`: create/own `LayoutPassCache` context and expose it to layout code | + +### Expected savings + +- `PerformOffscreenLayout`: about 8-15% reduction if repeated itemization remains a top residual cost after `PATH-N1` +- Total cold average: about 4-7% reduction from the current 49.22 ms baseline +- Strongest in multi-line paragraphs, redraws that revisit the same paragraph text, and render paths that hit both `FindBreakPoint` and `DoAllRuns` +- Savings from NFC normalization itself should be treated as mostly already captured by `PATH-N1` + +## Path 5: Common-Case Fast Path in FindBreakPoint + +### Intent + +Short-circuit common LTR/no-special handling path with fewer branches and less fallback machinery. + +### Main implementation changes + +1. Add explicit fast-path gate for requests meeting all conditions: + - LTR simple direction depth, + - no complex trailing-whitespace mode, + - no hard breaks in candidate window, + - no script/layout failure flags. +2. In fast path: + - use precomputed analysis from Path 2, + - perform streamlined width accumulation and break lookup, + - avoid generic backtracking scaffolding unless needed. +3. Immediate fallback to existing generic logic when any guard fails. + +### Expected savings + +- `PerformOffscreenLayout`: about 4-10% reduction if loop/control-flow overhead remains visible after Paths 1 and 2 +- Total cold average: likely secondary to Paths 1 and 2; only justify if re-profiling shows the generic loop itself still dominates + +## Decisions Required Before Further Coding + +## Research-Backed Recommendation + +Code review plus Microsoft Uniscribe guidance suggest the following execution order and guardrails: + +1. **Implement `LayoutPassCache` at `ParaBuilder` scope first.** Uniscribe `SCRIPT_CACHE` is + already per-font/style and should stay that way; the new cache should capture higher-level + analysis/shaping results for one layout pass only, not live on the shared `UniscribeEngine`. +2. **Do Path 2 before Path 1.** The current branch duplicates `CallScriptItemize(...)` in both + `UniscribeEngine::FindBreakPoint(...)` and `UniscribeSegment::DoAllRuns(...)`, and repeats + `OffsetInNfc`/`OffsetToOrig` work on non-NFC text. That duplication happens on every segment, + not just on backtracking-heavy paragraphs. +3. **Do Path 1 second, after Path 2 telemetry is in place.** `ShapePlaceRun(...)` reuse is still + valuable, but its biggest wins are tied to backtracking and rerun scenarios. It should be keyed + by NFC text content + font/style identity + `SCRIPT_ANALYSIS`, with deep-copied buffers. +4. **Defer Path 5 until re-profiling after Paths 1/2.** Microsoft guidance for `ScriptBreak` + explicitly assumes whole-item processing, so a manual fast path must preserve item boundaries and + fall back immediately on any mixed-script, bidi, whitespace-mode, or fallback-font complexity. +5. **Add telemetry before tuning capacities.** Reuse the existing render-trace infrastructure or + equivalent counters to record cache hits, misses, evictions, `CallScriptItemize` timings, + `ShapePlaceRun` timings, and backtrack frequency before locking in capacities or defaults. + +1. **Cache threading model** + - Preferred choice: `ParaBuilder` owns the cache object; a narrow thread-local scope helper can + expose it to `FindBreakPoint` without changing the COM-facing `IRenderEngine::FindBreakPoint` + signature. + - Reason: matches the real layout-pass lifetime and avoids putting mutable state on the shared + render engine. + - Must still verify no cross-thread reuse of the same layout context is possible. + +2. **Initial cache capacities** + - The draft `~16` analysis entries and `~32` shaped-run entries are placeholders, not validated values. + - First implementation should instrument hit/miss/eviction counts and tune after benchmark runs. + +3. **Feature-flag rollout** + - The three paths should remain independently disableable. + - Default enablement should be decided after correctness coverage and first benchmark pass, not assumed up front. + +4. **Path ordering after current profiling** + - `PATH-N1` changed the cost distribution inside the Uniscribe path. + - Re-profile the current branch before committing to Path 2 as the first substantive optimization after infrastructure work. + +Current status of these decisions: + +- Cache ownership/lifetime: settled in favor of `ParaBuilder` + thread-local exposure. +- Initial capacities: implemented as `16` analysis entries and `32` shaped-run entries, with telemetry in place for later tuning. +- Feature-flag rollout: implemented paths default on and are independently disableable via environment variables. +- Path ordering: resolved in practice as infrastructure → Path 2 → Path 1 slice → re-profile → Path 5 last. + +## Execution Order + +Based on the current branch state, the revised execution order is: + +1. **Refresh the micro-profile against the current branch** — confirm the residual split between + `CallScriptItemize`, non-NFC offset work, and `ShapePlaceRun` after `PATH-N1`. +2. **P125-1 infrastructure first** — `LayoutPassCache` lifetime and cache plumbing are required + regardless of whether Path 1 or Path 2 lands first. +3. **Default to Path 2 first unless the refreshed profile clearly disproves it**: + - repeated itemization and non-NFC offset conversion are currently duplicated in both + `FindBreakPoint` and `DoAllRuns`; + - Path 1 should move ahead only if the refreshed profile shows backtracking reshaping dominating + more than expected. +4. **Re-profile after Paths 1 and/or 2** to measure actual gains and identify remaining hot spots. +5. **Path 5 last** — only if re-profiling still shows meaningful generic loop overhead after the + expensive API calls are being reused. + +Current state: + +- Steps 1-4 are complete enough for the current slice. +- The next substantive implementation target is Path 5, guided by the refreshed benchmark/reporting data. + +## Combined Savings Model (Paths 1+2+5) + +Combined reductions are not additive. Against the current baseline, a realistic expectation is: + +- `PerformOffscreenLayout`: 15-25% reduction on heavy scenarios +- Total cold average: about 3.4-6.8 ms saved on the current 49.22 ms average cold baseline + +Using current average cold baseline (49.22 ms): + +- projected cold range: about 42.4-45.8 ms +- projected average savings: about 3.4-6.8 ms +- heavy-case savings (`long-prose`/`mixed-styles`/`lex-extreme`) can be materially larger. + +Note: Previous estimates were optimistic because they assumed full `FindBreakPoint` memoization hits. +The revised model reflects sub-result caching, which eliminates API call overhead but +still requires the loop logic to run. It also assumes `PATH-L1`, `PATH-L4`, `PATH-R1`, and `PATH-N1` +remain intact. + +## Implementation Task List + +### P125-0: Refresh evidence and settle design choices + +- [x] Reconfirm the current `PerformOffscreenLayout` sub-cost split on this branch before choosing Path 1 vs. Path 2 ordering. +- [x] Decide whether the cache context is thread-local RAII or an explicit parameter path. +- [x] Decide initial cache capacities and required hit/miss/eviction telemetry. +- [x] Decide initial feature-flag defaults and rollout strategy. + +### P125-1: LayoutPassCache infrastructure + +- [x] Create `Src/views/lib/LayoutCache.h` with: + - `AnalysisKey` and `AnalysisValue` structs. + - `ShapeRunKey` and `ShapeRunValue` structs. + - `TextAnalysisCache` class (fixed-capacity map, initial target about 16 entries, key comparison via `memcmp`). + - `ShapeRunCache` class (fixed-capacity map, initial target about 32 entries). + - `LayoutPassCache` wrapper owning both caches. +- [x] Add `LayoutPassCache` creation in `ParaBuilder::Initialize` (`VwTextBoxes.cpp`). +- [x] Thread the cache to `GetSegment` → `FindBreakPoint` via either: + - (a) thread-local pointer set/cleared by `ParaBuilder`, or + - (b) added parameter to `IRenderEngine::FindBreakPoint` (COM signature change — heavier). + - Current recommendation: prefer (a) to avoid COM interface change. +- [x] Ensure cache is destroyed when `ParaBuilder` goes out of scope (RAII or destructor). + +### P125-2: Path 2 — Text analysis cache + +- [x] Refactor `CallScriptItemize` call in `FindBreakPoint` (currently around line 414 of `UniscribeEngine.cpp`): + - Build `AnalysisKey` from `{pts, ichMinSeg, ichLimText, chrpThis.ws, fParaRtoL}`. + - Probe `TextAnalysisCache`. On hit, use cached `prgchNfc`, `cchNfc`, `fTextIsNfc`, + `prgscri`, `citem`. Skip `CallScriptItemize`. + - On miss, call `CallScriptItemize` as today, then store results. +- [x] Refactor `OffsetInNfc`/`OffsetToOrig` calls in the main loop to use cached offset maps + when `fTextIsNfc == false` (when `true`, these are already identity via `PATH-N1`). +- [x] Add overload or optional parameter to `DoAllRuns` in `UniscribeSegment.cpp` to accept + cached analysis and skip its own `CallScriptItemize` call. +- [x] Add trace counter: analysis cache hits vs. misses per layout pass. + +### P125-3: Path 1 — ShapePlaceRun cache + +- [x] Before `ShapePlaceRun(uri, true)` in `FindBreakPoint` main loop (currently around line 547): + - Build `ShapeRunKey` from `{uri.prgch, uri.cch, hfont (from VwGraphics), uri.psa}`. + - Probe `ShapeRunCache`. On hit, copy cached glyph/advance/cluster/width data into `uri`. + - On miss, call `ShapePlaceRun` as today, then deep-copy results into cache. +- [x] Deep-copy `UniscribeRunInfo` owned glyph/advance/cluster/offset buffers into the cache; + do not rely on transient vector state. +- [x] Add trace counter: shaping cache hits vs. misses per layout pass. +- [x] Validate that `BackTrack()` re-entry into `FindBreakPoint` now hits the shaping cache + for previously-shaped runs. + +Implementation note: the validated slice caches shaping outputs only. A broader attempt to cache logical widths and `ScriptBreak` results was reverted after render regressions. + +### P125-4: Path 5 fast path + +- [ ] Add fast-path gate function with explicit guard conditions. +- [ ] Implement streamlined break computation using analysis cache. +- [ ] Guarantee exact fallback semantics to generic path. + +### P125-5: Feature flag and diagnostics + +- [x] Add runtime flags: + - `FW_PERF_P125_PATH1` + - `FW_PERF_P125_PATH2` +- [ ] Add runtime flag: + - `FW_PERF_P125_PATH5` +- [x] Emit counters for analysis/shape hit/miss/evict/compute-time telemetry into trace logs. +- [ ] Emit Path 5 fallback-reason counters once Path 5 exists. + +### P125-6: Verification and benchmark reporting + +- [x] Run targeted native tests for line-break correctness. +- [x] Run render timing suite and compare against baseline JSON / matched control runs. +- [x] Record before/after in `Output/RenderBenchmarks` and summarize deltas by scenario against + run `1b193fb08a1b477f9419b59b0ec8d78f` unless a newer validated baseline replaces it. + +Latest validation snapshot: + +- `msbuild Src\views\Test\TestViews.vcxproj /p:Configuration=Debug /p:Platform=x64 /p:LinkIncremental=false /v:minimal /nologo` passed. +- `.\test.ps1 -Native -TestProject TestViews -NoBuild` passed. +- `msbuild Src\Common\RootSite\RootSiteTests\RootSiteTests.csproj /p:Configuration=Debug /p:Platform=x64 /v:minimal /nologo` passed. +- `.\Build\Agent\Run-AllRenders.ps1 -Scope All -NoBuild -Verbosity minimal` passed. +- `.\test.ps1 -NoBuild -TestProject "Src/Common/RootSite/RootSiteTests" -TestFilter "FullyQualifiedName~RenderTimingSuiteTests"` passed with Path 1/2 enabled and disabled. + +## Test Plan + +## A. Native Unit Tests (Correctness) + +Primary location: `Src/views/Test/RenderEngineTestBase.h` and related native render tests. + +### A1. Path 1 shaping cache correctness tests + +- [ ] Shaped run with cache enabled produces identical glyphs/widths as without cache. +- [ ] Different `HFONT` for same text produces different cache entry (no false hit). +- [ ] Different `SCRIPT_ANALYSIS` for same text produces different cache entry. +- [ ] Backtracking scenario: re-shaped runs after `BackTrack()` match original shaping. +- [ ] Cache entry ownership: cached copies remain valid after the source `UniscribeRunInfo` + instance and any transient vectors have been reused or destroyed. + +### A2. Path 2 analysis cache correctness tests + +- [ ] Surrogate pair boundaries never split across cached NFC offset maps. +- [ ] Combining marks where NFC length differs from source preserve correct offset mapping. +- [ ] Hard-break characters (`\n`, `\r`, tab, object replacement char) preserve break semantics. +- [ ] RTL input with mirrored punctuation yields identical `SCRIPT_ITEM` array with cache on/off. +- [ ] Same text source with different `ws` gets separate cache entries. +- [ ] Same text source with different `ichMinSeg` gets separate cache entries. +- [ ] Cache hit returns identical `cchNfc`, `fTextIsNfc`, `citem` as fresh computation. + +### A3. Path 5 fast-path equivalence tests + +- [ ] LTR simple run enters fast path and equals generic output. +- [ ] Whitespace handling modes (`ktwshNoWs`, `ktwshOnlyWs`, others) force fallback when required. +- [ ] ScriptPlace failure or special shaping conditions force fallback and preserve output. +- [ ] Mixed writing systems in one candidate span trigger fallback safely. + +### A4. Stress and stability tests + +- [ ] Thousands of repeated break calls with cache enabled do not leak memory. +- [ ] LRU or fixed-cap eviction behaves deterministically under pressure. +- [ ] Null or empty segment cases remain unchanged. + +## B. Render Tests (Pixel + Behavior) + +Primary location: `Src/Common/RootSite/RootSiteTests/RenderTimingSuiteTests.cs` and baseline tests. + +- [x] Existing pixel-perfect scenarios still pass unchanged. +- [ ] Add scenario variants emphasizing: + - deep paragraphs with many break opportunities, + - mixed styles in one paragraph, + - multi-writing-system lines, + - RTL-heavy text blocks, + - combining-mark intensive text. +- [x] Validate no pixel variance compared to baseline snapshots. + +## C. Timing and Regression Tests + +- [ ] Add per-stage regression assertion for `PerformOffscreenLayout` (improves or no worse within tolerance). +- [x] Add per-scenario delta reporting for heavy scenarios: + - `long-prose`, `mixed-styles`, `rtl-script`, `lex-extreme`. +- [ ] Add hit-rate telemetry assertions (non-zero hit rate in scenarios designed for reuse). + +## D. Flag Matrix Tests + +Run matrix: + +1. all paths off (control) +2. Path 2 only +3. Path 1 only +4. Path 5 only +5. Path 1+2 +6. Path 1+2+5 + +For each matrix entry: + +- [ ] native correctness tests pass, +- [x] render snapshots pass for the `all paths off` and `Path 1+2` runs performed so far, +- [x] timing suite emits valid artifacts for the `all paths off` and `Path 1+2` runs performed so far, +- [ ] no crash or regression on warm path. + +## Edge Cases Checklist (Must Explicitly Pass) + +- [ ] surrogate pair at break boundary +- [ ] combining sequence contraction or expansion under NFC +- [ ] trailing whitespace segment with backtracking +- [ ] upstream or downstream directional runs in same paragraph +- [ ] hard line break and object replacement character handling +- [ ] mixed ws renderer switching boundaries +- [ ] empty-segment fallback and zero-width fit + +## Acceptance Criteria + +1. Correctness: + - zero pixel regressions in existing render baseline suite, + - all new native edge-case tests green. +2. Performance: + - `PerformOffscreenLayout` improvement in at least 3 of 4 heavy scenarios, + - average `PerformOffscreenLayout` reduction >= 20% in heavy-scenario subset. +3. Safety: + - feature flags allow disabling each path independently, + - no memory growth trend in stress loop. + +## Managed-Layer Scroll Rendering Fix (DataTree Separator Lines) + +### Problem + +DataTree is a scrollable `UserControl` that hosts child `Slice` controls (each a separate HWND). +Thin horizontal separator lines are painted in the parent background between slices. During +scrolling, Windows bitblts the entire client area (including parent-painted separator pixels) +to the new scroll position and only repaints the newly-exposed strip. This caused separator +lines to accumulate at wrong positions — visible as persistent gray line artifacts during +fast scrolling. + +The original code used `ScrollWindowEx` (P/Invoke) to manually bitblt separator content during +scroll. This was both unnecessary (WinForms handles scrolling natively) and the root cause of +additional jitter because manually blitting parent-painted content races with the framework's +own scroll handling. + +### Approaches Tried + +1. **ScrollWindowEx removal**: Removed all `ScrollWindowEx` interop (`DllImport`, `RECT` struct, + `SW_INVALIDATE` constant, `m_inScrollWindowEx` flag, `ScrollParentPaintedContent()` method). + This eliminated the manual bitblt jitter but did not solve the stale line artifacts from + Windows' own scroll bitblt. + +2. **SeparatorOverlayControl**: A dedicated transparent child control drawn on top of all slices + to paint separator lines independently. Failed: (a) caused `NullReferenceException` because + `Controls.Add` triggered layout before `Slices` was initialized; (b) after fixing the crash, + the opaque sibling covered slice content — WinForms HWND-per-control architecture made this + fundamentally unworkable without `WS_CLIPSIBLINGS` management. Fully reverted. + +3. **OnScroll override**: Added `Invalidate(false)` in `OnScroll`. Partially worked but + `OnScroll` does not fire for mouse wheel input. + +4. **WndProc scroll message interception (final solution)**: Override `WndProc` to catch + `WM_VSCROLL`, `WM_HSCROLL`, `WM_MOUSEWHEEL`, and `WM_MOUSEHWHEEL`. After `base.WndProc`, + call `Invalidate(false); Update();`. This works because: + - `Invalidate(false)` invalidates only the parent background (separator gap areas), not + child HWNDs + - `Update()` forces synchronous `WM_PAINT` processing before the next scroll message can + bitblt stale pixels + - Covers all scroll input vectors (scrollbar drag, mouse wheel, horizontal wheel) + +### Additional Managed Optimizations + +- **Double buffering**: `SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint, true)` + eliminates flicker from the synchronous repaint. + +- **Deferred slice prewarm**: After scroll, queues idle-time work to pre-materialize lazy slices + in the scroll direction ahead of the viewport. Uses `IdleQueue` integration when available, + with configurable chunk size and time budget to avoid jank. + +- **VwDrawRootBuffered cached frame reuse**: When `PrepareToDrawRoot` returns `kxpdrInvalidate` + (content not yet ready), the previous successfully-drawn frame is re-blitted instead of + showing a blank or partially-drawn frame. Implemented in both managed (`VwDrawRootBuffered.cs`) + and native (`VwRootBox.cpp`) paths so the fallback is always available during invalidate-only passes. + +### Key Insight + +WinForms hosts each child control in a separate native HWND. Unlike a browser (single composited +texture), parent-painted content between child HWNDs is just pixels in the parent DC — Windows +has no knowledge that those pixels represent separator lines. When scrolling bitblts the client +area, those pixels move with everything else. The fix is to repaint them synchronously after +every scroll event, which has negligible cost because `Invalidate(false)` skips child +invalidation and separator line drawing is a handful of `DrawLine` calls. + +## Deliverables + +1. Code changes for paths 1, 2, and 5. +2. New or updated native tests for edge-case correctness. +3. New or updated render and timing tests plus scenario coverage. +4. Before/after benchmark artifacts and summary note linked from this change. +5. DataTree scroll rendering fix with separator line artifact elimination. diff --git a/openspec/changes/render-speedup-benchmark/RENDER_OPTIMIZATIONS.md b/openspec/changes/render-speedup-benchmark/RENDER_OPTIMIZATIONS.md new file mode 100644 index 0000000000..b2c4a36594 --- /dev/null +++ b/openspec/changes/render-speedup-benchmark/RENDER_OPTIMIZATIONS.md @@ -0,0 +1,148 @@ +# Render Optimizations (Consolidated) + +This file is the single source of truth for render/layout optimization work done on branch `001-render-speedup`. + +## Scope and Evidence + +- Branch commit history since `main`: + - `d6741a0bd` perf: cold render optimizations (HFONT cache, color caching, NFC bypass, reconstruct guard fix) + - `b7f52166b` perf(render): benchmark and snapshot stabilization + - `d0066f324` perf(render): DataTree layout speedups and benchmark coverage + - `c4678e824` squashed foundational change set +- Latest benchmark outputs used here: + - `Output/RenderBenchmarks/summary.md` + - `Output/RenderBenchmarks/results.json` + - `Output/RenderBenchmarks/datatree-timings.json` + - `Output/Debug/TestResults/vstest.console.log` + +## Main Paths and Bottlenecks (Lexical Edit View) + +There are two related pipelines. + +1. Views-engine benchmark pipeline (`RenderTimingSuite`) +- `CreateView` -> `MakeRoot` -> `PerformOffscreenLayout` -> capture (`PrepareToDraw` + `DrawTheRoot`) +- Current stage breakdown (`summary.md`, latest run): + - `PerformOffscreenLayout`: 67.9% (dominant) + - `DrawTheRoot`: 17.2% + - `CreateView`: 7.2% + - `MakeRoot`: 7.1% + - `PrepareToDraw`/`Reconstruct`: negligible + +2. Lexical DataTree edit-view pipeline (`DataTreeTiming`) +- `PopulateSlices` (WinForms + XML-driven slice construction) +- layout convergence/visibility operations +- composite capture (`DrawToBitmap` + Views overlay) +- Current timing examples (`datatree-timings.json`, latest run): + - `timing-shallow`: total 985.3 ms + - `timing-deep`: total 385.8 ms + - `timing-extreme`: total 465.1 ms + - `paint-extreme`: total 479.4 ms + - detailed paint line in test log: capture about 4798 ms for full 1007x6072 surface + +Cold-start interpretation: +- For Views pipeline, cold time is still mostly layout (`PerformOffscreenLayout`). +- For DataTree lexical edit view, total cold-like startup cost is often dominated by slice population + full-surface paint/capture work. + +## What Was Done and Why It Helped + +## A. Warm-path structural wins (major) + +1. Layout/reconstruct guarding (`VwRootBox` + `SimpleRootSite`) +- Added and wired guard state (`m_fNeedsLayout`, `m_fNeedsReconstruct`, width checks, `NeedsReconstruct` COM surface). +- Effect: redundant warm reconstruct/layout cycles are bypassed when content/width is unchanged. +- Result trend: warm render collapsed from baseline triple-digit ms to near-zero in benchmark runs. + +2. Harness-side redundant work removal (`RenderBenchmarkHarness`) +- Cached offscreen GDI resources and removed repeated setup overhead in warm path. +- Effect: reduced benchmark harness overhead and made warm numbers stable. + +## B. Cold-path wins (targeted) + +Implemented in `d6741a0bd`: + +1. PATH-C1 HFONT cache in `VwGraphics` +- New 8-entry LRU-like cache keyed by font-relevant `LgCharRenderProps` region. +- Avoids repetitive `CreateFontIndirect`/delete churn in mixed writing-system text. +- Measured contribution: modest but real cold-start improvement. + +2. PATH-C2 color state cache in `VwGraphics` +- Skips redundant `SetTextColor`/`SetBkColor`/`SetBkMode` calls. +- Measured contribution: small cold-start improvement. + +3. PATH-N1 NFC bypass in Uniscribe path +- Added NFC-awareness flag flow and fast identity-offset path when text is already NFC. +- Reduced repeated normalization/fetch overhead in line-break and run handling. +- Measured contribution: largest cold improvement among the late native optimizations. + +## C. DataTree/WinForms hot-path wins + +Implemented mainly in `d0066f324` and `b7f52166b`: + +- Construction batching and tab-index optimization (`ConstructingSlices` guards) +- Layout churn reduction (`SetWidthForDataTreeLayout` early-exit, size-change guards) +- Paint-path reductions (clip culling, cached XML attribute reads, high-water visibility tracking) +- Binary search for first visible slice in paint path +- Added optimization regression tests (`DataTreeOpt_*`) and expanded timing coverage + +These changes reduced repeated O(N) and O(N^2)-like behavior in common DataTree layout/paint loops. + +## What Was Considered and Discarded (or Deferred) + +1. Deferred layout inside `Reconstruct` (PATH-L2) +- Considered removing internal layout call. +- Rejected because `Reconstruct` callers rely on immediate post-reconstruct dimensions. + +2. Paragraph-level cache for reconstruct flow (PATH-L3) +- Considered caching `VwParagraphBox` layout across reconstruct. +- Deferred for this path because reconstruct rebuilds boxes, so previous paragraph objects are not reused. + +3. `ShowSubControls` visibility guard (DataTree) +- Assessed as too little benefit for added complexity in current benchmarks. + +4. Partial-paint-only gains that do not move full-capture benchmarks +- Clip culling helps real partial paints, but full-surface benchmark captures show little/no gain from that specific mechanism. + +5. Some data-tree optimizations had architecture benefit but limited measurable impact in current scenarios +- Example: lazy expansion suspension path is valid but timing scenarios do not always trigger it. + +## What Could Still Be Done (Cold Start Only) + +The following estimates are for cold behavior, not warm steady-state. Risk and savings are relative and based on current stage shares (`summary.md`) and DataTree measurements. + +1. Reduce `PerformOffscreenLayout` cost further (highest ROI) +- Ideas: cache itemization/shaping artifacts at segment level, reduce repeat line-break work, smarter reuse of per-run analysis. +- Risk: Medium-High (native text pipeline correctness is sensitive). +- Potential cold savings: 10-25% total cold (because this stage is about 68% of cold benchmark time). + +2. Lower DataTree `PopulateSlices` startup overhead +- Ideas: defer creation for non-visible optional slices, precompiled layout metadata, stricter construction batching. +- Risk: Medium (high interaction surface with existing slice lifecycle). +- Potential cold savings: 15-35% on lexical edit startup scenarios, especially deep/extreme entries. + +3. Reduce full-surface capture/paint work for very tall views +- Ideas: avoid work on non-visible regions for cold startup render path when possible; keep viewport-first rendering and defer below-fold composition. +- Risk: Medium. +- Potential cold savings: 10-20% in extreme lexical entries (bigger in test-capture workflows than normal UI first paint). + +4. Startup/JIT warming for first scenario spikes +- Ideas: pre-touch key code paths and objects during app startup phase. +- Risk: Low-Medium (trade startup work for smoother first action). +- Potential cold savings: 5-15% on first-open latency only. + +5. Medium-term architectural path: reduce WinForms control explosion in DataTree +- Ideas: stronger virtualization and view-model separation in edit view pipeline. +- Risk: High. +- Potential cold savings: 25-50%+ on heavy lexical entries, but not a short patch-cycle change. + +## Current Status Snapshot + +- Latest run (`2026-03-09`) in `summary.md`: + - Avg cold render: 64.98 ms + - Avg warm render: 0.01 ms + - Top contributor remains `PerformOffscreenLayout`. +- DataTree timing remains the largest practical lexical edit-view cost center for deep/extreme structures. + +## Notes + +- This document intentionally consolidates and replaces prior speedup/timing markdown artifacts for this branch. +- Keep future updates here instead of creating new speedup summary files. \ No newline at end of file diff --git a/openspec/changes/render-speedup-benchmark/VERIFY_WINFORMS.md b/openspec/changes/render-speedup-benchmark/VERIFY_WINFORMS.md new file mode 100644 index 0000000000..3e17a9ff2d --- /dev/null +++ b/openspec/changes/render-speedup-benchmark/VERIFY_WINFORMS.md @@ -0,0 +1,500 @@ +# FieldWorks Verify.WinForms Integration Plan + +## Executive Summary + +**Feasibility: High. Core infrastructure is proven.** + +FieldWorks uses a hybrid architecture where the C++ rendering engine (`Views.dll`) paints onto a managed .NET `UserControl` (`SimpleRootSite`) via `OnPaint` and GDI HDCs. We have built a working test harness that captures pixel-perfect bitmaps from this pipeline using `IVwDrawRootBuffered`, bypassing the unreliable `DrawToBitmap` path entirely. The harness renders richly styled Scripture content (bold section headings, colored chapter/verse numbers, indented paragraphs) through the production `StVc` view constructor against a real file-backed `LcmCache`. + +The next step is replacing our hand-rolled baseline comparison infrastructure with [Verify](https://github.com/VerifyTests/Verify), which provides diff tooling, automatic `.verified.png` management, and seamless NUnit integration — all compatible with .NET Framework 4.8. + +--- + +## Current State (Phases 1-2 Complete) + +### What's Working + +| Component | File | Status | +|-----------|------|--------| +| Real-data test base | `RootSiteTests/RealDataTestsBase.cs` | **Done** — Spins up temporary `.fwdata` projects via `FwNewLangProjectModel` | +| Scripture style creation | `RootSiteTests/RenderBenchmarkTestsBase.cs` | **Done** — Creates `Paragraph`, `Section Head`, `Chapter Number`, `Verse Number`, `Title Main` styles with full formatting rules (bold, colors, sizes, alignment, superscript) | +| Rich test data | `RootSiteTests/RenderBenchmarkTestsBase.cs` | **Done** — `AddRichSections()` generates section headings, chapter numbers, verse numbers, and varied prose text | +| View constructor | `RootSiteTests/GenericScriptureView.cs` | **Done** — `GenericScriptureVc` extends `StVc`, handles Book→Sections→Heading+Content hierarchy | +| Bitmap capture | `RootSiteTests/RenderBenchmarkHarness.cs` | **Done** — Uses `VwDrawRootBuffered.DrawTheRoot()` to render RootBox directly to GDI+ bitmap | +| Offscreen layout | `RootSiteTests/RenderBenchmarkHarness.cs` | **Done** — `VwGraphicsWin32` drives layout without a visible window | +| Baseline comparison | `RootSiteTests/RenderBitmapComparer.cs` | **Done** — Pixel-diff with diff-image generation | +| Environment validation | `RootSiteTests/RenderEnvironmentValidator.cs` | **Done** — DPI/theme/font hashing for deterministic checks | +| Content density check | `RootSiteTests/RenderBaselineTests.cs` | **Done** — `ValidateBitmapContent()` ensures >0.4% non-white pixels (currently hitting 6.3%) | +| All tests passing | 43/43 Render tests | **Done** — 4 baseline infra + 15 Verify snapshots + 15 timing suite + 6 DataTree Verify + 3 DataTree timing | + +### Key Metrics +- **Content density**: 6.30% non-white pixels (up from 0.46% with plain text) +- **Cold render**: ~147ms (includes view creation, MakeRoot, layout) +- **Warm render**: ~107ms (Reconstruct + relayout) +- **Test suite time**: ~58s for RootSiteTests (34 tests), ~7s for DataTree (9 tests) + +### Problems Solved + +1. **Mock vs Real data** — `ScrInMemoryLcmTestBase` lacked the deep metadata `StVc` needs. Solved by creating real XML-backed projects via `FwNewLangProjectModel`. + +2. **Missing styles = plain black text** — New projects from the template have no Scripture styles. The Views engine fell back to unformatted defaults. Solved by manually creating styles with `IStStyleFactory.Create()` and setting `Rules` via `ITsPropsBldr`. + +3. **`DrawToBitmap` failures** — WinForms `DrawToBitmap` returns black for Views controls because painting goes through native `HDC` interop. Solved by using `VwDrawRootBuffered` to render the `IVwRootBox` directly to an offscreen bitmap. + +4. **Handle creation crash** — `SimpleRootSite.OnHandleCreated` called `MakeRoot()` with wrong fragment before test data was ready. Solved by setting `m_fMakeRootWhenHandleIsCreated = false` and calling `MakeRoot()` explicitly with the correct parameters. + +--- + +## 10-Point Comparison & Analysis + +### 1. Rendering Architecture Compatibility +- **Verify.WinForms** uses `Control.DrawToBitmap` internally, which **does not work** for FieldWorks Views controls. +- **Our approach**: Use `IVwDrawRootBuffered` to render the `IVwRootBox` directly to a `System.Drawing.Bitmap`, then pass the raw bitmap to Verify for snapshot management. +- **We don't need `Verify.WinForms`** — only `Verify.NUnit` for bitmap stream verification. + +### 2. Handling Complex Scripts & Text Rendering +- Snapshot testing catches subtle kerning, ligature, and line-breaking regressions that are impossible to assert programmatically. +- Our harness already renders through the full production pipeline (Graphite, Uniscribe, ICU) via `StVc`. + +### 3. Test Harness Complexity (Solved) +- `RealDataTestsBase` creates temporary `.fwdata` projects with full schema. +- `RenderBenchmarkTestsBase` populates Scripture styles and rich data. +- `RenderBenchmarkHarness` handles view lifecycle and bitmap capture. + +### 4. GDI Handle Management +- `PerformOffscreenLayout()` and `CaptureViewBitmap()` carefully acquire and release HDCs in try/finally blocks. +- View disposal cascades through Form → Control cleanup. + +### 5. Cross-Platform / OS Rendering Differences +- Font rendering varies with ClearType settings, DPI, and Windows version. +- `RenderEnvironmentValidator` hashes these settings so tests can detect environment drift. +- For CI, consider `Verify.Phash` (perceptual hashing) if pixel-exact comparison is too strict. + +### 6. Tooling Integration +- **NUnit** is already the project's test framework. +- **Verify.NUnit** provides `[VerifyAttribute]` and `Verifier.Verify()` for net48. +- Packages target `net48` explicitly. + +### 7. Performance +- ~260ms cold, ~180ms warm per render. Acceptable for integration tests. +- Data setup adds ~3s per test (project creation + DB population). + +### 8. Failure Diagnostics +- Verify automatically opens a diff tool on mismatch. +- `.received.png` vs `.verified.png` side-by-side comparison. +- Our `RenderBitmapComparer` can still generate diff images as supplementary evidence. + +### 9. Custom Control Support +- Not needed. We bypass `Control.DrawToBitmap` entirely and verify raw bitmaps. + +### 10. Fallback Strategy +- If Verify integration has issues, our existing `RenderBitmapComparer` + `simple.png` baseline approach is fully functional. +- Migration is incremental — we can keep both systems running in parallel. + +--- + +## Implementation Plan + +### Phase 1: Stabilization ✅ COMPLETE +1. ~~Revert hacks~~ — `StVc.cs` is clean; `GenericScriptureView.cs` uses proper `MakeRoot` override. +2. ~~Clean slate~~ — All 8 tests pass with rich formatted rendering. + +### Phase 2: Test Harness "Real Data" ✅ COMPLETE +1. ~~Create `RealDataTestsBase`~~ — `Src/Common/RootSite/RootSiteTests/RealDataTestsBase.cs` +2. ~~Refactor Benchmark~~ — `RenderBenchmarkTestsBase` inherits from `RealDataTestsBase` +3. ~~Scripture styles~~ — `CreateScriptureStyles()` populates `Paragraph`, `Section Head`, `Chapter Number`, `Verse Number`, `Title Main` +4. ~~Rich data~~ — `AddRichSections()` creates headings, chapter/verse markers, varied prose + +### Phase 3: Verify Integration ✅ COMPLETE + +#### 3.1 Install NuGet Package +Add to `RootSiteTests.csproj`: +```xml + +``` + +**Not needed**: `Verify.WinForms` — we capture bitmaps directly via `IVwDrawRootBuffered`. + +#### 3.2 Configure Verify Settings + +Create `RootSiteTests/VerifySetup.cs` using NUnit's `[SetUpFixture]` (required because FieldWorks uses C# 8.0 / `LangVersion=8.0` globally, so `[ModuleInitializer]` from C# 9 is unavailable): + +```csharp +[SetUpFixture] +public class VerifySetup +{ + [OneTimeSetUp] + public void Setup() + { + // Use Verify's default PNG comparison for bitmap streams + VerifierSettings.ScrubEmptyLines(); + + // Don't auto-open diff tool in CI + if (Environment.GetEnvironmentVariable("CI") != null) + DiffRunner.Disabled = true; + } +} +``` + +#### 3.3 Register Custom Bitmap Converter + +Register a typed converter so `Verify(bitmap)` works directly: + +```csharp +VerifierSettings.RegisterFileConverter( + conversion: (bitmap, context) => + { + var stream = new MemoryStream(); + bitmap.Save(stream, ImageFormat.Png); + stream.Position = 0; + return new ConversionResult(null, "png", stream); + }); +``` + +#### 3.4 Create Verify-Based Test + +Add `RenderVerifyTests.cs` alongside existing `RenderBaselineTests.cs`: + +```csharp +[TestFixture] +[Category("RenderBenchmark")] +public class RenderVerifyTests : RenderBenchmarkTestsBase +{ + protected override void CreateTestData() => SetupScenarioData("simple"); + + [Test] + public Task SimpleScenario_MatchesVerifiedSnapshot() + { + var scenario = new RenderScenario + { + Id = "simple", + RootObjectHvo = m_hvoRoot, + RootFlid = m_flidContainingTexts, + FragmentId = m_frag + }; + + using var harness = new RenderBenchmarkHarness(Cache, scenario); + harness.ExecuteColdRender(); + var bitmap = harness.CaptureViewBitmap(); + + return Verifier.Verify(bitmap); + // First run: creates RenderVerifyTests.SimpleScenario_MatchesVerifiedSnapshot.verified.png + // Subsequent runs: compares against verified file + } +} +``` + +#### 3.5 Verified Files Location + +Verify stores `.verified.png` files next to the test source. Structure: +``` +RootSiteTests/ +├── RenderVerifyTests.cs +├── RenderVerifyTests.SimpleScenario_MatchesVerifiedSnapshot.verified.png +├── RenderVerifyTests.MediumScenario_MatchesVerifiedSnapshot.verified.png +└── ... +``` + +These files are committed to source control and serve as the approved baselines. + +#### 3.6 Git Configuration + +Add to `.gitattributes`: +``` +*.verified.png binary +*.received.png binary +``` + +Add to `.gitignore`: +``` +*.received.png +``` + +### Phase 4: Pilot Test ✅ COMPLETE + +1. ~~**Run**~~ `SimpleScenario_MatchesVerifiedSnapshot` — first run created `.received.png`. +2. ~~**Accept**~~ — Copied `.received.png` to `.verified.png`. +3. ~~**Commit**~~ the `.verified.png` file. +4. ~~**Re-run**~~ — test passes, comparing against the committed baseline. + +### Phase 5: Expand Coverage ✅ COMPLETE + +| Scenario | Data | What It Tests | +|----------|------|---------------| +| `simple` | 3 sections, 4 verses each | Basic formatting pipeline | +| `medium` | 5 sections, 6 verses each | Style resolution at scale | +| `complex` | 10 sections, 8 verses each | Layout performance and wrapping | +| `deep-nested` | 3 sections, 12 verses each | Dense content in single paragraphs | +| `custom-heavy` | 5 sections, 8 verses each | Mixed style properties | +| `many-paragraphs` | 50 sections, 1 verse each | Paragraph layout overhead | +| `footnote-heavy` | 8 sections, 20 verses + footnotes | Footnote rendering path | +| `mixed-styles` | 6 sections, unique formatting per verse | Style resolver stress | +| `long-prose` | 4 sections, 80 verses each | Line-breaking computation | +| `multi-book` | 3 books, 5 sections each | Large cache stress | +| `rtl-script` | Arabic/Hebrew text | Bidirectional layout | +| `multi-ws` | Mixed writing systems | Font fallback and WS switching | + +### Phase 6: Deprecate Hand-Rolled Comparison ✅ COMPLETE + +Completed: +1. ~~Remove `RenderBitmapComparer.cs` and hand-rolled diff logic.~~ — Deleted. +2. ~~Remove `TestData/RenderSnapshots/` directory (replaced by `.verified.png` files).~~ — Cleared. +3. Keep `RenderBenchmarkHarness` and `RenderEnvironmentValidator` — they're the capture infrastructure. +4. `RenderBaselineTests` trimmed to 4 infrastructure tests (harness, warm/cold, environment, diagnostics). +5. `RenderTimingSuiteTests` uses content-density sanity check instead of pixel comparison. + +### Phase 7: Lexical Entry Benchmarks ✅ COMPLETE + +**Motivation**: The primary speed-up target is deeply nested lexical entry rendering. In production, `XmlVc.ProcessPartRef` with `visibility="ifdata"` causes every part to render its entire subtree **twice** — once via `TestCollectorEnv` to check if data exists, then again into the real `IVwEnv`. With recursive `LexSense → Senses → LexSense` layouts and ~15 ifdata parts per sense, this creates O(N·2^d) work. The benchmarks track rendering time at varying nesting depths to quantify speedup from optimizations. + +Completed: +1. Created `GenericLexEntryView.cs` with custom `LexEntryVc : VwBaseVc` — exercises the same recursive nested-field pattern as `XmlVc` with configurable `SimulateIfDataDoubleRender` flag for modeling the ifdata overhead. +2. Extended `RenderBenchmarkHarness` with `RenderViewType` enum (`Scripture`, `LexEntry`) and split view creation into `CreateScriptureView()` / `CreateLexEntryView()`. +3. Added 3 lex entry scenarios to `RenderBenchmarkTestsBase` — `lex-shallow` (depth 2, breadth 3 = 12 senses), `lex-deep` (depth 4, breadth 2 = 30 senses), `lex-extreme` (depth 6, breadth 2 = 126 senses). +4. Added `CreateLexEntryScenario()` and `CreateNestedSenses()` — creates realistic lex entry data with headword, glosses, definitions, and recursively nested subsenses using `ILexEntryFactory`/`ILexSenseFactory`/`IMoStemAllomorphFactory`. +5. Extended `RenderBenchmarkScenarios.json` with 3 new lex scenarios (with `viewType: "LexEntry"`). +6. Updated both `RenderTimingSuiteTests` and `RenderVerifyTests` to propagate `ViewType` and `SimulateIfDataDoubleRender` from config. +7. Accepted 3 new `.verified.png` baselines for lex entry scenarios. + +**Lex Entry Rendering Metrics**: +| Scenario | Senses | Depth | Non-white density | +|----------|--------|-------|-------------------| +| `lex-shallow` | 12 | 2 | 5.83% | +| `lex-deep` | 30 | 4 | 6.78% | +| `lex-extreme` | 126 | 6 | 6.94% | + +### Phase 8: Shared Render Verification Library _(DONE)_ + +**Vision**: Extract the render capture/comparison engine into a shared class library (`RenderVerification`) that any test project can consume. This library does not contain tests itself — it provides the infrastructure to create views, render them to bitmaps, and compare against established baselines. + +**Location**: `Src/Common/RenderVerification/RenderVerification.csproj` (class library, not test project) + +**What was built**: +- `RenderVerification.csproj` — SDK-style, net48, references DetailControls + FwUtils +- `DataTreeRenderHarness` — Creates DataTree with Mediator/PropertyTable, loads layout inventories, calls ShowObject(), captures composite bitmaps, tracks timing +- `CompositeViewCapture` — Multi-pass capture: DrawToBitmap for WinForms chrome + VwDrawRootBuffered overlay per ViewSlice +- `DataTreeTimingInfo` — Model class for timing data +- Added to `FieldWorks.sln` + +**What moved from RootSiteTests → RenderVerification** (infrastructure/model classes): +- `RenderEnvironmentValidator` — DPI/theme/font determinism checks +- `RenderDiagnosticsToggle` — Trace switch management +- `RenderBenchmarkResults` — Timing result aggregation +- `RenderBenchmarkComparer` — Benchmark timing comparison +- `RenderBenchmarkReportWriter` — Timing report generation +- `RenderScenarioDataBuilder` — JSON scenario loading +- `RenderTraceParser` — Trace output parsing +- `RenderModels.cs` (new) — Extracted `RenderScenario`, `RenderTimingResult`, `RenderViewType` model classes + +**What stays in RootSiteTests** (depends on test-only `DummyBasicView`): +- `RenderBenchmarkHarness` — Core bitmap capture via `VwDrawRootBuffered` (creates `GenericScriptureView`/`GenericLexEntryView` which extend `DummyBasicView`) +- `GenericScriptureView` + `GenericScriptureVc` — Scripture rendering path (extends `DummyBasicView`) +- `GenericLexEntryView` + `LexEntryVc` — Views-only lex entry rendering path (extends `DummyBasicView`) +- `RenderBenchmarkTestsBase`, `RealDataTestsBase` — Test base classes +- All test classes (`RenderVerifyTests`, `RenderTimingSuiteTests`, `RenderBaselineTests`) +- `VerifySetup.cs` — Verify configuration +- `DummyBasicView`, `DummyBasicViewVc` — Shared test view control used broadly + +**RootSiteTests.csproj** now references `RenderVerification.csproj` as a `ProjectReference` to access the extracted infrastructure classes. + +**What's new in RenderVerification**: +- `DataTreeRenderHarness` — Creates a `DataTree` with production layout inventories, populates it via `ShowObject()`, captures full-view bitmaps including all WinForms chrome +- `CompositeViewCapture` — Multi-pass bitmap capture: + 1. `DrawToBitmap` on the `DataTree` control to capture WinForms chrome (labels, grey backgrounds, splitters, expand/collapse icons, section headers) + 2. Iterate `ViewSlice` children, render each `RootBox` via `VwDrawRootBuffered` into the correct region + 3. Composite the Views-rendered text over the WinForms chrome bitmap +- `RenderViewType.DataTree` enum value — New pipeline for full DataTree/Slice rendering +- Layout inventory helpers — Load production `.fwlayout` and `*Parts.xml` from `DistFiles/Language Explorer/Configuration/Parts/` + +**Dependencies** (RenderVerification.csproj references): +- `DetailControls.csproj` (brings DataTree, Slice, SliceFactory, ViewSlice, SummarySlice, etc.) +- `RootSite.csproj` / `SimpleRootSite.csproj` (base view rendering) +- `ViewsInterfaces.csproj` (IVwRootBox, IVwDrawRootBuffered) +- `xCore.csproj` + `xCoreInterfaces.csproj` (Mediator, PropertyTable — required by DataTree) +- `XMLViews.csproj` (XmlVc, LayoutCache, Inventory — required by DataTree) +- `FwUtils.csproj` (FwDirectoryFinder for locating DistFiles) +- Verify (31.11.0) + Newtonsoft.Json (13.0.4) NuGet packages +- SIL.LCModel packages + +**Consumer pattern** (how test projects use it): +```csharp +// In any test project: +using SIL.FieldWorks.Common.RenderVerification; + +// Views-only capture (existing): +using (var harness = new RenderBenchmarkHarness(cache, scenario)) +{ + harness.ExecuteColdRender(); + var bitmap = harness.CaptureViewBitmap(); +} + +// Full DataTree capture (new): +using (var harness = new DataTreeRenderHarness(cache, entry, "Normal")) +{ + harness.PopulateSlices(); + var bitmap = harness.CaptureCompositeBitmap(); // WinForms chrome + Views content + // bitmap includes grey labels, icons, expand/collapse, AND rendered text +} +``` + +Steps: +1. Create `Src/Common/RenderVerification/RenderVerification.csproj` with dependencies +2. Move existing harness classes from `RootSiteTests` → `RenderVerification` +3. Update `RootSiteTests.csproj` to reference `RenderVerification` instead of containing the infrastructure directly +4. Implement `DataTreeRenderHarness` with composite bitmap capture +5. Implement `CompositeViewCapture` (DrawToBitmap + VwDrawRootBuffered overlay) +6. Add layout inventory loading from `DistFiles/` production XML +7. Verify all existing tests still pass after extraction + +### Phase 9: DataTree Full-View Verification Tests _(DONE)_ + +**Motivation**: The full lexical entry edit view includes WinForms UI chrome critical to verify: grey field labels, writing system indicators, expand/collapse tree icons, section headers, separator lines, indentation of nested senses. + +**Location**: `DetailControlsTests/DataTreeRenderTests.cs` — 6 Verify snapshot tests + 3 timing benchmarks + +**What was built**: +- `DataTreeRenderTests.cs` with 9 tests: + - 6 Verify snapshot tests: simple (3 senses), deep (4-level nesting), extreme (6-level nesting), collapsed (minimal 1-sense), expanded (full enriched 4-sense), multiws (French + English) + - 3 timing benchmarks: shallow/deep/extreme with parameterized depth/breadth +- Data factories: `CreateSimpleEntry()`, `CreateDeepEntry()`, `CreateExtremeEntry()`, `CreateCollapsedEntry()`, `CreateExpandedEntry()`, `CreateMultiWsEntry()`, `CreateNestedSenses()` (recursive) +- Content density validation, InnerVerifier integration (2-arg constructor + VerifyStream) +- Uses test layout inventories (`OptSensesEty` layout) from DetailControlsTests +- 6 `.verified.png` baselines accepted +- All 9/9 tests passing + +**Test scenarios**: +| Scenario ID | Description | What it exercises | +|-------------|-------------|-------------------| +| `datatree-lex-simple` | Lex entry with 3 senses, default layout | Basic DataTree population + slice chrome | +| `datatree-lex-deep` | 4-level nested senses, all expanded | Recursive slice indentation + tree lines | +| `datatree-lex-extreme` | 6-level nesting, 126 senses | Scrollable DataTree stress + slice count | +| `datatree-lex-collapsed` | Minimal 1-sense entry, no optional fields | Fewest slices, baseline layout | +| `datatree-lex-expanded` | Full 4-sense entry with all enrichment fields | Maximum slice count, all chrome visible (pronounciations, notes, bibliography, etc.) | +| `datatree-lex-multiws` | Entry with English + French writing systems | Multi-WS MultiStringSlice layout, taller slice heights | + +**DataTree Rendering Metrics**: +| Scenario | Slice Count | Populate Time | Density | Height | +|----------|-------------|---------------|---------|--------| +| `collapsed` | 5 | ~359ms | 1.32% | 400px | +| `simple` | 14 | ~59ms | 2.32% | 768px | +| `deep` | 14 | ~71ms | 1.62% | 1100px | +| `extreme` | 14 | ~35ms | 1.62% | 1100px | +| `expanded` | 19 | ~76ms | 2.25% | 1100px | +| `multiws` | 12 | ~49ms | 1.98% | 768px | + +**What's captured per scenario**: +- Full composite bitmap (WinForms chrome + Views text content) +- `.verified.png` baseline via Verify for pixel-perfect regression +- Timing: DataTree population (CreateSlices), layout, composite capture +- Slice count and type distribution (how many MultiStringSlice, ViewSlice, SummarySlice, etc.) + +**What the bitmaps should show** (matching the FLEx screenshot): +- Blue/grey header bar with "Entry" label _(if contained in DataTree)_ +- Summary line with formatted headword, grammar, sense numbers +- "Lexeme Form" / "Citation Form" grey labels with WS indicators +- Sense summary lines ("Sense 1 — to do - v") with expand/collapse buttons +- Indented subsense sections +- "Variants" / "Allomorphs" / "Grammatical Info. Details" / "Publication Settings" headers +- Grey backgrounds, separator lines, tree indentation lines + +Steps: +1. Add `Verify` (31.11.0) NuGet package to `DetailControlsTests.csproj` +2. Create `DataTreeRenderTests.cs` — Verify snapshot tests for each DataTree scenario +3. Create `DataTreeTimingTests.cs` — Timing benchmarks measuring DataTree population + rendering +4. Create shared data factory for lex entries with controlled structure (headword, senses, glosses, variants, allomorphs) +5. Load production layout inventories from `DistFiles/` for realistic slice generation +6. Accept initial `.verified.png` baselines +7. Validate all scenarios produce non-trivial bitmaps (content density check) + +--- + +## Architecture Diagram + +``` +┌─────────────────────────────────────────────────────────────────────────────┐ +│ Test Projects (consumers) │ +│ │ +│ RootSiteTests/ DetailControlsTests/ │ +│ RenderVerifyTests DataTreeRenderTests (Phase 9) │ +│ RenderTimingSuiteTests DataTreeTimingTests (Phase 9) │ +│ RenderBaselineTests DataTreeTests (existing) │ +│ ↓ ↓ │ +│ RenderBenchmarkTestsBase (shared data factories) │ +│ (styles + data) ↓ │ +│ ↓ ↓ │ +│ RealDataTestsBase ↓ │ +│ (FwNewLangProjectModel) ↓ │ +└──────────────┬─────────────────────────────────┼────────────────────────────┘ + │ │ +┌──────────────▼─────────────────────────────────▼────────────────────────────┐ +│ RenderVerification (shared library) (Phase 8) │ +│ │ +│ Views-Only Path: DataTree Path: │ +│ RenderBenchmarkHarness DataTreeRenderHarness │ +│ ├── CreateScriptureView() ├── DataTree + Inventory.Load() │ +│ ├── CreateLexEntryView() ├── ShowObject() → CreateSlices() │ +│ └── CaptureViewBitmap() └── CaptureCompositeBitmap() │ +│ └ VwDrawRootBuffered ├ DrawToBitmap (WinForms chrome) │ +│ └ VwDrawRootBuffered per ViewSlice │ +│ │ +│ Shared Infrastructure: │ +│ RenderEnvironmentValidator CompositeViewCapture │ +│ RenderDiagnosticsToggle RenderScenario + RenderViewType │ +│ RenderBenchmarkReportWriter Verify InnerVerifier wrapper │ +└──────────────┬─────────────────────────────────┬────────────────────────────┘ + │ │ +┌──────────────▼─────────────────────────────────▼────────────────────────────┐ +│ Views Engine (C++ / COM) DataTree / Slice (WinForms) │ +│ │ +│ IVwRootBox → IVwRootSite DataTree : UserControl │ +│ StVc, LexEntryVc, XmlVc ├── Slice (SplitContainer) │ +│ IVwStylesheet (LcmStyleSheet) │ ├── SliceTreeNode (grey labels) │ +│ IVwDrawRootBuffered (HDC→Bitmap) │ └── Control (editor panel) │ +│ ├── ViewSlice (Views RootSite) │ +│ ├── SummarySlice (sense summaries) │ +│ └── MultiStringSlice (multi-WS) │ +└─────────────────────────────────────────────────────────────────────────────┘ +``` + +--- + +## Risk Register + +| # | Risk | Likelihood | Impact | Mitigation | +|---|------|-----------|--------|------------| +| 1 | Verify package breaks on net48 in future | Low | High | Pin version; Verify has explicit net48 support | +| 2 | Pixel differences across machines | Medium | Medium | Use `RenderEnvironmentValidator` hash; consider `Verify.Phash` for fuzzy matching | +| 3 | Test data changes break baselines | Medium | Low | Re-accept `.verified.png`; clear separation between data setup and rendering | +| 4 | GDI handle leaks in long test runs | Low | High | Proven try/finally pattern in harness; monitor in CI | +| 5 | Charis SIL font not installed on CI | Medium | High | Add font dependency to CI setup or use system default with known metrics | +| 6 | DataTree composite capture misalignment | Medium | Medium | ViewSlice regions must precisely match DrawToBitmap coordinates; validate with edge-detection in tests | +| 7 | Production layout XML changes break DataTree snapshots | Medium | Low | Re-accept `.verified.png`; layout inventories loaded from `DistFiles/` track production state | +| 8 | DataTree initialization requires Mediator/PropertyTable | Low | Medium | Create minimal stubs for test context; existing `DataTreeTests` proves this pattern works | +| 9 | Shared RenderVerification library increases coupling | Low | Medium | Library is infrastructure only (no tests); consumers decide which capabilities to use | + +--- + +## Decision Log + +| Date | Decision | Rationale | +|------|----------|-----------| +| 2026-02-03 | Use `RealDataTestsBase` over mock data | `ScrInMemoryLcmTestBase` lacks metadata for StVc | +| 2026-02-03 | Use `IVwDrawRootBuffered` not `DrawToBitmap` | WinForms DrawToBitmap returns black for Views controls | +| 2026-02-05 | Override `MakeRoot` in GenericScriptureView | Prevent auto-MakeRoot on handle creation with wrong fragment | +| 2026-02-05 | Create Scripture styles manually via `IStStyleFactory` | Avoids xWorks assembly dependency; FlexStyles.xml not loaded in test projects | +| 2026-02-05 | Use `Verify.NUnit` only, skip `Verify.WinForms` | We capture bitmaps ourselves; Verify.WinForms uses DrawToBitmap internally | +| 2026-02-05 | Use `[SetUpFixture]` not `[ModuleInitializer]` | FieldWorks uses C# 8.0 (LangVersion=8.0); ModuleInitializer requires C# 9 | +| 2026-02-05 | Use base `Verify` package, not `Verify.NUnit` | All Verify.NUnit versions require NUnit ≥ 4.x; FieldWorks pins NUnit 3.13.3. Use `InnerVerifier` from base `Verify` package directly | +| 2026-02-05 | Wrap `SetupScenarioData()` in UoW in timing suite | `RenderTimingSuiteTests.RunBenchmark()` was calling `SetupScenarioData()` outside `UndoableUnitOfWorkHelper`, causing `InvalidOperationException` — all 5 scenario test cases now pass | +| 2026-02-05 | Add 5 new stress scenarios | many-paragraphs (50 sections), footnote-heavy (footnotes on every other verse), mixed-styles (unique formatting per verse), long-prose (80 verses per paragraph), multi-book (3 books) | +| 2026-02-05 | Add RTL and multi-WS scenarios | Arabic (RTL) and trilingual (English+Arabic+French) data factories for bidirectional and multilingual rendering coverage | +| 2026-02-05 | Expand Verify to all 12 scenarios | Parameterized `VerifyScenario(scenarioId)` with UoW-wrapped data setup; 12 `.verified.png` baselines accepted | +| 2026-02-05 | Delete RenderBitmapComparer | Hand-rolled pixel diff replaced by Verify snapshots; timing suite uses content-density sanity check instead | +| 2026-02-05 | Clear TestData/RenderSnapshots | Old baseline PNGs deleted; Verify `.verified.png` files live alongside test class | +| 2026-02-06 | Custom LexEntryVc over XmlVc | RootSiteTests can't reference XMLViews (massive dependency chain). Custom `LexEntryVc : VwBaseVc` exercises the same recursive nested-field Views pattern with `SimulateIfDataDoubleRender` flag for modeling ifdata overhead | +| 2026-02-06 | Add lex-shallow/deep/extreme scenarios | Three nesting depths (2/4/6 levels) to quantify O(N·2^d) rendering overhead from ifdata double-render; primary target for speedup measurement | +| 2026-02-06 | Plan shared RenderVerification library | Current harness only captures Views engine text, not WinForms chrome (grey labels, icons, section headers). Full DataTree/Slice rendering requires DetailControls dependency chain. Extract harness into shared library reusable across test projects — long-term goal: verification coverage for significant parts of the view architecture | +| 2026-02-06 | Composite bitmap capture for DataTree | `DrawToBitmap` works for WinForms controls (labels, splitters, backgrounds) but not for Views engine content in ViewSlice. Solution: multi-pass capture (DrawToBitmap for chrome + VwDrawRootBuffered per ViewSlice region) | +| 2026-02-12 | Keep view classes in RootSiteTests | `GenericScriptureView`, `GenericLexEntryView`, and `RenderBenchmarkHarness` depend on `DummyBasicView` (test-only base class). Moving would require extracting DummyBasicView too, which is used broadly. Instead, move only infrastructure/model classes to RenderVerification; RootSiteTests references RenderVerification via ProjectReference. | +| 2026-02-12 | Extract RenderModels.cs as new file | `RenderTimingResult`, `RenderViewType`, `RenderScenario` extracted from `RenderBenchmarkHarness.cs` into `RenderVerification/RenderModels.cs` to reduce coupling | +| 2026-02-12 | Three new DataTree scenario types | Collapsed (minimal 1-sense), Expanded (enriched 4-sense with pronunciations+notes), MultiWs (French+English writing systems) — covers the full range of DataTree rendering complexity | diff --git a/openspec/changes/render-speedup-benchmark/contracts/render-benchmark.openapi.yaml b/openspec/changes/render-speedup-benchmark/contracts/render-benchmark.openapi.yaml new file mode 100644 index 0000000000..7b3989e635 --- /dev/null +++ b/openspec/changes/render-speedup-benchmark/contracts/render-benchmark.openapi.yaml @@ -0,0 +1,219 @@ +openapi: 3.0.3 +info: + title: Render Benchmark Harness API + version: 1.0.0 + description: Local-only API for running render benchmarks and retrieving results. +servers: + - url: http://localhost +paths: + /scenarios: + get: + summary: List benchmark scenarios + responses: + '200': + description: Scenario list + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/RenderScenario' + /runs: + post: + summary: Start a benchmark run + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/BenchmarkRunRequest' + responses: + '202': + description: Run accepted + content: + application/json: + schema: + $ref: '#/components/schemas/BenchmarkRunReceipt' + get: + summary: List benchmark runs + responses: + '200': + description: Run list + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/BenchmarkRunSummary' + /runs/{runId}: + get: + summary: Get a benchmark run + parameters: + - in: path + name: runId + required: true + schema: + type: string + responses: + '200': + description: Benchmark run details + content: + application/json: + schema: + $ref: '#/components/schemas/BenchmarkRun' + /runs/{runId}/trace: + get: + summary: Download trace diagnostics for a run + parameters: + - in: path + name: runId + required: true + schema: + type: string + responses: + '200': + description: Trace file contents + content: + text/plain: + schema: + type: string + /validate: + post: + summary: Validate pixel-perfect rendering for a scenario + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/PixelPerfectRequest' + responses: + '200': + description: Validation result + content: + application/json: + schema: + $ref: '#/components/schemas/PixelPerfectResult' +components: + schemas: + RenderScenario: + type: object + required: [id, description, expectedSnapshotId] + properties: + id: + type: string + description: + type: string + entrySource: + type: string + expectedSnapshotId: + type: string + tags: + type: array + items: + type: string + BenchmarkRunRequest: + type: object + required: [scenarioIds] + properties: + scenarioIds: + type: array + items: + type: string + includeTrace: + type: boolean + default: false + includeSnapshots: + type: boolean + default: true + BenchmarkRunReceipt: + type: object + required: [runId, status] + properties: + runId: + type: string + status: + type: string + enum: [pending, running] + BenchmarkRunSummary: + type: object + required: [runId, runAt, status] + properties: + runId: + type: string + runAt: + type: string + format: date-time + status: + type: string + enum: [pending, running, completed, failed] + BenchmarkRun: + type: object + required: [runId, runAt, configuration, environmentId, results] + properties: + runId: + type: string + runAt: + type: string + format: date-time + configuration: + type: string + environmentId: + type: string + results: + type: array + items: + $ref: '#/components/schemas/BenchmarkResult' + summary: + $ref: '#/components/schemas/AnalysisSummary' + BenchmarkResult: + type: object + required: [scenarioId, coldRenderMs, warmRenderMs, pixelPerfectPass] + properties: + scenarioId: + type: string + coldRenderMs: + type: number + warmRenderMs: + type: number + variancePercent: + type: number + pixelPerfectPass: + type: boolean + PixelPerfectRequest: + type: object + required: [scenarioId, snapshotId] + properties: + scenarioId: + type: string + snapshotId: + type: string + PixelPerfectResult: + type: object + required: [scenarioId, snapshotId, pass] + properties: + scenarioId: + type: string + snapshotId: + type: string + pass: + type: boolean + AnalysisSummary: + type: object + required: [topContributors, recommendations] + properties: + topContributors: + type: array + items: + $ref: '#/components/schemas/Contributor' + recommendations: + type: array + items: + type: string + Contributor: + type: object + required: [stage, sharePercent] + properties: + stage: + type: string + sharePercent: + type: number diff --git a/openspec/changes/render-speedup-benchmark/data-model.md b/openspec/changes/render-speedup-benchmark/data-model.md new file mode 100644 index 0000000000..712d51dcb7 --- /dev/null +++ b/openspec/changes/render-speedup-benchmark/data-model.md @@ -0,0 +1,28 @@ +## Data Model (Migrated from Speckit 001) + +### Render Scenario +- id, description, entrySource, expectedSnapshotId, tags +- id is unique; expectedSnapshotId must resolve + +### Render Snapshot +- id, scenarioId, imagePath, environmentHash, createdAt +- environmentHash must match current deterministic environment for validation + +### Benchmark Run +- id, runAt, configuration, environmentId, results, summary +- must contain all five required scenarios for full suite + +### Benchmark Result +- scenarioId, coldRenderMs, warmRenderMs, variancePercent, pixelPerfectPass +- pixelPerfectPass must be true for suite pass + +### Trace Event +- runId, stage, startTime, durationMs, context +- stage must be from approved render-stage list + +### Analysis Summary +- runId, topContributors, recommendations +- recommendations count >= 3 + +### Contributor +- stage, sharePercent diff --git a/openspec/changes/render-speedup-benchmark/design.md b/openspec/changes/render-speedup-benchmark/design.md new file mode 100644 index 0000000000..4952dac238 --- /dev/null +++ b/openspec/changes/render-speedup-benchmark/design.md @@ -0,0 +1,120 @@ +## Context + +This change migrates the complete Speckit `001-render-speedup` workstream into OpenSpec and continues delivery from current code state. The migrated scope includes: + +- RootSite baseline and timing suite infrastructure. +- File-based render trace diagnostics and parser/report integration. +- DataTree render harness extensions and timing-fidelity fixes. + +## Goals / Non-Goals + +**Goals** +- Preserve the three Speckit user stories in OpenSpec: + - Pixel-perfect baseline (P1) + - Five-scenario timing suite (P2) + - Render-stage trace diagnostics (P3) +- Keep deterministic environment safeguards for pixel-perfect validation. +- Enforce benchmark-fidelity invariants so deeper scenarios represent larger work. +- Drive optimization with measurable evidence and regression safety gates. + +**Non-Goals** +- Full architectural rewrite of DataTree/Views. +- Behavior-changing UI redesign. +- External telemetry or service dependencies. + +## Decisions + +### 1) Full Speckit carry-over with status preservation + +- Carry over FR/SC and task IDs semantically (including completed and pending status) into OpenSpec tasks. +- Keep Speckit files as source references during transition; OpenSpec becomes authoritative moving forward. + +### 2) Separate confidence channels by purpose + +- Snapshot channel verifies visual correctness and deterministic output. +- Timing channel emphasizes repeatability and workload scaling. +- Trace channel attributes time to native rendering stages. + +### 3) Benchmark-fidelity guardrails are mandatory + +- Timing scenarios must show monotonic workload growth indicators. +- Timing tests fail fast when expected complexity is not exercised. + +### 4) Optimization loop is evidence-first + +- Baseline -> change -> remeasure on same scenarios. +- Require non-regressing snapshots and timing evidence for acceptance. + +## Risks / Trade-offs + +- Snapshot and timing channels may use different internals for stability; risk mitigated by documenting each channel's intent. +- Native trace instrumentation carries low-level regression risk; mitigate with scoped trace switches and targeted tests. +- Timing variance across machines complicates absolute thresholds; use trend comparisons and workload invariants. + +## Open Questions + +1. Should benchmark comparison output (`comparison.md`) become a required artifact for optimization PRs? +2. Should pending native trace tasks be completed in this change or tracked as a follow-on OpenSpec change if blocked by native build constraints? + +## Research Decisions (carried over from Speckit) + +These decisions were made during the original Phase 0 research and remain in effect. + +### 5) Pixel-perfect validation via deterministic environment control +- **Decision**: Enforce fixed fonts, DPI, and theme with zero tolerance image comparison. +- **Rationale**: Guarantees strict pixel identity and avoids false positives from tolerances. +- **Alternatives rejected**: Image diff with tolerance (weakens correctness guarantees); layout tree snapshot (lower fidelity, misses paint issues). + +### 6) Cold + warm render metrics +- **Decision**: Report cold-start and warm-cache render timings separately. +- **Rationale**: Cold captures first-load cost; warm captures steady-state performance. +- **Alternatives rejected**: Single "best of 3" (hides cold-start regressions); median of 5 (blurs warm vs cold). + +### 7) Fixed five timing scenarios +- **Decision**: Use five scenarios: simple, medium, complex, deep-nested, custom-field-heavy. +- **Rationale**: Balanced coverage for common and worst-case entries without excessive runtime. +- **Alternatives rejected**: Minimum three (insufficient coverage); ten (longer runtime, higher maintenance). + +### 8) File-based trace logging +- **Decision**: Append-only file output with timestamps and durations. +- **Rationale**: Low overhead, aligns with existing FieldWorks tracing practices. +- **Alternatives rejected**: ETW/EventSource (more setup); UI panel trace (adds measurement overhead). + +### 9) Harness approach: offscreen render capture +- **Decision**: Use managed WinForms offscreen rendering (Option 2) with `DummyBasicView`/RootSite layout and `Control.DrawToBitmap`-style capture. +- **Rationale**: Fastest integration path with existing managed test scaffolding and deterministic capture. +- **Alternatives rejected**: Native Views offscreen render (higher fidelity but more complex); on-screen capture (window manager variability); layout-only verification (insufficient for visual correctness). +- **Pivot note**: T009a/T009b track potential pivot to native capture and production StVc if `DrawToBitmap` limitations prove blocking. + +### 10) Initial optimization candidates +- **Decision**: Start with layout/DisplayCommand caching, custom-field collapse, and field-level virtualization/lazy creation. +- **Rationale**: Targets high-impact bottlenecks in XML layout interpretation and control creation. +- **Alternatives rejected**: Full views engine replacement (too large for initial phase). +- **Reference**: See `research/FORMS_SPEEDUP_PLAN.md` for the 10 optimization techniques and `research/implementation-paths.md` for strategic paths A/B/C. + +## Quickstart + +Detailed build, run, snapshot generation, diagnostics, and output artifact documentation is in [quickstart.md](quickstart.md) (carried over from Speckit). + +## Key Architecture Findings + +The `research/` folder contains the full analysis. Key points for context: + +- **Worst-case complexity**: O(M × N × D × F × S) where M=senses, N=subsenses, D=layout depth, F=custom fields, S=source XML size. +- **No field-level virtualization**: `VwLazyBox` virtualizes at vector property level only; within each expanded item, all fields render immediately. +- **Custom field explosion**: Each custom field triggers XML subtree cloning via `PartGenerator.Generate` — O(F × S × A). +- **COM boundary**: Every `IVwEnv` call crosses managed/native boundary synchronously. +- **Layout recomputation**: No incremental/dirty-region optimization at the managed layer; property changes trigger full subtree re-layout. +- **Known bottlenecks**: `VwSelection.cpp` comments explicitly note performance issues; `VwRootBox` has 1/10 second timeout for `MakeSimpleSel`. +- **Original problem statement**: DataTree needs redesign; current architecture intermixes view model (XML layouts), data model (liblcm), and view (Slices with XML nodes + HVO/flid). See `research/JIRA-21951.md`. + +## Constitution Check (carried over from Speckit) + +| Category | Status | Notes | +|----------|--------|-------| +| Data Integrity / Backward Compatibility | PASS | No schema/data changes in scope | +| Test & Review Discipline | PASS | Harness, timing suite, and trace validation included | +| Internationalization / Script Correctness | PASS | Pixel-perfect validation must include complex scripts | +| Stability & Performance | PASS | Feature flags / staged rollout for optimizations; baseline first | +| Licensing | PASS | No new external dependencies or services | +| Documentation Fidelity | PASS | Plan includes updating docs when code changes | diff --git a/openspec/changes/render-speedup-benchmark/dpi-fix-implementation.md b/openspec/changes/render-speedup-benchmark/dpi-fix-implementation.md new file mode 100644 index 0000000000..3df563b146 --- /dev/null +++ b/openspec/changes/render-speedup-benchmark/dpi-fix-implementation.md @@ -0,0 +1,41 @@ +# DPI Fix Implementation + +Date: 2026-03-10 + +## Goal + +Make the render-speedup fast paths safe when monitor DPI changes without a width change. + +## Findings Being Fixed + +- `VwRootBox::Layout()` PATH-L1 compared width only and returned before refreshing `m_ptDpiSrc`. +- `SimpleRootSite` only forced layout when available width changed, so many hosts would never call native `Layout()` on a DPI-only change. +- `VwLayoutStream::ConstructAndLayout()` already had a TODO noting that it should also check DPI. + +## Implementation Plan + +- [x] Track DPI as part of the native root-box layout cache key. +- [x] Refresh native cached DPI after incremental relayout. +- [x] Force managed layout when `SimpleRootSite.Dpi` changes. +- [x] Make `VwLayoutStream::ConstructAndLayout()` relayout on DPI changes. +- [x] Add native regression coverage for same-width DPI changes. + +## Files + +- `Src/views/VwRootBox.cpp` +- `Src/views/VwRootBox.h` +- `Src/views/VwLayoutStream.cpp` +- `Src/Common/SimpleRootSite/SimpleRootSite.cs` +- `Src/views/Test/TestVwRootBox.h` + +## Validation + +- [x] Run native `TestViews`. +- [x] Run a managed build for touched managed code. +- [x] Run a focused managed test pass if available (`SimpleRootSiteTests`). + +## Notes + +- This change treats DPI as layout state, not reconstruct state. +- `NeedsReconstruct` / PATH-L5 remain data- and structure-driven; DPI changes only force relayout. +- `RootSiteTests` still has unrelated pre-existing failures in this worktree, so validation used the narrower `SimpleRootSiteTests` pass for the managed change. \ No newline at end of file diff --git a/openspec/changes/render-speedup-benchmark/final_cleanup.md b/openspec/changes/render-speedup-benchmark/final_cleanup.md new file mode 100644 index 0000000000..18c7882673 --- /dev/null +++ b/openspec/changes/render-speedup-benchmark/final_cleanup.md @@ -0,0 +1,172 @@ +# Final Cleanup Review + +This file captures the final review items for the render-speedup branch before the PR is considered clean. The goal is to keep the branch focused on Views rendering speed and render/image assessment, while fixing rebase cruft and tightening explanations where the current diff is ambiguous. + +## Required Code Fixes + +### `VwRootBox::SetTableColWidths` must force layout dirty + +**Files** +- `Src/views/VwRootBox.cpp` + +**Issue** +`SetTableColWidths()` changes table geometry and then calls `LayoutFull()`, but the new width/DPI layout guard can skip layout if `m_fNeedsLayout` is false and the available width has not changed. + +**Best resolution** +Set `m_fNeedsLayout = true` before calling `LayoutFull()` from `SetTableColWidths()`. Add a focused native regression test if practical; otherwise call out the targeted rationale in the code review notes. This is render-speedup work, not unrelated cleanup, because the new layout guard introduced the stale-layout risk. + +### Managed redraw cache must copy from the matching clipped source region + +**Files** +- `Src/ManagedVwDrawRootBuffered/VwDrawRootBuffered.cs` +- Native comparison point: `Src/views/VwRootBox.cpp` + +**Issue** +`ReDrawLastDraw()` copies from cached source `(0, 0)` for every repaint clip. The native buffered redraw path copies from `(rcp.left, rcp.top)` so a partial repaint gets the matching region from the cached bitmap. + +**Best resolution** +Align the managed cached redraw path with the native coordinate semantics. For disabled-view reuse, copy the requested clip from the same coordinates in the cached full-client image, or explicitly change/cache the managed buffer contract so it is impossible to reuse a full-client buffer with a clipped repaint. The safest fix is to mirror native source offsets and add a focused clipped-repaint test or diagnostic proof. + +## Scope And Rebase-Cruft Fixes + +### DeleteRecord routing should keep the pub/sub direction + +**Files** +- `Src/FdoUi/FdoUiCore.cs` +- `Src/Common/Controls/XMLViews/XmlBrowseViewBase.cs` +- `Src/Common/Controls/XMLViews/XmlBrowseRDEView.cs` + +**Issue** +The current diff moves DeleteRecord dispatch back toward obsolete `Mediator.SendMessage()` command handling and removes `XmlBrowseRDEView`'s pub/sub subscription. That is not a render-speedup feature. It appears to be rebase cruft from older branch history. + +**Best resolution** +Do not revert the broader pub/sub migration direction. Fix the cruft by preserving the newer pub/sub path: deletion initiated by `DeleteUnderlyingObject()` should publish the DeleteRecord event, and the RDE browse view should handle that event through the pub/sub mechanism expected by the current architecture. Reconcile the files carefully rather than blindly reverting chunks, because there may be adjacent compile/interface changes worth keeping. Add or update a focused regression test proving RDE DeleteRecord still reaches the correct handler through pub/sub. + +### VS Code task changes should be render-only + +**Files** +- `.vscode/tasks.json` + +**Issue** +The render baseline task belongs in this PR, but the same diff also changes general task descriptions, removes the worktree colorizer `runOn` behavior, and adds a generic `Build Tests` task. Those are workflow cleanup, not render-speedup or render-assessment work. + +**Best resolution** +Keep only `Test: RenderBaselineTests` in this branch. Move the general task cleanup to the non-render cleanup PR, or drop it if it is no longer needed. The render task should remain documented as the quick targeted validation entry point. + +### Unused `Verify` package version should be removed or made real + +**Files** +- `Directory.Packages.props` + +**Issue** +The branch adds a central `Verify` package version, but the implementation uses the custom `RenderSnapshotVerifier` and there is no matching `PackageReference Include="Verify"` in the changed projects. + +**Best resolution** +Remove the unused central package version. Only keep it if the branch actually adopts the Verify package through an explicit project reference. For the current custom verifier approach, the central version pin is misleading and should not be in this PR. + +### `Views_RenderTiming` switch should be wired or removed + +**Files** +- `Src/Common/FieldWorks/FieldWorks.Diagnostics.dev.config` +- `Src/views/VwRenderTrace.h` + +**Issue** +The dev diagnostics config adds `Views_RenderTiming`, but the native trace helper is compile-time gated by `TRACING_RENDER` and no runtime consumer of this switch was found. As written, the switch looks like it enables tracing but does not. + +**Best resolution** +Either wire the switch into a real runtime trace path, or remove the config entry and mark the runtime trace-switch work as deferred. If native tracing remains compile-time only, the docs and task list should not claim that the config switch enables it. + +## Documentation And Explanation Fixes + +### OpenSpec task paths should match the final project layout + +**Files** +- `openspec/changes/render-speedup-benchmark/tasks.md` +- `openspec/changes/render-speedup-benchmark/quickstart.md` + +**Issue** +Some migrated task entries still point helper classes at `Src/Common/RootSite/RootSiteTests`, but the final implementation places shared infrastructure under `Src/Common/RenderVerification` and `Src/Common/RenderTestInfrastructure`. The quickstart also still uses the old `.csproj` `-TestProject` form and stale snapshot locations. + +**Best resolution** +Update the OpenSpec docs to the actual implementation layout: +- Shared snapshot/benchmark helpers live under `RenderVerification` and `RenderTestInfrastructure`. +- RootSite test entry points remain under `Src/Common/RootSite/RootSiteTests`. +- DataTree render tests and baselines live beside `DetailControlsTests`. +- Targeted command should use the working form: `./test.ps1 -TestProject "RootSiteTests" -TestFilter "FullyQualifiedName~RenderBaselineTests"`. +- Approved snapshots are committed as `*.verified.png` beside the relevant test source, not under the old `TestData/RenderSnapshots` path. + +### DataTree render validation should describe its actual coverage + +**Files** +- `Src/Common/Controls/DetailControls/DetailControlsTests/DataTreeRenderTests.cs` +- `Src/Common/RenderVerification/DataTreeRenderHarness.cs` +- PR description / OpenSpec notes + +**Issue** +Some comments describe the DataTree snapshots as full production layout coverage, but the harness strips known-problematic production parts and can continue after `ShowObject()` throws an `ApplicationException`. The tests are still valuable, but their coverage is not literally the full lexeme edit view. + +**Best resolution** +Adjust comments and PR/OpenSpec wording to say these are production-like render baselines with documented exclusions. Keep the tests, but explain that they validate the DataTree/Slice render pipeline and selected production-like layouts, not every production part in a fully initialized FLEx shell. + +### Render project boundary should be explicit + +**Files** +- `Src/Common/RenderVerification/RenderVerification.csproj` +- `Src/Common/RenderTestInfrastructure/RenderTestInfrastructure.csproj` + +**Issue** +Most shared verifier/reporting files physically live in `RenderVerification`, while `RenderTestInfrastructure` links many of them. That may be intentional to avoid dependencies, but it is not obvious from the file layout. + +**Best resolution** +Either move the linked shared files under the project that owns them, or document the assembly boundary. A good explanation would be: `RenderTestInfrastructure` owns lightweight benchmark/snapshot helpers that tests can reference broadly, while `RenderVerification` owns DataTree/composite capture pieces that need heavier DetailControls dependencies. + +### Artifact policy should be crisp + +**Files** +- `.gitignore` +- `.gitattributes` +- `Src/Common/RenderVerification/RenderSnapshotVerifier.cs` +- `Src/Common/Controls/DetailControls/DetailControlsTests/DataTreeTimingBaselineCatalog.cs` + +**Issue** +The intended artifact contract is spread across code and repo metadata. Ignoring `*.received.png` and `*.diff.png` is correct for transient snapshot output, but marking ignored `*.received.png` as binary is confusing. `DataTreeTimingBaselines.json` is ignored and missing baselines skip timing threshold checks, so timing thresholds are advisory/local unless the baseline file is committed. + +**Best resolution** +Document the contract in the quickstart and keep metadata consistent: +- Commit `*.verified.png` and any intentional `*.verified.json` metadata. +- Ignore transient `*.received.*` and `*.diff.*` artifacts. +- Remove unnecessary binary metadata for ignored received images unless there is a specific staging workflow. +- Decide whether `DataTreeTimingBaselines.json` is local advisory data or a committed guard. If local-only, say so and do not present it as a CI-enforced threshold. + +### Generic macro hygiene changes should be explained, not moved + +**Files** +- `Src/Generic/GenSmartPtr.h` +- `Src/Generic/UtilCom.h` +- `Src/Generic/UtilTime.h` +- `Src/views/VwRenderTrace.h` + +**Issue** +The Generic utility edits look non-render-specific at first glance. + +**Best resolution** +Keep them with this PR, but explain the supporting purpose: they fix two-step token-paste macro hygiene so `__LINE__` expands correctly, matching the new render trace timer macro pattern and avoiding duplicate local names when lock/timing macros are used more than once in a scope. + +## Suggested Cleanup Order + +1. Fix the two concrete render bugs: `SetTableColWidths()` dirty layout and managed cached redraw clip coordinates. +2. Fix DeleteRecord rebase cruft by preserving the pub/sub migration direction and adding a focused regression test. +3. Trim unrelated `.vscode/tasks.json` changes from this PR. +4. Remove unused `Verify` package pin unless the package is actually referenced. +5. Remove or wire `Views_RenderTiming`. +6. Update `tasks.md`, `quickstart.md`, and PR wording to match the final implementation and artifact policy. +7. Add a short explanation for Generic macro hygiene and the render project boundary. + +## Expected End State + +After cleanup, the branch should read as one coherent change set: +- Views render path avoids redundant reconstruct/layout and caches hot native render resources. +- Managed render buffering remains visually correct for partial repaints. +- Render verification and benchmark infrastructure are documented with current paths and commands. +- Rebase cruft is fixed in favor of the current pub/sub architecture. +- Non-render workflow cleanup stays in the companion cleanup PR. \ No newline at end of file diff --git a/openspec/changes/render-speedup-benchmark/migration-map.md b/openspec/changes/render-speedup-benchmark/migration-map.md new file mode 100644 index 0000000000..096353ec94 --- /dev/null +++ b/openspec/changes/render-speedup-benchmark/migration-map.md @@ -0,0 +1,48 @@ +## Speckit to OpenSpec Migration Map + +This change migrates `specs/001-render-speedup/*` into OpenSpec. + +### Source artifacts + +| Speckit Source | OpenSpec Destination | Migration Type | +|---|---|---| +| `spec.md` | `specs/render-speedup-benchmark/spec.md` | Restructured into ADDED requirements with scenarios | +| `tasks.md` | `tasks.md` | Carried over with completion status (T001–T026 + OS-* + OPT-*) | +| `plan.md` | `design.md` | Strategy/constitution merged into design decisions | +| `research.md` | `design.md` (Research Decisions section) | 6 decisions preserved as numbered decisions 5–10 | +| `data-model.md` | `data-model.md` | Carried over with all 7 entities | +| `contracts/render-benchmark.openapi.yaml` | `contracts/render-benchmark.openapi.yaml` | Copied verbatim | +| `quickstart.md` | `quickstart.md` | Copied verbatim | +| `checklists/requirements.md` | `design.md` (Constitution Check section) | Quality checklist folded into design notes | +| `FAST_FORM_PLAN.md` | `research/FAST_FORM_PLAN.md` | Copied verbatim — architecture analysis, algorithms, impl paths | +| `FORMS_SPEEDUP_PLAN.md` | `research/FORMS_SPEEDUP_PLAN.md` | Copied verbatim — 10 optimization techniques with code examples | +| `JIRA_FORMS_SPEEDUP_PLAN.md` | `research/JIRA_FORMS_SPEEDUP_PLAN.md` | Copied verbatim — JIRA story defs, sprint plan, feature flags | +| `views-architecture-research.md` | `research/views-architecture-research.md` | Copied verbatim — native C++ Views deep dive | +| `JIRA-21951.md` | `research/JIRA-21951.md` | Copied verbatim — original problem statement | +| _(new)_ | `research/implementation-paths.md` | Synthesized from FAST_FORM_PLAN Sections 2–4 | +| _(new)_ | `timing-artifact-schema.md` | New artifact for benchmark output schemas | +| `Slow 2026-01-14 1140.fwbackup` | _(not migrated)_ | Binary test data; stays in Speckit folder or is archived separately | + +### Data model entities carried over + +- Render Scenario +- Render Snapshot +- Benchmark Run +- Benchmark Result +- Trace Event +- Analysis Summary +- Contributor + +### Task status carry-over + +Speckit task completion state is preserved in `tasks.md` (T001–T026 and pivots), with OpenSpec continuation tasks (`OS-*`) for work started post-migration and optimization tasks (`OPT-*`) for the 10 techniques from FORMS_SPEEDUP_PLAN. + +### Key content that was restructured (not copied verbatim) + +- **Edge cases** from Speckit `spec.md` → added to OpenSpec `spec.md` Edge Cases section +- **Assumptions** from Speckit `spec.md` → added to OpenSpec `spec.md` Assumptions section +- **Success criteria** (SC-001 through SC-005) → added to OpenSpec `spec.md` Success Criteria section +- **Performance targets** → converted from absolute ms to relative improvement % in OpenSpec `spec.md` +- **Research decisions** (6 decisions from `research.md`) → numbered decisions 5–10 in `design.md` +- **Constitution check** (from `plan.md`) → table in `design.md` +- **Optimization techniques** (10 from FORMS_SPEEDUP_PLAN) → OPT-1 through OPT-11 tasks in `tasks.md` diff --git a/openspec/changes/render-speedup-benchmark/proposal.md b/openspec/changes/render-speedup-benchmark/proposal.md new file mode 100644 index 0000000000..4ac6d06fe9 --- /dev/null +++ b/openspec/changes/render-speedup-benchmark/proposal.md @@ -0,0 +1,36 @@ +## Why + +We are migrating the full Speckit `specs/001-render-speedup` scope into OpenSpec and continuing implementation from there. This scope combines three linked goals: deterministic pixel-perfect render validation, repeatable timing baselines across fixed scenarios, and trace diagnostics for render-stage attribution. Recent DataTree benchmark improvements surfaced a fidelity gap (deep scenarios not always exercising true deep workload), so migration must preserve existing completed work and explicitly track remaining items. + +## What Changes + +- Carry over all Speckit user stories, FR/SC requirements, and tasks into OpenSpec with completion status preserved. +- Keep the benchmark harness and five-scenario timing suite as first-class capabilities. +- Preserve trace-diagnostics requirements for native Views (`VwRootBox`, `VwEnv`, lazy expansion paths). +- Add DataTree benchmark-fidelity guardrails so scenario complexity growth is enforced. +- Continue optimization work using measured before/after evidence and snapshot safety gates. + +## Non-goals + +- Rewriting the DataTree or Views architecture in this change. +- Replacing WinForms UI framework. +- Introducing external services or non-repo dependencies. + +## Capabilities + +### New Capabilities + +- `render-speedup-benchmark`: Pixel-perfect render baseline + five-scenario timing suite + benchmark artifacts. +- `render-trace-diagnostics`: File-based render-stage diagnostics, parsing, and top-contributor summaries. +- `datatree-benchmark-fidelity`: DataTree timing path with monotonic workload guardrails. + +### Modified Capabilities + +- `architecture/ui-framework/views-rendering`: Add benchmark and tracing guidance for managed/native render analysis. + +## Impact + +- Managed test/harness code under `Src/Common/RootSite/RootSiteTests/`, `Src/Common/RenderVerification/`, and `Src/Common/Controls/DetailControls/DetailControlsTests/`. +- Native trace instrumentation surfaces under `Src/views/`. +- Benchmark artifacts under `Output/RenderBenchmarks/`. +- Migration references retained to Speckit source under `specs/001-render-speedup/` for auditability. diff --git a/openspec/changes/render-speedup-benchmark/quickstart.md b/openspec/changes/render-speedup-benchmark/quickstart.md new file mode 100644 index 0000000000..acef0d9a4f --- /dev/null +++ b/openspec/changes/render-speedup-benchmark/quickstart.md @@ -0,0 +1,83 @@ +# Quickstart: Render Performance Baselines + +## Prerequisites + +- Windows x64 with deterministic settings (fonts, DPI, theme). +- Debug build output available locally. +- No external services required. + +## Build + +```powershell +.\build.ps1 +``` + +## Run the RootSite snapshot suite + +```powershell +.\test.ps1 -TestProject "RootSiteTests" -TestFilter "FullyQualifiedName~RenderBaselineTests" +``` + +This validates the committed RootSite snapshot baselines and the shared snapshot verifier. + +## Run the timing suite + +```powershell +.\test.ps1 -TestProject "RootSiteTests" -TestFilter "FullyQualifiedName~RenderTimingSuiteTests" +``` + +Results are written to: + +- `Output/RenderBenchmarks/results.json` for machine-readable timing data. +- `Output/RenderBenchmarks/summary.md` for the human-readable summary. + +## Snapshot files and regeneration + +Committed baselines live next to the tests that own them: + +- `Src/Common/RootSite/RootSiteTests/*.verified.png` +- `Src/Common/Controls/DetailControls/DetailControlsTests/*.verified.png` +- `Src/Common/Controls/DetailControls/DetailControlsTests/*.verified.json` for scenarios that store extra metadata. + +Transient verification outputs are ignored: + +- `*.received.png` +- `*.diff.png` + +To regenerate a committed baseline, delete the matching `*.verified.png` file and rerun the owning test suite. + +## Timing baselines + +`Src/Common/Controls/DetailControls/DetailControlsTests/DataTreeTimingBaselines.json` is local advisory data. When it is missing, timing threshold checks are skipped instead of failing CI. + +## Trace diagnostics + +Use `RenderDiagnosticsToggle` from the shared render infrastructure when a test run needs managed trace capture: + +```csharp +using (var diagnostics = new RenderDiagnosticsToggle()) +{ + diagnostics.EnableDiagnostics(); + // Run benchmark or snapshot capture. + diagnostics.Flush(); + var traceContent = diagnostics.GetTraceLogContent(); +} +``` + +`Src/Common/FieldWorks/FieldWorks.Diagnostics.dev.config` keeps the core xWorks trace switches enabled for Debug runs. Native `VwRenderTrace.h` timing output is still compile-time-gated by `TRACING_RENDER`; there is no always-on runtime `Views_RenderTiming` switch in the final configuration. + +## Project layout + +- `Src/Common/RenderTestInfrastructure/RenderTestInfrastructure.csproj` exposes the lightweight benchmark, snapshot, and trace helpers that test projects can reference broadly. +- The source for those reusable helpers lives under `Src/Common/RenderVerification/`. +- `Src/Common/RenderVerification/RenderVerification.csproj` adds the heavier DataTree and composite-capture pieces that depend on `DetailControls`. +- `Src/Common/RootSite/RootSiteTests/RenderBenchmarkHarness.cs` stays in `RootSiteTests` because it still depends on RootSite test-only view scaffolding. + +## Environment requirements + +For pixel-perfect validation to pass, the runtime environment must match the baseline: + +- DPI typically 96x96 (100% scaling). +- Theme must match the captured baseline. +- Font smoothing state must match the baseline. +- Text scale factor should remain 100%. diff --git a/openspec/changes/render-speedup-benchmark/refresh-dirty-flag-audit.md b/openspec/changes/render-speedup-benchmark/refresh-dirty-flag-audit.md new file mode 100644 index 0000000000..6455bd4274 --- /dev/null +++ b/openspec/changes/render-speedup-benchmark/refresh-dirty-flag-audit.md @@ -0,0 +1,386 @@ +# Refresh Dirty-Flag Audit + +Date: 2026-03-10 + +## Purpose + +This document audits the parts of FieldWorks that can require a visual refresh after the PATH-L5 / PATH-R1 optimization work. + +The core question is now: + +> When something changes that makes the current box tree stale, what code path marks the root box dirty so a later `RefreshDisplay()` or `Reconstruct()` actually rebuilds it? + +The recent `SetRootObjects()` fix in [Src/views/VwRootBox.cpp](../../../../Src/views/VwRootBox.cpp) shows the pattern clearly: the optimization is valid, but every mutation path that invalidates the current render tree must set the dirty state. + +## Executive Summary + +- The native source of truth for whether a box tree needs rebuilding is `VwRootBox::m_fNeedsReconstruct` in [Src/views/VwRootBox.h](../../../../Src/views/VwRootBox.h). +- The managed fast path is [SimpleRootSite.RefreshDisplay()](../../../../Src/Common/SimpleRootSite/SimpleRootSite.cs), which now skips managed overhead when `m_rootb.NeedsReconstruct == false`. +- The native fast path is `VwRootBox::Reconstruct()`, which now returns early when `m_fConstructed && !m_fNeedsReconstruct`. +- The architecture is correct only if every semantic mutation that can stale the view either: + - sets `m_fNeedsReconstruct = true` directly in native code, or + - causes a `PropChanged(...)` notification that sets it indirectly. +- Confirmed missing path that was already fixed: `SetRootObjects(...)` on an already-constructed root box. +- Confirmed managed fix: `DictionaryPublicationDecorator.Refresh()` now emits a conservative invalidation when its filtered state changes. +- Plausible native risk still to close: `putref_DataAccess(...)` does not dirty reconstruct state if used post-construction. +- Confirmed current contract: `putref_Overlay(...)` is intentionally relayout-only, with native regression coverage to lock that behavior in. +- Confirmed native stylesheet contract with regression coverage: `OnStylesheetChange()` dirties reconstruct state and also triggers immediate relayout. +- Separate fact: many callers invoke `m_rootb.Reconstruct()` directly. Those sites bypass `SimpleRootSite.RefreshDisplay()` and therefore are not protected by the managed guard, but they still depend on native reconstruct semantics. + +## Current Architecture + +### Native dirty state + +`VwRootBox` owns the native dirty flag: + +- `m_fNeedsReconstruct` in [Src/views/VwRootBox.h](../../../../Src/views/VwRootBox.h) +- exposed through `IVwRootBox.NeedsReconstruct` in [Src/Common/ViewsInterfaces/Views.cs](../../../../Src/Common/ViewsInterfaces/Views.cs) + +Confirmed native dirtying paths in [Src/views/VwRootBox.cpp](../../../../Src/views/VwRootBox.cpp): + +- `Init()` initializes `m_fNeedsReconstruct = true` +- `PropChanged(HVO hvo, PropTag tag, int ivMin, int cvIns, int cvDel)` sets `m_fNeedsReconstruct = true` +- `OnStylesheetChange()` sets `m_fNeedsReconstruct = true` +- `SetRootObjects(...)` now sets `m_fNeedsReconstruct = true` before `Reconstruct()` when already constructed + +Confirmed native clearing paths: + +- `Construct(...)` clears `m_fNeedsReconstruct = false` +- `Reconstruct(...)` clears `m_fNeedsReconstruct = false` + +### Managed refresh gate + +[SimpleRootSite.RefreshDisplay()](../../../../Src/Common/SimpleRootSite/SimpleRootSite.cs) does this: + +1. If a decorator is installed as `m_rootb.DataAccess`, call `decorator.Refresh()`. +2. If the control is not visible, defer refresh. +3. If `!m_rootb.NeedsReconstruct`, return without selection save/restore or drawing suspension. +4. Otherwise call `m_rootb.Reconstruct()`. + +This means the system has two layered assumptions: + +- managed assumption: `NeedsReconstruct` accurately tells `SimpleRootSite` whether refresh work is needed +- native assumption: `m_fNeedsReconstruct` accurately tells `VwRootBox::Reconstruct()` whether rebuild work is needed + +If either layer misses a mutation path, stale display becomes possible. + +## Affected Refresh Hosts + +These classes route through `SimpleRootSite.RefreshDisplay()` or are structurally downstream of it. + +### Core hosts + +| Class / family | File | Refresh model | Notes | +|---|---|---|---| +| `SimpleRootSite` | [Src/Common/SimpleRootSite/SimpleRootSite.cs](../../../../Src/Common/SimpleRootSite/SimpleRootSite.cs) | Base managed refresh gate | Central PATH-L5 check | +| `RootSite` | [Src/Common/RootSite/RootSite.cs](../../../../Src/Common/RootSite/RootSite.cs) | Inherits `SimpleRootSite.RefreshDisplay()` | Most document-style views flow through here | +| `FwRootSite` family | multiple under `Src/` | Inherits `RootSite` behavior | Affected unless they directly call `m_rootb.Reconstruct()` | +| `XmlSeqView` / `XmlBrowseViewBase` / `XmlBrowseView` | [Src/Common/Controls/XMLViews/](../../../../Src/Common/Controls/XMLViews/) | Mostly go through base refresh, with pre/post work | Common consumers of decorators | +| Direct `SimpleRootSite` subclasses such as `InnerFwTextBox`, `InnerFwListBox`, `InternalFwMultiParaTextBox`, `InnerLabeledMultiStringControl`, `RelatedWordsView`, `BulletsPreview`, `SampleView` | `Src/Common/Controls/Widgets/`, `Src/FdoUi/Dialogs/`, `Src/FwCoreDlgs/` | Mixed | Some rely on `RefreshDisplay()`, others call `m_rootb.Reconstruct()` directly | + +### Composite refresh callers + +These are important because they cause refreshes but are not the dirty-state authority: + +| Class | File | Role | +|---|---|---| +| `RootSiteGroup` | [Src/Common/RootSite/RootSite.cs](../../../../Src/Common/RootSite/RootSite.cs) | Delegates refresh to `ScrollingController.RefreshDisplay()` | +| `FwXWindow` | [Src/xWorks/FwXWindow.cs](../../../../Src/xWorks/FwXWindow.cs) | Walks refreshable children | +| `BrowseViewer` | [Src/Common/Controls/XMLViews/BrowseViewer.cs](../../../../Src/Common/Controls/XMLViews/BrowseViewer.cs) | Higher-level refresh wrapper | +| `LabeledMultiStringView` | [Src/Common/Controls/Widgets/LabeledMultiStringView.cs](../../../../Src/Common/Controls/Widgets/LabeledMultiStringView.cs) | Wraps inner root site refresh | +| `DataTree` | [Src/Common/Controls/DetailControls/DataTree.cs](../../../../Src/Common/Controls/DetailControls/DataTree.cs) | Refreshes slices by rebuilding control list, not by root-box dirty flag | + +## Dirtying Matrix: Native Reconstruct-State Mutations + +These are the highest-priority paths because they define whether the native box tree is stale. + +| Item | Parameters / transform | Should make `NeedsReconstruct` dirty? | Current behavior | Status | +|---|---|---:|---|---| +| `VwRootBox::PropChanged(HVO hvo, PropTag tag, int ivMin, int cvIns, int cvDel)` | Any semantic data change surfaced through SDA notification | Yes | Sets `m_fNeedsReconstruct = true` | Confirmed correct | +| `VwRootBox::OnStylesheetChange()` | Stylesheet effects change rendered output and layout | Yes | Sets `m_fNeedsReconstruct = true` and `m_fNeedsLayout = true`, then immediately relayouts | Confirmed correct and covered by native regression test | +| `VwRootBox::SetRootObjects(HVO* prghvo, IVwViewConstructor** prgpvwvc, int* prgfrag, IVwStylesheet* pss, int chvo)` | Root HVO, VC, fragment, stylesheet, or root count changes | Yes | Now sets `m_fNeedsReconstruct = true` before `Reconstruct()` when already constructed | Confirmed fixed | +| `VwRootBox::SetRootObject(HVO hvo, IVwViewConstructor* pvvc, int frag, IVwStylesheet* pss)` | Single-root wrapper over `SetRootObjects(...)` | Yes | Delegates to `SetRootObjects(...)` | Confirmed correct after fix | +| `VwRootBox::putref_Overlay(IVwOverlay* pvo)` | Overlay affects appearance and can affect layout | No, under the current design it is relayout-only | Sets `m_fNeedsLayout = true` and calls `LayoutFull()`, but does not set `m_fNeedsReconstruct` | Confirmed intentional and covered by native regression test | +| `VwRootBox::putref_DataAccess(ISilDataAccess* psda)` | Replacing the underlying data access object after construction | No by itself; this remains the cheap wiring primitive | Adds/removes notifications, does not dirty reconstruct state | Confirmed intentional and covered by native regression test | +| `VwRootBox::Construct(...)` | Initial construction of box tree | No, this is the rebuild itself | Clears `m_fNeedsReconstruct = false` | Correct | +| `VwRootBox::Reconstruct(...)` | Full rebuild of current root | No, this is the rebuild itself | Clears `m_fNeedsReconstruct = false` at end | Correct | + +### Native paths that bypass the dirty flag intentionally + +Not every path that bypasses `m_fNeedsReconstruct` is a bug. The native sweep found several intentional bypass categories: + +| Path family | Example | Why it bypasses the flag | +|---|---|---| +| Immediate reconstruct after explicit root change | `SetRootObjects(...)` | Sets the flag and immediately reconstructs | +| Immediate relayout after appearance change | `OnStylesheetChange()`, `putref_Overlay(...)` | Treats the change as relayout work instead of deferred rebuild work | +| Cheap source wiring without semantic invalidation | `putref_DataAccess(...)` | Keeps setup-time and non-visual SDA swaps cheap; host layers must opt into an explicit semantic refresh signal when the current tree is stale | + +### Explicit SDA swap contract + +The current native/managed split treats SDA changes as a two-step contract: + +1. `putref_DataAccess(...)` changes notification wiring and the source used for future reads. +2. `SimpleRootSite.NotifyDataAccessSemanticsChanged()` is the explicit opt-in signal for the rarer case where an already-constructed root site's current tree is semantically stale and must be rebuilt later. + +This keeps initialization-time `DataAccess` setup cheap, avoids forcing incidental swaps to behave like live-view refreshes, and reuses the existing managed refresh pipeline instead of changing the `IVwRootBox` COM surface. + +The known `XmlSeqView` print-source swap should stay on the cheap path. That code temporarily changes `RootBox.DataAccess` so `SimpleRootSite.Print()` picks up an alternate SDA when creating a separate `PrintRootSite`; it is not asking the live on-screen root box to rebuild. + +The first concrete product caller adjusted under this contract is `InterlinRibbon.SetRoot(...)`. That path previously rebuilt the existing root and then swapped `DataAccess` to the ribbon decorator afterward. It now installs the decorator before calling `ChangeOrMakeRoot(...)`, so the rebuild runs against the right source without needing a post-construct semantic refresh. +| Lazy-box incremental updates | lazy expansion and notifier relayout paths | Mutates only the affected part of the tree | +| Synchronizer-driven updates | synchronized lazy expansion / contraction paths | Coordinator logic updates participating roots directly | + +The real bug pattern is narrower: a path that changes semantics, does not dirty reconstruct state, and also does not immediately repair the tree. + +## Dirtying Matrix: Decorators and Data-Transform Layers + +The managed refresh path explicitly calls `decorator.Refresh()` before checking `NeedsReconstruct`. That makes decorator behavior part of the architecture. + +### Confirmed decorator behavior in this repo + +| Decorator | File | Transform it performs | Should dirty reconstruct state when transform changes visible output? | Current dirty path | Status | +|---|---|---|---:|---|---| +| `ConcDecorator` | [Src/xWorks/ConcDecorator.cs](../../../../Src/xWorks/ConcDecorator.cs) | Rebuilds cached occurrence/value lists | Yes | Overrides `Refresh()`, clears caches, then calls `base.Refresh()`; also sends property-change style notifications elsewhere | Looks aligned | +| `DictionaryPublicationDecorator` | [Src/xWorks/DictionaryPublicationDecorator.cs](../../../../Src/xWorks/DictionaryPublicationDecorator.cs) | Rebuilds publication exclusion sets, filtered field sets, homograph info | Yes | `Refresh()` now compares pre/post filtered state and sends a broad lexical-list invalidation when that state changes | Fixed and validated with targeted test | +| `XMLViewsDataCache` | [Src/Common/Controls/XMLViews/XMLViewsDataCache.cs](../../../../Src/Common/Controls/XMLViews/XMLViewsDataCache.cs) | View-local cached data for XML views | Yes if cache contents affect visible rows/strings | Does not override `Refresh()`; repo-local setters appear to use explicit property-change notifications | Low risk based on repo-local usage | +| `ObjectListPublisher` | [Src/Common/Controls/XMLViews/ObjectListPublisher.cs](../../../../Src/Common/Controls/XMLViews/ObjectListPublisher.cs) | Owner/list projection | Yes | No `Refresh()` override; public mutation API issues `SendPropChanged(...)` | Low risk | +| `FilterSdaDecorator` | [Src/Common/Controls/XMLViews/FilterSdaDecorator.cs](../../../../Src/Common/Controls/XMLViews/FilterSdaDecorator.cs) | Filtered sequence projection | Yes | No `Refresh()` override found; appears static after setup | Low risk in current usage | +| `InterestingTextsDecorator` | [Src/xWorks/InterestingTextsDecorator.cs](../../../../Src/xWorks/InterestingTextsDecorator.cs) | Filtered text list projection | Yes | Relies on external interesting-text-list notifications rather than local `Refresh()` override | Medium risk | +| `ComplexConcPatternSda` | [Src/LexText/Interlinear/ComplexConcPatternSda.cs](../../../../Src/LexText/Interlinear/ComplexConcPatternSda.cs) | Pattern-based concordance transform | Yes | Inherits base behavior | Unverified in this repo | +| `InterlinRibbonDecorator` | [Src/LexText/Discourse/InterlinRibbonDecorator.cs](../../../../Src/LexText/Discourse/InterlinRibbonDecorator.cs) | Ribbon/occurrence transform | Yes | Inherits base behavior | Unverified in this repo | +| `ShowSpaceDecorator` | [Src/LexText/Interlinear/ShowSpaceDecorator.cs](../../../../Src/LexText/Interlinear/ShowSpaceDecorator.cs) | Alternate display formatting | Yes | Inherits base behavior | Unverified in this repo | +| `ReversalEntryDataAccess` | [Src/LexText/Lexicon/ReversalIndexEntrySlice.cs](../../../../Src/LexText/Lexicon/ReversalIndexEntrySlice.cs) | Reversal entry projection/caching | Yes | Special-case `PropChanged()` behavior but no repo-local `Refresh()` override | Low-medium risk | +| `GhostDaDecorator` | [Src/Common/Controls/DetailControls/GhostStringSlice.cs](../../../../Src/Common/Controls/DetailControls/GhostStringSlice.cs) | Ghost-string data projection | Yes | Inherits base behavior | Unverified in this repo | +| `SdaDecorator` in reference views | [Src/Common/Controls/DetailControls/PossibilityVectorReferenceView.cs](../../../../Src/Common/Controls/DetailControls/PossibilityVectorReferenceView.cs), [Src/Common/Controls/DetailControls/PossibilityAtomicReferenceView.cs](../../../../Src/Common/Controls/DetailControls/PossibilityAtomicReferenceView.cs), [Src/Common/Controls/DetailControls/PhoneEnvReferenceView.cs](../../../../Src/Common/Controls/DetailControls/PhoneEnvReferenceView.cs) | Specialized reference-view projection | Yes | Inherits base behavior | Unverified in this repo | + +### Confirmed decorator outlier + +`DictionaryPublicationDecorator` is the important current outlier because: + +- `Refresh()` rebuilds `m_excludedItems`, `m_fieldsToFilter`, and homograph info. +- Those caches directly affect what rows and fields are visible. +- `Refresh()` does not obviously emit a native-dirtying signal. +- `PropChanged(...)` in that class does re-broadcast notifications, but that only helps if refresh-causing operations actually flow through `PropChanged(...)`. + +This is the strongest remaining argument that the current architecture still relies on convention rather than one enforced rule. + +### Decorator risk ranking from the comprehensive sweep + +The risk is not evenly distributed across all decorators. + +- High risk before fix: `DictionaryPublicationDecorator` +- Medium risk: `InterestingTextsDecorator`, `ConcDecorator`, and downstream `RespellingSda` behavior through `ConcDecorator` +- Low-medium risk: `ReversalEntryDataAccess` +- Low risk: `ObjectListPublisher`, `XMLViewsDataCache`, `FilterSdaDecorator`, and most reference-view / ghost decorators + +The concentration of risk in dynamic filtering/projection decorators suggests the current notification model is mostly sound, but brittle at the most stateful transforms. + +## Sites That Bypass the Managed Guard + +Many classes call `m_rootb.Reconstruct()` directly instead of relying on `RefreshDisplay()`. Examples include files under: + +- [Src/Common/Controls/Widgets/FwTextBox.cs](../../../../Src/Common/Controls/Widgets/FwTextBox.cs) +- [Src/Common/Controls/Widgets/FwListBox.cs](../../../../Src/Common/Controls/Widgets/FwListBox.cs) +- [Src/Common/Controls/Widgets/FwMultiParaTextBox.cs](../../../../Src/Common/Controls/Widgets/FwMultiParaTextBox.cs) +- [Src/Common/Controls/XMLViews/XmlSeqView.cs](../../../../Src/Common/Controls/XMLViews/XmlSeqView.cs) +- [Src/LexText/Interlinear/SandboxBase.cs](../../../../Src/LexText/Interlinear/SandboxBase.cs) +- [Src/LexText/Morphology/InflAffixTemplateControl.cs](../../../../Src/LexText/Morphology/InflAffixTemplateControl.cs) + +This matters because: + +- they do not depend on the managed PATH-L5 check +- they still depend on native `Reconstruct()` semantics +- they can hide missing dirty paths if the caller simply reconstructs unconditionally + +This is not necessarily wrong. It just means the architecture is currently mixed: + +- some sites use dirty-flag-driven refresh +- some sites opt into explicit full rebuilds + +### Direct `m_rootb.Reconstruct()` caller categories + +The managed sweep grouped direct reconstruct callers into four buckets: + +| Category | Typical files | Why they rebuild directly | +|---|---|---| +| Fragment / VC / root semantics change | [Src/Common/Controls/XMLViews/XmlSeqView.cs](../../../../Src/Common/Controls/XMLViews/XmlSeqView.cs), [Src/LexText/ParserUI/TryAWordRootSite.cs](../../../../Src/LexText/ParserUI/TryAWordRootSite.cs) | View composition changed in a way the caller treats as an immediate rebuild event | +| UI-property / writing-system changes | [Src/Common/Controls/Widgets/FwTextBox.cs](../../../../Src/Common/Controls/Widgets/FwTextBox.cs), [Src/Common/Controls/Widgets/FwMultiParaTextBox.cs](../../../../Src/Common/Controls/Widgets/FwMultiParaTextBox.cs), [Src/Common/Controls/Widgets/FwListBox.cs](../../../../Src/Common/Controls/Widgets/FwListBox.cs) | Rendering assumptions changed outside normal model `PropChanged` flow | +| Dialog-launcher / collection edits | files under `Src/LexText/Lexicon/` | UI action commits data that the view chooses to rebuild immediately | +| Workaround paths for incomplete dependency tracking | [Src/LexText/Morphology/InflAffixTemplateControl.cs](../../../../Src/LexText/Morphology/InflAffixTemplateControl.cs) | Explicit workaround because the XML `` element does not fully track dependencies | + +This categorization suggests that direct `Reconstruct()` calls are serving two roles: + +- legitimate immediate rebuild policy chosen by the caller +- escape hatch for dependency-tracking weaknesses higher in the stack + +That second role is where future audit effort is likely to pay off. + +## What Correctly Needs to Dirty the Flag + +The right rule is not “everything that changes should set the flag.” The right rule is narrower: + +> Any operation that can make the existing root-box tree semantically wrong for the next paint must dirty reconstruct state, unless that operation immediately performs its own full rebuild. + +That includes: + +- changing root object identity +- changing fragment selection +- changing view constructor selection +- changing stylesheet in a way that requires rebuilding boxes, not just relayout +- changing overlay if overlay semantics alter generated boxes and not just layout metrics +- changing decorator-side filtering, projection, suppression, homograph labeling, or any other transform that changes visible content +- any deferred or batch-updated data access swap performed after initial construction + +That does not necessarily include: + +- pure width/layout changes already handled by `m_fNeedsLayout` +- explicit callers that immediately invoke `m_rootb.Reconstruct()` as their chosen mechanism + +## Test and Evidence Coverage + +The subagent sweep also catalogued the current tests and the remaining blind spots. + +### Existing coverage + +Representative existing coverage includes: + +- [Src/Common/RootSite/RootSiteTests/RenderBaselineTests.cs](../../../../Src/Common/RootSite/RootSiteTests/RenderBaselineTests.cs) +- [Src/Common/RootSite/RootSiteTests/RenderTimingSuiteTests.cs](../../../../Src/Common/RootSite/RootSiteTests/RenderTimingSuiteTests.cs) +- [Src/Common/RootSite/RootSiteTests/MoreRootSiteTests.cs](../../../../Src/Common/RootSite/RootSiteTests/MoreRootSiteTests.cs) +- [Src/xWorks/xWorksTests/DictionaryPublicationDecoratorTests.cs](../../../../Src/xWorks/xWorksTests/DictionaryPublicationDecoratorTests.cs) +- [Src/xWorks/xWorksTests/InterestingTextsTests.cs](../../../../Src/xWorks/xWorksTests/InterestingTextsTests.cs) +- [Src/Common/Controls/XMLViews/XMLViewsTests/XmlBrowseViewBaseTests.cs](../../../../Src/Common/Controls/XMLViews/XMLViewsTests/XmlBrowseViewBaseTests.cs) + +These tests give evidence that the optimization works and that several `PropChanged`-driven refresh paths behave correctly. + +### Coverage gaps + +The most important remaining gaps are: + +| Gap | Why it matters | +|---|---| +| Direct `Reconstruct()` caller scenarios (`XmlView`, `XmlSeqView`, `TryAWordRootSite`, bulk-edit flows) | These bypass `RefreshDisplay()` by design and therefore need focused caller-level tests rather than more root-box dirty-flag changes | +| Decorator refresh under PATH-L5 for dynamic list/projector decorators | Validates that `Refresh()`-driven visible changes are not lost when `NeedsReconstruct` stays false | +| XML `` and similar dependency-tracking workaround paths | Confirms explicit rebuild workarounds remain necessary and intentional | +| Width-change boundary behavior around `m_fNeedsLayout` / `m_dxLastLayoutWidth` | Confirms the split between relayout and reconstruct stays coherent | + +### Suggested test targets + +If this audit turns into follow-up implementation work, the highest-value new tests are: + +1. a focused managed test for direct rebuild callers such as `XmlView.ResetTables()` / `XmlSeqView.ResetTables()` +2. a decorator test for `DictionaryPublicationDecorator.Refresh()` under the managed fast path +3. a focused managed test for the XML `` workaround path that currently rebuilds explicitly +4. a width-boundary test that documents relayout-only behavior versus reconstruct behavior + +## Execution Checklist + +### Findings + +- [x] Confirm `SetRootObjects(...)` needed to dirty reconstruct state for already-constructed root boxes. +- [x] Confirm `DictionaryPublicationDecorator.Refresh()` was the highest-risk managed refresh path. +- [x] Identify `putref_DataAccess(...)` as a plausible native dirty-flag gap. +- [x] Resolve whether `putref_Overlay(...)` is intentionally relayout-only. +- [x] Decide whether any other decorator besides `DictionaryPublicationDecorator` needs immediate code changes. +- [x] Classify remaining live `DataAccess` swaps after construction. + +Findings summary: + +- No additional live post-construction `DataAccess` swap needing code changes was found beyond the already-fixed `InterlinRibbon.SetRoot(...)` ordering case. +- `XmlSeqView` print-time `DataAccess` swaps remain intentionally cheap because they are print/setup flows, not live-view semantic refreshes. +- The remaining medium-risk decorator is `InterestingTextsDecorator`, but its update model already flows through explicit `SendPropChanged(...)` on list changes rather than a hidden post-construction SDA swap. +- Most remaining direct `m_rootb.Reconstruct()` callers are explicit caller-policy rebuilds or workaround paths for incomplete dependency tracking, not evidence that `putref_DataAccess(...)` should dirty the root box globally. + +### Existing Coverage Verified + +- [x] Native regression test added for repeated `SetRootObject()` on a constructed view. +- [x] Existing render baseline/timing tests cover the performance intent of PATH-L5 / PATH-R1. +- [x] Existing dictionary decorator tests cover filtering logic and `PropChanged(...)` routing. +- [x] Existing `InterestingTextsTests` cover the list/decorator event path at the domain level. +- [x] Existing `SimpleRootSiteTests` cover cheap SDA swaps, explicit semantic refresh, and hidden-site deferral. +- [x] Existing `InterlinRibbonTests` cover decorator-install ordering before rebuilding an existing root. + +### New Tests Planned + +- [x] Add native test that `putref_DataAccess(...)` remains a cheap wiring operation after construction. +- [x] Add managed test coverage for explicit semantic refresh after a post-construction SDA swap. +- [x] Add targeted test for overlay mutation behavior after construction. +- [x] Add targeted test for stylesheet-change behavior after construction. +- [x] Add focused caller-level test for `XmlView.ResetTables()` / `XmlSeqView.ResetTables()` explicit rebuild behavior. +- [x] Add focused caller-level test for the XML `` rebuild workaround path. +- [x] Close the decorator-visible PATH-L5 gap with the existing `DictionaryPublicationDecoratorTests.Refresh_NotifiesRegisteredRoots_WhenVisibleFilteringChanges` coverage plus the focused `SimpleRootSite` PATH-L5 tests. +- [x] Add width-boundary test that distinguishes relayout-only invalidation from reconstruct invalidation. + +### Edge Cases Planned + +- [x] Existing root box rebuilt after VC/layout-spec table reset. +- [x] Decorator-visible filter/list change while `NeedsReconstruct == false`. +- [x] Hidden-site semantic refresh deferred until visible. +- [x] XML `` dependency change that still requires an explicit rebuild workaround. +- [x] Width change that should relayout without forcing reconstruct. + +### Code Changes Completed + +- [x] Keep `putref_DataAccess(...)` as a cheap wiring operation and move semantic post-construction swaps to the managed explicit-refresh contract. +- [x] Make `DictionaryPublicationDecorator.Refresh()` participate in the normal refresh/invalidation contract. +- [x] Add explicit managed SDA-swap helpers in `SimpleRootSite` for cheap versus semantic swaps. +- [x] Reorder `InterlinRibbon.SetRoot(...)` so the decorator is installed before rebuilding an existing root. + +### Code Changes Rejected By Audit + +- [x] Do not dirty reconstruct state automatically in `putref_DataAccess(...)`. +- [x] Do not add another COM/native dirtying API for SDA semantics. +- [x] Do not weaken the PATH-L5 / PATH-R1 guards globally for decorated views. + +### Validation + +- [x] Get a clean native `TestViews` validation run. +- [x] Run targeted managed tests for `DictionaryPublicationDecoratorTests` after managed test/code changes. +- [x] Run targeted managed tests for `SimpleRootSiteTests` covering cheap SDA swaps and explicit semantic refreshes. +- [x] Run targeted managed tests for `InterlinRibbon` ordering on existing root boxes. +- [x] Run the focused `XMLViewsTests` assertions for explicit rebuild callers and the `ShowFailingItems` workaround path. + +### Validation Notes + +- `SimpleRootSiteTests` now provide deterministic coverage for: + - cheap `SetRootBoxDataAccess(...)` swaps staying on the no-reconstruct fast path, + - explicit `SetRootBoxDataAccessAndRefresh(...)` swaps forcing one managed rebuild, + - deferred semantic refresh when the site is hidden. +- `InterlinRibbonTests.SetRoot_AssignsDecoratorBeforeChangingExistingRootObject` provides deterministic caller-level coverage that the ribbon decorator is installed before an existing root is rebuilt. +- `XmlViewRefreshPolicyTests` now cover direct XMLViews rebuild callers and the `ShowFailingItems` workaround path with a lightweight fake root box; the focused assertions passed, but the local VSTest host still aborted after completion in this environment. +- The legacy `InterlinRibbonTests.RibbonLayout` integration test still times out in isolation and should be treated as pre-existing instability, not as proof that the SDA-swap ordering change is wrong. +- After a clean native rebuild, `TestViews.exe` now links and runs cleanly again, including the new width-boundary regression. + +## Resolved Architectural Decision + +The audit now supports a single clear direction: + +- `VwRootBox` stays the native source of truth for whether a tree is stale. +- `putref_DataAccess(...)` stays cheap and does not automatically dirty reconstruct state. +- When a post-construction SDA swap truly makes the current tree semantically stale, the host layer must opt in through the managed explicit-refresh contract in `SimpleRootSite`. +- Direct `Reconstruct()` callers remain allowed when the caller is intentionally choosing an immediate rebuild policy or compensating for incomplete dependency tracking. + +This is the smallest and most testable design because it: + +- preserves PATH-L5 / PATH-R1 performance wins, +- avoids expanding the COM/native invalidation surface, +- keeps one native dirty-state authority, +- and makes the exceptional post-construction SDA case explicit at the host layer. + +## Best-Next Test Work + +The highest-value remaining work is now testability, not more architecture churn. + +1. If the local test-host abort remains reproducible, isolate it separately from the XMLViews assertions themselves. +2. Add broader integration coverage only where a direct caller still lacks focused deterministic tests. + +## Bottom Line + +The post-construction `DataAccess` sweep did not uncover more live-swap bugs of the same class as the original `InterlinRibbon` issue. + +The branch now has: + +- a native fix for `SetRootObjects(...)`, +- an explicit managed semantic-refresh contract for the rare SDA-swap case, +- a concrete caller fix in `InterlinRibbon`, +- and a narrowed follow-up list centered on direct-caller and decorator-path test coverage. diff --git a/openspec/changes/render-speedup-benchmark/specs/render-speedup-benchmark/spec.md b/openspec/changes/render-speedup-benchmark/specs/render-speedup-benchmark/spec.md new file mode 100644 index 0000000000..ca1eac5ffa --- /dev/null +++ b/openspec/changes/render-speedup-benchmark/specs/render-speedup-benchmark/spec.md @@ -0,0 +1,130 @@ +## ADDED Requirements + +### Requirement: Pixel-perfect baseline harness for lexical entry rendering + +The system SHALL provide a deterministic render-timing harness for lexical entries that validates pixel-perfect output against approved snapshots with zero visual tolerance. + +#### Scenario: Baseline passes with deterministic environment + +- **WHEN** a reference entry is rendered in a matching deterministic environment (font/DPI/theme hash) +- **THEN** the harness SHALL produce timing metrics +- **AND** snapshot validation SHALL pass pixel-perfect comparison + +#### Scenario: Baseline fails on visual mismatch + +- **WHEN** rendered output differs from approved snapshot +- **THEN** snapshot validation SHALL fail and report mismatch diagnostics + +### Requirement: Five-scenario timing suite with cold and warm metrics + +The system SHALL execute exactly five benchmark scenarios (simple, medium, complex, deep-nested, custom-field-heavy) and report cold and warm render timings. + +#### Scenario: Suite emits complete results + +- **WHEN** the timing suite runs +- **THEN** results SHALL include all five scenarios +- **AND** each scenario SHALL include cold and warm timing values plus summary metrics + +### Requirement: Benchmark run metadata and comparison support + +Each benchmark run SHALL record run metadata and support comparison against prior runs to identify regressions and improvements. + +#### Scenario: Run metadata is present + +- **WHEN** a benchmark run completes +- **THEN** output SHALL include run timestamp, configuration, and environment identifier + +#### Scenario: Run comparison highlights regression + +- **WHEN** a run is compared with a baseline run +- **THEN** comparison output SHALL flag regressing and improving scenarios + +### Requirement: File-based render trace diagnostics + +The system SHALL emit append-only, timestamped trace diagnostics with durations for key render stages and allow diagnostics to be toggled. + +#### Scenario: Trace enabled + +- **WHEN** diagnostics are enabled and rendering runs +- **THEN** trace output SHALL contain stage timing events in file-based append-only format + +#### Scenario: Trace disabled + +- **WHEN** diagnostics are disabled +- **THEN** benchmark execution SHALL proceed without trace-stage emission overhead + +### Requirement: Analysis summary and optimization guidance + +The benchmark pipeline SHALL produce an analysis summary listing top contributors and optimization candidates. + +#### Scenario: Summary includes contributors and recommendations + +- **WHEN** benchmark + trace data are available +- **THEN** summary SHALL rank top time contributors +- **AND** provide at least three optimization recommendations targeting nested/custom-heavy entry performance + +### Requirement: Pixel-perfect is a hard gate for timing suite pass + +Timing suite execution SHALL fail if snapshot validation fails for any required scenario. + +#### Scenario: Snapshot failure fails suite + +- **WHEN** any scenario fails pixel-perfect validation +- **THEN** timing suite result SHALL be failed even if timing metrics were collected + +### Requirement: DataTree timing scenarios must reflect workload growth + +DataTree timing scenarios SHALL exercise increasing render workload as scenario depth/breadth grows. + +#### Scenario: Benchmark complexity monotonicity + +- **WHEN** shallow, deep, and extreme DataTree timing scenarios are executed +- **THEN** workload indicators (including slice count) SHALL increase monotonically shallow < deep < extreme +- **AND** the test SHALL fail if workload growth is not observed + +### Requirement: No external services for harness and timing suite + +Harness, timing suite, and diagnostics workflow SHALL run locally without external service dependencies. + +#### Scenario: Local-only operation + +- **WHEN** tests run in an offline local environment with repo dependencies +- **THEN** benchmark and validation workflows SHALL complete without external service calls + +## Edge Cases + +- Entry contains no custom fields and no senses — harness must still produce valid timing and snapshot. +- Extremely large nested entries with deep sense hierarchies (5+ levels, 20+ senses per level) — suite must complete without timeout or crash. +- Environment changes (fonts, DPI, theme) invalidate snapshots — harness must detect and fail with environment-mismatch diagnostic rather than a confusing pixel diff. +- Timing variance exceeding 5% tolerance — repeated runs must be flagged rather than silently accepted. +- Render output affected by ClearType, text scaling, or window DPI — harness enforces deterministic settings via environment hash validation. + +## Assumptions + +- Pixel-perfect validation relies on deterministic environment control (fixed fonts, DPI, and theme) with zero tolerance. +- Test data for scenarios can be stored in-memory via LCModel test infrastructure and reused without manual re-creation. +- Timing variance of ±5% is acceptable for determining baseline trends across runs on the same machine. +- No external services are required for the harness, timing suite, or diagnostics workflow. + +## Performance Targets + +Performance targets are expressed as **relative improvement %** over the measured baseline, not absolute millisecond thresholds. This accounts for hardware variation across developer machines and CI environments. + +| Scope | Metric | Target | +|-------|--------|--------| +| Simple entry load | Form load time | ≥60% reduction from baseline | +| Complex entry load | Form load time | ≥70% reduction from baseline | +| Custom fields expand | Section expand time | ≥80% reduction from baseline | +| Memory per entry | Working set delta | ≥50% reduction from baseline | +| Handle count | Window handles | ≥70% reduction from baseline | + +These targets guide the optimization phase (Phase 7). Each optimization is measured against its own before/after baseline run. + +## Success Criteria + +- SC-001: The timing harness produces a pixel-perfect pass/fail result for the reference entry on every run. +- SC-002: Each timing scenario completes with run-to-run variance at or below 5% across three consecutive runs. +- SC-002a: Each timing scenario reports both cold-start and warm-cache timings. +- SC-003: The suite includes exactly five scenarios (simple, medium, complex, deep-nested, custom-field-heavy). +- SC-004: Each benchmark run produces a report that identifies the top five time contributors and their share of total render time. +- SC-005: The analysis summary lists at least three optimization candidates focused on reducing growth in nested or custom-field-heavy entries. diff --git a/openspec/changes/render-speedup-benchmark/tasks.md b/openspec/changes/render-speedup-benchmark/tasks.md new file mode 100644 index 0000000000..c16e22ca67 --- /dev/null +++ b/openspec/changes/render-speedup-benchmark/tasks.md @@ -0,0 +1,90 @@ +## Speckit Migration Notes + +- Source of truth migrated from `specs/001-render-speedup/` into this OpenSpec change. +- Existing completion states from Speckit are preserved below. +- New OpenSpec-only tasks are marked with `OS-` IDs. +- Shared benchmark/snapshot helper sources live under `Src/Common/RenderVerification/*.cs` and are compiled into `Src/Common/RenderTestInfrastructure/RenderTestInfrastructure.csproj`. +- `Src/Common/RenderVerification/RenderVerification.csproj` adds the heavier DataTree/composite capture pieces that depend on `DetailControls`. +- Detailed optimization, tracing, and follow-up analysis for this branch is tracked in `RENDER_OPTIMIZATIONS.md`, `PERFORM_OFFSCREENLAYOUT_PATHS_1_2_5_PLAN.md`, `refresh-dirty-flag-audit.md`, and `dpi-fix-implementation.md`. + +## Phase 1: Setup (Shared Infrastructure) + +- [x] T001 Create scenario definition file at `Src/Common/RootSite/RootSiteTests/TestData/RenderBenchmarkScenarios.json`. +- [x] T002 Update `.gitignore` to exclude `Output/RenderBenchmarks/**` artifacts. +- [x] T002a Add feature-flag config file at `Src/Common/RootSite/RootSiteTests/TestData/RenderBenchmarkFlags.json`. + +## Phase 2: Foundational (Blocking) + +- [x] T003 Create harness class in `Src/Common/RootSite/RootSiteTests/RenderBenchmarkHarness.cs`. +- [x] T004 Add snapshot verification/diff utility in `Src/Common/RenderVerification/RenderSnapshotVerifier.cs`. +- [x] T005 Add benchmark models + JSON serialization in `Src/Common/RenderVerification/RenderBenchmarkResults.cs`. +- [x] T006 Add scenario data builder helpers in `Src/Common/RenderVerification/RenderScenarioDataBuilder.cs`. +- [x] T007 Add deterministic environment validator in `Src/Common/RenderVerification/RenderEnvironmentValidator.cs`. +- [x] T008 Add trace log parser in `Src/Common/RenderVerification/RenderTraceParser.cs`. +- [x] T008a Add diagnostics toggle helper in `Src/Common/RenderVerification/RenderDiagnosticsToggle.cs`. +- [x] T008b Add regression comparer in `Src/Common/RenderVerification/RenderBenchmarkComparer.cs`. + +## Phase 3: User Story 1 - Pixel-Perfect Render Baseline (P1) + +- [x] T009 Implement baseline test in `Src/Common/RootSite/RootSiteTests/RenderBaselineTests.cs`. +- [x] T009a Pivot: Adopt native capture via `VwDrawRootBuffered` in `RenderBenchmarkHarness.cs`. +- [x] T010 Add baseline snapshot for simple scenario. +- [x] T011 Wire environment hash validation into harness. +- [x] T011a Document `DrawToBitmap` limitations and skip list. + +## Phase 4: User Story 2 - Rendering Timing Suite (P2) + +- [x] T012 Populate five timing scenarios (simple, medium, complex, deep-nested, custom-field-heavy). +- [x] T013 Implement timing suite in `RenderTimingSuiteTests.cs`. +- [x] T014 Add report writer in `Src/Common/RenderVerification/RenderBenchmarkReportWriter.cs`. +- [x] T015 Add baseline snapshots for remaining scenarios. +- [x] T016 Emit results to `Output/RenderBenchmarks/results.json` and summary to `Output/RenderBenchmarks/summary.md`. +- [x] T016a Implement run comparison in report writer using `Src/Common/RenderVerification/RenderBenchmarkComparer.cs`. +- [x] T016b Add reproducible test data guidance in migrated quickstart docs. + +## Phase 5: User Story 3 - Rendering Trace Diagnostics (P3) + +- [x] T017 Add trace timing helper in `Src/views/VwRenderTrace.h`. +- [x] T021 Route benchmark trace capture through `Src/Common/RenderVerification/RenderDiagnosticsToggle.cs`; native `VwRenderTrace.h` timing remains compile-time-gated. +- [x] T022 Integrate trace parsing into `Src/Common/RenderVerification/RenderBenchmarkReportWriter.cs`. +- Trace instrumentation details, validation notes, and follow-up analysis are tracked in `RENDER_OPTIMIZATIONS.md`, `PERFORM_OFFSCREENLAYOUT_PATHS_1_2_5_PLAN.md`, and `refresh-dirty-flag-audit.md`. + +## Phase 6: Polish & Cross-Cutting + +- [x] T023 Update quickstart with harness usage and output paths. +- [x] T024 Review/update `Src/views/AGENTS.md` for tracing changes. +- [x] T025 Review/update `Src/Common/RootSite/AGENTS.md` for harness/tests. +- [x] T026 Add explicit edge-case validations in timing suite. + +## OpenSpec Continuation Tasks + +- [x] OS-1 Switch DataTree timing benchmarks to stable test-layout mode for workload scaling. +- [x] OS-2 Add DataTree timing workload-growth guard test (monotonic complexity). +- [x] OS-3 Run targeted verification for `DataTreeTiming*` and confirm green. Fixed test layout (Normal needs real parts + subsense recursion) and FieldWorks.sln duplicate Kernel project. +- [x] OS-4 Add benchmark timing artifact schema notes (required keys, meaning, and comparability rules). +- [x] OS-5 Execute one measured hotspot optimization and capture before/after evidence. Applied ResetTabIndices O(N²)→O(N) fix and BecomeReal DeepSuspendLayout. See `Output/RenderBenchmarks/OPT1-evidence.md`. +## Phase 7: Optimization Research & Implementation + +**Purpose**: Apply the 10 optimization techniques identified in FORMS_SPEEDUP_PLAN.md, prioritized by ROI. Each requires timing infrastructure to be in place (OS-3/OS-5 first). + +- Branch optimization work and evidence are consolidated in `RENDER_OPTIMIZATIONS.md` and `PERFORM_OFFSCREENLAYOUT_PATHS_1_2_5_PLAN.md`. +- [x] OPT-1 SuspendLayout/ResumeLayout Batching — skip redundant per-slice `ResetTabIndices` during `ConstructingSlices`; wrap `BecomeReal()` with `DeepSuspendLayout`/`DeepResumeLayout`. Eliminates O(N²) tab index recalc and unsuspended lazy expansion. +- Additional future optimization ideas are intentionally tracked in the companion documents above instead of duplicated in this checklist. + +**Acceptance guard**: Each optimization must show relative improvement % over its own baseline run; no absolute ms thresholds (targets are % improvement). + +**Feature flags**: Ship optimizations behind environment variable flags (e.g., `FW_PERF_COLLAPSE_DEFAULT`, `FW_PERF_ASYNC_LOAD`) for gradual rollout and rollback. See `research/FORMS_SPEEDUP_PLAN.md` Feature Flags section. + +## Phase 8: Layout & Reconstruct Optimization (Native Views Engine) + +**Purpose**: Eliminate redundant layout passes in the C++ Views engine that cause double-work during warm renders. Analysis shows Reconstruct (44.5%) + PerformOffscreenLayout (45.1%) together consume 89.6% of warm render time, and the second layout pass is provably redundant. See `research/layout-optimization-paths.md`. + +- [x] PATH-L1 Width-invariant layout guard — add `m_fNeedsLayout` + `m_dxLastLayoutWidth` dirty-flag to `VwRootBox::Layout()`. When called with same width and box tree is not dirty, return immediately. Set dirty in `Construct()`, `PropChanged()`, `OnStylesheetChange()`, `putref_Overlay()`. Warm Layout drops from ~50ms to ~0.03ms. +- [x] PATH-L4 Harness GDI resource caching — cache offscreen Bitmap/Graphics/HDC/VwGraphics across calls instead of allocating per-call. Eliminates ~27ms overhead per warm PerformOffscreenLayout call. +- [x] PATH-R1 Reconstruct guard — add `m_fNeedsReconstruct` dirty-flag to `VwRootBox::Reconstruct()`. When called with no data change since last construction, skip entirely. Set dirty in `PropChanged()`, `OnStylesheetChange()`. Warm Reconstruct drops from ~100ms to ~0.01ms. +- [x] PATH-L1-VERIFY Run full benchmark suite and compare before/after timing evidence. Result: **99.99% warm render reduction** (153.00ms → 0.01ms). All 15 scenarios pass with 0% pixel variance. Cold render unaffected (62.33ms → 62.95ms). + +**Deferred** (future iterations): +- [x] PATH-L5 Skip Reconstruct when data unchanged — gate `SimpleRootSite.RefreshDisplay()` on `VwRootBox.NeedsReconstruct` and cover it with focused tests. +- [ ] PATH-L3 Per-paragraph layout caching — dirty-flag line-breaking in `VwParagraphBox::DoLayout()`. +- [ ] PATH-L2 Deferred layout in Reconstruct — remove internal `Layout()` call from `Reconstruct()` (blocked: `RootBoxSizeChanged` callback needs dimensions immediately). \ No newline at end of file diff --git a/openspec/changes/render-speedup-benchmark/timing-artifact-schema.md b/openspec/changes/render-speedup-benchmark/timing-artifact-schema.md new file mode 100644 index 0000000000..6b54199e12 --- /dev/null +++ b/openspec/changes/render-speedup-benchmark/timing-artifact-schema.md @@ -0,0 +1,42 @@ +## Timing Artifact Schema + +This schema defines the required keys for benchmark outputs used in this change. + +### Output: `Output/RenderBenchmarks/datatree-timings.json` + +Each scenario key maps to: +- depth (int) +- breadth (int) +- slices (int) +- initMs (number) +- populateMs (number) +- totalMs (number) +- density (number) +- timestamp (ISO-8601 string) + +Required scenario keys for current DataTree suite: +- simple +- deep +- extreme +- collapsed +- expanded +- multiws +- timing-shallow +- timing-deep +- timing-extreme + +### Output: `Output/RenderBenchmarks/results.json` + +Per run: +- runId +- runAt +- configuration +- environmentId +- results[] (scenarioId, coldRenderMs, warmRenderMs, variancePercent, pixelPerfectPass) +- summary (topContributors[], recommendations[]) + +### Comparability rules + +- Compare runs only for same configuration + environmentId class. +- Treat workload growth checks (slice monotonicity) as pass/fail guardrails. +- Use trend direction over absolute threshold when hardware differs. From c326cbedb9b79687ee781be470bb5825da9202da Mon Sep 17 00:00:00 2001 From: John Lambert Date: Wed, 6 May 2026 19:58:06 -0400 Subject: [PATCH 2/7] test: fix managed NUnit discovery --- test.ps1 | 110 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 110 insertions(+) diff --git a/test.ps1 b/test.ps1 index a9081310e2..715de19623 100644 --- a/test.ps1 +++ b/test.ps1 @@ -96,6 +96,105 @@ if (-not (Test-Path $helpersPath)) { } Import-Module $helpersPath -Force +function Add-UniquePath { + param( + [System.Collections.Generic.List[string]]$Paths, + [string]$Path + ) + + if ([string]::IsNullOrWhiteSpace($Path)) { + return + } + + $fullPath = [System.IO.Path]::GetFullPath($Path) + foreach ($existingPath in $Paths) { + if ([string]::Equals($existingPath, $fullPath, [System.StringComparison]::OrdinalIgnoreCase)) { + return + } + } + + $Paths.Add($fullPath) +} + +function Get-CentralPackageVersion { + param( + [string]$PackagesPropsPath, + [string]$PackageName + ) + + if (-not (Test-Path -LiteralPath $PackagesPropsPath -PathType Leaf)) { + return $null + } + + try { + [xml]$packagesProps = Get-Content -LiteralPath $PackagesPropsPath -Raw + $packageNode = $packagesProps.Project.ItemGroup.PackageVersion | + Where-Object { $_.Include -eq $PackageName -or $_.Update -eq $PackageName } | + Select-Object -Last 1 + + if ($packageNode) { + return $packageNode.Version + } + } + catch { + Write-Host "[WARN] Could not read $PackagesPropsPath for $PackageName version." -ForegroundColor Yellow + } + + return $null +} + +function Get-NUnitTestAdapterPaths { + param( + [string]$RepoRoot, + [string[]]$TestDlls + ) + + $adapterPaths = New-Object System.Collections.Generic.List[string] + + $packagesPropsPath = Join-Path $RepoRoot 'Directory.Packages.props' + $adapterVersion = Get-CentralPackageVersion -PackagesPropsPath $packagesPropsPath -PackageName 'NUnit3TestAdapter' + if (-not [string]::IsNullOrWhiteSpace($adapterVersion)) { + $adapterPath = Join-Path $RepoRoot "packages/nunit3testadapter/$adapterVersion/build/net462" + if (Test-Path -LiteralPath (Join-Path $adapterPath 'NUnit3.TestAdapter.dll') -PathType Leaf) { + Add-UniquePath -Paths $adapterPaths -Path $adapterPath + return $adapterPaths.ToArray() + } + } + + foreach ($testDll in $TestDlls) { + if ([string]::IsNullOrWhiteSpace($testDll)) { + continue + } + + $testDir = Split-Path $testDll -Parent + if ($testDir -and + (Test-Path -LiteralPath (Join-Path $testDir 'NUnit3.TestAdapter.dll') -PathType Leaf) -and + (Test-Path -LiteralPath (Join-Path $testDir 'nunit.engine.dll') -PathType Leaf)) { + Add-UniquePath -Paths $adapterPaths -Path $testDir + } + } + + if ($adapterPaths.Count -gt 0) { + return $adapterPaths.ToArray() + } + + $packagesRoot = Join-Path $RepoRoot 'packages/nunit3testadapter' + if (Test-Path -LiteralPath $packagesRoot -PathType Container) { + $packageDirs = Get-ChildItem -LiteralPath $packagesRoot -Directory -ErrorAction SilentlyContinue | + Sort-Object Name -Descending + + foreach ($packageDir in $packageDirs) { + $adapterPath = Join-Path $packageDir.FullName 'build/net462' + if (Test-Path -LiteralPath (Join-Path $adapterPath 'NUnit3.TestAdapter.dll') -PathType Leaf) { + Add-UniquePath -Paths $adapterPaths -Path $adapterPath + break + } + } + } + + return $adapterPaths.ToArray() +} + # ============================================================================= # Environment Setup # ============================================================================= @@ -429,6 +528,11 @@ try { $vstestArgs += "/Settings:$runSettingsPath" $vstestArgs += "/ResultsDirectory:$resultsDir" + $nunitAdapterPaths = @(Get-NUnitTestAdapterPaths -RepoRoot $PSScriptRoot -TestDlls $testDlls) + foreach ($adapterPath in $nunitAdapterPaths) { + $vstestArgs += "/TestAdapterPath:$adapterPath" + } + # Logger configuration - verbosity goes with the console logger $verbosityMap = @{ 'quiet' = 'quiet'; 'q' = 'quiet' @@ -454,6 +558,9 @@ try { Write-Host "" Write-Host "Running tests..." -ForegroundColor Cyan + foreach ($adapterPath in $nunitAdapterPaths) { + Write-Host " NUnit adapter path: $adapterPath" -ForegroundColor DarkGray + } Write-Host " vstest.console.exe $($vstestArgs -join ' ')" -ForegroundColor DarkGray Write-Host "" @@ -506,6 +613,9 @@ try { $singleArgs += "/Platform:x64" $singleArgs += "/Settings:$runSettingsPath" $singleArgs += "/ResultsDirectory:$resultsDir" + foreach ($adapterPath in $nunitAdapterPaths) { + $singleArgs += "/TestAdapterPath:$adapterPath" + } $singleArgs += "/Logger:trx;LogFileName=${dllName}_${timestamp}.trx" $singleArgs += "/Logger:console;verbosity=$vstestVerbosity" From 507c15ce247b0f4a37dc3acd8418f28dd3b4dd0e Mon Sep 17 00:00:00 2001 From: John Lambert Date: Wed, 6 May 2026 16:00:48 -0400 Subject: [PATCH 3/7] LT-22324: add OpenType font feature options --- Directory.Packages.props | 5 + Docs/opentype-font-features.md | 9 + Src/Common/FwUtils/FontFeatureSettings.cs | 100 +++ .../FwUtilsTests/FontFeatureSettingsTests.cs | 42 ++ .../HarfBuzzSkiaComparisonTests.cs | 103 +++ .../RenderComparisonTests.csproj | 44 ++ .../SimpleRootSite/RenderEngineFactory.cs | 44 +- .../RenderEngineFactoryTests.cs | 117 +++- .../FwCoreDlgControls/DefaultFontsControl.cs | 23 +- .../DefaultFontsControl.resx | 4 +- .../FwCoreDlgControls/FontFeaturesButton.cs | 363 ++++++++-- .../FwAttributesTests.cs | 33 + .../FwCoreDlgControlsTests/FwFontTabTests.cs | 32 + .../TestFontFeaturesButton.cs | 27 + .../FwCoreDlgsTests/FwFontDialogTests.cs | 31 + Src/views/Test/RenderEngineTestBase.h | 14 +- .../Fonts/CharisSIL-5.000/CharisSIL-R.ttf | Bin 0 -> 1508296 bytes .../TestData/Fonts/CharisSIL-5.000/OFL.txt | 94 +++ .../TestData/Fonts/CharisSIL-5.000/README.txt | 82 +++ Src/views/Test/TestUniscribeEngine.h | 312 +++++++++ Src/views/Test/TestViews.vcxproj | 15 + Src/views/Test/TestViews.vcxproj.filters | 9 + Src/views/lib/LayoutCache.h | 35 +- Src/views/lib/UniscribeSegment.cpp | 216 +++++- .../add-opentype-font-features/.openspec.yaml | 2 + .../add-opentype-font-features/design.md | 103 +++ .../01-initial-sena3-loaded-clean.png | Bin 0 -> 78164 bytes .../02-writing-system-font-options-fixed.png | Bin 0 -> 34601 bytes ...-writing-system-opentype-font-selected.png | Bin 0 -> 67287 bytes .../05-styles-font-tab-font-features.png | Bin 0 -> 112671 bytes .../manual-testing.md | 98 +++ .../add-opentype-font-features/proposal.md | 43 ++ .../add-opentype-font-features/research.md | 112 +++ .../testing/test-strategy/spec.md | 31 + .../ui-framework/views-rendering/spec.md | 30 + .../ui-framework/winforms-patterns/spec.md | 23 + .../specs/font-feature-settings/spec.md | 98 +++ .../add-opentype-font-features/tasks.md | 82 +++ .../views-migration-matrix.md | 645 ++++++++++++++++++ 39 files changed, 2916 insertions(+), 105 deletions(-) create mode 100644 Docs/opentype-font-features.md create mode 100644 Src/Common/FwUtils/FontFeatureSettings.cs create mode 100644 Src/Common/FwUtils/FwUtilsTests/FontFeatureSettingsTests.cs create mode 100644 Src/Common/RenderVerification/RenderComparisonTests/HarfBuzzSkiaComparisonTests.cs create mode 100644 Src/Common/RenderVerification/RenderComparisonTests/RenderComparisonTests.csproj create mode 100644 Src/views/Test/TestData/Fonts/CharisSIL-5.000/CharisSIL-R.ttf create mode 100644 Src/views/Test/TestData/Fonts/CharisSIL-5.000/OFL.txt create mode 100644 Src/views/Test/TestData/Fonts/CharisSIL-5.000/README.txt create mode 100644 openspec/changes/add-opentype-font-features/.openspec.yaml create mode 100644 openspec/changes/add-opentype-font-features/design.md create mode 100644 openspec/changes/add-opentype-font-features/evidence/manual-winapp/01-initial-sena3-loaded-clean.png create mode 100644 openspec/changes/add-opentype-font-features/evidence/manual-winapp/02-writing-system-font-options-fixed.png create mode 100644 openspec/changes/add-opentype-font-features/evidence/manual-winapp/03-writing-system-opentype-font-selected.png create mode 100644 openspec/changes/add-opentype-font-features/evidence/manual-winapp/05-styles-font-tab-font-features.png create mode 100644 openspec/changes/add-opentype-font-features/manual-testing.md create mode 100644 openspec/changes/add-opentype-font-features/proposal.md create mode 100644 openspec/changes/add-opentype-font-features/research.md create mode 100644 openspec/changes/add-opentype-font-features/specs/architecture/testing/test-strategy/spec.md create mode 100644 openspec/changes/add-opentype-font-features/specs/architecture/ui-framework/views-rendering/spec.md create mode 100644 openspec/changes/add-opentype-font-features/specs/architecture/ui-framework/winforms-patterns/spec.md create mode 100644 openspec/changes/add-opentype-font-features/specs/font-feature-settings/spec.md create mode 100644 openspec/changes/add-opentype-font-features/tasks.md create mode 100644 openspec/changes/add-opentype-font-features/views-migration-matrix.md diff --git a/Directory.Packages.props b/Directory.Packages.props index a9841ecd2b..9e989c6125 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -148,10 +148,15 @@ ============================================================= --> + + + + + diff --git a/Docs/opentype-font-features.md b/Docs/opentype-font-features.md new file mode 100644 index 0000000000..efb11c3551 --- /dev/null +++ b/Docs/opentype-font-features.md @@ -0,0 +1,9 @@ +# OpenType Font Features + +FieldWorks stores font options as renderer-neutral feature strings such as `smcp=1`, `kern=0`, and `cv01=2`. The same value is used by writing-system default fonts, style font settings, rendering, and export paths. + +In the current WinForms UI, use the Font Options button in font controls to choose the configurable features exposed by the selected font. Graphite remains available for now, but the Font Options UI is no longer limited to Graphite fonts. + +Graphite feature IDs are still converted only at the Graphite renderer boundary. OpenType feature tags stay as four-character tags and are passed to the Uniscribe OpenType path when Graphite is not enabled. + +For export, CSS output maps these values to `font-feature-settings`, and Notebook export preserves writing-system default font features in `DefaultFontFeatures`. Word export does not currently have a verified OpenType feature mapping and should be treated as follow-up work if Word parity is required. \ No newline at end of file diff --git a/Src/Common/FwUtils/FontFeatureSettings.cs b/Src/Common/FwUtils/FontFeatureSettings.cs new file mode 100644 index 0000000000..b03c968a48 --- /dev/null +++ b/Src/Common/FwUtils/FontFeatureSettings.cs @@ -0,0 +1,100 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; + +namespace SIL.FieldWorks.Common.FwUtils +{ + /// + /// Parses and normalizes renderer-neutral font feature strings of the form tag=value. + /// + public static class FontFeatureSettings + { + /// + /// Parses a comma-separated font feature string into normalized feature settings. + /// Invalid entries are ignored so project data cannot crash render/UI paths. + /// + public static IReadOnlyList Parse(string features) + { + if (string.IsNullOrWhiteSpace(features)) + return Array.Empty(); + + var settingsByTag = new Dictionary(StringComparer.Ordinal); + foreach (var rawPart in features.Split(',')) + { + var part = rawPart.Trim(); + if (part.Length == 0) + continue; + + var equalsIndex = part.IndexOf('='); + if (equalsIndex <= 0 || equalsIndex == part.Length - 1) + continue; + + var tag = part.Substring(0, equalsIndex).Trim(); + var valueText = part.Substring(equalsIndex + 1).Trim(); + if (!IsValidOpenTypeTag(tag)) + continue; + + int value; + if (!int.TryParse(valueText, NumberStyles.Integer, CultureInfo.InvariantCulture, out value) || value < 0) + continue; + + settingsByTag[tag] = new FontFeatureSetting(tag, value); + } + + return settingsByTag.Values.OrderBy(setting => setting.Tag, StringComparer.Ordinal).ToArray(); + } + + /// + /// Returns a deterministic string representation of valid feature settings. + /// + public static string Normalize(string features) + { + return string.Join(",", Parse(features).Select(setting => setting.ToString())); + } + + /// + /// Returns whether a string is a valid four-character OpenType feature tag. + /// + public static bool IsValidOpenTypeTag(string tag) + { + return tag != null && tag.Length == 4 && tag.All(character => character >= 0x20 && character <= 0x7e); + } + } + + /// + /// A single renderer-neutral font feature setting. + /// + public sealed class FontFeatureSetting + { + /// + /// Initializes a new instance of the class. + /// + public FontFeatureSetting(string tag, int value) + { + if (!FontFeatureSettings.IsValidOpenTypeTag(tag)) + throw new ArgumentException("OpenType feature tags must contain exactly four printable ASCII characters.", nameof(tag)); + if (value < 0) + throw new ArgumentOutOfRangeException(nameof(value), "Feature values must be non-negative."); + + Tag = tag; + Value = value; + } + + /// + /// Gets the four-character OpenType feature tag. + /// + public string Tag { get; } + + /// + /// Gets the feature value. + /// + public int Value { get; } + + /// + public override string ToString() + { + return string.Format(CultureInfo.InvariantCulture, "{0}={1}", Tag, Value); + } + } +} \ No newline at end of file diff --git a/Src/Common/FwUtils/FwUtilsTests/FontFeatureSettingsTests.cs b/Src/Common/FwUtils/FwUtilsTests/FontFeatureSettingsTests.cs new file mode 100644 index 0000000000..1a919075e2 --- /dev/null +++ b/Src/Common/FwUtils/FwUtilsTests/FontFeatureSettingsTests.cs @@ -0,0 +1,42 @@ +using System.Linq; +using NUnit.Framework; + +namespace SIL.FieldWorks.Common.FwUtils +{ + [TestFixture] + public class FontFeatureSettingsTests + { + [Test] + public void Parse_ReturnsNormalizedTagValueSettings() + { + var settings = FontFeatureSettings.Parse(" smcp = 1, kern=0,cv01=2 ").ToArray(); + + Assert.That(settings.Select(setting => setting.ToString()), + Is.EqualTo(new[] { "cv01=2", "kern=0", "smcp=1" })); + } + + [Test] + public void Parse_LastValueWinsForDuplicateTags() + { + var settings = FontFeatureSettings.Parse("smcp=1,smcp=0").ToArray(); + + Assert.That(settings, Has.Length.EqualTo(1)); + Assert.That(settings[0].ToString(), Is.EqualTo("smcp=0")); + } + + [Test] + public void Parse_IgnoresInvalidEntries() + { + var settings = FontFeatureSettings.Parse("smcp=1,bad=2,cv01=-1,kern=x,liga=0").ToArray(); + + Assert.That(settings.Select(setting => setting.ToString()), + Is.EqualTo(new[] { "liga=0", "smcp=1" })); + } + + [Test] + public void Normalize_ReturnsDeterministicRendererNeutralString() + { + Assert.That(FontFeatureSettings.Normalize(" smcp = 1, kern=0 "), Is.EqualTo("kern=0,smcp=1")); + } + } +} \ No newline at end of file diff --git a/Src/Common/RenderVerification/RenderComparisonTests/HarfBuzzSkiaComparisonTests.cs b/Src/Common/RenderVerification/RenderComparisonTests/HarfBuzzSkiaComparisonTests.cs new file mode 100644 index 0000000000..38d9416f55 --- /dev/null +++ b/Src/Common/RenderVerification/RenderComparisonTests/HarfBuzzSkiaComparisonTests.cs @@ -0,0 +1,103 @@ +using System.Linq; +using System.Runtime.InteropServices; +using HarfBuzzSharp; +using NUnit.Framework; +using SkiaSharp; +using SkiaSharp.HarfBuzz; + +namespace SIL.FieldWorks.Common.RenderVerification.RenderComparisonTests +{ + [TestFixture] + public class HarfBuzzSkiaComparisonTests + { + [Test] + public void ShapeText_OpenTypeFeatureToggleChangesShapingData() + { + using (var typeface = SKTypeface.FromFamilyName("Times New Roman")) + { + if (typeface == null) + Assert.Inconclusive("Times New Roman is not installed on this machine."); + + var disabled = ShapeText(typeface, "office affinity AVATAR", "-liga"); + var enabled = ShapeText(typeface, "office affinity AVATAR", "+liga"); + + if (disabled.SequenceEqual(enabled)) + Assert.Inconclusive("Times New Roman did not expose a deterministic liga shaping delta through HarfBuzzSharp."); + } + } + + [Test] + public void DrawShapedText_ProducesNonBlankComparisonBitmap() + { + using (var typeface = SKTypeface.FromFamilyName("Times New Roman")) + { + if (typeface == null) + Assert.Inconclusive("Times New Roman is not installed on this machine."); + + using (var bitmap = new SKBitmap(360, 90)) + using (var canvas = new SKCanvas(bitmap)) + using (var paint = new SKPaint { Typeface = typeface, TextSize = 40, IsAntialias = true, Color = SKColors.Black }) + using (var shaper = new SKShaper(typeface)) + using (var buffer = new Buffer()) + { + canvas.Clear(SKColors.White); + buffer.AddUtf8("office affinity AVATAR"); + buffer.GuessSegmentProperties(); + var shaped = shaper.Shape(buffer, paint); + Assert.That(shaped.Codepoints, Is.Not.Empty); + + canvas.DrawShapedText(shaper, "office affinity AVATAR", 12, 58, paint); + Assert.That(CountNonWhitePixels(bitmap), Is.GreaterThan(0)); + } + } + } + + private static int CountNonWhitePixels(SKBitmap bitmap) + { + return Enumerable.Range(0, bitmap.Height) + .Sum(y => Enumerable.Range(0, bitmap.Width) + .Count(x => bitmap.GetPixel(x, y) != SKColors.White)); + } + + private static uint[] ShapeText(SKTypeface typeface, string text, string feature) + { + var fontData = ReadTypefaceData(typeface); + var fontDataHandle = GCHandle.Alloc(fontData, GCHandleType.Pinned); + try + { + using (var blob = new Blob(fontDataHandle.AddrOfPinnedObject(), fontData.Length, MemoryMode.Duplicate)) + using (var face = new Face(blob, 0)) + using (var font = new HarfBuzzSharp.Font(face)) + using (var buffer = new Buffer()) + { + font.SetScale(40 * 64, 40 * 64); + buffer.AddUtf8(text); + buffer.GuessSegmentProperties(); + font.Shape(buffer, new[] { Feature.Parse(feature) }); + return buffer.GlyphInfos.Select(info => info.Codepoint).ToArray(); + } + } + finally + { + fontDataHandle.Free(); + } + } + + private static byte[] ReadTypefaceData(SKTypeface typeface) + { + int faceIndex; + using (var stream = typeface.OpenStream(out faceIndex)) + { + if (stream == null || !stream.HasLength) + Assert.Inconclusive("The selected typeface does not expose readable font data."); + + var data = new byte[checked((int)stream.Length)]; + var read = stream.Read(data, data.Length); + if (read != data.Length) + Assert.Inconclusive("The selected typeface could not be read completely."); + + return data; + } + } + } +} \ No newline at end of file diff --git a/Src/Common/RenderVerification/RenderComparisonTests/RenderComparisonTests.csproj b/Src/Common/RenderVerification/RenderComparisonTests/RenderComparisonTests.csproj new file mode 100644 index 0000000000..9868362c17 --- /dev/null +++ b/Src/Common/RenderVerification/RenderComparisonTests/RenderComparisonTests.csproj @@ -0,0 +1,44 @@ + + + RenderComparisonTests + SIL.FieldWorks.Common.RenderVerification.RenderComparisonTests + net48 + Library + true + false + true + false + + + DEBUG;TRACE + true + false + portable + + + TRACE + true + true + portable + + + + + + + + + + + + + + + + + + + Properties\CommonAssemblyInfo.cs + + + \ No newline at end of file diff --git a/Src/Common/SimpleRootSite/RenderEngineFactory.cs b/Src/Common/SimpleRootSite/RenderEngineFactory.cs index e473f0e09d..b88fc7e8b3 100644 --- a/Src/Common/SimpleRootSite/RenderEngineFactory.cs +++ b/Src/Common/SimpleRootSite/RenderEngineFactory.cs @@ -20,14 +20,14 @@ namespace SIL.FieldWorks.Common.RootSites /// public class RenderEngineFactory : DisposableBase, IRenderEngineFactory { - private readonly Dictionary, Tuple>> m_fontEngines; + private readonly Dictionary, Tuple>> m_fontEngines; /// /// Initializes a new instance of the class. /// public RenderEngineFactory() { - m_fontEngines = new Dictionary, Tuple>>(); + m_fontEngines = new Dictionary, Tuple>>(); } /// @@ -46,20 +46,26 @@ public IRenderEngine get_Renderer(ILgWritingSystem ws, IVwGraphics vg) MarshalEx.StringToUShort(fontName, chrp.szFaceName); vg.SetupGraphics(ref chrp); } - Dictionary, Tuple> wsFontEngines; + Dictionary, Tuple> wsFontEngines; if (!m_fontEngines.TryGetValue(ws, out wsFontEngines)) { - wsFontEngines = new Dictionary, Tuple>(); + wsFontEngines = new Dictionary, Tuple>(); m_fontEngines[ws] = wsFontEngines; } + string fontFeatures = GetFontFeatures(fontName, chrp, ws); + if (chrp.szFontVar != null) + { + MarshalEx.StringToUShort(fontFeatures ?? string.Empty, chrp.szFontVar); + vg.SetupGraphics(ref chrp); + } var key = Tuple.Create(fontName, chrp.ttvBold == (int)FwTextToggleVal.kttvForceOn, - chrp.ttvItalic == (int)FwTextToggleVal.kttvForceOn); + chrp.ttvItalic == (int)FwTextToggleVal.kttvForceOn, fontFeatures); Tuple fontEngine; if (!wsFontEngines.TryGetValue(key, out fontEngine)) { // We don't have a font engine stored for this combination of font face with bold and italic // so we will create the engine for it here - wsFontEngines[key] = GetRenderingEngine(fontName, vg, ws); + wsFontEngines[key] = GetRenderingEngine(fontName, fontFeatures, vg, ws); } else if (fontEngine.Item1 == ws.IsGraphiteEnabled) { @@ -72,24 +78,28 @@ public IRenderEngine get_Renderer(ILgWritingSystem ws, IVwGraphics vg) // Destroy all the engines associated with this ws and create one for this key. ReleaseRenderEngines(wsFontEngines.Values); wsFontEngines.Clear(); - var renderingEngine = GetRenderingEngine(fontName, vg, ws); + var renderingEngine = GetRenderingEngine(fontName, fontFeatures, vg, ws); wsFontEngines[key] = renderingEngine; } return wsFontEngines[key].Item2; } - private Tuple GetRenderingEngine(string fontName, IVwGraphics vg, ILgWritingSystem ws) + private static string GetFontFeatures(string fontName, LgCharRenderProps chrp, ILgWritingSystem ws) + { + if (fontName == ws.DefaultFontName) + return FontFeatureSettings.Normalize(ws.DefaultFontFeatures); + return chrp.szFontVar == null ? string.Empty : FontFeatureSettings.Normalize(MarshalEx.UShortToString(chrp.szFontVar)); + } + + private Tuple GetRenderingEngine(string fontName, string fontFeatures, IVwGraphics vg, ILgWritingSystem ws) { // NB: Even if the ws claims graphite is enabled, this might not be a graphite font if (ws.IsGraphiteEnabled) { var graphiteEngine = GraphiteEngineClass.Create(); - string fontFeatures = null; - if (fontName == ws.DefaultFontName) - fontFeatures = GraphiteFontFeatures.ConvertFontFeatureCodesToIds(ws.DefaultFontFeatures); - graphiteEngine.InitRenderer(vg, fontFeatures); + graphiteEngine.InitRenderer(vg, GraphiteFontFeatures.ConvertFontFeatureCodesToIds(fontFeatures)); // check if the font is a valid Graphite font if (graphiteEngine.FontIsValid) { @@ -100,14 +110,14 @@ private Tuple GetRenderingEngine(string fontName, IVwGraphi // It wasn't really a graphite font - release the graphite one and create a Uniscribe below Marshal.ReleaseComObject(graphiteEngine); } - return new Tuple(ws.IsGraphiteEnabled, GetUniscribeEngine(vg, ws)); + return new Tuple(ws.IsGraphiteEnabled, GetUniscribeEngine(vg, ws, fontFeatures)); } - private IRenderEngine GetUniscribeEngine(IVwGraphics vg, ILgWritingSystem ws) + private IRenderEngine GetUniscribeEngine(IVwGraphics vg, ILgWritingSystem ws, string fontFeatures) { IRenderEngine uniscribeEngine; uniscribeEngine = UniscribeEngineClass.Create(); - uniscribeEngine.InitRenderer(vg, null); + uniscribeEngine.InitRenderer(vg, fontFeatures); uniscribeEngine.RenderEngineFactory = this; uniscribeEngine.WritingSystemFactory = ws.WritingSystemFactory; @@ -119,7 +129,7 @@ private IRenderEngine GetUniscribeEngine(IVwGraphics vg, ILgWritingSystem ws) /// public void ClearRenderEngines() { - foreach (Dictionary, Tuple> wsGraphiteEngines in m_fontEngines.Values) + foreach (Dictionary, Tuple> wsGraphiteEngines in m_fontEngines.Values) ReleaseRenderEngines(wsGraphiteEngines.Values); m_fontEngines.Clear(); } @@ -129,7 +139,7 @@ public void ClearRenderEngines() /// public void ClearRenderEngines(ILgWritingSystemFactory wsf) { - foreach (KeyValuePair, Tuple>> kvp in m_fontEngines + foreach (KeyValuePair, Tuple>> kvp in m_fontEngines .Where(kvp => kvp.Key.WritingSystemFactory == wsf).ToArray()) { ReleaseRenderEngines(kvp.Value.Values); diff --git a/Src/Common/SimpleRootSite/SimpleRootSiteTests/RenderEngineFactoryTests.cs b/Src/Common/SimpleRootSite/SimpleRootSiteTests/RenderEngineFactoryTests.cs index 817f106190..92b59493d0 100644 --- a/Src/Common/SimpleRootSite/SimpleRootSiteTests/RenderEngineFactoryTests.cs +++ b/Src/Common/SimpleRootSite/SimpleRootSiteTests/RenderEngineFactoryTests.cs @@ -4,11 +4,12 @@ using System.Windows.Forms; using NUnit.Framework; -using SIL.LCModel.Core.WritingSystems; -using SIL.LCModel.Core.KernelInterfaces; using SIL.FieldWorks.Common.FwUtils; using SIL.FieldWorks.Common.ViewsInterfaces; +using SIL.LCModel.Core.KernelInterfaces; +using SIL.LCModel.Core.WritingSystems; using SIL.LCModel.Utils; +using SIL.WritingSystems; namespace SIL.FieldWorks.Common.RootSites.SimpleRootSiteTests { @@ -33,7 +34,11 @@ public void get_Renderer_Uniscribe() { var wsManager = new WritingSystemManager(); CoreWritingSystemDefinition ws = wsManager.Set("en-US"); - var chrp = new LgCharRenderProps { ws = ws.Handle, szFaceName = new ushort[32] }; + var chrp = new LgCharRenderProps + { + ws = ws.Handle, + szFaceName = new ushort[32], + }; MarshalEx.StringToUShort("Arial", chrp.szFaceName); gm.VwGraphics.SetupGraphics(ref chrp); IRenderEngine engine = reFactory.get_Renderer(ws, gm.VwGraphics); @@ -65,7 +70,11 @@ public void get_Renderer_Graphite() var wsManager = new WritingSystemManager(); // by default Graphite is disabled CoreWritingSystemDefinition ws = wsManager.Set("en-US"); - var chrp = new LgCharRenderProps { ws = ws.Handle, szFaceName = new ushort[32] }; + var chrp = new LgCharRenderProps + { + ws = ws.Handle, + szFaceName = new ushort[32], + }; MarshalEx.StringToUShort("Charis SIL", chrp.szFaceName); gm.VwGraphics.SetupGraphics(ref chrp); IRenderEngine engine = reFactory.get_Renderer(ws, gm.VwGraphics); @@ -87,5 +96,105 @@ public void get_Renderer_Graphite() } } } + + [Test] + public void get_Renderer_DefaultFontFeatures_CopiesNormalizedFeaturesToGraphics() + { + using (var control = new Form()) + using (var gm = new GraphicsManager(control)) + using (var reFactory = new RenderEngineFactory()) + { + gm.Init(1.0f); + try + { + var wsManager = new WritingSystemManager(); + CoreWritingSystemDefinition ws = wsManager.Set("en-US"); + ws.DefaultFont = new FontDefinition("Arial") { Features = " smcp = 1, kern=0 " }; + + var chrp = CreateCharRenderProps(ws.Handle, "", string.Empty); + gm.VwGraphics.SetupGraphics(ref chrp); + + IRenderEngine engine = reFactory.get_Renderer(ws, gm.VwGraphics); + var graphicsChrp = gm.VwGraphics.FontCharProperties; + + Assert.That(engine, Is.InstanceOf(typeof(UniscribeEngine))); + Assert.That( + MarshalEx.UShortToString(graphicsChrp.szFaceName), + Is.EqualTo("Arial")); + Assert.That( + MarshalEx.UShortToString(graphicsChrp.szFontVar), + Is.EqualTo("kern=0,smcp=1")); + wsManager.Save(); + } + finally + { + gm.Uninit(); + } + } + } + + [Test] + public void get_Renderer_OpenTypeFeatures_ArePartOfCacheIdentity() + { + using (var control = new Form()) + using (var gm = new GraphicsManager(control)) + using (var reFactory = new RenderEngineFactory()) + { + gm.Init(1.0f); + try + { + var wsManager = new WritingSystemManager(); + CoreWritingSystemDefinition ws = wsManager.Set("en-US"); + + var firstChrp = CreateCharRenderProps( + ws.Handle, + "Arial", + " smcp = 1, kern=0 "); + gm.VwGraphics.SetupGraphics(ref firstChrp); + IRenderEngine first = reFactory.get_Renderer(ws, gm.VwGraphics); + + var equivalentChrp = CreateCharRenderProps( + ws.Handle, + "Arial", + "kern=0,smcp=1"); + gm.VwGraphics.SetupGraphics(ref equivalentChrp); + IRenderEngine equivalent = reFactory.get_Renderer(ws, gm.VwGraphics); + + var differentChrp = CreateCharRenderProps( + ws.Handle, + "Arial", + "smcp=0,kern=0"); + gm.VwGraphics.SetupGraphics(ref differentChrp); + IRenderEngine different = reFactory.get_Renderer(ws, gm.VwGraphics); + + Assert.That(equivalent, Is.SameAs(first)); + Assert.That(different, Is.Not.SameAs(first)); + Assert.That( + MarshalEx.UShortToString(gm.VwGraphics.FontCharProperties.szFontVar), + Is.EqualTo("kern=0,smcp=0")); + wsManager.Save(); + } + finally + { + gm.Uninit(); + } + } + } + + private static LgCharRenderProps CreateCharRenderProps( + int ws, + string fontName, + string fontFeatures) + { + var chrp = new LgCharRenderProps + { + ws = ws, + szFaceName = new ushort[32], + szFontVar = new ushort[128], + }; + MarshalEx.StringToUShort(fontName, chrp.szFaceName); + MarshalEx.StringToUShort(fontFeatures, chrp.szFontVar); + return chrp; + } } } diff --git a/Src/FwCoreDlgs/FwCoreDlgControls/DefaultFontsControl.cs b/Src/FwCoreDlgs/FwCoreDlgControls/DefaultFontsControl.cs index 239bb66017..5c1c578884 100644 --- a/Src/FwCoreDlgs/FwCoreDlgControls/DefaultFontsControl.cs +++ b/Src/FwCoreDlgs/FwCoreDlgControls/DefaultFontsControl.cs @@ -242,16 +242,17 @@ protected void SetSelectedFonts() // setup controls for default font SetFontInCombo(m_defaultFontComboBox, m_ws.DefaultFontName); m_defaultFontFeaturesButton.WritingSystemFactory = m_ws.WritingSystemFactory; - m_defaultFontFeaturesButton.FontName = m_defaultFontComboBox.Text; m_defaultFontFeaturesButton.FontFeatures = m_ws.DefaultFontFeatures; + m_defaultFontFeaturesButton.UseGraphiteFeatures = m_ws.IsGraphiteEnabled; + m_defaultFontFeaturesButton.FontName = m_defaultFontComboBox.Text; + m_defaultFontFeaturesButton.SetupFontFeatures(); bool isGraphiteFont = m_defaultFontFeaturesButton.IsGraphiteFont; - m_graphiteGroupBox.Enabled = isGraphiteFont; + m_graphiteGroupBox.Enabled = isGraphiteFont || m_defaultFontFeaturesButton.HasFontFeatures; + m_enableGraphiteCheckBox.Enabled = isGraphiteFont; if (!isGraphiteFont) m_ws.IsGraphiteEnabled = false; m_enableGraphiteCheckBox.Checked = m_ws.IsGraphiteEnabled; - if (!m_ws.IsGraphiteEnabled) - m_defaultFontFeaturesButton.Enabled = false; } /// @@ -303,15 +304,17 @@ private void m_defaultFontComboBox_SelectedIndexChanged(object sender, EventArgs if (m_ws.DefaultFont != null) { - m_defaultFontFeaturesButton.FontName = m_defaultFontComboBox.Text; m_defaultFontFeaturesButton.FontFeatures = m_ws.DefaultFont.Features; + m_defaultFontFeaturesButton.UseGraphiteFeatures = false; + m_defaultFontFeaturesButton.FontName = m_defaultFontComboBox.Text; + m_defaultFontFeaturesButton.SetupFontFeatures(); } bool isGraphiteFont = m_defaultFontFeaturesButton.IsGraphiteFont; - m_graphiteGroupBox.Enabled = isGraphiteFont; + m_graphiteGroupBox.Enabled = isGraphiteFont || m_defaultFontFeaturesButton.HasFontFeatures; + m_enableGraphiteCheckBox.Enabled = isGraphiteFont; m_ws.IsGraphiteEnabled = false; m_enableGraphiteCheckBox.Checked = false; - m_defaultFontFeaturesButton.Enabled = false; } } @@ -334,10 +337,8 @@ private void m_enableGraphiteCheckBox_Click(object sender, EventArgs e) if (m_ws == null) return; m_ws.IsGraphiteEnabled = m_enableGraphiteCheckBox.Checked; - if (m_ws.IsGraphiteEnabled) - m_defaultFontFeaturesButton.SetupFontFeatures(); - else - m_defaultFontFeaturesButton.Enabled = false; + m_defaultFontFeaturesButton.UseGraphiteFeatures = m_ws.IsGraphiteEnabled; + m_defaultFontFeaturesButton.SetupFontFeatures(); } #endregion diff --git a/Src/FwCoreDlgs/FwCoreDlgControls/DefaultFontsControl.resx b/Src/FwCoreDlgs/FwCoreDlgControls/DefaultFontsControl.resx index 663352e6ce..c75f535fb8 100644 --- a/Src/FwCoreDlgs/FwCoreDlgControls/DefaultFontsControl.resx +++ b/Src/FwCoreDlgs/FwCoreDlgControls/DefaultFontsControl.resx @@ -193,7 +193,7 @@ False - Allows user to specify font features, when available in Graphite fonts. + Allows user to specify font features when available in the selected font. @@ -275,7 +275,7 @@ 4 - Graphite Font Options + Font Options m_graphiteGroupBox diff --git a/Src/FwCoreDlgs/FwCoreDlgControls/FontFeaturesButton.cs b/Src/FwCoreDlgs/FwCoreDlgControls/FontFeaturesButton.cs index 15a3b31625..f758be46ea 100644 --- a/Src/FwCoreDlgs/FwCoreDlgControls/FontFeaturesButton.cs +++ b/Src/FwCoreDlgs/FwCoreDlgControls/FontFeaturesButton.cs @@ -3,9 +3,11 @@ // (http://www.gnu.org/licenses/lgpl-2.1.html) using System; +using System.Collections.Generic; using System.Diagnostics; using System.Drawing; using System.Linq; +using System.Runtime.InteropServices; using System.Windows.Forms; using SIL.LCModel.Core.KernelInterfaces; using SIL.FieldWorks.Common.FwUtils; @@ -36,11 +38,13 @@ public class FontFeaturesButton : Button private System.ComponentModel.IContainer components = null; private string m_fontName; // The font for which we are editing the features. private string m_fontFeatures; // The font feature string stored in the writing system. - private IRenderingFeatures m_featureEngine; + private IFontFeatureProvider m_featureProvider; private ILgWritingSystemFactory m_wsf; private int[] m_values; // The actual list of values we're editing. private int[] m_ids; // The corresponding ids. private bool m_isGraphiteFont; + private bool m_hasFontFeatures; + private bool m_useGraphiteFeatures = true; #endregion #region Constructor and dispose stuff @@ -110,6 +114,11 @@ private class HoldDummyGraphics: IDisposable /// private IntPtr m_hdc; + public IntPtr Hdc + { + get { return m_hdc; } + } + /// -------------------------------------------------------------------------------- /// /// Initializes a new instance of the class. @@ -279,7 +288,40 @@ public string FontFeatures set { CheckDisposed(); - m_fontFeatures = value; + m_fontFeatures = FontFeatureSettings.Normalize(value); + } + } + + /// + /// Gets or sets a value indicating whether Graphite feature discovery should be preferred + /// when the current font supports both Graphite and OpenType features. + /// + public bool UseGraphiteFeatures + { + get + { + CheckDisposed(); + return m_useGraphiteFeatures; + } + set + { + CheckDisposed(); + if (m_useGraphiteFeatures == value) + return; + m_useGraphiteFeatures = value; + SetupFontFeatures(); + } + } + + /// + /// Gets a value indicating whether the current font has configurable features. + /// + public bool HasFontFeatures + { + get + { + CheckDisposed(); + return m_hasFontFeatures; } } @@ -307,6 +349,8 @@ public bool IsGraphiteFont public void SetupFontFeatures() { CheckDisposed(); + m_featureProvider = null; + m_hasFontFeatures = false; if (string.IsNullOrEmpty(m_fontName)) { @@ -317,49 +361,42 @@ public void SetupFontFeatures() using (var hdg = new HoldDummyGraphics(m_fontName, false, false, this)) { - IRenderEngine renderer = GraphiteEngineClass.Create(); - renderer.InitRenderer(hdg.m_vwGraphics, m_fontFeatures); - // check if the font is a valid Graphite font - if (!renderer.FontIsValid) - { - m_isGraphiteFont = false; - Enabled = false; - return; - } - renderer.WritingSystemFactory = m_wsf; - m_isGraphiteFont = true; - m_featureEngine = renderer as IRenderingFeatures; - if (m_featureEngine == null) + var graphiteProvider = CreateGraphiteProvider(hdg); + m_isGraphiteFont = graphiteProvider != null; + + if (m_useGraphiteFeatures && graphiteProvider != null && graphiteProvider.HasFeatures) { - Enabled = false; + m_featureProvider = graphiteProvider; + m_hasFontFeatures = true; + Enabled = true; return; } - int cfid; - m_featureEngine.GetFeatureIDs(0, null, out cfid); - if (cfid == 0) + + var openTypeProvider = OpenTypeFontFeatureProvider.Create(hdg.Hdc); + if (openTypeProvider != null && openTypeProvider.HasFeatures) { - Enabled = false; + m_featureProvider = openTypeProvider; + m_hasFontFeatures = true; + Enabled = true; return; } - if (cfid == 1) - { - // What if it's the dummy built-in graphite feature that we ignore? - // Get the list of features (only 1). - using (ArrayPtr idsM = MarshalEx.ArrayToNative(cfid)) - { - m_featureEngine.GetFeatureIDs(cfid, idsM, out cfid); - int [] ids = MarshalEx.NativeToArray(idsM, cfid); - if (ids[0] == kGrLangFeature) - { - Enabled = false; - return; - } - } - } - Enabled = true; + + Enabled = false; } } + private IFontFeatureProvider CreateGraphiteProvider(HoldDummyGraphics hdg) + { + IRenderEngine renderer = GraphiteEngineClass.Create(); + renderer.InitRenderer(hdg.m_vwGraphics, GraphiteFontFeatures.ConvertFontFeatureCodesToIds(m_fontFeatures)); + if (!renderer.FontIsValid) + return null; + + renderer.WritingSystemFactory = m_wsf; + var featureEngine = renderer as IRenderingFeatures; + return featureEngine == null ? null : new GraphiteFontFeatureProvider(featureEngine); + } + /// ------------------------------------------------------------------------------------ /// /// Parse a feature string to find the next feature id value, skipping any leading @@ -645,18 +682,13 @@ internal int FeatureIndex /// ------------------------------------------------------------------------------------ protected override void OnClick(EventArgs e) { - var menu = components.ContextMenu("ContextMenu"); - int cfid; - m_featureEngine.GetFeatureIDs(0, null, out cfid); + if (m_featureProvider == null) + return; - // Get the list of features. - using (ArrayPtr idsM = MarshalEx.ArrayToNative(cfid)) - { - m_featureEngine.GetFeatureIDs(cfid, idsM, out cfid); - m_ids = MarshalEx.NativeToArray(idsM, cfid); - } - m_fontFeatures = GraphiteFontFeatures.ConvertFontFeatureCodesToIds(m_fontFeatures); - m_values = ParseFeatureString(m_ids, m_fontFeatures); + var menu = components.ContextMenu("ContextMenu"); + m_ids = m_featureProvider.GetFeatureIds(); + var parserFeatureString = GraphiteFontFeatures.ConvertFontFeatureCodesToIds(m_fontFeatures); + m_values = ParseFeatureString(m_ids, parserFeatureString); Debug.Assert(m_ids.Length == m_values.Length); for (int ifeat = 0; ifeat < m_ids.Length; ++ifeat) @@ -665,21 +697,16 @@ protected override void OnClick(EventArgs e) if (id == kGrLangFeature) continue; // Don't show Graphite built-in 'lang' feature. string label; - m_featureEngine.GetFeatureLabel(id, kUiCodePage, out label); + label = m_featureProvider.GetFeatureLabel(id, kUiCodePage); if (label.Length == 0) { //Create backup default string, ie, "Feature #1". - label = string.Format(FwCoreDlgControls.kstidFeature, id); + label = string.Format(FwCoreDlgControls.kstidFeature, m_featureProvider.GetFeatureTag(id)); } int cValueIds; int nDefault; int [] valueIds; - using (ArrayPtr valueIdsM = MarshalEx.ArrayToNative(kMaxValPerFeat)) - { - m_featureEngine.GetFeatureValues(id, kMaxValPerFeat, valueIdsM, - out cValueIds, out nDefault); - valueIds = MarshalEx.NativeToArray(valueIdsM, cValueIds); - } + valueIds = m_featureProvider.GetFeatureValues(id, kMaxValPerFeat, out cValueIds, out nDefault); // If we know a value for this feature, use it. Otherwise init to default. int featureValue = nDefault; if (m_values[ifeat] != Int32.MaxValue) @@ -695,9 +722,9 @@ protected override void OnClick(EventArgs e) // ids of 0 and 1. We further require that the actual values belong to a // natural boolean set. string valueLabelT; // Label corresponding to 'true' etc, the checked value - m_featureEngine.GetFeatureValueLabel(id, 1, kUiCodePage, out valueLabelT); + valueLabelT = m_featureProvider.GetFeatureValueLabel(id, 1, kUiCodePage); string valueLabelF; // Label corresponding to 'false' etc, the unchecked val. - m_featureEngine.GetFeatureValueLabel(id, 0, kUiCodePage, out valueLabelF); + valueLabelF = m_featureProvider.GetFeatureValueLabel(id, 0, kUiCodePage); // Enhance: these should be based on a resource, or something that depends // on the code page, if the code page is ever not constant. @@ -733,8 +760,7 @@ protected override void OnClick(EventArgs e) for (int ival = 0; ival < valueIds.Length; ++ival) { string valueLabel; - m_featureEngine.GetFeatureValueLabel(id, valueIds[ival], - kUiCodePage, out valueLabel); + valueLabel = m_featureProvider.GetFeatureValueLabel(id, valueIds[ival], kUiCodePage); if (valueLabel.Length == 0) { // Create backup default string. @@ -805,5 +831,224 @@ private void ItemClickHandler(Object sender, EventArgs e) m_fontFeatures = GenerateFeatureString(m_ids, m_values); OnFontFeatureSelected(new EventArgs()); } + + private interface IFontFeatureProvider + { + bool HasFeatures { get; } + int[] GetFeatureIds(); + string GetFeatureTag(int featureId); + string GetFeatureLabel(int featureId, int languageId); + int[] GetFeatureValues(int featureId, int maxValues, out int valueCount, out int defaultValue); + string GetFeatureValueLabel(int featureId, int valueId, int languageId); + } + + private sealed class GraphiteFontFeatureProvider : IFontFeatureProvider + { + private readonly IRenderingFeatures m_featureEngine; + private readonly int[] m_featureIds; + + public GraphiteFontFeatureProvider(IRenderingFeatures featureEngine) + { + m_featureEngine = featureEngine; + int featureCount; + m_featureEngine.GetFeatureIDs(0, null, out featureCount); + if (featureCount == 0) + { + m_featureIds = Array.Empty(); + return; + } + using (ArrayPtr idsM = MarshalEx.ArrayToNative(featureCount)) + { + m_featureEngine.GetFeatureIDs(featureCount, idsM, out featureCount); + m_featureIds = MarshalEx.NativeToArray(idsM, featureCount) + .Where(featureId => featureId != kGrLangFeature).ToArray(); + } + } + + public bool HasFeatures + { + get { return m_featureIds.Length > 0; } + } + + public int[] GetFeatureIds() + { + return m_featureIds.ToArray(); + } + + public string GetFeatureTag(int featureId) + { + return ConvertFontFeatureIdToCode(featureId); + } + + public string GetFeatureLabel(int featureId, int languageId) + { + string label; + m_featureEngine.GetFeatureLabel(featureId, languageId, out label); + return label; + } + + public int[] GetFeatureValues(int featureId, int maxValues, out int valueCount, out int defaultValue) + { + using (ArrayPtr valueIdsM = MarshalEx.ArrayToNative(maxValues)) + { + m_featureEngine.GetFeatureValues(featureId, maxValues, valueIdsM, out valueCount, out defaultValue); + return MarshalEx.NativeToArray(valueIdsM, valueCount); + } + } + + public string GetFeatureValueLabel(int featureId, int valueId, int languageId) + { + string label; + m_featureEngine.GetFeatureValueLabel(featureId, valueId, languageId, out label); + return label; + } + } + + private sealed class OpenTypeFontFeatureProvider : IFontFeatureProvider + { + private static readonly Dictionary s_featureLabels = new Dictionary + { + { "aalt", "Access All Alternates" }, + { "c2sc", "Small Capitals From Capitals" }, + { "calt", "Contextual Alternates" }, + { "case", "Case-Sensitive Forms" }, + { "ccmp", "Glyph Composition/Decomposition" }, + { "clig", "Contextual Ligatures" }, + { "dlig", "Discretionary Ligatures" }, + { "frac", "Fractions" }, + { "kern", "Kerning" }, + { "liga", "Standard Ligatures" }, + { "lnum", "Lining Figures" }, + { "onum", "Oldstyle Figures" }, + { "pnum", "Proportional Figures" }, + { "salt", "Stylistic Alternates" }, + { "smcp", "Small Capitals" }, + { "ss01", "Stylistic Set 1" }, + { "ss02", "Stylistic Set 2" }, + { "ss03", "Stylistic Set 3" }, + { "ss04", "Stylistic Set 4" }, + { "ss05", "Stylistic Set 5" }, + { "tnum", "Tabular Figures" }, + }; + + private readonly int[] m_featureIds; + + private OpenTypeFontFeatureProvider(IEnumerable tags) + { + m_featureIds = tags.Select(ConvertFontFeatureCodeToId).Distinct().OrderBy(featureId => GetFeatureTag(featureId), StringComparer.Ordinal).ToArray(); + } + + public static OpenTypeFontFeatureProvider Create(IntPtr hdc) + { + var tags = OpenTypeFontFeatureReader.GetFeatureTags(hdc); + return tags.Count == 0 ? null : new OpenTypeFontFeatureProvider(tags); + } + + public bool HasFeatures + { + get { return m_featureIds.Length > 0; } + } + + public int[] GetFeatureIds() + { + return m_featureIds.ToArray(); + } + + public string GetFeatureTag(int featureId) + { + return ConvertFontFeatureIdToCode(featureId); + } + + public string GetFeatureLabel(int featureId, int languageId) + { + var tag = GetFeatureTag(featureId); + string label; + return s_featureLabels.TryGetValue(tag, out label) ? label : tag; + } + + public int[] GetFeatureValues(int featureId, int maxValues, out int valueCount, out int defaultValue) + { + defaultValue = 0; + valueCount = 2; + return new[] { 0, 1 }; + } + + public string GetFeatureValueLabel(int featureId, int valueId, int languageId) + { + return valueId == 0 ? "Off" : "On"; + } + } + + private static int ConvertFontFeatureCodeToId(string fontFeature) + { + fontFeature = new string(fontFeature.ToCharArray().Reverse().ToArray()); + byte[] numbers = fontFeature.Select(Convert.ToByte).ToArray(); + return BitConverter.ToInt32(numbers, 0); + } + + private static class OpenTypeFontFeatureReader + { + private const uint GdiError = 0xFFFFFFFF; + private static readonly uint[] s_layoutTables = { MakeTableTag("GSUB"), MakeTableTag("GPOS") }; + + [DllImport("gdi32.dll", SetLastError = true)] + private static extern uint GetFontData(IntPtr hdc, uint table, uint offset, byte[] buffer, uint length); + + public static IReadOnlyList GetFeatureTags(IntPtr hdc) + { + var tags = new SortedSet(StringComparer.Ordinal); + foreach (var table in s_layoutTables) + { + var tableData = ReadTable(hdc, table); + if (tableData != null) + ReadFeatureList(tableData, tags); + } + return tags.ToArray(); + } + + private static byte[] ReadTable(IntPtr hdc, uint table) + { + var size = GetFontData(hdc, table, 0, null, 0); + if (size == GdiError || size == 0) + return null; + + var data = new byte[size]; + var bytesRead = GetFontData(hdc, table, 0, data, size); + return bytesRead == GdiError ? null : data; + } + + private static void ReadFeatureList(byte[] tableData, ISet tags) + { + if (tableData.Length < 8) + return; + + var featureListOffset = ReadUInt16(tableData, 6); + if (featureListOffset <= 0 || featureListOffset + 2 > tableData.Length) + return; + + var featureCount = ReadUInt16(tableData, featureListOffset); + var featureRecordOffset = featureListOffset + 2; + for (var featureIndex = 0; featureIndex < featureCount; featureIndex++) + { + var recordOffset = featureRecordOffset + featureIndex * 6; + if (recordOffset + 6 > tableData.Length) + return; + + var tag = System.Text.Encoding.ASCII.GetString(tableData, recordOffset, 4); + if (FontFeatureSettings.IsValidOpenTypeTag(tag)) + tags.Add(tag); + } + } + + private static ushort ReadUInt16(byte[] data, int offset) + { + return (ushort)((data[offset] << 8) | data[offset + 1]); + } + + private static uint MakeTableTag(string tag) + { + return (uint)(tag[0] | tag[1] << 8 | tag[2] << 16 | tag[3] << 24); + } + } } } diff --git a/Src/FwCoreDlgs/FwCoreDlgControls/FwCoreDlgControlsTests/FwAttributesTests.cs b/Src/FwCoreDlgs/FwCoreDlgControls/FwCoreDlgControlsTests/FwAttributesTests.cs index 3c0d970386..e50186189a 100644 --- a/Src/FwCoreDlgs/FwCoreDlgControls/FwCoreDlgControlsTests/FwAttributesTests.cs +++ b/Src/FwCoreDlgs/FwCoreDlgControls/FwCoreDlgControlsTests/FwAttributesTests.cs @@ -6,6 +6,9 @@ using System.Windows.Forms; using NUnit.Framework; using SIL.FieldWorks.Common.Controls; +using SIL.FieldWorks.Common.FwUtils; +using SIL.LCModel.Core.KernelInterfaces; +using SIL.LCModel.DomainServices; using SIL.LCModel.Utils; namespace SIL.FieldWorks.FwCoreDlgControls @@ -13,6 +16,36 @@ namespace SIL.FieldWorks.FwCoreDlgControls [TestFixture] public class FwAttributesTest { + [Test] + public void UpdateForStyle_OpenTypeFeatures_RoundTripsNormalizedTags() + { + var fontInfo = CreateExplicitFontInfo(" smcp = 1, kern=0 "); + using (var t = new FwFontAttributes()) + { + t.UpdateForStyle(fontInfo); + + bool isInherited; + Assert.That(t.GetFontFeatures(out isInherited), Is.EqualTo("kern=0,smcp=1")); + Assert.That(isInherited, Is.False); + } + } + + private static FontInfo CreateExplicitFontInfo(string features) + { + return new FontInfo + { + m_bold = { ExplicitValue = false }, + m_italic = { ExplicitValue = false }, + m_superSub = { ExplicitValue = FwSuperscriptVal.kssvOff }, + m_offset = { ExplicitValue = 0 }, + m_fontColor = { ExplicitValue = Color.Black }, + m_backColor = { ExplicitValue = Color.Empty }, + m_underline = { ExplicitValue = FwUnderlineType.kuntNone }, + m_underlineColor = { ExplicitValue = Color.Empty }, + m_features = { ExplicitValue = features } + }; + } + [Test] public void IsInherited_CheckBoxUnchecked_ReturnsFalse() { diff --git a/Src/FwCoreDlgs/FwCoreDlgControls/FwCoreDlgControlsTests/FwFontTabTests.cs b/Src/FwCoreDlgs/FwCoreDlgControls/FwCoreDlgControlsTests/FwFontTabTests.cs index 6cddebc5de..c167164268 100644 --- a/Src/FwCoreDlgs/FwCoreDlgControls/FwCoreDlgControlsTests/FwFontTabTests.cs +++ b/Src/FwCoreDlgs/FwCoreDlgControls/FwCoreDlgControlsTests/FwFontTabTests.cs @@ -5,6 +5,7 @@ using NUnit.Framework; using SIL.LCModel; using SIL.LCModel.Utils; +using System.Drawing; using System.Windows.Forms; using SIL.LCModel.Core.KernelInterfaces; @@ -53,6 +54,37 @@ public override void TestTearDown() /// unspecified font and the user-defined character style specifies it. /// /// ---------------------------------------------------------------------------------------- + [Test] + public void SaveToInfo_OpenTypeFeatures_RoundTripsThroughFontAttributes() + { + var charStyle = Cache.ServiceLocator.GetInstance().Create(); + Cache.LangProject.StylesOC.Add(charStyle); + charStyle.Context = ContextValues.Text; + charStyle.Function = FunctionValues.Prose; + charStyle.Structure = StructureValues.Body; + charStyle.Type = StyleType.kstCharacter; + var basedOn = new StyleInfo(charStyle); + var charStyleInfo = new StyleInfo("OpenType Char Style", basedOn, + StyleType.kstCharacter, Cache); + var fontInfo = charStyleInfo.FontInfoForWs(-1); + fontInfo.m_fontName.ExplicitValue = "Times New Roman"; + fontInfo.m_fontSize.ExplicitValue = 12000; + fontInfo.m_bold.ExplicitValue = false; + fontInfo.m_italic.ExplicitValue = false; + fontInfo.m_superSub.ExplicitValue = FwSuperscriptVal.kssvOff; + fontInfo.m_offset.ExplicitValue = 0; + fontInfo.m_fontColor.ExplicitValue = Color.Black; + fontInfo.m_backColor.ExplicitValue = Color.Empty; + fontInfo.m_underline.ExplicitValue = FwUnderlineType.kuntNone; + fontInfo.m_underlineColor.ExplicitValue = Color.Empty; + fontInfo.m_features.ExplicitValue = " smcp = 1, kern=0 "; + + m_fontTab.UpdateForStyle(charStyleInfo, -1); + m_fontTab.SaveToInfo(charStyleInfo); + + Assert.That(charStyleInfo.FontInfoForWs(-1).m_features.Value, Is.EqualTo("kern=0,smcp=1")); + } + [Test] public void UserDefinedCharacterStyle_ExplicitFontName() { diff --git a/Src/FwCoreDlgs/FwCoreDlgControls/FwCoreDlgControlsTests/TestFontFeaturesButton.cs b/Src/FwCoreDlgs/FwCoreDlgControls/FwCoreDlgControlsTests/TestFontFeaturesButton.cs index 35fd5183e6..b8dfc2c86a 100644 --- a/Src/FwCoreDlgs/FwCoreDlgControls/FwCoreDlgControlsTests/TestFontFeaturesButton.cs +++ b/Src/FwCoreDlgs/FwCoreDlgControls/FwCoreDlgControlsTests/TestFontFeaturesButton.cs @@ -3,6 +3,7 @@ // (http://www.gnu.org/licenses/lgpl-2.1.html) using System; +using System.Linq; using SIL.FieldWorks.FwCoreDlgControls; using NUnit.Framework; @@ -64,5 +65,31 @@ public void TestParseFeatureString() new int[] {Int32.MaxValue}, FontFeaturesButton.ParseFeatureString(new int[] {1}, "1=319")), Is.True, "magic id 1 ignored"); } + + [Test] + public void GenerateFeatureString_EmitsRendererNeutralOpenTypeTags() + { + var ids = new[] { FeatureId("smcp"), FeatureId("kern") }; + var values = new[] { 1, 0 }; + + Assert.That(FontFeaturesButton.GenerateFeatureString(ids, values), Is.EqualTo("smcp=1,kern=0")); + } + + [Test] + public void FontFeatures_NormalizesRendererNeutralTags() + { + using (var button = new FontFeaturesButton()) + { + button.FontFeatures = " smcp = 1, kern=0, bad=2 "; + + Assert.That(button.FontFeatures, Is.EqualTo("kern=0,smcp=1")); + } + } + + private static int FeatureId(string tag) + { + var reversedTagBytes = tag.Reverse().Select(Convert.ToByte).ToArray(); + return BitConverter.ToInt32(reversedTagBytes, 0); + } } } diff --git a/Src/FwCoreDlgs/FwCoreDlgsTests/FwFontDialogTests.cs b/Src/FwCoreDlgs/FwCoreDlgsTests/FwFontDialogTests.cs index 1dc5086a42..2d2ac24719 100644 --- a/Src/FwCoreDlgs/FwCoreDlgsTests/FwFontDialogTests.cs +++ b/Src/FwCoreDlgs/FwCoreDlgsTests/FwFontDialogTests.cs @@ -5,7 +5,10 @@ using System.Windows.Forms; using NUnit.Framework; using SIL.FieldWorks.Common.FwUtils; +using SIL.FieldWorks.FwCoreDlgControls; using SIL.LCModel; +using SIL.LCModel.Core.KernelInterfaces; +using SIL.LCModel.DomainServices; namespace SIL.FieldWorks.FwCoreDlgs { @@ -56,6 +59,34 @@ public override void TestTearDown() /// Related to FWNX-273: Fonts not in alphabetical order /// /// ---------------------------------------------------------------------------------------- + [Test] + public void SaveFontInfo_OpenTypeFeatures_RoundTripsThroughAttributes() + { + var fontInfo = new FontInfo + { + m_fontName = { ExplicitValue = "Times New Roman" }, + m_fontSize = { ExplicitValue = 12000 }, + m_bold = { ExplicitValue = false }, + m_italic = { ExplicitValue = false }, + m_superSub = { ExplicitValue = FwSuperscriptVal.kssvOff }, + m_offset = { ExplicitValue = 0 }, + m_fontColor = { ExplicitValue = System.Drawing.Color.Black }, + m_backColor = { ExplicitValue = System.Drawing.Color.Empty }, + m_underline = { ExplicitValue = FwUnderlineType.kuntNone }, + m_underlineColor = { ExplicitValue = System.Drawing.Color.Empty }, + m_features = { ExplicitValue = " smcp = 1, kern=0 " } + }; + + ((IFontDialog)m_dialog).Initialize(fontInfo, true, Cache.DefaultVernWs, + Cache.WritingSystemFactory, null, false); + var savedFontInfo = new FontInfo(fontInfo); + + ((IFontDialog)m_dialog).SaveFontInfo(savedFontInfo); + + Assert.That(savedFontInfo.m_features.Value, Is.EqualTo("kern=0,smcp=1")); + Assert.That(savedFontInfo.m_features.IsInherited, Is.False); + } + [Test] public void FillFontList_IsAlphabeticallySorted() { diff --git a/Src/views/Test/RenderEngineTestBase.h b/Src/views/Test/RenderEngineTestBase.h index 1b7a2d88be..16d24a5d0a 100644 --- a/Src/views/Test/RenderEngineTestBase.h +++ b/Src/views/Test/RenderEngineTestBase.h @@ -34,6 +34,7 @@ namespace TestViews public: TxtSrc(int n, ILgWritingSystemFactory * pwsf); TxtSrc(const wchar_t *, ILgWritingSystemFactory * pwsf); + TxtSrc(const wchar_t *, ILgWritingSystemFactory * pwsf, const wchar_t * pszFontVar); // IUnknown methods. STDMETHOD(QueryInterface)(REFIID iid, void ** ppv); @@ -107,10 +108,11 @@ namespace TestViews protected: long m_cref; StrUni m_stu; + StrUni m_stuFontVar; Vector m_vws; private: - void Init(const wchar_t* s, ILgWritingSystemFactory * pwsf); + void Init(const wchar_t* s, ILgWritingSystemFactory * pwsf, const wchar_t * pszFontVar = L""); }; TxtSrc::TxtSrc(int n, ILgWritingSystemFactory * pwsf) @@ -195,11 +197,17 @@ namespace TestViews Init(s, pwsf); } - void TxtSrc::Init(const wchar_t* s, ILgWritingSystemFactory * pwsf) + TxtSrc::TxtSrc(const wchar_t* s, ILgWritingSystemFactory * pwsf, const wchar_t * pszFontVar) + { + Init(s, pwsf, pszFontVar); + } + + void TxtSrc::Init(const wchar_t* s, ILgWritingSystemFactory * pwsf, const wchar_t * pszFontVar) { AssertPtr(pwsf); m_cref = 1; m_stu.Assign(s); + m_stuFontVar.Assign(pszFontVar ? pszFontVar : L""); int cws = 0; pwsf->get_NumberOfWs(&cws); m_vws.Resize(cws); @@ -278,7 +286,7 @@ namespace TestViews pchrp->ttvBold = kttvOff; pchrp->ttvItalic = kttvOff; pchrp->dympHeight = 14000; // 14pt. - wcscpy_s(pchrp->szFontVar, 32, StrUni(L"").Chars()); + wcscpy_s(pchrp->szFontVar, 32, m_stuFontVar.Chars()); wcscpy_s(pchrp->szFaceName, 32, StrUni(L"").Chars()); if (ich < 1000) diff --git a/Src/views/Test/TestData/Fonts/CharisSIL-5.000/CharisSIL-R.ttf b/Src/views/Test/TestData/Fonts/CharisSIL-5.000/CharisSIL-R.ttf new file mode 100644 index 0000000000000000000000000000000000000000..b8e686a6f6e92297becce235bfa0cf58abbb1efa GIT binary patch literal 1508296 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΁BSUEglPIW@g}9M>aSrWZ$}+ny0_b{YlUWaSXb=PF!lyesWh?{Ezf$Q9== z$dM?OF9JEq&aik{j@qTla(r(oHZ%W*&Wc_>Ur~+=<3Y)MOE1i!#(Az8lK$N=kYhI) z{W*Z$lEU@V^ebccRqQ1rKP}=fvI;k53UQ?JNFzKIMa~lfEI3kh;}N<6<7Xj|2%beR zEK3W@FI(^>{)mh(iX)jikG&8@SQ)-7$tIZ0j+hr~Y)ApR5+(kHUIHuTcbKmP8#h){ zF!uZJPi5`*n=LQA@WL6%u#*={{AC`V{fNQXKazMpn<%?1STuu#NN%4ZdSf|Mf`EcVM;^`qwyblkDuEF$b^YZv=99v#oG%RPjzUoQn; zq%H=0@vn=9FKCNe0t|Akp{7z!V$8M7p{v=?0|ULT!?N>$=O^1;6UIV=L4ih*7c6t#UeJE1XU#Snb*+MJuOMc@lF%wAy9) z=?ypB5OWwpRkDbs{72t5L#*1Cc#aN@%GsBp?~g+E9;AHA9w(&hLwG3@Ud|+PAV>x1 znuE7noF#j@EAU;Twr2Ong2A$2WjOmYA6Nc-p|HPz zZdm@-mz$IO!EiyKtReTR%a#`S7oi`L*VYJL+iTh;ecLjgfUDW(*5e8E%5u$kQ3~la zS&)hvzHP1cF;Z$zGYJWu4Z2aMi=x+g3FM z@=C(CN22{@&LtHh%NZy9%?m4K2rXC4dD7H<=BsTLcpcRls z&c2*>Jz#Labew)^3-a5f)y|UOm!@lRDZg|-HRS#T%aY-SK8@PpiU{kW|5=4~iI<`O znGJLe)tI>4kJ%o%ls@4rZoQCT2`N7oszzQ{+V$W4!H#=&H7&V<;Qqy3Ya6P@+ruKO z>nmTW+i}lsW#IhFM_u#G{j2v46ch~XTdn*KnO#DEHvc)+ugug*Ka53-XM%k>UiAnH zA6~Ek@I=HS_pTtP$;GdkuzBwMtA3?f#7H9f>hTl~a+%YwdiU=2s)4N7hwoZKJFduc z+!JfQ+mR>sd+pg*(9@|79bRuZP4AJAJ%!&R0>1|esmoaG2p%s2uS5iX4K495I=26D+5KT@FG4*wl_q2K~Pls z=PdjV2%YIO%MPnHU=?~0JMpKv0tlzRzwy$IgYFGCZSE@0tX{rj?m%Pgn?8Tm=&73h zm#*{s!+v|w!0zE|XJeOij8x}2ojynZ2}iE8dR1Sg&1_Fotd{!0vA(KE=ZeWS!%dFw z6hyLmLStjSu9lIu#;_~Rydl50z1m*dH@S63P1`j`j$FB~wlK?`t7JHwj-s)NwdH*W zH*{nS-w|ueEpVDMvqDO)&8iee3e1iywA$-hziZ2KcXn&vvcaDELUkyRSx~xZMWbTz zrV+=^EDgZgOztC(zIh~ONn#96lD+}!} zMmUTtahD{UEF!6BR+zCH9^DciuR`2Wq`i<)N2xL!W^_vXquamno zS*|n0wI!@Fq&e^dTg||kPSf_d#7mKr_IC8dtE7QiLg8tX;Nf^w7@^Z?7n1G3`w zD6R2Z(i$w9EGL9Evtze6r|ii9k(%Rq^I+8wzv0NcXzJn}ZLq z4mlp>jbKxCe!=K9)5>Q(Il?@J;x4fx(PdTHfpEE7`4&sQ&}fz8dGn6SOPq>JNzxn=1>)q4lb`R&&b{JDUVB#|O6cs4rOO2sD_yp2=axvzp>6o!fLJxv zJF~`>>kiLj1^;09fK1$UgDnSRwRnFJv*F(8s9^*9EU;oa?$gb@u^$J^;aMkpx|hDU=|9qfLwNG_p}7 z(#OL+$vG~aKYLxk?++X>-+yJE>UG8*5BS4Hd0m04{^sFrJ3smA@s@XYdds$y96ELD zik3@`PkEYi@{8`s%$KlRkZBnc=drJzbO(zvV>ha1)jV|1D_*CS=fIPPC;Kybg-x8=}ongbWeH3txyn5!9=)FYIRafMd zFtWfb8gpD=W{IIaXqi0%l$l{p9z*e1&&tUMa8hB>12<`kXn+M_F~L8H_Uim6Dfi=? zet>_!uE6YZzL3Cs&gTkkDEI^)-ggzBMna57K(N1W3&obq?sxX9T)2XiCLt4AN!OhUwn@pM=V;Q z07RN12$UGfxKl=;p2E>7`es8!$F|b(n7F4 zs3XI*tVw?9R1wfbDjt}cSSb|!eW4Bzw8-40-%NL^_;BsT%64{Pz6;ODj_Jk7hh z2`wNDJ3+&4 zRG*M&(C)M7PRNu+QVa4PkHKmIk~QESDA0~jcZE(G4{`~U&o5B3HaxKn}R-0 zf8ZLm(viTn_p*W2xCv|Z) z<#Y#NdD!%xM4p4F zI1Qkv2UE&g$a8egu96_ABnXE47}iJtT&6G#xUfRZqT))~uu`;YQ#T^i_i1y3I1Uon z+{Gp3Z^2lQAe^RM6Px(r7nfWx5aPnN)eTi6P5HXHR@o6d_SExl!D!&pAu7+Mtz~R) z+Pkrqn@k@-Fg4zhQF_yOPcPn&a;Mb)-g=DrX4)DSj}O;*dLwQ}?p=>tPvCqK=aX34 z3+CkKjqBEf1kGDWXFr>Qvg`DPEm)pMfppKG|La}#S4F+9NNKV2+P}JMf+DH6Kkp(W z0BI?F4}u0ErGDzoPfTW{k0UWg>Am^6_fbx@sPiXu@qjQ5o%Am3Lyc+OQZe1cVHwlS zvy_-_2ue}|)AMGem!`y6$P0;n^_y>joF4See?RE+1&_?XzMsea)|Cf@^bVQ@S$x1* zP~d#?E13mS-^|yg^XYVRe&(Aeg`_U%)Hd->ji%|-?9nX<4ZBOhpCmXAGLG@W#M5eQ zJGBrVjo7?G;%Om!p%4yfveSh=x{QkPW@TF3%K1adJyM)L_v;C{x&4A)GG?LZENPO4 zN9#>rI1MIi(V`DYiDX0~EGEpvz`Igfse!)Hujz1t-<~IXqYb~=5a+8}h@udUQ&9^X z0F+FcICT>`r6y*3E`@3fG`w>!r_LD-g)gc6fGy4P5EQ-n-w8m9H6{U)1Ed!d?yeKZVnf4hrFM8iC!U!z86jSm!<-QY zsL66h|1L%x6FF&K=33B4)`E4Qc7k#rCAN!M2amO^WA9y44c*cD;`v+8wGL2C9+_)` zI3-^GLKZ^TNgxZ~3|iZ7LT5x|cWY7u9Egx}sgt0V-lB1?1}x}7t1>*5FHg%TbrL!d zjSy4%d=kP;6XOvV3-4WQ4nbB!Nz0(z;12}+IylI`j;QGeIeRd5EuM9T!%j!Llm7#xCFHEM5BjC8Ep zG8~tIMh!CzASvAQtu31;El5auBN>^_xq4FD-Dp=s&LnuckTn!+4-keLyWr*Dw;qE{ zf~nMy`iFy6C4NajX;4a4Z6VVMDP+Ju&=CzV-TlMT~Y2qROdN`yXI z_NXRR;Jh545;7S~APZxN3WUOJKq}>-A=+Qus?SCceqqd;ca@CyRYp3Nm%dWEydzTC zJ6C#N8fMy)3sCfbXt`c{+_ISN}UEk!lWd1+~R%{6cS-|ChEdr^@+zqJ~(z2%;w zB2RfQ<||tY9atRdqv$=UR#=~a>Alo+LRtnyUqR;ChoE}`Jf!X!0#1gYdxoHU;v2Aw zT5)9OQAk5rO9$+tx?Hb$NsZWLWA)gU5~VYN+eWzs&c7kor7SZ1}4!a9G~8hf4F%2(2mmseNfMS2=~RsC>m;>_Km zcAd2@{%L)Q7hRtb8>X!Tf?-i7XW`#ir>0noa+&g=Sf_iqPFnv(_EHU@qo!CV_EJq= zCl=Y=jA1+HdTGleyvkwRjK0@XSfDgf35IeCp^Np}jNHG(#nF0xExkBRgITVvkG8rq zhlewR1s+dfAS)|S=dc{{y1F6^?E8GX<#_B++P|P@-G}FG%8@uM?6Ce=Ek}ty#trT=Un=I^ z0(Xr0E9CrHNTTWqejhdR`2DLF&TH4v=U>J5Z?!%fzy49}`c}-(S|5mC=ca}8+I3Rq zwfo+=#P_xNv+?_C-#?)}XMA3}zCQmQJkNvHyS3-BnSOu?tl8Q4y!d{69y#tNwaVJ0 ze?R@pm>_P&=jHeH`Lq9q?_Y2IKztou)Sf3kuRUkdeA+?n`W5M7UhWU$G3E96xwuct z=S$d2M~P`LjQWU8z1|eFEQSt*x~5$ISc0`o!mXU1Q!f z8k-~Sjeq}p^83cT_I)uAbQq0YCuns&wA8;pO`ZiD)9i$upw*o^t?mR4b^-@G#ebyL zcgk#aT%xNn&r@->J9EZSWuH2^gS2n2Tyyl(Gt49!%>*!a=8{VhuB|uG98|kD{5Bt=LDP! zSw&{HFWMDuZgQlhJ8V@8*apBAds3(V4E&SbaAD7-PK|w$eR<39>Sb8^GPvpSf$Ym$ zhQ7S0nv6Y3$2ZxZnPyg63H85R*aK8P0-a08O0lkq&R4Z)3u8BoP+m$ ztO!FJJta;qG8eFLdZ5`8*TOEs+t!r;R5K5eMMWj5^ZHu1Rsziz%c4E zsjXPU9JnG-nGw1dV|}Fm;hfPxry%VjLP)?cYc(qZY8fHq21b)h`{UjqEe^#KR_N!)zdq8PY>;dAG zWxHEcKwd~M?uD=zD*|YK^rMg*A3d^gIhC)+o-v9YD?@vg=CO%b`(E?hLO@haWsr}q zfP56hf*?CT2hc}v&LHKZLdZv`D=p=tLac8gXmcTGu55s~8Ar;84jgmDS~}uuNo3^f zaV>rEwKO6;DTUj_($O_b$(@w}WU|sJEFk1mEFmL?xOiMN2Hw&;MEOx7y(ni11eUpG zsJ0UCdBim{gek@5&RQ0GZYXc}?k$hD?pqZtp+r>@wG=-qHCt@l>aADVS&=-tVn57>Xtg>|MR-KFa83O-3)rF)u~FkaPOZzBO6mzgLD(&L+wX&l_wiQD(Ss5rOm+@Exl& zKZrFdF}-hbjzr#58n@`BK>Rs)&&8p@#qb;hHZ-UI1hzYuz?(_Vub|2|ZB0p(qc z;0it-YgBX0KLl+kHGP69EYi9T9<&0CU<>)9wB>lfgFN6t9`GQv5G-^66i9?*EB!0yH|r?UW!UUbi^$j@uO>N4S*TuB zbK*F8Lh$GMh|d?P7j_-<4+V72myJ!BuM~{>jql{?pG(UQ_EI%fDQ_w>=ug0P`5@QD z%(s@j*#q7z)`hl<eKK$dkzwip<%X;3|)xxkrUz-*J5=?}SG(u^Z{ z8TxD#L&no|Q`2hopw8ngA4-^CWy~WkTK|59NzB6_waW4j`tNLszuRp5&UP^VyEM~Q z&SNn~&%UaDTF{77k|wfaj?Ni0rP6>f!(>f|rL2z2GT>IN3^*%qPTRdv-Ix&nsSGVJ>jVDTiqKvLxJwu zN%gAXiFsdLC!%82hB~|g-loZ{DqjN+&oOl^xfTM7D9K5EIt!9EB{})xLSkF^EX{Zp zHi@U%x-AvwMKyC`1 z5SAbMTepmiZEf)ea9ob#w>mEW_DgWuU+Vw)GjmFm2d9xxc-l|WB(%uu6XP~ ztMV_K9zHxWa`@p*n;*J%c=+0fHXnHA&dJrcd}b#0Iiuc^`YVTzbvt~H*wZ^c{hrn9 z@A@KO3VO;gnA}d}o!g+lr~Hk*rhHaq{Q^*6g^cs0EThxjL{dwoo176_isdreMx_A) zsXtOSAYS>wwGgS$9E8WJo#m$5P&-Lmi!|l#0_PPm=Rs$Ynx5rJyF&TxL1&)zn6rQd zci`{*3!5t|gXe`=3!fdgZ-jnx4{CM5ePGl+LgbQBfdlp`jkRXracBczOd<)D{%D#@ zAR)3#?pxy;S5}s5jdIDP6aOZ)au|sPF!Yiaa?Mo8QbAKR;W;!bo5txO@8}YayfsrO zt0<#zr;M7VEaz;U*EVc6K#j=_z4z z2doL-#?7MkK{4iUNvnh{Th8BPUVQ#eZQhLUe_YgJkl#Nc=g%T_S$#6CNWYHh2WNjR zt}kHR_BDMz{mZ6H#5}_1)cev{qd{KhMeX`xK7C%Br|lolBYXolo5MQXrLl&C_?_uT zrk@)3Nqb12PydzvT(IpwDQY{&`#fg8S>hUO_{2T^{@>#~_HP(^GUnlXZk18K(w9{S zJy~}5tb>h*y*6lvmvew}X6lpSFJ%f(fvIGRxSE%!&HmzghKgOU=HJMOgd4xNv`Q-? zU=vH}XvK39t>5CE>eSaoY+T1_#*c%vO8=bBchm7s>{q43sYY9%D9E;tsV3yq7t$=r z>g&?R`NQOw_@Qn-){VtWJ-Ti*=3Zn1MjpU(7n#~gNMz2>{m`=f#+Yrv;O$U`jY=teQ5q)jgVs1HJ6yNA8VcyaDr@1wFq>k$h1Ss zU(AY0c{Yvi7$#FbthDl-PeH!mSGZ9xBK6o~UXP?wk1Bs1`;<{iMcJ@J=`rY4?5}p< z74R4i(Ci(cRYj)D&;JfaUf(I~1Z|h6@Gi(cz*{pKntX;~=gC_j4ZS{SPjpSlgg^Lx z<5tT)MVc**Z7EQi{r}`}48~p^a5%2M+Tj>bat9rbYb?>9rDZDS@^Z71nf9}~Z=^XC zb47(&aio0%{eC1bwY?8?H#JszJ&t{vwgGu2whuEJLkF8f*ms3` zo5^(M7w~cao$1cA4~aeOJo~bF48O@^{t(|gQ9mvNNzz$Zb3+HK}c>vNNzz$Zb3+HK}c>vNNz!0oDbquUPKe;gAnI&3n*KPuHeW$ zWrPd`ck@_q{jS}W4VSEr`UA(5Tk~sMb1R2)73Z3(S46ynH(q9b63cI&e)H*$o{&XR zC;IVzs;L=kb>Z_T z>>b0#k|bzV){3Y&M;e0=p_OdgeI*+{c<9P|H8S_R{CDszWa~41 z8iX_m51N_M12h)hmEP7K>@&+|x9y4EoJ=#S8&zM^U)@#aJC>d6wC#Ab-BmArI`y#+ z<_`_^<#cyNB1K`_I(vD`Kt%PIN581Mb;SFq7A0gmBHrid+x9*h%4psKVFy|Gg5Us< zc3F<}ZFp7l73Y0bxtHp_B1Y$TSa#G7Ghay>%soz;Kf!tIHRpR_2SYsw)2CRw)dJy8 z)BmHe#X{1Pw%90^FN(d6;*0nO{DAzsT-Y&KqeS{tS&f8|5|rml;`SJ=u!~_g(+sf? zxK2UxtN|>L)G-p0q>jrd?J{JpOfZk&$WVT|#bLFP-ct>9q!(WYo~6C0AGLXk^7_9p z6Yi+Vb?1g%&*hf~GrsYS51g6$*zJg|%S*J#D&LHqsy}%7T-D6>to)jSyov&^^>%mv zrpvmOe}{J!29@r;=G_aus{nJco>yW$E3izfm2!&8W)K^`7G4Q#o8bTd*n1QB$jT~j zxbCebNmWw&l1fskN-BF&sU(%8vTvPqr&rQ@Xu6y3rs;(Sn#HyeL_|eIM^O+#QAb-w z8Dtc3Mj`En%P6nTpyP+=;E2ACgUjfk?}!d`F5mzEJonbEN~N2$I?MO_-qweE^VF?d z_nvc}bIx;CJHjS{W=*L)%u>-@w$c#&Iasormbr34* ztExv@1G-EtP=o+k!15dyaAu!DI$-%2PD@N6kiAY3$Obzl8-ey2Mh~;6brzFrFm_@b z#yE*_E5_XzAHn!E##b?(!gve6=UD5Oes8p&{r$!Q?&Zf%2Z3pb1UrGVim)?u!y7z+D2>e?fV&*-%au#5J z8Jr{V5*IFq^Fx?_CB_>u-i7gDj89?wEk*_D;YpnQ1fz%^1V;iYg@$w*=vP4iq(hS= zYUpEtJ}c2LxYWyFqVe3AP>wlk5)FP&+rVt9vL)uN&#q4T5+3#9`})hu!>x_=9_>Yc zQ!vm}8z@B&&+4{#@ZG{w5NDugTzCr93U5nuqdPXzRU2tcg&GH2LaNPfRUNPi2U>Tu zdRsfY!hhjVywwfC@|uXdJ~L#!wkQ%5qEX1T_e1i;EUTnFiHVEGp0CJ8tY`g-RZ|VH z(MFtal5I3(RUyO4W|U<)3;4?GmuDf?w@z;|c(Q`$gC8HfT9?DQzw!K}B|q%%G1_*( zTwv-fdVXPBsiut1J#2xrDSBAH4dS%*#CWKo#_RNkoDiuV$KDTRt@~;wr^YLXvn9SN zpEu%nS+_VF`yfs0ThbDi>L_5@Xt_e}otXJRZS6ey{hyrAFAsgm*H^;Eb=in_10JAW z>2QA);NEE2wc>Xbcu0_g3jwB_Q-BE!(Q_ztpF$L6`UK;{UVT|i-F!1}b=a2t((>3+ zIz}JGI(cr?knL9kXW&JOGhY(nDIs~J2#8wZ5CMN;sbk2Pd}j0iRcZ4FNS8lEm_Qd3 zvIBHS*>Q&{ISgz~{-;X`)@-FjFwyo$$c8^a7W@IMpX+s<)^1JNe**pDjjR!7g_dgA zrljv0IW6E*%yZ{4MZJ_h6jA0YM2Ax-FG!#$ayY*TL5HqR;RaBY;5~=RL|>=O1E;&D zm1a0DZD=$hUnZ0^A_NfWk6>WzadN&qBl^^uiq^&LpAEOyhd%U?u`BN0)iKo(j`@St zpTSh{zWd(#)~-W;e!OF{BV@lU-Wn}eZYl3te{|KE%0uZ*_ncfCtnY{>S}NRSx0ZLV zyKHv+ka}jiv2X9kZ`~YB!U$}_CqsV5$WsLQf_F2z$EaMOBBR(qF-Q+F5}Z=YO&p-=K z(1IUz{GMPo9ehM-s7aSW+r1tGyBS7M*unqopc6ZmnzU$Kh$AB?#_&EyF1xI*@B1b^ zO1Mt|pM-HvpHm$)_56B^x~Ik5;pk*#PPCBDTJi$Y^*Uif-ypxFAq&1C+?>I;61emM zrZ6)gw~)-bk`@bFOeqniZDss2X^dTo-LPgzagvGfV&%c+q2{0`))A{s)koZp&;Rg; z1n$hP{!rbPw_J8?-K*X+*D==Qi^OXkACC04$E;7cuin|wxVk@4Kd^dss`A>yhZ_mp z?Dm7H%*jL3XO3NS-?2<(b2<{w)CV4HTyq$S=%6u+^QC8PH^V;MXL-|U*j%g#VWF7x7JE%wB}V|G(GhCx-9lxwdQD#XU$^mv6NanaMOV!_nfT2V7Nz(asXb4 zS#xtixMX2y=v4Bv1X-E>kxS4x?6W;xvGo_MkA<2Ofr@BL^tt7!~{+Ui2L!hWXr5V1YU(rV>Vn0Ru9XnG35g;6%q3A!(j8aEU zfJz@`Wutid?6ZKGEE2pj=;+z-B8SO3xc%%tJs&aoHcE?gMR6)3`#e2cAs{)UC$+ zYM^Qjj&r!%dK}l|Z=P?&`9{XO30AwLED$*C%K3^>_`vQA_s*|!H~0df3N#}2?mU=r zf4%c4IvMXfh_;bu&dqZsj{E%KkiXS;(Y?pVmDbF*k$M&Xv~4U6gf7HpN8=SD9IYeq zuXXM^vA!-9>ua1f$s@pXZ*Elq*J4%mS|V6g23IQT_hTkju}t}+uwrnP@GL9Nh5=5a z0j}6XFKIFSvWvocW|_9PD`7!b-SVZIC-RyMcOSgxh_!V^tca|X>%nmt>tV+7(sKM- zav@qv!L>m*X4j;b=iC!q1rsvNsUJT@sJ}c9p8!x(hF>cMbfq8$Q-E^{cC{3Yb14|- zQZUY?V4O?AIG2KPE(POU3dXqua~f5!$v{h ztDvb2aR*F}wh_2q3vQ$H~q|hdGVVG!~L252a0Ri@>)T zbGs7V<{~Vli@>9HQ@qG*;uWApFJvlIL$qe9%`3fvO^OUSQr}J?^OJM4p^Z>|N~-Fc z{AcZrSP`#{I?hu&(q2%kR`o265(^sHLOwx%+6P>ggW^%8lk$oAUvh1tnitNvyP+;6 zGn=H1!-cD4zEUOd*AFQ2XjW{|wJ1|nFRBf#CpwrSs)5V5K`LHUtfb=AfHNtIn7qV! z*;$cFX|Bde9WVj24~osz1y~Ig?&7#2)GJX$C+Qor3iZ?~qMxjB?X#h}wy@JzQd*+? z{6_(Axi46@_CUwRqodk`Z+XY1p|LfyiC}YWz-D*2$}YE_w4S`n#YxYhBb+z>6M*wuS3;Wz?)It4~al`X=*KD1EbO(r1x| zThFi5=j}ePBut*4U^Or_|wlx=&1X{z9eQ`Oh_(-T&-Y~S9e>vaNrLLFrd@gX)TCzwYs!#nM>t6 z%Kz5BpSM=Nu*_Py5PkiW2ET8E@?o4+Cu7xts+wRZSanff<5;RHp8SG8;0p!3oykB= zBxMNfFhUdiDZrI#rfl;E!UT393}#c-AA%$TRzaX}NP;KT!HBj!%rO&no=Q znmmlaoyIv^F$!7L>{1+h=4P3ad^v3*j3;W+hhX{mc&x#~*omrDBh97>wwA+#6D5E3yr=T&Z0-t)4$pcCKu$xrYN z=iHoMJEhHd8TX19Da7em9~807OqM`58Ff)Tf_PvwAXtDDl0H8hq!C@MGGeTel?|aC zi>P2(WLs|gxm}IZgl0D7pm74>98y>ts{&Pq+==O{HYdireSx`{S^-heInm;GySFL( z9A31{)3$EBen+RX!d~(Z?<%V(vDQr-m{2~&elNYfcuf3u>r2mCZJ?Qir1?llgA!=Q%=6jXvORtPq=Sq8x{*1NY; zsb{RW`hIss%lz$!S~iZiJFacCw}g-Gt!e8DC||U`o>9Zj-S0d)Snl z7MIJW&gJ3xHzNL*ct$*h?VE_tMH_73|3`>JYqxxr_EDp=Iioh|rIR`accHXO(JsuR zS%Wb@LXy=eBq1<`oW?%^#sI(=02l)RV*p?b0E_{EF#s?I0LB2o7yuXp0Am1P3;>J) zfH43t1`Pe)yos*g2cX~MCv@ z*2xHm(d}2Q?OL4*8xal$$bXO@-Y}W2Rj)BZ7P8BSHAGEJoVmdaYG_$|1b(R3z=r;1 z-G=_TKi-DUDi(hl8~XW~%te^cd6>*)4D+1)px}`vilL%J9vomrDyE7fcA$KtK6F+`U*Q2R{oSWbJl<}?ZIhE z^farR>UyBwyunoaOgpBL?;-s)qH-RnzLivON044CQmDXot_Gti#YrVb3&sG(EXF*> z5sd3F-h^=v#{C$NV0;bZyBI&k_&tW6LREYdrcfE?`A+beZj2rds0U<*M#`8hj&5#g zgHD#$u^Jt_q`lsbwtdY_jCBM@hZd-(gjg>_Xr*@4ThkJ)-+b}0k*eQq%znQv<-?Ph&LcA5|Ne1zM(y+J^z`^+Wo^(1_GrgremqTX#KT!ef%?D z+=H-7{$mf67^~B=YORj1XKi;vcJ^7WVSc;xqsfl(4#8Qv@mi*jLpN-iveQchdh>Md ze0-q^1=dL$u!PKHoT<2%+%!VV27AtxBVS&3%HttoPj9Z2MrhMaJZCljW6c3J61f%5*Z~L3SyTpv9H(D{1e$k_V z^gBuVr9VU3h@pk*@+^&aF#Emf_7anR&B~}cK@Sr^!xBKWh+tz1Nbrm)ae{J_pj^ZU zO3KB)9)Gl83}DP+%wrtExDMk@824b@kMRh`*D$_|@l%Z7W9XDyd=pZx;X0w{CKc1c z)B(yJ#=~R;f<`eT`@)k&itWzIDL3DrV)L$;f)PzDN)E3^sa)Ih=S9UR*eS~o3$m8< zj9v@G-zud=>Vn)qoTimZczdO9#mteH-4&>H4d#3+1H{-s9#1ki6*^8$8rLVx?g~cx zgaN=*mLKLBw;Tf1JwSDjf$AQhn&pgo@M}Flbq`S81620_)jdFU4^Z6$RQCYYJwSC2 zP~8Jm_W;#B2C9p1LR1^8jJq2$Bg0_r#G6jxZ+1GA`x?4+mUM484{l|@#pvE}_&m9m z*~;M$VP0HDlr<&ez;)0vub{IA>h3@o9{&VmyWM zEXMCJ^ib5|o9KF41@troIe-{g2*eA7GwQes$7&qe6MYsB!|G!4j7}s$qf?;KDT79* zK%-Nj(J9dA6yPug8l3`-PJu?JK%-Nj(J9dA6lin`G&%(uodS(cfkvkc8ZEvFX;ki| zrN4?kHN#)E&1;swU)En`%gK!uQmWyza?GdZj!*j90^vx7r=l)+(Q7s(pVfYeHWsxv zLgwDH0-0O&7F33hhPuMneD<~t=xOn~?X9Ax#dUOC<$7A2A4$vd-Gf(sSjeACCI7Pg zBR!L*?@D$RqCE|}URX5%ZxQP=O8OklqtATb)hIB`=9qNmNZ*yfa26QGo9ay>|>z?tKL=<`&?#Z zLdw9}pohFfK*O7IJY+R-v^oz*W=@ih#r#MbW(y&xNAd_eZfXaQumje1@CZA2gdIG> z4jy3#kFbMB*uf+0;1PE42s?O$9X!Gg9wBN0Fk8sHiN0gD<7t@i1cxzx47rz}5S~pK zJYWJ8GGS221Sn(z6fyw{nE-`MfI=ofArqjG2~fxcC}aW@G64#i0EJ9|LMA{V6QGa@ zgF=dLLJBct(F~|#7Go_36%RfAA0`joW=8#3Z!@w|QmO9Ul*#WH!VV)VrWWOuTaK@i zT}Ja7hG@^S>4^27^P?N|MPMJiOO%WA_e2w*maU*0rZF^GCa|WlIM-on7ls~zuoeEg zt=N%lg})BhB9?0clyzy2vd(A!blS2BL_8xXbr@&!I0N|s?F!It#KDmixWoD%v#%P) z3me8-Hf7lZ64?Xk#r@WPobSi^0UQq)W?3|%Ss8`E8qdNJ(nfSPKcaO56`NaEAR4N% z9jj<;Y4)78dy1RGy|sH#<2yw}*$>3r(Dptns5vMpJ^fbm6! zyci-c8p`8EYdEncZ=%T2Ql##hp+qv7KoJatl*An$E$=nL|7=FI5LqrDiFFZ%a2?A< z$}@%?38B;rmeXsnoL;b;Ua*{Au$*47oL*3CFIY}5SWYikPA^zaFIY}5UaJ=@rxz@z z7c8e2ET`9CImI_2%Q0w)!ij>3W_`KuS%3q|cyKbL8Bo>;K3$D-GNu`vQ&CxmdB#R< z#1>XM0^p0xIRaKje35{X?+vj3uUC5gW!iJvmrF~dH)tDgP~NM(QTx@)Q=RqmN1~;r zFDOBm-*Z&?t2bzGQ0}~Gz8r0ml?Sy=E@tD-N7X)cZe<(`RsYLDY&Rgq(mg*PT>S0g zo1^p6m%7`25;T%$pilTYJl1MGRm*eaPz&v>aG(dVVc;u5|X&P?U_ zmtH)_+&|~r;)Q-=+BBf@4z9xHy~0 z8QBdNo(;Zgw=I+uy*#sHw9cfNqy^)QUB{{LaN8~6kUJc8?K+wqn3);zFFx)cnw}X< z9-SKNzoy08kc?Nlt3sW@bkNqPy;VC_*E3w@PWl2t^}`Uk)$SK>EU5(cOSRo=Pwtsc zg~O@oJtx;H_tmsDT(i0EsyiNB_yWx}Hdt%61;3&Fwf53qXR0#6%8=aiXuF+V$fbUb zwEdEZlyQ|48#9wEEO_@aF+}5p|FKB426E57D*nI1rOOIxzkA+olRWhVyo%2)5 z)5$uk)@pv!cC>(E6-!L(RllTs7VeIZoCbeje@k)*ctJqUhHowa4#7GU^@2mh5J!MS zHPA5o@|v|ebuonCa-9?CRu@bxfItu?167J!CMJ7SLk`Mxu2S5@f#MZT5Clb#3&dii zc*Sr|hLpg30_Sxkn7(G@H^_p#V~U=$nK68~9tDnikJ+E}P5+TWFQ(MBG(deyHu-UA?@ zj_V%>6MY?uOfA+OAP5RUfe2H)pam~jf+K-YjWrY%t1*VZ2m)CHUS4rd5Qz9434-Sz zTvt7)eS5sZd+>p5^viY!K%i~|2&~@re|T}wse{hD3i5} zh;CbV$z5s_lv4U257@RTkH7~l=Woc(-)qckPuRNcKgrE6SiUKI)-ml!!Tfh@+vNP> z(*^V2<2+y=LoG(!2kP{rQi@6c1TzsC8%pTVIBIB1MR6)-Ssk4S%|5F7M1qVjLB_|% zzY3HX5x|%%Tk|h<>?X6d9_J#G?&@LhT~(jX4o{**B<_ zV3d)TRNI*GW%6|lTX*HE6MMR5yDCw{Ai5CmsB!=BCCfFHfq5;BI-mC{j%}?*|cSq|x+}^VHl&3Cu<+k{oa`V?`Z#B7cJ9Ebv1tIk__8eS*pP&PrLUuysTb1i?!(#(@F}sLb z1uyOdFUIZxWNF1`eL20&?0BzJy_HmtyqFwwHXV7VX=K#3MYQUHX3wVqw4f&vAM9-` zcc3bsMI|0^G>n!3oCh!$#F4cm<&3)h%Yp=f} ze`Vy5Qh>cve}no#cwNEg#QON=ayXJWVV8UGCmk2;9s*5U$A!5z^uSGXZJZMqCI$e> z^Tq(}*Hwafk>cycSrZ`L1c*1|*nDn?7x1J!NWXS057J9HkqP4uUOiI?<09@O!HfLB ze+B8*T$9o0q_0QD z3xeP@p@&-ah-aaNjw&V1pCtsXDWxgL%uysQq@7Tlpz7ydXK?(_1(biWUQYI1 zs%*&d@A&p38?@Jepp~Oh?Z+mg|9u0v3+rxJY#G3{-!d+B7a40s|2{s!d)oj#QbIqD zqQ^%hE#)A#hl1ruvf<8o31jRXvl-?XJ<&AxvJ9A0pVyv0Q5o1pX%!B(P3?KrhSXGh zxT-F0`%DCBrtM0)w89i#f<^i&DU}c;=d)%eZh7?;Thd4$t<>{PJJubYUHqJ~MUS1+ zegx5l2r23aj|th;YWYI`+N3vF;+A}pQh-*C_8g@Yt;2I{qo{iroX}i{>@tQ206mXgFn;z*jti#B)LC((#XQUblKl1fDz!8yz`g+ns3QT^c`(Mq8qMd+gHIOlgGK3z{ zdpg1x%O^t+3{lT$_HryPFFtV#kn@bCam~dT#Wh5;p(fM7Rfi=Fp_23^^GrSr$y1OD zoM);=P+4+YtM=`(GWRy^#OsxE?bH>@YQ=IQ>YrD>b=V($KLV2O(;h4n6zW#$R1n`B zOfQ?vCHLaNRYI3V4Ov@?wH$0zo<)6B{*8>YugI7U>NRXIZLC3R{Bg*R5okQqg2zo` zW_1q2?G)DSd2zHlPb-43Db6eSl?tiVCh!b!oCARsfQWQ#l3>{`oGi{{Yo^M?hbgfn z#KU;;FjKg06^F3eE{%IG044fSF@FG#BHC*6W2V6std`%n0`cxvzi)@OX1~wl@$FY0 z-Qn}Ezqq-owlWf|-Yw#u>yn@IM?#eWPiN9!9SN2zwv*$^6vO!PTM&3+(Oky5B1;<-Z|;9- z11;BEW6=@52G`LsGfTnFt zW`L0~v4+~PhFF_$0jp_7=*SrW!H%_5kH6alj@mFYo5PW==N2s;bD}6zD+MljVR&dKtou#5t^od+su_|D1Qit+Wxr#|&= z#j)iVzj%2Dw-i^ljJ``;e0l|}Z5ccnvS$kGX1!(cG=lzR4y4>8h{$M?>r0hmZME1Xc(kZn*F1PXfu zT9#MBnP^=pkVQFP1HKp&4`{LQTYSJ$y<{}KL~C))Iu0qbfIPSd3al>q8UPTBQYk2p zat`4Y{KlpJ-lnCpE8bUmsnc$c#w#lWH5Ur`Roejh6|4;SI_v$&+mZ4s@CYh)79`LV z3NW?2OtF35T~hk8VhlQkcE}b5UN^Ij16ma#Ae0nOUN@PuhHWHXHs;|)4{kIUm+o5- ztPKH0!ZXBZ_g2f4Km$DiFoj`t7Sr#Oi^#hNeLIW5Z0j zfEmRw-CN{u>vC&E_v4zN*Gu}C6Zu|R;Y!n2kw6aZk+Lkh4ab!Dp>m+XDbQeSN0(~A zO}L^#TtO3E3)YJ$4Wy^A$=&FZ6t*Sm!MM_ldO^_W^3*w{BvPV&(w?WAEoEJKT3zIh z^jqA~kg3;&qZME3P~T9-+%iKiTZVZRE)6ii#+jXy$*H87p%$8K+;tIooEOb*ZoyhO zp``Nl>k~R>vPD{|MIz-K3O7%a-s-Oc5- zJ8yaEv4-NUK*$&HKbEYGrp6n4ch>}h!Ro3& zO{}2?3tV|#DRy#40@z2MGlacni;6N%dIx*cG zYlsHQ|A1sjv5ydRXa5-X5#SE+iQHjFs2}zhavr^z_4#kweuvLNr`ltJPOm4On){3E z!A+#*0-ge4NN&=KPN$}qAW?nAYK(LXyL{cixwa+PQ z>~7W3+l$~VtD^ls+7*sILw`=eCYHARHXl~VQYe5G?f#a$uHi6fL1#+ig}QU=QqPb# zr9+VcvPfLy+sW9(LfT{ttz(8|Ojd29s%F63&+^Rh2Nc!1Te-5j zvL#rmomLLrm{D%jzGAk^P=9TnYwuBRP*ocY!K&4!D%t~Dx^#|w6*A9WE&Azn0@$?M zJT3ar$oZ}CHOu*Xjd|?}d$s5{Bj*>Coq|74X-5j?zhiq^&SRsMfBpA352%a#BbKV) z@_E+ukR6}dfRm~i*9&G%wb z+nSC~V|6)kQ#wG2b8cn1P3y&xE*)adz#`R8W(uWoWHrSu9J^={G972R}f^={#-FyK7K$|}^X3;m#l{!hZ$ zcxCQXCvxjduk>!hSq};ja5l~Os-!DbH_uNqE&)n&KIZ<-nD!F4PgDNPmX=&-sK>BYAF^z^5}%}dF?|0 z?(hC``r&8J1>Yi^{PyEBg|vO!@-Qci2^PZGq-8y*&xEmVq82cw9aBP<@q38u0Z)qK z7I8qyuv{8^hfr<9yuowQ=YpaMK~yze5%dhIJP*j}Jt{=+ip8arET9Isz4S})qE7IH z0oDY>4p3jb4LEBQ8eAP_8ie9g0m$)nxnM~wB%+}lwdz^;CM0z+As`7)hlod6+PH{K zf68zxc6SfpXgJ(yDK@x&6xvlCzU>wd(SjdkvBf~4FwOZVbs98$lu9z+N!jNsY5tx8 zO6xY|69v4WLY)gOKBHVOID-0CgC%?~px&-dnQMIUS+D9VU<-k3t~k2*lwb|j+G_Jk z<&M_N4cfdDv6Fq4Dd~k`;|>XJMx{{^m5?Qb&74;=M)fpo!`vQqmF=hVw*&K{rd6AVtXTBk#McZ;50$=lTO!HLNuSUJr}C3h?T*+{pN4 z*fIr0FgTDd6B~}yVEH#RSRFV;HHyqo0BWR0bxmUh8TylEG<9?8BA=7UU6303!7QCKG@`Iha8Je=}>vfJRYZ zghG7;`H<8{2B43Sk(~yl^Lt22ZL_Pp4AHc*4zQzywmy%-hEoxHBZ|UV`>g2qiS1dk zo(c21bs&TI+;LC{kF*&?P;Lo1_N=AE8Z-S_`zh_=T}J{<{mH77uObrjy!Qu*Od_p) zUt9BdLu<%ks|Z)rHg(0T+I<1Tmq>q2)~IQ^qfOz!kHw={WF zXR6NY_qt1+<)_-J{b9eg%;#>dTzs*9U~SXtS6)0F_?w>nhf9;q4JD3&P4i8y7fdvl zI^_E8#?FcT%7l){ynN~76;^hE1?qw%EZUnWPwAUL6b3{im9_Jbu1LVZPm=vnpg8bl z9!d0M4PhM5E_HbYb(;i^%S&KlRs>5I8p@#)77C6f(ibIe{!(dujrN50nd^grOSILy z1HRY3))&~VEL;)@&MMcGxXLb6uBwfOnrzzplFFyl1Dd5sDO8?3sJcv=U;M2aC=eJU z2PLn>+V?{)thOAWy-#LZp2nZXo=p1FnIdOItuJ6bpzMqgg`740f%!^!0z^+oIj@$^ zZxQwaBiLC@*Pz?6qL_0KwGyGT`!Vff<*9+8N(759zJOqH#DA*}#D5=rduwGPT3OfC z*toy9VLVmUlKggCXQHOk)83V-9N1K)%-w}xZGRNI)PivBX)| zYeTD+1Y6MeO@8j1Z0i9(?wg(x^@AvL2*>q=BXt<;ZG=b2kU5mAB$xF#W^v5Iv@?UN z=nXoH4@g%45gj4mIHNnKr7%e%2LBI)rO);N1N%cSe7|OjO;QfNKMo(8*5#<)F^-Y#P zV^MH zhs&bzXoP&&Ox;N(Vi8YMdpeSt0Uy3|N_n^TW9830=iys zCc%)Y>mRb01I`y(hD@54G`c3|yWLJ@Y`ZiL&E_c54T>bs00l1ZZEb2c{H>j~bAl}= zwd~~u!sps2KeT`3ig)i0XS!M|%IvnpP}K!jPSqC*wNWMg0ZZX@I=moXo zi47OeuDW^HOa|+?G`pQ)Zdm7jC;@K3@`UAm5|&c#qka@}kqA}8bGl$jK-x=xsSgmG z05lyqZoqEhirgnBFk^a2&E2=Y>C(NVVv(b+HM~4zAa;DokJ}{hx5*kN#Es>QlwwQP zJ`khOJ*h0~p0sl(QJ|-uJ15Zoa6wjH*HlRRJMBa7Qex$;nZa1smP904)86uALrYa^ zyrK7!#>R9!7>QMe5^ZBW=a>Hnq%Fz3Q=YQcCAG$>d8hJtC|TuI!^fsGM=#yeIv<-6 z9?H7Lh6^@t-8$Ep$TS62o5`yeSD5W5Y}x|XC4a4uEDT44I7sOuU5#YPY$a}ghf&cK8?1;}!P8ay0u zI%N8?J))N;5+YEbKN8Ab;f}u-DGxFC@i|A#ZTr^r1uwkU9dpcKucAML>JSkOcqXk^ zxgPnbUdzZ?pGhQ?mSV@o94YgO@}D7KJVVxahBc+3Lm%xAmd+vt)aENy|G71N=F6o% zTbJaK|6RYEvU-(kk!$L;wC26<0sxMbMI_&XUi<8hR`(ggP4Sq6n{-qy+E?!geq1^TN z%IjbHq2^RyBXT_DeXg_a{*P1WWtf}S@1xHHmrszsa`*X+dO+}^+`N9hIe((}e^`t|z!OW)OwsBbLs>-TRi74vwH&*{&b`&@jl=yOZo;?o7c_dVnH0Q$pN7dpHw zUsCB$R0XXrI=F3awY=suf^&>+O3Y3L$IPuA)6&M`%P8(EL?FZNWo{O&l!k+Z{+0w* zP6F9u2#lob1lM8Phcg$>PA1rUlPOBcRqZlM_EIW0vX?jn# zbs*_|mFjYq`V%dY$+^WLb1~ZY_U)KxcaBulc8qo?<$)@1xFK4x{e{his}%3fb=fX> zMHBbF?1CVxOBi{%tUq0&=ZAaoCg?JSr*`6r>Aqwjk~Fd!+~pi;x=cq@cmpi%FaRLq zKN$-Ta}91v-yAKnO&nMa%VgU^VJP50YHQ^rQ)_#o)xJRVbWKN%M|-6Shb4Km&W^d0 z+v5c=00{6*&FGDKIo4{E<+urh1$>0~KrGdz5MY&uWgx(^hq4IW0^Ss5svuORmuj6SFFP)3~)QYiz}$c94SM1%;cmg&kP z3EZ?#R^TG42NVWA;4A==2Duj4(`a0j2~Hv9b_fN{eYHFG?Qg#yBH~->dl#RD>Laqk zs@-bzkUBSg!D8$X;g6^*b>n~jv&rmVc)?E@&-U?;^VvRX>pgRU`E1rt91=;rcr-kl z0k?$Z#By*W{AjWz{1~*!V~lV_dZDgpp~tv@qX}CIHw1#=axNf3RIUfEf*@vCP=soF zjWAFYI3oI(!<>V1GK9CugR~CoZ+%N`M-_}5w3Yi0-EdfW2Jn8{;T!l``g{EhFz;ax zUL&4d{yY~U?E-Cl4<>TURDE>v5jwxLUD2hFXcSy#freL#Ph>1B_X9P!K@H3WvD_@< zSD8=2Eg7ouHWlt@g^!^mIc6PJdLoj7(EkVC1@&jH=HbnKju5nqD>V0&?nE*bM!#ou zzMS(uR|(aR`i@X@ZBVtoHMMoDQB@b8G~ZmksoYoH;7@HCYfzQ10svdY-|+kX3N&{@ z&>Z|uXI&3?yP0|LIPNned4YHNCD*YMm|6#DIPjJ>!Rku^0qNIWfI-$FnqJ9xJFG91 zh6(F)OIHxGrRDo)Bg$K2{$p4{{^&!QAHQEI-}KOc`m4pe%q%tK=QnJ7pL!fGb<;^% zV}ZQT``lGx0-joJ#=G zTkL_BzSa(xs^=tm>hlKJ20+o`d1m z27j!8IhjhH{P_Y-h@U6tlRvNgshecO+v-bCz0|0l0URnU9ZCh6uoVnhS{dY?XOcZUE!YC#YT3iHu;biX zd~hKKdw7y@JAh6H2s(`WG>VN3?GR?JvRNyM&RP`$jlTwh$1jsGSS7v;gfYqLqh+Kd z7(UCu_sU=-D???$GE^2ULuJ7-R2D2lWx+C37A!+$!7@}9EVDd?@hrygF!bu9#W&Hb zkCs^u;VM=bOyEbED9-(t)zTu2O^x*Dp?JIq<G_V* zu1tJ5RlPTL!IhKSPR2&|C3g5T6YJZ!>e3fy8pb=TpY3Xi*KEJIrlY@e_>wiv10(D1 z-`LoB>7h$fwwtCec=6^)EYvy-octJ|egHUO8O@V2Gn^5!r(p+^I@ToDi9@W6CLH@Q zR%7hIaIiQ1r8qf(p#mpqK%Z=r`j+7xM#ovkH>yaY;B8svKmwm-u+eIlB+i2Pju2_9 z5ieaJyK?H5&VT?A#o_CU_VmPiXPT7zx?V9EcVDLYu5`x+k8bX299&%&?ToxvDccgy zv^DvyyTYFFj^=D*$e!+6MU2@fxPc`mV~MjLC_cBf^^hI z0hck$9TG0EiQ@(O{s6f20UmVh5-#*o@R-h7BK7)mqDd?YBkSES*@c*ZS`e7%5Y)|F zs*L0cCddN%nlv&(`h3g4EJDMM3AfMN{LPYM7;I!Y;B^DIc>r9z!DJ`Z2A@%@mxtmg zp#48xhrnJ~^pp--E|VeFcIeI_;HCsPDuGsw7;=by_5wz)7o3H2mi7GII#NWiw8>A* zy)i>bT|#}P=HbWvr0;}AH=!%r<+5&+J9cFl+Oc+q>sPVq+je!=0rh*3BK`Xo9o)Q= zF7dy?InG9h~s20zp} zQk$v3YcJ5M!2HIT`^AIP7ueI{(fC})t-V+;am$CKT?^Ju&~6lpEd>g#nifF80&Z;s zx2O^HYy*s)q9&UUbF4nG00mv1$+{DDIf$FdI=b*T8@92CsDiKY-OPS9l=`LO-8cu) zinsLP5&Y2J#+AJNN+c7=h*l`$2pg=kCIfYb0j0X4^|^!3&6jw}%hb@E_WUgeZ_!TX zHY)d5)TrvW7gJ8Ruk_G=XvdXzaF351{~+LC>}5Bq`vl%lUc>g6m`_=L3kd}}Bdv7; zDv~bvsHCv`CcY)r#EE3w zM#ehPMfI6_Fe4t!G7H=daw{Fhk=tlSa58R(SJIWuZ*r&T#jzbn248ew*Qk>{iqFwP zmD@}irGJb)0HY%Cxq3I(!(Oo;z}e~3Vr87-e-{??^&W4&OqncivQ{QRti zvaB%_KB@DBp!0;F^Ms)DgrM_;p!0;F^Ms)DgrM_;p!0;F^Ms)DgrM_;p!0;F^Ms)D zgbbah_$Io}6N1hY5;_mtJNy?HHZ8V`ve}lNE7_?c^Ge!rpmc;;P8- zKyfj5(~)TWqLGg2bhLhA&+x#G;o9!Kw_TXpGTrMr<_+)Y+P*o`w{x<8*HmNw!8ZPp~U z?c&~FJ27_{<0Qtd7Slb%L*_t;I8>)hPZo(T*!!Zgp-)ME@Pi+}^`W2rEYv#M+L%z_wSL8s zTdgM!DI2odjp9Ft7QZ~Yy|1!#hdXll_3Hg+-aKt7z;Wd%G~QN} ztF_yes}T^YsGnZ^SnrPG*B9+1c^r7&)$9X z?o01Js@#S)LJnGzguU8!F=UMcO3W>$^@6Ef(taz|EFYjB!bUqLa2x|}5;<9}mn$*X zm{~LFG^_E@ArCEw8Gae9rl$B{`sn{S%fm>N+WLmn-wZY@Ge0)%2licwov8A_SUU$|Kjl@??0CH z#5?2V?d20~+j?eSv9)7p{#aKsS(;Vev-o7pd%5Ph+#9=BDczzzqg}iAz8ls!_x#l@ zbE)agjiL5rxTNg!q1tuV+%~r1#9XV-F{pfLafdr9O}|m$C0u;|Hf?(R^0xzu-7oz} zea3zx0{lmnzmWamn3OXHta*Vo`W%LVE1@+FW6O1&I$|QIp&c|~U zp<4k>QKnM_xD!U|4;obKT@{{B4s>o0@ud>?$ou z^sipGF5WVciu7G{!|Jkdw8rgi?ab6@-|gBqmMrtv_-ltdYwSwRu^T4>A4+C}7j|rK zy0GixO4av2aJa`m`icYB{`BduZB36i`+VIOtzR?s&Og6z%eF&K9{RZ5@{gGMIlr}MvKl+=SC!}u=7PceRvq4z&4 zzKNX_qien4$e4o6I)qu7N-+zINmUp|NRf#kNUKD3D>YS#%495DrEPp-t*_2oJJeAf zO0DUs?nwArY8$ppry5r6A9b!-6>09NiH%flJZO8St7fWq{cV#wPo4R?a{D8hBmF)5 zFFDkoTsPM2sq1gv|JB25ZhPBZTlzN-HIy|}UAYfo-aS;kuGP0*ciK8|@q7vgz8zRkYJJRih4 zH8-A*;GEwxcV#owhGz1#A-(9U$md|uLTSvd#2LzJLh{UD`LpMlSpFU?fBYel>H$(c zK&l5w^#G|JyrTz5^#G|JAk_n;dVo|9km>;s|J-JCAz>%AGz8^R9BHC6+CZv+|iS~;q`yW&4LUoAG!+#N|*FUcG zXK+dfcyALuUFg(^{~9|eTWcuU8I43MDm-3y!ZW;cv?)}oY}P)hstR(#KV_@z**w}< zH&EkM_nqmc`mB86vx;*1bnoT&UDb8X{z==1qwR5@UA6w54H>QV!*jd#rPBvvLp2Ap zhxg4lTal-H|Bc>>i(j)z@p%qLhY|-a6{YX|34RX0M7!fb*zl?>ht21c(d>*Al=!L1 z$+vUtyNp7?3|yci!+dsbxVSy^3)KT5LR2XVpB|39jIZxfUqyxQQsvVqAEK-ehszZ8 z$~lKx<5HhBGse&Sd*Ad#x%MMGdoy4=Xy1=#pEsY~wDXa&ik=*j*$A+aF&4#-`ZAz~ z^iq1WnNahTtE|j5rPL0%%AfMM9qJmZ50&M84x~>zRclw5RdtqV9f{Vak_QQE;oq=6 z3|LoKCM-|UR$^ohwcw1Eg-$~>leg*?AO@+HLXcCsmO`YLLYFBubeU4&b{MTx;WwcVAVl3CXqP&s@CZa3qZRa}I`Hxr&z~LVjZ&&_YTH8p%&K@1@jA*e~|Y z;ymJzIL|mG<9ARCKmU8*Gros>lhxS6>%VXLl8rU^RGq*4H5f>b<<-o2HM%Kw198Zi z0B^D2D68&SAc>?ErW+{g&8_0I$0$_`gwiKO+b)aW^SlY?EFwVzt2Cqn(aT056|Zda zB~+JOCLHO^HE6C83ZGP6SA-+V$6%eRJ85?>AC~k%kqnuiF8bn~A@}pz>rEW8CWM6j zy@V|&8vh7egjQX38cafVIhMUBDITRon=be&yjKXv1dhoZluVNnqaX4O)^fW`_Dp*U z&CHcJsyI^Ov$?s>Pa;TWv6b z+zaH(68y_oj85pELlEFiO*zgQ_e)`+Tw5TsU)}kDA=Ll8NBMW{P@Yi!?Y0fCP~Mm) zyI;J5d8{f7GIAYsBbR3fJ4MS{jB?j5(@YHghdZTaybAy3&VsAhtQcb&F}ZJ}`Xb{r zQIB0GQQhWcDlY}7)s+`3gJgu3)7PX%bwWK82X*J^E(T%ebeHEV^8Q zXqnt2LWhJ@%y$E*V`^YK_|7c8gN#ai=cN7}xYJ z_F;IYJqAUZ)mp(NV1r;S3s}!>LiC~L1!P|>`eOi)(28v(&A~DBf9kZ+B*C2y*n~}3 zMEMOe4IAR4aG9`W$*ZJ&l$A01v$i2M6mJf64*KJ@b-{{}O*=P@RUp{4!;^U0)7jf! z>FF7o80`-YF9^AgVI+D0% zO~b0mvGH;B>Vb6~fl#6`9`w1|riKULRIV8t8|m-x#3Qra@#&eFsj=$%Y;Rv(O?N{m z*_L#clsKu+gV#Ggz@7>g1{%SJqV?K#Tkb?Y=)cI=`wl@vW>w8Kpe88;s1bHUeD%QY zv_?q5HJCB8L3Q4OAS9jH=xfoOXrg7U$s)p(Ch_CclNk5bDeN^|iV7OmNxy>(;$d(K zcMmL#NzIW^?_ zzHbJ`2uVK?d5~*9WbGL!_hwerZ;E@%2ej|wkG_dOYg3)8WH zXG2w4aByOxs&`eh+gm=tEGcxzQw9g810L;imq*ci<|&iClO@h_hjvA-jh^yAOM0}t zI^yJ}{x6SmeOc7O6c}7q(AJwq&&Vg5(WmvU~Z^C}IRLXon ztPhAK=@^O{$%PwhZd!Pa& zoEM?A_EmVxYf|-zP4TKB?Vqw0-t0u6r72O4zt}}^_bEv!HR*<`(%{heM0M|~CJ!h@ zq?}c_l%bk*T_6lv$@Lagrg~SExGEg^QxCKnq*Ci~kyHi*sZ=0Sjk5Q}1>3DJ{nGI- zmJ-_sU%Xd2Dde%>1?=A;cmeD)_IKpXzss1nd|&;IoY#&B-eFw-9bPYZNQ(28OO=nF zMz?M&`j%1-ac?P|v_724yrxY!lN8DQ-zjMC^qcQYX7KLVfr!eiiVA}uFQ8wFF znv_k`KBXRQD4uVTICpSUAbVfaRE>FX%Ab-PuS_|EOYnaz~)j-@ZCi zH8_|>E&my|B{<; zNo^WPRK{!V_w|p$o>&=Bon0IIYs=8LW^u2XfuTm)*JffaU&y(*FK_m%t2P}9bu?8* zTQku>PkZg~MOXDMKF$lYufOuT%Er!ceX6=by}f_xIgl?1vI;WsQ=s4d$cui1>XdR& z@=`ZGrjzG1>XRFkn*vBFStt)jK*6Knsk;TRcVmXYrVZs%92t^y6^=yONgVl&*Wt+P z-k76woz_@L0BAvus8-` zaSX!Z7=*aU?WZeG-ebf6V35C@dkB(+SDLsPg^VhTUV@DizXDB)qf z@Ec4#zHnntgqD1L-G%za8k*fba_z9H7%M0ipLzdor_)$J5r36^M@@4>cKL;b`tSI- zrD+H&YVp3S-yF%U$Wg6k)7JXN+=84HYwQOuUxo4;a~&zQ4u{*PXpiJgMaw;*aDQie zLYY}+k$s}V6N>bArs}kR7T-~R>3`T*x7su17Y0hoE;m-}56~@@Yp?mGW42wkyRcCS zTXre%-1srMN)T%bXAJh1aaFQP5!W6Q-V|ITT@eq1$+ ztJdbO+KPKKWo`kRl$N|0t=+kGxrs|?Q{JkZ=fr&8L{VPa8eXv`?}~a()N>i?>r$_w zYfk7*$b|$#`vL5~q@SVQvPn?u8Z4J-!PFJpS#~wsgt>BK36iytay)N2mQXpCP&t-RIhIg4mQXpCP&t-RIhIg4mQXpCP`R;$%$rauu}wMSs!TUK zc>!1V5Z+8ae&-osU2&KEEMMyQJKN&6Q=o6|ua1{cwj59%XSFRWb||E1X64a>bQ(pX;2ab<-)*@_ zXw%K0RYt}Q;9ANR_9`&W_TgHVd0Bw4l556zatLIYFULP^c3W z>I8*4L7`4is1p?G1cf?5p-xb!6BOzMg*puiHE%)+HMD=jrV{}rQg^BZJEz-$^vYlW zDW|0V)QLIjPOR$PkB4Qt6+ym656Rt+xjC^r*oqj-QLz-a;ri_m3ysp`vz(4(Fz^Dp zUS4r3PDlBp^rlK*b5Rbx;Dm=$hb*sX;S?VK}d0;eVkYo%bi9aMs#z2xW3IV(X zY`z%t7)LO!!*~4}XEFHzQa&O=!rgtESK-~QIkM@AyApSk^(6FW2R znzmR~b1Y!L%{Q_0=&<@odSkY>J_<$}u`+ST8VRVO_SwE#U00X0vQ|RiukE8bs z7)o5VS)Ye(W2-VLb5x}Q%Mgl2!8b`;tg==0GI27J|I-4fZOy`+1 zbiy+Y9y;H|1najOiP9rbyIF&x7TO~%9hAK6Tr4ad5m-7R1`$Po{|N9O0TD$&L=j*w z0wRilh$0}O2#6>GB8q^BA|Rp&h$sRgihzhBBqA5I=i-~t(ou_-A`gq;NK)e8-8eE( zm%4dIpXhet2l);ii4yxCvnDXFOG ztWRv9S>tJ#HDCY}W{m;uN!_f`H#k@oOE z)~HP|bQ@;2=Om|I#M+dLMGb&9lZrOysdsweOOy5JT^G#>om&Y(X~*-*?8VK%k`$DT z;g{{QnR|yKdNOS$4N^!$Ur58ik%mx8W4Dq<>~b2m_B3Lb(}-P8BX&8B*yS{0m(z${ zP9t_Xjo9V1WJx7BiC{Ei=&{RbnDFrv*cX+7TGIjs6rLn58W#$?Z_60MLCiB&l6-0e z$59-)%2wkzisJ=1&T-IWMxRI~RFdoyHhi^N9ts1}L@o}D_XV!7rIU_PfAsCY-Pd=3~46^9^pwj3m%i~`7Ba~k-!O;3b0r> zB{3`JY+e|`PxVEzgM(4>0T{v!^Jc}U(mGJ??wLw%On57@N^;2M=^qQUHPw~#&y+po zb!ppLQ)3m?VVJ*bVg8Q#>-(n?$_|%T?e13b@mB_?Ltf?1+~1$?n z7}>3spZ-zwWiEeR;+PY<#1Z@erET;`1lkE?f|w~tNV$&hOU@wcv(x(ca-3l`uHiO_ zoPpe6Ic~o!hySDTX$zEl_nzvH^bgTXmaHlb(M#4h)lA=q($-($an*Fzc^ey(Ubxtl z2DsQNVyT25PPTHNYXB^wQ+2x*hgwp~4&fta3G=w-rl}+6=uwh|)#CJ+x-vbN)^Kb;w#(= z-hHvpGm9QE zBVn#RE?_>ORI~S+75-|%oT2fI@L@z5i`rQMiw=AytHsOpAfwHwxAfxeIcH`r7gbQ` zBzQaXFk&`i(Gg%)&Cn-`%wI9y1I5#bRRxbFHFXajz{>#}C;A0gS_QgTXO3ruQABZE zm*BtyvnE2bKr&1H$ZNas89jE~#U;FkB8H8A2o3_a01P&@D*=69zXHTX>?gaLe4c7| zd1GYcquLi=4u^AdJEvpSJyj7!QTophpLmC1_{$a$uhn5`S=stIPa3p+j)7*ahqOU- z_|az29t!QEl&>Sy@ml5YuM9^b;VWfm)X^86wjaOvfEgU82eD_*_^m%3&5uwM{%bz> zmqh*$i_=0swEAq9A%CdDa?=9%0IN-&lMCc$5+RshI0ivOz+VaQNW!eZkxQ0yq!-R{ z=~m-NdWhm^ELDCcmnjr(8EbGBOjj>iqE*O1(*Ax*`!2h6{&0f_=~x?-_Fw;6>6vwV zJnmT|E$J^79qPX=9xCe8S-1EX>U={l`*ki}Ej|S}@IEQ<#S{ORFUs-)OZnp8?eclG zyY^`x_M<81Z3ozt^MG=Tg7|#pmKox+j*Otyk|xAph@|#&7`I~FjqwqT zPh)%)<0*`1F@A@kSL-luqMIG6V0OSyAQKfeWpjp1ghNKmWfR(D?b zy6tw$%d-y&Tkwr;tc!8Wvt}+Friv9J&@UjE>`8=wgrVr~aVSQE%9*JTkxJFR#}(uj>x3Ak~PV zYcW=aD{?aq0yFv5YEziNDk4LxQ6=Yr(D^HLKSAKueYS{;c zL)n9qABq!JY~bf~39aJiKZH|Qe7;Yd$Q{uti0u(^-OikaP!B;et$TCC=NvVKM`4WC z7m*K($cIJb!y@uw5&5u)d{{(2EFvEkkq?W=hehPWBJyDo`LKw5SVTT7BA>B{%$w+o z$cIIQpMW{I4G0S4XG9prGnBSjZn|(%#xQU?mav{n0l77E{_mLCa+(p#^cj;~p_ zIuHIOIPj!7H zUEO=n?>zhSoDbS(2Hok_0)6j#WoY4eW{E#vd0HO*=#`W#>~Q;ZMUO9MXt1QwWv<`( z4xt>A!jnqMasuEOKd&JYEs(qg2Uhy6TX+|_J8)eMsZX(4-qCI0W(gdHt zABpA-@CS3|bfh$L1poY^qHz{m2?}p+65cUqZdcFCb8k@o;zD|jl$M>tTg2q(KYA8g zNRnzZyDMC`>EioI7Syp9C+wEEt%-nQiitnOHM04((`-=W=|rEcyX9Ff<8q>>WB4w^w4@i6sSN$VGP zgvuM-5p|V9#)r6y(FqxE#?&v!D^T1FS{^XalQxL<6@4YvC2zoK(Z&&{O~&J-dK@Xo ziDJgQ@Ce!(#wn&kZIr4h4G1dvr&P%E1kIUX`3Cey|6b(wkJV;Z_dW|neCSguwRnsQ z)B*g9b{*;fHYFTLxP`KSrJcQC(~9e57DwCgw7EFoRwPpLHTZBQs00+CFH)D+4jc@F zD64-EZ)dQ%nKitUa4^aR8>DHtk;03w=W+h67(h$HZHuD8;L-xOB z#F(eC1nSHs3WI%7T9G{`v0n503`d|K%a>Q9Ps=Xz=d>*Q=j`%Qm!0Rhs1DijOK2%lr3_ z3tIz?=HGb6GAC*y<%OPXVUdq`VeQ4=Xw%fWFm17a8=5zZS&3AmOtorfkcyMV>Nen2 z!feTVwaTSvms>(|$qZGv@i=E9&Y?gqJ{d125E-fDTcB_wrT>}mO556(3V!ktaqSIF z*1&Js-xQ1X+Y`}Uf_l&(8^Wheo4dClSZ0p2RYgjQ>w1dj&KGwD3$uN_Ug0l=w}idI ztNC7g`e;X`!CqCUT=UU;$|vURx!yu!Wu>vuo2$GxCsdX1xp2MmR!>rn&v~Ic+>GZE zy7*73X6OL>gdFZy;E|ZMctS%_UPB%RfO`vE4cAeTD)-+l!V_Br|J@>Z*A^ikU=fnn z(ME>%lCc2%7OV{m)`kV5*Mh`ii&Xi7y`1m|tq~X0b6(Q#LgfoIZTK&`qGMecL;RSc z#anPW*MY>}9>Q-A;kSqI+e7&6A^i3bPA~DfW?E9sG4f)Z2H;-|x zi>s8P%B28#?u9&d`CKAmiD zsuprT=P1uqI|KfdR24S5_XZr^?8K}>luIm1FDSbE-<`pd^dD4@G!__jsuaB;F+I=S z?icGR2f*%IWMMEidRDSsSc$wskD7qVJ_8D^pSpiN<_) zYjx!3U(WTGmzw>{g0{p&wNj}~%&m6j27|R$e^+^WTD~X$YyaVFYhMCvp*BYGuc(c2 zB|J&ZO_A3NDhKjOSeP-lyl*hoq)^{h*aMjTTxfqKjBCnOYNA(APFWHA>#;%@^azL3 zkCrgC5~VO7DXvrqLn2@5)JoM2v=B}3KIP)`1?(qCw=cy-kxD4~5U4m|ez`(4{Ro_x zW!DLR31@m;xTL2*tX5h1g_@kYpx->U+>l%^Rj4%8hm3}W)hK#v#-jBTk*~zopeWu& zo<^yVgUi6BsOWMGl3=AgMe6iMC3dt^FIu7F8RcMc@jmWyMY-5RLk76mWD*0CGhS{# zLj5zSo(~Ia90!|0VlIyk3sVQxK?j3Zhoz`P8io#O7&@e3=#Yk?LmGw-X&5@JG#%0~ zbV$R{Aq_)^Gz^`Th7o@fso;csv8lL2nj&%rlHo)Wm3m%MUI^WrU91tN_Z)c7!HY?_ z?R2HNf!-#(RF_@XQPN!?SBJ2f8C`Czr-BfrS!k|roL>z>r61zFJV!MmQVoY{4Xf=K zfSy3TH+Efee0tva8}KXe&!3n#PPHIxJmEco_v9!=505pdBa=SASG9}v@F+zOkJ#}u z2_Nv^MGueI@t;WNM~{x!@t@K-TYG*QPiPg;+lO`p;{J?A9L?V$2en{$&ehO>{R=!C zap@az#YK+Fda^8v(s05Kmx%;#314hI&H6GTa6WUvyT zsNgMjk9n#Cq4t9wTnIgeIR3A}>HPg>7#fQu9U{9_CPl!hYrHdoraS-vHKvF6GG7r-_*;_3;vm*f>rY^|TEw!y1pF`g5&I*Zk!Q!64b$k{zYPO8!5 zb-D6{I%EfN%zaC@NbfLtNAfL($OZOM#fZUTO-a%{xpt#H`)wuWNpbNU@c0by2-!j% z>L@Ep0Se-2B;si#LL-1>3$8#?LV;;SoC^z54{^q-m2Yj-Ig` z*Ao2&GA_lal{_HIOWE)hq0CqnB`{LZniO>&4KyL*%h9C9<*9)tHPEC6n$$p( z8fa1jO=_S?4K%5NCNIK~W5kvcBn_O$lm-runU|XsuEi zJw?0Sc&)%I1;J>gR*{@6M(-QqMM}Ab2B4vyAFX^T%D~2#DJk2Kln=(FL$#@I6 zh=hQq$bd3%fW!ijSO5|WKw<$%EC7iGAh7@>7J$S8kXR&;Sa8TsLLebV92*}c zvyz%&5j0%55GMnW8&7~Q8d@-vmQqJLF1!Ja3hKtk_HVdsDffKgg-m<(!3Enp+y_`N z#7M}Hfs>V9{A;B@cE1P4O%xdfo486tQE0sbv?zXr^^d)+y3j9~a1s#8QOSW@BfFsn zw^4xGD2Un(#0AK1KzA{$7$+=v-dU_R>S+oo0(5x{-i=# zR-8dH$ix=#`<{Id_m?-8q?z+apBdOr?&bmj!JW$ zufX_Rapz>K^4TaG;HpPI&EZ`N754I)#vG>nadRk6nQYgHlZpXK#^HOHNfr*6BAXx4 zvPpzx^V!W0C78?eQ;Xv+5Lq^{OOQ1=LB`Rg<|)p|{P;N%eo&K=7V2>H6nd7f_vMym zCmT#A)fRn$HGS1n{+tlEI#cSTYIknkSlZXMUNqf_B3t?ZDjoMc|s zj=FYfttm9BAJW=Oa9}^D|G?U-6$CD!Gon(NpafmNWEiMmV0>if|(BzXtK zumH6bj4msiB18EfJ$oPScQ-iFEH+YYu%J{LY&;=0Siy8G-Vi`JbyS+zLs z0@1p&LM0R+ksm#n!9QE{VsLpj-lJ!QTYMZ_w zC%w7Dv8=$DRD-q?Nyb%A)#QXiwdS$4%A~l(Cj3RP0o_Tqu#Jw{#>c`-rS3Mq{IJXx z&LdxU>KqIGf1mVJ_)V1Li`w+{S24)qt^e!D8&S@cYn%a#^-4vL1kZO_RSiqoE6 zUpCg+M2cCFv~+2b!knUbOO|1Yy<2)*DNkh-A#sG)QSHHcsv<7e%D^3F;hv~<2I;wI+s*E)Bq4R-WQqRLdD~S{qYG>y6rHO~^Vo0B3PA%zJQ!hMF+X64$lqOYMS*cCc2+zYw zms<(fX_vdDJX^aSWjG0?7t_^YtQmd6VnrJ7+Z6zo&%)uMgwKoElL4zu`5E=deG1sIY0IY>8QsagH_FB?2i*F;@?L#Y3S7 zYP*c+6}zo29HH15iL^ARvl94Zw zjC_e?VPUM%q63;}rDmA+}J3r*MPE-wU3$EUlRn*`qNSsJ4Yaa4l#(SrzTo-UOmYLrw ztH{r>)mP>k3w_nW@kV>V>0UJ)&MeGZy=|si_~8}Yc#((A7E2jYI4F+tE#}Lu5}IT4 z0jR$NIVs4qN)8qRh7pgb5Lhh2imhT;tip)Qh2rvk#Rdy;TA6Gc%klrS5ETOWwxp(M znQ21#xoFtWA@HZ}-mk^oWMcYx1c|2{WCIH187jbqPRoT_?#Uq= zm%4LMje{j>(j2*t_>2*;Nb@94>W?EHI_xKKib+lp1UN!;-TM*KPIh(M}J%$&q#)}e7v zOg`=;qI8rjDZJQiq+*M_M z5-7z~d)!+!I2rIy4ORs_m9^8_Tu-aJvaQ0Z-J!P@n|;;)HPFSBhp4+egQ0@_y1^=M zOfLC<12E-v;4tE&f*F?_%1)h4yVpVW1_0kE;qPcvFQBC*zd@E)-B9(OQ64sqB&V zf@DSMmrgDh^FZwx%AwTMsYn{?C{Ry9H57e(577^qAlNAcp^7vl;kY;#8y z)ihd-rWL3s!G+xd{#lstP3gXtmT37Obir6L^P)FHj z3Js+20WxuL1rRrs9LxRYDH!9qj`VbhPf{+4^pv;)a)z1^iJvF7&TE!F*)vl?k{_9S zj>;j9tfF#=4Z;|@t)p6O7mDxGlP^51G|jDztAlXQ^(c1mQF>%r9!iuDZ&Aayk6u(P&kyR~+-tAtrP z@M5B{W{}jUzJt|$&;ZqaB(wUCh2zun#%Ui8{`nL0#;Hz(jiXoRHh!K+k{Wv(NaMP_ z>SUIm;fwt5dE;k`MSl z0JY6x(4GX3!S2g~GyZA8AkQ z=oThMyOgG{TrnHzyyX_*&ZpmveED49tBNP}`W^Uh=f#A`|4B6rM!r8_Fzm*E2E&k$ z^S45xUO$MG_F`lZ*9+MZ{WaHIqY%(UJaX@bYc|aNy`m&CDW}^D4`EQ)$p(CpfOs^9 zDNRsbM5d1VU2#r*2|Zi~q`Yj>0lD8mif}72LTVS~Y1hNjhW1h zzt8yhlaZ##o2Uw;>Ok{Pjf%gk6n0;DR(LOvtVk1YPSqx?mTx@rO4;^`3%^i28H$w1 zqrw}d+vwhfi!Bis;T(!gA9-D}!9aMPI8-n@deu`FWaWExs}9OQh7nxq7 z0G8Uz@A#t+mCwny_EDv3KX8wI>eWYZU$qH6a?F|vSpDn{sXGp3%woQ9Uy{d+WRn~T z5i^L9tVmv5w%si2eZL_1(;!^3fGc{FYI}B8&6->1-`|CQvSjUwv`uGcWo2I@992AP zwM+|VR2P&vsUIc8-RTz9^o309KY(h3Bt>qjs+k@8E(DcZ`6!#q1Ycx@`m4C-GOAC7 zw1tn8*nks95O+AD-2}K2QHDD$Cxnt+edX(CljKWNcb9iAubk6J;9D?5--)c)etf+z zQMLaXwsmaNyJ&|{N7U?6UJ5v{FG;M8aL7z1D ze-&*d{OE9!UQqKHDgYE8t~F|2Q;7g=ZqKUCL!m zRg@4A89ZP`sUd#>#w5;&6;5dU!JW`nILxeITvqUJE1b|)IH9d@LR;a4w!#T*g%jEe zC$ts(zzQd{6;5a?oX}P{p{C^a zyeiP`Hf9&tHIJ4D3l`O`y1sqt)d6$nmWXykW)><0h3UE-J9agWJagNiaMP-XcZBjP z0_MC5n_hUXxMjRrv5_hS2b(VRVr!EW+GgFRSB2%d;1z)AS&j9O^{1QzCekQq_-C5~ zIVD#HKdlQXIWn3P!xRQ-4zikO9$gt&T$!0&kgqvO@JHol$K;CxsM4JKEebjL9BkRV zy>aB^b=@ur`gTvAfkR(q6{ny(Mo4unoC1j?6q-&uBq)LFj5@4?c*ee0{N`So* zV6Oz&D*^UOfV~o6uLRgD0rpCOy%J!r1lYx%cRCzcKu(Yn_2$Kw@ZinkD$?^6d6Dpp z^aSJh$y_9s{~WpWVzQ&@AW>=osh}=rrg} z&^w@Wpz|QHs9!#bSdW~EqA2_X!dgutk7qG7J7yFNpU0Z+@=VSWsatsZA@ndt?6{8-kUCJDRFjjtn~IGqVjFwzu{kzkaFk zn_b_!XP|E7p8CA1B2$s&t$a`WzGpTHH+Ems$D~Z;TQWxz-jHCFwRP@X|&YE zXo4N}@mWVJG#0D%5D&2@P5lv~$-Db(vtrZeqhz?yZL@(ul33GL_I&jq}iB zQ)owWYX_@q2LsmJnt|%Tvf7-;RH`{U<*2bR+i=I+>&o=vw#nXLPpa9P@*rHFX_*-Z zgqwtam&SK1HuThNI5IkZcwMz`?cK}Aj;!}9raJabR98>z>*&}!?(>cBRs1H~U1Y`l zr&SDffAmkP?Q^$<4qUr=soNjOau;W7_G!}bhVm#9sFH?!7itvA^#`tD00{LFm*8n%Zg!aqDY>1nXCBb7h#Gfx0vx(|vpDOgB zoWlNabB|@3XXk#uje7NLQzXrrGZpKkjY=~zry=8WQ8OptrbhS$z%p$y66{zleLNwamZ8?pqs-j^D5TIw2i#k1yl%LHK-D zCVc-a9*Yu(1Ti>(u!!iWLe!(r0*5MaF&aas2k<7+t;was_j)ukeN~Qj`0x(ppV8~; zC=b4J^lD+;Vh~eCE0&B6DHr>4;jBM4Bqdd?UpCqhptbM`CQmG6KYzJELv4kx`oA{8 zV&S{yN1g!+F$}N}LwlkvCnF=rmKb){1;zLR=F}dY>$hVupuzsnA~s&9abO^P@tn$p zyc%PIL)ecwgQQKU1efapLM8|$d`G(Z{7{9yeNN1*4Kr+m6i$K^ZlNmqB#5~r@Z}_= z$6%0G$tQtvq0#~0p?O61Kh{`j6cceVZFy5@o;!xVpFAH*jeMxjt|Ei-q2!8;S{!$Q zC?ASKqhPmOALxY0u)&_f~6Lm|*ZA<#o1&_f~6Lm|*ZA<#o1 z&_f~6lUPoMRuO*^G2up!gd5~jK>H%6N-U4&Ni1R#Bl1&}P4@Op9i3Bc`Sco|YP0{i zU1&R3HQg$_a~Hp3+Em6+9(6Z^v2G67=Mp|n7G`CgFPU5{>dwY`R6h% zi?I|mvBSexx!?i(nCGCdXSiG46>a4indSWTF88uM-Q9Zz%iYVa?djRm?|RC&qO+{5 zbA`{llD&FcW|ny>m(8@c&J20H!@C&o^C}gJ=aB11xYz$#p97W!aXxV!KtGTl%%5ce zd^{Evg_-4T?uvG44&0e{xCb!@*ABYf%Vv8q2W6_7=p?KNyUM~Vs#^e~kY*JILF~7f`i1)|tQ@RiJ@#yc}5c^zW z#t+XMm(HivoroQmpCjGRC7vVX2fvQ!`>)4dKgpd1@4p@Uz8Z0F_P$n!@5MZqKIwaW zT%5ld>Hf6w@6$X*-&Z4Uu2!?_#qY`IC3z=4H#Uy*&bwYU)oOE`y(b`qA^o2GJ=Abh zXk)?m5Sx_l1M?@(6RYuN=hN|df_#na6Xk2G@LlQvse+wAS`^j9@qN=E5%Cku3i%kR z`|&cCabs#3kOL{411X#Xr7Z{CI7i~fIpD@Q;KtwrC8luZUSMYkA&5`myZypae5B?3W-KoImh z(&skfU=N58l!voW?IzO~J};L*B(E;&gcd5}F|MRj>6g4N zet2E{@VfZnb@4+3^ux08!|URQ*ToO7iyvMWKfEq}cwPMPy7=LB@x$xlhu6i=)jJ&y zEFdSS7Ssje1uNul64l5iTvHQNt|q9FO;977phh-9jckG%*#tGR32I~$)W{~NkxdYJ zO;97zLJ@QxB&w0|ClS@iri4xS6jLKjv}+#zT>^{L$Y35AwF`7D3P!0+9nIC9y>9OU zKss`=tl9Gb`QwEO>D)2J^TIE;zZMRbxT=FK^I+*3F3QV_h2@q7x~eks=9@`B4M*IJ zUpf;)!WYRVRY5_f*@U79Jkb$(awtWCp^h9csO93QL;eH)pnpM-h&mro=L70|KpjrU zQRf5du#FXL63T&)BM@=5)dF(0fE=olKqBPgPa;CD7LcnI zA(slvrG&LL;5Ap^b7*-)T?+_>=v1a$05s)~@@tp6Z@Xz(ctSQ`Iu0&xA84q3N@dH- zdSD^8BF|@56kGOQ``22VQ#NR}!N76aw13|kxJR+b>Q>qofC@licmnSOo)VgcZ(Rye zXA+vR_a)V$>+sslB%%&hEpSHD*8?bh1{iCN%GW;%V`mZZRNyj6;QkNVSQ6;Rp^ezu zr$-!dv;P|EI4dJwHurnwKQZ6R5}}^dNG@Ty)P*MKY9XnZ0REH!{*(azgpY9klmPz3 zoG*mGB;bz>XnZ^o2U(y}P!Obo6mG|B9Ybw9i-?Fl)Ew|qqe6%GZ*$;V4t&djZ}HNd zalC5q?IuWF{%z{VEAPMKCmqjE*%GwJuL7=Xf}CGcw}`Fj!Pdxo(Lxa^J=mHa%S;cp zpa)yigRSYo*7RU&dayM;*qR<}O%JxF2V2vFt?9wm^k8eEqeO=T3&;to1$BYc^PT9P3h1~dWaiiQmie}h*E-rJe9h}x?f2>PD)Ka$ znVA}wbJUv?^4V)wT)Y3;6}1C5Jvlh>rJMT}?|-Df{+i{rHOu$5PMw&nR^&BqTeYk> zt9!#OLnAkjmDjAl>%#U7S7D|?iT%Oz9chKtg#~TlB@+i&K@Gt`UOHsn;76(2gNZ-`u!86@$BJAa3PFQu{?t{b;zO&@6ElrJE z?pnI3_tp({bsKK&ZCdD0lk7#zp`e8&FEJmc4uS+3?XSF_uqP-T@jIm?<|7Nzii;(SDT z6+=zM#Z5yM4eq{BVPUAxUA)jsB-`Z7#;0ej)p1*%*3!!6tbyn2f#m3&LkILn^OdxS_v9(0qC-_>TM^4pn;Ck3u z6KhF}wWP&b(qb)Xv6i%0OIoZYE!L72Ye|c>q{Uj&Vl8R0mb6$)TC63lw3gyeBCaJZ z){>U3B}zm>@)%!BnOI8{PR12b`k4jf1l5ANKx3dO&|c8zK*vGPfL;N87xZ_aUx5Aq zVyjt)0}IFrss(j{_*zmUT&Sw?SE#X;R9dVh>PW8wvqfmorV^4ADVCDD!J3+Z`VvdB zLXm7KsUN7R8LTU@q$m{sY%K4bx@%(M@MLGX5yz8)>fs^f*WF<)3_oyvG9@2 z8{{SuEQkkElG{~xPf(r**S^u%23IHoT5$v7^=F}+elT0vaD8RB{_ z_VIiVGjgy~S-W#bq4H*#Ny?n_!u7W%F23Qp&0D^-zdP~fn>0N)Jim48^9Q;#H!EBc zx7;N0&&jo?_IHH$pIS4y>4h7+yAHlEg}JO!%qc#P9b?RHnu06E4`}j&0D;rJ6KQ<>|U}suP*kF z+@&Y>FJ8R=#L~Wp>GfeQmz5FV%7QED5PpRH8u74L6zmg6MZ$QbAw1d;I1X|ScvNJ5 z&*(7T7y*f1ltOq>U@F1_jV(8kvWh8EhDu*>uFfcbY9U!4TU#!s%Q2k0fpeY}KotkH zSvxN=rCd#FV?cRxl#$A~mI**K0f;65(F7ox07MgjXaW#T0HO&%Gy#Yv0MP^>ngB!- zfM@~`O%m6NKZyuL6M$%9K%|Os>L$Q602{a#TCj7jMb)h~FdQ2gjtvaQ2CiiT*Rp|Y z*}%1I;953tEgKfO4P46xu4Mz)vVm*aB(4>I5;B5GjPkx%h2RuUJP9D3!u+nnZVaReg9%XOT9^-LW#*J{2xerskGZ6_z#C z1`6}sdFH=uzy7P+reECO(!BqxyXaN;nW;E89qoKgx%Ne!*G>4^W*&O0{n}A))Ar8~ z8my*dyp>(#T)FM_!vh0{U*ERn)g#N69eEX)bSu82cu{>EcaWLj71mI;)2GEGRf9V) z{SJJSmOV8NBU~Y0AGqQX^D}@=q1a2yf%j-vDdqt*;&+X(N{p~djPL*&fnB47T_dn- z1a{BhL(;b;CPNao62C^9g=gc~7saoa@av7qfQjugqk(*-%~v3_aT!;+2L^?_9HKSh z;Jw)4xiE_z*b56BT1QO<3Rzjnp}EGaC`^m|TV}ARqRpLIliA>;P*_s3a8GeD={V~< zmp6=*ARIZ{TfMw^X}zijZJxiCWknS1cR6+nOcu1}3PWXE8%f(K-Q-_aHqBy_R`c>| z9)lPYV_i=$eFw2DCjZJVu2QX6U%(>|z>oXrS;~$8%O{^0*_PA=gISa>ZOK8EeV7`qa*p@|PC6aAf1S^s1>5E_`;%u1TQhb*CWLq$oZJ5_K zB)xZtqml%U+n_7TKMIP`X4|tIWyvPGyFV*f0=kt5C`4# z2j@X`;6Zg@6?Nc2b>KmD;6ZiZL3Q9kb>KmD;6ZiZL3OyzI`E)6@Sr;IpgQoNI{wQ# z99Te35M|tTi1$b~D>C6X5Ypg#_UZhKkc$BJ)hM_=U zsIe?Nc}E@{HQ)$6@`Z2e6wluu`RK2%36=yR|5hio4sE&R{&lBM-n!av&2;=Y_^S+a z>&esWmK^JF7GL;%Qc~Tp*E_uDj$?`yF0Xgw+B=UeS+dw$q4+hm&;RAc=d>nG3iK#5 z`Z>1ny^T|_zC*x-l-*5r7mRa|HmL*pbU>dD)1U+A&`F#_2hM^1(*(&as64z5Bzh=P zfV~ueBn8uyf@w;DgCPZ9qk=^0xJW!J1-};n25F~9>H#YEffOTBa(12E&|TCLWjF0v zFd+qQiC8~(m``}beCce1vxyn=kb;=1P097tPl?zbi0#vyGRW3l43sB_(RJj0EE=B_H#97r=`L2R zfA;#Y6qAIk!t!&&mUF7tLs6^{j&g0`ljWUN0#)PC3x*h(%s9?-0A`%XML~sk+p?9?A;WX*EC9e(N?(Lmyw9cjUA9`v1=EyHk2?sy? z=WpNL-+AL#H*f#i!4Bb9H~-CuAhgb$7#}#Xue*EiLnGT>zP(>Nu-A3KI4zAfQ+{AMyc&r*-?ePK9d(bHlPHHh0c*Tsx7V@>v&r=g| zBIhSk9z-~*ug1llt zPkB0riu7r*F4x|hw+!Z5s$DtvElSd*TAWqZl16t{TuP&&+dICbA;U9S6YGmDYF=KG z=BjCR8q)R7OsmUg$O{etA)WJl*FIU`q?7Bs1ug`WHjkI7=`=!)X|hL>mBc5a<+EiBJUR0zLX_7Ku^ z_dJ9&-96!sJr64mBstuklB^_+HnHm}7}?P%2~!L(+yJX>k!;(uN^v!%Wf= z+7?GSXfs*-%`wp_x!0knl?Uh(0iH<)PZ4urLB9tQ(j^5d9ST%B6sUA4Q0Y*h(xE`5 zLxD<%0+kL0Djf<`IuxjMC{XEGt?3ExfX;!=gT!!E{7FOwDjf<`IwUyVu!jZz>4y0c zH*T77F)g?l5{Pn+HqXbkEiFAS+ZPt z=|;SI+afQP~pK!6C;cBg3m?1t<4|Wu)AgU`I(yP?N84%@7=n*P*+kC++on` z4SjdMKE3s|BZFZ@@AW6g#!u{SBfgZNQ7u#cE%=fn;U1p%tmaz18d^O9cRXIK#_Uti z5i*+jP6*?8C2K4;?_V$3e0rcl4^-$emwNn$9yXs|vibC|`4A??cggVQy={^IeFm_i zJ)Ee8DtQP{fk-83G0%8@)tXJA7#%ovO-Fe4@v(uUyYc#%VtDY#*)6+XKfJW>uCv>A z{pI1lck|meB0IjLfL=SMItm5-o|pDFhi`mo$IQzITEjQKjNTnTOHis_Q~nUjp&3#f zwVGs4Qp2AB&|3fwN`2>*(!J4Eno8W868DCf6KDh^dU2JwHzhqZvWxV1f^?%WgA;L( z1wwB^JVD+maU8Go1oe0d*xwP_Xfh(}9=68J;t{>e3+gSn9_lkuLr+QvC7+&@iyj}I zl#!AR$#a11{-R31R`hcEvGtz=#ayhfWd;($%-UZUmE&=Z4;%}Iv-9u($HO-V6t5Jn z*l|PK&Trne)NXyG{IQN7-MAA^Fw69?OL07Zu(o4!M`515Hn*pOo@bUhlHlpB$`0TB z%1rC-s+FCqhbQnfr&}h=S9IeMR4ElIt9mD%QBT5%&`7>1Y2SM4n^D6!6d9HyI3kUl zw-ca_DRi9rHbw4ep9g%Bd{b0aFyD_A#@{0#@yWN~$&)_|Z5Z(VVSIm>id|VmNEB+a zMlXsz3{dhTb{%DxGlC=T1|Y?cidjemg(T%Z1mzw@bzHd*LAeisGlZbrhoIbtpxlR` z+=rmthoIbtpxlR`+=p-tAt?8#g$Mlt^aqe=GRB{TlzSU~G>jj`7jYT=6qv~{Y3*XM zUQLD=ijj>r(yE|l(aXYeiDGg2XzePi5Sh;OEo;c}RhFh@c!MoP?ykCWgV7xfySjEQ zDJ@+((^auFgLDYHHp!?9H&3WmsK#hT^uBd;BXqoTcp(-f9$K zl!li-Zu2|L){3SgJn@c;=QQ1rWeh8d*0Y2OCb`aH_Aw!Ba!8s<)nAv!3S|URbv~hn zA7K^t;7bz>7!X&9ILHE(f`TBbTOtWH7L`zOxmcnxDBFIrf+T`V&W1jVpXF7VJm2ps z_0goge4T8kTiWDJI&zCgF(9UxV+cGh1YRG)qYXiNh9Esdke(q(&k&?%2+}hI=^29b z3_*H^AU#8no*_t25w}_#m_ZIu4X6_&O3x6aCoK^f#F&C{pm{S$TsgEKWEdA0#>xp} z<%F?v!dN+Bteh}bP8cgEjFl6{$_ZoTgt2nMSUF*=oUpWV;!i>=M_MmNe|3#rLcU)N zV)7TsP8IiWE*4jnBxWeJh-q{74uxWK!O|O7mGyNsS@Rcwi>OyV;ic+4=t}yx@}EsTiez(+45V~Hn*&8%A5N_W_gRt+gD$xiR=*W zvKmsC9NXKIVRxDinB7I@qPni);_kY_Wp}@}dF!i31`BG#h3+n&wQ>5y8)FY&)7Cz7 zbYS?A*>K11 zV!0r(Tv%cFFxSys(9v9sUsAs?dEfP1(!j7wVze$<4({hXc9CFIs`ffIt4lndK2^x=p5)gNL1kB zPa;Cl0|;_YKQ+om`!epCsRsn>B?#67g7tu4Js?;Q2-X9F^?+bKAXpCw)&qj|fM7i! zSPux+1A_H{U_BsMFF`Q=BrHcFRe-h^+n0sdGUXtPmn(@G~mt5_f}NdsrFClRpGz6m+Mxw6-oXy zv(;?O{qW!99hj7*RR5P#JLp$*>5a)MR04v#0wAzqHLn3jr2BOWzvCX2S`j}I2gXj) zOgu7P`bTnvTx3p=^2$uMJrhKU_HSD;*`$;Jp;OW7-ynn0thLL zK|3Kn(}RNvkcjR=e6|qiE(E&q37n}0XQFSNK}!mL#L+zvMYoJy(wP;sDi}XkkoO0g zGW8pVLy5D}1PEeOIf80HognfyO@d}Yhd{?br$DDcZ-U+dodcZ*ft6CQR6dCqEKR`8 z;U{1N*WgE~84X=7KZ>`?j4=*j5~HzJ+Cqcarc~$~Ry5cOTPAAiRy5gj8&)<4mLLr3 zSyEetojG!h`%bN$`qFGm^~7v@)%w1w<{b|VjXbce!HZ3h+GoeBhpNZ-w)b8; zQ05)p-P*Z#tV->o{gHy3`#lv)w}hHEb(LILH2Tm?TkACsjrQKWsXbNa8{W5M`Q7V$ zzIAsmUotyXon#1axQXtOcpxzJ7BI9#ILP}tbK8Wp$sRm$Hmg0D)gEb9doZh11ki(7 z#V0VUH1WLCCbOM;Fz|7RYlcj2hD>gTOm3EBax)Ou%n(QA<-GDh4|GAFg+L{1nQ%sZ z(cR3O$7}YuUr)}|7Wt!W?JObwxFjagLe^nsqiXMNC*B1|}eWv#1 zyIMI~n%CYuC?RU_)^$xBQLVd{x0|L5W>!nkTRl@ieMQJOY!W_1Xz43F=}zu{Ms4wU z3Kox6ackEcUHx*R#GfO;BV|1KB&`_LUt&{%ckFGGtj&P%;qGtW-M8fM8?$4N@9hll zeS93CL5P*==T$AZXMgNHQ{;C3J<|wT__$}z@5`R@o zc=t$U#n7HE|C+9{vaZ$S!^iU$K4djw(dV52F9Q9l)MpF$X21FuxI8+NpSOXQhJjRv ztF9D4_Hx}%TPRv6$|j+(ZDV_QQ@dSwM-jg9>pORT?fN!_@ZsRmnRXZhgIoXNb4&Z~ z_>0Z-yj3meSFlsYSo}TnCr$TEM{)NI{_x-6o)vZhHj*1X95RH%3Yzh*-2*O#s>M6e zUP}Ig=IMdT%E4)rGbZ$-2iP5~pOZt_3b{$XqCZD(5}C8c_a+e&i~iKR#qypcq81R} zPGl5{%Oq$PbO>||bP9AD^d{&X&^gd~kf;U7ClR#(?zd&B1Tj8XW*qZerV0U!H=Vf^ zg>=;;fo)H0oqlRtwSVgq+ozx0=Ko;L3%@^l?EH&sRy}|Iq2uRYSgm;Oz(0I(^_nlf zd)@wjczWHsFTQ*IgOLy4*tPxJg7(BwLG#AWnZJsBNHRI7m_v{Il}xYu@7R+h*6+`s z2UR@E$;nDpVR&=6YfHGGAUxICwWYJ*;l`Ph>(-sTrmhv zaf&Oevy}PL`E<$R`&!*TA?1qSo4(BVuABG07Z(0r!cT=eVt#LD^!N4)cgVk&SibOk zx)0|4-ty@8t``FQd(_)rOTF{?{ryCpMb8C2@nh~^>x_QyhRci}o;NO?5B)}B$K~fp z_j8HoI4E65^!?Z8UH@0(-hVsxea*L{*NN}R&qepX^gSIL7w1nAoxk|^X`Z6*Q=bzx z_3A(^(!BFVua}SG{dw1`rM(9@&fZg87jr$)?_o~@jK_VC`o^&D(frBtq&^rO=ko-a z8QI5VrUyAQ4^lgS?#fMOLWN#|dl132Vd&>(2=nyibi}fhSdAPVo`Wld8azs$zJO7~_+9l4x|x0gbqx z9 zC%M6s+~7%W@FX{Qk{dk9E%7AzB*c@bmj`Wl*+L zflh%=gWd$a13Cvf4-z$g`6MDws=>OzPp}Gmxrav_Hur5`M4 za-Z16BPovkh+RDXm#(~Ko)y4(PlfJ>QYVl1;u#O|9bf`{2be%4?0}34>S7QQ`A&$n zJSM(F9p^=E^QXtjSwtulxCr7g|AQE@@5@5OFc$NvQNtL^e;GN9r2spkFM;=7Xt-Qm zKJy#BO+|#vqAhM=E?T+5iU~Ig{f?WU4YMtikF+zi;Zp(?u&5v!X(`Z85PHf!#*w&y% zwK&d6uz%+J$HvBve{W`L_xBzg9zFWq8UH2S1d?tJomZpY%5r$QjYhgS{+4uch=

    hvG(yX}`RPDc7ek>^7A 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 z

    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 literal 0 HcmV?d00001 diff --git a/Src/views/Test/TestData/Fonts/CharisSIL-5.000/OFL.txt b/Src/views/Test/TestData/Fonts/CharisSIL-5.000/OFL.txt new file mode 100644 index 0000000000..f8d60c8fa6 --- /dev/null +++ b/Src/views/Test/TestData/Fonts/CharisSIL-5.000/OFL.txt @@ -0,0 +1,94 @@ +This Font Software is Copyright (c) 1997-2014, SIL International (http://scripts.sil.org/) +with Reserved Font Names "Charis" and "SIL". + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/Src/views/Test/TestData/Fonts/CharisSIL-5.000/README.txt b/Src/views/Test/TestData/Fonts/CharisSIL-5.000/README.txt new file mode 100644 index 0000000000..266d96f6e0 --- /dev/null +++ b/Src/views/Test/TestData/Fonts/CharisSIL-5.000/README.txt @@ -0,0 +1,82 @@ +README +Charis SIL +======================== + +Thank you for your interest in the Charis SIL fonts. +We hope you find them useful! + +Charis SIL provides glyphs for a wide range of Latin and Cyrillic characters. +Please read the documentation on the website +(http://scripts.sil.org/CharisSILfont) to see what ranges are supported. + +Charis SIL is released under the SIL Open Font License. +Charis SIL is a trademark of SIL International. + +See the OFL and OFL-FAQ for details of the SIL Open Font License. +See the FONTLOG for information on this and previous releases. +See the website (http://scripts.sil.org/CharisSILfont) documentation or the +Charis SIL FAQ (http://scripts.sil.org/ComplexRomanFontFAQ) for frequently +asked questions and their answers. + +TIPS +==== + +As this font is distributed at no cost, we are unable to provide a +commercial level of personal technical support. The font has, however, +been through some testing on various platforms to be sure it works in most +situations. In particular, it has been tested and shown to work on Windows XP, +Windows Vista and Windows 7. Graphite capabilities have been tested on +Graphite-supported platforms. + +If you do find a problem, please do report it to fonts@sil.org. +We can't guarantee any direct response, but will try to fix reported bugs in +future versions. Make sure you read through the +Charis SIL FAQ (http://scripts.sil.org/ComplexRomanFontFAQ). + +Many problems can be solved, or at least explained, through an understanding +of the encoding and use of the fonts. Here are some basic hints: + +Encoding: +The fonts are encoded according to Unicode, so your application must support +Unicode text in order to access letters other than the standard alphabet. +Most Windows applications provide basic Unicode support. You will, however, +need some way of entering Unicode text into your document. + +Keyboarding: +This font does not include any keyboarding helps or utilities. It uses the +built-in keyboards of the operating system. You will need to install the +appropriate keyboard and input method for the characters of the language you +wish to use. If you want to enter characters that are not supported by any +system keyboard, the Keyman program (www.tavultesoft.com) can be helpful +on Windows systems. Also available for Windows is MSKLC +(http://www.microsoft.com/globaldev/tools/msklc.mspx). +For other platforms, KMFL (http://kmfl.sourceforge.net/), +XKB (http://www.x.org/wiki/XKB) or Ukelele (http://scripts.sil.org/ukelele) +can be helpful. + +If you want to enter characters that are not supported by any system +keyboard, and to access the full Unicode range, we suggest you use +gucharmap, kcharselect on Ubuntu or similar software. + +Another method of entering some symbols is provided by a few applications such +as Adobe InDesign or LibreOffice.org. They can display a glyph palette or input +dialog that shows all the glyphs (symbols) in a font and allow you to enter +them by clicking on the glyph you want. + +Rendering: +This font is designed to work with any of two advanced font technologies, +Graphite or OpenType. To take advantage of the advanced typographic +capabilities of this font, you must be using applications that provide an +adequate level of support for Graphite or OpenType. See "Applications +that provide an adequate level of support for SIL Unicode Roman fonts" +(http://scripts.sil.org/Complex_AdLvSup). + + +CONTACT +======== +For more information please visit the Charis SIL page on SIL International's +Computers and Writing systems website: +http://scripts.sil.org/CharisSILfont + +Support through the website: http://scripts.sil.org/Support + diff --git a/Src/views/Test/TestUniscribeEngine.h b/Src/views/Test/TestUniscribeEngine.h index bd5514f0e2..739c6a561e 100644 --- a/Src/views/Test/TestUniscribeEngine.h +++ b/Src/views/Test/TestUniscribeEngine.h @@ -36,6 +36,318 @@ namespace TestViews } TestUniscribeEngine(); + int MeasureTextWithFeatures(const wchar_t * pszText, const wchar_t * pszFontVar) + { + int dxWidth = 0; +#if defined(WIN32) || defined(_M_X64) + int dxMax = 4000; + HDC hdc = ::CreateCompatibleDC(::GetDC(::GetDesktopWindow())); + HBITMAP hbm = ::CreateCompatibleBitmap(hdc, dxMax, dxMax); + ::SelectObject(hdc, hbm); + ::SetMapMode(hdc, MM_TEXT); + + IVwGraphicsWin32Ptr qvg; + qvg.CreateInstance(CLSID_VwGraphicsWin32); + qvg->Initialize(hdc); + + LgCharRenderProps chrp; + ZeroMemory(&chrp, isizeof(chrp)); + wcscpy_s(chrp.szFaceName, _countof(chrp.szFaceName), L"Charis SIL"); + wcscpy_s(chrp.szFontVar, _countof(chrp.szFontVar), pszFontVar); + chrp.ws = g_wsEng; + chrp.ttvBold = kttvOff; + chrp.ttvItalic = kttvOff; + chrp.dympHeight = 14000; + qvg->SetupGraphics(&chrp); + + ILgWritingSystemFactoryPtr qwsf; + m_qre->get_WritingSystemFactory(&qwsf); + + IVwTextSourcePtr qts; + TxtSrc ts(pszText, qwsf, pszFontVar); + ts.QueryInterface(IID_IVwTextSource, (void **)&qts); + int cch; + CheckHr(qts->get_Length(&cch)); + + ILgSegmentPtr qseg; + int dichLimSeg; + LgEndSegmentType est; + CheckHr(m_qre->FindBreakPoint(qvg, qts, NULL, 0, cch, cch, TRUE, TRUE, dxMax, + klbWordBreak, klbLetterBreak, ktwshAll, FALSE, &qseg, &dichLimSeg, &dxWidth, + &est, NULL)); + unitpp::assert_true("OpenType feature test should produce a segment", qseg); + CheckHr(qseg->get_Width(0, qvg, &dxWidth)); + + qvg.Clear(); + ::DeleteObject(hbm); + ::DeleteDC(hdc); +#endif + return dxWidth; + } + +#if defined(WIN32) || defined(_M_X64) + struct RenderedFeatureText + { + int dxWidth; + int cNonWhitePixels; + Vector vPixels; + }; + + class ScopedPrivateFont + { + public: + ScopedPrivateFont(const wchar_t * pszPath) + : m_stuPath(pszPath), m_cFonts(0) + { + m_cFonts = ::AddFontResourceExW(m_stuPath.Chars(), FR_PRIVATE, 0); + } + + ~ScopedPrivateFont() + { + if (m_cFonts > 0) + ::RemoveFontResourceExW(m_stuPath.Chars(), FR_PRIVATE, 0); + } + + bool Loaded() const + { + return m_cFonts > 0; + } + + private: + StrUni m_stuPath; + int m_cFonts; + }; + + class BitmapRenderTarget + { + public: + BitmapRenderTarget(int dxWidth, int dyHeight) + : m_dxWidth(dxWidth), m_dyHeight(dyHeight), m_hdc(NULL), m_hbm(NULL), + m_hbmOld(NULL), m_prgbBits(NULL) + { + m_hdc = ::CreateCompatibleDC(NULL); + unitpp::assert_true("CreateCompatibleDC should return a memory DC", m_hdc != NULL); + + BITMAPINFO bmi; + ZeroMemory(&bmi, isizeof(bmi)); + bmi.bmiHeader.biSize = isizeof(BITMAPINFOHEADER); + bmi.bmiHeader.biWidth = m_dxWidth; + bmi.bmiHeader.biHeight = -m_dyHeight; + bmi.bmiHeader.biPlanes = 1; + bmi.bmiHeader.biBitCount = 32; + bmi.bmiHeader.biCompression = BI_RGB; + m_hbm = ::CreateDIBSection(m_hdc, &bmi, DIB_RGB_COLORS, + reinterpret_cast(&m_prgbBits), NULL, 0); + unitpp::assert_true("CreateDIBSection should return a bitmap", m_hbm != NULL); + + m_hbmOld = ::SelectObject(m_hdc, m_hbm); + unitpp::assert_true("SelectObject should select the render bitmap", m_hbmOld != NULL); + ::SetMapMode(m_hdc, MM_TEXT); + + RECT rcFill = {0, 0, m_dxWidth, m_dyHeight}; + HBRUSH hbrWhite = ::CreateSolidBrush(RGB(255, 255, 255)); + unitpp::assert_true("CreateSolidBrush should return a white brush", hbrWhite != NULL); + ::FillRect(m_hdc, &rcFill, hbrWhite); + ::DeleteObject(hbrWhite); + } + + ~BitmapRenderTarget() + { + if (m_hdc && m_hbmOld) + ::SelectObject(m_hdc, m_hbmOld); + if (m_hbm) + ::DeleteObject(m_hbm); + if (m_hdc) + ::DeleteDC(m_hdc); + } + + HDC DeviceContext() const + { + return m_hdc; + } + + void CopyPixels(Vector & vpixels) const + { + vpixels.Resize(m_dxWidth * m_dyHeight); + memcpy(vpixels.Begin(), m_prgbBits, m_dxWidth * m_dyHeight * isizeof(DWORD)); + } + + private: + int m_dxWidth; + int m_dyHeight; + HDC m_hdc; + HBITMAP m_hbm; + HGDIOBJ m_hbmOld; + DWORD * m_prgbBits; + }; + + StrUni GetCharisFontPath() + { + wchar_t rgchPath[MAX_PATH]; + DWORD cchPath = ::GetModuleFileNameW(NULL, rgchPath, _countof(rgchPath)); + unitpp::assert_true("GetModuleFileNameW should return the test executable path", + cchPath > 0 && cchPath < _countof(rgchPath)); + + wchar_t * pchLastSlash = wcsrchr(rgchPath, L'\\'); + unitpp::assert_true("Test executable path should contain a directory separator", + pchLastSlash != NULL); + *(pchLastSlash + 1) = 0; + wcscat_s(rgchPath, _countof(rgchPath), + L"TestData\\Fonts\\CharisSIL-5.000\\CharisSIL-R.ttf"); + + DWORD dwAttributes = ::GetFileAttributesW(rgchPath); + unitpp::assert_true("Charis SIL test font should be copied beside TestViews.exe", + dwAttributes != INVALID_FILE_ATTRIBUTES && + (dwAttributes & FILE_ATTRIBUTE_DIRECTORY) == 0); + return StrUni(rgchPath); + } + + void SetDefaultFontForTest(const wchar_t * pszFontName) + { + ILgWritingSystemPtr qws; + CheckHr(g_qwsf->get_EngineOrNull(g_wsEng, &qws)); + MockLgWritingSystem * pws = dynamic_cast(qws.Ptr()); + unitpp::assert_true("English test writing system should be a mock writing system", + pws != NULL); + StrUni stuFont(pszFontName); + CheckHr(pws->put_DefaultFontName(stuFont.Bstr())); + } + + RenderedFeatureText RenderTextWithFeatures(const wchar_t * pszText, const wchar_t * pszFontVar) + { + const int kdxBitmap = 640; + const int kdyBitmap = 180; + const int kdxMax = 4000; + BitmapRenderTarget target(kdxBitmap, kdyBitmap); + + IVwGraphicsWin32Ptr qvg; + qvg.CreateInstance(CLSID_VwGraphicsWin32); + qvg->Initialize(target.DeviceContext()); + + LgCharRenderProps chrp; + ZeroMemory(&chrp, isizeof(chrp)); + wcscpy_s(chrp.szFaceName, _countof(chrp.szFaceName), L"Charis SIL"); + wcscpy_s(chrp.szFontVar, _countof(chrp.szFontVar), pszFontVar); + chrp.clrFore = kclrBlack; + chrp.clrBack = kclrWhite; + chrp.clrUnder = kclrRed; + chrp.ws = g_wsEng; + chrp.ttvBold = kttvOff; + chrp.ttvItalic = kttvOff; + chrp.dympHeight = 26000; + qvg->SetupGraphics(&chrp); + + ILgWritingSystemFactoryPtr qwsf; + m_qre->get_WritingSystemFactory(&qwsf); + + IVwTextSourcePtr qts; + TxtSrc ts(pszText, qwsf, pszFontVar); + ts.QueryInterface(IID_IVwTextSource, (void **)&qts); + int cch; + CheckHr(qts->get_Length(&cch)); + + ILgSegmentPtr qseg; + int dichLimSeg; + int dxWidth; + LgEndSegmentType est; + CheckHr(m_qre->FindBreakPoint(qvg, qts, NULL, 0, cch, cch, TRUE, TRUE, kdxMax, + klbWordBreak, klbLetterBreak, ktwshAll, FALSE, &qseg, &dichLimSeg, &dxWidth, + &est, NULL)); + unitpp::assert_true("OpenType render test should produce a segment", qseg); + + RECT rcSrc = {0, 0, kdzmpInch, kdzmpInch}; + RECT rcDst = {10, 10, kdzmpInch + 10, kdzmpInch + 10}; + RenderedFeatureText rendered; + CheckHr(qseg->DrawText(0, qvg, rcSrc, rcDst, &rendered.dxWidth)); + ::GdiFlush(); + + target.CopyPixels(rendered.vPixels); + rendered.cNonWhitePixels = CountNonWhitePixels(rendered); + qvg.Clear(); + return rendered; + } + + int CountNonWhitePixels(const RenderedFeatureText & rendered) + { + int cNonWhitePixels = 0; + for (int i = 0; i < rendered.vPixels.Size(); ++i) + { + if ((rendered.vPixels[i] & 0x00FFFFFF) != 0x00FFFFFF) + ++cNonWhitePixels; + } + return cNonWhitePixels; + } + + int CountDifferentPixels(const RenderedFeatureText & first, const RenderedFeatureText & second) + { + unitpp::assert_eq("Rendered bitmaps should have the same pixel count", + first.vPixels.Size(), second.vPixels.Size()); + int cDifferentPixels = 0; + for (int i = 0; i < first.vPixels.Size(); ++i) + { + if ((first.vPixels[i] & 0x00FFFFFF) != (second.vPixels[i] & 0x00FFFFFF)) + ++cDifferentPixels; + } + return cDifferentPixels; + } +#endif + + void testOpenTypeFeatureMetrics() + { +#if defined(WIN32) || defined(_M_X64) + ScopedPrivateFont font(GetCharisFontPath().Chars()); + unitpp::assert_true("Charis SIL test font should load", font.Loaded()); + SetDefaultFontForTest(L"Charis SIL"); + + int dxWithoutLigatures = MeasureTextWithFeatures(L"office official affinity", L"liga=0"); + int dxWithLigatures = MeasureTextWithFeatures(L"office official affinity", L"liga=1"); + + unitpp::assert_true("OpenType feature-off segment width should be positive", + dxWithoutLigatures > 0); + unitpp::assert_true("OpenType feature-on segment width should be positive", + dxWithLigatures > 0); + unitpp::assert_true("Charis SIL liga feature should change segment metrics", + dxWithoutLigatures != dxWithLigatures); +#endif + } + + void testOpenTypeFeatureRenderedPixels() + { +#if defined(WIN32) || defined(_M_X64) + ScopedPrivateFont font(GetCharisFontPath().Chars()); + unitpp::assert_true("Charis SIL test font should load", font.Loaded()); + SetDefaultFontForTest(L"Charis SIL"); + + RenderedFeatureText regular = RenderTextWithFeatures(L"small caps verify", L"smcp=0"); + RenderedFeatureText smallCaps = RenderTextWithFeatures(L"small caps verify", L"smcp=1"); + + unitpp::assert_true("OpenType feature-off render should draw text", + regular.cNonWhitePixels > 0); + unitpp::assert_true("OpenType feature-on render should draw text", + smallCaps.cNonWhitePixels > 0); + unitpp::assert_true("Charis SIL smcp feature should change rendered pixels", + CountDifferentPixels(regular, smallCaps) > 0); +#endif + } + + void testOpenTypeFeatureRenderedPixelsSwitchState() + { +#if defined(WIN32) || defined(_M_X64) + ScopedPrivateFont font(GetCharisFontPath().Chars()); + unitpp::assert_true("Charis SIL test font should load", font.Loaded()); + SetDefaultFontForTest(L"Charis SIL"); + + RenderedFeatureText featureOnFirst = RenderTextWithFeatures(L"small caps verify", L"smcp=1"); + RenderedFeatureText featureOff = RenderTextWithFeatures(L"small caps verify", L"smcp=0"); + RenderedFeatureText featureOnAgain = RenderTextWithFeatures(L"small caps verify", L"smcp=1"); + + unitpp::assert_true("Feature-on render should differ from feature-off render", + CountDifferentPixels(featureOnFirst, featureOff) > 0); + unitpp::assert_eq("Feature-on render should be stable after switching off and back on", + 0, CountDifferentPixels(featureOnFirst, featureOnAgain)); +#endif + } + virtual void Setup() { RenderEngineTestBase::Setup(); diff --git a/Src/views/Test/TestViews.vcxproj b/Src/views/Test/TestViews.vcxproj index 033270aa47..39044b567e 100644 --- a/Src/views/Test/TestViews.vcxproj +++ b/Src/views/Test/TestViews.vcxproj @@ -423,6 +423,9 @@ + + + @@ -439,6 +442,18 @@ WorkingDirectory="$(ProjectDir)" /> + + + + + + + + + + diff --git a/Src/views/Test/TestViews.vcxproj.filters b/Src/views/Test/TestViews.vcxproj.filters index 91b1a14379..a0fda65a23 100644 --- a/Src/views/Test/TestViews.vcxproj.filters +++ b/Src/views/Test/TestViews.vcxproj.filters @@ -139,6 +139,15 @@ Resource Files + + Resource Files + + + Resource Files + + + Resource Files + diff --git a/Src/views/lib/LayoutCache.h b/Src/views/lib/LayoutCache.h index 6dc1ed16b4..5844a57c65 100644 --- a/Src/views/lib/LayoutCache.h +++ b/Src/views/lib/LayoutCache.h @@ -102,12 +102,31 @@ class ShapeRunEntry ::ZeroMemory(&m_sa, sizeof(m_sa)); } - bool Matches(const OLECHAR * prgch, int cch, HFONT hfont, const SCRIPT_ANALYSIS & sa) + static int CchFontVar(const OLECHAR * prgchFontVar) + { + if (!prgchFontVar) + return 0; + int cch = 0; + while (prgchFontVar[cch]) + ++cch; + return cch; + } + + bool Matches(const OLECHAR * prgch, int cch, HFONT hfont, const SCRIPT_ANALYSIS & sa, + const OLECHAR * prgchFontVar) { if (m_hfont != hfont || m_cch != cch) return false; if (::memcmp(&m_sa, &sa, sizeof(SCRIPT_ANALYSIS)) != 0) return false; + int cchFontVar = CchFontVar(prgchFontVar); + if (m_vchFontVar.Size() != cchFontVar) + return false; + if (cchFontVar > 0 && + ::memcmp(m_vchFontVar.Begin(), prgchFontVar, cchFontVar * isizeof(OLECHAR)) != 0) + { + return false; + } if (cch == 0) return true; return ::memcmp(m_vch.Begin(), prgch, cch * isizeof(OLECHAR)) == 0; @@ -120,6 +139,7 @@ class ShapeRunEntry int m_dxdWidth; bool m_fScriptPlaceFailed; Vector m_vch; + Vector m_vchFontVar; Vector m_vglyph; Vector m_vsva; Vector m_vadvance; @@ -286,12 +306,13 @@ class ShapeRunCache m_msCompute = 0; } - ShapeRunEntry * Find(const OLECHAR * prgch, int cch, HFONT hfont, const SCRIPT_ANALYSIS & sa) + ShapeRunEntry * Find(const OLECHAR * prgch, int cch, HFONT hfont, const SCRIPT_ANALYSIS & sa, + const OLECHAR * prgchFontVar) { for (int ientry = 0; ientry < m_ventry.Size(); ++ientry) { ShapeRunEntry & entry = m_ventry[ientry]; - if (entry.Matches(prgch, cch, hfont, sa)) + if (entry.Matches(prgch, cch, hfont, sa, prgchFontVar)) { ++m_cHit; return &entry; @@ -302,6 +323,7 @@ class ShapeRunCache } ShapeRunEntry * Store(const OLECHAR * prgch, int cch, HFONT hfont, const SCRIPT_ANALYSIS & sa, + const OLECHAR * prgchFontVar, const WORD * prgGlyph, const SCRIPT_VISATTR * prgsva, const int * prgAdvance, const int * prgcst, const GOFFSET * prgoff, const WORD * prgCluster, int cglyph, int dxdWidth, bool fScriptPlaceFailed) @@ -310,7 +332,7 @@ class ShapeRunCache for (int ientry = 0; ientry < m_ventry.Size(); ++ientry) { ShapeRunEntry & entry = m_ventry[ientry]; - if (entry.Matches(prgch, cch, hfont, sa)) + if (entry.Matches(prgch, cch, hfont, sa, prgchFontVar)) { pentry = &entry; break; @@ -344,6 +366,11 @@ class ShapeRunCache if (cch > 0) ::memcpy(pentry->m_vch.Begin(), prgch, cch * isizeof(OLECHAR)); + int cchFontVar = ShapeRunEntry::CchFontVar(prgchFontVar); + pentry->m_vchFontVar.Resize(cchFontVar); + if (cchFontVar > 0) + ::memcpy(pentry->m_vchFontVar.Begin(), prgchFontVar, cchFontVar * isizeof(OLECHAR)); + pentry->m_vglyph.Resize(cglyph); pentry->m_vsva.Resize(cglyph); pentry->m_vadvance.Resize(cglyph); diff --git a/Src/views/lib/UniscribeSegment.cpp b/Src/views/lib/UniscribeSegment.cpp index 77176a7216..c540b40b07 100644 --- a/Src/views/lib/UniscribeSegment.cpp +++ b/Src/views/lib/UniscribeSegment.cpp @@ -39,6 +39,192 @@ static DummyFactory g_fact(_T("SIL.Language1.UniscribeSeg")); // Vector to hold UniscribeRunInfos in DoAllRuns() static Vector g_vuri; +typedef ULONG FwOpenTypeTag; + +struct FwOpenTypeFeatureRecord +{ + FwOpenTypeTag tagFeature; + LONG lParameter; +}; + +struct FwTextRangeProperties +{ + FwOpenTypeFeatureRecord * potfRecords; + int cotfRecords; +}; + +struct FwScriptCharProp +{ + WORD fCanGlyphAlone : 1; + WORD reserved : 15; +}; + +struct FwScriptGlyphProp +{ + SCRIPT_VISATTR sva; + WORD reserved; +}; + +typedef HRESULT (WINAPI * FwScriptShapeOpenTypeProc)(HDC, SCRIPT_CACHE *, SCRIPT_ANALYSIS *, + FwOpenTypeTag, FwOpenTypeTag, int *, FwTextRangeProperties **, int, const WCHAR *, int, + int, WORD *, FwScriptCharProp *, WORD *, FwScriptGlyphProp *, int *); +typedef HRESULT (WINAPI * FwScriptPlaceOpenTypeProc)(HDC, SCRIPT_CACHE *, SCRIPT_ANALYSIS *, + FwOpenTypeTag, FwOpenTypeTag, int *, FwTextRangeProperties **, int, const WCHAR *, WORD *, + FwScriptCharProp *, int, WORD *, FwScriptGlyphProp *, int, int *, GOFFSET *, ABC *); + +static FwOpenTypeTag MakeOpenTypeTag(const OLECHAR * prgchTag) +{ + return static_cast( + (static_cast(prgchTag[0])) | + (static_cast(prgchTag[1]) << 8) | + (static_cast(prgchTag[2]) << 16) | + (static_cast(prgchTag[3]) << 24)); +} + +static bool IsOpenTypeTagChar(OLECHAR ch) +{ + return ch >= 0x20 && ch <= 0x7e; +} + +static bool TryParseFontFeatureRecords(const OLECHAR * prgchFontVar, + Vector & vfeatureRecords) +{ + vfeatureRecords.Delete(0, vfeatureRecords.Size()); + if (!prgchFontVar || !prgchFontVar[0]) + return false; + + const OLECHAR * pch = prgchFontVar; + while (*pch) + { + while (*pch == L' ' || *pch == L',') + ++pch; + if (!*pch) + break; + + const OLECHAR * pchTag = pch; + int cchTag = 0; + while (pch[cchTag] && pch[cchTag] != L'=' && pch[cchTag] != L',' && pch[cchTag] != L' ') + ++cchTag; + + if (cchTag != 4 || !IsOpenTypeTagChar(pchTag[0]) || !IsOpenTypeTagChar(pchTag[1]) || + !IsOpenTypeTagChar(pchTag[2]) || !IsOpenTypeTagChar(pchTag[3])) + { + while (*pch && *pch != L',') + ++pch; + continue; + } + + pch += cchTag; + while (*pch == L' ') + ++pch; + if (*pch != L'=') + { + while (*pch && *pch != L',') + ++pch; + continue; + } + ++pch; + while (*pch == L' ') + ++pch; + + long value = 0; + bool fHaveDigit = false; + while (*pch >= L'0' && *pch <= L'9') + { + fHaveDigit = true; + value = value * 10 + (*pch - L'0'); + ++pch; + } + + if (fHaveDigit) + { + FwOpenTypeFeatureRecord record; + record.tagFeature = MakeOpenTypeTag(pchTag); + record.lParameter = value; + vfeatureRecords.Push(record); + } + + while (*pch && *pch != L',') + ++pch; + } + + return vfeatureRecords.Size() > 0; +} + +static void GetOpenTypeProcs(FwScriptShapeOpenTypeProc * ppfnShape, + FwScriptPlaceOpenTypeProc * ppfnPlace) +{ + static bool s_fTried = false; + static FwScriptShapeOpenTypeProc s_pfnShape = NULL; + static FwScriptPlaceOpenTypeProc s_pfnPlace = NULL; + if (!s_fTried) + { + HMODULE hUsp10 = ::GetModuleHandle(L"usp10.dll"); + if (!hUsp10) + hUsp10 = ::LoadLibrary(L"usp10.dll"); + if (hUsp10) + { + s_pfnShape = reinterpret_cast( + ::GetProcAddress(hUsp10, "ScriptShapeOpenType")); + s_pfnPlace = reinterpret_cast( + ::GetProcAddress(hUsp10, "ScriptPlaceOpenType")); + } + s_fTried = true; + } + *ppfnShape = s_pfnShape; + *ppfnPlace = s_pfnPlace; +} + +static bool ShapePlaceRunWithOpenType(UniscribeRunInfo & uri, int cglyphMax, + Vector & vfeatureRecords, ABC & abc) +{ + FwScriptShapeOpenTypeProc pfnShape; + FwScriptPlaceOpenTypeProc pfnPlace; + GetOpenTypeProcs(&pfnShape, &pfnPlace); + if (!pfnShape || !pfnPlace) + return false; + + Vector vcharProps; + Vector vglyphProps; + Vector vrgich; + vcharProps.Resize(uri.cch); + vglyphProps.Resize(cglyphMax); + vrgich.Resize(1); + vrgich[0] = uri.cch; + + FwTextRangeProperties rangeProperties; + rangeProperties.potfRecords = vfeatureRecords.Begin(); + rangeProperties.cotfRecords = vfeatureRecords.Size(); + FwTextRangeProperties * prangeProperties = &rangeProperties; + + static const OLECHAR rgchLatn[] = { L'l', L'a', L't', L'n', 0 }; + static const OLECHAR rgchDflt[] = { L'D', L'F', L'L', L'T', 0 }; + FwOpenTypeTag rgtagScript[] = { MakeOpenTypeTag(rgchLatn), MakeOpenTypeTag(rgchDflt), 0 }; + HRESULT hr = E_FAIL; + for (int itag = 0; itag < isizeof(rgtagScript) / isizeof(rgtagScript[0]); ++itag) + { + DISABLE_MULTISCRIBE + { + IgnoreHr(hr = pfnShape(uri.hdc, &uri.sc, uri.psa, rgtagScript[itag], 0, vrgich.Begin(), + &prangeProperties, 1, uri.prgch, uri.cch, cglyphMax, uri.prgCluster, + vcharProps.Begin(), uri.prgGlyph, vglyphProps.Begin(), &uri.cglyph)); + } + if (FAILED(hr)) + continue; + + DISABLE_MULTISCRIBE + { + IgnoreHr(hr = pfnPlace(uri.hdc, &uri.sc, uri.psa, rgtagScript[itag], 0, vrgich.Begin(), + &prangeProperties, 1, uri.prgch, uri.prgCluster, vcharProps.Begin(), uri.cch, + uri.prgGlyph, vglyphProps.Begin(), uri.cglyph, uri.prgAdvance, uri.prgoff, &abc)); + } + if (SUCCEEDED(hr)) + break; + } + uri.fScriptPlaceFailed = FAILED(hr); + return SUCCEEDED(hr); +} + // cache of SCRIPT_CACHE values accessed by LgCharRenderProps. UniscribeSegment::FwScriptCache UniscribeSegment::g_fsc; @@ -287,11 +473,13 @@ STDMETHODIMP UniscribeSegment::QueryInterface(REFIID riid, void **ppv) void UniscribeSegment::ShapePlaceRun(UniscribeRunInfo& uri, bool fCreatingSeg) { HRESULT hr; + const OLECHAR * prgchFontVar = uri.pchrp ? uri.pchrp->szFontVar : NULL; LayoutPassCache * pLayoutPassCache = IsPath1ShapeCacheEnabled() ? GetCurrentLayoutPassCache() : NULL; HFONT hfont = (HFONT)::GetCurrentObject(uri.hdc, OBJ_FONT); if (pLayoutPassCache && uri.psa) { - ShapeRunEntry * pShapeEntry = pLayoutPassCache->ShapeCache().Find(uri.prgch, uri.cch, hfont, *uri.psa); + ShapeRunEntry * pShapeEntry = pLayoutPassCache->ShapeCache().Find(uri.prgch, uri.cch, + hfont, *uri.psa, prgchFontVar); if (pShapeEntry) { uri.sc = g_fsc.FindScriptCache(uri); @@ -315,6 +503,8 @@ void UniscribeSegment::ShapePlaceRun(UniscribeRunInfo& uri, bool fCreatingSeg) uri.UpdateClusterSize(uri.cch + 100); // reduce # of resize calls } SCRIPT_CACHE sc = uri.sc = g_fsc.FindScriptCache(/**uri.pchrp*/uri); + Vector vfeatureRecords; + bool fUseOpenTypeFeatures = TryParseFontFeatureRecords(prgchFontVar, vfeatureRecords); #if !defined(_WIN32) && !defined(_M_X64) // Associate VwGraphics with the cache as Linux uniscribe implementation needs it. @@ -323,9 +513,17 @@ void UniscribeSegment::ShapePlaceRun(UniscribeRunInfo& uri, bool fCreatingSeg) SetCachesVwGraphics(&uri.sc, qvg32); #endif + bool fOpenTypePlaced = false; + ABC abcOpenType; // loop to try ScriptShape multiple times for (;;) { + if (fUseOpenTypeFeatures && ShapePlaceRunWithOpenType(uri, cglyphMax, vfeatureRecords, abcOpenType)) + { + fOpenTypePlaced = true; + break; + } + DISABLE_MULTISCRIBE { IgnoreHr(hr = ::ScriptShape(uri.hdc, &uri.sc, uri.prgch, uri.cch, cglyphMax, uri.psa, @@ -383,10 +581,18 @@ void UniscribeSegment::ShapePlaceRun(UniscribeRunInfo& uri, bool fCreatingSeg) // Having generated glyphs, now generate advance widths and combining // offsets. ABC abc; // Run combined ABC - DISABLE_MULTISCRIBE + if (fOpenTypePlaced) + { + abc = abcOpenType; + hr = S_OK; + } + else { - IgnoreHr(hr = ::ScriptPlace(uri.hdc, &uri.sc, uri.prgGlyph, uri.cglyph, uri.prgsva, - uri.psa, uri.prgAdvance, uri.prgoff, &abc)); + DISABLE_MULTISCRIBE + { + IgnoreHr(hr = ::ScriptPlace(uri.hdc, &uri.sc, uri.prgGlyph, uri.cglyph, uri.prgsva, + uri.psa, uri.prgAdvance, uri.prgoff, &abc)); + } } uri.fScriptPlaceFailed = FAILED(hr); if (FAILED(hr)) @@ -439,10 +645,10 @@ void UniscribeSegment::ShapePlaceRun(UniscribeRunInfo& uri, bool fCreatingSeg) { pLayoutPassCache->ShapeCache().AddComputeMs(::GetTickCount() - dwStartMs); pLayoutPassCache->ShapeCache().Store(uri.prgch, uri.cch, hfont, *uri.psa, + prgchFontVar, uri.prgGlyph, uri.prgsva, uri.prgAdvance, uri.prgcst, uri.prgoff, uri.prgCluster, uri.cglyph, uri.dxdWidth, uri.fScriptPlaceFailed); } - if (uri.sc && uri.sc != sc) { g_fsc.StoreScriptCache(/**uri.pchrp, uri.sc*/uri); diff --git a/openspec/changes/add-opentype-font-features/.openspec.yaml b/openspec/changes/add-opentype-font-features/.openspec.yaml new file mode 100644 index 0000000000..0a064c1e4b --- /dev/null +++ b/openspec/changes/add-opentype-font-features/.openspec.yaml @@ -0,0 +1,2 @@ +schema: spec-driven +created: 2026-04-28 diff --git a/openspec/changes/add-opentype-font-features/design.md b/openspec/changes/add-opentype-font-features/design.md new file mode 100644 index 0000000000..eacd53afec --- /dev/null +++ b/openspec/changes/add-opentype-font-features/design.md @@ -0,0 +1,103 @@ +## Context + +FieldWorks currently stores font feature strings generically (`tag=value`) but exposes and applies them mostly through Graphite-specific paths. Writing-system default features and style features flow through managed dialogs, `FontInfo.m_features`, `FwTextPropType.ktptFontVariations`, `VwPropertyStore`, and CSS export, but the non-Graphite Views renderer does not apply OpenType features. + +LT-22324 Phase 1 must be implemented after `001-render-speedup` is merged. That branch adds render/layout dirty-state checks, warm rendering paths, and bitmap baseline infrastructure; this change must assume those optimizations exist and must treat font-feature changes as layout-changing. + +The longer product phases are: add OpenType features now, remove Graphite later while retaining WinForms, add Avalonia alongside WinForms, and eventually retire WinForms. This design makes Phase 1 useful to the later phases without making HarfBuzzSharp or Avalonia part of production rendering yet. + +## Goals / Non-Goals + +**Goals:** + +- Support OpenType font features in current WinForms/Views data entry and preview surfaces. +- Split Font Features from the `Enable Graphite` UI concept. +- Preserve Graphite behavior and existing Graphite feature support during Phase 1. +- Keep persisted feature strings renderer-neutral and compatible with future Avalonia/HarfBuzz-style consumption. +- Add tests for UI control behavior and visual rendering differences caused by feature toggles. +- Add test-only HarfBuzzSharp + SkiaSharp comparison tooling for future visual-fidelity confidence. + +**Non-Goals:** + +- Removing Graphite or changing Graphite project data in Phase 1. +- Replacing Views.cpp, WinForms, selection, editing, line breaking, or hit testing. +- Introducing HarfBuzzSharp, SkiaSharp, or Avalonia into production rendering. +- Guaranteeing pixel identity between GDI/Uniscribe and Skia/HarfBuzz output. + +## Decisions + +### 1. Renderer-neutral feature contract first + +**Decision:** Keep FieldWorks feature settings as normalized `tag=value` strings at the model/UI boundary and convert only at renderer boundaries. + +**Rationale:** The same stored value can be used by current Views, CSS export, test-only HarfBuzzSharp, and future Avalonia. Graphite numeric feature IDs remain an implementation detail of the Graphite adapter. + +**Alternatives considered:** Reuse `GraphiteFontFeatures` for OpenType conversion. Rejected because OpenType feature tags should stay four-character tags, not Graphite numeric IDs. + +### 2. Current Views renderer remains production path for Phase 1 + +**Decision:** Apply OpenType features in the existing native Uniscribe path using Microsoft OpenType Uniscribe APIs (`ScriptItemizeOpenType`, `ScriptShapeOpenType`, `ScriptPlaceOpenType`) while preserving the old path for empty feature sets. + +**Rationale:** This is the smallest production change that preserves Views layout, drawing, selection, hit testing, bidi handling, and Graphite split. HarfBuzz is a shaper, not a full FieldWorks renderer. + +**Alternatives considered:** Add a production HarfBuzz engine now. Rejected for Phase 1 because it would require a new renderer contract, COM/build/install work, and broad selection/layout parity validation. + +### 3. Feature application is run/property based, not Graphite-checkbox based + +**Decision:** The renderer SHALL apply OpenType feature strings from `ktptFontVariations` / `LgCharRenderProps` for the run being shaped. Engine-level feature state may be used only if it cannot produce stale style-specific output. + +**Rationale:** Style-specific features and writing-system default features can differ while using the same font. Per-run feature state avoids cache collisions and covers preview, data entry, and style scenarios. + +**Alternatives considered:** Pass writing-system default features to `UniscribeEngine.InitRenderer`. Rejected as insufficient because it misses style-specific `ktptFontVariations`. + +### 4. Font Features UI uses providers + +**Decision:** Refactor `FontFeaturesButton` around a feature provider concept: Graphite provider uses existing `IRenderingFeatures`; OpenType provider uses OpenType font/script/language/feature tag discovery; the button is enabled when the selected font has configurable features. + +**Rationale:** The control should depend on “has configurable font features,” not “is Graphite.” This preserves current UI reuse in writing-system defaults, styles, and font dialogs. + +**Alternatives considered:** Add OpenType conditions directly to `DefaultFontsControl`. Rejected because it would leave the shared button and style/font dialogs with duplicated logic. + +### 5. HarfBuzzSharp + SkiaSharp are test-only comparison tools + +**Decision:** Add HarfBuzzSharp and SkiaSharp only to test/comparison projects, not production projects. Use them to shape/render known feature scenarios and compare against legacy Views captures with tolerances. + +**Rationale:** This starts migration evidence now and aligns with Avalonia/HarfBuzz direction without destabilizing production rendering. + +**Alternatives considered:** Make HarfBuzzSharp the shared runtime renderer now. Rejected because current Views owns layout, drawing, selection, and editing behavior. + +### 6. Visual baselines are migration assets + +**Decision:** Use the post-`001-render-speedup` render snapshot framework as the golden legacy evidence set for feature-on/feature-off scenarios. + +**Rationale:** Golden WinForms/Views captures help Phase 1 verification and later Avalonia comparison. Exact pixels are appropriate for same-renderer regressions; tolerant or semantic comparisons are appropriate across GDI/Uniscribe and Skia/HarfBuzz. + +## Risks / Trade-offs + +| Risk | Mitigation | +|------|------------| +| OpenType APIs produce different metrics or line breaks | Add feature-on/off render baselines and native metric/selection tests. | +| Feature state is omitted from post-speedup caches | Add tasks and tests requiring feature strings in cache/dirty identity. | +| UI exposes required shaping features as toggles | Filter OpenType discovery to user-configurable optional features and provide fallback labels. | +| OpenType feature labels are incomplete or unlocalized | Use resource-backed labels for common tags and fall back to the four-character tag. | +| Test fonts cannot be redistributed | Confirm SIL Open Font License or another redistributable license before adding binaries. | +| HarfBuzz/Skia visual output differs from GDI/Uniscribe | Compare shaping data first; use tolerant image comparisons for cross-renderer evidence. | + +## Migration Plan + +1. Wait until `001-render-speedup` is merged into the target branch. +2. Add provider abstractions, parser/normalizer tests, and UI tests without changing rendering behavior. +3. Add OpenType feature discovery for the UI and preserve Graphite provider behavior. +4. Add native OpenType shaping/placing support and native tests. +5. Add render snapshot scenarios using the merged render baseline infrastructure. +6. Add test-only HarfBuzzSharp + SkiaSharp comparison tests in FieldWorks test projects. +7. Update help/localized UI text. + +Rollback strategy: disable the OpenType provider and native OpenType shaping path behind a feature flag or fallback path if regressions are found; Graphite and old Uniscribe behavior remain available. + +## Open Questions + +1. Which redistributable fonts should be committed as deterministic test assets: Charis SIL 5.000, Abyssinica SIL, Lorna Evans, or a smaller purpose-built test font? +2. Should OpenType feature UI list only detected font features or also expose common tags not advertised by all fonts? +3. Should the production OpenType path use Uniscribe OpenType APIs only, or is a DirectWrite spike required before implementation? +4. Where should the test-only HarfBuzzSharp + SkiaSharp comparison project live after `001-render-speedup`: under RenderVerification, RootSiteTests, or a new dedicated test project? diff --git a/openspec/changes/add-opentype-font-features/evidence/manual-winapp/01-initial-sena3-loaded-clean.png b/openspec/changes/add-opentype-font-features/evidence/manual-winapp/01-initial-sena3-loaded-clean.png new file mode 100644 index 0000000000000000000000000000000000000000..970cd8ee90dc65ef3f94643229f87ee432524e2c GIT binary patch literal 78164 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%0D{!yLUOOCTG9BIC@_dz07<`M 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 ZSZNt$&pzS5^fv*At+j&{>5Om6zX1g~wzmKP literal 0 HcmV?d00001 diff --git a/openspec/changes/add-opentype-font-features/evidence/manual-winapp/02-writing-system-font-options-fixed.png b/openspec/changes/add-opentype-font-features/evidence/manual-winapp/02-writing-system-font-options-fixed.png new file mode 100644 index 0000000000000000000000000000000000000000..ed5101383a9d8b767241a5344834543ba9717034 GIT binary patch literal 34601 zcmaI;2|U#8_dkxS?pC?oEhxe*P0AXQZP1;h2q9a{D9VzM-B?=*q3pZt$ujnJti{|D z#%?gS7{)%#U@*q~uTj0<@89R~ef)boCJ)o=bzSE=*SXGlp65ANLHD%P*^Y4^V_{)o zyL0=d9t+C>1Pjalher;9Z)D+Lq`;4TE_&)WSPHS{=D;t1SpTE-4+~3iIP1=%gW&h0 z&u^Q!u(163mHF9+cKrO9g(aZ=&dq=Bd%~AS4}0?9UM~BN)GgubJW6Y2Jwm1~$eK=R zE!vzyCJ!cl8@jYCv+Nu@&8b)d$*cJ{!t61|S(jAjp?BKbfMh|+H0~RTk_(&q_AvuB z?h{%(@mze}R*@R@#XYI=C{6|w&;%gZHv<$`R(R;cn8;gs*rDtdc1BV4p$ zvqfU9=`jCn9d)cXS3jrh*^m^+>C>|lO|QRy|K6i1QJ2XfVrWB|=@_nZ%CPE8DKMwk zr>XlarY+g6J8ca%ZLKdmhv9jsk6gmWd3i1S_v!X|JzHR(kxNpbd08h>Pp}ftXcsS@ zVkOdVO`>?a5}#U3pgO8sw>(jDj=e@nXyyY!|8Ak)#re!MS=P^zO)R#{HC1zz!(LLZ z`HEe!AHK?~XJvYGF@OI2z#|o`CG1qj)vjQK*r+pPGg0& zNmK4dcw;`5ot2|RiBcfS0xQJ#*Qgect?I;%h=C~;yXy+SB{ zk;#;uwbMlUH=s``CuQOm4yjbJe%U&gHKz6+R^CF{<6K^7?Y%ACzt`A|+7k=n44^c$<2US*#_FDSb~X?dPAdRi{=*$7^EKBP1M(0<^6ShjT<&A!+oC*vcmxuE*9 zC8ebWde*ThOLQ256SckVrNPI1YV&##;cek$yhqb58w;(6A8zWEp->(+BstD1ZQH^F@9MSZ^@ z#Bn&&cKFJ}7r&o!js}a?{*s$(z{aLk9E-x`h=fM$%}g&;*BHa5!xDVP|N5T+I(^P~ zX=nuhe*ajK!g{@Sk|$2sqo4rY-`AJEy?qP(u%pa~Nyehe%C7!?m%~$}PFKHoUPh+C zFjD`^+IGybx|+0`$U=z$O0S{mLDJ^xlwp&dy**nDRDXq=ho|6`k&#hOfoWyUo+@^% z=-caF^SL=|D__~wAJ^9d&y2Hw>9P;P&hp~1o}}u51N#m>Q|-l9X56d*|&* zVefQqv9Me?MkQHLym8yfxX1>5@7G&OOSq|p*Ortd{~)(w%aCWVM8vzvhpXMc`?5J2ov(-==X)ggSkd2-_n)N%2StaBG2)& zuqgdKO!^#mkwm{VTuiN0maEVv-m60#hlwF{!y!Fpop#=Dt&W!wt&@F~+-LOeTE~a9 zE|Sh2SgBPOL(BvTxSG^iv|c}W!~bE1@@3aYsfF_xNpEM-Pvf3+DJ7$F*yJf?d5ui; zVOKR8#1Y<*laHa@W8)q4Q`4NyR9@4FEyCxr?fkf2TQGGjZi2M-0iR(1s6j$?S#gs#E}vbeli8nn8_io2jwZR_ zBo)xqs=HSvcTYGj#Np-q(0EHk%EFm2mBk9(-H$_dJ8`?>=arO^6y6_xuyN}Xss449 zfw8ESEwfDLk+T|n5&w+Gpf)VHd|uf}JTDZgR`!diL@1wK?>*)FZS|${4|?0iNZ*FB z)gMAvdGRNwR`;zI`%w|7ixRG6z73kBs~V=*fAf!#sVD3+)cB!+-SM>z|JicJ!a3=g zaRwiHNi;s?$+vCabL6;J=B$XYBX!3v_v{LwIai@K<8V5qmD9rO zMEtovVtq3y^8%Z`oU2$F(8cD+FbW2}MSOQoCx%YFN!o2W zu%;Ytp3T>M(HmxR$79DLY|Uk;-)Tfef2 zGHV_NZ^kozjN`&mRfwdgM3onwcN;rMJuf$oyknotp;uDJYGWaa(&^^R#njQ5k#k7Jh+1CdrWJ-wv&0(~_ zOhd>K;+Rvts@je+MXsV^6K&W)d_hWIK(pp0fLlNptf`hvbEd#_GR+X!5Z%%r0xx=<9?YU}5ieP_C0+B}gY^#w{I`I>)G^&6n!JiM;{~teJDR0jT z0(8zj%ax;@+~ZBEBW~CK!NLOT6@rkaaXI^rwr$b<#Az)OereLy*x7LZ9l#|oM?*^!EH2{Ttf~7^YsZ;W&+a4M#jw6F_`|2=LQI5paO9T!WeEu* zTU%SCq)Kd#POAH;zfl}spM2Z@Er24|J8eV|rgk!r@&`!A+^)>fCv|XgYtGeK34g;+ zjjxAJ#3R{F^?6XCF0a_uWFxT}DVMdfM*zI4-QJ;ex@{~D!5_8yG3e9+T5!&+E*Ldn zZ`316(5;j(Ud7yjfvKlYpX#c9)$Q+>`CL<@op{ZDc{PICKF@8G7GibdX@;93@ejo- zQwPf5-2L;uZ+jhkSIAuj5yXu3^lNtI=g}o&78n1WvF<^fD+X{Xz_teZ*S*H79cQh! z#m$ofO1w-ksU*0vOUqebt|hgJdv|o8UDs?v<`=@Bw#D@ENg$F7CgkbUo#X=iTb-it z+}o+P-S5Nf1@kU@&6-|Jj)uCN%|ZyCvOc>YHdEjJG=(B(!2u^rts74`YuVW_G7L8P zPAP@28D2v8{?KP*yS*v!wr%hcRvH=6i-t`m0OoGKnW-Q`Nfd6}I|Hewm= zB|ueZbmu0V1|HLydw%)bD>5V5z z;pGJzCRrv469v0KLIC#h-pqeqWIkPlD z{_7$J?Q#qCJH5KMpwy$)ece_tvW>&SAiDmv)U%``PtY#>ol{h=MQfQZh1Sk|!_9*ea2fu^M7!yAu&FT!?gD;?fF_L4COTSULN8QTtGyGjE|KVQLztp1pYv%N@dcs>St9fsVo-sc zhBkABr*v7F`IukwSo+iQf)V)!zBGbKtb0KIPH{w_as1kSjP&%fqTq5jyVddT&j(1e zS(8Hv_oPfaIT|uvhVb`gNsOmY258`xP-})5J8!`lbkx~7Hsd4_*Cv(9hL<6A&BT%L z4;y>i7cr?TeohUd7cY&6<(az6A01NZQN~7a=C;2bi!IGmFls%&eCo$$hLXGWOBW6e zwDL#39Pg383~gPIlWtp1a_EB}%C^f1Lu$yauj98wJ>if}VXH74Hr{!_$z%r2eYVCi zDjGF0oiwmzNUCd;~$#-Mj~^ywBZeW*)y? z5d`)XIH45r2R|%5e~JC|baw@9*;t8{%NoO4BEcJa#c(zb9{#nO|3zj$3DS9mKXPJ( zvw(2+kz=97q$e-@$|FbAq&T8U)(IRX_Tno+m4tW>lnOuX0G&R}b?y2o8^_ZJi5^u!eibp7l|J<9YH2L!4&H zy~e=k2IS%3WZxj-^h}AC2H)xtU`lJ+7|JjoD*wv&xI*7y2_ZKQWY>}v;{*C(omIyc zcjaxG=egGl^{DT0Tif?2+*P+BVy$g5f+NbPcKO!%?^7#hc&CKuw zaFb0m8HD}YrrqJQS?a|NTuI7DiX1+Vbbv)6TN7g`Fh_TzZ5TM4b(KO;kP+ zu0pnS>~$AS$$J{JLSEdGQ$n-V`J%_wXX&m>PAu0G<21%#+8o*IC;p?%M^TW4P=>`fJGxXG0> znoD{zQeY~p%mWr;=3428n$q?aqn(7+PbtvxU--XNRkzFVLBf+3(g^sQ9KVL=w#HIH(NRhqs3Gv5GVfeY=l&$SIQLPj9NvEEDYKZ@)Pj0WZfk${D>lH}c zu*x6A?YWsBHNI^}LNO_PqKMAyx`Nt@ur6NHz=fEo)P)GQ%J~>o>eHPWBiNKK`QK_j z4LFIl@Q8qbJfnW!1!SW)$#+&55gOX@rNF)`Tg&v-K@y!h?!m!iQw~Z@FKS>GwEr`8 z3c@?sFKVl(UTTRuS&61j-=$iwC64bH^82pcDI%1Yp>hHOPJJnKFfbX?Rr(-l_*#Q+ zU^B|d?AO%HP&$&qT&O{%&b9RxhE)^Tus(2AVZZFvT#4G&h1>{_wOQS~ z*?qnpKBRb&TS?=wEG(bwYVMPn(9CUNpasT65#L;^XNqLXA5{u|a}3HM#Iq|jSkkW0 zr`mbewl}i83Z56kG3KA&dh5T2I9fG%g=)vAeN4=;-3+L7o30VqMs!>W)k&P-Mha<+ zN%#XwElyGui6S2ZScsak#pmj0zMthq;ZZZsA8&<4M}T(2q2$l?i?mpXYbbqSx%D>ju)vz@ zgR*wObZ+t?w-gjtea{4qrQ)$2_M~StSMzDvA%tdYI=2itzV}#aDi*Dj$@A>qJ2T zI837L$5)d242)m}Jw3;?60QyjBhmn=2I&O!8N=U06K*ZyslB0o=?yw6e?#wyL4HN`fm8NGTQDvUdc5yBc@7Qlt zDn7u*^HmdsRoR%4FGh(%b2VDH+)ZPG0d$Y}+iwoo-hwu1*=K_`u)?kRyvTf&anGsH z2et07qKSB}ulQKI047V7kdWY2Mo_9MI`4%km56x54U6!tjAUdgFr%H@?El0qxu_^c)cw=nWijh1a)6dSGWbMqErN_^e96zpYR zE)`JHwN0{cTN|66Z$T0Z#c00LV=45)1b2+|TM1W=PLv?v*Asww8EK4_z=YN(n#tN4 zaMOIvtI5;t_0LL_nhZqq+THS7pkig|Wxz-<OK}(jAs9UQw?3R9u-P-a@I|%G}XmIfJ9?Mv%CX8Sg z%kS!e38izQj5SkWew=E;iYLC`Uy;&8ZxpTRV<9} zA1a@=vC;aEVyBmiB}3Li*}xozB&n4OpF4_#OT)jg4o&Ja+($@$AhUK(9~AtMEva zO~e~8S@f*z?3zQBZ(~qLb3+Tyb9EH;%RGvl-_?AhDes#yi|iL%%`S~FGBvfMAD3@4 zc9disvGn6hMxRLhCX6s_;z{5uDYzkh$i1K}IS(S?`}y<{*CWaSYtqM#@8p|W0>|p2 zK2b+iJ|cop53ewGYzB~Hu}x;`GUDP_L!5g}x^=y>K$hg9`uomwx zGg`f29to-iF1c1P7%WzUPar4)B%6;ka32NLqhe!oMn*>9y7%sV`WncN)?Imj1XN=} zyKn`=EnkHN0AKmZ(mS*5LdULvh+Wfu4%?mEQ#KN)*NY6Gl|_>0&>S@1 zTXNPZ?e)t}f?>SVJGbty#vi&R;>7fX5jSErQmXIw`e}jK|6x#LtXi<5`6L{B=;^Ju z=#7U0N2_m2>0v^y`5m8%dv*2sEw#ZjaD20zA*S8;0S)bxntZfYYgWTDvsf_MJiJ)Z z!F!-MnD{UnCC#l+MAy@&pbFk74>kY5fFfSIY+GLM1O%M-4xYdw?MD8}e#n-z8f521;7q&@0(Hto zh(eGVZ{)-utqBV}!sFqAR`%>7a9+G6kILh7c53-ka>A*s+KLm*QqJ%szJk54@k6-TO1%!rVo_|zDWGr+v1cv4(H^)pc>ID7V`VAzsm<(n z^NG8+A1yt8a)PPJIFLztV8ibgF?E?i`1n}MA{sUJFc^kT40JWu35`6L6svWp?NMgW z0KCtvGN{Ub))!>EAC>@~w`i?wGtXpz9Z_l#MhNKy#G-0yn3WzANGH6BweEgz6qLqh z1eO%9ig95zjdspAc2m;{eLZGnxT`Rh1nT~44UKQP;GdB`(;_i4b_3NKV+EG(vpE@| zOWSjw&yPx#T$c_1*OBt9(824Px-47g0KHS(nau$RdXo*p?lUklbFbXaC*SYuIjnS*=*JYIxb9e%Y4;;?K6!4^Ade(KU=j(s4 z!hS0KlqQA-s{Ly}0{Q0wg;S(#T~ZlGyF#5t`2)~%A$DRqAuDUTW;({y3_{wrW_6>N z9<1^6tS{tA$yo@Po*%X@5yL@~bL|4G=I7JqYODwM<0h_Y@ZISH{`2mf)b#RHxXOTa zs&DofQfXQ4{H`;}of{&(=a&%TIG(IgATHPVFVr|R4`OT2Nxq5$ei-IU@ zvX6pBe4YcjLUj3EnJ)B8Q%<$k}mzKF&3Wsy(c`iz0d!F z)EXH}b)E0Ktl7GFAGT^7Tciti^~Y?`2k?yU?7Z`F*%H1Q6Ap*J ztf!5VY7EKs44Vgu>J{^}@XV(>8y_NMT_VN#QM$28WpEW=i9IF7#wyP8xX!&^aGN`@;7Xa2{xx^6DTFjw zY{^O7Fuunu?namnPA9+}QO&!z8zRIbz-ii3MtzoRVN9rO2mN$_MMd+Dki*_HZNVH+p({`TMOk#?lI%$$;v6(wX;Q$@!ohQ zW>(cD>~_n+p|BjxJDntL9cHlEzS}*9i2RS<8J-Ky^eLU#Ie!0|`wY*vlcDVkmk=QF zue_KjCMGs;vrqo#=>=&|PHXF}I{F6Qa0p-Hme*qT-PUlc-EJd^rhbEI?zbJ1V^9qZ zh}?R2%1Pg)?3V3et&pqdVoYZMQZt!?`)%F5OrRFuiEe9eFIyaM821VU z3=J@Iizm^jQ$k|~b_+*kWcl?~RU@C;@!U5s$Xj2Ko!7*P*|;o0+Yq>RTUk>gOi2@b z^ocMTRh4sBF~1y?5)6tVZ_s7}&_DPt%41R&KqNlH4(65-0nfYyd@Q zA(JvB;PR&CDCd~^&B*xeNgb=%kOMgj;4>GZl9J7!OjWvVB_peT?sImI=2(r}LVnv- z)?>#+r>Ccf>%1$=zY|APPBI6+?z~V&p!YYLZ0Eg{UN=%nNo&|yb)`@HYxkP(5*6+J z)+%<%>W*^~NKgIo+NmeMoc@|C24C_dr2Li9{rit|zkKPb_oeL}^>-%580nVf>_mqi z^0WwO*J4#kNR!yHsi}Y7a@F@ou*ce4k+A_Tzs-u>oj}LAPXCqc-JQew>qHe#)$uy} z^xr3|2DoR?OHnpaYnNbvN=iESU!|7vYxkzoS9s||>|+kp?A=9L>wWqVb-XK;jy_Ev z^1nL(snmY{Gm2{I#GuR>+c?8+)+gVSAJxzNXW6Vi>v`t=M)hQlj?{*GbAsbcQBo7Ei%@C2*O96DQ@Pp#E1n zbvGzI)s5%!EX~-!XcXWCB{mbl z;np@rqCt<%6A+~BK?y71GHk~BU$a|7rgy7Dawg6ao##Fgw%V#U2eB=d%a?<;2T!d# zsaf*^@|(}S5k@iwu?lc?pSeC^s-N$yneuqDJQqK{+Ou5=qRa1{u3TsXjNlne7?BSw zfKMYu<=cI-c=8uv;zr?YkmQY|He#(bane$eE4(`A!n~zUADRO|!WRXa5Q)Fe*h+%G zJq=$ruDItDJ`(PhM4@^*Uc24-S9lQeS}3p2vH@DzErpKKOhd_Pj+=xhWg zYuQ)ODYTnap_;uDJ%g&F(_Jx;1k{jas`9{)WUTg|TW6~XC)vi#hUXA+MnKyGfd*P@3w2$n@|1%&DPoa@?n4fx-bH~Y_`UqQm7p%L%z1V>mO z8-u(qmwy~#eNp{oQ{pIXBm2^+uMV-OFS*>#wzLbR9)V%*5s!D-e^!^(^})XgnC4xT zsY*r5jZPrydBdG36W4K_E>V;|%RNy!%S>LYYQ8o&f5@)XPK7;&*y2VlV|S zj!?gC9Fa!Qx+Ws#E590a;rp9QfGsFFdG<)$4V>Y~-Ivm|`&xDPUkaGwsrDl71NN1F z+KRmU7;GVnNFjYd+vwb=<8!>Pi`5UGBPc`pP2X3B3a8-R&kswg@0^`&nR1$Ip#^UY zF42;qgZZv+9Tzr=zj@QnsCk>6U})3yB$5sTk7f#zY9vPR0u*zPtdRUBN_${Jb5S$p zP^DH=XIx9`YO?NjsO8gMoK?H}t&>3*qbXYIO;;?~g-r;&k;jsbaA<&6!RyPt|2 zI`vt-%A#bt8JTCP_;7=es{bykqPoJvhaE13aG}W`t8163Aa##W@ zd7?0HSm8A}O@hFV8G~60g&v=Z) zeY=@(FW~m)2IE@x_~+kTNA(k9xyg9vb^K5s9?7 zQqOJ>QU>KT@1N;>#X0TV;U|VzI#t(oo?{LbU4a~n52_p*PkDb!feOc4%8z$DEHqJy z)&3HFkCm(o!!Ix_tCJ}eeCfO{-|+J2#qaW=ZmCBsz5P_Gf*;~l&Uh9k1iafA{K}tU z^60qyEn=~kJ$0L5Q@N0Vo<@YJhPP}HZ{xr2s$_m{Asd7K*oyxnbx;-o^gui)FE1DV z)u51zL{=`hAsEHMR|UvEOB#cj?Q|qYS4bmy*%4_bXZSG5GGG>taj9R`py85fhZv}G zdWX^Q_$LT3OvOdX3a#0Ej#syd9X1jkR?(1W<=^D3GM9>zNbf4wsSvfhT=7}o)^}m1zh!EMX@y^zUjVg>Cmt-aH3ZuBa!V$Jxa1IEWyMU}|{WF%11M)e_kt zM0C1E<6C--=2#{5?V5ya_|E#6xo^qDnjAJ4;`(ZNlt(atZt1xQn6(P=Xq3&N<7X!R z8~aUQw29a3W?A`_aR%Dq8Kwt&7f% z(@4!LKF|Ki8u((lLRBAB`P=hcs%3;7tdO&YOms_1t7IF~p@!t1*oc4n$noz<-|^xk z{Z8L}rzF6}>^i9O)w-k_`-MTrG6l2I%RcV~4(2X71)xs6!yQY-G1TdNOBra6IZ_#2 zF2kSy)}~9*i(^XTu~Y9_s-XfJ!x6Y$ha5N~eLU5R zP`u7U3{Io;RNV8EpV|HJ3so_ph1Y~lc}J8XrY>z(hH~n8LRd)Au#f-uyelwVu~oDVP^?>f3Qa9Z2`@|bMeKo zaGt{ko|B*awray+H1(c-5bqBLHJYUFU=ce2#42TJLc(zX;G}?e-->y!5BxYd{QOx( z06)!~+i%BzA>Puz5U;@)5ca~-1?RLu7tUYcwWQh_Gje-in*Tz5WX8@l~Z`wV$WbN*Lm+@8#T^!7p=y?S-Zx7x+L zHoi(cC{*;R7uR4UtQRH%CH-P4#G|3`NcG#Epcp5!+(*cWwQV6WRCVfTl`(A|yLG$c z0sbXph~8@d3rrsU1z})%FW~lklWEWU)bi)!U$Obx$i-yz-e~D?)NL3T3`K6U$xmEU(?oEdOvzc!7-AItcJ3Du`UkH4v6sqz)qn$bqNJoG zDn8y;GS36F(Zztq!|Gp~1*-ke96?P(ma0_nT}8CF$nt=jg^#U_41O*j z-N=o)xth9DKdW;GHQ_Fl;-Uy6UEL*NMECJCR~lsyWlWMJTSy~C*VyzkO_pwaFjYAZ zr(6X$GNk8C3#sq^qcTK?z{<#}1)be4V_4RoW3>Ro%}NM}|0_k#skz3iG%E|@S)Fat z;iAp=lXnEwvbZ+c!;UDE(lCE>7v(K>*aO#>yG~yjy)t$VJrXMPf6M(Z&`rtYt0P59fou{xdn$kBhvfQ<_3ThQt;2CaA-qwkM;-i{l-ORhq=PFPV zPjBpAz~K~o84$-R@{J0U=`X$M#Cll!4Ndr0C~VGTa}tp3aX`7debW(Ka*XlQa{kv7 zCC-kQ9N+xmR*1>iqh9ND$?qpEAxuhevw#5F7T6LzrlS*Z6C;(S_?CA}Ht4TxQ;6f# zn3w&aevX@BUb(w^^uRM@-`aGdS)}?NE$Wp=X!+_7LE6i7*5568G#1Sp>-=E)^4iJH zAK#_3#MYd3Y9E3kjL54d$=4v8y@R%Yg+47+PdT$FS>P04=Q(%=;2wT(58y?rYc1g* z)?e$TL|uAgEW84U8uDAzD5wzWHk9kS4sSZ^*n9y?zOF zgt4$Z7Z1)O(CPI4Z5l0ajY>6mI*|b=WFJ5wN5{r4Fyq5{W_;K}65{RcMIINvns!oL z(EEP-iFl9u9>;ReY%eid1aE+L-}$~=eP%=%1E``OhpP<}Oc)bK416)0T^PGjKc+j| ztO-{?YUiz$RQs&F4qK=Q>C9_C$fOGPvAp=>FC&a4NM*eNPyvmj6^4|%Tk{-VMhYovz*SZCiwM!t28T3L5K12}djdk# zp@>j0ZqU1tfT9VnQ>lh43DAhBUq#^kLfWW2a7`y53gu;BgloM=wt66fu&dC)&8HtT zB;VF!cC@mvG|X9H5<39g-g6b3_bN5Uq6~(-d=c3f#X7s}G%M%&A+}y~1zZ0$6j{oj zsRjlH188{`%r~F$M3O(T6SVpI7MMaLp6{|8tba_4dD6&^bkX{GVABZI@j=VrM%?_i zsLJ2n@g#2wowO4VI%|+_)r9z?KY~sP^$ibyiHYF^cMfxli*!U`03oX$SfJk()9P8(DCK z?!BrbU}rAFta_|>UlJ&tDjr%#yn{haHz|QO|Fk=UuumxvC}ia|fOWs(f6V#<&h%C& z_Y+_H*7s+B3$#~G*#Ngat1iB(1ML&~17Ff8a-b{ye+D3?cxwalru;ph(y&D=3eT7P(lR7*%>T=~?mg68D;@$M&&L>RGi-S53{#prME-G&sucsP*0 zbXnFcO4UXFko40T<%&24eB{JozvtGoK7vkPI zJm3zbVddl5?#3rxIm(aQ8#BHaF;XJ}<(Nk0*EJmhdYiT9O{pneYSgm%bZ-TXv2s-= zJOBq85SnVkoFU6&;scVG5Jy%4Up6<}ol&@SjUrR3GYcX*OCvh~7{(aEOu;Bd79?$9(4t`giSG^E5^E+an4siFm^1spuDXeFuw#qAYG2Ze`gL< z;gVDQwr!dB{?=tmJA9TZ8|e0f%o7iW--8s#{`fzb;`)Rw+nFmPzoJV(1d-DeBdykE zCN%`F8aB_c<|tE_9;pOvUPmfjqRo5)Fr2+YYsg5xO3E&?QBC(LUKVIncZAXKLrkd)QL^L>t_4mjl79xnHC+%A@M)4s< zN@Pxr)67^*!$Ah(W4(RJWD|(2r+iS)B{ypI#hKDklC%~l7 z)gEAYW)h&o%o=X5K7<4ce!cV2>t2*{Zmo0rIkD=pv;Dg2GPXBEtaRiG*`&4SBh6bj z#FL3PF$?+mZWUnW*Zvho^XKykZ=LdYb;%P=;$GdyQvTVqcu?ryIxa3P0QK9cT2DaD z%vdeFC4wH{VNf-&Bik@bqFOppsP}6Z>y*mj2df)!W665DDftZUp*eeo*!SJnoI0EL zYOn2n2OUD=v8W9XoKN5O;H%kK*l?_FLVv}IGuM*)#&qlkB<%+=$9_C)>JjJz-Cpa} z5yLK}F|mrutTRTMREX%VL*vI_F89fkYl+AU8vCM##RYIjh2KelD&8IvU!^0C-Ub~f?DlpMiY&) z8yDd9j)#G@g=k=w`wje4} zKuLCnw<8&rY3ktDwOx&ecWua&h7Wmceb#ZUks)U#){7vnpJe*aoljun0q{I~N(W<# zD$*LitI`LateqSsERy*(P@(U>ruk;Gxy|Ov zs;~$fV{Zum9%A9@vnc2%#@@OA%LN1OWl+=Mg%~^XZ7DEqjn}r}#S7Gm=$Kff~IG zh#yWs<<|L0W9d_3sS9*!X6vEcLha#7qzS`mi{n8(v}L>WQN7iM{Lq?u7Mn--sV@zh zV{^SZppGaGYLf@wp~8y1d^xwddv zrRqkWQO@kQpbBSdo4JNt?e1s$ubuOi{MG1HeP9YK*BSGM%s~I4;+rWs;fr4eM3z;h$bxMfV{6Aa%HHbzU>Z;U`*~uY-+h97)W(BcL!^0|V*Ik7IuXT>i`R*2~6T z?kf-DexD!|#Br!isLY*w_yJ?v);?iJ)82PVkORxO8L#hW>3g>sE1x=d(}aK<|6LAs zh=m%Gj|4Rk)(`E4cxToaRED}K@Soz`efg{;pQ49 zHe7BGTKJ(~?;g^^fP!coXvNEC7C>)-5Z?3ag`hk_c>zJD1mptI?|N(Z|yF>ztH}cbHY) zsdsy`elP}T2Lz%2e=v&sC!z_;AZS?tC*b?DcAy@1P8SYOadvU>R{Q6lmw)mrk4(R^ z-h(_6fBN(bD8pR!ST_3=)%WIL*#RiJ zvyEBj`E|VZ7PFEl9?L9W+yr;E#Bmoed)<93I{|>WKKBbH1O4|dYx9#-wAl;7T!DO2_zxL0G&9Fdf(t0 z?fnw6Y}@_T!y^g`fYSxbONi0ax%a?AK4>b67mxfdF3@|hnlg{`E<11dg*oLL)NbIt z>>c?fcKpsw$s4X)C}vmCauc{q3IZkm0sT7f)PAMDZz70RDW}dKT_%Dn{p#IP2eFHm z(U4N|fM0G_-Dv*5CI>||bk|09X$9N>B3(z@tu-&B-Kwp)!ZG#X6PCv%60wwh7iv~g z|6#dqKBtFa{eK{VgZothz`OFFZAdY_drA>`erCjqAwRH`W=?X2AR|{%6)h#B@Dr%M z{7HL*Xi9|c-$CEj%m9$&fJq>J2m6ryrs3{UsA^_0h!xT)mK~H_dI4d-kbh6U@~|5@ z0ZLp#wNi#T+cqXrD=W;u&*@%!dErE_%RZJ*My_>x#gHpZBy`aotM@p_**4QC&Dnu{ z+S3DcxC;Qn(*XyJ%8NJBtvVZaMKDV1?>oO`_=V+|AR}Q=UQ_SijWAhxCr)vqePu<1 zNig-P$+u2Sse^wm&F==<<+L)c{zN$DbW<2@X|8kk02U&t#0A>Xm}(~#-nk7J9*6qW zL3vj07w{i6;(nIf4`F+GS`TOxO(Y4qgHWKexm(S`a?%)-n!qua0wAjO+n+C*z*^Q) z0sPI+7ky%7C9I?b1Bb5EkOWHUEXpWCj2Er@)^l^1ojQbq#x+HztElf_x^Y zU>}X@&%-%aUlh;<=+x5UaN`76z_w28UMEM{qpybw%p2ef0|mVaGIm!jz8zVx>&;e6 zS=0jr#Q$Agu_gLxdz>UUIC=ovX8~*u5~?kv%TIvB2I&k9;$?Xa6gR5^V78T%=i;E` z!n$WiN5{Y^PgT_e02SDRX0`v15S7b{x!^2`Ah_6`4loZC$}TYTH{=H!8#lP`il;b8 z_j*CmhFRM9-^J%J>ycNG4LlCfsOt~o_P@-*Gua;LD5&g3cb4NRtSp}xt_6fA$@l-x zu!l%|7|6f=)UxO&BeeI-?45?K4#)fE=E&gSW6?1&>0EK0C>i1qVtJ}%Z%+%E`+Vdm zFl(?jui(pk|DUUlCTmw*;CuW$l zaS&LkS7VmgN($+3J}4K6+u*b_}cL-@LGxjWbuw@xC} zNqG{GyPq2~KDnCo?uWVc@0XFUq+)zGnWWfB^&)1=6lhzYN$zN781&jVzS#FWhXjsd zEN(EKLqUHc311g?-e$wY!BGTJ>h}NZ?ajlQy1KUU_OaGhtG2a(Vu4Pm1OW#I5fH5c zN*H8FkSVA<$Pghy2$&#HwMZ3#3It?SnMnvJ5Wt6SoTBaf#+ywaGxrB!sjib18T~hA5!g)q#*5jH!_4di_ zy2R~J*7mGa?QdmR#!H0en`FS7gJ^Q#B(&CLaSj9qW#XoLvd2<_jg>(r@_`D+&B z5|De#{wYz0j=hy@sM+tt##&rLm1!Oc+T+lM+4t*JsT zRKC!Vgs(!3$bH6~3^wMc|D=e_)@InqJ7zjX@*YGO-Efi8(6&`)cz#E*l}YGe5V)i1 zPo`~i-0T8XEfRPYhY}=BW_&Vucty|K%^qV5Wnt$vNA_FNG6|%1@4pMXRm*kHL=Nq_ zn0&&Tem{-%8-bZDed=;!eRxJ^;90wx;^axMHyiVV z4&-U%El5q233#@-u?}s31*v~YI9T4n7JpXXy1Vb2&vfnm$z#9A4^H@nwn>X@AF7=`?Iy$=|L}v;w@=(6rf6Viq^|Kfo zd)cZWBZlO#3faXFdlY^yeY4rG+6YLO!D@-Q0G^{&=3)R;dR^gX@D+TvvrmW$e_b1VyobGdZc;|zOe>;+n&-|lgO2RdK3zOcHP>sO>* z?Rv2(DXc?1xwZ`Q8HKwcQC3>vyg9#R1aa0nKlsng=RNYXSyj2;_7(&`oWU0U(m?Ij zDhPhf7wg&H1$O0cf7gNF#)1q5q4j><3(ff2IE_ZkrB+N~FXAL`#xlbChA3j_06YIM zr|2ISA`bSsnp55ITl}rIJohno3=3)I+1`54T?#XJfRwJ8x*=_Zp~6Q>m}^z*yKJ4e zRmX7?>lco<)Q`Bozuo@en{Uwk^Q_>0s&@wjw!$QOLOkm6)G(WP+AjD|E|6=Vr?(=yUW3Q zDSdOQ#HW25rw$ba-Ho^PyY8}=Vp?M1%$%It@IdRPBC zxbd?%^bh+?ul`lD2JhkYh9RE{!iwq#HpEARAU(M7wtLp11W$V#3*mI$0btPGe1ahA z>(hABnP9xq(QK&1H6~9Spl!T}H99+FwBC3pVE^v{3Gw}4qgifKGieu$bYQJ-?YKEr zAoF{5+pf*cw>tA_@$tV3i97N)g&Scmy_HYm4mww`C z@j}tWfv@^HkEy@Y`^(!$sDjIJK4UwvN;ThojUFfYt7ayjj2^qVS^>JTyE>G<9DsBX z;pHJRlD!8?mPq7ye-TkpN?u-G*`~NKhTrz}#Yqn(Ot5?RE?b`XBzV&B0L>kkj;Z0z~Vf(WhX@8~?*0|Mj%s z(>{HAfhx4o&4o5y34%yP(;n$^q55C?%@=RF${IPG^JMk0Zf9X4KG53W?f_;!KeF%h zPxi&sK=rAjV@od&HrWdmA*21plD)b7@c-gxBVEi*2+h`qadnsM-b zF7mUekY?~h0C7qcVz<a+A~RcCKc|Av z%M6&EaxxWeI{~TmFq+SQzwG~d@4#+_;{inh5)&&CL|Jq?Csh#QIs5j_S+*K!JQdcD z7Gh>%0#i5zAMHPXx2Fgqfe@Gx;`w$TtaLtOoc*0ICGiL-$DIFH`l+h{cA$ZtgLjGI{ntC_e^Yp@9{VbY z5tt^0f+7;hFi(lY91I@~nfr^OU$(Xhi>e?qE6Z4zB>~}6@9@I^x{O;r&HwC!!3(9O z;mJ(znJo|<1N2Y>hx08Owi*^?ZA}A8WtAuXKO6af^XjVw1y3Q~#>z^3FA*6bFVvFK zOWgnJy$qVPpnxWf8UV=n3$r^g_UpZXh4r1Ftgp3oEXYgPmFDJYSy>0*EzAF>8*ZBk zd*^3`1v3O<}vKq za~tFJ)uM8WQjZO79L(93sZGUG>4+5Lih~v7)sQgt{#j(^gj%p;hd`7j;5So#W1$ZmU$oCQPZ8k0G zZTC7;Ez2^Rk0;o#S?v8#sw&>xN&aqH^6U<$XR*lz!=9$m6S)*lr)gA^ z`i7XvpeVOa^l?Enr6PvXdRxVm?wp0lEz018HRrgFAU{N{`cOAw)LE&InUox(()j1p zjX_RIs+^CEtdK7P(ZH96jyzRz1LO;=kiGRNv0AMb`F}K7P1kr19WONU4D8p`T?%}PGIr#l8SM`Z zj{A!_yh=Pyx&x>G_m$HuOWcV=kKKqi-8UrK;a>ms-1t+if}ZK`tS3Y11tSzx!Q{wy ztOMub*L=NHD)tL6{WxnrR8_PuWtQmaP#ZWo;1@93%u-1lOt$2^*VCij zd1P6o-j_ow9{**za#t6F9OOCa=Iay3MmhI)jy6UWA2Gxhz1~U^aKs2Rgq`kP^r4AY z2`YKZF+We{JF0+TMlv-35a`ezvJCA0M)TbyPn!tloGO`y1Dhmk6UC$&uV0sJ9Ez}dP+2@( zTs}9tfHFJs>xVme@_rQDW-C}nsmL>=4@^4pDj$n0_RDN8p59V5mEzlID7ole=tk(v~%w|ib1iB8d~!{(L}QGy62GxmiMl#M69kj)oI-#N8*!be{`z! zK0|nZ9Th$CC*`1|sonHCgrV0_6C2VALyi5FA6gk8OK;s81iR$Yi$76(Q3VVzEw?05 zCNC45Dt%87^0!iz`_7^4H>2&I9!D7Zo|d+hs(m^Yyb>k-ex)UXsg5(YPJ6GI5{SX6 z%9G!q`o1!xuzkf>q{jUUn|1;;56k0BUIm!`0|(^5jCVU(gWA&u8-HswcpI?2c<_h zXuiD)MJRnlL|vL?Gntf3-?<^u+yonjtTAzFok$e-oYf;}1ygfhyQ2Culgrz6P;p~_ z=pOKQ=qlO$;r`z_SpzP9~{=`3kOeQDbd}q|ekIb5PjOpfn&WcGY+c zU;UQv!-cE{5qxbPD_9kJ>^_;N~x^M8eM~ii$VrwRt<{>79;*}NR47B-Fl73$SUcYfL1s~{%++-14p3I) z9R&GHSf+xSTZ}0CHTxj2WJS|Il5b9@Q0PZ?0};?Z=2m5$L~Au_NAovsRob&~ zG}djhagUd0(uE>bOHZG^&WXR}n%8X1{bXh=+=FRPkN;T*bt(0jW%i_#w{FqMY_H0A zt=&4sshd)c1LKd^s8l^^oX#nbL<)!EpW~|QLYpy}I=+`4?b1AQdLUq=>GAjmy36CA zKfcM!m3k{k5nC1IT(FQ;G0__8xd-2K{BX$R@49@+I=C&zWB%)R&i_T?V%KR)ODSW1 zxjK>?!bHneJ2pj+9aNmIOQHK<@9^=WX^EHa>f)t1kH=?Z-W!>aI2zu|aB_9Y=34!k z=4u$&6kh2j$F)k39%9JK@+5dQmrb#K`21a~L6+SV%_5{NogsRmzw};kL-_3ja)xOQ zYO=_Q=~u_2iV>)Q-j4tYf><$TNmpc;;}psp0t|yUhBF;yk%~UtA2;9gIGV7F=KkTX zh8UZAGqOX;>~(QLHD>POEaIcr-8nrH1qX3q{(5V+Jx+%$yH7gv6iz|6dD9ae2Rtb) z+&S$&l)n)MkO9pE2;I`Cgx!MgqN7NP>EN%`mV=F8eF;WXbgzozbcnmg!uY|~JldHGV_>&dP6bk7F2iG_9rnK% zW_t>h*)^PO$7fcnjjGS}>u5rm;eh(_XPXz&%xrvg@MvDsc%xm^zJ;&hEI{E!m^T#W z$g-1lf3jHxnyNfOvu8LFMTzFw7oeQW(jmv*vY=D$pW0-y1>17{x>7&?Q&KnAOVNe% ztNvX^^YlJ&>jrixX zV}w!qLb4hz?_{v1;t9jzT$G`KRo{m??6Ydkg)7#V9kyGhZb%snW^qnPiOx}y=XP@g@D-r|E5VF{7nd~tHaVVGJL^v0U?qQIb zJ*sqzC=^Y42bpBst2;N#RU3axYhD8j;7m@mS<;gqo}!NJq#s~lWZj(Td#M)4g9!Q| zmQ?^pcjDD1g*6AcsV8cyhGJfQ2qX95DJ*{{9Rc^@o#^URi;4pX`Y&)_z3xQsY~Y$h z*#aS^G0fxsL7ySx!1)8ahPk57P5Dc58}KX0?LMR>p)c>djyENu9rLrhIt1;XcO3R$ zNs4P!e55h?e1sX>GRNWO2vHR|Q*MzXl-5CtPGt{BLTOzx*C>?MG1hkFtw!-$vdSNS z0G6Fxt4S*eRdM>3jhi5eccKIbPVu_P{fwK)E0>h@qB17 zHA5j6rWik0s|d?yo!Aty$||~<*3CmW*HwpHaMo;3Ejd0R6t3;wjY8pC8Ec2wzHkk_ zMY8+D{Qz>rBRt1J$2I%b78S~ivn>AB1{r%CJ-0k23b$v*sMuYS-e?N zE^kl0;73m zOtM69M+QNY)$-BoeajG()HB`#k>H5C)pt1bmGb_9o z2B$CqqJ7HPa~=tz|7^ngXvg-tP@7_Cui}ZstxGmd>QcckhZEH7*bRvjd!-CS7iCmF0Nss8u=? ztfD-;jp|`J_hc6qaGW};lyamRYO8irG*CLVytBBoA4sHxz3@sg*OtLNe&O! zOfZ#3+lt8`LM=;&;g&uneD6hScU81XCyI|b^T>!{xFbzdYPN4W#mJ^sbMpdru7~BD za7AsNVTenG7 z%*kO;vtOrvAyZz;HS)s=by={ZHM}xV{E;HB)2{=~^w^enniCb&r!^;D@NteKkFQ1% zU%Ro2@V`CnS;&s7daI_P1d8O{2Khlwt^+~bBqq-(69L8T3*Ol%pqHRJiP%|QlfggUI zZK-K#CMcA%7h4vL0l?$HDMrPM(v+n~lQbJQmHNh;wIR9n{_`pFR=!u~2~{fYa-inU zEvq>QURuDl*!1gEEST0vOl@Ns@2EYP-0i$idemkjl#%K2;i>`&hSg`wUgUUU^382X z^Tyr;z8Jx?>E7U*4qwV9wDtYsI6>w#Lu@IrW052WA=M;8chCnV)2HH8a>KMk$v(bl zdTi4~@WJZlg}8CT+>GT`r`J2X)>s&D^rqoW8yNzQ8GEyJk@d1ULY0yme)@gh5s1CbQFqe{cP}f9Jkt(Uc`ZiqLvsN7MoU27 zJmq7c53elL5h;nMggRp8!C?`JbkyS_L=P|R^vH;t9dA$FEAmnl=L+I!vuuj*kk)S{ zCK_pZu-j~C?HVHGT+{_Jb4Rx58tf11R3k~Q71f?7;lC5*{?Nd0gA=(p(?YdSHjI_6 z7ukkXd}VL=u?n(=n~d5Md2rJuP%Lm$VW!1%xG6tdZy>o_<4xY0eX@7)2+U1tzA#@@ z8Z&oxiAaF_zk0Zbmx-$8I%yDVfOyF`7Nv%Z?A>d@`%tV4RZUI=vwcpfHH5BXURa(U z;@QkQKHlYTKM>R=*;pf)*ZH9&f251Cv(tarEpg})6d;q!)#VCaiHb-#a#|aH>hNk? zN8>rm-;Wj!KAV0_e&!AIVNteN*Akd+go3qCh7zTUbJaHHxLRy4^P1vhwV zo|d0~bk1J8Oc&Dmf{`nHxeo6N7U^v5&rwh-Svmbsx@Yog3=M)ZNTQGy4?VO1Fb$Q< zW;V3vkAYk|#Lx%ng^3Ch@t2TEB}Q05{Qv3Nj%bdzA#!}p=uD+H=**V7G1 zt{h|5v?4-bYeu&mR)J`O9&YYeQFhSx2;^=zOMZ!$9p`h5X>3GYcm5i&v$LkTJ5W+X zc^HCXpx94CAj#f4kSl4Ep`sjyZI3tBn7i-@6J7N9!v($hb|lKPgW&nvt*U2A&LXNU zQ3W2^!ccZXVrWkTQ)_GN!vBgm{(sB1f8S$V6_)+6e z%jd+$dbMfnjHXwoL`b%T{5WEYo$1t^O)I6S6`kX(-CYgg}W z+*uKz^u~EL)QMnnG>i?g z#w%lkXanlKZt&VJS|zqYXa=-gIc>P5z$}=nda~yBWoucJT8prks)RiyOuNq*&P*P){=;t0-KL$KnuTs!k*Gj5_OiXmkqrz^k#$q z$D)a#C1+vMlGr#EXc1|dDFQ}CIEt3EgKWX1>1|?!JIwx_wg%<{RQ5IsXcAR+)b~k1 z_cUSc;7Rr{BL5y$-X9Ug#tY@pIcn4)9z9c>LI_wae_iwzq;n?LUR?c1Vx%NH}# zQdgz=Uwz70bKe$oa^TeUUV-EgyIcT_#o?K%}Ut&u~IMu~VBjjkcaT+u3RZ7hcy_L@&hj`Xh zn1gu{FXU{hUtP4G>#`4v&OV+b-E-Le#UFxEjns8BTOFr!R;9>-o%vS(?CTf)vsxzGtYt&a zmi!(8#WW#9#l1pK6XoIpJ)U@bA>te#(K~2=d>3}0Qc+(r+t|xP(zN`>MeFI&>q>7& zqSv4sXc2Mh6!8))(tWQIFjd2HQd3#o8g2{NsChog4%d;!=eyBtLNjo)70x7VJ8I3o z_=`Dki>ME=Zvrg;Lgif%G(T62k^1_Q7rSs0r5~M#F;9aCbtP$?&Z2(FK%e2V5AP2g z>QJiE<#JgwP=LV5HDKeG$dHH>oe`pb{Vtc&=oww^{M?3#aT8qsZnO5m5B1$=n!9U? ztm>~A#ASC24U&@K1aTEP!{D!?5(l<5%c{}9%NZW-G&$leK3VeJnxzHdBh&_NK~C-C z>YIzkL|9`SQcog}b0_40oWXM%1MS>gt~B&9-Vqul)vA;?^);yfRX#N2&w zuV!y;dg&TH5G^0h{D;P+p$gK_6un%(GbtqNfF18pVmi-1$D@Pv@mr}EYa#JLgFQR^ zNUy`qlqT|(%Bx!JSZ~U?>q^Tz2`8b}?fX=WC7+nk2(idfoJ_^UnWxU+u4v(Io71kP zYry3vI(cxbayKSeU9-c^ zvSsCHf1Kf?MROd$k%)POdX7vPel-`NT{B9woM9to))Zh9g z$@>Ik^JWSoG#g+3T-y5ZYV#_s1-ulhC7wJ59R&(cUeE9`&kVLoi;wX>Y-N>fKIG9) zPx7;X{Lo{O}iE+1X*b&JrMcyV*Ibz(l!{6nRdoT^0yKrgYb z4Ew4k!s!X;qKH_8jBoQx!Pet_tE8lRTDN{&wzcQnQuLRU`>w!KEw zvBU(aIG?5!^?FPz>h1VXfji$MufcBHHGR%sk{*SE%C$<(RteXx@c@JU@y*W=NRyGO zh1Fw6n%j}X2IxPA4m6>j(BjLhXxEAYTJaBDrz6^JXiTsYo}-e}C8RBKuC0nZ zfZj?(&nifxRR93CRsHpED83+^?%;VU)Z=@X(?($VwJez!$$*=-Ec33Z6bf`^f}kbB zi@$#4JV&<}M{{+}b4L>l^4ciI%bV^gG}ghOqUzDGHGt@0{+y z%(kIg<0T-H`Ni2-zMy%JJ&p|A(jHr#G!7%e;nP)ycv6Dx4D0=U6|eM?aNV1E3W*n|AEFv;I_Lz~>yB{{ie+KUuy6I_kgLQ;y0Fw|z~NEmm^)BT zvb%TR1HOIt@>tivpmOl{dHX~*=R%c5vo5#%ny64zW&wG`rqsW>EiR{*$+?!Zu?i{E z*bYNOk^2>t4lOb=SON<>yB>iqd)>F>v6(rmMV|KLUNjpL(HonK=Ltez8SuafI>C+4 z?j*Q3TYF+_E6goWwdo>69lAQ>7&3b(=NBqEfJ4o>Wa-z7ldESMKglOWuz!1Ai=-C#DG{B0&m`+04x<&x12LLC33_2mx>&J zGF}LpO_plv>UtBR^Zp4au2A6cvZNHvF7!HoV??r8-;))V3}AP#+Eu1t&abLqZYr?A zc^Fvl3$eg@*DDqCr3C{P&71T@mWWAms|Qi7_D)v zwb4sOpS>vk6g@ayszV!lrEYd7W~r*;V->9vX~K}@#UJl_hrayYgWBy(6#TSa{`=&> zA92hBwk`CG&@W)@yFb~Mcf4gzP6QZgHb2j{4~sL>#j;XxW2#ud#6lhcnD-$&h#*D?NO4qB7?6pAx)c=+yz{5AbmZQ~r6_ADXugB)uVl zT|)o@xF6WtY`th@4an_p+v6>JiF)DCk=?kt`cBgq$!U<)4lifSC{&n7YJ`ShZ z#6SLGeTK#TU44Q>Z&SMSi&K~k)$!M=UqW!-k~R{0DGO#sj)^N@%oA3(Cv}l)$&i{4 z)q{>I&YAF|U|4%sR~Niqk=NyT3F`bFVM`aIud}L%E+iv`7<*kz-U>qtHIeIt5d%p{ z&QQDuj#k@rQn!*^EeaFb`;hJath?>v=*6G7$Z2M`)?pRzB>zo;$Jm?t5JWgUkf?G0 z*knKSgyP)ZaS)>aAz!=wIAA}Sxn<&Rkv6mPN#WEUKsX6!A`MA#hp%8oP5b<2- zeImmB6RFDMpA)(Bjkqh>*6W#FM);qPp5*!m*5m!29*WS#r1bqgy+Cy*> zcXX!;B;Rn;&GF+roUe{0!=)bFnTi)%_AQ127nF8ND{zJ;rVV_KG5ykiPsM+$2G zaQUSc!Jj{!&$aA|<^`3AwQ~bseH&N|0SQ=%w%^mYdwLkCSL4m*i*6s)50oKpb1#$d z9BjpAHbxYUOV3pl&jz3~tem}XmxRm76bw?RN{*ag?Ck9q`_b1*`zR36MgwJyO!&%1 zX8fO6G66c!?C@vu*L~YX@x@=-@PEqeE_FAE=_@n(%J!SRL}*j@=dFM$C+nN^DElK{ zdrywAbU~NcMOeFdCziyhj-_k%_4Znnx^xzKFAD1ujZ)GIuZF5icGXHo)Db(9BPIy! zfXgnes>riBB85ad&O>)>#eKbkzAp$uvJ*w+}vEX{Mj>O3yT6+7vkp5>4}{}rL2GN$P>a(u=jqO zmm%JmnJ{`8Y8U)vzS5VYZSl=g(lwVbhqq&VG>UqSjtsZGek!XRJSvkZ(&f;XIOkP6 zbmeI|g4kPShCon2w4WmbIMj6qa5xmAKUTnukC!N~Q7|4Y z%0#G{VmVqepngXvNEXOU{BbygCtlqPXo;}7cE=BaHh`6}4h6cr<31V`8WTTLR%{TZ(I3hbBC`3#Xjv9pI18S8e z3i^7M5v%dJmx32gao%jG$JfSGEw!kMR>I~Eo%jdb7sl-0Lwtiwg;}JB*mJLxhB3jj zJ47IYzp{%!>Qo; zdv6a34q;;>&gfze#6CG{ZJkg##D}JLm?*KZgdp!U}6+A|SJLF;JKrEYgUJ(D}j=n%bSlV2-t5$Dp0A3<*-=JQp8v zpE;33kD3%@Y&EaL+E+h8=8u~9mBvVcP(KWH>*?RxZPd?7*CsrT*|39uXNkmbOIVWZ1kT4cOQHH*i2Y&4Fv(VFGDeD%T0sh$UrfH(d!cq~(zU6cP_?zvXzKtIX%h8X_ z&z?4)LT471ojil9nwG)PxzR&mmV=qpogp}CbZTfcf->h_+u)oyCpGIlkN8$0q}Cc8 z9U7yyaB@7BMH)z2*Jzu zuBKLZ>~pw%p5xzwEgbIIuX7g6t_j^wR)I)*3bCF-WvsroHDspo%i$dljoDn_DQ6N zTWSRD?=DvV{A+K1D|{X1V9^u6gT~kQ+DIv^6~P1N!Wctxacb(P9E7{x3li=_ zYXhZaWhrRCse>5^O`2K5&k>emA>I#+kVI427f-YDm!G~Ef4Bn++VZ7#O~}QqqMc@f zC!PpgJrId@4%5WNcgvR=?n_b|oj6!FNiAy494yh4JD~- !#{#IkyqLBUYVxfxPa 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 BhI;@2 literal 0 HcmV?d00001 diff --git a/openspec/changes/add-opentype-font-features/evidence/manual-winapp/05-styles-font-tab-font-features.png b/openspec/changes/add-opentype-font-features/evidence/manual-winapp/05-styles-font-tab-font-features.png new file mode 100644 index 0000000000000000000000000000000000000000..c7d82c7c0712d1d40245a0585a122410ebceaef5 GIT binary patch literal 112671 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 z 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 literal 0 HcmV?d00001 diff --git a/openspec/changes/add-opentype-font-features/manual-testing.md b/openspec/changes/add-opentype-font-features/manual-testing.md new file mode 100644 index 0000000000..3f4dd0c068 --- /dev/null +++ b/openspec/changes/add-opentype-font-features/manual-testing.md @@ -0,0 +1,98 @@ +# Manual WinForms/WinApp Testing + +This note records the manual FieldWorks walkthrough for LT-22324 OpenType Font +Features using WinApp MCP and WinForms MCP UIA2. Automated coverage remains the +primary verification for renderer application; these steps capture the live UI +surfaces requested for manual review. + +## Environment + +- Build launched: `Output/Debug/FieldWorks.exe` +- Project: `Sena 3` +- Backup available if restore is needed: `Sena 3 2018-09-11 1145.fwbackup` +- App control: WinApp MCP for the original visible-desktop run; WinForms MCP + UIA2 (`@fnrhombus/winforms-mcp`) for the refreshed evidence run. +- JIRA fetch status: refreshed Atlassian read-only scripts successfully fetched + `LT-22324`, one comment, and no attachments on 2026-04-30. +- JIRA target fonts: `CharisSIL-5.000.zip` and `AbyssinicaSIL-2.201.zip` are + called out as Lorna Evans fonts with both Graphite and OpenType tables. The + live evidence used installed `Charis SIL`; `Abyssinica SIL` was not installed + on this machine. + +## Manual Steps + +1. Launch or attach to `Output/Debug/FieldWorks.exe` with WinApp MCP. +2. Confirm a project is loaded. If no project is loaded, restore + `Sena 3 2018-09-11 1145.fwbackup` from the repository root. +3. Capture the loaded project state. +4. Open `Format` > `Set up Vernacular Writing Systems...`. +5. Select the `Font` tab. +6. Verify the group label is `Font Options`. +7. Verify `Enable Graphite` is unchecked for the selected non-Graphite state. +8. Verify `Font Features` remains enabled when a selected font exposes feature + options. This is the primary fixed behavior; the old bug tied feature + availability too tightly to Graphite enablement. +9. Optionally select an OpenType font such as `Times New Roman` without saving, + confirm `Font Features` remains available, then cancel the dialog. +10. Open `Format` > `Styles...`. +11. Select the `Font` tab. +12. Verify the shared style Font tab exposes the `Font features` control. +13. For WinForms MCP UIA2 evidence, select `Charis SIL`, invoke `Font + Features`, and verify the OpenType feature menu includes entries such as + `Access All Alternates`, `Small Capitals From Capitals`, `Standard + Ligatures`, `Small Capitals`, and `cv*` character-variant entries. +14. Cancel all dialogs used only for evidence capture. + +## Screenshot Evidence + +![Sena 3 loaded in FieldWorks](evidence/manual-winapp/01-initial-sena3-loaded-clean.png) + +![Writing System Properties Font tab with generic Font Options and Font Features enabled while Graphite is unchecked](evidence/manual-winapp/02-writing-system-font-options-fixed.png) + +![Writing System Properties with a temporary OpenType font selected and Font Features still enabled](evidence/manual-winapp/03-writing-system-opentype-font-selected.png) + +![Styles dialog Font tab with the shared Font features control](evidence/manual-winapp/05-styles-font-tab-font-features.png) + +![WinForms MCP UIA2 Writing System Properties Font tab with generic Font Options and Font Features enabled](evidence/manual-winforms/01-uia2-font-options-doulos.png) + +![WinForms MCP UIA2 Writing System Properties Font tab with Jira-recommended Charis SIL selected](evidence/manual-winforms/02-uia2-charis-sil-font-options.png) + +![WinForms MCP UIA2 Charis SIL Font Features menu showing OpenType feature options](evidence/manual-winforms/03-uia2-charis-sil-feature-menu.png) + +## Font and JIRA Evidence + +- `LT-22324` summary: split Font Features from `Enable Graphite` and support + OpenType features. +- `LT-22324` description says `Font Options` should replace Graphite-only + wording, feature enablement should not be tied to `Enable Graphite` unless a + font only has Graphite features, and OpenType features should be listed and + saved/set similarly to Graphite features. +- `LT-22324` suggests considering HarfBuzzSharp. This implementation keeps + production rendering on the existing Views/Uniscribe path and uses + HarfBuzzSharp only in test comparison infrastructure. +- `LT-22324` links `CharisSIL-5.000.zip` and `AbyssinicaSIL-2.201.zip` as fonts + with both Graphite and OpenType tables. Current local inventory has + `Charis SIL`, `Andika`, `Doulos SIL`, `Gentium Plus`, and `Quivira`; it does + not have `Abyssinica SIL`. +- FieldWorks installer inputs include Charis/Andika/Doulos/Gentium Plus 6.101 + font packages and `Quivira.otf`; the exact older JIRA-linked Abyssinica 2.201 + archive is not committed in this workspace. +- Native TestViews now commits `CharisSIL-5.000` regular font data with the OFL + license under `Src/views/Test/TestData/Fonts/CharisSIL-5.000` and uses it for + deterministic end-to-end Uniscribe rendering tests. + +## Before-State Capture + +A true broken-state screenshot was not captured from this workspace because the +active debug build already contains the LT-22324 fix and project data should not +be mutated or the branch reverted during evidence collection. To capture a real +before-state, use a separate pre-fix worktree/build, launch FieldWorks with the +same backup, open `Format` > `Set up Vernacular Writing Systems...` > `Font`, +and capture the Graphite-only/disabled Font Features behavior before switching +back to this fixed build for the after-state screenshots above. + +The UI screenshots prove that Font Options and OpenType feature discovery are +available in the live dialog. Feature application to rendered text is covered by +the native `TestViews` Charis SIL fixture tests and the managed/native render +and cache tests; the evidence session did not save a project data change just to +produce an applied-render screenshot. diff --git a/openspec/changes/add-opentype-font-features/proposal.md b/openspec/changes/add-opentype-font-features/proposal.md new file mode 100644 index 0000000000..df7d9d7b4f --- /dev/null +++ b/openspec/changes/add-opentype-font-features/proposal.md @@ -0,0 +1,43 @@ +## Why + +LT-22324 requires FieldWorks to split Font Features from the Graphite-only UI and apply OpenType font features in current WinForms/Views rendering without regressing complex-script and exotic-language support. This is needed before Graphite can be sunset and before future Avalonia work can consume the same feature settings. + +## What Changes + +- Add renderer-neutral Font Feature behavior for OpenType feature strings such as `smcp=1`, preserving the existing `tag=value` storage format used by writing-system defaults, styles, and export. +- Decouple Font Features UI from `Enable Graphite` in writing-system setup, style/font dialogs, and shared font attribute controls. +- Preserve existing Graphite rendering and Graphite feature behavior during Phase 1. +- Add OpenType feature discovery for supported fonts and OpenType feature application in the current Views renderer path. +- Update render/cache invalidation rules so feature changes are treated as layout-changing, especially after `001-render-speedup` is merged. +- Add UI/component tests for font-feature controls and high-level visual rendering tests proving feature settings change output. +- Add a test-only HarfBuzzSharp + SkiaSharp comparison path for shaping/rendering confidence toward future Avalonia migration; this path is not a production renderer in Phase 1. +- Document research for later phases: Graphite removal while retaining WinForms, Avalonia alongside WinForms, and eventual WinForms retirement. + +## Non-goals + +- Removing Graphite in Phase 1. +- Replacing Views.cpp, WinForms, or the FieldWorks editing/selection/layout engine in Phase 1. +- Making HarfBuzzSharp or SkiaSharp part of production rendering in Phase 1. +- Delivering Avalonia UI in Phase 1. +- Changing persisted project schema unless implementation discovers an unavoidable compatibility requirement. + +## Capabilities + +### New Capabilities + +- `font-feature-settings`: User-visible and renderer-visible behavior for OpenType font feature discovery, persistence, application, cache invalidation, and verification while preserving Graphite compatibility. + +### Modified Capabilities + +- `architecture/ui-framework/views-rendering`: Record how current Views rendering must consume renderer-neutral font features and how `001-render-speedup` layout/render caches must treat feature changes. +- `architecture/ui-framework/winforms-patterns`: Record that Font Features UI is not Graphite-gated and must remain resource/localization friendly. +- `architecture/testing/test-strategy`: Record visual rendering baselines and test-only HarfBuzzSharp + SkiaSharp comparisons as migration evidence for future Avalonia work. + +## Impact + +- **Managed C# UI:** `Src/FwCoreDlgs/FwCoreDlgControls/FontFeaturesButton.cs`, `DefaultFontsControl.cs`, `FwFontAttributes.cs`, `FwFontTab.cs`, `Src/FwCoreDlgs/FwFontDialog.cs`, related `.resx` files and tests. +- **Managed rendering bridge:** `Src/Common/SimpleRootSite/RenderEngineFactory.cs` and post-`001-render-speedup` render/cache invalidation paths. +- **Native C++ Views:** `Src/views/lib/UniscribeEngine.cpp`, `UniscribeSegment.cpp`, `Render.idh` only through additive interfaces if needed, and existing Graphite code for regression coverage. +- **Tests:** FwCore dialog/control tests, SimpleRootSite/render-factory tests, native Views tests, and post-`001-render-speedup` render baseline/snapshot tests. +- **Test-only dependencies:** HarfBuzzSharp + SkiaSharp in test/comparison projects only. +- **Documentation/help:** FieldWorks Help and localized UI text for the renamed Font Features/Font Options surfaces. \ No newline at end of file diff --git a/openspec/changes/add-opentype-font-features/research.md b/openspec/changes/add-opentype-font-features/research.md new file mode 100644 index 0000000000..b7f1b069a6 --- /dev/null +++ b/openspec/changes/add-opentype-font-features/research.md @@ -0,0 +1,112 @@ +## Phase Scope + +Phase 1 is LT-22324: add OpenType Font Features to current WinForms/Views while preserving Graphite. Implementation is assumed to start after `001-render-speedup` is merged. + +The native Views feature-by-feature migration inventory is captured in `views-migration-matrix.md`. That matrix treats Views as a document/view engine, not only a renderer, and stages each subsystem across Phase 1 through Phase 4. + +Phases 2-4 are research context only for this change: + +- Phase 2: remove Graphite while retaining WinForms. +- Phase 3: add Avalonia alongside WinForms. +- Phase 4: retire WinForms years later. + +## External Findings + +### LT-22324 JIRA Findings + +The refreshed Atlassian read-only script fetched `LT-22324` successfully on +2026-04-30. The issue asks to split `Font Features` from `Enable Graphite`, +rename the Graphite-only group to `Font Options`, list and save OpenType +features similarly to Graphite features, and keep feature enablement independent +from Graphite unless the selected font only exposes Graphite features. + +The issue's developer note suggests considering HarfBuzzSharp. The Phase 1 +decision remains to keep production rendering on the existing Views/Uniscribe +path and use HarfBuzzSharp only as test comparison infrastructure. + +The issue points to LT-22351 for acceptance testing and says features should +work with both Graphite and OpenType. It specifically names these Lorna Evans +fonts as having both Graphite and OpenType tables: + +- `https://software.sil.org/downloads/r/charis/CharisSIL-5.000.zip` +- `https://software.sil.org/downloads/r/abyssinica/AbyssinicaSIL-2.201.zip` + +The issue has one comment: "This will affect FLEx Help." No attachments were +returned. + +### Uniscribe OpenType + +Microsoft documents the OpenType Uniscribe path as a coordinated API set: `ScriptItemizeOpenType`, `ScriptShapeOpenType`, and `ScriptPlaceOpenType`. OpenType feature data is supplied through `TEXTRANGE_PROPERTIES` and `OPENTYPE_FEATURE_RECORD`. + +Useful references: + +- https://learn.microsoft.com/en-us/windows/win32/intl/displaying-text-with-uniscribe +- https://learn.microsoft.com/en-us/windows/win32/api/usp10/nf-usp10-scriptitemizeopentype +- https://learn.microsoft.com/en-us/windows/win32/api/usp10/nf-usp10-scriptshapeopentype +- https://learn.microsoft.com/en-us/windows/win32/api/usp10/nf-usp10-scriptplaceopentype +- https://learn.microsoft.com/en-us/windows/win32/api/usp10/ns-usp10-textrange_properties +- https://learn.microsoft.com/en-us/windows/win32/api/usp10/ns-usp10-opentype_feature_record + +Feature discovery can use `ScriptGetFontScriptTags`, `ScriptGetFontLanguageTags`, and `ScriptGetFontFeatureTags`. Required shaping features are controlled by the shaping engine and should not be exposed as user toggles. + +### HarfBuzz / HarfBuzzSharp + +HarfBuzz shapes a run of text into glyph IDs, clusters, advances, and offsets. It does not handle bidi paragraph analysis, line breaking, font fallback, drawing, editing, selection, or hit testing by itself. + +Useful references: + +- https://harfbuzz.github.io/what-is-harfbuzz.html +- https://harfbuzz.github.io/what-harfbuzz-doesnt-do.html +- https://harfbuzz.github.io/shaping-opentype-features.html +- https://harfbuzz.github.io/integration-uniscribe.html + +HarfBuzzSharp exposes `Feature.Parse`, `Font.Shape`, `Buffer.GlyphInfos`, and `Buffer.GlyphPositions`, making it useful as a test oracle for feature effects. + +### SkiaSharp / Avalonia + +SkiaSharp.HarfBuzz can shape and render text for comparison images, but its rasterization differs from GDI/Uniscribe. Avalonia has a `FontFeatureCollection` and accepts HarfBuzz-like feature syntax such as `+smcp` and `-liga`. + +Useful references: + +- https://learn.microsoft.com/en-us/dotnet/api/skiasharp.harfbuzz.skshaper +- https://learn.microsoft.com/en-us/dotnet/api/skiasharp.sktextblob +- https://docs.avaloniaui.net/docs/styling/typography +- https://api-docs.avaloniaui.net/docs/T_Avalonia_Media_FontFeatureCollection + +## Phase 2 Research: Remove Graphite, Keep WinForms + +- Keep the renderer-neutral `tag=value` OpenType feature model. +- Remove Graphite UI labels/toggles only after compatibility and migration policy is defined. +- Preserve old project data even when Graphite feature values no longer apply. +- Add warnings or conversion guidance for Graphite-only feature settings. +- Retain visual baselines for no-feature and OpenType-feature rendering to detect unrelated regressions. + +## Phase 3 Research: Avalonia Alongside WinForms + +- Map FieldWorks feature strings to Avalonia `FontFeatureCollection` / `TextRunProperties.FontFeatures`. +- Use the legacy Views golden baseline set as comparison evidence, not as an exact pixel mandate. +- Classify comparisons as exact same-renderer, tolerant cross-renderer, shaping-data, and semantic layout checks. +- Prefer migration of text model and feature metadata before replacing editing/selection behaviors. + +## Phase 4 Research: Retire WinForms + +- Keep OpenSpec requirements and visual scenarios as renderer-agnostic acceptance tests. +- Remove legacy Graphite and Uniscribe adapters only after Avalonia paths pass feature, bidi, selection, and line-layout acceptance checks. +- Retire WinForms UI controls after equivalent Avalonia controls use the same feature provider and parser behavior. + +## Clarifications To Resolve + +- Confirm test font licensing and whether binary font assets may be committed. The current Phase 1 visual test intentionally uses common installed Windows fonts with feature probes and falls back to inconclusive if none produce a visible feature delta; a deterministic redistributable OFL font asset is still the preferred follow-up. +- Confirm whether friendly labels for OpenType features should be limited to common tags or come from font name tables where available. +- Confirm whether Help changes are part of Phase 1 deliverables or tracked in a linked documentation task. + +## Phase 1 Implementation Notes + +- Test font assets: `Src/views/Test/TestData/Fonts/CharisSIL-5.000` commits the JIRA-specified Charis SIL 5.000 regular TTF with its OFL license and README. Native `TestViews` copies this fixture beside `TestViews.exe`, loads it as a private GDI font, and renders small text runs with feature strings off/on through the production Uniscribe `FindBreakPoint` and `ILgSegment::DrawText` path. HarfBuzz/Skia comparison tests still use installed-font probes because they are test-only cross-renderer comparison coverage. +- JIRA font inventory: the current machine has `Charis SIL`, `Andika`, `Doulos SIL`, `Gentium Plus`, and `Quivira` installed; `Abyssinica SIL` was not installed. The repository also commits `DistFiles/Fonts/Raw/Quivira.otf` under raw font assets. Installer targets download/stage `Andika-6.101.zip`, `CharisSIL-6.101.zip`, `DoulosSIL-6.101.zip`, and `GentiumPlus-6.101.zip`, and WiX includes those plus Quivira. The exact older JIRA-linked `AbyssinicaSIL-2.201.zip` archive is not included in this workspace. +- Manual UIA2 evidence: WinForms MCP verified `Writing System Properties > Font` with `Font Options`, `Charis SIL` selected, `Enable Graphite` unchecked/disabled for that OpenType path, and the `Font Features` menu listing OpenType feature entries such as `Access All Alternates`, `Small Capitals From Capitals`, `Standard Ligatures`, `Small Capitals`, and `cv*` variants. Screenshots are under `evidence/manual-winforms/`. +- Cache identity: managed render-engine cache keys include the normalized feature string, and native `ShapeRunCache` entries include `LgCharRenderProps.szFontVar`. The render verification tests now cover writing-system default features, style-level features, and multi-writing-system text to guard stale output reuse. +- Native verification: `TestViews` includes Charis SIL fixture tests for `liga` metric changes, `smcp` rendered pixel changes, and switching feature state off/on without stale rendered output reuse. The tests exercise the updated production code by passing `szFontVar` feature strings into `FindBreakPoint`, drawing the resulting segment into a bitmap, and comparing rendered pixels. +- Test-only comparison: HarfBuzzSharp and SkiaSharp remain isolated to `RenderComparisonTests`. HarfBuzzSharp is used only as a test comparison path for shaping data; production rendering remains Uniscribe/Graphite. +- Export audit: CSS already emits `font-feature-settings` and is covered by `GenerateCssForConfiguration_CharStyleFontFeaturesWorks`. Notebook export preserves writing-system `DefaultFontFeatures`. `WordStylesGenerator` did not show a feature-string mapping and should be tracked separately if Word export parity is required. +- Help/docs: no existing FieldWorks help source for Font Options was found in this workspace. Phase 1 adds `Docs/opentype-font-features.md` to document the UI, storage model, temporary Graphite role, and export status. diff --git a/openspec/changes/add-opentype-font-features/specs/architecture/testing/test-strategy/spec.md b/openspec/changes/add-opentype-font-features/specs/architecture/testing/test-strategy/spec.md new file mode 100644 index 0000000000..41735e35c8 --- /dev/null +++ b/openspec/changes/add-opentype-font-features/specs/architecture/testing/test-strategy/spec.md @@ -0,0 +1,31 @@ +## ADDED Requirements + +### Requirement: Font-feature behavior has layered tests +FieldWorks SHALL verify font-feature behavior with layered tests covering parser/provider logic, WinForms controls, native shaping, and high-level visual rendering. + +#### Scenario: UI control tests cover OpenType without Graphite +- **WHEN** managed UI tests run for the shared Font Features controls +- **THEN** they SHALL verify OpenType feature availability and persistence without requiring Graphite enablement + +#### Scenario: Native tests cover feature shaping and placement +- **WHEN** native Views tests run for the Uniscribe renderer +- **THEN** they SHALL verify OpenType feature-on and feature-off shaping/placement behavior with deterministic font data + +#### Scenario: Render baselines cover visual feature effects +- **WHEN** render snapshot tests run after `001-render-speedup` is merged +- **THEN** they SHALL include scenarios proving selected font features visibly affect WinForms/Views output + +### Requirement: Visual baselines support future renderer migration +The render baseline test framework SHALL distinguish same-renderer regression baselines from cross-renderer migration comparisons. + +#### Scenario: Legacy renderer uses stricter comparisons +- **WHEN** comparing WinForms/Views output before and after Phase 1 changes +- **THEN** tests MAY use strict or near-strict bitmap comparisons where the same renderer stack is expected + +#### Scenario: HarfBuzzSharp and SkiaSharp comparisons use tolerances +- **WHEN** comparing GDI/Uniscribe output with HarfBuzzSharp/SkiaSharp output +- **THEN** tests SHALL document tolerance rules and prefer shaping-data assertions for exactness + +#### Scenario: Test assets live in FieldWorks test projects +- **WHEN** deterministic fonts, baselines, or comparison specifications are added +- **THEN** they SHALL be committed under FieldWorks test projects or OpenSpec change artifacts with clear licensing and build inclusion rules diff --git a/openspec/changes/add-opentype-font-features/specs/architecture/ui-framework/views-rendering/spec.md b/openspec/changes/add-opentype-font-features/specs/architecture/ui-framework/views-rendering/spec.md new file mode 100644 index 0000000000..6cf2dcf3d5 --- /dev/null +++ b/openspec/changes/add-opentype-font-features/specs/architecture/ui-framework/views-rendering/spec.md @@ -0,0 +1,30 @@ +## ADDED Requirements + +### Requirement: Views rendering consumes renderer-neutral font features +The Views rendering architecture SHALL treat `ktptFontVariations` / run font-feature strings as renderer-neutral input that may be consumed by Graphite, OpenType Uniscribe, or future renderers. + +#### Scenario: OpenType features are applied at shaping time +- **WHEN** a run reaches the Uniscribe renderer with a non-empty OpenType feature string +- **THEN** shaping and placement SHALL use the feature string when producing glyphs, advances, and offsets + +#### Scenario: Empty feature strings preserve existing behavior +- **WHEN** a run has no feature string +- **THEN** Views rendering SHALL preserve the existing no-feature Uniscribe behavior + +### Requirement: Post-speedup caches include font-feature identity +After `001-render-speedup` is merged, Views rendering caches and dirty-state guards SHALL include font-feature changes anywhere those changes can alter glyphs, metrics, layout, or captured pixels. + +#### Scenario: NeedsReconstruct or layout dirty state observes feature changes +- **WHEN** a writing-system default feature or style feature changes +- **THEN** affected root boxes SHALL be marked for reconstruct/layout as needed before drawing + +#### Scenario: Warm render paths do not reuse stale feature output +- **WHEN** a warm render path or buffered frame path is entered after a feature change +- **THEN** it SHALL not reuse a visual or shaped result created with a different feature string + +### Requirement: Production renderer changes remain additive to COM contracts +OpenType feature support SHALL avoid breaking existing COM vtables and reg-free COM activation. + +#### Scenario: Feature discovery needs additional metadata +- **WHEN** OpenType feature discovery needs metadata not representable by existing interfaces +- **THEN** the implementation SHALL add an additive interface or managed seam rather than changing existing interface method order or signatures diff --git a/openspec/changes/add-opentype-font-features/specs/architecture/ui-framework/winforms-patterns/spec.md b/openspec/changes/add-opentype-font-features/specs/architecture/ui-framework/winforms-patterns/spec.md new file mode 100644 index 0000000000..e7962931f2 --- /dev/null +++ b/openspec/changes/add-opentype-font-features/specs/architecture/ui-framework/winforms-patterns/spec.md @@ -0,0 +1,23 @@ +## ADDED Requirements + +### Requirement: Font-feature controls are not Graphite-gated +WinForms Font Features controls SHALL be composed so feature availability depends on selected-font capabilities and explicit disabled states, not on the Graphite checkbox. + +#### Scenario: Shared control is reused across canonical font surfaces +- **WHEN** Writing System Properties, Styles, or the shared Font dialog need font-feature selection +- **THEN** they SHALL use the shared Font Features control/provider behavior rather than duplicating Graphite or OpenType checks + +#### Scenario: Explicit disabled state still wins +- **WHEN** a caller explicitly disables font-feature selection, such as through an existing always-disable flag +- **THEN** the shared Font Features control SHALL remain disabled even if the selected font has features + +### Requirement: Font-feature UI changes are localization-safe +WinForms UI changes for Font Features SHALL keep user-visible strings in `.resx` resources and avoid unnecessary designer churn. + +#### Scenario: Labels are renamed through resources +- **WHEN** Graphite-specific labels are made generic +- **THEN** the visible text SHALL be updated through resource files instead of hardcoded strings + +#### Scenario: Designer fields remain stable unless necessary +- **WHEN** an existing designer field has a Graphite-specific internal name but only the visible label changes +- **THEN** implementation SHOULD prefer label/resource changes over broad designer renames unless the rename reduces real maintenance risk diff --git a/openspec/changes/add-opentype-font-features/specs/font-feature-settings/spec.md b/openspec/changes/add-opentype-font-features/specs/font-feature-settings/spec.md new file mode 100644 index 0000000000..84ed72cd73 --- /dev/null +++ b/openspec/changes/add-opentype-font-features/specs/font-feature-settings/spec.md @@ -0,0 +1,98 @@ +## ADDED Requirements + +### Requirement: Font Features are independent from Graphite enablement +FieldWorks SHALL expose Font Features as a generic font capability for Graphite and OpenType fonts, and SHALL NOT require `Enable Graphite` to be checked before OpenType font features can be viewed or selected. + +#### Scenario: OpenType writing-system font enables Font Features without Graphite +- **WHEN** a user selects an OpenType-capable default font in Writing System Properties and `Enable Graphite` is unchecked +- **THEN** the Font Features control SHALL remain available when the font has configurable OpenType features + +#### Scenario: Graphite enablement remains separate +- **WHEN** a user checks or unchecks `Enable Graphite` +- **THEN** FieldWorks SHALL change only Graphite renderer selection behavior and SHALL NOT erase OpenType font-feature settings + +#### Scenario: Non-feature fonts disable only feature selection +- **WHEN** a selected font exposes no configurable Graphite or OpenType features +- **THEN** the Font Features control SHALL be disabled while the rest of the font selection UI remains usable + +### Requirement: Feature strings are stored in a renderer-neutral format +FieldWorks SHALL store user-selected font features as normalized `tag=value` strings suitable for OpenType, CSS export, test comparison tooling, and future Avalonia consumption. + +#### Scenario: OpenType features round-trip through writing-system defaults +- **WHEN** a user selects `smcp=1` for a writing-system default font +- **THEN** the writing system SHALL persist `smcp=1` as the default font feature string and reload it when the dialog is reopened + +#### Scenario: OpenType features round-trip through styles and font dialogs +- **WHEN** a user selects OpenType features in the Styles Font tab or shared Font dialog +- **THEN** the selected feature string SHALL be saved through `FontInfo.m_features` / `ktptFontVariations` and restored when the style or dialog is reopened + +#### Scenario: Graphite conversion is isolated +- **WHEN** Graphite rendering requires numeric feature IDs +- **THEN** conversion from four-character tags to Graphite IDs SHALL occur only at the Graphite renderer boundary + +### Requirement: OpenType feature discovery supports UI selection +FieldWorks SHALL discover user-configurable OpenType feature tags for the selected font and expose them through the existing Font Features UI pattern. + +#### Scenario: OpenType font lists feature tags +- **WHEN** a selected font advertises user-configurable OpenType features +- **THEN** the Font Features control SHALL list those feature tags with resource-backed friendly labels where available and tag fallback labels otherwise + +#### Scenario: Required shaping features are not exposed as toggles +- **WHEN** a feature is required for script shaping and not user-configurable +- **THEN** the Font Features control SHALL NOT present it as a user toggle + +#### Scenario: Existing Graphite feature discovery still works +- **WHEN** a Graphite font is selected and Graphite remains enabled +- **THEN** existing Graphite feature labels and values SHALL continue to be available through the Font Features control + +### Requirement: OpenType features affect current Views rendering +FieldWorks SHALL apply OpenType font features in current WinForms/Views data entry and preview rendering paths. + +#### Scenario: Writing-system default feature changes preview and data entry +- **WHEN** a writing-system default font feature such as `smcp=1` is selected for a supported OpenType font +- **THEN** both preview and data-entry Views rendering SHALL show the corresponding glyph/metric change + +#### Scenario: Style-specific feature changes preview and data entry +- **WHEN** a style such as Normal specifies an OpenType feature for the vernacular writing system +- **THEN** both preview and data-entry Views rendering SHALL show the corresponding glyph/metric change for text using that style + +#### Scenario: Unsupported features are safe +- **WHEN** a feature tag is unsupported by the selected font or script +- **THEN** rendering SHALL remain stable and SHALL NOT crash across managed/native boundaries + +### Requirement: Font-feature changes invalidate render and layout caches +FieldWorks SHALL treat feature strings as part of render/layout identity after `001-render-speedup` is merged. + +#### Scenario: Feature toggle does not reuse stale layout +- **WHEN** a font feature value changes for text already rendered in a root site +- **THEN** subsequent rendering SHALL recompute any affected shaping, layout, line breaks, and cached visual output + +#### Scenario: Same font with different features remains distinct +- **WHEN** two runs use the same font, size, bold, italic, writing system, and direction but different feature strings +- **THEN** renderer and layout caches SHALL NOT conflate their shaped output + +### Requirement: Test-only HarfBuzzSharp and SkiaSharp comparisons exist +FieldWorks SHALL include a test-only comparison path using HarfBuzzSharp and SkiaSharp to support future Avalonia migration confidence; this path SHALL NOT be used by production rendering in Phase 1. + +#### Scenario: HarfBuzzSharp comparison verifies shaping effect +- **WHEN** a deterministic test font and feature string are shaped by the test comparison path +- **THEN** the test SHALL verify glyph IDs, clusters, advances, or offsets differ as expected when the feature is toggled + +#### Scenario: SkiaSharp comparison produces visual evidence +- **WHEN** a comparison render is generated for a supported feature scenario +- **THEN** the test SHALL produce or verify a visual comparison artifact with documented tolerance rules + +#### Scenario: Production assemblies do not reference test-only renderers +- **WHEN** production FieldWorks projects are built +- **THEN** HarfBuzzSharp and SkiaSharp SHALL NOT be required for production rendering or application startup + +### Requirement: Help and localized UI describe Font Features generically +FieldWorks SHALL update user-visible strings and help so Font Features are described as font features, not Graphite-only options. + +#### Scenario: Writing-system UI labels are generic +- **WHEN** a user opens Writing System Properties +- **THEN** labels and help text SHALL describe Font Features or Font Options without implying they only apply to Graphite fonts + +#### Scenario: Help covers OpenType features +- **WHEN** a user opens the relevant FieldWorks Help topic +- **THEN** the Help content SHALL describe OpenType Font Features and their relationship to Graphite during Phase 1 diff --git a/openspec/changes/add-opentype-font-features/tasks.md b/openspec/changes/add-opentype-font-features/tasks.md new file mode 100644 index 0000000000..d81c2921c6 --- /dev/null +++ b/openspec/changes/add-opentype-font-features/tasks.md @@ -0,0 +1,82 @@ +## 1. Post-Speedup Preflight + +- [x] 1.1 Rebase or merge the implementation branch after `001-render-speedup` is merged, then inspect render/cache changes in `Src/Common/SimpleRootSite/`, `Src/ManagedVwDrawRootBuffered/`, and `Src/views/`. [Managed C# + Native C++] +- [x] 1.2 Verify the render snapshot/baseline infrastructure from `001-render-speedup` is present and runnable before adding LT-22324 visual tests. [Managed C#] +- [x] 1.3 Confirm redistributable test fonts and licenses for OpenType feature scenarios; `CharisSIL-5.000` from the JIRA issue is committed under the native Views test data with its OFL license. [Planning/Test] +- [x] 1.4 Record selected fonts, feature tags, expected visual differences, and licensing notes in the FieldWorks test project assets or OpenSpec research notes. [Docs/Test] +- [x] 1.5 Use `views-migration-matrix.md` as the Views subsystem checklist when selecting Phase 1 visual, selection, cache, and future-migration baseline scenarios. [Planning/Test] + +## 2. Renderer-Neutral Feature Model + +- [x] 2.1 Add or identify a shared managed parser/normalizer for `tag=value` font feature strings, including duplicate, empty, invalid, and ordering behavior. File area: `Src/Common/FwUtils/` or existing font utility location. [Managed C#] +- [x] 2.2 Add unit tests for parser/normalizer behavior, including OpenType tags such as `smcp=1`, `kern=0`, and alternate values such as `cv01=2`. [Managed C#] +- [x] 2.3 Keep Graphite tag-to-ID conversion isolated at the Graphite boundary; do not reuse Graphite numeric conversion for OpenType. Files: `Src/Common/FwUtils/GraphiteFontFeatures.cs`, `Src/views/lib/GraphiteEngine.cpp`. [Managed C# + Native C++] +- [x] 2.4 Define a font-feature provider seam for UI discovery with Graphite and OpenType implementations. Files: `Src/FwCoreDlgs/FwCoreDlgControls/FontFeaturesButton.cs` and nearby controls. [Managed C#] + +## 3. Native OpenType Rendering + +- [x] 3.1 Audit current feature flow through `FwTextPropType.ktptFontVariations`, `VwPropertyStore`, `LgCharRenderProps`, and `UniscribeSegment` to confirm the per-run feature carrier. Files: `Src/views/VwPropertyStore.cpp`, `Src/views/lib/UniscribeSegment.cpp`. [Native C++] +- [x] 3.2 Add native parsing from the run feature string into OpenType feature records suitable for Uniscribe OpenType APIs. Files: `Src/views/lib/UniscribeEngine.cpp`, `Src/views/lib/UniscribeSegment.cpp/.h`. [Native C++] +- [x] 3.3 Replace or branch the no-feature `ScriptShape`/`ScriptPlace` flow with `ScriptItemizeOpenType`, `ScriptShapeOpenType`, and `ScriptPlaceOpenType` when OpenType features are present. File: `Src/views/lib/UniscribeSegment.cpp`. [Native C++] +- [x] 3.4 Preserve old Uniscribe behavior for empty feature strings and preserve Graphite rendering behavior for Graphite fonts. [Native C++] +- [x] 3.5 Add native tests for OpenType feature-on/off shaping, placement, metrics, line breaking, and selection-related placement. Files: `Src/views/Test/TestUniscribeEngine.h` or adjacent native tests. [Native C++] +- [x] 3.6 Run affected native tests after native implementation compiles: `./test.ps1 -SkipManaged -TestProject TestViews -StartedBy agent`. [Validation] + +## 4. WinForms Font Feature UI + +- [x] 4.1 Refactor `FontFeaturesButton` to use the provider seam and enable when the selected font has Graphite or OpenType configurable features. File: `Src/FwCoreDlgs/FwCoreDlgControls/FontFeaturesButton.cs`. [Managed C#] +- [x] 4.2 Decouple `DefaultFontsControl` feature availability from `m_ws.IsGraphiteEnabled`; keep `Enable Graphite` limited to Graphite renderer selection. File: `Src/FwCoreDlgs/FwCoreDlgControls/DefaultFontsControl.cs`. [Managed C# WinForms] +- [x] 4.3 Ensure `FwFontAttributes`, `FwFontTab`, and `FwFontDialog` load/save OpenType feature strings through existing `FontInfo.m_features` paths. Files: `Src/FwCoreDlgs/FwCoreDlgControls/FwFontAttributes.cs`, `FwFontTab.cs`, `Src/FwCoreDlgs/FwFontDialog.cs`. [Managed C# WinForms] +- [x] 4.4 Update `.resx` labels/help strings from Graphite-only wording to generic Font Features/Font Options wording. Files: `Src/FwCoreDlgs/FwCoreDlgControls/*.resx`. [Localization] +- [x] 4.5 Add UI/component tests for `FontFeaturesButton`, `DefaultFontsControl`, `FwFontAttributes`, `FwFontTab`, and `FwFontDialog` covering OpenType features without Graphite enabled. Test project: `Src/FwCoreDlgs/FwCoreDlgsTests/` or existing control test project. [Managed C# Tests] + +## 5. Render Cache and Speedup Integration + +- [x] 5.1 After `001-render-speedup` is merged, identify every cache/guard that can reuse shaped, laid-out, or captured output and document its feature-string identity requirement. [Managed C# + Native C++] +- [x] 5.2 Update renderer, layout, warm-render, and buffered-frame invalidation so feature changes dirty affected output. Files likely include `RenderEngineFactory.cs`, `SimpleRootSite.cs`, `VwRootBox.cpp`, and render verification infrastructure. [Managed C# + Native C++] +- [x] 5.3 Add tests proving toggling a feature does not reuse stale layout, glyph output, line breaks, or cached bitmap output. [Managed C# + Native C++ Tests] +- [x] 5.4 Verify same-font runs with different feature strings remain distinct in rendering and layout. [Tests] + +## 6. Visual Rendering and Comparison Tests + +- [x] 6.1 Add WinForms/Views render baseline scenarios for feature-off and feature-on output using writing-system default features. Use post-`001-render-speedup` render snapshot infrastructure. [Managed C# Tests] +- [x] 6.2 Add WinForms/Views render baseline scenarios for style-specific OpenType features, including Normal style for vernacular writing system. [Managed C# Tests] +- [x] 6.3 Add at least one bidi or multi-writing-system scenario to guard against complex-script regressions. [Managed C# Tests] +- [x] 6.4 Add test-only HarfBuzzSharp + SkiaSharp dependencies to a test/comparison project only; ensure production projects do not reference them. [Managed C# Tests] +- [x] 6.5 Add HarfBuzzSharp shaping-data comparisons for the same feature scenarios, comparing glyph IDs, clusters, advances, or offsets where deterministic. [Managed C# Tests] +- [x] 6.6 Add SkiaSharp visual comparison output with documented tolerance rules for future Avalonia migration evidence. [Managed C# Tests] +- [x] 6.7 Document deterministic font asset and baseline status: native Views end-to-end render tests use committed `CharisSIL-5.000`; HarfBuzz/Skia comparison tests still use installed-font probes for test-only comparison. [Managed C# Tests] + +## 7. Exports, Help, and Documentation + +- [x] 7.1 Verify existing CSS export emits OpenType feature strings correctly; extend `CssGeneratorTests` only if gaps remain. File: `Src/xWorks/CssGenerator.cs` and tests. [Managed C#] +- [x] 7.2 Audit Word/Notebook/export paths for feature-string omissions and file follow-up tasks for non-Phase-1 gaps. Files include `Src/xWorks/WordStylesGenerator.cs`, `NotebookExportDialog.cs`. [Managed C#] +- [x] 7.3 Update FieldWorks Help or context help for OpenType Font Features and the continued temporary role of Graphite. [Docs/Help] +- [x] 7.4 Update OpenSpec research/design notes if implementation discovers a different safe renderer path. [OpenSpec] + +## 8. Validation + +- [x] 8.1 Run affected managed UI/control tests through `./test.ps1` with the relevant test project filters. [Validation] +- [x] 8.2 Run affected render baseline tests and review received/verified images. [Validation] +- [x] 8.3 Run `./build.ps1` after native and managed changes are complete. [Validation] +- [x] 8.4 Run `CI: Full local check` before committing or pushing; commit-message lint still fails on pre-existing commit `c30c1e7d16`, and whitespace was checked separately with no problems. [Validation] +- [x] 8.5 Confirm OpenSpec status is complete and all tasks/spec requirements are still aligned before implementation PR review. [OpenSpec] + +## 9. Manual WinApp Evidence + +- [x] 9.1 Launch `Output/Debug/FieldWorks.exe` with WinApp MCP and confirm the Sena 3 project is loaded, using `Sena 3 2018-09-11 1145.fwbackup` only if restore is needed. [Manual Validation] +- [x] 9.2 Capture Writing System Properties > Font evidence showing `Font Options`, unchecked `Enable Graphite`, and enabled `Font Features`. [Manual Validation] +- [x] 9.3 Capture the Styles dialog > Font tab showing the shared `Font features` control. [Manual Validation] +- [x] 9.4 Record manual test steps, screenshots, and the before-state capture limitation in `manual-testing.md`. [OpenSpec] +- [x] 9.5 Fetch `LT-22324` through the refreshed Atlassian read-only skill and record exact JIRA font recommendations, comments, and attachment status. [Manual Validation] +- [x] 9.6 Inventory local and installer font availability for JIRA-recommended and FieldWorks-bundled fonts. [Manual Validation] +- [x] 9.7 Capture WinForms MCP UIA2 evidence showing `Charis SIL` selected and the OpenType Font Features menu visible. [Manual Validation] + +## 10. Deterministic Font Fixture Rendering + +- [x] 10.1 Add the JIRA-specified `CharisSIL-5.000` regular font, OFL license, and README under `Src/views/Test/TestData/Fonts/CharisSIL-5.000`. [Native C++ Tests] +- [x] 10.2 Update `TestViews.vcxproj` to copy the Charis SIL fixture beside `TestViews.exe` for native test execution. [Native C++ Tests] +- [x] 10.3 Add `TestUniscribeEngine` coverage that loads the Charis SIL fixture privately and verifies feature-off/feature-on OpenType rendering through `FindBreakPoint`, `ILgSegment::DrawText`, and bitmap pixel comparison. [Native C++ Tests] +- [x] 10.4 Add `RenderEngineFactoryTests` coverage proving writing-system default OpenType features are normalized into `LgCharRenderProps.szFontVar`, equivalent feature strings reuse the renderer cache entry, and different feature strings create separate renderer cache entries. [Managed C# Tests] +- [x] 10.5 Run `./test.ps1 -TestProject SimpleRootSiteTests -StartedBy agent`; result: `Total tests: 113`, `Passed: 113`. [Validation] +- [x] 10.6 Run `./test.ps1 -SkipManaged -TestProject TestViews -StartedBy agent`; result: `Tests [Ok-Fail-Error]: [295-0-0]`. [Validation] diff --git a/openspec/changes/add-opentype-font-features/views-migration-matrix.md b/openspec/changes/add-opentype-font-features/views-migration-matrix.md new file mode 100644 index 0000000000..e10e93c5ea --- /dev/null +++ b/openspec/changes/add-opentype-font-features/views-migration-matrix.md @@ -0,0 +1,645 @@ +# Native Views Feature Migration Matrix + +This artifact answers the broader LT-22324 planning question: what custom native Views functionality exists today, what modern library support exists for each feature, and how each piece should be staged toward the Graphite-removal and Avalonia migration path. + +Assumptions: + +- "Views.cpp" means the native Views engine under `Src/views/`, not only one translation unit. +- Phase 1 remains OpenType font features in current WinForms/Views after `001-render-speedup` is merged. +- Phase 2 removes Graphite while retaining WinForms. +- Phase 3 adds Avalonia alongside WinForms. +- Phase 4 retires WinForms and the remaining native Views surface only after parity evidence exists. + +## Library Fit Summary + +No current standard library replaces all of Views. The closest full-stack candidates replace slices: + +- DirectWrite is the best Windows-native replacement candidate for shaping, typography, paragraph layout, drawing callbacks, hit testing, and text metrics. It is strong if FieldWorks stays WinForms/Windows for a long time, but it is not the cross-platform Avalonia end state. +- HarfBuzz is the best shaping core, especially for OpenType and future Graphite removal, but it intentionally does not do bidi, line breaking, rich layout, selection, editing, drawing, or font fallback. +- ICU is the best standard library for bidi and text boundaries that FieldWorks should not keep reimplementing by hand. +- Skia/SkParagraph is the most relevant cross-platform paragraph engine because Avalonia already uses Skia in common configurations and SkParagraph exposes layout, painting, line metrics, hit testing, word boundaries, placeholders, and font fallback hooks. +- Avalonia `TextLayout`, `TextShaper`, `GlyphRun`, `TextElement.FontFeatures`, and automation/input infrastructure are the likely product end-game wrappers, but stock controls will not replace FieldWorks-specific view construction, lazy data loading, interlinear layout, selection semantics, undo, and model notifications by themselves. +- Pango is a strong Linux/Cairo precedent for paragraph layout, shaping, cursor positions, and hit testing, but it is less aligned with the existing Windows and Avalonia direction than DirectWrite or SkParagraph. + +Key evidence: + +- HarfBuzz shapes Unicode runs into glyphs and positions: https://harfbuzz.github.io/what-is-harfbuzz.html +- HarfBuzz explicitly does not do bidi, line breaking, justification, rich runs, or full layout: https://harfbuzz.github.io/what-harfbuzz-doesnt-do.html +- ICU `BreakIterator` supports character, word, line, and sentence boundaries: https://unicode-org.github.io/icu/userguide/boundaryanalysis/ +- ICU `ubidi` implements the Unicode bidi algorithm: https://unicode-org.github.io/icu/userguide/transforms/bidi.html +- DirectWrite supports Unicode layout, advanced OpenType typography, measuring, drawing, and hit testing: https://learn.microsoft.com/en-us/windows/win32/directwrite/direct-write-portal +- DirectWrite `IDWriteTextLayout` exposes formatted text layout, drawing, line metrics, typography, and hit testing: https://learn.microsoft.com/en-us/windows/win32/api/dwrite/nn-dwrite-idwritetextlayout +- DirectWrite `IDWriteTextAnalyzer` exposes bidi, script, line break, glyph, and placement analysis: https://learn.microsoft.com/en-us/windows/win32/api/dwrite/nn-dwrite-idwritetextanalyzer +- DirectWrite `IDWriteTypography` exposes OpenType font features: https://learn.microsoft.com/en-us/windows/win32/api/dwrite/nn-dwrite-idwritetypography +- Avalonia typography exposes inherited font properties and `TextElement.FontFeatures`: https://docs.avaloniaui.net/docs/styling/typography +- Avalonia `TextLayout` exposes multiline layout, drawing, line data, and hit testing: https://api-docs.avaloniaui.net/docs/T_Avalonia_Media_TextFormatting_TextLayout +- Avalonia `TextShaper` shapes text through `ShapeText`: https://api-docs.avaloniaui.net/docs/T_Avalonia_Media_TextFormatting_TextShaper +- Avalonia `GlyphRun` exposes glyph run metrics, bidi level, caret hits, geometry, and intersections: https://api-docs.avaloniaui.net/docs/T_Avalonia_Media_GlyphRun +- SkParagraph `Paragraph`, `ParagraphBuilder`, and `FontCollection` expose paragraph layout, painting, line metrics, rectangles, hit testing, word boundaries, placeholders, font fallback, and paragraph caches: https://raw.githubusercontent.com/google/skia/main/modules/skparagraph/include/Paragraph.h, https://raw.githubusercontent.com/google/skia/main/modules/skparagraph/include/ParagraphBuilder.h, https://raw.githubusercontent.com/google/skia/main/modules/skparagraph/include/FontCollection.h +- Pango `PangoLayout` formats paragraphs with line breaking, justification, alignment, cursor positions, hit testing, and logical/physical conversions: https://docs.gtk.org/Pango/class.Layout.html +- Windows TSF remains the platform service for advanced multilingual text input: https://learn.microsoft.com/en-us/windows/win32/tsf/text-services-framework +- Windows UI Automation is the platform accessibility model for custom controls: https://learn.microsoft.com/en-us/windows/win32/winauto/uiauto-uiautomationoverview + +## Feature-by-feature Matrix + +### 1. COM/root-site public contract + +What it is and where it is used: + +- Native Views exposes document rendering/editing through COM-style interfaces such as root boxes, view constructors, view environments, graphics, selections, and render engines. +- Key areas: `Src/views/*.idl`, `Src/views/VwRootBox.cpp`, `Src/views/VwEnv.cpp`, `Src/views/VwSelection.cpp`, `Src/Common/SimpleRootSite/`, and WinForms root-site controls. +- This contract lets managed FieldWorks code construct views and host native layout while registration-free COM keeps deployment local. + +Standard equivalents: + +- No single standard equivalent. Avalonia controls/visuals and `TextLayout` cover UI and text layout pieces, but not the FieldWorks data/view-constructor contract. +- DirectWrite, SkParagraph, and Pango are text engines, not application document contracts. + +Best end game: + +1. Create a managed renderer-neutral document/view contract that can be backed by native Views, DirectWrite experiments, or Avalonia. +2. Keep a compatibility adapter for existing `IVwViewConstructor` callers until each canonical view has a managed/Avalonia equivalent. + +Migration staging: + +- Phase 1: keep COM unchanged except additive feature plumbing. +- Phase 2: isolate render-engine and feature contracts from Graphite/Uniscribe specifics. +- Phase 3: add managed/Avalonia adapters for non-editing preview surfaces first. +- Phase 4: remove native COM contracts after editing, printing, accessibility, and canonical data views have parity. + +### 2. Root box lifecycle, reconstruction, and dirty layout + +What it is and where it is used: + +- `VwRootBox.cpp` owns root objects, view construction, full/partial reconstruction, relayout, invalidation, drawing, selection installation, printing entry points, and data-change response. +- `001-render-speedup` makes this even more important because cache/dirty identity must include feature strings. + +Standard equivalents: + +- Avalonia layout/visual invalidation can replace UI-tree invalidation, but not FieldWorks data reconstruction by itself. +- DirectWrite `IDWriteTextLayout` and SkParagraph `Paragraph` can be marked dirty/rebuilt for paragraph text, but they do not manage root object lifecycles. + +Best end game: + +1. Managed document-root controller that owns data subscriptions and produces renderer-neutral blocks/runs. +2. Avalonia custom control using normal layout invalidation for visible surfaces. + +Migration staging: + +- Phase 1: treat font-feature changes as layout dirty and cache identity changes. +- Phase 3: introduce a managed root controller for read-only or preview surfaces. +- Phase 4: move editing surfaces after selection and undo have parity. + +### 3. View-construction DSL (`VwEnv` and `IVwViewConstructor`) + +What it is and where it is used: + +- `VwEnv.cpp` is an imperative DSL used by managed/native view constructors: `OpenParagraph`, `AddString`, `AddObjProp`, `AddObjVecItems`, `AddLazyVecItems`, `OpenTable`, `OpenTableCell`, and property setters build a custom box tree. +- It is the bridge between FieldWorks model objects and the visual tree. + +Standard equivalents: + +- Avalonia data templates, bindings, panels, and controls are the closest UI framework equivalents. +- HTML/CSS has a similar declarative layout model, but it does not integrate with FieldWorks editing or object notifications. +- No text library replaces this; text libraries consume already-built runs/paragraphs. + +Best end game: + +1. Convert canonical view constructors into managed view models/templates that emit paragraphs, inline objects, tables, and adornments. +2. Keep `VwEnv` as a compatibility adapter while each view moves. + +Migration staging: + +- Phase 1: do not change the DSL beyond feature propagation. +- Phase 3: prototype one read-only canonical surface in Avalonia using renderer-neutral view data. +- Phase 4: replace editing constructors only after command/selection tests pass. + +### 4. Box tree and non-text layout + +What it is and where it is used: + +- Views builds a custom hierarchy of boxes for paragraphs, piles, divisions, inner piles, pictures, tables, table cells, borders, margins, and embedded objects. +- Key areas include `Src/views/VwBox.cpp`, `Src/views/VwTextBoxes.cpp`, `Src/views/VwTableBox.cpp`, and `Src/views/VwEnv.cpp`. + +Standard equivalents: + +- Avalonia panels, `Grid`, custom controls, and layout passes can replace much of the non-text box layout. +- SkParagraph placeholders and DirectWrite inline objects cover embedded inline spaces inside text. +- Pango and SkParagraph are paragraph engines, not general document layout systems. + +Best end game: + +1. Use Avalonia for non-text layout and a paragraph engine for text layout. +2. Preserve a small FieldWorks document-layout layer for interlinear, linguistic, and embedded-object semantics that are not stock UI patterns. + +Migration staging: + +- Phase 3: migrate read-only non-text layout blocks first. +- Phase 4: migrate tables/interlinear/embedded editing after hit testing and accessibility are validated. + +### 5. Paragraph building, wrapping, and line layout + +What it is and where it is used: + +- `VwTextBoxes.cpp` contains `ParaBuilder` and paragraph/string box behavior for line breaking, measuring, fitting, backtracking, justification, drop caps, bullets/numbers, exact line height, widows/orphans, and physical box ordering. +- It is one of the densest custom areas and underlies rendering, selection, printing, search highlights, and overlays. + +Standard equivalents: + +- DirectWrite `IDWriteTextLayout` provides formatted text layout, line metrics, drawing, typography, and hit testing. +- SkParagraph `Paragraph` provides `layout`, `paint`, `getLineMetrics`, `getRectsForRange`, `getGlyphPositionAtCoordinate`, and word boundaries. +- Pango `PangoLayout` provides paragraph formatting, wrapping, justification, alignment, cursor positions, and logical/physical conversions. +- ICU `BreakIterator` provides standard character/word/line break points but not full line layout. + +Best end game: + +1. Use Avalonia/SkParagraph for cross-platform paragraph layout where possible. +2. Keep DirectWrite as a Windows-native spike/fallback candidate if Avalonia text layout cannot satisfy exotic-script or hit-test requirements. + +Migration staging: + +- Phase 1: add feature-on/off visual baselines for paragraphs before changing layout engines. +- Phase 2: remove Graphite only when OpenType/HarfBuzz shaping and line metrics are covered. +- Phase 3: compare legacy Views, Avalonia, and SkParagraph on canonical paragraph cases. +- Phase 4: replace `ParaBuilder` only after bidi, selection, printing, and interlinear cases are covered. + +### 6. Text shaping and glyph placement + +What it is and where it is used: + +- `Src/views/lib/GraphiteEngine.cpp` and `GraphiteSegment` shape Graphite fonts and expose configurable Graphite features. +- `Src/views/lib/UniscribeEngine.cpp` and `UniscribeSegment.cpp` use classic Uniscribe `ScriptItemize`, `ScriptShape`, and `ScriptPlace` for non-Graphite text. +- Phase 1 must add OpenType feature application without replacing the Views layout model. + +Standard equivalents: + +- HarfBuzz is the standard shaping core for OpenType and many scripts, but it is shaping only. +- DirectWrite `IDWriteTextAnalyzer` exposes script, bidi, line-break analysis, glyph mapping, and placement. +- Avalonia `TextShaper` shapes text and `GlyphRun` represents shaped glyph runs. +- SkParagraph performs shaping through its paragraph pipeline and exposes glyph runs through visitors. + +Best end game: + +1. Phase 1 production: Uniscribe OpenType APIs because they are the smallest safe change to current Views. +2. Long term: HarfBuzz through Avalonia/Skia or another managed abstraction, with ICU for bidi/boundaries. + +Migration staging: + +- Phase 1: branch Uniscribe to OpenType APIs only when features are present; keep old behavior for empty features and keep Graphite intact. +- Phase 2: remove Graphite after font compatibility and project-data migration policy are ready. +- Phase 3: compare HarfBuzz/Avalonia shaping data against legacy baselines. + +### 7. Font-feature discovery, storage, and application + +What it is and where it is used: + +- FieldWorks already stores feature strings as `tag=value` in writing systems/styles and passes them through `ktptFontVariations` and `LgCharRenderProps`. +- `FontFeaturesButton.cs` and `DefaultFontsControl.cs` currently gate feature UI mostly on Graphite. +- `GraphiteEngine` supports feature discovery through `IRenderingFeatures`; `UniscribeEngine` currently ignores feature data. + +Standard equivalents: + +- DirectWrite `IDWriteTypography::AddFontFeature` applies OpenType features to text ranges. +- Avalonia exposes `TextElement.FontFeatures` and `FontFeatureCollection` using HarfBuzz-like syntax. +- HarfBuzz supports OpenType features during shaping. +- CSS exposes `font-feature-settings`, which FieldWorks already emits for exports. + +Best end game: + +1. Renderer-neutral feature model in FieldWorks (`tag=value`) with renderer-specific adapters. +2. Avalonia/HarfBuzz syntax adapter for future UI, tests, and rendering. + +Migration staging: + +- Phase 1: shared parser/normalizer, provider-based UI, Uniscribe OpenType adapter, visual tests. +- Phase 2: preserve old Graphite values but remove Graphite-only UI behavior when policy is ready. +- Phase 3: reuse the same feature provider in Avalonia controls. + +### 8. Bidi, script itemization, and number substitution + +What it is and where it is used: + +- Views handles paragraph direction, weak-direction adjustment, physical box ordering, script runs, and Uniscribe itemization as part of paragraph layout and selection. +- Key areas: `VwTextBoxes.cpp`, `UniscribeSegment.cpp`, and selection movement in `VwSelection.cpp`. + +Standard equivalents: + +- DirectWrite `IDWriteTextAnalyzer` has `AnalyzeBidi`, `AnalyzeScript`, `AnalyzeLineBreakpoints`, and `AnalyzeNumberSubstitution`. +- ICU `ubidi` implements the Unicode bidi algorithm. +- Pango and SkParagraph include bidi-aware paragraph layout. + +Best end game: + +1. Let the paragraph/text engine own bidi and script itemization when possible. +2. Use ICU directly for any FieldWorks semantic operations that need text boundaries independent of rendering. + +Migration staging: + +- Phase 1: add at least one bidi or multi-writing-system feature baseline to prevent OpenType regressions. +- Phase 3: compare bidi line layout and caret movement between Views and Avalonia/SkParagraph. +- Phase 4: replace custom bidi movement only after keyboard/selection parity is proven. + +### 9. Grapheme, word, and line boundaries + +What it is and where it is used: + +- `VwSelection.cpp` and `VwTextBoxes.cpp` contain custom word expansion, arrow movement, editable substring selection, search ranges, line boundary adjustment, and boundary-sensitive deletion logic. +- `VwParagraphBox::MakeSourceNfd` and typing logic also reflect normalization-sensitive text behavior. + +Standard equivalents: + +- ICU `BreakIterator` supports grapheme/character, word, line, and sentence boundaries, including dictionary support for languages without spaces. +- SkParagraph exposes `getWordBoundary` and glyph/cluster information. +- Pango exposes cursor movement and logical attributes. +- DirectWrite supports hit testing and line metrics, but ICU is the better standalone boundary service. + +Best end game: + +1. Use ICU for renderer-independent boundaries and word movement rules. +2. Use the active paragraph engine for visual caret and line-position mapping. + +Migration staging: + +- Phase 2: introduce boundary-service tests around current behavior. +- Phase 3: use the same tests for Avalonia/SkParagraph caret and word movement. +- Phase 4: delete custom boundary logic only after language-specific cases pass. + +### 10. Style/property resolution and writing-system defaults + +What it is and where it is used: + +- `VwPropertyStore.cpp` resolves text props, writing-system defaults, style inheritance, font variations, effects, and concrete character/paragraph properties. +- It feeds `LgCharRenderProps` consumed by render engines and paragraph layout. + +Standard equivalents: + +- Avalonia `TextElement` inherited properties and `TextRunProperties` can represent font family, size, style, weight, stretch, decorations, foreground, line height, and font features. +- CSS has a cascade model, but FieldWorks style/writing-system semantics are domain-specific. +- DirectWrite and SkParagraph accept formatted ranges after style resolution; they do not replace the resolver. + +Best end game: + +1. Move style resolution to managed renderer-neutral code that emits text runs and paragraph properties. +2. Keep renderer adapters thin: Views props, DirectWrite ranges, SkParagraph `TextStyle`, and Avalonia `TextRunProperties`. + +Migration staging: + +- Phase 1: ensure `ktptFontVariations` participates in render/layout cache identity. +- Phase 3: create a managed run model for one Avalonia preview/control. +- Phase 4: retire native property-store behavior after all writing-system/style cases pass. + +### 11. Text source model (`ITsString`, runs, embedded objects) + +What it is and where it is used: + +- Views consumes FieldWorks `ITsString`/`TsTextProps` runs, object replacement behavior, writing-system runs, and string properties to build boxes and render text. +- Key areas: `VwEnv.cpp`, `VwTextBoxes.cpp`, `VwPropertyStore.cpp`, and selection string extraction in `VwSelection.cpp`. + +Standard equivalents: + +- Avalonia `ITextSource` and `TextRunProperties` are close structural equivalents for formatted text runs. +- DirectWrite `IDWriteTextLayout` consumes strings plus per-range formatting. +- SkParagraph `ParagraphBuilder` accepts UTF-8/UTF-16 text, pushed `TextStyle`, and placeholders. + +Best end game: + +1. Create a managed adapter from `ITsString` and object placeholders to renderer-neutral text runs. +2. Keep `ITsString` as the domain text model until a separate product decision replaces it. + +Migration staging: + +- Phase 1: pass feature strings through existing run props. +- Phase 3: build `ITsString` to Avalonia/SkParagraph run adapters for previews. +- Phase 4: route editing through the same adapter after round-trip tests are stable. + +### 12. Selection, caret geometry, and hit testing + +What it is and where it is used: + +- `VwSelection.cpp` and `VwTextBoxes.cpp` implement insertion points, ranges, bidirectional caret behavior, physical/logical arrow movement, point-to-offset mapping, range rectangles, selection drawing, picture selections, and editable-position discovery. +- These behaviors are central to data-entry quality. + +Standard equivalents: + +- DirectWrite `IDWriteTextLayout` exposes `HitTestPoint`, `HitTestTextPosition`, and `HitTestTextRange`. +- Avalonia `TextLayout` exposes `HitTestPoint`, `HitTestTextPosition`, and `HitTestTextRange`; `GlyphRun` exposes caret-hit utilities. +- SkParagraph exposes `getGlyphPositionAtCoordinate`, `getRectsForRange`, and glyph cluster APIs. +- Pango exposes `index_to_pos`, `xy_to_index`, cursor positions, and visual cursor movement. + +Best end game: + +1. Use paragraph-engine hit testing for glyph/line geometry. +2. Keep a FieldWorks selection model above it for object paths, editable/non-editable regions, interlinear views, and undo grouping. + +Migration staging: + +- Phase 1: add selection-related OpenType metric/placement tests so features do not stale-cache hit testing. +- Phase 3: compare selection rectangles and caret locations in read-only/limited-edit Avalonia surfaces. +- Phase 4: migrate full editing only after keyboard, bidi, object, and interlinear selection tests pass. + +### 13. Editing commands, typing, normalization, and undo + +What it is and where it is used: + +- `VwSelection.cpp` handles typing, backspace/delete, control-backspace/delete, replacing ranges, property cleanup, editable substring callbacks, undo tasks, and display updates. +- `OnTypingMethod` contains complex handling for combining marks, protected methods, integer fields, and selection updates. + +Standard equivalents: + +- Avalonia and WinUI text controls provide standard editing behavior, but FieldWorks editable views are not plain text boxes. +- Windows TSF provides platform multilingual input services. +- ICU can help with boundaries/normalization, but not FieldWorks data commits or undo semantics. + +Best end game: + +1. Managed FieldWorks editing command layer that owns domain updates, undo, and constraints. +2. Platform text-input integration through Avalonia/WinUI/TSF equivalents rather than native Views internals. + +Migration staging: + +- Phase 2: write characterization tests for typing/deletion in complex-script and combining-mark cases. +- Phase 3: use limited edit prototypes only after selection geometry is stable. +- Phase 4: migrate canonical editable surfaces and keep old Views fallback until undo/input parity is proven. + +### 14. Lazy loading, notifier maps, and data invalidation + +What it is and where it is used: + +- `VwEnv::AddLazyVecItems`, root-box notifier maps, and `VwRootBox::PropChanged` allow large FieldWorks data sets to be displayed incrementally and updated from model changes. +- This is part data binding, part virtualization, part incremental document construction. + +Standard equivalents: + +- Avalonia virtualization, data templates, observable collections, and invalidation can replace UI-framework mechanics. +- No text engine provides FieldWorks object-notifier semantics. + +Best end game: + +1. Managed incremental document/view model with observable invalidation. +2. Avalonia virtualization for visible collections and lazy expansion. + +Migration staging: + +- Phase 3: migrate one read-only lazy vector scenario. +- Phase 4: migrate editable lazy views after notifier and selection path tests exist. + +### 15. Tables, interlinear layout, pictures, and inline objects + +What it is and where it is used: + +- Views supports custom tables, piles, embedded pictures/objects, interlinear-style nested layout, paragraph numbers, and placeholders. +- Key areas include `VwEnv.cpp`, `VwTableBox.cpp`, `VwTextBoxes.cpp`, and `VwSelection.cpp` picture-selection handling. + +Standard equivalents: + +- Avalonia `Grid`, panels, custom controls, and item controls can handle many block/table layouts. +- DirectWrite inline objects and SkParagraph placeholders cover inline embedded items inside paragraphs. +- SkParagraph `addPlaceholder` is a direct paragraph placeholder concept. + +Best end game: + +1. Use Avalonia layout for block/table/interlinear structure. +2. Use paragraph-engine placeholders only for true inline object gaps. + +Migration staging: + +- Phase 3: port read-only table/interlinear preview cases. +- Phase 4: port editing, picture selection, and embedded object hit testing. + +### 16. Overlays, tags, underlines, spellcheck, and search highlighting + +What it is and where it is used: + +- `VwTextBoxes.cpp` draws overlay tags, spelling squiggles, underline effects, search results, selection highlights, and other adornments on top of paragraph geometry. +- `SpellCheckMethod`, `DrawOverlayTags`, `DrawTags`, and `DrawUnderline` are tightly coupled to line boxes. + +Standard equivalents: + +- Avalonia supports text decorations and custom drawing/adorners. +- DirectWrite supports underline/strikethrough, drawing effects, and custom `IDWriteTextRenderer` callbacks. +- SkParagraph returns range rectangles and can be painted under custom overlays. +- Pango supports attributes and layout rectangles. + +Best end game: + +1. A renderer-neutral adornment layer that maps semantic ranges to paragraph-engine rectangles. +2. Avalonia custom drawing for overlays and tags. + +Migration staging: + +- Phase 1: include feature-on/off visual baselines with at least one decoration/highlight scenario if feasible. +- Phase 3: port read-only overlays/search highlights. +- Phase 4: port spellcheck/editing overlays after selection geometry parity. + +### 17. Graphics abstraction and rasterization + +What it is and where it is used: + +- Views draws through `IVwGraphics` abstractions over platform graphics, with native render engines returning glyph geometry and metrics. +- This keeps the legacy engine decoupled from a single drawing backend but also preserves native/GDI-era assumptions. + +Standard equivalents: + +- DirectWrite can draw via Direct2D or custom `IDWriteTextRenderer` callbacks. +- Avalonia draws through `DrawingContext` and commonly uses Skia. +- Skia provides cross-platform 2D drawing, text blobs, and paragraph painting. +- Pango commonly pairs with Cairo. + +Best end game: + +1. Avalonia `DrawingContext`/Skia for product UI. +2. Keep DirectWrite/Direct2D as a Windows-native reference path only if needed for fidelity or migration debugging. + +Migration staging: + +- Phase 1: keep GDI/Uniscribe raster output and add baselines. +- Phase 3: add tolerant cross-renderer comparisons using Skia/Avalonia output. +- Phase 4: remove native graphics abstraction after all rendering consumers migrate. + +### 18. Printing and pagination + +What it is and where it is used: + +- `VwRootBox.cpp` and paragraph boxes support page layout, page printing, page-line extraction, widows/orphans, and print-specific drawing. + +Standard equivalents: + +- DirectWrite can draw `IDWriteTextLayout` to Direct2D/print-compatible targets. +- Skia can render to surfaces and PDF-like outputs depending on integration. +- Avalonia printing support is not a complete replacement for FieldWorks document pagination by itself. + +Best end game: + +1. A shared document pagination service using the same paragraph/layout engine as screen rendering. +2. Platform-specific print output adapters underneath that service. + +Migration staging: + +- Phase 3: keep legacy printing while screen previews migrate. +- Phase 4: migrate printing only after on-screen layout parity and page baseline tests exist. + +### 19. Accessibility and automation + +What it is and where it is used: + +- Views has custom selection, object-path, and rendered-document semantics that assistive technologies and UI tests may depend on, even where support is currently incomplete. +- Any replacement must expose text, caret, selection, tables, embedded objects, and navigation in platform accessibility terms. + +Standard equivalents: + +- Windows UI Automation provides provider/client APIs, control patterns, properties, events, and a tree model. +- Avalonia has automation infrastructure that maps controls to platform accessibility APIs, but custom text surfaces may need custom peers/patterns. + +Best end game: + +1. Use Avalonia automation peers for standard controls. +2. Implement custom text/document automation peers for FieldWorks document surfaces. + +Migration staging: + +- Phase 3: include accessibility checks in Avalonia preview prototypes. +- Phase 4: block retirement of native editable views until UIA/text-pattern parity is tested. + +### 20. IME, TSF, and complex text input + +What it is and where it is used: + +- FieldWorks users rely on complex keyboards, input methods, dead keys, combining marks, and multilingual text entry. Native Views editing is tied to Windows input behavior. + +Standard equivalents: + +- Windows TSF is the platform framework for advanced text input, keyboard processors, handwriting, speech, and multilingual support. +- Avalonia/WinUI text input abstractions can handle standard control input, but custom document editors need careful integration and testing. + +Best end game: + +1. Let the UI framework handle ordinary input plumbing where possible. +2. Keep explicit FieldWorks tests for IME/composition/combining behavior and use platform TSF hooks only where framework support is insufficient. + +Migration staging: + +- Phase 2: characterize current input behavior for exotic-language scenarios. +- Phase 3: test Avalonia input prototypes with real keyboards/IME cases. +- Phase 4: migrate data-entry surfaces only after IME and composition parity. + +### 21. Search, spellcheck, and linguistic services + +What it is and where it is used: + +- Paragraph boxes perform search and spellcheck highlighting with writing-system-specific behavior and dictionary selection. +- These services are semantically FieldWorks-specific even when their visual display is part of Views. + +Standard equivalents: + +- ICU helps with boundaries and collation-like text analysis, but spelling dictionaries and linguistic behavior remain FieldWorks/domain services. +- Modern UI frameworks can draw highlights but do not replace the services. + +Best end game: + +1. Keep search/spellcheck as managed/domain services. +2. Treat rendering as an adornment consumer of semantic ranges. + +Migration staging: + +- Phase 3: separate semantic service output from native drawing for read-only highlighting. +- Phase 4: migrate editing spellcheck underlines after paragraph rectangles and invalidation are stable. + +### 22. Cache/reuse/performance identity + +What it is and where it is used: + +- Views caches/reuses layout boxes, render engines, paragraph fragments, and now post-`001-render-speedup` rendered output or buffered frames. +- Feature strings, font fallback, writing system, style props, direction, and text must be part of any shaped/layout/render cache identity. + +Standard equivalents: + +- SkParagraph has a `ParagraphCache` and font caches. +- Avalonia and DirectWrite have internal layout/font caches, but FieldWorks still owns when data and style changes dirty output. + +Best end game: + +1. Explicit renderer-neutral cache keys for text layout and rendered baselines. +2. Keep caches near the active renderer, but keep invalidation identity in FieldWorks-owned code. + +Migration staging: + +- Phase 1: add cache-invalidation tests for feature toggles. +- Phase 3: reuse the same identity model for Avalonia/SkParagraph comparison tests. + +### 23. Vertical/inverted/physical-order special cases + +What it is and where it is used: + +- Views has `VwInvertedParaBox`, inverted paragraph builders, physical box order helpers, and paragraph direction depth logic. +- These special cases are easy to miss because most common surfaces look horizontal and LTR. + +Standard equivalents: + +- HarfBuzz supports vertical shaping directions, but not paragraph layout. +- DirectWrite, Pango, and SkParagraph have varying support for vertical text and physical/logical mapping. +- Avalonia supports `FlowDirection`, but vertical text should be treated as a separate capability check. + +Best end game: + +1. Decide whether each special case is still product-required. +2. Preserve required cases as explicit acceptance tests before replacement. + +Migration staging: + +- Phase 2: inventory real usage of inverted/vertical-like paths. +- Phase 3: spike required cases in Avalonia/SkParagraph/DirectWrite. +- Phase 4: remove dead special cases only with product sign-off. + +### 24. Graphite-specific rendering and project compatibility + +What it is and where it is used: + +- Graphite support is implemented in `GraphiteEngine`/`GraphiteSegment`, enabled from writing-system settings, and exposed through Graphite-centric UI labels and feature discovery. +- Some existing projects may contain Graphite feature strings or rely on Graphite fonts for exotic scripts. + +Standard equivalents: + +- HarfBuzz/OpenType is the long-term shaping path, but Graphite-specific smart-font behavior may not have a one-to-one OpenType equivalent. +- Graphite2 remains the only direct equivalent for Graphite behavior until fonts and project data are migrated. + +Best end game: + +1. Move users to OpenType fonts/features where equivalents exist. +2. Preserve old project data and provide warnings/migration guidance for Graphite-only settings. + +Migration staging: + +- Phase 1: preserve Graphite while adding OpenType support. +- Phase 2: remove Graphite only after compatibility policy, user messaging, and baseline evidence exist. +- Phase 3/4: do not carry Graphite concepts into Avalonia except as migration metadata. + +## Recommended Staging Across Phases + +### Phase 1: OpenType features in current Views + +- Keep native Views and WinForms as production rendering. +- Add renderer-neutral feature parsing/provider UI. +- Apply OpenType features in the existing Uniscribe path. +- Add high-level UI and visual tests in every canonical font-selection place. +- Add HarfBuzzSharp + SkiaSharp only as test/comparison tooling. +- Record baselines for feature-on/off, bidi/multi-writing-system, selection geometry, and cache invalidation. + +### Phase 2: Remove Graphite, keep WinForms + +- Use Phase 1 baselines to prove OpenType/Uniscribe behavior does not regress. +- Characterize typing, deletion, boundaries, Graphite-only settings, and complex keyboard behavior. +- Add compatibility warnings or migration guidance for Graphite-only project data. +- Introduce renderer-neutral boundary and text-run services where safe. + +### Phase 3: Add Avalonia alongside WinForms + +- Start with read-only surfaces and previews. +- Use managed adapters from `ITsString`/view-constructor output to Avalonia/SkParagraph text runs. +- Compare output to legacy Views baselines with exact checks for legacy renderer and tolerant/semantic checks across renderers. +- Keep native Views for canonical editing and printing until parity is proven. + +### Phase 4: Retire WinForms/native Views + +- Migrate editing surfaces after selection, IME/TSF, undo, accessibility, lazy loading, and printing all have tests. +- Remove native COM and Views box layout only after the managed/Avalonia document surface covers canonical FieldWorks workflows. +- Keep renderer-neutral feature strings and visual/semantic baselines as long-term regression assets. \ No newline at end of file From c919637904293862cd4f9bbb9d6a4b2b225c7cc2 Mon Sep 17 00:00:00 2001 From: John Lambert Date: Thu, 7 May 2026 13:57:32 -0400 Subject: [PATCH 4/7] Add word generation font options --- .../xWorksTests/LcmWordGeneratorTests.cs | 60 +++++++++++++++++++ .../add-opentype-font-features/design.md | 10 ++++ .../add-opentype-font-features/proposal.md | 2 + .../add-opentype-font-features/research.md | 21 +++++++ .../specs/font-feature-settings/spec.md | 19 ++++++ .../add-opentype-font-features/tasks.md | 8 +++ 6 files changed, 120 insertions(+) diff --git a/Src/xWorks/xWorksTests/LcmWordGeneratorTests.cs b/Src/xWorks/xWorksTests/LcmWordGeneratorTests.cs index 6af984d64e..9615cfa3f9 100644 --- a/Src/xWorks/xWorksTests/LcmWordGeneratorTests.cs +++ b/Src/xWorks/xWorksTests/LcmWordGeneratorTests.cs @@ -8,6 +8,8 @@ using System.Linq; using System.Text.RegularExpressions; using System.Xml; +using DocumentFormat.OpenXml; +using DocumentFormat.OpenXml.Wordprocessing; using NUnit.Framework; using SIL.FieldWorks.Common.Framework; using SIL.FieldWorks.Common.FwUtils; @@ -19,6 +21,7 @@ using SIL.TestUtilities; using XCore; using static SIL.FieldWorks.XWorks.LcmWordGenerator; +using W14 = DocumentFormat.OpenXml.Office2010.Word; // ReSharper disable StringLiteralTypo namespace SIL.FieldWorks.XWorks @@ -59,6 +62,7 @@ static LcmWordGeneratorTests() WordNamespaceManager.AddNamespace("w", openXmlSchema); WordNamespaceManager.AddNamespace("r", openXmlSchema); WordNamespaceManager.AddNamespace("wp", openXmlSchema); + WordNamespaceManager.AddNamespace("w14", "http://schemas.microsoft.com/office/word/2010/wordml"); } [OneTimeSetUp] @@ -210,6 +214,62 @@ public void Setup() DefaultSettings.StylesGenerator.AddGlobalStyles(null, new ReadOnlyPropertyTable(m_propertyTable)); } + [Test] + public void GenerateCharacterStyleFromLcmStyleSheet_OpenTypeFontFeatures_AddsWordTypographyProperties() + { + var styleName = "WordFeatureStyle" + Guid.NewGuid().ToString("N"); + var fontInfo = new FontInfo { m_features = { ExplicitValue = "liga=0,lnum=1,pnum=1,calt=0,ss02=0,cv01=2" } }; + var projectStyle = new TestStyle(fontInfo, Cache) { Name = styleName, IsParagraphStyle = false }; + FontHeightAdjuster.StyleSheetFromPropertyTable(m_propertyTable).Styles.Add(projectStyle); + + var style = WordStylesGenerator.GenerateCharacterStyleFromLcmStyleSheet(styleName, Cache.DefaultVernWs, + new ReadOnlyPropertyTable(m_propertyTable)); + + var runProps = style.GetFirstChild(); + AssertWordTypographyProperties(runProps, W14.LigaturesValues.None, W14.NumberFormValues.Lining, + W14.NumberSpacingValues.Proportional, false, 2U, false); + } + + [Test] + public void GetExplicitFontProperties_OpenTypeFontFeatures_AddsWordTypographyProperties() + { + var fontInfo = new FontInfo { m_features = { ExplicitValue = "liga=1,clig=1,onum=1,tnum=1,calt=1,ss03=1,cv01=2" } }; + + var runProps = WordStylesGenerator.GetExplicitFontProperties(fontInfo); + + AssertWordTypographyProperties(runProps, W14.LigaturesValues.StandardContextual, W14.NumberFormValues.OldStyle, + W14.NumberSpacingValues.Tabular, true, 3U, true); + } + + private static void AssertWordTypographyProperties(OpenXmlCompositeElement runProps, + W14.LigaturesValues ligaturesValue, W14.NumberFormValues numberFormValue, + W14.NumberSpacingValues numberSpacingValue, bool contextualAlternativesValue, + uint stylisticSetId, bool stylisticSetValue) + { + Assert.That(runProps, Is.Not.Null); + var ligatures = runProps.GetFirstChild(); + Assert.That(ligatures, Is.Not.Null); + Assert.That(ligatures.Val.Value, Is.EqualTo(ligaturesValue)); + + var numberForm = runProps.GetFirstChild(); + Assert.That(numberForm, Is.Not.Null); + Assert.That(numberForm.Val.Value, Is.EqualTo(numberFormValue)); + + var numberSpacing = runProps.GetFirstChild(); + Assert.That(numberSpacing, Is.Not.Null); + Assert.That(numberSpacing.Val.Value, Is.EqualTo(numberSpacingValue)); + + var contextualAlternatives = runProps.GetFirstChild(); + Assert.That(contextualAlternatives, Is.Not.Null); + Assert.That(contextualAlternatives.Val.Value, Is.EqualTo(contextualAlternativesValue)); + + var stylisticSets = runProps.GetFirstChild(); + Assert.That(stylisticSets, Is.Not.Null); + var styleSet = stylisticSets.Elements().Single(); + Assert.That(styleSet.Id.Value, Is.EqualTo(stylisticSetId)); + Assert.That(styleSet.Val.Value, Is.EqualTo(stylisticSetValue)); + } + [Test] public void GenerateWordDocForEntry_OneSenseWithGlossGeneratesCorrectResult() diff --git a/openspec/changes/add-opentype-font-features/design.md b/openspec/changes/add-opentype-font-features/design.md index eacd53afec..ef0a4175e1 100644 --- a/openspec/changes/add-opentype-font-features/design.md +++ b/openspec/changes/add-opentype-font-features/design.md @@ -72,6 +72,14 @@ The longer product phases are: add OpenType features now, remove Graphite later **Rationale:** Golden WinForms/Views captures help Phase 1 verification and later Avalonia comparison. Exact pixels are appropriate for same-renderer regressions; tolerant or semantic comparisons are appropriate across GDI/Uniscribe and Skia/HarfBuzz. +### 7. Word DOCX export maps only documented Word typography features + +**Decision:** Map FieldWorks `tag=value` font feature strings to Office 2010 WordprocessingML `w14` typography elements only where Microsoft documents a Word representation: ligatures, number form, number spacing, contextual alternatives, and stylistic sets. + +**Rationale:** CSS can preserve arbitrary OpenType feature tags, but WordprocessingML does not provide a general `font-feature-settings` equivalent. A best-effort documented subset avoids producing invalid DOCX while preserving the features Word can actually display and round-trip. + +**Alternatives considered:** Store arbitrary tags in custom XML or undocumented extension markup. Rejected because Word would not apply those settings to text rendering and the export would give users a false parity signal. + ## Risks / Trade-offs | Risk | Mitigation | @@ -82,6 +90,7 @@ The longer product phases are: add OpenType features now, remove Graphite later | OpenType feature labels are incomplete or unlocalized | Use resource-backed labels for common tags and fall back to the four-character tag. | | Test fonts cannot be redistributed | Confirm SIL Open Font License or another redistributable license before adding binaries. | | HarfBuzz/Skia visual output differs from GDI/Uniscribe | Compare shaping data first; use tolerant image comparisons for cross-renderer evidence. | +| Word DOCX cannot represent every OpenType feature tag | Map only documented `w14` typography elements and document unsupported tags such as character variants and private features. | ## Migration Plan @@ -92,6 +101,7 @@ The longer product phases are: add OpenType features now, remove Graphite later 5. Add render snapshot scenarios using the merged render baseline infrastructure. 6. Add test-only HarfBuzzSharp + SkiaSharp comparison tests in FieldWorks test projects. 7. Update help/localized UI text. +8. Add Word DOCX export mapping for the documented WordprocessingML subset and tests that inspect generated Open XML. Rollback strategy: disable the OpenType provider and native OpenType shaping path behind a feature flag or fallback path if regressions are found; Graphite and old Uniscribe behavior remain available. diff --git a/openspec/changes/add-opentype-font-features/proposal.md b/openspec/changes/add-opentype-font-features/proposal.md index df7d9d7b4f..bddec76776 100644 --- a/openspec/changes/add-opentype-font-features/proposal.md +++ b/openspec/changes/add-opentype-font-features/proposal.md @@ -11,6 +11,7 @@ LT-22324 requires FieldWorks to split Font Features from the Graphite-only UI an - Update render/cache invalidation rules so feature changes are treated as layout-changing, especially after `001-render-speedup` is merged. - Add UI/component tests for font-feature controls and high-level visual rendering tests proving feature settings change output. - Add a test-only HarfBuzzSharp + SkiaSharp comparison path for shaping/rendering confidence toward future Avalonia migration; this path is not a production renderer in Phase 1. +- Add Word DOCX export support for the subset of OpenType font features that Microsoft WordprocessingML can represent, and document unsupported feature tags. - Document research for later phases: Graphite removal while retaining WinForms, Avalonia alongside WinForms, and eventual WinForms retirement. ## Non-goals @@ -39,5 +40,6 @@ LT-22324 requires FieldWorks to split Font Features from the Graphite-only UI an - **Managed rendering bridge:** `Src/Common/SimpleRootSite/RenderEngineFactory.cs` and post-`001-render-speedup` render/cache invalidation paths. - **Native C++ Views:** `Src/views/lib/UniscribeEngine.cpp`, `UniscribeSegment.cpp`, `Render.idh` only through additive interfaces if needed, and existing Graphite code for regression coverage. - **Tests:** FwCore dialog/control tests, SimpleRootSite/render-factory tests, native Views tests, and post-`001-render-speedup` render baseline/snapshot tests. +- **Word DOCX export:** `Src/xWorks/WordStylesGenerator.cs`, configured dictionary/reversal DOCX tests in `Src/xWorks/xWorksTests/LcmWordGeneratorTests.cs`, and OpenType export documentation. - **Test-only dependencies:** HarfBuzzSharp + SkiaSharp in test/comparison projects only. - **Documentation/help:** FieldWorks Help and localized UI text for the renamed Font Features/Font Options surfaces. \ No newline at end of file diff --git a/openspec/changes/add-opentype-font-features/research.md b/openspec/changes/add-opentype-font-features/research.md index b7f1b069a6..4460f17c42 100644 --- a/openspec/changes/add-opentype-font-features/research.md +++ b/openspec/changes/add-opentype-font-features/research.md @@ -110,3 +110,24 @@ Useful references: - Test-only comparison: HarfBuzzSharp and SkiaSharp remain isolated to `RenderComparisonTests`. HarfBuzzSharp is used only as a test comparison path for shaping data; production rendering remains Uniscribe/Graphite. - Export audit: CSS already emits `font-feature-settings` and is covered by `GenerateCssForConfiguration_CharStyleFontFeaturesWorks`. Notebook export preserves writing-system `DefaultFontFeatures`. `WordStylesGenerator` did not show a feature-string mapping and should be tracked separately if Word export parity is required. - Help/docs: no existing FieldWorks help source for Font Options was found in this workspace. Phase 1 adds `Docs/opentype-font-features.md` to document the UI, storage model, temporary Graphite role, and export status. + +## Word DOCX Export Analysis + +Microsoft Word support for OpenType features is exposed in DOCX through a fixed Office 2010 WordprocessingML typography subset, not through an arbitrary CSS-style `font-feature-settings` property. The relevant Open XML SDK classes live under `DocumentFormat.OpenXml.Office2010.Word` and serialize into the `w14` namespace (`http://schemas.microsoft.com/office/word/2010/wordml`). + +Authoritative references gathered for the implementation: + +- Microsoft Support: Publisher/Office typography UI covers number styles, ligatures, stylistic sets, swash, stylistic alternates, true small caps, and font-dependent OpenType availability: https://support.microsoft.com/en-us/office/use-typographic-styles-to-increase-the-impact-of-your-publication-10e14096-452f-4d3b-9938-1d537572a377 +- Microsoft Support: Word compatibility notes identify ligatures, stylistic sets, contextual alternative characters, font-based kerning, and number forms/spacing as advanced typography features that may be preserved even when older Word versions do not display them: https://support.microsoft.com/en-us/office/about-ligatures-and-compatibility-64ffd007-6e5c-4d38-b87d-0935f37714fe +- OpenType feature tag registry and definitions: https://learn.microsoft.com/en-us/typography/opentype/spec/featuretags, plus registered descriptions for `calt`, `clig`, `cvXX`, `kern`, `liga`, `lnum`, `onum`, `pnum`, `smcp`, `ss01`-`ss20`, and `tnum`. +- Open XML SDK classes: `Ligatures` (`w14:ligatures`), `NumberingFormat` (`w14:numForm`), `NumberSpacing` (`w14:numSpacing`), `ContextualAlternatives` (`w14:cntxtAlts`), `StylisticSets` (`w14:stylisticSets`), and `StyleSet` (`w14:styleSet`). + +Planned DOCX subset: + +- `liga`, `clig`, `hlig`, and `dlig` map to the aggregate `w14:ligatures` value. +- `lnum` and `onum` map to `w14:numForm` values `lining` and `oldStyle`. +- `pnum` and `tnum` map to `w14:numSpacing` values `proportional` and `tabular`. +- `calt` maps to `w14:cntxtAlts`. +- `ss01` through `ss20` map to `w14:stylisticSets/w14:styleSet` with ids 1 through 20. + +Unsupported tags such as `cv01`-`cv99`, `smcp`, `c2sc`, `kern`, `salt`, `swsh`, and private/vendor tags do not have a documented arbitrary WordprocessingML feature-tag representation. They should be ignored by Word export while remaining valid for rendering and CSS export where those paths can consume them. diff --git a/openspec/changes/add-opentype-font-features/specs/font-feature-settings/spec.md b/openspec/changes/add-opentype-font-features/specs/font-feature-settings/spec.md index 84ed72cd73..3dba99d4b9 100644 --- a/openspec/changes/add-opentype-font-features/specs/font-feature-settings/spec.md +++ b/openspec/changes/add-opentype-font-features/specs/font-feature-settings/spec.md @@ -96,3 +96,22 @@ FieldWorks SHALL update user-visible strings and help so Font Features are descr #### Scenario: Help covers OpenType features - **WHEN** a user opens the relevant FieldWorks Help topic - **THEN** the Help content SHALL describe OpenType Font Features and their relationship to Graphite during Phase 1 + +### Requirement: Word DOCX export preserves supported OpenType font features +FieldWorks SHALL export supported OpenType font feature settings into configured dictionary/reversal Word DOCX output using documented Microsoft WordprocessingML typography elements. + +#### Scenario: Character style features are exported to Word typography properties +- **WHEN** a configured Word DOCX export includes a character style with supported OpenType feature settings +- **THEN** the generated Word style run properties SHALL include the equivalent Office 2010 `w14` typography elements for supported features + +#### Scenario: Explicit run features are exported to Word typography properties +- **WHEN** direct run font properties include supported OpenType feature settings +- **THEN** generated run properties SHALL include the equivalent Office 2010 `w14` typography elements for supported features + +#### Scenario: Unsupported feature tags do not break Word export +- **WHEN** a feature string contains tags that WordprocessingML cannot represent, such as `cv01`, `smcp`, or private feature tags +- **THEN** Word export SHALL ignore those unsupported tags without failing the export or removing supported tags from the same feature string + +#### Scenario: Word export uses a documented subset +- **WHEN** documentation describes Word export behavior +- **THEN** it SHALL list the supported WordprocessingML subset and identify arbitrary CSS-style feature tags as unsupported by DOCX export diff --git a/openspec/changes/add-opentype-font-features/tasks.md b/openspec/changes/add-opentype-font-features/tasks.md index d81c2921c6..c65ae20482 100644 --- a/openspec/changes/add-opentype-font-features/tasks.md +++ b/openspec/changes/add-opentype-font-features/tasks.md @@ -80,3 +80,11 @@ - [x] 10.4 Add `RenderEngineFactoryTests` coverage proving writing-system default OpenType features are normalized into `LgCharRenderProps.szFontVar`, equivalent feature strings reuse the renderer cache entry, and different feature strings create separate renderer cache entries. [Managed C# Tests] - [x] 10.5 Run `./test.ps1 -TestProject SimpleRootSiteTests -StartedBy agent`; result: `Total tests: 113`, `Passed: 113`. [Validation] - [x] 10.6 Run `./test.ps1 -SkipManaged -TestProject TestViews -StartedBy agent`; result: `Tests [Ok-Fail-Error]: [295-0-0]`. [Validation] + +## 11. Word DOCX Export Parity + +- [x] 11.1 Add OpenSpec requirements, research analysis, implementation plan, and tasks for Microsoft Word DOCX OpenType feature subset export. [OpenSpec] +- [ ] 11.2 Add failing managed tests proving style and explicit run font features emit documented WordprocessingML `w14` typography elements. [Managed C# Tests] +- [ ] 11.3 Implement a Word DOCX feature mapper that reuses the renderer-neutral parser and maps supported tags to `w14` elements. [Managed C#] +- [ ] 11.4 Keep unsupported tags non-fatal and document Word export subset behavior in `Docs/opentype-font-features.md`. [Docs] +- [ ] 11.5 Run targeted xWorks Word generator tests. [Validation] From 7b10ab580d92217ae0ac400f4570fa882b9db7aa Mon Sep 17 00:00:00 2001 From: John Lambert Date: Thu, 7 May 2026 14:49:25 -0400 Subject: [PATCH 5/7] Finish up the docx font updates --- Docs/opentype-font-features.md | 12 +- Src/views/Test/TestViewCaches.h | 41 +++++ Src/xWorks/WordStylesGenerator.cs | 169 +++++++++++++++++- .../xWorksTests/LcmWordGeneratorTests.cs | 9 +- .../add-opentype-font-features/tasks.md | 8 +- 5 files changed, 231 insertions(+), 8 deletions(-) diff --git a/Docs/opentype-font-features.md b/Docs/opentype-font-features.md index efb11c3551..90065f9512 100644 --- a/Docs/opentype-font-features.md +++ b/Docs/opentype-font-features.md @@ -6,4 +6,14 @@ In the current WinForms UI, use the Font Options button in font controls to choo Graphite feature IDs are still converted only at the Graphite renderer boundary. OpenType feature tags stay as four-character tags and are passed to the Uniscribe OpenType path when Graphite is not enabled. -For export, CSS output maps these values to `font-feature-settings`, and Notebook export preserves writing-system default font features in `DefaultFontFeatures`. Word export does not currently have a verified OpenType feature mapping and should be treated as follow-up work if Word parity is required. \ No newline at end of file +For export, CSS output maps these values to `font-feature-settings`, and Notebook export preserves writing-system default font features in `DefaultFontFeatures`. + +Word DOCX export preserves the subset of OpenType features that Microsoft WordprocessingML can represent with Office 2010 `w14` typography elements: + +- `liga`, `clig`, `hlig`, and `dlig` map to Word ligature settings. +- `lnum` and `onum` map to lining and old-style number forms. +- `pnum` and `tnum` map to proportional and tabular number spacing. +- `calt` maps to contextual alternatives. +- `ss01` through `ss20` map to Word stylistic sets. + +Other tags, including character variants such as `cv01`, small-cap features such as `smcp`, kerning, swashes, and private or vendor tags, do not have a documented arbitrary DOCX feature-tag representation. Word export ignores those unsupported tags while preserving supported tags from the same feature string. \ No newline at end of file diff --git a/Src/views/Test/TestViewCaches.h b/Src/views/Test/TestViewCaches.h index aaa0193e41..2b108c1d8d 100644 --- a/Src/views/Test/TestViewCaches.h +++ b/Src/views/Test/TestViewCaches.h @@ -11,6 +11,7 @@ This software is licensed under the LGPL, version 2.1 or later #include "testViews.h" #include "ColorStateCache.h" #include "FontHandleCache.h" +#include "LayoutCache.h" namespace TestViews { @@ -177,6 +178,46 @@ namespace TestViews m_cache = FontHandleCache(); } }; + + class TestShapeRunCache : public unitpp::suite + { + void testFontFeaturesArePartOfCacheKey() + { + ShapeRunCache cache; + SCRIPT_ANALYSIS sa; + ZeroMemory(&sa, sizeof(sa)); + sa.eScript = 1; + + const OLECHAR rgch[] = L"office"; + const int cch = 6; + const OLECHAR rgchFeatureOn[] = L"liga=1"; + const OLECHAR rgchFeatureOnCopy[] = L"liga=1"; + const OLECHAR rgchFeatureOff[] = L"liga=0"; + HFONT hfont = reinterpret_cast(static_cast(0x1234)); + + WORD prgGlyph[] = {1, 2, 3}; + SCRIPT_VISATTR prgsva[3]; + ZeroMemory(prgsva, sizeof(prgsva)); + int prgAdvance[] = {5, 5, 5}; + int prgcst[] = {0, 0, 0}; + GOFFSET prgoff[3]; + ZeroMemory(prgoff, sizeof(prgoff)); + WORD prgCluster[] = {0, 1, 2, 2, 2, 2}; + + cache.Store(rgch, cch, hfont, sa, rgchFeatureOn, prgGlyph, prgsva, + prgAdvance, prgcst, prgoff, prgCluster, 3, 15, false); + + unitpp::assert_true("same feature contents should hit shape cache", + cache.Find(rgch, cch, hfont, sa, rgchFeatureOnCopy) != NULL); + unitpp::assert_true("different feature contents should miss shape cache", + cache.Find(rgch, cch, hfont, sa, rgchFeatureOff) == NULL); + unitpp::assert_true("missing feature contents should miss feature-specific shape cache entry", + cache.Find(rgch, cch, hfont, sa, NULL) == NULL); + } + + public: + TestShapeRunCache(); + }; } #endif // TESTVIEWCACHES_H_INCLUDED diff --git a/Src/xWorks/WordStylesGenerator.cs b/Src/xWorks/WordStylesGenerator.cs index 616ad7ee84..16b4c82077 100644 --- a/Src/xWorks/WordStylesGenerator.cs +++ b/Src/xWorks/WordStylesGenerator.cs @@ -1,6 +1,8 @@ +using DocumentFormat.OpenXml; using DocumentFormat.OpenXml.Wordprocessing; using ExCSS; using SIL.FieldWorks.Common.Framework; +using SIL.FieldWorks.Common.FwUtils; using SIL.FieldWorks.Common.Widgets; using SIL.LCModel; using SIL.LCModel.Core.KernelInterfaces; @@ -12,6 +14,7 @@ using System.Diagnostics; using System.Linq; using XCore; +using W14 = DocumentFormat.OpenXml.Office2010.Word; namespace SIL.FieldWorks.XWorks { @@ -630,7 +633,11 @@ private static StyleRunProperties AddFontInfoWordStyles(BaseStyleInfo projectSty charDefaults.Append(new Strike()); } } - //TODO: handle remaining font features including from ws or default, + string fontFeatures; + if (GetFontValue(wsFontInfo.m_features, defaultFontInfo.Features, out fontFeatures)) + { + AddOpenTypeFontFeatureProperties(charDefaults, fontFeatures); + } return charDefaults; } @@ -763,9 +770,169 @@ public static RunProperties GetExplicitFontProperties(FontInfo fontInfo) runProps.Append(new Strike()); } } + + if (((InheritableStyleProp)fontInfo.Features).IsExplicit) + { + AddOpenTypeFontFeatureProperties(runProps, fontInfo.Features.Value); + } return runProps; } + private static void AddOpenTypeFontFeatureProperties(OpenXmlCompositeElement runProps, string fontFeatures) + { + RemoveOpenTypeFontFeatureProperties(runProps); + + var settings = FontFeatureSettings.Parse(fontFeatures); + int ligatureFlags = 0; + bool hasLigatureSetting = false; + W14.NumberFormValues? numberForm = null; + W14.NumberSpacingValues? numberSpacing = null; + bool? contextualAlternatives = null; + var styleSets = new List(); + + foreach (var setting in settings) + { + switch (setting.Tag) + { + case "liga": + hasLigatureSetting = true; + if (setting.Value != 0) + ligatureFlags |= 1; + break; + case "clig": + hasLigatureSetting = true; + if (setting.Value != 0) + ligatureFlags |= 2; + break; + case "hlig": + hasLigatureSetting = true; + if (setting.Value != 0) + ligatureFlags |= 4; + break; + case "dlig": + hasLigatureSetting = true; + if (setting.Value != 0) + ligatureFlags |= 8; + break; + case "lnum": + if (!numberForm.HasValue && setting.Value == 0) + numberForm = W14.NumberFormValues.Default; + else if (setting.Value != 0) + numberForm = W14.NumberFormValues.Lining; + break; + case "onum": + if (!numberForm.HasValue && setting.Value == 0) + numberForm = W14.NumberFormValues.Default; + else if (setting.Value != 0) + numberForm = W14.NumberFormValues.OldStyle; + break; + case "pnum": + if (!numberSpacing.HasValue && setting.Value == 0) + numberSpacing = W14.NumberSpacingValues.Default; + else if (setting.Value != 0) + numberSpacing = W14.NumberSpacingValues.Proportional; + break; + case "tnum": + if (!numberSpacing.HasValue && setting.Value == 0) + numberSpacing = W14.NumberSpacingValues.Default; + else if (setting.Value != 0) + numberSpacing = W14.NumberSpacingValues.Tabular; + break; + case "calt": + contextualAlternatives = setting.Value != 0; + break; + default: + uint styleSetId; + if (TryGetStylisticSetId(setting.Tag, out styleSetId)) + { + styleSets.Add(new W14.StyleSet { Id = styleSetId, Val = GetOnOffValue(setting.Value != 0) }); + } + break; + } + } + + if (hasLigatureSetting) + runProps.Append(new W14.Ligatures { Val = GetLigaturesValue(ligatureFlags) }); + if (numberForm.HasValue) + runProps.Append(new W14.NumberingFormat { Val = numberForm.Value }); + if (numberSpacing.HasValue) + runProps.Append(new W14.NumberSpacing { Val = numberSpacing.Value }); + if (contextualAlternatives.HasValue) + runProps.Append(new W14.ContextualAlternatives { Val = GetOnOffValue(contextualAlternatives.Value) }); + if (styleSets.Count > 0) + runProps.Append(new W14.StylisticSets(styleSets)); + } + + private static W14.OnOffValues GetOnOffValue(bool value) + { + return value ? W14.OnOffValues.True : W14.OnOffValues.False; + } + + private static void RemoveOpenTypeFontFeatureProperties(OpenXmlCompositeElement runProps) + { + runProps.RemoveAllChildren(); + runProps.RemoveAllChildren(); + runProps.RemoveAllChildren(); + runProps.RemoveAllChildren(); + runProps.RemoveAllChildren(); + } + + private static W14.LigaturesValues GetLigaturesValue(int ligatureFlags) + { + switch (ligatureFlags) + { + case 0: + return W14.LigaturesValues.None; + case 1: + return W14.LigaturesValues.Standard; + case 2: + return W14.LigaturesValues.Contextual; + case 3: + return W14.LigaturesValues.StandardContextual; + case 4: + return W14.LigaturesValues.Historical; + case 5: + return W14.LigaturesValues.StandardHistorical; + case 6: + return W14.LigaturesValues.ContextualHistorical; + case 7: + return W14.LigaturesValues.StandardContextualHistorical; + case 8: + return W14.LigaturesValues.Discretional; + case 9: + return W14.LigaturesValues.StandardDiscretional; + case 10: + return W14.LigaturesValues.ContextualDiscretional; + case 11: + return W14.LigaturesValues.StandardContextualDiscretional; + case 12: + return W14.LigaturesValues.HistoricalDiscretional; + case 13: + return W14.LigaturesValues.StandardHistoricalDiscretional; + case 14: + return W14.LigaturesValues.ContextualHistoricalDiscretional; + case 15: + return W14.LigaturesValues.All; + default: + return W14.LigaturesValues.None; + } + } + + private static bool TryGetStylisticSetId(string tag, out uint styleSetId) + { + styleSetId = 0; + if (tag == null || tag.Length != 4 || tag[0] != 's' || tag[1] != 's') + return false; + + int tens = tag[2] - '0'; + int ones = tag[3] - '0'; + if (tens < 0 || tens > 9 || ones < 0 || ones > 9) + return false; + + styleSetId = (uint)(tens * 10 + ones); + return styleSetId >= 1 && styleSetId <= 20; + } + public static string GetWsString(string wsString) { return LangTagPre + wsString + LangTagPost; diff --git a/Src/xWorks/xWorksTests/LcmWordGeneratorTests.cs b/Src/xWorks/xWorksTests/LcmWordGeneratorTests.cs index 9615cfa3f9..e368f87831 100644 --- a/Src/xWorks/xWorksTests/LcmWordGeneratorTests.cs +++ b/Src/xWorks/xWorksTests/LcmWordGeneratorTests.cs @@ -261,13 +261,18 @@ private static void AssertWordTypographyProperties(OpenXmlCompositeElement runPr var contextualAlternatives = runProps.GetFirstChild(); Assert.That(contextualAlternatives, Is.Not.Null); - Assert.That(contextualAlternatives.Val.Value, Is.EqualTo(contextualAlternativesValue)); + Assert.That(contextualAlternatives.Val.Value, Is.EqualTo(GetOnOffValue(contextualAlternativesValue))); var stylisticSets = runProps.GetFirstChild(); Assert.That(stylisticSets, Is.Not.Null); var styleSet = stylisticSets.Elements().Single(); Assert.That(styleSet.Id.Value, Is.EqualTo(stylisticSetId)); - Assert.That(styleSet.Val.Value, Is.EqualTo(stylisticSetValue)); + Assert.That(styleSet.Val.Value, Is.EqualTo(GetOnOffValue(stylisticSetValue))); + } + + private static W14.OnOffValues GetOnOffValue(bool value) + { + return value ? W14.OnOffValues.True : W14.OnOffValues.False; } diff --git a/openspec/changes/add-opentype-font-features/tasks.md b/openspec/changes/add-opentype-font-features/tasks.md index c65ae20482..7c17a0f1ce 100644 --- a/openspec/changes/add-opentype-font-features/tasks.md +++ b/openspec/changes/add-opentype-font-features/tasks.md @@ -84,7 +84,7 @@ ## 11. Word DOCX Export Parity - [x] 11.1 Add OpenSpec requirements, research analysis, implementation plan, and tasks for Microsoft Word DOCX OpenType feature subset export. [OpenSpec] -- [ ] 11.2 Add failing managed tests proving style and explicit run font features emit documented WordprocessingML `w14` typography elements. [Managed C# Tests] -- [ ] 11.3 Implement a Word DOCX feature mapper that reuses the renderer-neutral parser and maps supported tags to `w14` elements. [Managed C#] -- [ ] 11.4 Keep unsupported tags non-fatal and document Word export subset behavior in `Docs/opentype-font-features.md`. [Docs] -- [ ] 11.5 Run targeted xWorks Word generator tests. [Validation] +- [x] 11.2 Add failing managed tests proving style and explicit run font features emit documented WordprocessingML `w14` typography elements. [Managed C# Tests] +- [x] 11.3 Implement a Word DOCX feature mapper that reuses the renderer-neutral parser and maps supported tags to `w14` elements. [Managed C#] +- [x] 11.4 Keep unsupported tags non-fatal and document Word export subset behavior in `Docs/opentype-font-features.md`. [Docs] +- [x] 11.5 Run targeted xWorks Word generator tests. [Validation] From 4cab427973aa3ebaf88a3f388d5e654a1bdff6b9 Mon Sep 17 00:00:00 2001 From: John Lambert Date: Thu, 7 May 2026 16:33:33 -0400 Subject: [PATCH 6/7] Partial fixes --- .../SimpleRootSite/RenderEngineFactory.cs | 8 ++++- .../RenderEngineFactoryTests.cs | 36 +++++++++++++++++++ .../FwCoreDlgControlsTests/StyleInfoTests.cs | 22 ++++++++++++ .../FwCoreDlgControls/FwFontAttributes.cs | 1 + Src/FwCoreDlgs/FwCoreDlgControls/StyleInfo.cs | 18 ++++++++++ Src/xWorks/XhtmlDocView.cs | 9 ++++- Src/xWorks/xWorksTests/XhtmlDocViewTests.cs | 10 ++++++ 7 files changed, 102 insertions(+), 2 deletions(-) diff --git a/Src/Common/SimpleRootSite/RenderEngineFactory.cs b/Src/Common/SimpleRootSite/RenderEngineFactory.cs index b88fc7e8b3..bf8a1c3c3a 100644 --- a/Src/Common/SimpleRootSite/RenderEngineFactory.cs +++ b/Src/Common/SimpleRootSite/RenderEngineFactory.cs @@ -87,9 +87,15 @@ public IRenderEngine get_Renderer(ILgWritingSystem ws, IVwGraphics vg) private static string GetFontFeatures(string fontName, LgCharRenderProps chrp, ILgWritingSystem ws) { + string charRenderFeatures = chrp.szFontVar == null + ? string.Empty + : FontFeatureSettings.Normalize(MarshalEx.UShortToString(chrp.szFontVar)); + if (!string.IsNullOrEmpty(charRenderFeatures)) + return charRenderFeatures; + if (fontName == ws.DefaultFontName) return FontFeatureSettings.Normalize(ws.DefaultFontFeatures); - return chrp.szFontVar == null ? string.Empty : FontFeatureSettings.Normalize(MarshalEx.UShortToString(chrp.szFontVar)); + return string.Empty; } private Tuple GetRenderingEngine(string fontName, string fontFeatures, IVwGraphics vg, ILgWritingSystem ws) diff --git a/Src/Common/SimpleRootSite/SimpleRootSiteTests/RenderEngineFactoryTests.cs b/Src/Common/SimpleRootSite/SimpleRootSiteTests/RenderEngineFactoryTests.cs index 92b59493d0..6501fb0961 100644 --- a/Src/Common/SimpleRootSite/SimpleRootSiteTests/RenderEngineFactoryTests.cs +++ b/Src/Common/SimpleRootSite/SimpleRootSiteTests/RenderEngineFactoryTests.cs @@ -133,6 +133,42 @@ public void get_Renderer_DefaultFontFeatures_CopiesNormalizedFeaturesToGraphics( } } + [Test] + public void get_Renderer_DefaultFontWithStyleFeatures_PreservesStyleFeatures() + { + using (var control = new Form()) + using (var gm = new GraphicsManager(control)) + using (var reFactory = new RenderEngineFactory()) + { + gm.Init(1.0f); + try + { + var wsManager = new WritingSystemManager(); + CoreWritingSystemDefinition ws = wsManager.Set("en-US"); + ws.DefaultFont = new FontDefinition("Arial") { Features = string.Empty }; + + var chrp = CreateCharRenderProps(ws.Handle, "", " smcp = 1, kern=0 "); + gm.VwGraphics.SetupGraphics(ref chrp); + + IRenderEngine engine = reFactory.get_Renderer(ws, gm.VwGraphics); + var graphicsChrp = gm.VwGraphics.FontCharProperties; + + Assert.That(engine, Is.InstanceOf(typeof(UniscribeEngine))); + Assert.That( + MarshalEx.UShortToString(graphicsChrp.szFaceName), + Is.EqualTo("Arial")); + Assert.That( + MarshalEx.UShortToString(graphicsChrp.szFontVar), + Is.EqualTo("kern=0,smcp=1")); + wsManager.Save(); + } + finally + { + gm.Uninit(); + } + } + } + [Test] public void get_Renderer_OpenTypeFeatures_ArePartOfCacheIdentity() { diff --git a/Src/FwCoreDlgs/FwCoreDlgControls/FwCoreDlgControlsTests/StyleInfoTests.cs b/Src/FwCoreDlgs/FwCoreDlgControls/FwCoreDlgControlsTests/StyleInfoTests.cs index cdc23b5386..c69b2e4c66 100644 --- a/Src/FwCoreDlgs/FwCoreDlgControls/FwCoreDlgControlsTests/StyleInfoTests.cs +++ b/Src/FwCoreDlgs/FwCoreDlgControls/FwCoreDlgControlsTests/StyleInfoTests.cs @@ -196,5 +196,27 @@ public void SaveToDB_NewInfoAndBasedOnNewInfo() Assert.That(style2.Structure, Is.EqualTo(StructureValues.Heading)); Assert.That(style2.Function, Is.EqualTo(FunctionValues.Table)); } + + [Test] + public void SaveToDB_DefaultFontFeatures_RoundTripsThroughRules() + { + var styleFactory = Cache.ServiceLocator.GetInstance(); + var realStyle = styleFactory.Create(); + Cache.LanguageProject.StylesOC.Add(realStyle); + realStyle.Name = "Normal"; + realStyle.Context = ContextValues.Internal; + realStyle.Function = FunctionValues.Prose; + realStyle.Structure = StructureValues.Undefined; + + StyleInfo styleInfo = new StyleInfo(realStyle); + styleInfo.FontInfoForWs(-1).m_features.ExplicitValue = "kern=0,smcp=1"; + + styleInfo.SaveToDB(realStyle, true, true); + StyleInfo reloadedStyleInfo = new StyleInfo(realStyle); + FontInfo reloadedFontInfo = reloadedStyleInfo.FontInfoForWs(-1); + + Assert.That(reloadedFontInfo.m_features.IsExplicit, Is.True); + Assert.That(reloadedFontInfo.m_features.Value, Is.EqualTo("kern=0,smcp=1")); + } } } diff --git a/Src/FwCoreDlgs/FwCoreDlgControls/FwFontAttributes.cs b/Src/FwCoreDlgs/FwCoreDlgControls/FwFontAttributes.cs index 5c19a0451a..7327c881b0 100644 --- a/Src/FwCoreDlgs/FwCoreDlgControls/FwFontAttributes.cs +++ b/Src/FwCoreDlgs/FwCoreDlgControls/FwFontAttributes.cs @@ -229,6 +229,7 @@ protected virtual void OnValueChanged(object sender, EventArgs e) private void m_btnFontFeatures_FontFeatureSelected(object sender, EventArgs e) { m_btnFontFeatures.Tag = false; // No longer inherited + OnValueChanged(sender, e); } /// ------------------------------------------------------------------------------------ diff --git a/Src/FwCoreDlgs/FwCoreDlgControls/StyleInfo.cs b/Src/FwCoreDlgs/FwCoreDlgControls/StyleInfo.cs index 0b7fb7dbeb..d6a4f85833 100644 --- a/Src/FwCoreDlgs/FwCoreDlgControls/StyleInfo.cs +++ b/Src/FwCoreDlgs/FwCoreDlgControls/StyleInfo.cs @@ -40,6 +40,24 @@ public class StyleInfo : BaseStyleInfo public StyleInfo(IStStyle style) : base(style) { + LoadDefaultFontFeatures(style); + } + + private void LoadDefaultFontFeatures(IStStyle style) + { + if (style == null || style.Rules == null) + return; + + for (int i = 0; i < style.Rules.StrPropCount; i++) + { + int tpt; + string value = style.Rules.GetStrProp(i, out tpt); + if (tpt == (int)FwTextPropType.ktptFontVariations) + { + m_defaultFontInfo.m_features.ExplicitValue = value; + return; + } + } } /// ------------------------------------------------------------------------------------ diff --git a/Src/xWorks/XhtmlDocView.cs b/Src/xWorks/XhtmlDocView.cs index 67b638d9fa..7f5056f739 100644 --- a/Src/xWorks/XhtmlDocView.cs +++ b/Src/xWorks/XhtmlDocView.cs @@ -7,6 +7,7 @@ using SIL.CommandLineProcessing; using SIL.FieldWorks.Common.Framework; using SIL.FieldWorks.Common.FwUtils; +using SIL.FieldWorks.Common.RootSites; using SIL.FieldWorks.Common.Widgets; using SIL.FieldWorks.FwCoreDlgControls; using SIL.FieldWorks.FwCoreDlgs; @@ -36,7 +37,7 @@ namespace SIL.FieldWorks.XWorks ///

    /// This class handles the display of configured xhtml for a particular publication in a dynamically loadable XWorksView. /// - internal class XhtmlDocView : XWorksViewBase, IFindAndReplaceContext, IPostLayoutInit + internal class XhtmlDocView : XWorksViewBase, IFindAndReplaceContext, IPostLayoutInit, IRefreshableRoot { private XWebBrowser m_mainView; private DictionaryPublicationDecorator m_pubDecorator; @@ -1303,6 +1304,12 @@ public void OnMasterRefresh(object sender) UpdateContent(currentConfig); } + public bool RefreshDisplay() + { + OnMasterRefresh(this); + return true; + } + public virtual bool OnDisplayShowAllEntries(object commandObject, ref UIItemDisplayProperties display) { var pubName = GetCurrentPublication(); diff --git a/Src/xWorks/xWorksTests/XhtmlDocViewTests.cs b/Src/xWorks/xWorksTests/XhtmlDocViewTests.cs index fd80e1b6d5..cb309c4df9 100644 --- a/Src/xWorks/xWorksTests/XhtmlDocViewTests.cs +++ b/Src/xWorks/xWorksTests/XhtmlDocViewTests.cs @@ -7,6 +7,7 @@ using System.IO; using System.Xml; using NUnit.Framework; +using SIL.FieldWorks.Common.RootSites; using SIL.LCModel.Core.Text; using SIL.IO; using SIL.FieldWorks.Common.FwUtils; @@ -38,6 +39,15 @@ public override void FixtureInit() private const string ConfigurationTemplateWithAllPublications = "" + ""; + [Test] + public void XhtmlDocView_ImplementsRefreshableRoot() + { + using (var docView = new TestXhtmlDocView()) + { + Assert.That(docView, Is.InstanceOf()); + } + } + [Test] public void SplitPublicationsByConfiguration_AllPublicationIsIn() { From c921899a76a2e0c71cc04dff457c1e8361428f8a Mon Sep 17 00:00:00 2001 From: John Lambert Date: Fri, 8 May 2026 16:47:33 -0400 Subject: [PATCH 7/7] LT-22324: preserve OpenType font features --- .../FwCoreDlgControlsTests/FwFontTabTests.cs | 35 ++++++++++++++++++ Src/FwCoreDlgs/FwCoreDlgControls/FwFontTab.cs | 6 ++++ .../FwCoreDlgsTests/FwFontDialogTests.cs | 28 +++++++++++++++ .../TestData/Fonts/CharisSIL-5.000/OFL.txt | 2 +- .../TestData/Fonts/CharisSIL-5.000/README.txt | 29 ++++++++------- Src/xWorks/CssGenerator.cs | 14 ++++++-- Src/xWorks/xWorksTests/CssGeneratorTests.cs | 36 +++++++++++++++++++ 7 files changed, 131 insertions(+), 19 deletions(-) diff --git a/Src/FwCoreDlgs/FwCoreDlgControls/FwCoreDlgControlsTests/FwFontTabTests.cs b/Src/FwCoreDlgs/FwCoreDlgControls/FwCoreDlgControlsTests/FwFontTabTests.cs index c167164268..236a38627c 100644 --- a/Src/FwCoreDlgs/FwCoreDlgControls/FwCoreDlgControlsTests/FwFontTabTests.cs +++ b/Src/FwCoreDlgs/FwCoreDlgControls/FwCoreDlgControlsTests/FwFontTabTests.cs @@ -8,6 +8,7 @@ using System.Drawing; using System.Windows.Forms; using SIL.LCModel.Core.KernelInterfaces; +using SIL.LCModel.DomainServices; namespace SIL.FieldWorks.FwCoreDlgControls { @@ -85,6 +86,40 @@ public void SaveToInfo_OpenTypeFeatures_RoundTripsThroughFontAttributes() Assert.That(charStyleInfo.FontInfoForWs(-1).m_features.Value, Is.EqualTo("kern=0,smcp=1")); } + [Test] + public void SaveToInfo_OpenTypeFeatures_DefaultFontSelectionDuringUpdate_PreservesExplicitFeatures() + { + var baseStyle = Cache.ServiceLocator.GetInstance().Create(); + Cache.LangProject.StylesOC.Add(baseStyle); + baseStyle.Context = ContextValues.Text; + baseStyle.Function = FunctionValues.Prose; + baseStyle.Structure = StructureValues.Body; + baseStyle.Type = StyleType.kstCharacter; + var basedOn = new StyleInfo(baseStyle); + basedOn.FontInfoForWs(-1).m_fontName.ExplicitValue = StyleServices.DefaultFont; + + var charStyleInfo = new StyleInfo("OpenType Default Font Style", basedOn, + StyleType.kstCharacter, Cache); + var fontInfo = charStyleInfo.FontInfoForWs(-1); + fontInfo.m_fontName.ExplicitValue = StyleServices.DefaultFont; + fontInfo.m_fontSize.ExplicitValue = 12000; + fontInfo.m_bold.ExplicitValue = false; + fontInfo.m_italic.ExplicitValue = false; + fontInfo.m_superSub.ExplicitValue = FwSuperscriptVal.kssvOff; + fontInfo.m_offset.ExplicitValue = 0; + fontInfo.m_fontColor.ExplicitValue = Color.Black; + fontInfo.m_backColor.ExplicitValue = Color.Empty; + fontInfo.m_underline.ExplicitValue = FwUnderlineType.kuntNone; + fontInfo.m_underlineColor.ExplicitValue = Color.Empty; + fontInfo.m_features.ExplicitValue = " smcp = 1, kern=0 "; + + m_fontTab.UpdateForStyle(charStyleInfo, -1); + m_fontTab.SaveToInfo(charStyleInfo); + + Assert.That(charStyleInfo.FontInfoForWs(-1).m_features.Value, Is.EqualTo("kern=0,smcp=1")); + Assert.That(charStyleInfo.FontInfoForWs(-1).m_features.IsInherited, Is.False); + } + [Test] public void UserDefinedCharacterStyle_ExplicitFontName() { diff --git a/Src/FwCoreDlgs/FwCoreDlgControls/FwFontTab.cs b/Src/FwCoreDlgs/FwCoreDlgControls/FwFontTab.cs index 38101e664e..c50498e8b3 100644 --- a/Src/FwCoreDlgs/FwCoreDlgControls/FwFontTab.cs +++ b/Src/FwCoreDlgs/FwCoreDlgControls/FwFontTab.cs @@ -139,6 +139,12 @@ private void m_cboFontSize_TextUpdate(object sender, EventArgs e) /// ------------------------------------------------------------------------------------ private void m_cboFontNames_SelectedIndexChanged(object sender, EventArgs e) { + if (m_dontUpdateInheritance) + { + m_FontAttributes.FontName = m_cboFontNames.Text; + return; + } + FontInfo fontInfoForWs = m_currentStyleInfo.FontInfoForWs(m_currentWs); FontInfo inheritedFontInfo = (m_currentStyleInfo.BasedOnStyle == null) ? null : m_currentStyleInfo.BasedOnStyle.FontInfoForWs(m_currentWs); diff --git a/Src/FwCoreDlgs/FwCoreDlgsTests/FwFontDialogTests.cs b/Src/FwCoreDlgs/FwCoreDlgsTests/FwFontDialogTests.cs index 2d2ac24719..9ea0624a51 100644 --- a/Src/FwCoreDlgs/FwCoreDlgsTests/FwFontDialogTests.cs +++ b/Src/FwCoreDlgs/FwCoreDlgsTests/FwFontDialogTests.cs @@ -87,6 +87,34 @@ public void SaveFontInfo_OpenTypeFeatures_RoundTripsThroughAttributes() Assert.That(savedFontInfo.m_features.IsInherited, Is.False); } + [Test] + public void SaveFontInfo_OpenTypeFeatures_RemainExplicitWhenLaterFieldsAreInherited() + { + var fontInfo = new FontInfo + { + m_fontName = { ExplicitValue = "Times New Roman" }, + m_fontSize = { ExplicitValue = 12000 }, + m_bold = { ExplicitValue = false }, + m_italic = { ExplicitValue = false }, + m_superSub = { ExplicitValue = FwSuperscriptVal.kssvOff }, + m_fontColor = { ExplicitValue = System.Drawing.Color.Black }, + m_backColor = { ExplicitValue = System.Drawing.Color.Empty }, + m_underline = { ExplicitValue = FwUnderlineType.kuntNone }, + m_underlineColor = { ExplicitValue = System.Drawing.Color.Empty }, + m_features = { ExplicitValue = " smcp = 1, kern=0 " } + }; + fontInfo.m_offset.ResetToInherited(0); + + ((IFontDialog)m_dialog).Initialize(fontInfo, true, Cache.DefaultVernWs, + Cache.WritingSystemFactory, null, false); + var savedFontInfo = new FontInfo(fontInfo); + + ((IFontDialog)m_dialog).SaveFontInfo(savedFontInfo); + + Assert.That(savedFontInfo.m_features.Value, Is.EqualTo("kern=0,smcp=1")); + Assert.That(savedFontInfo.m_features.IsInherited, Is.False); + } + [Test] public void FillFontList_IsAlphabeticallySorted() { diff --git a/Src/views/Test/TestData/Fonts/CharisSIL-5.000/OFL.txt b/Src/views/Test/TestData/Fonts/CharisSIL-5.000/OFL.txt index f8d60c8fa6..7fb722dcaa 100644 --- a/Src/views/Test/TestData/Fonts/CharisSIL-5.000/OFL.txt +++ b/Src/views/Test/TestData/Fonts/CharisSIL-5.000/OFL.txt @@ -19,7 +19,7 @@ with others. The OFL allows the licensed fonts to be used, studied, modified and redistributed freely as long as they are not sold by themselves. The -fonts, including any derivative works, can be bundled, embedded, +fonts, including any derivative works, can be bundled, embedded, redistributed and/or sold with any software provided that any reserved names are not used by derivative works. The fonts and derivatives, however, cannot be released under any other type of license. The diff --git a/Src/views/Test/TestData/Fonts/CharisSIL-5.000/README.txt b/Src/views/Test/TestData/Fonts/CharisSIL-5.000/README.txt index 266d96f6e0..6ef6281aa0 100644 --- a/Src/views/Test/TestData/Fonts/CharisSIL-5.000/README.txt +++ b/Src/views/Test/TestData/Fonts/CharisSIL-5.000/README.txt @@ -7,22 +7,22 @@ We hope you find them useful! Charis SIL provides glyphs for a wide range of Latin and Cyrillic characters. Please read the documentation on the website -(http://scripts.sil.org/CharisSILfont) to see what ranges are supported. +(http://scripts.sil.org/CharisSILfont) to see what ranges are supported. Charis SIL is released under the SIL Open Font License. Charis SIL is a trademark of SIL International. - + See the OFL and OFL-FAQ for details of the SIL Open Font License. See the FONTLOG for information on this and previous releases. -See the website (http://scripts.sil.org/CharisSILfont) documentation or the +See the website (http://scripts.sil.org/CharisSILfont) documentation or the Charis SIL FAQ (http://scripts.sil.org/ComplexRomanFontFAQ) for frequently asked questions and their answers. TIPS ==== -As this font is distributed at no cost, we are unable to provide a -commercial level of personal technical support. The font has, however, +As this font is distributed at no cost, we are unable to provide a +commercial level of personal technical support. The font has, however, been through some testing on various platforms to be sure it works in most situations. In particular, it has been tested and shown to work on Windows XP, Windows Vista and Windows 7. Graphite capabilities have been tested on @@ -30,13 +30,13 @@ Graphite-supported platforms. If you do find a problem, please do report it to fonts@sil.org. We can't guarantee any direct response, but will try to fix reported bugs in -future versions. Make sure you read through the +future versions. Make sure you read through the Charis SIL FAQ (http://scripts.sil.org/ComplexRomanFontFAQ). Many problems can be solved, or at least explained, through an understanding of the encoding and use of the fonts. Here are some basic hints: -Encoding: +Encoding: The fonts are encoded according to Unicode, so your application must support Unicode text in order to access letters other than the standard alphabet. Most Windows applications provide basic Unicode support. You will, however, @@ -48,10 +48,10 @@ built-in keyboards of the operating system. You will need to install the appropriate keyboard and input method for the characters of the language you wish to use. If you want to enter characters that are not supported by any system keyboard, the Keyman program (www.tavultesoft.com) can be helpful -on Windows systems. Also available for Windows is MSKLC -(http://www.microsoft.com/globaldev/tools/msklc.mspx). -For other platforms, KMFL (http://kmfl.sourceforge.net/), -XKB (http://www.x.org/wiki/XKB) or Ukelele (http://scripts.sil.org/ukelele) +on Windows systems. Also available for Windows is MSKLC +(http://www.microsoft.com/globaldev/tools/msklc.mspx). +For other platforms, KMFL (http://kmfl.sourceforge.net/), +XKB (http://www.x.org/wiki/XKB) or Ukelele (http://scripts.sil.org/ukelele) can be helpful. If you want to enter characters that are not supported by any system @@ -64,11 +64,11 @@ dialog that shows all the glyphs (symbols) in a font and allow you to enter them by clicking on the glyph you want. Rendering: -This font is designed to work with any of two advanced font technologies, -Graphite or OpenType. To take advantage of the advanced typographic +This font is designed to work with any of two advanced font technologies, +Graphite or OpenType. To take advantage of the advanced typographic capabilities of this font, you must be using applications that provide an adequate level of support for Graphite or OpenType. See "Applications -that provide an adequate level of support for SIL Unicode Roman fonts" +that provide an adequate level of support for SIL Unicode Roman fonts" (http://scripts.sil.org/Complex_AdLvSup). @@ -79,4 +79,3 @@ Computers and Writing systems website: http://scripts.sil.org/CharisSILfont Support through the website: http://scripts.sil.org/Support - diff --git a/Src/xWorks/CssGenerator.cs b/Src/xWorks/CssGenerator.cs index a04819121f..37ff4d7f57 100644 --- a/Src/xWorks/CssGenerator.cs +++ b/Src/xWorks/CssGenerator.cs @@ -1542,6 +1542,7 @@ private static void AddFontInfoCss(BaseStyleInfo projectStyle, StyleDeclaration { var wsFontInfo = projectStyle.FontInfoForWs(wsId); var defaultFontInfo = projectStyle.DefaultCharacterStyleInfo; + string defaultFontFeatures = null; // set fontName to the wsFontInfo publicly accessible InheritableStyleProp value if set, otherwise the // defaultFontInfo if set, or null. @@ -1555,7 +1556,10 @@ private static void AddFontInfoCss(BaseStyleInfo projectStyle, StyleDeclaration { var lgWritingSystem = cache.ServiceLocator.WritingSystemManager.get_EngineOrNull(wsId); if(lgWritingSystem != null) + { fontName = lgWritingSystem.DefaultFontName; + defaultFontFeatures = lgWritingSystem.DefaultFontFeatures; + } } if (fontName != null) @@ -1576,7 +1580,7 @@ private static void AddFontInfoCss(BaseStyleInfo projectStyle, StyleDeclaration AddInfoFromWsOrDefaultValue(wsFontInfo.m_fontColor, defaultFontInfo.FontColor, "color", declaration); AddInfoFromWsOrDefaultValue(wsFontInfo.m_backColor, defaultFontInfo.BackColor, "background-color", declaration); AddInfoFromWsOrDefaultValue(wsFontInfo.m_superSub, defaultFontInfo.SuperSub, declaration); - AddFontFeaturesFromWsOrDefaultValue(wsFontInfo.m_features, defaultFontInfo.Features, declaration); + AddFontFeaturesFromWsOrDefaultValue(wsFontInfo.m_features, defaultFontInfo.Features, declaration, defaultFontFeatures); AddInfoForUnderline(wsFontInfo, defaultFontInfo, declaration); } @@ -1649,10 +1653,14 @@ private static void AddInfoFromWsOrDefaultValue(InheritableStyleProp wsFont /// /// private static void AddFontFeaturesFromWsOrDefaultValue(InheritableStyleProp wsFontInfo, IStyleProp defaultFontInfo, - StyleDeclaration declaration) + StyleDeclaration declaration, string fallbackFontValue = null) { if (!GetFontValue(wsFontInfo, defaultFontInfo, out var fontValue)) - return; + { + fontValue = fallbackFontValue; + if (string.IsNullOrEmpty(fontValue)) + return; + } var fontProp = new Property("font-feature-settings"); fontProp.Term = ConvertToCssFeatures(fontValue); declaration.Add(fontProp); diff --git a/Src/xWorks/xWorksTests/CssGeneratorTests.cs b/Src/xWorks/xWorksTests/CssGeneratorTests.cs index 895cd83559..4b90d9a533 100644 --- a/Src/xWorks/xWorksTests/CssGeneratorTests.cs +++ b/Src/xWorks/xWorksTests/CssGeneratorTests.cs @@ -23,6 +23,7 @@ using SIL.FieldWorks.Common.Widgets; using SIL.LCModel; using SIL.LCModel.DomainServices; +using SIL.WritingSystems; using XCore; // ReSharper disable InconsistentNaming - Justification: Underscores are standard for test names but nowhere else in our code @@ -3066,6 +3067,41 @@ public void GenerateCssForConfiguration_WsSpanWithNormalStyle() Assert.That(Regex.Replace(cssResult, @"\t|\n|\r", ""), Contains.Substring(defaultStyle + englishStyle + frenchStyle)); } + [Test] + public void GenerateCssForConfiguration_WsSpanWithNormalStyle_UsesWritingSystemDefaultFontFeatures() + { + var style = GenerateEmptyStyle("Normal"); + style.IsParagraphStyle = true; + + var vernWs = Cache.ServiceLocator.WritingSystemManager.Get(Cache.DefaultVernWs); + vernWs.DefaultFont = new FontDefinition("Charis SIL") { Features = "ss11=1,ss12=1" }; + + var glossNode = new ConfigurableDictionaryNode + { + FieldDescription = "Gloss", + DictionaryNodeOptions = ConfiguredXHTMLGeneratorTests.GetWsOptionsForLanguages(new[] { vernWs.LanguageTag }) + }; + var testSensesNode = new ConfigurableDictionaryNode + { + FieldDescription = "Senses", + Children = new List { glossNode } + }; + var testEntryNode = new ConfigurableDictionaryNode + { + FieldDescription = "LexEntry", + Children = new List { testSensesNode } + }; + var model = new DictionaryConfigurationModel + { + Parts = new List { testEntryNode } + }; + PopulateFieldsForTesting(testEntryNode); + + var cssResult = Regex.Replace(CssGenerator.GenerateCssFromConfiguration(model, m_propertyTable), @"\t|\n|\r", ""); + + Assert.That(cssResult, Contains.Substring("span[lang='" + vernWs.LanguageTag + "']{font-family:'Charis SIL',serif;font-feature-settings:\"ss11\" 1,\"ss12\" 1;")); + } + [Test] public void GenerateCssForConfiguration_NormalStyleForWsDoesNotOverrideNodeStyle() {

    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%0A+NJ^%3#_oU@#XSYvJ!)HOw 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