Skip to content

Python support: transpiled Python on every target, Python servers, Pillow and font-from-data - #6128

Open
shai-almog wants to merge 111 commits into
masterfrom
python-support
Open

shai-almog wants to merge 111 commits into
masterfrom
python-support

Conversation

@shai-almog

Copy link
Copy Markdown
Collaborator

Python support for Codename One: Python sources are transpiled to Java and run on every target, client and server.

What is in it

  • maven/python-transpiler and maven/python-runtime: the transpiler, the runtime and the bundled stdlib and site packages, with ~125 conformance programs whose expected output is real CPython output.
  • Build integration in build-engine (Maven goal, Gradle task, project importer, PyPI resolution, C-extension stubs) and the python.virtualThreadStack build hint / @VirtualThreadStack.
  • Python servers on the backend: FastAPI/Starlette/Flask, WebSockets and streaming responses, BackgroundTasks after the response, SQLAlchemy on SQLite, PostgreSQL and MySQL (CI runs it against both), a GIL that cooperates with virtual threads.
  • Pillow: on servers over a new backend image API (com.codename1.backend.image: raster, JPEG/PNG, TrueType text); on clients over Codename One's Image/ImageIO.
  • Core: Font.createTrueTypeFontFromData / isTrueTypeStreamSupported on JavaSE, Android, iOS/Mac, JavaScript, Windows and Linux; Database column types.
  • Backend: MySQL/PostgreSQL sslmode=verify-ca with a CA file (plus the MySQL spellings).
  • Fix: the core inflater (io/gzip/InfCodes) rejected valid deflate streams whose last code ended a few bits into the final byte (about half of all gzip files, depending on the header mtime). Fuzzed against java.util.zip with 160k streams fed in chunks.
  • Developer guide chapters for all of the above.

Verification

  • python-transpiler/python-runtime tests (145), core-unittests, backend tests; SpotBugs/PMD/Checkstyle clean on the touched modules; cast-semantics, native-signature, C++ linkage, control-character and build-hint gates.
  • End-to-end server runs on the JVM and native, and SQLAlchemy against PostgreSQL 16 and MySQL 8.4.
  • Not verified locally: the JavaScript font path in a browser (TrueTypeFontFromDataTest in the JS suite covers it here), the Windows/Linux C font changes (no toolchain locally) and the iOS private-API scan.

🤖 Generated with Claude Code

shai-almog and others added 30 commits October 27, 2026 17:01
Python 3 sources transpile to Java 17 (maven/python-transpiler) and run on
maven/python-runtime on every Codename One target. Generators, async,
match, dataclasses, the builtins and a stdlib wave are covered by a
conformance suite diffed against CPython on the JVM and natively through
ParparVM. Constructs a translated program cannot run (eval, exec,
compile, __import__, frame hooks) are build errors naming file and line.

ParparVM: a frameless method returning a value after several try blocks
that end on one label ran a single END_TRY and left the other blocks on
the thread's try stack, so a later throw longjmp'd into a returned frame.
The folded return paths now unwind the stack (FramelessTryReturnIntegrationTest).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
from java.<package> import <Class> resolves at build time against the
compile class path; a generated JavaInterop bridge dispatches with
instanceof and direct calls (no reflection), converts values both ways,
adapts Python callables to functional interfaces and exposes Java
collections to len/in/iteration/indexing.

cn1:import-python-project and cn1:transpile-python (Maven), the
transpilePython task (Gradle), and the archetype's python profile build
src/main/python. runMain returns the exit status, honouring SystemExit.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…vice library

from java.java.* resolves against the class path's own class library
(java-runtime, JavaAPI) when it carries one, so an API the device lacks is
a build error rather than a bridge that fails to link.

python-project-test.sh imports scripts/python-samples/hello-ui (a
Codename One UI written in Python), builds it with Maven and Gradle and
stages every target; python-project.yml runs it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
PyHttp is the client the packages are written over: ConnectionRequest in
an application, installable like PyFileSystem. requests (verbs, Session,
auth, params/json/form bodies, cookies, exceptions) and httpx (verbs,
Client, AsyncClient, URL, Headers, HTTPStatusError) are our own Python
over it; http_requests and http_httpx match the real packages' output
against the same test server.

BaseException.__new__ ignores keyword arguments, as CPython's does, so an
exception subclass whose __init__ takes keywords can be raised.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…_type_hints

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…lice.indices

The HTTP client is installed by the generated registry only when the
program bundles requests or httpx, so other programs do not link the
network stack.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ule __dict__

Fixes found while porting attrs and pydantic: an annotation built by a call
(Annotated[int, Field(gt=0)], conint(ge=2)) was stored as None; a class
__delattr__ was bypassed by del; classes had no __hash__ attribute; and
type(name, bases, ns) gave __module__ 'builtins'.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
_cn1server.serve(dispatch, host, port) bridges a Python dispatch callable
to the backend HttpServer when the backend is on the transpile class path;
scripts/python-backend/build.sh builds such an app as a native binary.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Clean-room site packages flask, werkzeug.exceptions, fastapi, starlette
(responses, requests, testclient, status) and uvicorn. Every app exposes
dispatch(method, path, query, headers, body) -> (status, headers, body);
app.run / uvicorn.run hand it to _cn1server.serve.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ions

inspect.isgeneratorfunction/iscoroutinefunction/isasyncgenfunction now
answer from __code__ as CPython's do; FastAPI's yield dependencies use it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…pter

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…indings

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… helper returns

CommonWorkloads ported to Python (scripts/python-bench/common) with a
Java hot-spot variant, and a comparison across CPython, PyPy, GraalPy and
Codename One with peak RSS per workload.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…mance chapter

The developer guide's Python chapter compares CPython, PyPy, GraalPy and
Codename One on startup, kernels, Flask and the CommonWorkloads suite, with
peak memory in every table, two charts, and a section on moving a measured
hot spot into Java.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
IntRanges runs interval analysis over each typed function: loop counters
are bounded by their range, accumulators by trip count times their
per-pass growth, and masked values by the mask. A local whose every
value fits in 64 bits becomes a Java long, and an int expression whose
result fits is computed with wrapping long arithmetic, which equals the
exact result however large the intermediates are. Expression helpers
such as i32/i64 are inlined, module int constants are folded, and >> of
a value masked into [0, 2^64) becomes >>>.

Builtins without a typed lowering (print, sorted, ...) are now called
generically from typed code instead of leaving the whole function
untyped.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…nd //, lowered loop tests

Locals that only ever hold a freshly constructed object whose __init__
copies its arguments into fields, and are only read through fields or
getters, become one local per field. while tests lower their arithmetic
and compares like any statement. for c in str walks code points, with
ord(c) the code point itself. l.extend([v] * n) fills in place. Lone
surrogates index and repr as CPython does.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ped builtins over BOT, dict clear/len intrinsics

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… int results held bare, taken in the slow path

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…t stores per instance, try-free dict key hashing

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…-top arithmetic over impure calls

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ct clear; direct dict len

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… box the list

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
shai-almog and others added 2 commits October 28, 2026 20:20
…ench jars, Pillow kerning note

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@github-actions

github-actions Bot commented Oct 29, 2026 •

Copy link
Copy Markdown
Contributor

Developer Guide build artifacts are available for download from this workflow run:

Developer Guide quality checks:

  • AsciiDoc linter: No issues found (report)
  • Vale: No alerts found (report)
  • Paragraph capitalization: No paragraph capitalization issues (report)
  • LanguageTool: No grammar matches (report)
  • Image references: No unused images detected (report)

shai-almog and others added 2 commits October 29, 2026 04:10
…real)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@shai-almog

shai-almog commented Oct 29, 2026 •

Copy link
Copy Markdown
Collaborator Author

Compared 12 screenshots: 12 matched.
✅ JavaSE simulator integration screenshots matched stored baselines.

shai-almog and others added 2 commits October 29, 2026 04:16
…usion the gate rejects

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@github-actions

github-actions Bot commented Oct 29, 2026 •

Copy link
Copy Markdown
Contributor

Flutter vs Codename One

Same application, built both ways: Flutter's AOT compile of the gallery, and the identical Dart source transpiled to Java on Codename One. Lower is better for every metric, so a ratio above 1.00x means Codename One is ahead by that factor.

android

9 interleaved rounds; host load 1.09, 1.95, 1.42

Metric Codename One Flutter Ratio Winner
Installed size 78.2 MB 95.8 MB 1.22x Codename One
Executable code 4.7 MB 20.6 MB 4.40x Codename One
Download size (zipped) 78.2 MB 95.8 MB 1.22x Codename One
Cold start to first frame on screen 364 ms 1211 ms 3.02x Codename One
Memory at rest 45.5 MB 78.7 MB 1.73x Codename One

Start-up and memory at rest are judged round by round: the ratio is the median of the per-round ratios, each from two launches made back to back, and the times and sizes shown are each side's median, so the ratio need not equal their quotient. Codename One was ahead in 9 of 9 rounds on cold start to first frame on screen; 9 of 9 rounds on memory at rest.

Compute -- the VM workloads (vm/benchmarks), run inside each app; time is the best of the app's own repetitions, higher ratio means Codename One is faster.

Workload Codename One Flutter Ratio
intArithmetic 59 ms 123 ms 2.08x
longArithmetic 36 ms 36 ms 1.00x
mathTranscendental 170 ms 204 ms 1.20x
arraySequential 17 ms 21 ms 1.24x
arrayRandom 187 ms 208 ms 1.11x
objectAllocation 45 ms 25 ms 0.56x
valueEscape 5 ms 5 ms 1.00x
hashMapChurn 85 ms 175 ms 2.06x
stringBuilding 58 ms 78 ms 1.34x
recursion 42 ms 173 ms 4.12x
quicksortBench 110 ms 118 ms 1.07x
Geometric mean 1.33x

Gate: within tolerance against scripts/flutter-bench/baseline.

Android sizes are for the arm64-v8a slice a phone is delivered, on both sides; Flutter's release apk carries three ABIs and would otherwise count its engine about three times.
Android start-up and memory come from an x86_64 emulator with a software GPU. They compare the two runtimes on one machine; they are not phone timings, and a renderer that leans on the GPU is penalised more there.
This platform's adapter has not been exercised end to end before; treat the first published run as the thing under review.

ios

9 interleaved rounds; host load 25.61, 21.9, 21.42

Metric Codename One Flutter Ratio Winner
Installed size 108.3 MB 110.5 MB 1.02x Codename One
Executable code 17.3 MB 19.1 MB 1.10x Codename One
Download size (zipped) 80.0 MB 81.9 MB 1.02x Codename One
Cold start to first frame on screen -- -- -- not measured
Memory at rest -- -- -- not measured

Compute -- the VM workloads (vm/benchmarks), run inside each app; time is the best of the app's own repetitions, higher ratio means Codename One is faster.

Not measured: iOS compute is not measured: a device build needs signed hardware, and on the simulator Flutter runs its JIT debug engine rather than AOT code. The macOS row runs the same ParparVM and Dart AOT compilers on the same Apple silicon.

Gate: within tolerance against scripts/flutter-bench/baseline.

iOS start-up and memory are not measured here: Flutter cannot AOT-compile for the simulator, so a simulator run would time a JIT debug build against a release build. Sizes come from release device bundles; timings need signed hardware.
This platform's adapter has not been exercised end to end before; treat the first published run as the thing under review.

javascript

9 interleaved rounds; host load 2.21, 1.33, 0.61

Metric Codename One Flutter Ratio Winner
Installed size 104.1 MB 122.5 MB 1.18x Codename One
Executable code 13.0 MB 25.2 MB 1.94x Codename One
Download size (zipped) 76.4 MB 84.1 MB 1.10x Codename One
Cold start to first frame on screen -- -- -- not measured
Memory at rest -- -- -- not measured

Compute -- the VM workloads (vm/benchmarks), run inside each app; time is the best of the app's own repetitions, higher ratio means Codename One is faster.

Workload Codename One Flutter Ratio
intArithmetic 551 ms wrong result Flutter: wrong result
longArithmetic 4044 ms did not run Flutter: did not run
mathTranscendental 492 ms did not run Flutter: did not run
arraySequential 189 ms 70 ms 0.37x
arrayRandom 770 ms wrong result Flutter: wrong result
objectAllocation 29 ms 21 ms 0.72x
valueEscape 92 ms 6 ms 0.07x
hashMapChurn 756 ms 197 ms 0.26x
stringBuilding 377 ms 85 ms 0.23x
recursion 393 ms 397 ms 1.01x
quicksortBench 345 ms wrong result Flutter: wrong result
Geometric mean 0.32x

Gate: within tolerance against scripts/flutter-bench/baseline; BEHIND FLUTTER on Compute (geomean of the VM workloads) (reported, not gated: a loss to Flutter on the web is currently accepted).

the JavaScript adapter needs a Chrome DevTools driver; sizes are reported and timings are not
This platform's adapter has not been exercised end to end before; treat the first published run as the thing under review.

linux

9 interleaved rounds; host load 0.2, 3.15, 2.85

Metric Codename One Flutter Ratio Winner
Installed size 111.8 MB 143.8 MB 1.29x Codename One
Executable code 14.3 MB 16.1 MB 1.13x Codename One
Download size (zipped) 81.0 MB 92.9 MB 1.15x Codename One
Cold start to first frame on screen 152 ms 270 ms 1.76x Codename One
Memory at rest 80.4 MB 223.5 MB 2.78x Codename One

Start-up and memory at rest are judged round by round: the ratio is the median of the per-round ratios, each from two launches made back to back, and the times and sizes shown are each side's median, so the ratio need not equal their quotient. Codename One was ahead in 9 of 9 rounds on cold start to first frame on screen; 9 of 9 rounds on memory at rest.

Compute -- the VM workloads (vm/benchmarks), run inside each app; time is the best of the app's own repetitions, higher ratio means Codename One is faster.

Workload Codename One Flutter Ratio
intArithmetic 74 ms 184 ms 2.49x
longArithmetic 56 ms 56 ms 1.00x
mathTranscendental 254 ms 276 ms 1.09x
arraySequential 18 ms 35 ms 1.94x
arrayRandom 289 ms 305 ms 1.05x
objectAllocation 25 ms 37 ms 1.48x
valueEscape 5 ms 7 ms 1.40x
hashMapChurn 50 ms 340 ms 6.80x
stringBuilding 32 ms 130 ms 4.06x
recursion 88 ms 256 ms 2.91x
quicksortBench 139 ms 150 ms 1.08x
Geometric mean 1.87x

Gate: within tolerance against scripts/flutter-bench/baseline.

This platform's adapter has not been exercised end to end before; treat the first published run as the thing under review.

macos

9 interleaved rounds; host load 13.26, 17.67, 15.53

Metric Codename One Flutter Ratio Winner
Installed size 124.3 MB 139.4 MB 1.12x Codename One
Executable code 33.2 MB 47.9 MB 1.44x Codename One
Download size (zipped) 85.5 MB 93.3 MB 1.09x Codename One
Cold start to first frame on screen 297 ms 383 ms 1.29x Codename One
Memory at rest 34.5 MB 51.8 MB 1.51x Codename One

Start-up and memory at rest are judged round by round: the ratio is the median of the per-round ratios, each from two launches made back to back, and the times and sizes shown are each side's median, so the ratio need not equal their quotient. Codename One was ahead in 9 of 9 rounds on cold start to first frame on screen; 9 of 9 rounds on memory at rest.

Compute -- the VM workloads (vm/benchmarks), run inside each app; time is the best of the app's own repetitions, higher ratio means Codename One is faster.

Workload Codename One Flutter Ratio
intArithmetic 114 ms 275 ms 2.41x
longArithmetic 72 ms 71 ms 0.99x
mathTranscendental 301 ms 345 ms 1.15x
arraySequential 11 ms 45 ms 4.09x
arrayRandom 311 ms 358 ms 1.15x
objectAllocation 46 ms 31 ms 0.67x
valueEscape 6 ms 14 ms 2.33x
hashMapChurn 41 ms 186 ms 4.54x
stringBuilding 29 ms 120 ms 4.14x
recursion 141 ms 290 ms 2.06x
quicksortBench 130 ms 148 ms 1.14x
Geometric mean 1.85x

Gate: within tolerance against scripts/flutter-bench/baseline.

This platform's adapter has not been exercised end to end before; treat the first published run as the thing under review.

windows

9 interleaved rounds

Metric Codename One Flutter Ratio Winner
Installed size 107.8 MB 121.1 MB 1.12x Codename One
Executable code 11.3 MB 14.1 MB 1.25x Codename One
Download size (zipped) 77.9 MB 86.4 MB 1.11x Codename One
Cold start to first frame on screen 157 ms 255 ms 1.65x Codename One
Memory at rest 56.1 MB 92.4 MB 1.65x Codename One

Start-up and memory at rest are judged round by round: the ratio is the median of the per-round ratios, each from two launches made back to back, and the times and sizes shown are each side's median, so the ratio need not equal their quotient. Codename One was ahead in 9 of 9 rounds on cold start to first frame on screen; 9 of 9 rounds on memory at rest.

Compute -- the VM workloads (vm/benchmarks), run inside each app; time is the best of the app's own repetitions, higher ratio means Codename One is faster.

Workload Codename One Flutter Ratio
intArithmetic 82 ms 184 ms 2.24x
longArithmetic 63 ms 57 ms 0.91x
mathTranscendental 198 ms 266 ms 1.34x
arraySequential 12 ms 35 ms 2.92x
arrayRandom 250 ms 307 ms 1.23x
objectAllocation 24 ms 40 ms 1.67x
valueEscape 0 ms 7 ms too fast to time
hashMapChurn 47 ms 319 ms 6.79x
stringBuilding 35 ms 124 ms 3.54x
recursion 188 ms 264 ms 1.40x
quicksortBench 144 ms 146 ms 1.01x
Geometric mean 1.88x

Gate: within tolerance against scripts/flutter-bench/baseline.

This platform's adapter has not been exercised end to end before; treat the first published run as the thing under review.

Codename One wins 26 of 26 measured metrics across 6 platform(s).

shai-almog and others added 2 commits October 29, 2026 05:45
…DK 17 step

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ked no-try

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown
Contributor

Cloudflare Preview

shai-almog and others added 2 commits October 29, 2026 07:25
…pe-smoke gets headroom

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…emented modes now

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@github-actions

github-actions Bot commented Oct 29, 2026 •

Copy link
Copy Markdown
Contributor

✅ Continuous Quality Report

Test & Coverage

Static Analysis

  • SpotBugs [Report archive]
    • ✅ ByteCodeTranslator: 0 findings (no issues)
    • ✅ android: 0 findings (no issues)
    • ✅ android-compat: 0 findings (no issues)
    • ✅ android-res-compiler: 0 findings (no issues)
    • ✅ backend: 0 findings (no issues)
    • ✅ backend-test: 0 findings (no issues)
    • ✅ build-engine: 0 findings (no issues)
    • ✅ build-hint-catalog: 0 findings (no issues)
    • ✅ build-hint-tools: 0 findings (no issues)
    • ✅ codenameone-gradle-plugin: 0 findings (no issues)
    • ✅ codenameone-maven-plugin: 0 findings (no issues)
    • ✅ compose-compat: 0 findings (no issues)
    • ✅ core-unittests: 0 findings (no issues)
    • ✅ desktop-compat-runtime: 0 findings (no issues)
    • ✅ fxml-compiler: 0 findings (no issues)
    • ✅ ios: 0 findings (no issues)
    • ✅ javac: 0 findings (no issues)
    • ✅ javafx-compat: 0 findings (no issues)
    • ✅ project-model: 0 findings (no issues)
    • ✅ python-runtime: 0 findings (no issues)
    • ✅ python-transpiler: 0 findings (no issues)
    • ✅ swing-compat: 0 findings (no issues)
  • ❌ PMD: 1 findings (P3: 1) [HTML preview] [Download]
  • ✅ Checkstyle: 0 findings (no issues) [Report archive]

Generated automatically by the PR CI workflow.

…marked

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@shai-almog

shai-almog commented Oct 29, 2026 •

Copy link
Copy Markdown
Collaborator Author

Compared 210 screenshots: 210 matched.
Native Windows port (x64 / Intel-AMD): full hellocodenameone screenshot suite rendered offscreen with Direct2D/DirectWrite, plus the real benchmarks (base64 native/CN1/SIMD, image createMask/applyMask/modifyAlpha/PNG/JPEG, SSE2 SIMD kernels). Compared against the in-repo baseline in scripts/windows/screenshots.

Benchmark Results

Detailed Performance Metrics

Metric Duration
SIMD kernel backend SSE2 (x64) / NEON (arm64) native kernels
SIMD int-add (64K x300) java 58ms / native 5ms = 11.6x speedup
SIMD float-mul (64K x300) java 58ms / native 4ms = 14.5x speedup
SIMD kernel correctness PASS (native result == scalar reference)
Base64 native bridge unavailable (CN1 + SIMD + image benchmarks only)
Base64 payload size 8192 bytes
Base64 benchmark iterations 6000
Base64 SIMD byte path gated to scalar (CPU autovectorizes scalar; explicit SIMD not beneficial here)
Base64 CN1 encode 79.000 ms
Base64 CN1 decode 111.000 ms
Base64 SIMD encode 116.000 ms
Base64 encode ratio (SIMD/CN1) 1.468x (46.8% slower)
Base64 SIMD decode 105.000 ms
Base64 decode ratio (SIMD/CN1) 0.946x (5.4% faster)
Image encode benchmark iterations 100
Image createMask (SIMD off) 12.000 ms
Image createMask (SIMD on) 7.000 ms
Image createMask ratio (SIMD on/off) 0.583x (41.7% faster)
Image applyMask (SIMD off) 54.000 ms
Image applyMask (SIMD on) 54.000 ms
Image applyMask ratio (SIMD on/off) 1.000x (0.0% slower)
Image modifyAlpha (SIMD off) 66.000 ms
Image modifyAlpha (SIMD on) 31.000 ms
Image modifyAlpha ratio (SIMD on/off) 0.470x (53.0% faster)
Image modifyAlpha removeColor (SIMD off) 55.000 ms
Image modifyAlpha removeColor (SIMD on) 44.000 ms
Image modifyAlpha removeColor ratio (SIMD on/off) 0.800x (20.0% faster)

ParparVM vs HotSpot (JDK 25): Windows x64

Runner CPU: AMD64 Family 25 Model 1 Stepping 1, AuthenticAMD (baseline windows-x64@amd64-family-25-model-1-authenticamd)

Ratios are ParparVM / JDK 25: below 1.00x ParparVM is faster (time) or smaller (RAM). Median of 5 interleaved, paired rounds; every run's output was verified. A ratio more than 20% (time) / 25% (RAM) above its baseline in vm/selfhost/perf-baseline/ is a regression and fails; one that far below is an improvement, reported but not failed (a row whose calibration runs were noisier carries a wider tolerance), and for RAM the change must also exceed 0.05x in absolute terms. Both run unpinned on all of the runner's CPUs, with their own default thread counts.

Benchmark Cores Time RAM Status
hello (WinHelloMain) 4 1.42x (base 1.22x, +16.5%) 0.70x (base 0.58x, +19.0%) ok
translator (self) 4 0.77x (base 0.83x, -7.1%) 0.57x (base 0.54x, +4.4%) ok
intArithmetic 4 1.19x (base 1.10x, +8.2%) 0.06x (base 0.06x, +7.7%) ok
longArithmetic 4 1.08x (base 1.08x, -0.1%) 0.06x (base 0.05x, +3.5%) ok
mathTranscendental 4 0.78x (base 0.79x, -1.7%) 0.06x (base 0.06x, +2.9%) ok
arraySequential 4 1.33x (base 1.36x, -2.7%) 0.39x (base 0.39x, +0.3%) ok
arrayRandom 4 1.08x (base 1.06x, +1.8%) 0.23x (base 0.23x, +0.5%) ok
objectAllocation 4 1.44x (base 1.56x, -7.8%) 0.30x (base 0.39x, -21.1%) ok
valueEscape 4 0.10x (base 0.10x, +0.3%) 0.05x (base 0.04x, +7.1%) ok
hashMapChurn 4 1.62x (base 1.80x, -9.8%) 0.09x (base 0.09x, -6.6%) ok
stringBuilding 4 1.33x (base 1.22x, +9.8%) 0.27x (base 0.32x, -16.8%) ok
recursion 4 1.44x (base 1.49x, -3.8%) 0.06x (base 0.06x, +1.6%) ok
quicksort 4 1.10x (base 1.13x, -2.9%) 0.12x (base 0.12x, +1.0%) ok

Result: no regression

… a font

Typeface.createFromFile falls back to the default typeface instead of
failing, so TrueTypeFontFromDataTest's non-SFNT case got a font back.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@shai-almog

shai-almog commented Oct 29, 2026 •

Copy link
Copy Markdown
Collaborator Author

Compared 210 screenshots: 210 matched.
Native Windows port, REAL shipping pipeline: the hellocodenameone screenshot suite rendered by a binary CROSS-COMPILED on Linux (clang-cl + xwin, WebView2 linked) and RUN on a Windows x64 runner. Compared against the in-repo baseline in scripts/windows/screenshots.

Benchmark Results

Detailed Performance Metrics

Metric Duration
SIMD kernel backend SSE2 (x64) / NEON (arm64) native kernels
SIMD int-add (64K x300) java 44ms / native 3ms = 14.6x speedup
SIMD float-mul (64K x300) java 50ms / native 3ms = 16.6x speedup
SIMD kernel correctness PASS (native result == scalar reference)
Base64 native bridge unavailable (CN1 + SIMD + image benchmarks only)
Base64 payload size 8192 bytes
Base64 benchmark iterations 6000
Base64 SIMD byte path gated to scalar (CPU autovectorizes scalar; explicit SIMD not beneficial here)
Base64 CN1 encode 65.000 ms
Base64 CN1 decode 77.000 ms
Base64 SIMD encode 86.000 ms
Base64 encode ratio (SIMD/CN1) 1.323x (32.3% slower)
Base64 SIMD decode 78.000 ms
Base64 decode ratio (SIMD/CN1) 1.013x (1.3% slower)
Image encode benchmark iterations 100
Image createMask (SIMD off) 7.000 ms
Image createMask (SIMD on) 3.000 ms
Image createMask ratio (SIMD on/off) 0.429x (57.1% faster)
Image applyMask (SIMD off) 23.000 ms
Image applyMask (SIMD on) 24.000 ms
Image applyMask ratio (SIMD on/off) 1.043x (4.3% slower)
Image modifyAlpha (SIMD off) 23.000 ms
Image modifyAlpha (SIMD on) 16.000 ms
Image modifyAlpha ratio (SIMD on/off) 0.696x (30.4% faster)
Image modifyAlpha removeColor (SIMD off) 25.000 ms
Image modifyAlpha removeColor (SIMD on) 16.000 ms
Image modifyAlpha removeColor ratio (SIMD on/off) 0.640x (36.0% faster)

@shai-almog

shai-almog commented Oct 29, 2026 •

Copy link
Copy Markdown
Collaborator Author

Compared 195 screenshots: 195 matched.

Native Android coverage

  • 📊 Line coverage: 19.20% (56072/292096 lines covered) [HTML preview] (artifact android-coverage-report, jacocoAndroidReport/html/index.html)
    • Other counters: instruction 18.15% (270132/1488341), branch 12.41% (19645/158334), complexity 10.37% (15818/152584), method 15.72% (11383/72390), class 27.88% (2236/8019)
    • Lowest covered classes
      • kotlin.collections.unsigned.kotlin.collections.unsigned.UArraysKt___UArraysKt – 0.00% (0/2396 lines covered)
      • org.jacoco.agent.rt.internal_0e20598.asm.org.jacoco.agent.rt.internal_0e20598.asm.ClassReader – 0.00% (0/1524 lines covered)
      • androidx.compose.runtime.androidx.compose.runtime.LinkComposer – 0.00% (0/1430 lines covered)
      • org.jacoco.agent.rt.internal_0e20598.asm.org.jacoco.agent.rt.internal_0e20598.asm.MethodWriter – 0.00% (0/922 lines covered)
      • kotlinx.coroutines.channels.kotlinx.coroutines.channels.BufferedChannel – 0.00% (0/863 lines covered)
      • kotlin.sequences.kotlin.sequences.SequencesKt___SequencesKt – 0.00% (0/744 lines covered)
      • com.google.common.cache.com.google.common.cache.LocalCache$Segment – 0.00% (0/726 lines covered)
      • okio.okio.Buffer – 0.00% (0/687 lines covered)
      • kotlin.text.kotlin.text.StringsKt___StringsKt – 0.00% (0/630 lines covered)
      • com.codename1.androidcompat.rt.com.codename1.androidcompat.rt.TextXmlPullParser – 0.00% (0/623 lines covered)

✅ Native Android screenshot tests passed.

Native Android coverage

  • 📊 Line coverage: 19.20% (56072/292096 lines covered) [HTML preview] (artifact android-coverage-report, jacocoAndroidReport/html/index.html)
    • Other counters: instruction 18.15% (270132/1488341), branch 12.41% (19645/158334), complexity 10.37% (15818/152584), method 15.72% (11383/72390), class 27.88% (2236/8019)
    • Lowest covered classes
      • kotlin.collections.unsigned.kotlin.collections.unsigned.UArraysKt___UArraysKt – 0.00% (0/2396 lines covered)
      • org.jacoco.agent.rt.internal_0e20598.asm.org.jacoco.agent.rt.internal_0e20598.asm.ClassReader – 0.00% (0/1524 lines covered)
      • androidx.compose.runtime.androidx.compose.runtime.LinkComposer – 0.00% (0/1430 lines covered)
      • org.jacoco.agent.rt.internal_0e20598.asm.org.jacoco.agent.rt.internal_0e20598.asm.MethodWriter – 0.00% (0/922 lines covered)
      • kotlinx.coroutines.channels.kotlinx.coroutines.channels.BufferedChannel – 0.00% (0/863 lines covered)
      • kotlin.sequences.kotlin.sequences.SequencesKt___SequencesKt – 0.00% (0/744 lines covered)
      • com.google.common.cache.com.google.common.cache.LocalCache$Segment – 0.00% (0/726 lines covered)
      • okio.okio.Buffer – 0.00% (0/687 lines covered)
      • kotlin.text.kotlin.text.StringsKt___StringsKt – 0.00% (0/630 lines covered)
      • com.codename1.androidcompat.rt.com.codename1.androidcompat.rt.TextXmlPullParser – 0.00% (0/623 lines covered)

Benchmark Results

Detailed Performance Metrics

Metric Duration
SIMD kernel backend scalar fallback (no native SIMD)
SIMD int-add (64K x300) java 169ms / native 149ms = 1.1x speedup
SIMD float-mul (64K x300) java 181ms / native 119ms = 1.5x speedup
SIMD kernel correctness PASS (native result == scalar reference)
Base64 payload size 8192 bytes
Base64 benchmark iterations 6000
Base64 SIMD byte path gated to scalar (CPU autovectorizes scalar; explicit SIMD not beneficial here)
Base64 CN1 encode 91.000 ms
Base64 CN1 decode 85.000 ms
Base64 native encode 443.000 ms
Base64 encode ratio (CN1/native) 0.205x (79.5% faster)
Base64 native decode 269.000 ms
Base64 decode ratio (CN1/native) 0.316x (68.4% faster)
Image encode benchmark status skipped (SIMD unsupported)

@shai-almog

shai-almog commented Oct 29, 2026 •

Copy link
Copy Markdown
Collaborator Author

Compared 231 screenshots: 231 matched.
✅ JavaScript-port screenshot tests passed.

shai-almog and others added 2 commits October 29, 2026 14:38
…e in one binary

The native conformance job never finished: one -O3 build per program is
nine hours of runner time. It now builds every program into one binary
(a Java driver runs each as __main__ behind a marker line), at -O1 with
the objects compiled in parallel: about three minutes.

Running it found that str.lower/upper/isupper/isalpha/... answered from
java.lang.Character, which on a device is the CLDC class (ASCII, at most
Latin-1): non-ASCII text did not fold and idna rejected nothing. The
runtime now carries CPython 3.13's own BMP tables (generated by
tools/gen_unicode_tables.py), so every target answers as CPython does;
str.istitle was missing and is added. unicode_case holds it.

Also: the native build links core's io/gzip (zlib needs it); numbers.py
is renamed fast_paths.py so it no longer shadows the stdlib module when
programs share a root; compile-dist passes sources through a response
file; vm-tests installs JavaAPI before the SQLAlchemy step that needs it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
# Conflicts:
#	.github/workflows/archetype-smoke.yml
#	.github/workflows/pr.yml
#	NOTICE
#	maven/cn1app-archetype/src/main/resources/archetype-resources/common/pom.xml
#	scripts/check-cast-semantics.sh
#	scripts/developer-guide/check-guide-api-names.py
@shai-almog

shai-almog commented Oct 29, 2026 •

Copy link
Copy Markdown
Collaborator Author

Compared 196 screenshots: 196 matched.
✅ Native Mac screenshot tests passed.

Benchmark Results

  • VM Translation Time: 0 seconds
  • Compilation Time: 662 seconds

Detailed Performance Metrics

Metric Duration
SIMD kernel backend SSE2 (x64) / NEON (arm64) native kernels
SIMD int-add (64K x300) java 51ms / native 2ms = 25.5x speedup
SIMD float-mul (64K x300) java 52ms / native 2ms = 26.0x speedup
SIMD kernel correctness PASS (native result == scalar reference)
Base64 native bridge unavailable (CN1 + SIMD + image benchmarks only)
Base64 payload size 8192 bytes
Base64 benchmark iterations 6000
Base64 SIMD byte path active (NEON-accelerated)
Base64 CN1 encode 43.000 ms
Base64 CN1 decode 53.000 ms
Image encode benchmark iterations 100
Image createMask (SIMD off) 8.000 ms
Image createMask (SIMD on) 3.000 ms
Image createMask ratio (SIMD on/off) 0.375x (62.5% faster)
Image applyMask (SIMD off) 46.000 ms
Image applyMask (SIMD on) 55.000 ms
Image applyMask ratio (SIMD on/off) 1.196x (19.6% slower)
Image modifyAlpha (SIMD off) 48.000 ms
Image modifyAlpha (SIMD on) 71.000 ms
Image modifyAlpha ratio (SIMD on/off) 1.479x (47.9% slower)
Image modifyAlpha removeColor (SIMD off) 50.000 ms
Image modifyAlpha removeColor (SIMD on) 36.000 ms
Image modifyAlpha removeColor ratio (SIMD on/off) 0.720x (28.0% faster)

ParparVM vs HotSpot (JDK 25): macOS arm64

Runner CPU: Apple M1 (Virtual) (baseline macos-arm64)

Ratios are ParparVM / JDK 25: below 1.00x ParparVM is faster (time) or smaller (RAM). Median of 5 interleaved, paired rounds; every run's output was verified. A ratio more than 20% (time) / 25% (RAM) above its baseline in vm/selfhost/perf-baseline/ is a regression and fails; one that far below is an improvement, reported but not failed (a row whose calibration runs were noisier carries a wider tolerance), and for RAM the change must also exceed 0.05x in absolute terms. Both run unpinned on all of the runner's CPUs, with their own default thread counts.

Benchmark Cores Time RAM Status
hello (HelloCodenameOne) 3 0.80x (base 0.96x, -16.1%) 0.86x (base 0.93x, -7.4%) ok
translator (self) 3 0.58x (base 0.62x, -6.2%) 0.65x (base 0.78x, -17.1%) ok
intArithmetic 3 1.01x (base 1.03x, -2.6%) 0.11x (base 0.12x, -1.6%) ok
longArithmetic 3 1.03x (base 1.03x, +0.5%) 0.12x (base 0.07x, +67.9%) ok
mathTranscendental 3 0.93x (base 1.01x, -7.9%) 0.12x (base 0.12x, +1.2%) ok
arraySequential 3 0.45x (base 0.42x, +7.8%) 0.53x (base 0.53x, +0.0%) ok
arrayRandom 3 1.01x (base 0.99x, +1.7%) 0.32x (base 0.32x, +0.1%) ok
objectAllocation 3 1.04x (base 1.11x, -5.6%) 0.82x (base 0.72x, +12.7%) ok
valueEscape 3 0.50x (base 0.51x, -0.7%) 0.09x (base 0.09x, +0.0%) ok
hashMapChurn 3 1.01x (base 1.18x, -14.4%) 0.07x (base 0.07x, +8.2%) ok
stringBuilding 3 0.86x (base 0.84x, +2.4%) 0.46x (base 0.46x, +0.2%) ok
recursion 3 1.16x (base 1.24x, -5.7%) 0.12x (base 0.12x, +1.0%) ok
quicksort 3 0.99x (base 1.01x, -2.0%) 0.11x (base 0.11x, +0.2%) ok

Result: no regression

@shai-almog

shai-almog commented Oct 29, 2026 •

Copy link
Copy Markdown
Collaborator Author

Compared 210 screenshots: 210 matched.
Native Linux port (arm64), GTK3/Cairo/Pango, ParparVM bytecode-to-C (no JVM): the hellocodenameone screenshot suite rendered by a native ELF built + run on the GitHub arm64 runner. Baseline: scripts/linux/screenshots-arm.

ParparVM vs HotSpot (JDK 25): Linux arm64

Runner CPU: Neoverse-N2 (baseline linux-arm64@neoverse-n2)

Ratios are ParparVM / JDK 25: below 1.00x ParparVM is faster (time) or smaller (RAM). Median of 5 interleaved, paired rounds; every run's output was verified. A ratio more than 20% (time) / 25% (RAM) above its baseline in vm/selfhost/perf-baseline/ is a regression and fails; one that far below is an improvement, reported but not failed (a row whose calibration runs were noisier carries a wider tolerance), and for RAM the change must also exceed 0.05x in absolute terms. Both run unpinned on all of the runner's CPUs, with their own default thread counts.

Benchmark Cores Time RAM Status
hello (LinuxHelloMain) 4 0.95x (base 1.02x, -6.6%) 0.75x (base 0.66x, +13.2%) ok
translator (self) 4 0.74x (base 0.70x, +5.9%) 0.44x (base 0.43x, +1.6%) ok
intArithmetic 4 1.05x (base 1.04x, +0.1%) 0.03x (base 0.03x, +4.4%) ok
longArithmetic 4 0.79x (base 0.79x, -0.0%) 0.03x (base 0.03x, +4.8%) ok
mathTranscendental 4 1.09x (base 1.10x, -0.3%) 0.04x (base 0.03x, +9.8%) ok
arraySequential 4 0.36x (base 0.36x, -1.8%) 0.37x (base 0.37x, +0.2%) ok
arrayRandom 4 0.94x (base 0.94x, +0.3%) 0.20x (base 0.20x, +0.6%) ok
objectAllocation 4 2.02x (base 1.77x, +14.1%) 0.40x (base 0.37x, +7.7%) ok
valueEscape 4 0.51x (base 0.51x, -0.1%) 0.03x (base 0.03x, +6.0%) ok
hashMapChurn 4 0.86x (base 0.84x, +2.3%) 0.12x (base 0.12x, -4.8%) ok
stringBuilding 4 1.41x (base 1.57x, -10.1%) 0.27x (base 0.26x, +1.4%) ok
recursion 4 1.42x (base 1.43x, -0.7%) 0.04x (base 0.04x, +3.1%) ok
quicksort 4 0.99x (base 0.99x, -0.2%) 0.10x (base 0.09x, +2.5%) ok

Result: no regression

@shai-almog

shai-almog commented Oct 29, 2026 •

Copy link
Copy Markdown
Collaborator Author

Compared 210 screenshots: 210 matched.
Native Windows port (arm64 / Apple Silicon - Arm): full hellocodenameone screenshot suite rendered offscreen with Direct2D/DirectWrite, plus the real benchmarks (base64 native/CN1/SIMD, image createMask/applyMask/modifyAlpha/PNG/JPEG, NEON SIMD kernels). Compared against the in-repo baseline in scripts/windows/screenshots.

Benchmark Results

Detailed Performance Metrics

Metric Duration
SIMD kernel backend SSE2 (x64) / NEON (arm64) native kernels
SIMD int-add (64K x300) java 50ms / native 3ms = 16.6x speedup
SIMD float-mul (64K x300) java 49ms / native 3ms = 16.3x speedup
SIMD kernel correctness PASS (native result == scalar reference)
Base64 native bridge unavailable (CN1 + SIMD + image benchmarks only)
Base64 payload size 8192 bytes
Base64 benchmark iterations 6000
Base64 SIMD byte path gated to scalar (CPU autovectorizes scalar; explicit SIMD not beneficial here)
Base64 CN1 encode 60.000 ms
Base64 CN1 decode 68.000 ms
Base64 SIMD encode 75.000 ms
Base64 encode ratio (SIMD/CN1) 1.250x (25.0% slower)
Base64 SIMD decode 68.000 ms
Base64 decode ratio (SIMD/CN1) 1.000x (0.0% slower)
Image encode benchmark iterations 100
Image createMask (SIMD off) 6.000 ms
Image createMask (SIMD on) 2.000 ms
Image createMask ratio (SIMD on/off) 0.333x (66.7% faster)
Image applyMask (SIMD off) 20.000 ms
Image applyMask (SIMD on) 19.000 ms
Image applyMask ratio (SIMD on/off) 0.950x (5.0% faster)
Image modifyAlpha (SIMD off) 18.000 ms
Image modifyAlpha (SIMD on) 12.000 ms
Image modifyAlpha ratio (SIMD on/off) 0.667x (33.3% faster)
Image modifyAlpha removeColor (SIMD off) 27.000 ms
Image modifyAlpha removeColor (SIMD on) 18.000 ms
Image modifyAlpha removeColor ratio (SIMD on/off) 0.667x (33.3% faster)

ParparVM vs HotSpot (JDK 25): Windows arm64

Runner CPU: ARMv8 (64-bit) Family 8 Model D49 Revision 0, MICROSOFT CORPORATION (baseline windows-arm64@armv8-64-bit-family-8-model-d49-microsoft-corporation)

Ratios are ParparVM / JDK 25: below 1.00x ParparVM is faster (time) or smaller (RAM). Median of 5 interleaved, paired rounds; every run's output was verified. A ratio more than 20% (time) / 25% (RAM) above its baseline in vm/selfhost/perf-baseline/ is a regression and fails; one that far below is an improvement, reported but not failed (a row whose calibration runs were noisier carries a wider tolerance), and for RAM the change must also exceed 0.05x in absolute terms. Both run unpinned on all of the runner's CPUs, with their own default thread counts.

Benchmark Cores Time RAM Status
hello (WinHelloMain) 4 1.05x (base 1.11x, -5.6%) 0.72x (base 0.75x, -3.9%) ok
translator (self) 4 0.87x (base 0.84x, +3.6%) 0.50x (base 0.51x, -0.9%) ok
intArithmetic 4 1.04x (base 1.04x, +0.0%) 0.06x (base 0.06x, +3.1%) ok
longArithmetic 4 0.79x (base 0.80x, -0.2%) 0.06x (base 0.06x, +3.4%) ok
mathTranscendental 4 0.73x (base 0.72x, +1.5%) 0.07x (base 0.06x, +1.8%) ok
arraySequential 4 0.37x (base 0.46x, -19.1%) 0.39x (base 0.39x, +0.2%) ok
arrayRandom 4 0.93x (base 0.94x, -0.5%) 0.23x (base 0.23x, +0.3%) ok
objectAllocation 4 1.76x (base 1.82x, -3.5%) 0.30x (base 0.43x, -29.9%) ok
valueEscape 4 0.76x (base 0.76x, +0.0%) 0.05x (base 0.05x, +2.5%) ok
hashMapChurn 4 1.00x (base 0.98x, +1.1%) 0.11x (base 0.12x, -9.6%) ok
stringBuilding 4 1.51x (base 1.43x, +6.0%) 0.27x (base 0.27x, -0.1%) ok
recursion 4 1.46x (base 1.46x, -0.1%) 0.07x (base 0.07x, +1.2%) ok
quicksort 4 1.01x (base 1.00x, +0.5%) 0.12x (base 0.12x, +0.6%) ok

Result: no regression

@shai-almog

shai-almog commented Oct 29, 2026 •

Copy link
Copy Markdown
Collaborator Author

Compared 192 screenshots: 192 matched.
✅ Native Mac screenshot tests passed.

Benchmark Results

  • VM Translation Time: 0 seconds
  • Compilation Time: 960 seconds

Detailed Performance Metrics

Metric Duration
SIMD kernel backend SSE2 (x64) / NEON (arm64) native kernels
SIMD int-add (64K x300) java 76ms / native 3ms = 25.3x speedup
SIMD float-mul (64K x300) java 85ms / native 3ms = 28.3x speedup
SIMD kernel correctness PASS (native result == scalar reference)
Base64 payload size 8192 bytes
Base64 benchmark iterations 6000
Base64 SIMD byte path active (NEON-accelerated)
Base64 CN1 encode 56.000 ms
Base64 CN1 decode 70.000 ms
Base64 native encode 870.000 ms
Base64 encode ratio (CN1/native) 0.064x (93.6% faster)
Base64 native decode 324.000 ms
Base64 decode ratio (CN1/native) 0.216x (78.4% faster)
Base64 SIMD encode 60.000 ms
Base64 encode ratio (SIMD/CN1) 1.071x (7.1% slower)
Base64 SIMD decode 63.000 ms
Base64 decode ratio (SIMD/CN1) 0.900x (10.0% faster)
Base64 encode ratio (SIMD/native) 0.069x (93.1% faster)
Base64 decode ratio (SIMD/native) 0.194x (80.6% faster)
Image encode benchmark iterations 100
Image createMask (SIMD off) 5.000 ms
Image createMask (SIMD on) 4.000 ms
Image createMask ratio (SIMD on/off) 0.800x (20.0% faster)
Image applyMask (SIMD off) 63.000 ms
Image applyMask (SIMD on) 71.000 ms
Image applyMask ratio (SIMD on/off) 1.127x (12.7% slower)
Image modifyAlpha (SIMD off) 82.000 ms
Image modifyAlpha (SIMD on) 58.000 ms
Image modifyAlpha ratio (SIMD on/off) 0.707x (29.3% faster)
Image modifyAlpha removeColor (SIMD off) 84.000 ms
Image modifyAlpha removeColor (SIMD on) 56.000 ms
Image modifyAlpha removeColor ratio (SIMD on/off) 0.667x (33.3% faster)

@shai-almog

shai-almog commented Oct 29, 2026 •

Copy link
Copy Markdown
Collaborator Author

Apple Watch (watchOS / Core Graphics)

Compared 253 screenshots: 248 matched, 1 updated, 4 missing references.

  • KmpCompatLayout — missing reference. Reference screenshot missing at /Users/runner/work/CodenameOne/CodenameOne/scripts/ios/screenshots-watch/KmpCompatLayout.png.

    KmpCompatLayout
    Preview info: JPEG preview quality 70; JPEG preview quality 70.
    Full-resolution PNG saved as KmpCompatLayout.png in workflow artifacts.

  • KmpCompatList — missing reference. Reference screenshot missing at /Users/runner/work/CodenameOne/CodenameOne/scripts/ios/screenshots-watch/KmpCompatList.png.

    KmpCompatList
    Preview info: JPEG preview quality 70; JPEG preview quality 70.
    Full-resolution PNG saved as KmpCompatList.png in workflow artifacts.

  • KmpCompatState — missing reference. Reference screenshot missing at /Users/runner/work/CodenameOne/CodenameOne/scripts/ios/screenshots-watch/KmpCompatState.png.

    KmpCompatState
    Preview info: JPEG preview quality 70; JPEG preview quality 70.
    Full-resolution PNG saved as KmpCompatState.png in workflow artifacts.

  • KmpCompatTypography — missing reference. Reference screenshot missing at /Users/runner/work/CodenameOne/CodenameOne/scripts/ios/screenshots-watch/KmpCompatTypography.png.

    KmpCompatTypography
    Preview info: JPEG preview quality 70; JPEG preview quality 70.
    Full-resolution PNG saved as KmpCompatTypography.png in workflow artifacts.

  • Sheet — updated screenshot. Screenshot differs (416x496 px, bit depth 8).

    Sheet
    Preview info: JPEG preview quality 70; JPEG preview quality 70.
    Full-resolution PNG saved as Sheet.png in workflow artifacts.

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.

2 participants