1. 30 Jan, 2026 2 commits
  2. 29 Jan, 2026 1 commit
  3. 28 Jan, 2026 2 commits
    • ApoloApps's avatar
      Part 2 Extension functions non-allocate intermediate objects (#1140) · 3af0752f
      ApoloApps authored
      This is part 2 of [this
      pr](https://github.com/JetBrains/skiko/pull/1137)
      
      **What has changed?**
      1. Added more extension functions that prevent intermediate object
      allocations from a lot of the Skiko api surface
      2. Migrated EnumClass.values() to entries in a lot of classes (maybe
      some have been missed)
      
      **Next**
      Try (important keyword here :), cause if not wrong there are Skia and
      Compose diffs on how they're treated) doing less copies of Matrix
      
      ## Release Notes
      Added API that can accept primitive values instead of `Rect`, `RRect`, `Offset` to avoid additional object allocation
      3af0752f
    • Ivan Matkov's avatar
      Publish Docker Containers used on CI to GHCR (#1152) · 548fed39
      Ivan Matkov authored
      Fixes [SKIKO-1081](https://youtrack.jetbrains.com/issue/SKIKO-1081) Make
      docker images for building skiko publicly available
      
      The Skiko project previously used a private Docker registry
      (`registry.jetbrains.team/p/ui/skiko-docker`) for build containers,
      which required secrets for authentication. This prevented CI
      verification from fork PRs even after manual approval.
      
      The change migrates to GitHub Container Registry (GHCR), making
      containers publicly accessible and enabling CI to run on fork PRs.
      
      Containers built:
      https://github.com/orgs/JetBrains/packages?repo_name=skiko
      
      Triggers:
      - Push to master: Automatically builds and publishes all Docker images
      - Pull requests: Builds images in dry-run mode (no publishing) for
      verification
      - Manual workflow dispatch: Option to publish or just build
      - File changes: Triggers on changes to `skiko/docker/**` or the workflow
      itself
      548fed39
  4. 27 Jan, 2026 1 commit
  5. 19 Jan, 2026 1 commit
  6. 16 Jan, 2026 1 commit
  7. 08 Jan, 2026 1 commit
  8. 07 Jan, 2026 3 commits
  9. 05 Jan, 2026 1 commit
  10. 10 Dec, 2025 2 commits
  11. 01 Dec, 2025 1 commit
  12. 28 Nov, 2025 1 commit
  13. 27 Nov, 2025 1 commit
  14. 26 Nov, 2025 1 commit
  15. 24 Nov, 2025 3 commits
  16. 21 Nov, 2025 3 commits
    • Ivan Matkov's avatar
      Update GCC version to 10 (#1132) · c2cc37a0
      Ivan Matkov authored
      In 0.9.36, there was a missing symbol that caused
      ```
      libskiko-linux-x64.so: undefined symbol: _ZNSt19_Sp_make_shared_tag5_S_eqERKSt9type_info
      ```
      
      It's because the build attempts to statically link the C++ standard
      library, but:
      - Skia's object files reference newer libstdc++ symbols
      - GCC 7.3's `libstdc++` doesn't contain these symbols
      - The static linking fails to resolve these symbols
      
      GCC was downgraded from 9 to 7 in #1130 during the switch to AL2 to
      provide better GLIBC compatibility.
      Since AL2
      [provides](https://docs.aws.amazon.com/linux/al2/ug/c-cplusplus.html)
      only GCC 7.3 by default and GCC 10, installing GCC 9 is problematic
      there, so it's bumped to 10
      
      However, GCC 10 introduces outline atomics as default for new ARM chips,
      the build might fail due to missing symbols like
      ```
      org_jetbrains_skia_FontMgrWithFallback__1nDefaultWithFallbackFontProvider: error: undefined reference to '__aarch64_ldadd4_relax'
      org_jetbrains_skia_FontMgrWithFallback__1nDefaultWithFallbackFontProvider: error: undefined reference to '__aarch64_ldadd4_acq_rel'
      ```
      so, to keep things compatible with the previous GCC version,
      `-mno-outline-atomics` option was added to disable this new behavior.
      c2cc37a0
    • Ivan Matkov's avatar
      Fix glibc compatibility (#1130) · 49fea5b9
      Ivan Matkov authored
      [SKIKO-1066](https://youtrack.jetbrains.com/issue/SKIKO-1066) Support
      glibc 2.27
      [CMP-9307](https://youtrack.jetbrains.com/issue/CMP-9307) Support glibc
      2.27
      
      - Added `linux-compat` docker image based on #1123. It works on both x64
      and arm64 architectures
      - `multistrap` tool was replaced by installing required packages inside
      `linux-compat` and `linux-amd64` docker images
      - `linux-arm64` uses GCC instead of clang (aligning between
      distributions)
      - GitHub checks now use precompiled docker images to reuse the same
      environment
      - `ci.yml` and `web.yml` were combined into `tests.yml`
      - `publishToMavenLocal` checks are moved to `publish-dry-run.yml`
      - Add building an Android sample as part of CI checks
      
      ---------
      Co-authored-by: 's avatarVladislav.Ertel <vladislav.ertel@jetbrains.com>
      49fea5b9
    • Sebastian Sellmair's avatar
      Lock .skiko directory using lockfile when unpacking the native binary (#1128) · fbb08087
      Sebastian Sellmair authored
      In the compose hot reload project, we have seen races from multiple
      tests trying to unpack skiko into the .skiko directory. Currently, the
      library loading is only synchronized within the project. This MR also
      adds a .lock file, which has to be locked when modifying the dataDir.
      
      Note: This MR also changed the Library.load method from always entering
      a monitor, to resolving an atomic reference, best case.
      
      ## Release Notes
      ### Fixes - Desktop
      - Fixed a race condition that occurred when multiple processes attempted
      to unpack Skiko binary files at startup
      fbb08087
  17. 20 Nov, 2025 1 commit
  18. 12 Nov, 2025 5 commits
    • Igor Demin's avatar
      Revert "Fix signKotlinMultiplatformPublication on CI" (#1126) · e4cf12a1
      Igor Demin authored
      Reverts JetBrains/skiko#1125
      
      Fails on CI
      e4cf12a1
    • Igor Demin's avatar
      Fix signKotlinMultiplatformPublication on CI (#1125) · 8d247093
      Igor Demin authored
      Regression after https://github.com/JetBrains/skiko/pull/1119 was added
      on CI
      
      ```
      org.gradle.internal.execution.WorkValidationException: A problem was found with the configuration of task ':signKotlinMultiplatformPublication' (type 'Sign').
        - Gradle detected a problem with the following location: '/mnt/agent/work/381d14fe560aa354/skiko/build/libs/skiko-0.9.33-javadoc.jar.asc'.
      
          Reason: Task ':publishAwtRuntimeElementsPublicationToComposeRepoRepository' uses this output of task ':signKotlinMultiplatformPublication' without declaring an explicit or implicit dependency. This can lead to incorrect results being produced, depending on what order the tasks are executed.
      
          Possible solutions:
            1. Declare task ':signKotlinMultiplatformPublication' as an input of ':publishAwtRuntimeElementsPublicationToComposeRepoRepository'.
            2. Declare an explicit dependency on ':signKotlinMultiplatformPublication' from ':publishAwtRuntimeElementsPublicationToComposeRepoRepository' using Task#dependsOn.
            3. Declare an explicit dependency on ':signKotlinMultiplatformPublication' from ':publishAwtRuntimeElementsPublicationToComposeRepoRepository' using Task#mustRunAfter.
      ```
      
      The fix is blind as we can only test it in master
      8d247093
    • Sebastian Sellmair's avatar
      Publish 'skiko-awt-runtime' (#1119) · f0d0baa1
      Sebastian Sellmair authored
      This publication creates one variant for each native platform. 
      It allows depending (and exposing) a single dependency, which can later
      be resolved to platform-specific artifacts.
      
      <details>
      <summary>skiko-awt-runtime.module</summary>
      
      ```json
      {
        "formatVersion": "1.1",
        "component": {
          "group": "org.jetbrains.skiko",
          "module": "skiko-awt-runtime",
          "version": "1.0-SNAPSHOT",
          "attributes": {
            "org.gradle.status": "integration"
          }
        },
        "createdBy": {
          "gradle": {
            "version": "8.13"
          }
        },
        "variants": [
          {
            "name": "jvmRuntimeElements-macos-x64",
            "attributes": {
              "org.gradle.category": "library",
              "org.gradle.dependency.bundling": "external",
              "org.gradle.jvm.environment": "standard-jvm",
              "org.gradle.libraryelements": "jar",
              "org.gradle.native.architecture": "x86-64",
              "org.gradle.native.operatingSystem": "macos",
              "org.gradle.usage": "java-runtime",
              "org.jetbrains.kotlin.platform.type": "jvm"
            },
            "dependencies": [
              {
                "group": "org.jetbrains.skiko",
                "module": "skiko-awt-runtime-macos-x64",
                "version": {
                  "requires": "1.0-SNAPSHOT"
                }
              }
            ]
          },
          {
            "name": "jvmRuntimeElements-macos-arm64",
            "attributes": {
              "org.gradle.category": "library",
              "org.gradle.dependency.bundling": "external",
              "org.gradle.jvm.environment": "standard-jvm",
              "org.gradle.libraryelements": "jar",
              "org.gradle.native.architecture": "aarch64",
              "org.gradle.native.operatingSystem": "macos",
              "org.gradle.usage": "java-runtime",
              "org.jetbrains.kotlin.platform.type": "jvm"
            },
            "dependencies": [
              {
                "group": "org.jetbrains.skiko",
                "module": "skiko-awt-runtime-macos-arm64",
                "version": {
                  "requires": "1.0-SNAPSHOT"
                }
              }
            ]
          }
        ]
      }
      ```
      
      </details>
      
      
      <details>
      <summary>skiko-awt-runtime.pom</summary>
      
      ```xml
      <?xml version="1.0" encoding="UTF-8"?>
      <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
        <!-- This module was also published with a richer model, Gradle metadata,  -->
        <!-- which should be used instead. Do not delete the following line which  -->
        <!-- is to indicate to Gradle or any Gradle module metadata file consumer  -->
        <!-- that they should prefer consuming it instead. -->
        <!-- do_not_remove: published-with-gradle-metadata -->
        <modelVersion>4.0.0</modelVersion>
        <groupId>org.jetbrains.skiko</groupId>
        <artifactId>skiko-awt-runtime</artifactId>
        <version>1.0-SNAPSHOT</version>
        <packaging>pom</packaging>
        <name>Skiko JVM Runtime</name>
        <description>Kotlin Skia bindings</description>
        <url>https://www.github.com/JetBrains/skiko</url>
        <licenses>
          <license>
            <name>The Apache License, Version 2.0</name>
            <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
          </license>
        </licenses>
        <developers>
          <developer>
            <name>Compose Multiplatform Team</name>
            <organization>JetBrains</organization>
            <organizationUrl>https://www.jetbrains.com</organizationUrl>
          </developer>
        </developers>
        <scm>
          <connection>scm:git:https://www.github.com/JetBrains/skiko.git</connection>
          <developerConnection>scm:git:https://www.github.com/JetBrains/skiko.git</developerConnection>
          <url>https://www.github.com/JetBrains/skiko</url>
        </scm>
      </project>
      ```
      
      </details>
      
      
      
      Simple example usage:
      ```kotlin
      kotlin {
          target.attributes {
              attribute(ARCHITECTURE_ATTRIBUTE, objects.named(DefaultNativePlatform.getCurrentArchitecture().name))
              attribute(OPERATING_SYSTEM_ATTRIBUTE, objects.named(DefaultNativePlatform.getCurrentOperatingSystem().toFamilyName()))
          }
      }
      
      dependencies {
          implementation("org.jetbrains.skiko:skiko-awt:1.0-SNAPSHOT")
          implementation("org.jetbrains.skiko:skiko-awt-runtime:1.0-SNAPSHOT")
      }
      ```
      
      ## Motivation
      This allows 'intermediate' libraries to express that this dependency
      exists (in a single publication) and push down the artifact selection to
      consumers. This is an advanced feature and can be leveraged by more
      complex builds.
      
      ---------
      Co-authored-by: 's avatarIgor Demin <igor.demin@jetbrains.com>
      f0d0baa1
    • Ivan Matkov's avatar
      Use `macos-15` for CI checks (#1122) · 40c0ffb0
      Ivan Matkov authored
      It's due to
      > The macOS-13 based runner images are being deprecated, consider
      switching to macOS-15 (macos-15-intel) or macOS 15 arm64 (macos-latest)
      instead.
      40c0ffb0
    • Sebastian Sellmair's avatar
      [build] Properly mark jvm/awt source sets as optional, respecting the… (#1124) · 0d4b50d0
      Sebastian Sellmair authored
      … 'skiko.awt.enabled' feature flag
      0d4b50d0
  19. 05 Nov, 2025 2 commits
  20. 04 Nov, 2025 2 commits
  21. 17 Oct, 2025 1 commit
  22. 13 Oct, 2025 1 commit
  23. 12 Oct, 2025 1 commit
  24. 09 Oct, 2025 2 commits
    • Igor Demin's avatar
      Revert "Pack ANGLE into a separate jar" (#1114) · 2044a13b
      Igor Demin authored
      Reverts JetBrains/skiko#1082
      
      Sign task failed on CI
      (`publishSkikoJvmRuntimeWindowsX64PublicationToComposeRepoRepository`):
      ```
      
        Some problems were found with the configuration of task ':signSkikoJvmRuntimeWindowsX64Publication' (type 'Sign').
      16:29:09     - Gradle detected a problem with the following location: 'C:\buildagent\work\381d14fe560aa354\skiko\build\libs\skiko-0.9.28+debug-javadoc.jar.asc'.
      
        org.gradle.internal.execution.WorkValidationException: Some problems were found with the configuration of task ':signSkikoJvmRuntimeWindowsX64Publication' (type 'Sign').
          - Gradle detected a problem with the following location: 'C:\buildagent\work\381d14fe560aa354\skiko\build\libs\skiko-0.9.28+debug-javadoc.jar.asc'.
            
            Reason: Task ':publishSkikoJvmRuntimeAngleWindowsX64PublicationToComposeRepoRepository' uses this output of task ':signSkikoJvmRuntimeWindowsX64Publication' without declaring an explicit or implicit dependency. This can lead to incorrect results being produced, depending on what order the tasks are executed.
            
            Possible solutions:
              1. Declare task ':signSkikoJvmRuntimeWindowsX64Publication' as an input of ':publishSkikoJvmRuntimeAngleWindowsX64PublicationToComposeRepoRepository'.
              2. Declare an explicit dependency on ':signSkikoJvmRuntimeWindowsX64Publication' from ':publishSkikoJvmRuntimeAngleWindowsX64PublicationToComposeRepoRepository' using Task#dependsOn.
              3. Declare an explicit dependency on ':signSkikoJvmRuntimeWindowsX64Publication' from ':publishSkikoJvmRuntimeAngleWindowsX64PublicationToComposeRepoRepository' using Task#mustRunAfter.
            
            For more information, please refer to https://docs.gradle.org/8.14.3/userguide/validation_problems.html#implicit_dependency in the Gradle documentation.
          - Gradle detected a problem with the following location: 'C:\buildagent\work\381d14fe560aa354\skiko\build\libs\skiko-0.9.28+debug-sources.jar.asc'.
            
            Reason: Task ':publishSkikoJvmRuntimeAngleWindowsX64PublicationToComposeRepoRepository' uses this output of task ':signSkikoJvmRuntimeWindowsX64Publication' without declaring an explicit or implicit dependency. This can lead to incorrect results being produced, depending on what order the tasks are executed.
            
            Possible solutions:
              1. Declare task ':signSkikoJvmRuntimeWindowsX64Publication' as an input of ':publishSkikoJvmRuntimeAngleWindowsX64PublicationToComposeRepoRepository'.
              2. Declare an explicit dependency on ':signSkikoJvmRuntimeWindowsX64Publication' from ':publishSkikoJvmRuntimeAngleWindowsX64PublicationToComposeRepoRepository' using Task#dependsOn.
              3. Declare an explicit dependency on ':signSkikoJvmRuntimeWindowsX64Publication' from ':publishSkikoJvmRuntimeAngleWindowsX64PublicationToComposeRepoRepository' using Task#mustRunAfter.
            
            For more information, please refer to https://docs.gradle.org/8.14.3/userguide/validation_problems.html#implicit_dependency in the Gradle documentation.
      ```
      2044a13b
    • Igor Demin's avatar
      Pack ANGLE into a separate jar (#1082) · 3e870638
      Igor Demin authored
      An addition to [the feature
      PR](https://github.com/JetBrains/skiko/pull/1017) that allows including
      ANGLE the same way as Skiko native libraries included:
      - unpack it from an additional jar
      `org.jetbrains.skiko:skiko-awt-runtime-angle-$target:$version`
      - find them in `skiko.library.path` directoty (a system property)
      - find them in `java.home`
      
      It reuses the same logic that is used to load `Skiko.dll`.
      
      Currently only Windows supported, the same way as in the original PR.
      
      No CI changes needed, as building of this jar is added as a dependency
      for
      `publishSkikoJvmRuntimeWindowsX64PublicationToComposeRepoRepository`/`publishSkikoJvmRuntimeWindowsArm64PublicationToComposeRepoRepository`
      
      ## Testing
      
      Manually with `skiko.rendering.angle.enabled` true/false on
      SkikoAwtSample.
      
      ## Release Notes (Skiko)
      ### Features - Desktop
      A new experimental renderer is introduced for Windows. It uses [the
      ANGLE library](https://github.com/google/angle) which has proven to be
      stable because it is used inside Chromium, compared to the `DIRECT3D`
      renderer that has issues on a few machines. Note that `ANGLE` still uses
      `DIRECT3D` API under the hood.
      
      1. Add this to the code to enable it:
      ```
      System.setProperty("skiko.rendering.angle.enabled", "true")
      ```
      
      2. Add the ANGLE library into the dependencies:
        - If you use Gradle:
        ```
        if (System.getProperty("os.name").startsWith("Win")) {
      
      implementation("org.jetbrains.skiko:skiko-awt-runtime-angle-$target:$version")
        }
        ```
      - If you set `skiko.library.path`. Extract `libEGL.dll`, `libGLESv2.dll`
      from https://github.com/JetBrains/angle-pack/releases into this
      directory.
      
      ## Release Notes (Compose)
      ### Features - Desktop
      N/A
      
      Until we specify how to match Skiko and Compose versions, or include it
      in Compose, it is a Skiko-only experimental feature. Some projects can
      include Skiko directly, it should work, but not supported as a Compose
      feature.
      3e870638