Unverified Commit b90321a6 authored by Igor Demin's avatar Igor Demin Committed by GitHub

Another method to parse font features (#554)

* Another method to parse font features

Needed for Compose. I compare it with Android, and Android/Compose by documentation uses this format without quotes: ttps://www.w3.org/TR/css-fonts-3/#font-feature-settings-prop

* Fix CI
parent ac324c0f
...@@ -93,8 +93,8 @@ jobs: ...@@ -93,8 +93,8 @@ jobs:
sudo apt-get install ninja-build fontconfig libfontconfig1-dev libglu1-mesa-dev libxrandr-dev libdbus-1-dev zip xvfb -y sudo apt-get install ninja-build fontconfig libfontconfig1-dev libglu1-mesa-dev libxrandr-dev libdbus-1-dev zip xvfb -y
sudo Xvfb :0 -screen 0 1280x720x24 & sudo Xvfb :0 -screen 0 1280x720x24 &
export DISPLAY=:0 export DISPLAY=:0
./gradlew --stacktrace --info -Pskiko.native.enabled=true :skiko:linuxX64Test :skiko:awtTest ./gradlew --stacktrace --info -Pskiko.native.enabled=true -Pkotlin.native.cacheKind.linuxX64=none :skiko:linuxX64Test :skiko:awtTest
./gradlew --stacktrace --info :skiko:publishToMavenLocal ./gradlew --stacktrace --info -Pkotlin.native.cacheKind.linuxX64=none :skiko:publishToMavenLocal
./gradlew --stacktrace --info :SkiaAwtSample:installDist # check jvm sample works ./gradlew --stacktrace --info :SkiaAwtSample:installDist # check jvm sample works
./gradlew -Pskiko.android.enabled=true :skiko:publishSkikoJvmRuntimeAndroidX64PublicationToMavenLocal :skiko:publishSkikoJvmRuntimeAndroidArm64PublicationToMavenLocal :skiko:publishAndroidPublicationToMavenLocal ./gradlew -Pskiko.android.enabled=true :skiko:publishSkikoJvmRuntimeAndroidX64PublicationToMavenLocal :skiko:publishSkikoJvmRuntimeAndroidArm64PublicationToMavenLocal :skiko:publishAndroidPublicationToMavenLocal
- uses: actions/upload-artifact@v2 - uses: actions/upload-artifact@v2
......
...@@ -98,10 +98,46 @@ class FontFeature(val _tag: Int, val value: Int, val start: UInt, val end: UInt) ...@@ -98,10 +98,46 @@ class FontFeature(val _tag: Int, val value: Int, val start: UInt, val end: UInt)
return FontFeature(m.group(tagIx)!!, value, start, end) return FontFeature(m.group(tagIx)!!, value, start, end)
} }
/**
* Parse font features, which are separated by spaces. For example:
*
* smcp=0 frac
*
* If a value omitted, treat it as "1"
*
* If [str] is invalid, throws IllegalArgumentException
*/
fun parse(str: String): Array<FontFeature> { fun parse(str: String): Array<FontFeature> {
return _splitPattern.split(str).map { s -> parseOne(s) }.toTypedArray() return _splitPattern.split(str).map { s -> parseOne(s) }.toTypedArray()
} }
/**
* Parse font features separated by comma, in W3 style (as in CSS):
*
* smcp 0, frac
*
* If a value omitted, treat it as "1"
*
* See https://www.w3.org/TR/css-fonts-3/#font-feature-settings-prop
*
* If [str] in invalid format, FontFeature won't be in the result
*/
fun parseW3(str: String): Array<FontFeature> =
str
.splitToSequence(",")
.mapNotNull {
val parts = it.trim().split(" ")
val name = parts[0]
val value = when (val value = parts.getOrNull(1)) {
"on", null -> 1
"off" -> 0
else -> value.toIntOrNull() ?: 1
}
if (name.length == 4) FontFeature(name, value) else null
}
.toList()
.toTypedArray()
internal fun InteropScope.arrayOfFontFeaturesToInterop(fontFeatures: Array<FontFeature>?): InteropPointer { internal fun InteropScope.arrayOfFontFeaturesToInterop(fontFeatures: Array<FontFeature>?): InteropPointer {
val ints = IntArray(4 * (fontFeatures?.size ?: 0)) val ints = IntArray(4 * (fontFeatures?.size ?: 0))
......
...@@ -83,6 +83,47 @@ class PatternMatcherTests { ...@@ -83,6 +83,47 @@ class PatternMatcherTests {
assertEquals(42, f4.value) assertEquals(42, f4.value)
} }
@Test
fun fontFeatureCanBeParsedAsW3() = runTest {
FontFeature.parseW3("abcd").apply {
assertEquals(1, size)
assertEquals("abcd", get(0).tag)
assertEquals(1, get(0).value)
}
FontFeature.parseW3("abcd 0").apply {
assertEquals(1, size)
assertEquals("abcd", get(0).tag)
assertEquals(0, get(0).value)
}
FontFeature.parseW3("abcd 0, vfgb").apply {
assertEquals(2, size)
assertEquals("abcd", get(0).tag)
assertEquals(0, get(0).value)
assertEquals("vfgb", get(1).tag)
assertEquals(1, get(1).value)
}
FontFeature.parseW3("abcd 0, abc, vfgb").apply {
assertEquals(2, size)
assertEquals("abcd", get(0).tag)
assertEquals(0, get(0).value)
assertEquals("vfgb", get(1).tag)
assertEquals(1, get(1).value)
}
FontFeature.parseW3("abcd vfgb").apply {
assertEquals(1, size)
assertEquals("abcd", get(0).tag)
assertEquals(1, get(0).value)
}
FontFeature.parseW3("").apply {
assertEquals(0, size)
}
}
@Test @Test
fun fontVariationCanBeParsed() = runTest { fun fontVariationCanBeParsed() = runTest {
val f1 = FontVariation.parseOne("abcd=111") val f1 = FontVariation.parseOne("abcd=111")
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment