Commit Graph

109 Commits

Author SHA1 Message Date
Martín Lucas Golini
b940407102 ecode: The custom fallback font reused the "fallback-font" resource key, replacing the built-in CJK fallback in FontService.
Fix:

  - User fallback now uses "user-fallback-font".
  - Built-in CJK and custom fallback fonts remain registered together.
  - Added and passed a regression test verifying both fallback resources remain in the chain.

Fixes in premake5.lua:

  - Removed obsolete PRECISE_F32=1; Wasm already provides precise float behavior.
  - Moved ENVIRONMENT=worker,web to final application link options.

Fixed MarkdownView not getting the correct CSS style from the base theme.
2026-07-25 01:36:00 -03:00
Martín Lucas Golini
6b277e508b migrate fonts to scoped resource ownership
- replace FontManager with per-ResourceScope FontService instances
  - publish font factories into explicit or default resource scopes
  - import default resources into UI scene scopes unless explicitly disabled
  - keep related font faces strongly owned without hot-path weak_ptr locking
  - add cached glyph advance queries without creating texture pages
  - fix font picker preview ownership, cleanup, and rapid switching
  - selectively evict TextLayout cache entries when referenced fonts unload
  - document FontService, ResourceCatalog, and cache invalidation semantics
  - migrate examples, tools, benchmarks, and tests to the scoped font API
  - expand coverage for font ownership, texture release, and layout caching
2026-07-24 01:54:51 -03:00
Martín Lucas Golini
f7dba042df Replace DrawableSearcher with scoped drawable resolution:
Add a scene-owned UI::DrawableResolver for resolving file, data, HTTP, and
named drawable references through each UISceneNode's current resource scope.

Move generic texture, atlas region, nine-patch, and sprite lookup into
Graphics::ResourceScope, preserving drawable resolution for pure Graphics
consumers without introducing a UI dependency.

Migrate UI images, sprites, menus, CSS parsing, and tests to the new resolver.
Resolve CSS icons through the requesting node's scene instead of the global
scene, preserving embedded-scene isolation.

Remove the obsolete DrawableSearcher API and update platform project manifests,
tests, and the shared-resource architecture plan.
2026-07-21 23:50:58 -03:00
Martín Lucas Golini
dc377335b9 graphics: migrate drawables to shared ownership
- introduce DrawablePtr and per-consumer createInstance() semantics
  - add TextureDrawable wrappers backed by shared TexturePtr handles
  - migrate regions, sprites, nine-patches, state lists, skins, groups, gradients,
    UI widgets, tools, modules, ecode, and eeiv to shared drawable ownership
  - remove ownIt flags, manual drawable deletion, and unload-based lifetime handling
  - replace drawable callback IDs with RAII change connections
  - move Variant drawable storage outside its scalar union
  - split UIIcon source lookup from explicit drawable instance creation
  - retain icon instances used by rendering loops instead of cloning per frame
  - avoid shared source mutation in texture-region consumers
  - use drawable type tags instead of RTTI casts
  - fix nearest-size UIIcon lookup
  - document the drawable source/instance contract and add ownership tests
2026-07-20 01:09:36 -03:00
Martín Lucas Golini
04f600bef5 graphics: move texture ownership to catalogs and scopes
Add ResourceCatalog and ResourceScope to provide explicit strong ownership
  and deterministic semantic lookup independently from the live texture
  registry.

  Let Engine own the global catalog and default Graphics scope, and give
  each UISceneNode an isolated scope that can be explicitly shared with
  other scenes.

  Remove TextureFactory's strong texture retention and name/hash lookup.
  The factory now observes textures weakly for identity, diagnostics, and
  deferred destruction without controlling their semantic lifetime.

  Migrate drawable resolution, texture atlas loading, UI image caches,
  tile maps, ecode resources, and related tests to scoped lookup and
  publication.

  Allow final TexturePtr release from worker threads while keeping actual
  texture destruction deferred to the graphics thread. Fix mismatched
  pixel deallocation uncovered by asynchronous texture loading tests.

  Add ownership, scope isolation, scene sharing, worker release, and
  decoder allocation regression tests, and update the shared-resource
  architecture plan through Stage 3.
2026-07-19 23:06:23 -03:00
Martín Lucas Golini
8556bda68c migrate texture consumers to shared ownership
- return TexturePtr from texture creation and lookup APIs
  - retain texture handles in regions, atlases, fonts, framebuffers, sprites, UI, and maps
  - keep queued batch textures alive until rendering completes
  - preserve asynchronous atlas load results directly
  - replace TextureLoader unload semantics with reset
  - remove public texture deletion APIs and obsolete Sprite ownership flags
  - migrate bundled tools, examples, tests, ecode, and diagnostics
  - document Stage 2 completion and the temporary factory retention boundary
2026-07-19 21:27:30 -03:00
Martín Lucas Golini
0ae2537713 fix: bind UI resource deliveries to Engine lifetime
- add explicit open, closing, and closed states to the UISceneNode async delivery queue
    - reject delivery execution during shutdown and purge retained captures after scene producers join
    - reopen the queue cleanly when recreating Engine state in tests
    - add regressions for stale deliveries, retained captures, concurrent producers, and Engine restart
    - remove the obsolete and unused FrameBuffer context-loss reload API
    - simplify redundant namespace qualification in UI tests and ecode declarations
    - consolidate completed resource plans into the active ownership architecture
    - defer TextureLoader callback removal directly to Stage 1 live-texture observation
    - document the requirement to validate legacy lifecycles and prefer removing dead mechanisms
2026-07-14 21:05:39 -03:00
Martín Lucas Golini
edf316a5b6 Optimize CSS attribute selector matching:
Resolve standard property definitions and data-attribute classification
  when selectors are parsed, avoiding repeated specification lookups and
  attribute-name checks during matching.

  Fast-path existence-only data selectors without retrieving their values,
  while preserving all attribute operator behavior. Add standard-property
  coverage and an attribute-focused benchmark showing a 41.7% reduction
  in matching time.
2026-07-10 20:01:56 -03:00
Martín Lucas Golini
660d64c823 Optimize single-rule CSS selector matching:
Add a fast path that directly evaluates selectors containing one rule,
  avoiding combinator traversal and switch overhead for common class, ID,
  tag, and pseudo-class selectors.

  Move complex selector traversal into a dedicated function and cache rule
  counts in selector loops. Add focused matching coverage and document the
  Phase 7 benchmark results.
2026-07-10 19:51:05 -03:00
Martín Lucas Golini
d29dbb1cc1 Optimize stylesheet matching with class-based indexing:
Index class-anchored selectors by one mandatory class hash so widgets
  only evaluate rules associated with their own classes instead of
  scanning every class-only rule in the global bucket.

  Preserve selector correctness by validating the complete rule after
  candidate lookup, and retain stylesheet source order across independent
  index buckets for equal-specificity cascade resolution.

  Update index clearing, copying, marker removal, and style insertion
  paths. Add focused candidate coverage and a legacy full-scan benchmark,
  showing a 63% lookup-time reduction on a class-heavy stylesheet.
2026-07-10 19:31:15 -03:00
Martín Lucas Golini
3e29da6a2e Optimize CSS selector matching with cached hashes
Cache tag, ID, and class hashes in selector rules and widgets to avoid
  repeated string comparisons during selector matching.

  Store widget class hashes in a single-element SmallVector so the common
  zero and one-class cases remain allocation-free. Reorder UINode and
  UIWidget members to recover padding, keeping UIWidget at its original
  1144-byte size.

  Add selector matching benchmarks and regression coverage for class
  mutation, compound selectors, and hash cache synchronization. Document
  the measured Phase 5 performance and memory results.
2026-07-10 17:13:13 -03:00
Martín Lucas Golini
4150eb2df6 - Universal selectors now return early only when no non-pseudo class, ID, or attribute requirements exist.
- Added computed-style and direct matcher tests for *.foo, *[href], and plain *.
2026-07-10 01:44:16 -03:00
Martín Lucas Golini
6b4179b896 Optimize CSS selector traversal and fix sibling combinators:
- inline hot-path node and stylesheet traversal accessors
  - correct adjacent and general sibling matching direction
  - preserve inverse sibling operator behavior
  - add selector traversal and sibling regression tests
2026-07-10 01:26:06 -03:00
Martín Lucas Golini
7c931bf72e Fix again in UIScrollView scroll visibility.
Fix `whitespace: pre`.
2026-07-08 00:14:08 -03:00
Martín Lucas Golini
b7facf4b37 Fix isInlineBlock in UITextSpan: floated inline-block spans were no longer considered isInlineBlock() because UITextSpan::isInlineBlock() required float:none. 2026-07-06 12:42:38 -03:00
Martín Lucas Golini
bf0c6e8b11 Fix in Flex layout interacting with float elements. 2026-07-06 12:27:53 -03:00
Martín Lucas Golini
3f304e9c80 Float minor fix. 2026-07-06 11:48:35 -03:00
Martín Lucas Golini
e984c87105 Implement CSS box-sizing for HTML layout sizing
Add CSS box-sizing support for HTML widgets and route CSS-specified
width/height conversion through virtual sizing hooks. Resolve percentage
CSS sizes against the containing block content box, and apply content-box
or border-box conversion consistently across block, flex, grid, table,
and rich text layout paths.

Keep table wrapper width behavior compatible with CSS table layout by
overriding the table width conversion separately, so padded percentage
tables do not overflow their assigned wrapper width.

Add focused regressions for block padding, flex-basis sizing, grid
containers, table containers, and the border rendering cases that depend
on explicit border-box sizing.
2026-07-06 00:32:17 -03:00
Martín Lucas Golini
ab14972fd3 TextureFactory small refactor.
Fix in getTextureCacheName.
2026-07-05 19:21:23 -03:00
Martín Lucas Golini
4f3e5309a4 Fix broken resource cache for images and layout drawables. 2026-07-05 00:55:37 -03:00
Martín Lucas Golini
d56135c2d1 Fix CSS specificity rules.
Added control over the UISceneNode children and added setHighlightOverRecursive. This allows us to inspect nested UISceneNodes.
Fix hit-box bug when changing display.
2026-07-05 00:14:02 -03:00
Martín Lucas Golini
b192bcde1e Fix stale width being reused during the deferred CSS relayout. This happened when a display was being switched and during the layout change we didn't reset to the initial state. 2026-07-04 20:41:40 -03:00
Martín Lucas Golini
627d22163b Fixed an layout invalidation bug where we were discarding real invalidations.
Allow to defer `<img defer src>` (useful for local tests).
2026-07-04 16:14:47 -03:00
Martín Lucas Golini
a2b216a0e7 Fixed a bug introduced in the latest changes that tried to load non urls as external resources.
Fixed some sizing issues.
2026-07-03 16:40:48 -03:00
Martín Lucas Golini
a4f4e033b7 Merge branch 'develop' into feature/uiwebview 2026-07-03 13:27:51 -03:00
Martín Lucas Golini
f3e5bee80a Fix body height invalidation issue killing performance. 2026-07-03 13:27:27 -03:00
Martín Lucas Golini
38448008ec Merge branch 'develop' into feature/uiwebview 2026-07-01 19:10:22 -03:00
Martín Lucas Golini
f6da5ef76e Fix warning on macOS due to posix_spawn_file_actions_addchdir_np usage (we must use posix_spawn_file_actions_addchdir).
Try to run tests with borderless windows to see if macOS windows are created with the right size.
2026-06-30 11:35:33 -03:00
Martín Lucas Golini
4b1e9b6574 Fix tests. 2026-06-13 00:29:03 -03:00
Martín Lucas Golini
5cba387497 UIWebView with its own UISceneNode support WIP. 2026-06-09 01:30:14 -03:00
Martín Lucas Golini
05e81c23de Communicate the reason for the layout invalidation, store and process the reasons, this is an initial setup, we will continue working on it. The new system will allow us to fine grain the invalidations to avoid re-layouting on each attribute change, this commit already does some of this but it's not fully fine-grained and needs more work. 2026-06-08 02:33:49 -03:00
Martín Lucas Golini
12413ea630 Temporary fix until we have proper layout invalidation. 2026-06-07 02:00:42 -03:00
Martín Lucas Golini
b75cab5939 Fix html element sizing. 2026-06-06 19:16:35 -03:00
Martín Lucas Golini
68904b9656 Fixed layouting performance issues in UIRichText (layout invalidation trashing issues). Everything is highly commented given that none of these changes are obvious and it's very easy to break it.
Added tests to verify possible regression. And added a simple benchmark with some metrics to inspect layouting invalidation issues.
2026-06-06 15:54:54 -03:00
Martín Lucas Golini
288950bf34 Image sizing fixes.
Added support for `:where` and `:is`.
2026-06-05 00:18:26 -03:00
Martín Lucas Golini
b72e2c5d0b More grid fixes and fixed a couple of crashes. 2026-06-03 02:07:37 -03:00
Martín Lucas Golini
f8f066c57a Fix infinite loop in flex layouter. 2026-06-02 19:42:50 -03:00
Martín Lucas Golini
2e14b4d0cb Span’s own RichText was using the parent match width while still inheriting text-align: center, so the text was rendered offset inside the correct span box. 2026-06-02 19:09:28 -03:00
Martín Lucas Golini
98837b9cbe Merge remote-tracking branch 'origin/develop' into feature/grid-layout 2026-06-01 16:55:25 -03:00
Martín Lucas Golini
4370a45728 CSS white-space-collapse Support in HTML compatibility layer. 2026-06-01 16:53:45 -03:00
Martín Lucas Golini
46b3fa44f0 Grid layout WIP. 2026-06-01 02:14:00 -03:00
Martín Lucas Golini
50334d4481 HTML input checkbox fixes. 2026-05-31 02:07:36 -03:00
Martín Lucas Golini
8be05aabdd Initial implementation to support rendering text nodes as anonymous flex items. This does not support wrapping yet. 2026-05-30 02:37:22 -03:00
Martín Lucas Golini
4cd645a411 More flex fixes. 2026-05-30 01:55:23 -03:00
Martín Lucas Golini
ddfd59e167 More flex improvements. 2026-05-29 21:20:56 -03:00
Martín Lucas Golini
cc0e516edc Nits 2026-05-29 18:17:39 -03:00
Martín Lucas Golini
453eaa03fc Several flex fixes. 2026-05-29 15:48:23 -03:00
Martín Lucas Golini
5305670f46 Fixes. 2026-05-29 03:04:27 -03:00
Martín Lucas Golini
20ef8854fc Flex support WIP. 2026-05-29 02:18:12 -03:00
Martín Lucas Golini
55e0fb9736 float and clear fixes 2026-05-26 21:57:32 -03:00