Skip to content

Release v7.2.2

Latest

Choose a tag to compare

@github-actions github-actions released this 01 Jul 21:56
· 568 commits to master since this release

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:

  1. Applications using Image.getGraphics() should upgrade to 7.2.2.
    Drawing another image into an Image through its Graphics object could fail on Android and iOS. This is corrected in 7.2.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 from dist/libs.

  3. Use Settings.versionStr for TotalCross version checks.
    Settings.version and Settings.buildNumber are now deprecated. Settings.versionStr is the canonical SemVer-formatted SDK version.

  4. 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.version should migrate to Settings.versionStr;
  • code using Settings.buildNumber to identify the SDK version should migrate to Settings.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.version

is now deprecated.

Applications should use:

Settings.versionStr

instead.

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.

Issue: #393
Related: 92f0174


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.

Issue: #395
Related: b364193


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:

  1. downloads and extracts the generated TotalCross SDK ZIP;
  2. configures TOTALCROSS3_HOME against that extracted distribution;
  3. compiles a minimal TotalCross application using the packaged SDK JAR;
  4. invokes tc.Deploy using only the packaged SDK and its dist/libs;
  5. 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.


Release 7.2.2