Repository navigation
TotalCross 7.2.2
Release date: July 1, 2026
Commits since 7.2.1: 19
TotalCross 7.2.2 is a focused correctness and distribution reliability release following the graphics stabilization work delivered in 7.2.1.
The most important runtime change fixes drawing through Image.getGraphics() on Android and iOS, restoring image-to-image operations and ensuring mutations are preserved when GPU textures are recreated.
The release also fixes an urgent problem in the downloadable 7.2.1 SDK package, which could be distributed without required runtime dependencies under dist/libs. Packaging and release workflows now validate the generated SDK through actual deployment tests and verify that published release artifacts are publicly accessible.
Finally, the SDK version API is clarified by deprecating the legacy numeric version fields in favor of the SemVer-formatted Settings.versionStr.
Migration Summary
No breaking API or platform compatibility change is introduced by 7.2.2.
Applications and SDK consumers should nevertheless review the following:
-
Applications using
Image.getGraphics()should upgrade to 7.2.2.
Drawing another image into anImagethrough itsGraphicsobject could fail on Android and iOS. This is corrected in 7.2.2. -
Users of the downloadable TotalCross 7.2.1 SDK package should upgrade to 7.2.2.
The 7.2.1 packaged ZIP could be missing required runtime dependencies fromdist/libs. -
Use
Settings.versionStrfor TotalCross version checks.
Settings.versionandSettings.buildNumberare now deprecated.Settings.versionStris the canonical SemVer-formatted SDK version. -
No dependency-version migration is required.
Native and Java dependency versions remain unchanged from 7.2.1.
There are no source changes required for applications that do not depend on the deprecated version fields.
Highlights
Developer Action Required
There are no mandatory application source changes when upgrading from 7.2.1.
However:
- code using
Settings.versionshould migrate toSettings.versionStr; - code using
Settings.buildNumberto identify the SDK version should migrate toSettings.versionStr; - applications that manipulate images through
Image.getGraphics()should retest those operations on Android and iOS; - users distributing or installing the standalone 7.2.1 SDK ZIP should replace it with the 7.2.2 package.
Major New Capabilities
7.2.2 does not introduce a major new application-facing capability.
Its focus is restoring expected graphics behavior and making the SDK release package itself reliable and verifiable.
Major Runtime Improvements
Image-backed Graphics now render into the destination Image
Impact: High · Rendering correctness
Operations performed through:
Graphics g = image.getGraphics();
g.drawImage(...);now correctly modify the destination Image pixel buffer.
Previously, image-to-image drawing on the native graphics path could be directed to the global rendering canvas instead of the destination image. As a result, the operation could appear to have no effect, particularly after the image texture was recreated.
The new path:
- recognizes when the graphics destination is an
Image; - writes directly into the destination image pixels;
- supports alpha composition;
- respects source frames for multi-frame images;
- handles source and destination scaling;
- marks the affected image region as dirty.
This restores the expected semantics of using an Image as an off-screen drawing surface.
Affected platforms: Android and iOS
Issue: #393 — Graphics drawImage not working
Related: 92f0174
Image mutations now invalidate existing textures
Impact: High · Rendering correctness
Direct image pixel operations now mark the Image as changed.
This applies to operations including:
applyColor;applyColor2;changeColors;setTransparentColor.
Previously, the CPU-side pixel data could be modified while an already-created GPU texture remained considered valid, causing subsequent rendering to reuse stale contents.
7.2.2 explicitly marks these images as changed so their texture is rebuilt before the next draw.
Related: 92f0174
Changes for SDK Users
Graphics and Images
Image.getGraphics().drawImage() restored
Impact: High · Bug fix
Drawing an image into another image through its Graphics object works again on Android and iOS.
This is especially relevant for applications that construct images dynamically, compose multiple image layers, generate cached UI assets, or use Image instances as intermediate rendering surfaces.
No application code change is required.
Issue: #393
Version Information
Settings.version deprecated
Impact: Medium · API / Migration
The legacy integer:
Settings.versionis now deprecated.
Applications should use:
Settings.versionStrinstead.
versionStr is documented as the canonical TotalCross version value and follows the MAJOR.MINOR.PATCH SemVer format.
For 7.2.2:
Settings.versionStr = "7.2.2";The old numeric field remains available for compatibility, so this is not an immediate breaking change.
Related: 29ef810
Settings.buildNumber deprecated
Impact: Medium · API / Migration
Settings.buildNumber is also deprecated and documented as no longer being maintained as the SDK version identifier.
Applications that use it to determine the installed TotalCross version should migrate to Settings.versionStr.
This does not affect application build numbers obtained through Settings.appBuildNumber().
Related: 29ef810
SDK Distribution
Standalone SDK package now includes its runtime dependencies
Impact: High · Distribution fix
The standalone SDK package generated for 7.2.1 could be missing JAR dependencies expected under:
dist/libs
7.2.2 corrects the package generation so runtime dependencies are copied into the final SDK distribution.
The packaging process also explicitly verifies that required dependencies such as:
appdirs-1.2.0.jar
are present before allowing the package to be produced.
The Windows runtime dependency introduced in 7.2.1, vcruntime140.dll, continues to be included as part of the SDK runtime dependencies.
Issue: #395 — Fix release package and process
Related: b364193
Relevant Bug Fixes
Graphics.drawImage() into an Image had no persistent effect
Impact: High
When the destination Graphics belonged to an Image, native drawing could use the global canvas instead of modifying that image's pixel storage.
This meant code using Image.getGraphics() to compose images could fail on Android and iOS.
7.2.2 introduces a dedicated image-surface path that modifies the destination pixel buffer directly and marks the destination as dirty.
Image textures could remain stale after pixel mutations
Impact: High
Several native image-manipulation operations changed the backing pixels without marking the image texture as outdated.
The image could therefore continue to display old GPU contents even though its pixel buffer had already changed.
Image mutation operations now set the image's changed state so the texture is recreated before reuse.
Related: 92f0174
7.2.1 SDK ZIP could omit dist/libs
Impact: High · Distribution
The release packaging process could produce a 7.2.1 standalone SDK without dependencies required by the SDK launcher and deployment tooling.
7.2.2 changes package construction to preserve the generated dist/libs contents and fails packaging if expected runtime dependencies are missing.
S3 release package accessibility
Impact: Medium · Distribution
The 7.2.1 release process also exposed a publication issue where the SDK ZIP uploaded to S3 was not publicly accessible as expected.
The release workflow now treats public availability as part of release validation.
The final implementation relies on the S3 bucket policy for public access rather than requiring PutObjectAcl, and verifies the published URL after upload.
Issue: #395
Related: f5d62d9 · 153fd11
Internal Project Changes
Release packages are now tested as actual SDK distributions
User impact: Indirect · Release reliability
The CI pipeline now validates the packaged ZIP itself, rather than assuming that successful compilation means the final distribution is usable.
The test:
- downloads and extracts the generated TotalCross SDK ZIP;
- configures
TOTALCROSS3_HOMEagainst that extracted distribution; - compiles a minimal TotalCross application using the packaged SDK JAR;
- invokes
tc.Deployusing only the packaged SDK and itsdist/libs; - verifies the expected deployment artifacts.
The packaged SDK is exercised on:
- Windows;
- macOS;
- Linux.
The deployment validation checks output generation for multiple targets, including:
- Win32;
- Android;
- iOS;
- Linux;
- Linux ARM.
This protects specifically against packaging regressions where the repository build succeeds but the released SDK cannot actually perform a deployment.
Related: 12ca4a · dd6b060 · 358987b · 1d8112e
Published release artifacts are now verified
User impact: Indirect · Release reliability
The release workflow now verifies public access to the artifacts it publishes.
After publication, CI performs HTTP checks against:
- the packaged SDK ZIP on S3;
- the Maven POM;
- the SDK JAR;
- the sources JAR;
- the Javadoc JAR.
A release therefore fails instead of silently completing when artifacts were uploaded but are not accessible to users.
Related: f5d62d9
Release version handling centralized
A new release-version helper centralizes SemVer updates across:
Settings.java;TotalCrossSDK/build.gradle;TotalCrossVM/CMakeLists.txt.
The tooling validates the current release tag and integrates changelog generation into the same workflow, reducing the risk of inconsistent version numbers across SDK and native components.
Related: 4d42ef5
Changelog generation filters internal agent documentation
Commits containing repository guidance for development agents are now excluded from generated public release notes.
This keeps internal development-process documentation from appearing as user-facing product changes.
Related: 9fdd2be
Copyright header validation and tooling
Repository CI gained automated copyright and SPDX-header validation for changed source files.
Additional tooling can apply or repair headers on staged files while preserving partially staged modifications, and validation now checks expected copyright owners and year ranges.
These changes affect contributor workflow only and have no SDK or runtime impact.
Related: da0f082 · ba4f47e · 6642aec
Dependency Version Audit
7.2.2 introduces no upstream dependency-version upgrades compared with 7.2.1.
Native dependencies
| Dependency | 7.2.1 | 7.2.2 | Change |
|---|---|---|---|
| SQLite | 3.32.3 | 3.32.3 | None |
| mbedTLS | 3.5.2 | 3.5.2 | None |
| zlib | 1.3.1 | 1.3.1 | None |
| zlib-ng | 2.1.6 | 2.1.6 | None |
| libpng | 1.6.48 | 1.6.48 | None |
| libjpeg | 10 | 10 | None |
| libjpeg-turbo | 3.1.4.1 | 3.1.4.1 | None |
| Skia | 158dc9d7 |
158dc9d7 |
None |
| Visual C++ Runtime | 14 | 14 | None |
The depot manifest itself did not change between the 7.2.1 and 7.2.2 releases.
The important dependency-related change in 7.2.2 is therefore distribution correctness, not a dependency upgrade: the SDK ZIP now reliably contains the runtime files that the existing dependency set requires.
Java dependencies
No Java dependency version was changed as part of the 7.2.2 release.
The Gradle change affecting dependencies modifies which runtime configuration is copied into dist/libs, correcting package contents rather than upgrading libraries.
R&D and Experimental Work
No significant R&D or experimental runtime work was introduced in 7.2.2.
This release is intentionally focused on correctness, SDK distribution reliability, and release-process hardening.