Skip to content

Commit 0e0b18b

Browse files
authored
Move publishing to org.korge and update Kotlin dependencies to 2.3.20 (#3)
- Toolchain was updated: Kotlin 2.3.20, AGP 8.13.1, Dokka 2.1.0, Gradle 8.14.4 - Custom Sonatype staging/release logic was replaced with com.vanniktech.maven.publish for signing + Central Portal publishing - Namespace on maven central was changed to org.korge and Maven Central badge in README.md was updated - GitHub Actions workflows were refreshed (Java 21, updated actions versions, new publish and dokka tasks, optional yarn lock upgrade) - API check was updated - Update korlibs dependencies: org.korge:korlibs-annotations:6.1.0 org.korge:korlibs-compression:6.1.0 org.korge:korlibs-wasm:6.1.0 org.jetbrains.kotlinx:atomicfu:0.32.1 org.jetbrains.kotlinx:kotlinx-browser-wasm-js:0.5.0 org.jetbrains.kotlinx:kotlinx-coroutines-core:1.10.2 org.jetbrains.kotlinx:kotlinx-coroutines-test:1.10.2 net.java.dev.jna:jna:5.18.1 net.java.dev.jna:jna-platform:5.18.1
1 parent 5891bdb commit 0e0b18b

9 files changed

Lines changed: 193 additions & 632 deletions

File tree

.github/workflows/DEPLOY.yml

Lines changed: 22 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -18,71 +18,36 @@ on:
1818
env:
1919
CI: true
2020
FORCED_VERSION: ${{ inputs.forced_version || github.ref }}
21-
ORG_GRADLE_PROJECT_signingKey: ${{ secrets.ORG_GRADLE_PROJECT_SIGNINGKEY }}
22-
ORG_GRADLE_PROJECT_signingPassword: ${{ secrets.ORG_GRADLE_PROJECT_SIGNINGPASSWORD }}
23-
SONATYPE_USERNAME: ${{ secrets.SONATYPEUSERNAME }}
24-
SONATYPE_PASSWORD: ${{ secrets.SONATYPEPASSWORD }}
25-
JAVA_VERSION: 17
21+
# Vanniktech maven-publish plugin reads these exact Gradle project property names for signing
22+
ORG_GRADLE_PROJECT_signingInMemoryKey: ${{ secrets.ORG_GRADLE_PROJECT_SIGNINGKEY }}
23+
ORG_GRADLE_PROJECT_signingInMemoryKeyPassword: ${{ secrets.ORG_GRADLE_PROJECT_SIGNINGPASSWORD }}
24+
# Vanniktech maven-publish plugin reads these for Central Portal auth
25+
ORG_GRADLE_PROJECT_mavenCentralUsername: ${{ secrets.ORG_KORGE_SONATYPE_USERNAME }}
26+
ORG_GRADLE_PROJECT_mavenCentralPassword: ${{ secrets.ORG_KORGE_SONATYPE_PASSWORD }}
27+
JAVA_VERSION: 21
2628
JAVA_DISTRIBUTION: zulu
2729

2830
jobs:
29-
##start:
30-
## runs-on: ubuntu-latest
31-
## outputs:
32-
## stagedRepositoryId: ${{ steps.releaseStep.outputs.stagedRepositoryId }}
33-
## steps:
34-
## - { name: Checkout, uses: actions/checkout@v3 }
35-
## - { name: Set up JDK, uses: actions/setup-java@v3, with: { distribution: "${{ env.JAVA_DISTRIBUTION }}", java-version: "${{ env.JAVA_VERSION }}" } }
36-
## - { name: Prepare Gradle, uses: gradle/actions/setup-gradle@d9c87d481d55275bb5441eef3fe0e46805f9ef70 } # https://github.com/gradle/actions/releases/tag/v3.5.0
37-
## - { id: releaseStep, name: Start Maven Central Staging Repository, run: ./gradlew --no-configuration-cache startReleasingMavenCentral }
38-
3931
publish:
4032
strategy:
4133
fail-fast: false
4234
matrix:
4335
include:
44-
- { os: ubuntu-latest, publishTask: "publishLinuxX64PublicationToMavenLocal publishLinuxArm64PublicationToMavenLocal" }
45-
- { os: ubuntu-latest, publishTask: "publishMingwX64PublicationToMavenLocal" }
46-
- { os: ubuntu-latest, publishTask: "publishAndroidDebugPublicationToMavenLocal publishAndroidReleasePublicationToMavenLocal" }
47-
- { os: ubuntu-latest, publishTask: "publishKotlinMultiplatformPublicationToMavenLocal publishJvmPublicationToMavenLocal" }
48-
- { os: ubuntu-latest, publishTask: "publishJsPublicationToMavenLocal publishWasmJsPublicationToMavenLocal" }
49-
- { os: macos-13, publishTask: "publishMacosX64PublicationToMavenLocal publishMacosArm64PublicationToMavenLocal" }
50-
- { os: macos-13, publishTask: "publishTvosArm64PublicationToMavenLocal publishTvosSimulatorArm64PublicationToMavenLocal publishTvosX64PublicationToMavenLocal" }
51-
- { os: macos-13, publishTask: "publishIosArm64PublicationToMavenLocal publishIosSimulatorArm64PublicationToMavenLocal publishIosX64PublicationToMavenLocal" }
52-
- { os: macos-13, publishTask: "publishWatchosArm64PublicationToMavenLocal publishWatchosArm32PublicationToMavenLocal publishWatchosDeviceArm64PublicationToMavenLocal publishWatchosSimulatorArm64PublicationToMavenLocal" }
36+
- { os: ubuntu-latest, publishTask: "publishLinuxX64PublicationToMavenCentral publishLinuxArm64PublicationToMavenCentral" }
37+
- { os: ubuntu-latest, publishTask: "publishMingwX64PublicationToMavenCentral" }
38+
- { os: ubuntu-latest, publishTask: "publishAndroidReleasePublicationToMavenCentral" }
39+
- { os: ubuntu-latest, publishTask: "publishKotlinMultiplatformPublicationToMavenCentral publishJvmPublicationToMavenCentral" }
40+
- { os: ubuntu-latest, publishTask: "publishJsPublicationToMavenCentral publishWasmJsPublicationToMavenCentral" }
41+
- { os: macos-latest, publishTask: "publishMacosX64PublicationToMavenCentral publishMacosArm64PublicationToMavenCentral" }
42+
- { os: macos-latest, publishTask: "publishTvosArm64PublicationToMavenCentral publishTvosSimulatorArm64PublicationToMavenCentral publishTvosX64PublicationToMavenCentral" }
43+
- { os: macos-latest, publishTask: "publishIosArm64PublicationToMavenCentral publishIosSimulatorArm64PublicationToMavenCentral publishIosX64PublicationToMavenCentral" }
44+
- { os: macos-latest, publishTask: "publishWatchosArm64PublicationToMavenCentral publishWatchosArm32PublicationToMavenCentral publishWatchosDeviceArm64PublicationToMavenCentral publishWatchosSimulatorArm64PublicationToMavenCentral" }
5345
timeout-minutes: 300
5446
runs-on: ${{ matrix.os }}
55-
##needs: [start]
56-
##env: { stagedRepositoryId: "${{ needs.start.outputs.stagedRepositoryId }}" }
5747
steps:
58-
##- { name: Print stagedRepositoryId=$stagedRepositoryId, run: "echo 'stagedRepositoryId: $stagedRepositoryId'" }
59-
- name: Replace MavenLocal with MavenLocal
60-
id: replace
61-
run: |
62-
publishTaskLocal=$(echo "${{ matrix.publishTask }}" | tr -d '\n')
63-
publishTaskRepository=$(echo "${{ matrix.publishTask }}" | sed 's/MavenLocal/MavenRepository/g' | tr -d '\n')
64-
echo "publishTaskLocal=${publishTaskLocal}" >> $GITHUB_ENV
65-
echo "publishTaskRepository=${publishTaskRepository}" >> $GITHUB_ENV
66-
- { name: Print publishTaskLocal, run: "echo 'publishTaskLocal: ${{ env.publishTaskLocal }}'" }
67-
- { name: Print publishTaskRepository, run: "echo 'publishTaskRepository: ${{ env.publishTaskRepository }}'" }
68-
- { name: Checkout, uses: actions/checkout@v3 }
69-
- { name: Use Node.js 20.x, uses: actions/setup-node@v3, with: { node-version: 20.x } }
70-
- { name: Set up JDK, uses: actions/setup-java@v3, with: { distribution: "${{ env.JAVA_DISTRIBUTION }}", java-version: "${{ env.JAVA_VERSION }}" } }
71-
- { name: Prepare Gradle, uses: gradle/actions/setup-gradle@d9c87d481d55275bb5441eef3fe0e46805f9ef70 } # https://github.com/gradle/actions/releases/tag/v3.5.0
72-
- { name: Initialize Gradle, run: ./gradlew --no-configuration-cache }
73-
- { name: Publish Publications To Maven Local, run: "./gradlew --no-configuration-cache --parallel ${{ env.publishTaskLocal }}" }
74-
- { name: Start Maven Central Staging Repository, run: ./gradlew --no-configuration-cache startReleasingMavenCentral }
75-
- { name: Publish Publications To Maven Repository, run: "./gradlew --no-configuration-cache --parallel --max-workers=8 ${{ env.publishTaskRepository }}" }
76-
- { name: Release to Maven Central, run: ./gradlew --no-configuration-cache releaseMavenCentral }
77-
78-
##finalize:
79-
## runs-on: ubuntu-latest
80-
## needs: [start, publish]
81-
## env: { stagedRepositoryId: "${{ needs.start.outputs.stagedRepositoryId }}" }
82-
## steps:
83-
## - { name: Checkout, uses: actions/checkout@v3 }
84-
## - { name: Use Node.js 20.x, uses: actions/setup-node@v3, with: { node-version: 20.x } }
85-
## - { name: Set up JDK, uses: actions/setup-java@v3, with: { distribution: "${{ env.JAVA_DISTRIBUTION }}", java-version: "${{ env.JAVA_VERSION }}" } }
86-
## - { name: Prepare Gradle, uses: gradle/actions/setup-gradle@d9c87d481d55275bb5441eef3fe0e46805f9ef70 } # https://github.com/gradle/actions/releases/tag/v3.5.0
87-
## - { name: Initialize Gradle, run: ./gradlew --no-configuration-cache }
88-
## - { name: Release to Maven Central, run: ./gradlew --no-configuration-cache releaseMavenCentral }
48+
- { name: "Checkout", uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd } # https://github.com/actions/checkout/releases/tag/v6.0.2
49+
- { name: "Use Node.js 24.x", uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f, with: { node-version: 24.x } } # https://github.com/actions/setup-node/releases/tag/v6.3.0
50+
- { name: "Set up JDK", uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654, with: { distribution: "${{ env.JAVA_DISTRIBUTION }}", java-version: "${{ env.JAVA_VERSION }}" } } # https://github.com/actions/setup-java/releases/tag/v5.2.0
51+
- { name: "Prepare Gradle", uses: gradle/actions/setup-gradle@39e147cb9de83bb9910b8ef8bd7fff0ee20fcd6f } # https://github.com/gradle/actions/releases/tag/v6.0.1
52+
- { name: "Initialize Gradle", run: "./gradlew --no-configuration-cache" }
53+
- { name: "Publish to Maven Central", run: "./gradlew --no-configuration-cache --parallel --max-workers=8 ${{ matrix.publishTask }}" }

.github/workflows/DOCS.yml

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -24,19 +24,19 @@ concurrency:
2424
env:
2525
CI: true
2626
FORCED_VERSION: ${{ inputs.forced_version || github.ref }}
27-
JAVA_VERSION: 17
27+
JAVA_VERSION: 21
2828
JAVA_DISTRIBUTION: zulu
2929

3030
jobs:
3131
publish:
3232
timeout-minutes: 300
3333
runs-on: ubuntu-latest
3434
steps:
35-
- { name: Checkout, uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 } # https://github.com/actions/checkout/releases/tag/v4.1.7
36-
- { name: Set up JDK, uses: actions/setup-java@99b8673ff64fbf99d8d325f52d9a5bdedb8483e9, with: { distribution: "${{ env.JAVA_DISTRIBUTION }}", java-version: "${{ env.JAVA_VERSION }}" } } # https://github.com/actions/setup-java/releases/tag/v4.2.1
37-
- { name: Use Node.js 20.x, uses: actions/setup-node@1e60f620b9541d16bece96c5465dc8ee9832be0b, with: { node-version: 20.x } } # https://github.com/actions/setup-node/releases/tag/v4.0.3
38-
- { name: Prepare Gradle, uses: gradle/actions/setup-gradle@d9c87d481d55275bb5441eef3fe0e46805f9ef70 } # https://github.com/gradle/actions/releases/tag/v3.5.0
39-
- { name: Initialize Gradle, run: ./gradlew --no-configuration-cache }
40-
- { name: Build Documentation, run: ./gradlew --no-configuration-cache dokkaHtmlMultiModule }
41-
- { name: Upload artifact, uses: actions/upload-pages-artifact@56afc609e74202658d3ffba0e8f6dda462b719fa, with: { path: 'build/dokka/htmlMultiModule' } } # https://github.com/actions/upload-pages-artifact/releases/tag/v3.0.1
42-
- { name: Deploy 🚀 to GitHub Pages, id: deployment, uses: actions/deploy-pages@d6db90164ac5ed86f2b6aed7e0febac5b3c0c03e} # https://github.com/actions/deploy-pages/releases/tag/v4.0.5
35+
- { name: "Checkout", uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd } # https://github.com/actions/checkout/releases/tag/v6.0.2
36+
- { name: "Use Node.js 24.x", uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f, with: { node-version: 24.x } } # https://github.com/actions/setup-node/releases/tag/v6.3.0
37+
- { name: "Set up JDK", uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654, with: { distribution: "${{ env.JAVA_DISTRIBUTION }}", java-version: "${{ env.JAVA_VERSION }}" } } # https://github.com/actions/setup-java/releases/tag/v5.2.0
38+
- { name: "Prepare Gradle", uses: gradle/actions/setup-gradle@39e147cb9de83bb9910b8ef8bd7fff0ee20fcd6f } # https://github.com/gradle/actions/releases/tag/v6.0.1
39+
- { name: "Initialize Gradle", run: "./gradlew --no-configuration-cache" }
40+
- { name: "Build Documentation", run: "./gradlew --no-configuration-cache dokkaGenerateHtml" }
41+
- { name: "Upload artifact", uses: actions/upload-pages-artifact@7b1f4a764d45c48632c6b24a0339c27f5614fb0b, with: { path: 'korlibs-image-core/build/dokka/html' } } # https://github.com/actions/upload-pages-artifact/releases/tag/v4.0.0
42+
- { name: "Deploy 🚀 to GitHub Pages", id: deployment, uses: actions/deploy-pages@cd2ce8fcbc39b97be8ca5fce6e763baed58fa128 } # https://github.com/actions/deploy-pages/releases/tag/v5.0.0

.github/workflows/TEST.yml

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -26,42 +26,42 @@ concurrency:
2626
env:
2727
CI: true
2828

29-
JAVA_VERSION: 17
30-
JAVA_DISTRIBUTION: temurin
29+
JAVA_VERSION: 21
30+
JAVA_DISTRIBUTION: zulu
3131

3232
jobs:
3333
test:
3434
strategy:
35-
#fail-fast: true # Once working, comment this
35+
fail-fast: true
3636
matrix:
3737
include:
3838
- { outputKey: testMacosIos, os: macos-latest, testTask: jvmTest macosArm64Test iosSimulatorArm64Test, buildTasks: publishMacosX64PublicationToMavenLocal }
39-
- { outputKey: testJsAndroid, os: ubuntu-latest, testTask: "wasmBrowserTest", buildTasks: "jsBrowserTest jsDenoTest", enableAndroid: true }
39+
- { outputKey: testJsAndroid, os: ubuntu-latest, testTask: "wasmBrowserTest", buildTasks: "jsBrowserTest jsDenoTest", upgradeYarnLock: true, enableAndroid: true }
4040
- { outputKey: testLinux, os: ubuntu-latest, testTask: apiCheck jvmTest linuxX64Test, precompileTask: compileTestKotlinJvm, enableCodecov: true, e2e: true }
41-
- { outputKey: testWindows, os: windows-latest, testTask: jvmTest mingwX64Test jsDenoTest, precompileTask: compileTestKotlinJvm }
42-
#if: ${{ needs.changes.outputs[matrix.outputKey] == 'true' }}
41+
- { outputKey: testWindows, os: windows-latest, testTask: jvmTest mingwX64Test jsDenoTest, precompileTask: compileTestKotlinJvm, upgradeYarnLock: true }
4342
timeout-minutes: 60
4443
runs-on: ${{ matrix.os }}
4544
steps:
46-
- { uses: actions/checkout@v4 }
47-
- { name: Use Node.js 20.x, uses: actions/setup-node@v4, with: { node-version: 20.x } }
48-
- { name: Setup Deno, uses: denoland/setup-deno@v1, with: { deno-version: "1.44.4" } }
49-
- { name: Set up JDK, uses: actions/setup-java@v4, with: { distribution: "${{ env.JAVA_DISTRIBUTION }}", java-version: "${{ env.JAVA_VERSION }}", cache: 'gradle' } }
50-
#- { name: Prepare Gradle, uses: gradle/actions/setup-gradle@af1da67850ed9a4cedd57bfd976089dd991e2582 } # https://github.com/gradle/actions/releases/tag/v4.0.0
51-
- { name: "Cache Kotlin/Native .konan folder", uses: actions/cache@v4, with: { path: "~/.konan", key: "${{ runner.os }}-konan", restore-keys: "${{ runner.os }}-konan" } }
45+
- { name: "Checkout", uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd } # https://github.com/actions/checkout/releases/tag/v6.0.2
46+
- { name: "Use Node.js 24.x", uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f, with: { node-version: 24.x } } # https://github.com/actions/setup-node/releases/tag/v6.3.0
47+
- { name: "Setup Deno", uses: denoland/setup-deno@e95548e56dfa95d4e1a28d6f422fafe75c4c26fb, with: { deno-version: "2.7.11" } } # https://github.com/denoland/setup-deno/releases/tag/v2.0.3
48+
- { name: "Set up JDK", uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654, with: { distribution: "${{ env.JAVA_DISTRIBUTION }}", java-version: "${{ env.JAVA_VERSION }}" } } # https://github.com/actions/setup-java/releases/tag/v5.2.0
49+
- { name: "Prepare Gradle", uses: gradle/actions/setup-gradle@39e147cb9de83bb9910b8ef8bd7fff0ee20fcd6f } # https://github.com/gradle/actions/releases/tag/v6.0.1
50+
- { name: "Cache Kotlin/Native .konan folder", uses: actions/cache@668228422ae6a00e4ad889ee87cd7109ec5666a7, with: { path: "~/.konan", key: "${{ runner.os }}-konan", restore-keys: "${{ runner.os }}-konan" } } # https://github.com/actions/cache/releases/tag/v5.0.4
5251
- { name: Start gradle, run: ./gradlew }
52+
- { if: "${{ matrix.upgradeYarnLock }}", name: "Upgrade yarn lock", run: "./gradlew kotlinUpgradeYarnLock" }
5353
- { if: "${{ matrix.precompileTask }}", name: "Building ${{ matrix.precompileTask }} classes", run: "./gradlew --stacktrace ${{ matrix.precompileTask }}" }
5454
- { if: "${{ matrix.testTask }}", name: "Run ${{ matrix.testTask }} tests", run: "./gradlew ${{ matrix.testTask }}" }
5555
- { if: "${{ matrix.buildTasks }}", name: "Run ${{ matrix.buildTasks }}", run: "./gradlew ${{ matrix.buildTasks }}" }
56-
- name: Enable KVM
56+
- name: "Enable KVM"
5757
if: "${{ matrix.enableAndroid }}"
5858
run: |
5959
echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules
6060
sudo udevadm control --reload-rules
6161
sudo udevadm trigger --name-match=kvm
62-
- { name: "Run Android Tests", if: "${{ matrix.enableAndroid }}", uses: reactivecircus/android-emulator-runner@v2, with: { "api-level": 21, "script": "./gradlew connectedCheck lintDebug" } }
63-
- { name: Archive Test Results, if: failure(), uses: actions/upload-artifact@v4, with: { name: "test-results-${{ matrix.outputKey }}", retention-days: 21, path: "**/build/reports", if-no-files-found: ignore } }
64-
- { if: "${{ matrix.e2e }}", name: Publish to maven local, run: ./gradlew publishJvmLocal publishKotlinMultiplatformPublicationToMavenLocal }
65-
- { if: "${{ matrix.enableCodecov }}", name: Code coverage, run: ./gradlew koverXmlReport }
66-
- { if: "${{ matrix.enableCodecov }}", name: "Upload coverage reports to Codecov", uses: "codecov/codecov-action@e28ff129e5465c2c0dcc6f003fc735cb6ae0c673", with: { token: "${{ secrets.CODECOV_TOKEN }}" } } # https://github.com/codecov/codecov-action/releases/tag/v4.5.0
67-
- { name: Stop daemon, run: ./gradlew --stop }
62+
- { name: "Run Android Tests", if: "${{ matrix.enableAndroid }}", uses: reactivecircus/android-emulator-runner@e89f39f1abbbd05b1113a29cf4db69e7540cae5a, with: { "api-level": 21, "script": "./gradlew connectedCheck lintDebug" } } # https://github.com/ReactiveCircus/android-emulator-runner/releases/tag/v2.37.0
63+
- { name: "Archive Test Results", if: failure(), uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f, with: { name: "test-results-${{ matrix.outputKey }}", retention-days: 21, path: "**/build/reports", if-no-files-found: ignore } } # https://github.com/actions/upload-artifact/releases/tag/v7.0.0
64+
- { name: "Publish to maven local", if: "${{ matrix.e2e }}", run: "./gradlew publishJvmLocal publishKotlinMultiplatformPublicationToMavenLocal" }
65+
- { name: "Code coverage", if: "${{ matrix.enableCodecov }}", run: "./gradlew koverXmlReport" }
66+
- { name: "Upload coverage reports to Codecov", if: "${{ matrix.enableCodecov }}", uses: codecov/codecov-action@57e3a136b779b570ffcdbf80b3bdc90e7fab3de2, with: { token: "${{ secrets.CODECOV_TOKEN }}" } } # https://github.com/codecov/codecov-action/releases/tag/v6.0.0
67+
- { name: "Stop daemon", run: "./gradlew --stop" }

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
<!-- BADGES -->
44
[![test](https://github.com/korlibs/korlibs-image-core/actions/workflows/TEST.yml/badge.svg)](https://github.com/korlibs/korlibs-image-core/actions/workflows/TEST.yml)
55
[![codecov](https://codecov.io/gh/korlibs/korlibs-image-core/graph/badge.svg)](https://codecov.io/gh/korlibs/korlibs-image-core)
6-
[![Maven Central Version](https://img.shields.io/maven-central/v/com.soywiz/korlibs-image-core)](https://central.sonatype.com/artifact/com.soywiz/korlibs-image-core)
6+
[![Maven Central Version](https://img.shields.io/maven-central/v/org.korge/korlibs-image-core)](https://central.sonatype.com/artifact/org.korge/korlibs-image-core)
77
[![Discord](https://img.shields.io/discord/728582275884908604?logo=discord&label=Discord)](https://discord.korge.org/)
88
[![KDoc](https://img.shields.io/badge/docs-kdoc-blue)](https://korlibs.github.io/korlibs-image-core/)
99
[![Documentation](https://img.shields.io/badge/docs-documentation-purple)](https://docs.korge.org/image-core/)

0 commit comments

Comments
 (0)