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
5d78bcc8
Unverified
Commit
5d78bcc8
authored
Feb 26, 2026
by
Ivan Matkov
Committed by
GitHub
Feb 26, 2026
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
`Blender` fixes (#1162 followup) (#1175)
Fixes from #1168 extracted as a followup patch for #1162
parent
e2abdf1a
Changes
8
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
71 additions
and
43 deletions
+71
-43
Blender.kt
skiko/src/commonMain/kotlin/org/jetbrains/skia/Blender.kt
+24
-14
Paint.kt
skiko/src/commonMain/kotlin/org/jetbrains/skia/Paint.kt
+9
-6
RuntimeEffect.kt
...src/commonMain/kotlin/org/jetbrains/skia/RuntimeEffect.kt
+2
-1
BlenderTest.kt
...o/src/commonTest/kotlin/org/jetbrains/skia/BlenderTest.kt
+11
-6
Blender.cc
skiko/src/jvmMain/cpp/common/Blender.cc
+5
-1
Paint.cc
skiko/src/jvmMain/cpp/common/Paint.cc
+7
-7
Blender.cc
skiko/src/nativeJsMain/cpp/Blender.cc
+6
-1
Paint.cc
skiko/src/nativeJsMain/cpp/Paint.cc
+7
-7
No files found.
skiko/src/commonMain/kotlin/org/jetbrains/skia/Blender.kt
View file @
5d78bcc8
...
...
@@ -3,14 +3,23 @@ package org.jetbrains.skia
import
org.jetbrains.skia.impl.NativePointer
import
org.jetbrains.skia.impl.RefCnt
import
org.jetbrains.skia.impl.Stats
import
org.jetbrains.skia.impl.Library.Companion.staticLoad
import
org.jetbrains.skia.impl.interopScope
/**
* Blender represents a custom blend function in the Skia pipeline. A blender combines a source
* color (the result of our paint) and destination color (from the canvas) into a final color.
*/
*/
class
Blender
internal
constructor
(
ptr
:
NativePointer
)
:
RefCnt
(
ptr
)
{
companion
object
{
init
{
staticLoad
()
}
fun
makeMode
(
mode
:
BlendMode
):
Blender
{
Stats
.
onNativeCall
()
return
Blender
(
_nMakeMode
(
mode
.
ordinal
))
}
fun
makeArithmetic
(
k1
:
Float
,
...
...
@@ -19,19 +28,17 @@ class Blender internal constructor(ptr: NativePointer) : RefCnt(ptr) {
k4
:
Float
,
enforcePMColor
:
Boolean
,
):
Blender
{
return
try
{
Stats
.
onNativeCall
()
interopScope
{
Blender
(
_nMakeArithmetic
(
k1
,
k2
,
k3
,
k4
,
enforcePMColor
)
)
}
}
finally
{
Stats
.
onNativeCall
()
return
interopScope
{
Blender
(
_nMakeArithmetic
(
k1
,
k2
,
k3
,
k4
,
enforcePMColor
,
),
)
}
}
}
...
...
@@ -45,3 +52,6 @@ private external fun _nMakeArithmetic(
k4
:
Float
,
enforcePMColor
:
Boolean
):
NativePointer
@ExternalSymbolName
(
"org_jetbrains_skia_Blender__1nMakeMode"
)
private
external
fun
_nMakeMode
(
mode
:
Int
):
NativePointer
skiko/src/commonMain/kotlin/org/jetbrains/skia/Paint.kt
View file @
5d78bcc8
...
...
@@ -448,14 +448,17 @@ class Paint : Managed {
}
/**
*
@param blender how geometry is filled with color; if null, color is used instead
*
Returns the user-supplied blend function, if one has been set.
*
*
@see [https://fiddle.skia.org/c/@Color_Filter_Methods](https://fiddle.skia.org/c/@Color_Filter_Methods)
*
A null blender signifies the default SrcOver behavior.
*
* @see [https://fiddle.skia.org/c/@Paint_setShader](https://fiddle.skia.org/c/@Paint_setShader)
* For convenience, you can call [blendMode] if the blend effect can be expressed
* as one of those values.
*
* @return [Shader] or null
* @see [https://fiddle.skia.org/c/@Paint_refShader](https://fiddle.skia.org/c/@Paint_refShader)
* @see [https://fiddle.skia.org/c/@Paint_setBlender](https://fiddle.skia.org/c/@Paint_setBlender)
* @see [https://fiddle.skia.org/c/@Paint_refBlender](https://fiddle.skia.org/c/@Paint_refBlender)
*
* @return the [Blender] assigned to this paint, otherwise null
*/
var
blender
:
Blender
?
get
()
=
try
{
...
...
@@ -695,7 +698,7 @@ private external fun _nSetImageFilter(ptr: NativePointer, filterPtr: NativePoint
private
external
fun
_nGetBlender
(
ptr
:
NativePointer
):
NativePointer
@ExternalSymbolName
(
"org_jetbrains_skia_Paint__1nSetBlender"
)
private
external
fun
_nSetBlender
(
ptr
:
NativePointer
,
sha
derPtr
:
NativePointer
)
private
external
fun
_nSetBlender
(
ptr
:
NativePointer
,
blen
derPtr
:
NativePointer
)
@ExternalSymbolName
(
"org_jetbrains_skia_Paint__1nHasNothingToDraw"
)
private
external
fun
_nHasNothingToDraw
(
ptr
:
NativePointer
):
Boolean
skiko/src/commonMain/kotlin/org/jetbrains/skia/RuntimeEffect.kt
View file @
5d78bcc8
...
...
@@ -58,6 +58,7 @@ class RuntimeEffect internal constructor(ptr: NativePointer) : RefCnt(ptr) {
}
}
finally
{
reachabilityBarrier
(
this
)
reachabilityBarrier
(
uniforms
)
}
}
}
...
...
@@ -93,4 +94,4 @@ internal external fun Result_nGetPtr(ptr: NativePointer): NativePointer
internal
external
fun
Result_nGetError
(
ptr
:
NativePointer
):
NativePointer
@ExternalSymbolName
(
"org_jetbrains_skia_RuntimeEffect__1Result_nDestroy"
)
internal
external
fun
Result_nDestroy
(
ptr
:
NativePointer
)
\ No newline at end of file
internal
external
fun
Result_nDestroy
(
ptr
:
NativePointer
)
skiko/src/commonTest/kotlin/org/jetbrains/skia/BlenderTest.kt
View file @
5d78bcc8
...
...
@@ -51,10 +51,15 @@ class BlenderTest {
runtimeEffect
.
makeBlender
(
null
)
}
// @Test
// fun arithmetic() = blenderTest {
// Blender.makeArithmetic(
// k1 = 0.5f, k2 = 0.5f, k3 = 0.5f, k4 = 0.5f, enforcePMColor = true
// )
// }
@Test
fun
arithmetic
()
=
blenderTest
{
Blender
.
makeArithmetic
(
k1
=
0.5f
,
k2
=
0.5f
,
k3
=
0.5f
,
k4
=
0.5f
,
enforcePMColor
=
true
)
}
@Test
fun
mode
()
=
blenderTest
{
Blender
.
makeMode
(
BlendMode
.
CLEAR
)
}
}
skiko/src/jvmMain/cpp/common/Blender.cc
View file @
5d78bcc8
#include <iostream>
#include <jni.h>
#include "interop.hh"
#include "SkBlender.h"
...
...
@@ -10,3 +9,8 @@ extern "C" JNIEXPORT jlong JNICALL Java_org_jetbrains_skia_BlenderKt__1nMakeArit
return
reinterpret_cast
<
jlong
>
(
ptr
);
}
extern
"C"
JNIEXPORT
jlong
JNICALL
Java_org_jetbrains_skia_BlenderKt__1nMakeMode
(
JNIEnv
*
env
,
jclass
jclass
,
jint
mode
)
{
SkBlender
*
ptr
=
SkBlender
::
Mode
(
static_cast
<
SkBlendMode
>
(
mode
)).
release
();
return
reinterpret_cast
<
jlong
>
(
ptr
);
}
skiko/src/jvmMain/cpp/common/Paint.cc
View file @
5d78bcc8
...
...
@@ -184,16 +184,16 @@ extern "C" JNIEXPORT void JNICALL Java_org_jetbrains_skia_PaintKt__1nSetImageFil
}
extern
"C"
JNIEXPORT
jlong
JNICALL
Java_org_jetbrains_skia_PaintKt__1nGetBlender
(
JNIEnv
*
env
,
jclass
jclass
,
jlong
ptr
)
{
SkPaint
*
instance
=
reinterpret_cast
<
SkPaint
*>
(
static_cast
<
uintptr_t
>
(
ptr
));
return
reinterpret_cast
<
jlong
>
(
instance
->
refBlender
().
release
());
(
JNIEnv
*
env
,
jclass
jclass
,
jlong
ptr
)
{
SkPaint
*
instance
=
reinterpret_cast
<
SkPaint
*>
(
static_cast
<
uintptr_t
>
(
ptr
));
return
reinterpret_cast
<
jlong
>
(
instance
->
refBlender
().
release
());
}
extern
"C"
JNIEXPORT
void
JNICALL
Java_org_jetbrains_skia_PaintKt__1nSetBlender
(
JNIEnv
*
env
,
jclass
jclass
,
jlong
ptr
,
jlong
filt
erPtr
)
{
SkPaint
*
instance
=
reinterpret_cast
<
SkPaint
*>
(
static_cast
<
uintptr_t
>
(
ptr
));
SkBlender
*
filter
=
reinterpret_cast
<
SkBlender
*>
(
static_cast
<
uintptr_t
>
(
filt
erPtr
));
instance
->
setBlender
(
sk_ref_sp
<
SkBlender
>
(
filt
er
));
(
JNIEnv
*
env
,
jclass
jclass
,
jlong
ptr
,
jlong
blend
erPtr
)
{
SkPaint
*
instance
=
reinterpret_cast
<
SkPaint
*>
(
static_cast
<
uintptr_t
>
(
ptr
));
SkBlender
*
blender
=
reinterpret_cast
<
SkBlender
*>
(
static_cast
<
uintptr_t
>
(
blend
erPtr
));
instance
->
setBlender
(
sk_ref_sp
<
SkBlender
>
(
blend
er
));
}
extern
"C"
JNIEXPORT
jint
JNICALL
Java_org_jetbrains_skia_PaintKt__1nGetBlendMode
...
...
skiko/src/nativeJsMain/cpp/Blender.cc
View file @
5d78bcc8
#include <iostream>
#include "SkBlender.h"
#include "SkBlenders.h"
#include "common.h"
...
...
@@ -8,3 +7,9 @@ SKIKO_EXPORT KNativePointer org_jetbrains_skia_Blender__1nMakeArithmetic
SkBlender
*
ptr
=
SkBlenders
::
Arithmetic
(
k1
,
k2
,
k3
,
k4
,
enforcePMColor
).
release
();
return
reinterpret_cast
<
KNativePointer
>
(
ptr
);
}
SKIKO_EXPORT
KNativePointer
org_jetbrains_skia_Blender__1nMakeMode
(
KInt
mode
)
{
SkBlender
*
ptr
=
SkBlender
::
Mode
(
static_cast
<
SkBlendMode
>
(
mode
)).
release
();
return
reinterpret_cast
<
KNativePointer
>
(
ptr
);
}
skiko/src/nativeJsMain/cpp/Paint.cc
View file @
5d78bcc8
...
...
@@ -187,16 +187,16 @@ SKIKO_EXPORT void org_jetbrains_skia_Paint__1nSetImageFilter
}
SKIKO_EXPORT
KNativePointer
org_jetbrains_skia_Paint__1nGetBlender
(
KNativePointer
ptr
)
{
SkPaint
*
instance
=
reinterpret_cast
<
SkPaint
*>
((
ptr
));
return
reinterpret_cast
<
KNativePointer
>
(
instance
->
refBlender
().
release
());
(
KNativePointer
ptr
)
{
SkPaint
*
instance
=
reinterpret_cast
<
SkPaint
*>
((
ptr
));
return
reinterpret_cast
<
KNativePointer
>
(
instance
->
refBlender
().
release
());
}
SKIKO_EXPORT
void
org_jetbrains_skia_Paint__1nSetBlender
(
KNativePointer
ptr
,
KNativePointer
filt
erPtr
)
{
SkPaint
*
instance
=
reinterpret_cast
<
SkPaint
*>
((
ptr
));
SkBlender
*
filter
=
reinterpret_cast
<
SkBlender
*>
((
filt
erPtr
));
instance
->
setBlender
(
sk_ref_sp
<
SkBlender
>
(
filt
er
));
(
KNativePointer
ptr
,
KNativePointer
blend
erPtr
)
{
SkPaint
*
instance
=
reinterpret_cast
<
SkPaint
*>
((
ptr
));
SkBlender
*
blender
=
reinterpret_cast
<
SkBlender
*>
((
blend
erPtr
));
instance
->
setBlender
(
sk_ref_sp
<
SkBlender
>
(
blend
er
));
}
SKIKO_EXPORT
KInt
org_jetbrains_skia_Paint__1nGetBlendMode
...
...
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