Skip to content

Feature/improve SemDom.xml#5

Closed
CJDennis wants to merge 12 commits intosillsdev:developfrom
CJDennis:feature/ImproveSemDomXml
Closed

Feature/improve SemDom.xml#5
CJDennis wants to merge 12 commits intosillsdev:developfrom
CJDennis:feature/ImproveSemDomXml

Conversation

@CJDennis
Copy link

Change rare spelling to common spelling
Make formatting and punctuation consistent
Syncronise specialised domain terminology with authoritative sources
Correct apparent mistakes

@papeh
Copy link
Contributor

papeh commented Mar 23, 2020

Hi, @CJDennis. Thank you for your improvements. Unfortunately, this file has been refactored into another repository, so I've moved your changes to sillsdev/liblcm#126.

johnml1135 added a commit that referenced this pull request Mar 5, 2026
# This is the 1st commit message:

feat(render): expand DataTree render scenarios and persist benchmark timings

standardize DataTree test data with predictable field naming across scenarios
add per-scenario timing capture and write results to datatree-timings.json
add Newtonsoft.Json to DetailControlsTests for timing serialization
add render-testing skill documentation for baseline and benchmark workflow
remove obsolete generated Build/FieldWorks.targets.bad file
update checked-in test result artifact for current render test run

fix: resolve build blocker + timing test layout gaps

- Remove duplicate Kernel project entry in FieldWorks.sln that blocked
  NuGet restore (first entry was missing EndProject)
- Add CitationForm and Senses parts to test Normal layout so timing
  tests produce real slices instead of 0
- Add LexSense-Detail-Senses part and subsense recursion to GlossSn
  layout so WorkloadGrowsWithComplexity test correctly validates
  that deeper scenarios produce more slices
- Include user edits to implementation-paths.md

OS-3: All 4 DataTreeTiming tests now pass

perf: add render-testing workflow + timing enhancement log

- Update render-testing skill with explicit devil's advocate stage, retest/review, and mandatory TIMING_ENHANCEMENTS.md before commit.

- Refine DataTree tab-index optimization safety by moving final ResetTabIndices(0) to CreateSlices finally.

- Keep DeepSuspendLayout/DeepResumeLayout batching in DummyObjectSlice.BecomeReal.

- Mark OS-3 and OS-5 complete in OpenSpec tasks and add TIMING_ENHANCEMENTS.md with measured outcomes.

Validation: build.ps1 -BuildTests; test.ps1 -TestFilter DataTreeTiming -NoBuild

perf: paint pipeline optimization — clip-rect culling + double-buffering

- HandlePaintLinesBetweenSlices: skip separator lines outside paint clip rect,
  reducing per-paint iteration from O(N) to O(visible) during scroll/partial
  repaints. Avoids O(N) XML attribute parsing on off-screen slices.
- DataTree constructor: enable OptimizedDoubleBuffer + AllPaintingInWmPaint
  to eliminate flicker during paint.
- Add DataTreeTiming_PaintPerformance test for paint-time regression detection.
- Update render-testing skill with test coverage assessment step.
- Update TIMING_ENHANCEMENTS.md with enhancements 3 and 4.

perf: layout path optimization — early-exit guard, construction skip, paint-path skip

Enhancement 5: Slice.SetWidthForDataTreeLayout returns early when
m_widthHasBeenSetByDataTree && Width == width, avoiding redundant
splitter resizing and event handler churn on every layout pass.

Enhancement 6: DataTree.OnSizeChanged skips the O(N) splitter
adjustment loop during ConstructingSlices. HandleLayout1(fFull=true)
handles width synchronization after construction completes.

Enhancement 7: HandleLayout1 paint path (fFull=false) skips
SetWidthForDataTreeLayout for non-visible slices, reducing width-sync
work from O(N) to O(K) per paint where K is visible slice count.

Also fixes RemoveDuplicateCustomFields test to match Test.fwlayout
Normal layout changes from prior commit.

perf: XML attribute caching + MakeSliceVisible high-water mark

Enhancement 8: Cache header/skipSpacerLine/sameObject XML attributes
on Slice as lazy bool? fields. Eliminates per-paint XML parsing in
HandlePaintLinesBetweenSlices (~2,700 XML lookups/sec at 60Hz with
15 visible slices reduced to 0 after first access).

Enhancement 9: Change MakeSliceVisible from static to instance method.
Pass known index from HandleLayout1 caller (avoids O(N) IndexOf).
Track m_lastVisibleHighWaterMark so the inner 'make preceding visible'
loop amortizes to O(N) total instead of O(N*V). Preserves the .NET
Framework bug workaround (LT-7307). Reset mark in CreateSlices.

perf: construction-path guards + optimization regression tests

Enhancement 10: Skip ResetTabIndices in RemoveSlice during ConstructingSlices.
Mirror of Enhancement 1 — the finally block in CreateSlices already does a
single ResetTabIndices(0) after all removals/insertions complete.

Enhancement 11: Skip AdjustSliceSplitPosition in InstallSlice during
ConstructingSlices. HandleLayout1(fFull=true) sets correct widths + splitter
positions after construction, making per-insert adjustment redundant.

Added 7 optimization regression tests (DataTreeOpt_ prefix):
- WidthStabilityAfterLayout (Enhancement 5)
- AllViewportSlicesVisible (Enhancement 9)
- XmlCacheConsistency (Enhancement 8)
- XmlCacheInvalidationOnConfigChange (Enhancement 8)
- SequentialPaintsProduceIdenticalOutput (Enhancements 3,4,7,8)
- SlicePositionsMonotonicallyIncreasing (Enhancement 3)
- IsHeaderNodeDelegatesToCachedProperty (Enhancement 8)

All 12 DataTree tests pass (5 timing + 7 optimization).

# This is the commit message #2:

feat: Enhancement 12 — binary search in HandleLayout1 paint path

Add FindFirstPotentiallyVisibleSlice binary search to skip above-viewport
slices during paint-path layout. Addresses JohnT's original TODO in OnPaint.

- HandleLayout1 now starts iteration at the first potentially visible slice
  (with -1 safety margin) instead of index 0 on paint-path calls
- Timing improvements: shallow -71%, deep -20%, extreme -7%, paint -11%
- 5 binary-search risk-reduction tests added (DataTreeOpt_ prefix)
- Regenerate snapshot baselines after layout/parts changes from 64ab221
- Add mandatory snapshot regression check (Step 6) to render-testing skill
- Update TIMING_ENHANCEMENTS.md with E12 measurements and devil's advocate

# This is the commit message #3:

The real optimization - HWND virtualization

# This is the commit message #4:

fix: correct VwDrawRootBuffered coordinate mapping + trailing separator bars

Three rendering quality fixes for the snapshot capture pipeline:

1. VwDrawRootBuffered coordinate fix (CompositeViewCapture.cs):
   GetCoordRects returns rcDst in rootSite-local coordinates (origin
   at HorizMargin, 0). The overlay code was passing clientRect with
   the rootSite's position relative to the DataTree (e.g. X=175),
   causing VwDrawRootBuffered to offset rcDst by (-175, -y) and
   render content at negative X — clipping or hiding it entirely.
   Fix: render each rootSite into a temp bitmap at local coords
   (0,0,w,h), then composite into the main bitmap at the correct
   DataTree-relative position.

2. EnsureAllSlicesInitialized uses BecomeRealInPlace (CompositeViewCapture.cs):
   Replaced manual handle-forcing with the production ViewSlice
   initialization path, which sets AllowLayout=true and triggers
   rootBox.Layout with the correct width.

3. Trailing separator bar removal (VectorReferenceView.cs,
   PossibilityVectorReferenceView.cs):
   DisplayVec called AddSeparatorBar after every item including the
   last, causing VwSeparatorBox to draw unwanted grey bars after
   single/final items like 'Main Dictionary'. Added guard to only
   add separators between items.

Baselines regenerated — all 6 scenarios show 40-70% more rendered
content. All 23 DataTree tests pass (timing + optimization + snapshots).

# This is the commit message #5:

Added tests before virtualization

# This is the commit message #6:

update renders

# This is the commit message #7:

Hwnd implementation started

# This is the commit message #8:

upgrade openspec

# This is the commit message #9:

hwnd implementation
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants