Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
S
skiko
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
liuqiang
skiko
Commits
524b0ad1
Unverified
Commit
524b0ad1
authored
Sep 30, 2021
by
Shagen Ogandzhanian
Committed by
GitHub
Sep 30, 2021
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Port JVM tests from skija (#224)
parent
71d274ad
Changes
23
Show whitespace changes
Inline
Side-by-side
Showing
23 changed files
with
1142 additions
and
0 deletions
+1142
-0
build.gradle.kts
skiko/build.gradle.kts
+2
-0
BitmapTest.kt
skiko/src/jvmTest/kotlin/org/jetbrains/skiko/BitmapTest.kt
+46
-0
ColorTest.kt
skiko/src/jvmTest/kotlin/org/jetbrains/skiko/ColorTest.kt
+35
-0
DataTest.kt
skiko/src/jvmTest/kotlin/org/jetbrains/skiko/DataTest.kt
+45
-0
FontMgrTest.kt
skiko/src/jvmTest/kotlin/org/jetbrains/skiko/FontMgrTest.kt
+98
-0
ImageTest.kt
skiko/src/jvmTest/kotlin/org/jetbrains/skiko/ImageTest.kt
+47
-0
PaintTest.kt
skiko/src/jvmTest/kotlin/org/jetbrains/skiko/PaintTest.kt
+38
-0
PathMeasureTest.kt
...src/jvmTest/kotlin/org/jetbrains/skiko/PathMeasureTest.kt
+71
-0
PathTest.kt
skiko/src/jvmTest/kotlin/org/jetbrains/skiko/PathTest.kt
+316
-0
SurfaceTest.kt
skiko/src/jvmTest/kotlin/org/jetbrains/skiko/SurfaceTest.kt
+63
-0
TestLineTest.kt
skiko/src/jvmTest/kotlin/org/jetbrains/skiko/TestLineTest.kt
+134
-0
TypefaceTest.kt
skiko/src/jvmTest/kotlin/org/jetbrains/skiko/TypefaceTest.kt
+93
-0
assertCloseEnough.kt
...t/kotlin/org/jetbrains/skiko/helpers/assertCloseEnough.kt
+21
-0
makeFromResource.kt
...st/kotlin/org/jetbrains/skiko/helpers/makeFromResource.kt
+11
-0
FontCollectionTest.kt
...otlin/org/jetbrains/skiko/paragraph/FontCollectionTest.kt
+77
-0
TextStyleTest.kt
...est/kotlin/org/jetbrains/skiko/paragraph/TextStyleTest.kt
+42
-0
SeveralClassloaders.kt
...st/kotlin/org/jetbrains/skiko/util/SeveralClassloaders.kt
+3
-0
FiraCode-Regular.ttf
skiko/src/jvmTest/resources/fonts/FiraCode-Regular.ttf
+0
-0
Inter-V.ttf
skiko/src/jvmTest/resources/fonts/Inter-V.ttf
+0
-0
InterHinted-Regular.ttf
skiko/src/jvmTest/resources/fonts/InterHinted-Regular.ttf
+0
-0
JetBrainsMono-Bold.ttf
skiko/src/jvmTest/resources/fonts/JetBrainsMono-Bold.ttf
+0
-0
JetBrainsMono-Italic.ttf
skiko/src/jvmTest/resources/fonts/JetBrainsMono-Italic.ttf
+0
-0
JetBrainsMono-Regular.ttf
skiko/src/jvmTest/resources/fonts/JetBrainsMono-Regular.ttf
+0
-0
No files found.
skiko/build.gradle.kts
View file @
524b0ad1
...
@@ -236,6 +236,8 @@ kotlin {
...
@@ -236,6 +236,8 @@ kotlin {
dependencies
{
dependencies
{
implementation
(
"org.jetbrains.kotlinx:kotlinx-coroutines-test:$coroutinesVersion"
)
implementation
(
"org.jetbrains.kotlinx:kotlinx-coroutines-test:$coroutinesVersion"
)
implementation
(
kotlin
(
"test-junit"
))
implementation
(
kotlin
(
"test-junit"
))
implementation
(
kotlin
(
"test"
))
}
}
}
}
...
...
skiko/src/jvmTest/kotlin/org/jetbrains/skiko/BitmapTest.kt
0 → 100644
View file @
524b0ad1
package
org.jetbrains.skiko
import
org.jetbrains.skia.Bitmap
import
org.jetbrains.skia.ColorAlphaType
import
org.jetbrains.skia.ImageInfo
import
kotlin.test.Test
import
kotlin.test.assertEquals
import
kotlin.test.assertFalse
import
kotlin.test.assertNotEquals
import
kotlin.test.assertTrue
class
BitmapTest
{
@Test
fun
bitmapTest
()
{
val
bitmap
=
Bitmap
()
val
id1
:
Int
=
bitmap
.
generationId
assertTrue
(
bitmap
.
isNull
)
assertTrue
(
bitmap
.
isEmpty
)
bitmap
.
allocPixels
(
ImageInfo
.
makeS32
(
7
,
3
,
ColorAlphaType
.
OPAQUE
))
assertNotEquals
(
id1
,
bitmap
.
generationId
)
assertFalse
(
bitmap
.
isNull
)
assertFalse
(
bitmap
.
isEmpty
)
assertEquals
(
7L
*
4
,
bitmap
.
rowBytes
)
assertEquals
(
4
,
bitmap
.
bytesPerPixel
)
assertEquals
(
7
,
bitmap
.
rowBytesAsPixels
)
bitmap
.
allocPixels
(
ImageInfo
.
makeS32
(
7
,
3
,
ColorAlphaType
.
OPAQUE
),
32
)
assertEquals
(
32L
,
bitmap
.
rowBytes
)
assertEquals
(
4
,
bitmap
.
bytesPerPixel
)
assertEquals
(
8
,
bitmap
.
rowBytesAsPixels
)
bitmap
.
setImageInfo
(
ImageInfo
.
makeS32
(
7
,
3
,
ColorAlphaType
.
OPAQUE
))
assertTrue
(
bitmap
.
isNull
)
assertFalse
(
bitmap
.
isEmpty
)
assertFalse
(
bitmap
.
isReadyToDraw
)
bitmap
.
allocPixels
()
assertFalse
(
bitmap
.
isNull
)
assertTrue
(
bitmap
.
isReadyToDraw
)
bitmap
.
generationId
}
}
\ No newline at end of file
skiko/src/jvmTest/kotlin/org/jetbrains/skiko/ColorTest.kt
0 → 100644
View file @
524b0ad1
package
org.jetbrains.skiko
import
org.jetbrains.skia.Color
import
org.jetbrains.skia.Color4f
import
kotlin.test.Test
import
kotlin.test.assertEquals
class
ColorTest
{
@Test
fun
testColor
()
{
val
cases
=
mapOf
(
0
x00000000
to
Color4f
(
0f
,
0f
,
0f
,
0f
),
-
0
x1000000
to
Color4f
(
0f
,
0f
,
0f
,
1f
),
0
x00FF0000
to
Color4f
(
1f
,
0f
,
0f
,
0f
),
0
x0000FF00
to
Color4f
(
0f
,
1f
,
0f
,
0f
),
0
x000000FF
to
Color4f
(
0f
,
0f
,
1f
,
0f
),
-
0
x7f7f7f80
to
Color4f
(
128
/
255f
,
128
/
255f
,
128
/
255f
,
128
/
255f
)
)
cases
.
forEach
{
(
value
,
color
)
->
assertEquals
(
value
,
color
.
toColor
(),
"$value <-> $color"
)
assertEquals
(
Color4f
(
value
),
color
,
"Color($value) <-> $color"
)
}
assertEquals
(
0
x12
,
Color
.
getA
(
0
x12345678
))
assertEquals
(
0
x34
,
Color
.
getR
(
0
x12345678
))
assertEquals
(
0
x56
,
Color
.
getG
(
0
x12345678
))
assertEquals
(
0
x78
,
Color
.
getB
(
0
x12345678
))
assertEquals
(-
0
x1cba988
,
Color
.
withA
(
0
x12345678
,
0
xFE
))
assertEquals
(
0
x12FE5678
,
Color
.
withR
(
0
x12345678
,
0
xFE
))
assertEquals
(
0
x1234FE78
,
Color
.
withG
(
0
x12345678
,
0
xFE
))
assertEquals
(
0
x123456FE
,
Color
.
withB
(
0
x12345678
,
0
xFE
))
}
}
\ No newline at end of file
skiko/src/jvmTest/kotlin/org/jetbrains/skiko/DataTest.kt
0 → 100644
View file @
524b0ad1
package
org.jetbrains.skiko
import
org.jetbrains.skia.Data
import
org.junit.Assert.assertArrayEquals
import
java.nio.charset.StandardCharsets
import
kotlin.test.Test
import
kotlin.test.assertEquals
import
kotlin.test.assertNotEquals
class
DataTest
{
@Test
fun
dataTest
()
{
Data
.
makeEmpty
().
use
{
data
->
assertEquals
(
0L
,
data
.
size
)
assertArrayEquals
(
ByteArray
(
0
),
data
.
bytes
)
Data
.
makeEmpty
().
use
{
data2
->
assertEquals
(
data
,
data2
)
}
}
val
bytes
=
"abcdef"
.
toByteArray
(
StandardCharsets
.
UTF_8
)
val
bytesSubset
=
"bcde"
.
toByteArray
(
StandardCharsets
.
UTF_8
)
Data
.
makeFromBytes
(
bytes
).
use
{
data
->
assertEquals
(
6L
,
data
.
size
)
assertArrayEquals
(
bytes
,
data
.
bytes
)
assertArrayEquals
(
bytesSubset
,
data
.
getBytes
(
1
,
4
))
Data
.
makeFromBytes
(
bytes
).
use
{
data2
->
assertEquals
(
data
,
data2
)
}
data
.
makeCopy
().
use
{
data2
->
assertEquals
(
data
,
data2
)
}
Data
.
makeFromBytes
(
bytes
,
1
,
4
).
use
{
data3
->
assertEquals
(
4L
,
data3
.
size
)
assertArrayEquals
(
bytesSubset
,
data3
.
bytes
)
assertNotEquals
(
data
,
data3
)
}
data
.
makeSubset
(
1
,
4
).
use
{
data4
->
assertEquals
(
4L
,
data4
.
size
)
assertArrayEquals
(
bytesSubset
,
data4
.
bytes
)
assertNotEquals
(
data
,
data4
)
}
}
}
}
\ No newline at end of file
skiko/src/jvmTest/kotlin/org/jetbrains/skiko/FontMgrTest.kt
0 → 100644
View file @
524b0ad1
package
org.jetbrains.skiko
import
org.jetbrains.skia.Data
import
org.jetbrains.skia.FontStyle
import
org.jetbrains.skia.Typeface
import
org.jetbrains.skia.paragraph.TypefaceFontProvider
import
org.jetbrains.skiko.skija.makeFromResource
import
kotlin.test.Test
import
kotlin.test.assertEquals
import
kotlin.test.assertNull
class
FontMgrTest
{
@Test
fun
fontMgrTest
()
{
val
fontManager
=
TypefaceFontProvider
()
val
jbMono
=
Typeface
.
makeFromResource
(
"JetBrainsMono-Regular.ttf"
)
fontManager
.
registerTypeface
(
jbMono
)
val
jbMonoBold
=
Typeface
.
makeFromResource
(
"JetBrainsMono-Bold.ttf"
)
fontManager
.
registerTypeface
(
jbMonoBold
)
val
inter
:
Typeface
=
Typeface
.
makeFromResource
(
"InterHinted-Regular.ttf"
)
fontManager
.
registerTypeface
(
inter
,
"Interface"
)
assertEquals
(
2
,
fontManager
.
familiesCount
)
assertEquals
(
"JetBrains Mono"
,
fontManager
.
getFamilyName
(
0
))
assertEquals
(
"Interface"
,
fontManager
.
getFamilyName
(
1
))
fontManager
.
makeStyleSet
(
0
).
use
{
styleSet
->
assertEquals
(
0
,
styleSet
?.
count
())
}
fontManager
.
makeStyleSet
(
1
).
use
{
styleSet
->
assertEquals
(
0
,
styleSet
?.
count
())
}
fontManager
.
matchFamily
(
"JetBrains Mono"
).
use
{
styleSet
->
assertEquals
(
2
,
styleSet
.
count
())
assertEquals
(
FontStyle
.
NORMAL
,
styleSet
.
getStyle
(
0
))
assertEquals
(
"JetBrains Mono"
,
styleSet
.
getStyleName
(
0
))
assertEquals
(
FontStyle
.
BOLD
,
styleSet
.
getStyle
(
1
))
assertEquals
(
"JetBrains Mono"
,
styleSet
.
getStyleName
(
1
))
assertEquals
(
2
,
jbMono
.
refCount
)
styleSet
.
getTypeface
(
0
).
use
{
face
->
assertEquals
(
3
,
jbMono
.
refCount
)
assertEquals
(
jbMono
,
face
)
}
assertEquals
(
2
,
jbMono
.
refCount
)
assertEquals
(
2
,
jbMonoBold
.
refCount
)
styleSet
.
getTypeface
(
1
).
use
{
face
->
assertEquals
(
3
,
jbMonoBold
.
refCount
)
assertEquals
(
jbMonoBold
,
face
)
}
assertEquals
(
2
,
jbMonoBold
.
refCount
)
assertEquals
(
2
,
jbMono
.
refCount
)
styleSet
.
matchStyle
(
FontStyle
.
NORMAL
).
use
{
face
->
assertEquals
(
3
,
jbMono
.
refCount
)
assertEquals
(
jbMono
,
face
)
}
assertEquals
(
2
,
jbMono
.
refCount
)
assertEquals
(
2
,
jbMonoBold
.
refCount
)
styleSet
.
matchStyle
(
FontStyle
.
BOLD
).
use
{
face
->
assertEquals
(
3
,
jbMonoBold
.
refCount
)
assertEquals
(
jbMonoBold
,
face
)
}
assertEquals
(
2
,
jbMonoBold
.
refCount
)
assertEquals
(
jbMono
,
styleSet
.
matchStyle
(
FontStyle
.
ITALIC
))
}
assertNull
(
fontManager
.
matchFamilyStyle
(
"JetBrains Mono"
,
FontStyle
.
BOLD
))
assertNull
(
fontManager
.
matchFamilyStyle
(
"Interface"
,
FontStyle
.
NORMAL
))
assertEquals
(
null
,
fontManager
.
matchFamilyStyleCharacter
(
"JetBrains Mono"
,
FontStyle
.
BOLD
,
arrayOf
(
"en-US"
),
65
/* A */
)
)
Data
.
makeFromFileName
(
"src/jvmTest/resources/fonts/JetBrainsMono-Italic.ttf"
).
use
{
data
->
fontManager
.
makeFromData
(
data
).
use
{
fontManager
.
matchFamily
(
"JetBrains Mono"
).
use
{
styleSet
->
assertEquals
(
2
,
fontManager
.
familiesCount
)
assertEquals
(
2
,
styleSet
.
count
())
}
}
}
fontManager
.
close
()
}
}
\ No newline at end of file
skiko/src/jvmTest/kotlin/org/jetbrains/skiko/ImageTest.kt
0 → 100644
View file @
524b0ad1
package
org.jetbrains.skiko
import
org.jetbrains.skia.EncodedImageFormat
import
org.jetbrains.skia.Paint
import
org.jetbrains.skia.Path
import
org.jetbrains.skia.Surface
import
java.io.File
import
java.nio.file.Files
import
kotlin.test.Test
import
java.nio.file.Path
as
FilePath
class
ImageTest
{
@Test
fun
imageTest
()
{
Surface
.
makeRasterN32Premul
(
100
,
100
).
use
{
surface
->
val
paint
=
Paint
()
paint
.
color
=
-
0
x10000
Path
().
moveTo
(
20f
,
80f
).
lineTo
(
50f
,
20f
).
lineTo
(
80f
,
80f
).
closePath
().
use
{
path
->
val
canvas
=
surface
.
canvas
canvas
.
drawPath
(
path
,
paint
)
surface
.
makeImageSnapshot
().
use
{
image
->
File
(
"build/tests/ImageTest/"
).
mkdirs
()
Files
.
write
(
FilePath
.
of
(
"build/tests/ImageTest/polygon_default.png"
),
image
.
encodeToData
()
?.
bytes
!!
)
Files
.
write
(
FilePath
.
of
(
"build/tests/ImageTest/polygon_jpeg_default.jpeg"
),
image
.
encodeToData
(
EncodedImageFormat
.
JPEG
)
?.
bytes
!!
)
Files
.
write
(
FilePath
.
of
(
"build/tests/ImageTest/polygon_jpeg_50.jpeg"
),
image
.
encodeToData
(
EncodedImageFormat
.
JPEG
,
50
)
?.
bytes
!!
)
Files
.
write
(
FilePath
.
of
(
"build/tests/ImageTest/polygon_webp_default.webp"
),
image
.
encodeToData
(
EncodedImageFormat
.
WEBP
)
?.
bytes
!!
)
Files
.
write
(
FilePath
.
of
(
"build/tests/ImageTest/polygon_webp_50.webp"
),
image
.
encodeToData
(
EncodedImageFormat
.
WEBP
,
50
)
?.
bytes
!!
)
}
}
}
}
}
\ No newline at end of file
skiko/src/jvmTest/kotlin/org/jetbrains/skiko/PaintTest.kt
View file @
524b0ad1
...
@@ -6,6 +6,8 @@ import org.jetbrains.skiko.util.loadResourceImage
...
@@ -6,6 +6,8 @@ import org.jetbrains.skiko.util.loadResourceImage
import
org.junit.Assume.assumeTrue
import
org.junit.Assume.assumeTrue
import
org.junit.Rule
import
org.junit.Rule
import
org.junit.Test
import
org.junit.Test
import
kotlin.test.assertEquals
import
kotlin.test.assertNotEquals
class
PaintTest
{
class
PaintTest
{
@get
:
Rule
@get
:
Rule
...
@@ -45,4 +47,40 @@ class PaintTest {
...
@@ -45,4 +47,40 @@ class PaintTest {
screenshots
.
assert
(
surface
.
makeImageSnapshot
())
screenshots
.
assert
(
surface
.
makeImageSnapshot
())
}
}
@Test
fun
paintTest
()
{
// TODO: ported from skija and we need address the commented out assertions
val
paintA
=
Paint
().
apply
{
color
=
0
x12345678
}
val
paintB
=
Paint
().
apply
{
color
=
0
x12345678
}
assertEquals
(
paintA
,
paintB
)
// assertEquals(paintA.hashCode(), paintB.hashCode(), "hash codes are not identical")
//
// val paintC = Paint().apply { color = -0xcba988 }
// assertEquals(paintA, paintC)
// assertEquals(paintA.hashCode(), paintC.hashCode())
//
assertNotEquals
(
Paint
(),
Paint
().
apply
{
isAntiAlias
=
false
})
assertNotEquals
(
Paint
(),
Paint
().
apply
{
isDither
=
true
})
Paint
().
use
{
paint
->
paint
.
color
=
0
x12345678
// assertEquals(false, paint == paint.makeClone(), "cloned paint is not equal")
// assertEquals(paint, paint.makeClone())
// assertNotEquals(paint.hashCode(), paint.makeClone().hashCode())
}
Paint
().
use
{
paint
->
assertEquals
(
false
,
paint
.
hasNothingToDraw
())
paint
.
blendMode
=
BlendMode
.
DST
assertEquals
(
true
,
paint
.
hasNothingToDraw
())
paint
.
blendMode
=
BlendMode
.
SRC_OVER
assertEquals
(
false
,
paint
.
hasNothingToDraw
())
paint
.
alpha
=
0
assertEquals
(
true
,
paint
.
hasNothingToDraw
())
}
}
}
}
\ No newline at end of file
skiko/src/jvmTest/kotlin/org/jetbrains/skiko/PathMeasureTest.kt
0 → 100644
View file @
524b0ad1
package
org.jetbrains.skiko
import
org.jetbrains.skia.Matrix33
import
org.jetbrains.skia.Path
import
org.jetbrains.skia.PathMeasure
import
org.jetbrains.skia.Point
import
org.jetbrains.skiko.skija.assertCloseEnough
import
kotlin.test.Test
import
kotlin.test.assertEquals
class
PathMeasureTest
{
@Test
fun
pathMeasureTest
()
{
Path
().
moveTo
(
0f
,
0f
).
lineTo
(
40f
,
0f
).
moveTo
(
0f
,
40f
).
lineTo
(
10f
,
50f
).
use
{
path
->
PathMeasure
(
path
,
false
).
use
{
measure
->
Path
().
lineTo
(
10f
,
10f
).
use
{
path2
->
assertEquals
(
40f
,
measure
.
length
)
assertCloseEnough
(
Point
(
0f
,
0f
),
measure
.
getPosition
(
0f
))
assertCloseEnough
(
Point
(
1f
,
0f
),
measure
.
getTangent
(
0f
))
assertCloseEnough
(
Point
(
20f
,
0f
),
measure
.
getPosition
(
20f
))
assertCloseEnough
(
Point
(
1f
,
0f
),
measure
.
getTangent
(
20f
))
assertEquals
(
false
,
measure
.
isClosed
)
assertCloseEnough
(
Matrix33
.
makeTranslate
(
20f
,
0f
),
measure
.
getMatrix
(
20f
,
getPosition
=
true
,
getTangent
=
false
)
)
assertCloseEnough
(
Matrix33
.
makeRotate
(
0f
),
measure
.
getMatrix
(
20f
,
getPosition
=
false
,
getTangent
=
true
)
)
assertCloseEnough
(
Matrix33
.
makeTranslate
(
20f
,
0f
).
makeConcat
(
Matrix33
.
makeRotate
(
0f
)),
measure
.
getMatrix
(
20f
,
getPosition
=
true
,
getTangent
=
true
)
)
measure
.
nextContour
()
assertCloseEnough
(
14.14213f
,
measure
.
length
)
assertCloseEnough
(
Point
(
0f
,
40f
),
measure
.
getPosition
(
0f
))
assertCloseEnough
(
Point
(
0.70710677f
,
0.70710677f
),
measure
.
getTangent
(
0f
))
assertCloseEnough
(
Point
(
4.949747f
,
44.949745f
),
measure
.
getPosition
(
7f
))
assertCloseEnough
(
Point
(
0.70710677f
,
0.70710677f
),
measure
.
getTangent
(
7f
))
assertCloseEnough
(
Matrix33
.
makeTranslate
(
4.949747f
,
44.949745f
),
measure
.
getMatrix
(
7f
,
getPosition
=
true
,
getTangent
=
false
)
)
assertCloseEnough
(
Matrix33
.
makeRotate
(
45f
),
measure
.
getMatrix
(
7f
,
getPosition
=
false
,
getTangent
=
true
)
)
assertCloseEnough
(
Matrix33
.
makeTranslate
(
4.949747f
,
44.949745f
).
makeConcat
(
Matrix33
.
makeRotate
(
45f
)),
measure
.
getMatrix
(
7f
,
getPosition
=
true
,
getTangent
=
true
)
)
measure
.
setPath
(
path2
,
false
)
assertCloseEnough
(
14.142136f
,
measure
.
length
)
}
}
}
}
}
\ No newline at end of file
skiko/src/jvmTest/kotlin/org/jetbrains/skiko/PathTest.kt
0 → 100644
View file @
524b0ad1
package
org.jetbrains.skiko
import
org.jetbrains.skia.Path
import
org.jetbrains.skia.PathDirection
import
org.jetbrains.skia.PathFillMode
import
org.jetbrains.skia.PathSegmentMask
import
org.jetbrains.skia.PathVerb
import
org.jetbrains.skia.Point
import
org.jetbrains.skia.RRect
import
org.jetbrains.skia.Rect
import
kotlin.test.Test
import
kotlin.test.assertContentEquals
import
kotlin.test.assertEquals
import
kotlin.test.assertFailsWith
import
kotlin.test.assertFalse
import
kotlin.test.assertNotEquals
import
kotlin.test.assertNull
import
kotlin.test.assertTrue
class
PathTest
{
@Test
fun
iterTest
()
{
Path
().
moveTo
(
10f
,
10f
).
lineTo
(
20f
,
0f
).
lineTo
(
20f
,
20f
).
closePath
().
use
{
p
->
p
.
iterator
().
use
{
i
->
assertTrue
(
i
.
hasNext
())
var
s
=
i
.
next
()
!!
assertEquals
(
PathVerb
.
MOVE
,
s
.
verb
)
assertEquals
(
Point
(
10f
,
10f
),
s
.
p0
)
assertTrue
(
s
.
isClosedContour
)
assertTrue
(
i
.
hasNext
())
s
=
i
.
next
()
!!
assertEquals
(
PathVerb
.
LINE
,
s
.
verb
)
assertEquals
(
Point
(
10f
,
10f
),
s
.
p0
)
assertEquals
(
Point
(
20f
,
0f
),
s
.
p1
)
assertFalse
(
s
.
isCloseLine
)
assertTrue
(
i
.
hasNext
())
s
=
i
.
next
()
!!
assertEquals
(
PathVerb
.
LINE
,
s
.
verb
)
assertEquals
(
Point
(
20f
,
0f
),
s
.
p0
)
assertEquals
(
Point
(
20f
,
20f
),
s
.
p1
)
assertFalse
(
s
.
isCloseLine
)
assertTrue
(
i
.
hasNext
())
s
=
i
.
next
()
!!
assertEquals
(
PathVerb
.
LINE
,
s
.
verb
)
assertEquals
(
Point
(
20f
,
20f
),
s
.
p0
)
assertEquals
(
Point
(
10f
,
10f
),
s
.
p1
)
assertTrue
(
s
.
isCloseLine
)
assertTrue
(
i
.
hasNext
())
s
=
i
.
next
()
!!
assertEquals
(
PathVerb
.
CLOSE
,
s
.
verb
)
assertEquals
(
Point
(
10f
,
10f
),
s
.
p0
)
assertFalse
(
i
.
hasNext
())
assertFailsWith
<
NoSuchElementException
>
{
i
.
next
()
}
}
}
}
@Test
fun
convexityTest
()
{
Path
().
lineTo
(
40f
,
20f
).
lineTo
(
0f
,
40f
).
lineTo
(
0f
,
0f
).
closePath
().
use
{
p
->
assertTrue
(
p
.
isConvex
)
}
Path
().
lineTo
(
40f
,
40f
).
lineTo
(
40f
,
0f
).
lineTo
(
0f
,
40f
).
lineTo
(
0f
,
0f
).
closePath
().
use
{
p
->
assertFalse
(
p
.
isConvex
)
}
}
@Test
fun
isShapeTest
()
{
for
(
dir
in
PathDirection
.
values
())
{
for
(
start
in
0
..
3
)
{
Path
().
addRect
(
Rect
.
makeLTRB
(
0f
,
0f
,
40f
,
20f
),
dir
,
start
).
use
{
p
->
assertEquals
(
Rect
.
makeLTRB
(
0f
,
0f
,
40f
,
20f
),
p
.
isRect
)
assertNull
(
p
.
isOval
)
assertNull
(
p
.
isRRect
)
}
}
}
for
(
dir
in
PathDirection
.
values
())
{
for
(
start
in
0
..
3
)
{
Path
().
addOval
(
Rect
.
makeLTRB
(
0f
,
0f
,
40f
,
20f
),
dir
,
start
).
use
{
p
->
assertNull
(
p
.
isRect
)
assertEquals
(
Rect
.
makeLTRB
(
0f
,
0f
,
40f
,
20f
),
p
.
isOval
)
assertNull
(
p
.
isRRect
)
}
}
}
for
(
dir
in
PathDirection
.
values
())
{
Path
().
addCircle
(
20f
,
20f
,
20f
,
dir
).
use
{
p
->
assertNull
(
p
.
isRect
)
assertEquals
(
Rect
.
makeLTRB
(
0f
,
0f
,
40f
,
40f
),
p
.
isOval
)
assertNull
(
p
.
isRRect
)
}
}
for
(
dir
in
PathDirection
.
values
())
{
for
(
start
in
0
..
7
)
{
Path
().
addRRect
(
RRect
.
makeLTRB
(
0f
,
0f
,
40f
,
20f
,
5f
),
dir
,
start
).
use
{
p
->
assertNull
(
p
.
isRect
)
assertNull
(
p
.
isOval
)
assertEquals
(
RRect
.
makeLTRB
(
0f
,
0f
,
40f
,
20f
,
5f
),
p
.
isRRect
)
}
Path
().
addRRect
(
RRect
.
makeLTRB
(
0f
,
0f
,
40f
,
20f
,
0f
),
dir
,
start
).
use
{
p
->
assertEquals
(
Rect
.
makeLTRB
(
0f
,
0f
,
40f
,
20f
),
p
.
isRect
)
assertNull
(
p
.
isOval
)
assertNull
(
p
.
isRRect
)
}
Path
().
addRRect
(
RRect
.
makeLTRB
(
0f
,
0f
,
40f
,
20f
,
20f
,
10f
),
dir
,
start
).
use
{
p
->
assertNull
(
p
.
isRect
)
assertEquals
(
Rect
.
makeLTRB
(
0f
,
0f
,
40f
,
20f
),
p
.
isOval
)
assertNull
(
p
.
isRRect
)
}
}
}
Path
().
lineTo
(
40f
,
40f
).
lineTo
(
40f
,
0f
).
lineTo
(
0f
,
40f
).
lineTo
(
0f
,
0f
).
closePath
().
use
{
p
->
assertNull
(
p
.
isRect
)
assertNull
(
p
.
isOval
)
assertNull
(
p
.
isRRect
)
}
}
@Test
fun
checksTest
()
{
Path
().
lineTo
(
40f
,
40f
).
lineTo
(
40f
,
0f
).
lineTo
(
0f
,
40f
).
lineTo
(
0f
,
0f
).
closePath
().
use
{
p
->
assertFalse
(
p
.
isEmpty
)
p
.
reset
()
assertTrue
(
p
.
isEmpty
)
}
Path
().
lineTo
(
40f
,
40f
).
lineTo
(
40f
,
0f
).
lineTo
(
0f
,
40f
).
lineTo
(
0f
,
0f
).
closePath
().
use
{
p
->
assertFalse
(
p
.
isEmpty
)
p
.
rewind
()
assertTrue
(
p
.
isEmpty
)
}
Path
().
lineTo
(
40f
,
40f
).
lineTo
(
40f
,
0f
).
lineTo
(
0f
,
40f
).
lineTo
(
0f
,
0f
).
use
{
p
->
assertFalse
(
p
.
isLastContourClosed
)
p
.
closePath
()
assertTrue
(
p
.
isLastContourClosed
)
p
.
moveTo
(
100f
,
100f
).
lineTo
(
140f
,
140f
).
lineTo
(
140f
,
100f
).
lineTo
(
100f
,
140f
)
assertFalse
(
p
.
isLastContourClosed
)
p
.
closePath
()
assertTrue
(
p
.
isLastContourClosed
)
}
Path
().
lineTo
(
40f
,
40f
).
lineTo
(
40f
,
0f
).
lineTo
(
0f
,
40f
).
lineTo
(
0f
,
0f
).
use
{
p
->
assertTrue
(
p
.
isFinite
)
}
Path
().
lineTo
(
40f
,
40f
).
lineTo
(
Float
.
POSITIVE_INFINITY
,
0f
).
lineTo
(
0f
,
40f
).
lineTo
(
0f
,
0f
).
closePath
().
use
{
p
->
assertEquals
(
false
,
p
.
isFinite
)
}
Path
().
lineTo
(
40f
,
40f
).
lineTo
(
40f
,
0f
).
lineTo
(
0f
,
40f
).
lineTo
(
0f
,
0f
).
use
{
p
->
assertFalse
(
p
.
isVolatile
)
p
.
setVolatile
(
true
)
assertTrue
(
p
.
isVolatile
)
p
.
setVolatile
(
false
)
assertFalse
(
p
.
isVolatile
)
}
Path
().
lineTo
(
40f
,
40f
).
lineTo
(
40f
,
0f
).
lineTo
(
0f
,
40f
).
lineTo
(
0f
,
0f
).
closePath
().
use
{
p
->
assertNull
(
p
.
asLine
)
}
Path
().
moveTo
(
20f
,
20f
).
lineTo
(
40f
,
40f
).
use
{
p
->
assertContentEquals
(
arrayOf
(
Point
(
20f
,
20f
),
Point
(
40f
,
40f
)
),
p
.
asLine
)
}
}
@Test
fun
storageTest
()
{
val
subpath
:
Path
=
Path
().
lineTo
(
40f
,
40f
).
lineTo
(
40f
,
0f
).
lineTo
(
0f
,
40f
).
lineTo
(
0f
,
0f
).
closePath
()
for
(
p
in
arrayOf
(
Path
().
addPath
(
subpath
),
Path
().
incReserve
(
10
).
addPath
(
subpath
).
closePath
()
))
{
val
p0
=
Point
(
0f
,
0f
)
val
p1
=
Point
(
40f
,
40f
)
val
p2
=
Point
(
40f
,
0f
)
val
p3
=
Point
(
0f
,
40f
)
val
p4
=
Point
(
0f
,
0f
)
val
p5
=
Point
(
10f
,
10f
)
assertEquals
(
5
,
p
.
pointsCount
)
assertEquals
(
p0
,
p
.
getPoint
(
0
))
assertEquals
(
p1
,
p
.
getPoint
(
1
))
assertEquals
(
p2
,
p
.
getPoint
(
2
))
assertEquals
(
p3
,
p
.
getPoint
(
3
))
assertEquals
(
p4
,
p
.
getPoint
(
4
))
assertEquals
(
p4
,
p
.
lastPt
)
p
.
lastPt
=
p5
assertEquals
(
p5
,
p
.
getPoint
(
4
))
assertEquals
(
p5
,
p
.
lastPt
)
assertEquals
(
5
,
p
.
getPoints
(
null
,
0
))
var
pts
=
arrayOfNulls
<
Point
?>(
5
)
p
.
getPoints
(
pts
,
5
)
assertContentEquals
(
arrayOf
(
p0
,
p1
,
p2
,
p3
,
p5
),
pts
)
pts
=
arrayOfNulls
(
3
)
p
.
getPoints
(
pts
,
3
)
assertContentEquals
(
arrayOf
(
p0
,
p1
,
p2
),
pts
)
pts
=
arrayOfNulls
(
5
)
p
.
getPoints
(
pts
,
3
)
assertContentEquals
(
arrayOf
(
p0
,
p1
,
p2
,
null
,
null
),
pts
)
pts
=
arrayOfNulls
(
10
)
p
.
getPoints
(
pts
,
10
)
assertContentEquals
(
arrayOf
(
p0
,
p1
,
p2
,
p3
,
p5
,
null
,
null
,
null
,
null
,
null
),
pts
)
assertEquals
(
6
,
p
.
verbsCount
)
assertEquals
(
6
,
p
.
getVerbs
(
null
,
0
))
var
verbs
=
arrayOfNulls
<
PathVerb
?>(
6
)
p
.
getVerbs
(
verbs
,
6
)
assertContentEquals
(
arrayOf
(
PathVerb
.
MOVE
,
PathVerb
.
LINE
,
PathVerb
.
LINE
,
PathVerb
.
LINE
,
PathVerb
.
LINE
,
PathVerb
.
CLOSE
),
verbs
)
verbs
=
arrayOfNulls
(
3
)
p
.
getVerbs
(
verbs
,
3
)
assertContentEquals
(
arrayOf
(
PathVerb
.
MOVE
,
PathVerb
.
LINE
,
PathVerb
.
LINE
),
verbs
)
verbs
=
arrayOfNulls
(
6
)
p
.
getVerbs
(
verbs
,
3
)
assertContentEquals
(
arrayOf
(
PathVerb
.
MOVE
,
PathVerb
.
LINE
,
PathVerb
.
LINE
,
null
,
null
,
null
),
verbs
)
verbs
=
arrayOfNulls
(
10
)
p
.
getVerbs
(
verbs
,
10
)
assertContentEquals
(
arrayOf
(
PathVerb
.
MOVE
,
PathVerb
.
LINE
,
PathVerb
.
LINE
,
PathVerb
.
LINE
,
PathVerb
.
LINE
,
PathVerb
.
CLOSE
,
null
,
null
,
null
,
null
),
verbs
)
assertNotEquals
(
0L
,
p
.
approximateBytesUsed
)
assertEquals
(
PathSegmentMask
.
LINE
,
p
.
segmentMasks
)
}
}
@Test
fun
swapTest
()
{
Path
().
lineTo
(
40f
,
40f
).
lineTo
(
40f
,
0f
).
lineTo
(
0f
,
40f
).
lineTo
(
0f
,
0f
).
closePath
().
use
{
p1
->
Path
().
lineTo
(
0f
,
0f
).
lineTo
(
20f
,
20f
).
use
{
p2
->
p1
.
swap
(
p2
)
assertEquals
(
Path
().
lineTo
(
0f
,
0f
).
lineTo
(
20f
,
20f
),
p1
)
assertEquals
(
Path
().
lineTo
(
40f
,
40f
).
lineTo
(
40f
,
0f
).
lineTo
(
0f
,
40f
).
lineTo
(
0f
,
0f
).
closePath
(),
p2
)
}
}
}
@Test
fun
containsTest
()
{
Path
().
addRRect
(
RRect
.
makeLTRB
(
10f
,
20f
,
54f
,
120f
,
10f
,
20f
)).
use
{
p
->
assertTrue
(
p
.
conservativelyContainsRect
(
Rect
.
makeLTRB
(
10f
,
40f
,
54f
,
80f
)))
assertTrue
(
p
.
conservativelyContainsRect
(
Rect
.
makeLTRB
(
25f
,
20f
,
39f
,
120f
)))
assertTrue
(
p
.
conservativelyContainsRect
(
Rect
.
makeLTRB
(
15f
,
25f
,
49f
,
115f
)))
assertTrue
(
p
.
conservativelyContainsRect
(
Rect
.
makeLTRB
(
13f
,
27f
,
51f
,
113f
)))
assertFalse
(
p
.
conservativelyContainsRect
(
Rect
.
makeLTRB
(
0f
,
40f
,
60f
,
80f
)))
assertTrue
(
p
.
contains
(
30f
,
70f
))
assertFalse
(
p
.
contains
(
0f
,
0f
))
}
}
@Test
fun
utilsTest
()
{
assertFalse
(
Path
.
isLineDegenerate
(
Point
(
0f
,
0f
),
Point
(
10f
,
0f
),
false
))
assertTrue
(
Path
.
isLineDegenerate
(
Point
(
0f
,
0f
),
Point
(
0f
,
0f
),
true
))
assertTrue
(
Path
.
isLineDegenerate
(
Point
(
0f
,
0f
),
Point
(
0f
,
0f
),
false
))
assertFalse
(
Path
.
isLineDegenerate
(
Point
(
0f
,
0f
),
Point
(
0f
,
1e-13f
),
true
))
assertFalse
(
Path
.
isQuadDegenerate
(
Point
(
0f
,
0f
),
Point
(
10f
,
0f
),
Point
(
0f
,
0f
),
false
))
assertTrue
(
Path
.
isQuadDegenerate
(
Point
(
0f
,
0f
),
Point
(
0f
,
0f
),
Point
(
0f
,
0f
),
false
))
assertFalse
(
Path
.
isCubicDegenerate
(
Point
(
0f
,
0f
),
Point
(
10f
,
0f
),
Point
(
0f
,
0f
),
Point
(
0f
,
0f
),
false
))
assertTrue
(
Path
.
isCubicDegenerate
(
Point
(
0f
,
0f
),
Point
(
0f
,
0f
),
Point
(
0f
,
0f
),
Point
(
0f
,
0f
),
false
))
assertContentEquals
(
arrayOf
(
Point
(
0f
,
20f
),
Point
(
6.666667f
,
13.333334f
)),
Path
.
convertConicToQuads
(
Point
(
0f
,
20f
),
Point
(
20f
,
0f
),
Point
(
40f
,
20f
),
0.5f
,
1
)
)
assertContentEquals
(
arrayOf
(
Point
(
0f
,
20f
),
Point
(
3.0940108f
,
16.905989f
),
Point
(
8.452994f
,
15.119661f
),
Point
(
13.811978f
,
13.333334f
)
),
Path
.
convertConicToQuads
(
Point
(
0f
,
20f
),
Point
(
20f
,
0f
),
Point
(
40f
,
20f
),
0.5f
,
2
)
)
Path
().
lineTo
(
40f
,
40f
).
use
{
p
->
val
g1
=
p
.
generationId
p
.
lineTo
(
10f
,
40f
)
val
g2
=
p
.
generationId
assertNotEquals
(
g1
,
g2
)
p
.
fillMode
=
PathFillMode
.
EVEN_ODD
val
g3
=
p
.
generationId
assertEquals
(
g2
,
g3
)
}
}
@Test
fun
serializeTest
()
{
Path
().
lineTo
(
40f
,
40f
).
lineTo
(
40f
,
0f
).
lineTo
(
0f
,
40f
).
lineTo
(
0f
,
0f
).
closePath
().
use
{
p
->
val
p2
:
Path
=
Path
.
makeFromBytes
(
p
.
serializeToBytes
())
assertEquals
(
p
,
p2
)
}
}
}
\ No newline at end of file
skiko/src/jvmTest/kotlin/org/jetbrains/skiko/SurfaceTest.kt
0 → 100644
View file @
524b0ad1
package
org.jetbrains.skiko
import
org.jetbrains.skia.Bitmap
import
org.jetbrains.skia.ContentChangeMode
import
org.jetbrains.skia.IRect
import
org.jetbrains.skia.ImageInfo
import
org.jetbrains.skia.Surface
import
kotlin.test.Test
import
kotlin.test.assertEquals
import
kotlin.test.assertFailsWith
import
kotlin.test.assertNotEquals
import
kotlin.test.assertTrue
class
SurfaceTest
{
@Test
fun
surfaceTest
()
{
assertFailsWith
<
IllegalArgumentException
>
{
Surface
.
makeRasterN32Premul
(
0
,
0
)
}
Surface
.
makeRasterN32Premul
(
100
,
200
).
use
{
surface
->
assertEquals
(
100
,
surface
.
width
)
assertEquals
(
200
,
surface
.
height
)
val
readPixelsBitmap
=
Bitmap
()
readPixelsBitmap
.
setImageInfo
(
ImageInfo
.
makeN32Premul
(
100
,
200
))
readPixelsBitmap
.
allocPixels
()
assertTrue
(
surface
.
readPixels
(
readPixelsBitmap
,
0
,
0
))
val
id
=
surface
.
generationId
assertEquals
(
id
,
surface
.
generationId
)
val
writePixelsBitmap
=
Bitmap
()
writePixelsBitmap
.
setImageInfo
(
ImageInfo
.
makeN32Premul
(
100
,
200
))
writePixelsBitmap
.
allocPixels
()
surface
.
writePixels
(
writePixelsBitmap
,
0
,
0
)
assertNotEquals
(
id
,
surface
.
generationId
)
assertTrue
(
surface
.
isUnique
)
val
imageInfo
=
surface
.
imageInfo
assertEquals
(
100
,
imageInfo
.
width
)
assertEquals
(
200
,
imageInfo
.
height
)
val
newSurface
=
surface
.
makeSurface
(
50
,
100
)
!!
assertEquals
(
50
,
newSurface
.
width
)
assertEquals
(
100
,
newSurface
.
height
)
val
newSurface2
=
surface
.
makeSurface
(
ImageInfo
.
makeN32Premul
(
200
,
400
))
!!
assertEquals
(
200
,
newSurface2
.
width
)
assertEquals
(
400
,
newSurface2
.
height
)
val
image
=
surface
.
makeImageSnapshot
(
IRect
(
0
,
0
,
20
,
30
))
!!
assertEquals
(
20
,
image
.
width
)
assertEquals
(
30
,
image
.
height
)
val
id2
=
surface
.
generationId
assertEquals
(
id2
,
surface
.
generationId
)
surface
.
notifyContentWillChange
(
ContentChangeMode
.
DISCARD
)
assertNotEquals
(
id2
,
surface
.
generationId
)
val
context
=
surface
.
recordingContext
assertEquals
(
context
,
null
)
}
}
}
\ No newline at end of file
skiko/src/jvmTest/kotlin/org/jetbrains/skiko/TestLineTest.kt
0 → 100644
View file @
524b0ad1
package
org.jetbrains.skiko
import
org.jetbrains.skia.Font
import
org.jetbrains.skia.TextLine
import
org.jetbrains.skia.Typeface
import
org.jetbrains.skiko.skija.assertCloseEnough
import
org.jetbrains.skiko.skija.makeFromResource
import
kotlin.test.Test
import
kotlin.test.assertContentEquals
import
kotlin.test.assertEquals
import
kotlin.test.assertNotEquals
class
TextLineTest
{
private
var
inter36
:
Font
=
Font
(
Typeface
.
makeFromResource
(
"InterHinted-Regular.ttf"
),
36f
)
private
var
firaCode36
:
Font
=
Font
(
Typeface
.
makeFromResource
(
"FiraCode-Regular.ttf"
),
36f
)
private
var
jbMono36
:
Font
=
Font
(
Typeface
.
makeFromResource
(
"JetBrainsMono-Regular.ttf"
),
36f
)
@Test
fun
getOffsetAtCoordTest
()
{
TextLine
.
make
(
"abc"
,
inter36
).
use
{
line
->
assertContentEquals
(
shortArrayOf
(
503
,
574
,
581
),
line
.
glyphs
)
assertEquals
(
0
,
line
.
getOffsetAtCoord
(-
10f
))
// before “a”
assertEquals
(
0
,
line
.
getOffsetAtCoord
(
0f
))
// beginning of “a”
assertEquals
(
0
,
line
.
getOffsetAtCoord
(
5f
))
// left half of “a”
assertEquals
(
1
,
line
.
getOffsetAtCoord
(
10f
))
// center of “a”
assertEquals
(
1
,
line
.
getOffsetAtCoord
(
15f
))
// right half of “a”
assertEquals
(
1
,
line
.
getOffsetAtCoord
(
20f
))
// between “a” and “b”
assertEquals
(
1
,
line
.
getOffsetAtCoord
(
25f
))
// left half of “b”
assertEquals
(
2
,
line
.
getOffsetAtCoord
(
31f
))
// center of “b”
assertEquals
(
2
,
line
.
getOffsetAtCoord
(
36f
))
// right half of “b”
assertEquals
(
2
,
line
.
getOffsetAtCoord
(
42f
))
// between “b” and “c”
assertEquals
(
2
,
line
.
getOffsetAtCoord
(
47f
))
// left half of “c”
assertEquals
(
3
,
line
.
getOffsetAtCoord
(
52f
))
// center of “c”
assertEquals
(
3
,
line
.
getOffsetAtCoord
(
57f
))
// right half of “c”
assertEquals
(
3
,
line
.
getOffsetAtCoord
(
62f
))
// end of “c”
assertEquals
(
3
,
line
.
getOffsetAtCoord
(
100f
))
// after “c”
}
}
@Test
fun
getLeftOffsetAtCoordTest
()
{
TextLine
.
make
(
"abc"
,
inter36
).
use
{
line
->
assertEquals
(
0
,
line
.
getLeftOffsetAtCoord
(-
10f
))
// before “a”
assertEquals
(
0
,
line
.
getLeftOffsetAtCoord
(
0f
))
// beginning of “a”
assertEquals
(
0
,
line
.
getLeftOffsetAtCoord
(
5f
))
// left half of “a”
assertEquals
(
0
,
line
.
getLeftOffsetAtCoord
(
10f
))
// center of “a”
assertEquals
(
0
,
line
.
getLeftOffsetAtCoord
(
15f
))
// right half of “a”
assertEquals
(
1
,
line
.
getLeftOffsetAtCoord
(
20f
))
// between “a” and “b”
assertEquals
(
1
,
line
.
getLeftOffsetAtCoord
(
25f
))
// left half of “b”
assertEquals
(
1
,
line
.
getLeftOffsetAtCoord
(
31f
))
// center of “b”
assertEquals
(
1
,
line
.
getLeftOffsetAtCoord
(
36f
))
// right half of “b”
assertEquals
(
2
,
line
.
getLeftOffsetAtCoord
(
42f
))
// between “b” and “c”
assertEquals
(
2
,
line
.
getLeftOffsetAtCoord
(
47f
))
// left half of “c”
assertEquals
(
2
,
line
.
getLeftOffsetAtCoord
(
52f
))
// center of “c”
assertEquals
(
2
,
line
.
getLeftOffsetAtCoord
(
57f
))
// right half of “c”
assertEquals
(
3
,
line
.
getLeftOffsetAtCoord
(
62f
))
// end of “c”
assertEquals
(
3
,
line
.
getLeftOffsetAtCoord
(
100f
))
// after “c”
}
}
@Test
fun
getCoordAtOffsetTest
()
{
TextLine
.
make
(
"abc"
,
inter36
).
use
{
line
->
assertCloseEnough
(
0f
,
line
.
getCoordAtOffset
(
0
))
assertCloseEnough
(
20f
,
line
.
getCoordAtOffset
(
1
))
assertCloseEnough
(
42f
,
line
.
getCoordAtOffset
(
2
))
assertCloseEnough
(
62f
,
line
.
getCoordAtOffset
(
3
))
}
}
@Test
fun
ligaturesTest
()
{
TextLine
.
make
(
"<=>->"
,
inter36
).
use
{
line
->
assertContentEquals
(
shortArrayOf
(
1712
,
1701
),
line
.
glyphs
)
assertEquals
(
0
,
line
.
getOffsetAtCoord
(
0f
))
assertEquals
(
1
,
line
.
getOffsetAtCoord
(
16f
))
assertEquals
(
2
,
line
.
getOffsetAtCoord
(
32f
))
assertEquals
(
3
,
line
.
getOffsetAtCoord
(
48f
))
assertEquals
(
4
,
line
.
getOffsetAtCoord
(
65f
))
assertEquals
(
5
,
line
.
getOffsetAtCoord
(
82f
))
assertCloseEnough
(
0f
,
line
.
getCoordAtOffset
(
0
))
assertCloseEnough
(
16f
,
line
.
getCoordAtOffset
(
1
))
assertCloseEnough
(
32f
,
line
.
getCoordAtOffset
(
2
))
assertCloseEnough
(
48f
,
line
.
getCoordAtOffset
(
3
))
assertCloseEnough
(
65f
,
line
.
getCoordAtOffset
(
4
))
assertCloseEnough
(
82f
,
line
.
getCoordAtOffset
(
5
))
}
}
@Test
fun
combiningTest
()
{
// u U+0075 LATIN SMALL LETTER U
// ̈ U+0308 COMBINING DIAERESIS
// a U+0061 LATIN SMALL LETTER A
// ̧ U+0327 COMBINING CEDILLA
TextLine
.
make
(
"üa̧"
,
inter36
).
use
{
line
->
assertContentEquals
(
shortArrayOf
(
898
/* ü */
,
503
/* a */
,
1664
/* ̧ */
),
line
.
glyphs
)
assertEquals
(
0
,
line
.
getOffsetAtCoord
(
0f
))
assertEquals
(
0
,
line
.
getOffsetAtCoord
(
10f
))
assertEquals
(
2
,
line
.
getOffsetAtCoord
(
12f
))
assertEquals
(
2
,
line
.
getOffsetAtCoord
(
21f
))
assertEquals
(
2
,
line
.
getOffsetAtCoord
(
30f
))
assertEquals
(
4
,
line
.
getOffsetAtCoord
(
32f
))
assertEquals
(
4
,
line
.
getOffsetAtCoord
(
41f
))
assertCloseEnough
(
0f
,
line
.
getCoordAtOffset
(
0
))
assertCloseEnough
(
0f
,
line
.
getCoordAtOffset
(
1
))
assertCloseEnough
(
21f
,
line
.
getCoordAtOffset
(
2
))
assertCloseEnough
(
41f
,
line
.
getCoordAtOffset
(
3
))
assertCloseEnough
(
41f
,
line
.
getCoordAtOffset
(
4
))
}
TextLine
.
make
(
"ă"
,
jbMono36
).
use
{
line
->
}
TextLine
.
make
(
"aa̧"
,
jbMono36
).
use
{
line
->
// JetBrains Mono supports “a” but not “ ̧ ”
// Second grapheme cluster should fall back together, second “a” should resolve to different glyph
assertNotEquals
(
line
.
glyphs
.
get
(
0
),
line
.
glyphs
.
get
(
1
))
}
}
@Test
fun
emojiTest
()
{
TextLine
.
make
(
"☺"
,
firaCode36
).
use
{
misc
->
TextLine
.
make
(
"☺️"
,
firaCode36
).
use
{
emoji
->
assertContentEquals
(
shortArrayOf
(
1706
),
misc
.
glyphs
)
assertEquals
(
1
,
emoji
.
glyphs
.
size
)
assertNotEquals
(
misc
.
glyphs
.
get
(
0
),
emoji
.
glyphs
.
get
(
0
))
}
}
}
}
\ No newline at end of file
skiko/src/jvmTest/kotlin/org/jetbrains/skiko/TypefaceTest.kt
0 → 100644
View file @
524b0ad1
package
org.jetbrains.skiko
import
org.jetbrains.skia.Data
import
org.jetbrains.skia.FontFamilyName
import
org.jetbrains.skia.FontStyle
import
org.jetbrains.skia.FontVariation
import
org.jetbrains.skia.FontVariationAxis
import
org.jetbrains.skia.Typeface
import
org.jetbrains.skiko.skija.makeFromResource
import
kotlin.test.Test
import
kotlin.test.assertContentEquals
import
kotlin.test.assertEquals
import
kotlin.test.assertFalse
import
kotlin.test.assertNotEquals
import
kotlin.test.assertNotNull
import
kotlin.test.assertNull
import
kotlin.test.assertTrue
class
TypefaceTest
{
@Test
fun
typefaceTest
()
{
val
inter
=
Typeface
.
makeFromResource
(
"InterHinted-Regular.ttf"
)
val
interV
=
Typeface
.
makeFromResource
(
"Inter-V.ttf"
)
val
jbMono
=
Typeface
.
makeFromResource
(
"JetBrainsMono-Regular.ttf"
)
val
jbMonoBold
=
Typeface
.
makeFromData
(
Data
.
makeFromResource
(
"JetBrainsMono-Bold.ttf"
))
assertEquals
(
FontStyle
.
NORMAL
,
inter
.
fontStyle
)
assertFalse
(
inter
.
isBold
)
assertFalse
(
inter
.
isItalic
)
assertEquals
(
FontStyle
.
BOLD
,
jbMonoBold
.
fontStyle
)
assertTrue
(
jbMonoBold
.
isBold
)
assertFalse
(
jbMonoBold
.
isItalic
)
assertFalse
(
inter
.
isFixedPitch
)
assertTrue
(
jbMono
.
isFixedPitch
)
assertNull
(
inter
.
variationAxes
)
assertNull
(
inter
.
variations
)
val
axes
=
arrayOf
(
FontVariationAxis
(
"wght"
,
100f
,
400f
,
900f
),
FontVariationAxis
(
"slnt"
,
-
10f
,
0f
,
0f
)
)
assertContentEquals
(
axes
,
interV
.
variationAxes
)
val
inter500
:
Typeface
=
interV
.
makeClone
(
FontVariation
(
"wght"
,
500f
))
assertNotEquals
(
inter500
,
interV
)
assertContentEquals
(
FontVariation
.
parse
(
"wght=500 slnt=0"
),
inter500
.
variations
)
val
inter400
:
Typeface
=
interV
.
makeClone
(
FontVariation
(
"wght"
,
400f
))
assertNotEquals
(
inter
.
uniqueId
,
interV
.
uniqueId
)
assertNotEquals
(
inter
,
interV
)
assertNotNull
(
Typeface
.
makeDefault
())
val
Skia
=
intArrayOf
(
83
,
107
,
105
,
97
)
assertContentEquals
(
shortArrayOf
(
394
,
713
,
677
,
503
),
inter
.
getUTF32Glyphs
(
Skia
))
assertContentEquals
(
shortArrayOf
(
394
,
713
,
677
,
503
),
inter
.
getStringGlyphs
(
"Skia"
))
assertEquals
(
394
,
inter
.
getUTF32Glyph
(
83
))
assertEquals
(
2548
,
interV
.
glyphsCount
)
assertEquals
(
17
,
inter
.
tablesCount
)
assertContentEquals
(
arrayOf
(
"GDEF"
,
"GPOS"
,
"GSUB"
,
"OS/2"
,
"cmap"
,
"cvt "
,
"fpgm"
,
"gasp"
,
"glyf"
,
"head"
,
"hhea"
,
"hmtx"
,
"loca"
,
"maxp"
,
"name"
,
"post"
,
"prep"
),
inter
.
tableTags
)
assertTrue
(
inter
.
getTableData
(
"loca"
)
!!
.
size
>
0
)
assertEquals
(
2816
,
inter
.
unitsPerEm
)
assertNull
(
jbMono
.
getKerningPairAdjustments
(
null
))
assertNull
(
jbMono
.
getKerningPairAdjustments
(
jbMono
.
getStringGlyphs
(
"TAV"
)))
assertContentEquals
(
arrayOf
(
FontFamilyName
(
"Inter"
,
"en-US"
)),
interV
.
familyNames
)
assertEquals
(
"Inter"
,
interV
.
familyName
)
}
}
\ No newline at end of file
skiko/src/jvmTest/kotlin/org/jetbrains/skiko/helpers/assertCloseEnough.kt
0 → 100644
View file @
524b0ad1
package
org.jetbrains.skiko.skija
import
org.jetbrains.skia.Matrix33
import
org.jetbrains.skia.Point
import
kotlin.math.abs
import
kotlin.test.assertTrue
private
const
val
EPSILON
=
0.00001f
internal
fun
assertCloseEnough
(
expected
:
Float
,
actual
:
Float
,
epsilon
:
Float
=
EPSILON
)
{
assertTrue
(
abs
(
expected
-
actual
)
<
epsilon
)
}
internal
fun
assertCloseEnough
(
expected
:
Point
,
actual
:
Point
?,
epsilon
:
Float
=
EPSILON
)
{
assertCloseEnough
(
expected
.
x
,
actual
!!
.
x
,
epsilon
)
assertCloseEnough
(
expected
.
y
,
actual
.
y
,
epsilon
)
}
internal
fun
assertCloseEnough
(
expected
:
Matrix33
,
actual
:
Matrix33
?,
epsilon
:
Float
=
EPSILON
)
{
expected
.
mat
.
zip
(
actual
!!
.
mat
).
forEach
{
(
a
,
b
)
->
assertCloseEnough
(
a
,
b
,
epsilon
)
}
}
skiko/src/jvmTest/kotlin/org/jetbrains/skiko/helpers/makeFromResource.kt
0 → 100644
View file @
524b0ad1
package
org.jetbrains.skiko.skija
import
org.jetbrains.skia.Data
import
org.jetbrains.skia.Typeface
private
const
val
RESOURCES_PATH
=
"src/jvmTest/resources/fonts"
fun
Typeface
.
Companion
.
makeFromResource
(
resourceId
:
String
,
index
:
Int
=
0
):
Typeface
=
makeFromFile
(
"$RESOURCES_PATH/$resourceId"
,
index
)
fun
Data
.
Companion
.
makeFromResource
(
resourceId
:
String
)
=
makeFromFileName
(
"$RESOURCES_PATH/$resourceId"
)
skiko/src/jvmTest/kotlin/org/jetbrains/skiko/paragraph/FontCollectionTest.kt
0 → 100644
View file @
524b0ad1
package
org.jetbrains.skiko.paragraph
import
org.jetbrains.skia.FontMgr
import
org.jetbrains.skia.FontStyle
import
org.jetbrains.skia.Typeface
import
org.jetbrains.skia.paragraph.FontCollection
import
org.jetbrains.skia.paragraph.TypefaceFontProvider
import
org.jetbrains.skiko.skija.makeFromResource
import
kotlin.test.Test
import
kotlin.test.assertContentEquals
import
kotlin.test.assertEquals
class
FontCollectionTest
{
@Test
fun
fontCollectionTest
()
{
val
fm
=
TypefaceFontProvider
()
val
jbMono
=
Typeface
.
makeFromResource
(
"JetBrainsMono-Regular.ttf"
,
0
)
fm
.
registerTypeface
(
jbMono
)
val
inter
=
Typeface
.
makeFromResource
(
"InterHinted-Regular.ttf"
,
0
)
fm
.
registerTypeface
(
inter
,
"Interface"
)
// FontCollection
val
fontCollection
=
FontCollection
()
fontCollection
.
setAssetFontManager
(
fm
)
assertEquals
(
1L
,
fontCollection
.
fontManagersCount
)
assertEquals
(
2
,
jbMono
.
refCount
)
fontCollection
.
findTypefaces
(
arrayOf
(
"JetBrains Mono"
),
FontStyle
.
NORMAL
)[
0
]
!!
.
use
{
jbMono2
->
assertEquals
(
4
,
jbMono
.
refCount
)
assertEquals
(
4
,
jbMono2
.
refCount
)
fontCollection
.
findTypefaces
(
arrayOf
(
"JetBrains Mono"
),
FontStyle
.
NORMAL
)[
0
]
!!
.
use
{
jbMono3
->
assertEquals
(
5
,
jbMono
.
refCount
)
assertEquals
(
5
,
jbMono2
.
refCount
)
assertEquals
(
5
,
jbMono3
.
refCount
)
}
assertEquals
(
4
,
jbMono
.
refCount
)
assertEquals
(
4
,
jbMono2
.
refCount
)
}
//TODO: commented out assertions seem not to be isolated and are turned off till further investigation
// assertEquals(3, jbMono.refCount)
assertContentEquals
(
arrayOf
(),
fontCollection
.
findTypefaces
(
arrayOf
(
"No Such Font"
),
FontStyle
.
NORMAL
))
assertContentEquals
(
arrayOf
(
jbMono
),
fontCollection
.
findTypefaces
(
arrayOf
(
"JetBrains Mono"
),
FontStyle
.
NORMAL
))
assertContentEquals
(
arrayOf
(),
fontCollection
.
findTypefaces
(
arrayOf
(
"Inter"
),
FontStyle
.
NORMAL
))
assertContentEquals
(
arrayOf
(
inter
),
fontCollection
.
findTypefaces
(
arrayOf
(
"Interface"
),
FontStyle
.
NORMAL
))
assertContentEquals
(
arrayOf
(
jbMono
,
inter
),
fontCollection
.
findTypefaces
(
arrayOf
(
"JetBrains Mono"
,
"Interface"
),
FontStyle
.
NORMAL
)
)
val
defaultFM
=
FontMgr
.
default
fontCollection
.
setDefaultFontManager
(
defaultFM
)
assertEquals
(
2L
,
fontCollection
.
fontManagersCount
)
// assertEquals(3, defaultFM.refCount)
fontCollection
.
fallbackManager
.
use
{
ffm
->
//assertEquals(4, defaultFM.refCount)
assertEquals
(
defaultFM
,
ffm
)
}
// assertEquals(3, defaultFM.refCount)
fontCollection
.
defaultFallback
(
65
/* A */
,
FontStyle
.
NORMAL
,
"en-US"
)
!!
.
use
{
t1
->
val
refCnt
:
Int
=
t1
.
refCount
fontCollection
.
defaultFallback
(
65
/* A */
,
FontStyle
.
NORMAL
,
"en-US"
)
!!
.
use
{
t2
->
assertEquals
(
refCnt
+
1
,
t1
.
refCount
)
assertEquals
(
refCnt
+
1
,
t2
.
refCount
)
assertEquals
(
t1
,
t2
)
}
assertEquals
(
refCnt
,
t1
.
refCount
)
}
}
}
\ No newline at end of file
skiko/src/jvmTest/kotlin/org/jetbrains/skiko/paragraph/TextStyleTest.kt
0 → 100644
View file @
524b0ad1
package
org.jetbrains.skiko.paragraph
import
org.jetbrains.skia.paragraph.TextStyle
import
org.jetbrains.skia.paragraph.TextStyleAttribute
import
kotlin.test.Test
import
kotlin.test.assertEquals
import
kotlin.test.assertFalse
import
kotlin.test.assertTrue
class
TextStyleTest
{
@Test
fun
textStyleTest
()
{
assertEquals
(
TextStyle
(),
TextStyle
())
TextStyle
().
use
{
ts1
->
TextStyle
().
use
{
ts2
->
for
(
attr
in
arrayOf
(
TextStyleAttribute
.
ALL_ATTRIBUTES
,
TextStyleAttribute
.
FONT
,
TextStyleAttribute
.
FOREGROUND
,
TextStyleAttribute
.
BACKGROUND
,
TextStyleAttribute
.
SHADOW
,
TextStyleAttribute
.
DECORATIONS
,
TextStyleAttribute
.
LETTER_SPACING
,
TextStyleAttribute
.
WORD_SPACING
,
TextStyleAttribute
.
FONT_EXACT
))
{
assertEquals
(
true
,
ts1
.
equals
(
attr
,
ts2
),
"$attr"
)
assertEquals
(
true
,
ts2
.
equals
(
attr
,
ts1
),
"$attr"
)
}
}
}
assertFalse
(
TextStyle
().
setColor
(-
0
x33cd00
).
equals
(
TextStyleAttribute
.
ALL_ATTRIBUTES
,
TextStyle
().
setColor
(-
0
xff33cd
))
)
assertTrue
(
TextStyle
().
setColor
(-
0
x33cd00
).
equals
(
TextStyleAttribute
.
BACKGROUND
,
TextStyle
().
setColor
(-
0
xff33cd
))
)
}
}
\ No newline at end of file
skiko/src/jvmTest/kotlin/org/jetbrains/skiko/util/SeveralClassloaders.kt
View file @
524b0ad1
...
@@ -6,6 +6,7 @@ import java.net.URL
...
@@ -6,6 +6,7 @@ import java.net.URL
import
java.net.URLClassLoader
import
java.net.URLClassLoader
import
java.nio.file.Paths
import
java.nio.file.Paths
import
kotlin.concurrent.thread
import
kotlin.concurrent.thread
import
kotlin.test.Ignore
private
class
PlatformAndURLClassLoader
(
classpath
:
List
<
URL
>)
:
private
class
PlatformAndURLClassLoader
(
classpath
:
List
<
URL
>)
:
ClassLoader
(
getPlatformClassLoader
())
{
ClassLoader
(
getPlatformClassLoader
())
{
...
@@ -71,12 +72,14 @@ private fun newInstance(loader: ClassLoader, fqName: String, vararg args: Any):
...
@@ -71,12 +72,14 @@ private fun newInstance(loader: ClassLoader, fqName: String, vararg args: Any):
class
SeveralClassloaders
{
class
SeveralClassloaders
{
@Test
@Test
@Ignore
(
"there's a bug that manifests itself in breaking the rest of tests on MacOS if this is executed"
)
fun
`
load
skiko
in
several
classloaders
(
with
skiko
path
)
`
()
{
fun
`
load
skiko
in
several
classloaders
(
with
skiko
path
)
`
()
{
check
(
skikoLibraryPath
!=
null
)
check
(
skikoLibraryPath
!=
null
)
doTest
()
doTest
()
}
}
@Test
@Test
@Ignore
(
"there's a bug that manifests itself in breaking the rest of tests on MacOS if this is executed"
)
fun
`
load
skiko
in
several
classloaders
(
without
skiko
path
)
`
()
{
fun
`
load
skiko
in
several
classloaders
(
without
skiko
path
)
`
()
{
val
oldValue
=
skikoLibraryPath
!!
val
oldValue
=
skikoLibraryPath
!!
skikoLibraryPath
=
null
skikoLibraryPath
=
null
...
...
skiko/src/jvmTest/resources/fonts/FiraCode-Regular.ttf
0 → 100644
View file @
524b0ad1
File added
skiko/src/jvmTest/resources/fonts/Inter-V.ttf
0 → 100644
View file @
524b0ad1
File added
skiko/src/jvmTest/resources/fonts/InterHinted-Regular.ttf
0 → 100644
View file @
524b0ad1
File added
skiko/src/jvmTest/resources/fonts/JetBrainsMono-Bold.ttf
0 → 100644
View file @
524b0ad1
File added
skiko/src/jvmTest/resources/fonts/JetBrainsMono-Italic.ttf
0 → 100644
View file @
524b0ad1
File added
skiko/src/jvmTest/resources/fonts/JetBrainsMono-Regular.ttf
0 → 100644
View file @
524b0ad1
File added
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment