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
a51e1cf9
Unverified
Commit
a51e1cf9
authored
Feb 07, 2023
by
francescotescari
Committed by
GitHub
Feb 07, 2023
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
feat: add make shader to runtimeShaderBuilder (#659)
parent
82445626
Changes
4
Show whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
105 additions
and
0 deletions
+105
-0
RuntimeShaderBuilder.kt
...monMain/kotlin/org/jetbrains/skia/RuntimeShaderBuilder.kt
+14
-0
RuntimeShaderBuilderTest.kt
...est/kotlin/org/jetbrains/skia/RuntimeShaderBuilderTest.kt
+74
-0
RuntimeShaderBuilder.cc
skiko/src/jvmMain/cpp/common/RuntimeShaderBuilder.cc
+9
-0
RuntimeShaderBuilder.cc
skiko/src/nativeJsMain/cpp/RuntimeShaderBuilder.cc
+8
-0
No files found.
skiko/src/commonMain/kotlin/org/jetbrains/skia/RuntimeShaderBuilder.kt
View file @
a51e1cf9
...
@@ -124,6 +124,17 @@ class RuntimeShaderBuilder internal constructor(ptr: NativePointer) : Managed(pt
...
@@ -124,6 +124,17 @@ class RuntimeShaderBuilder internal constructor(ptr: NativePointer) : Managed(pt
reachabilityBarrier
(
colorFilter
)
reachabilityBarrier
(
colorFilter
)
}
}
}
}
fun
makeShader
(
localMatrix
:
Matrix33
?
=
null
):
Shader
{
Stats
.
onNativeCall
()
return
try
{
interopScope
{
Shader
(
_nMakeShader
(
_ptr
,
toInterop
(
localMatrix
?.
mat
)))
}
}
finally
{
reachabilityBarrier
(
this
)
}
}
}
}
@ExternalSymbolName
(
"org_jetbrains_skia_RuntimeShaderBuilder__1nMakeFromRuntimeEffect"
)
@ExternalSymbolName
(
"org_jetbrains_skia_RuntimeShaderBuilder__1nMakeFromRuntimeEffect"
)
...
@@ -170,3 +181,6 @@ private external fun _nChildShader(builderPtr: NativePointer, uniformName: Inter
...
@@ -170,3 +181,6 @@ private external fun _nChildShader(builderPtr: NativePointer, uniformName: Inter
@ExternalSymbolName
(
"org_jetbrains_skia_RuntimeShaderBuilder__1nChildColorFilter"
)
@ExternalSymbolName
(
"org_jetbrains_skia_RuntimeShaderBuilder__1nChildColorFilter"
)
private
external
fun
_nChildColorFilter
(
builderPtr
:
NativePointer
,
uniformName
:
InteropPointer
,
colorFilterPtr
:
NativePointer
)
private
external
fun
_nChildColorFilter
(
builderPtr
:
NativePointer
,
uniformName
:
InteropPointer
,
colorFilterPtr
:
NativePointer
)
@ExternalSymbolName
(
"org_jetbrains_skia_RuntimeShaderBuilder__1nMakeShader"
)
private
external
fun
_nMakeShader
(
builderPtr
:
NativePointer
,
localMatrix
:
InteropPointer
):
NativePointer
skiko/src/commonTest/kotlin/org/jetbrains/skia/RuntimeShaderBuilderTest.kt
0 → 100644
View file @
a51e1cf9
package
org.jetbrains.skia
import
org.jetbrains.skia.impl.use
import
org.jetbrains.skiko.tests.runTest
import
kotlin.test.Test
class
RuntimeShaderBuilderTest
{
private
fun
renderAndReturnBytes
(
shader
:
Shader
?
=
null
):
ByteArray
{
return
Surface
.
makeRasterN32Premul
(
20
,
20
).
use
{
val
paint
=
Paint
().
apply
{
setStroke
(
true
)
strokeWidth
=
2f
}
val
region
=
Region
().
apply
{
op
(
IRect
(
3
,
3
,
18
,
18
),
Region
.
Op
.
UNION
)
}
paint
.
shader
=
shader
it
.
canvas
.
drawRegion
(
region
,
paint
)
val
image
=
it
.
makeImageSnapshot
()
Bitmap
.
makeFromImage
(
image
).
readPixels
()
!!
}
}
private
fun
shaderTest
(
shader
:
()
->
Shader
)
=
runTest
{
// We just test that rendering with the given shader is successful.
renderAndReturnBytes
(
shader
=
shader
())
}
@Test
fun
customShader
()
=
shaderTest
{
val
shaderSksl
=
"""
uniform shader content;
uniform float greenAmount;
vec4 main(vec2 coord) {
vec4 c = content.eval(coord);
c.r += 0.5;
c.g = greenAmount;
c.b -= 0.5;
return c;
}
"""
val
runtimeEffect
=
RuntimeEffect
.
makeForShader
(
shaderSksl
)
val
runtimeShaderBuilder
=
RuntimeShaderBuilder
(
runtimeEffect
)
runtimeShaderBuilder
.
child
(
"content"
,
Shader
.
makeColor
(
Color
.
BLUE
))
runtimeShaderBuilder
.
uniform
(
"greenAmount"
,
0.7f
)
runtimeShaderBuilder
.
makeShader
()
}
@Test
fun
customShaderWithMatrix
()
=
shaderTest
{
val
shaderSksl
=
"""
uniform shader content;
uniform vec2 baValue;
vec4 main(vec2 coord) {
vec4 c = content.eval(coord);
c.rg += coord;
c.ba = baValue;
return c;
}
"""
val
runtimeEffect
=
RuntimeEffect
.
makeForShader
(
shaderSksl
)
val
runtimeShaderBuilder
=
RuntimeShaderBuilder
(
runtimeEffect
)
runtimeShaderBuilder
.
child
(
"content"
,
Shader
.
makeColor
(
Color
.
MAGENTA
))
runtimeShaderBuilder
.
uniform
(
"baValue"
,
0.6f
,
0.2f
)
runtimeShaderBuilder
.
makeShader
(
Matrix33
.
makeRotate
(
45f
))
}
}
skiko/src/jvmMain/cpp/common/RuntimeShaderBuilder.cc
View file @
a51e1cf9
...
@@ -123,3 +123,12 @@ Java_org_jetbrains_skia_RuntimeShaderBuilderKt__1nChildColorFilter
...
@@ -123,3 +123,12 @@ Java_org_jetbrains_skia_RuntimeShaderBuilderKt__1nChildColorFilter
sk_sp
<
SkColorFilter
>
colorFilter
=
sk_ref_sp
<
SkColorFilter
>
(
reinterpret_cast
<
SkColorFilter
*>
(
static_cast
<
uintptr_t
>
(
childColorFilterPtr
)));
sk_sp
<
SkColorFilter
>
colorFilter
=
sk_ref_sp
<
SkColorFilter
>
(
reinterpret_cast
<
SkColorFilter
*>
(
static_cast
<
uintptr_t
>
(
childColorFilterPtr
)));
runtimeShaderBuilder
->
child
(
skString
(
env
,
childName
).
c_str
())
=
colorFilter
;
runtimeShaderBuilder
->
child
(
skString
(
env
,
childName
).
c_str
())
=
colorFilter
;
}
}
extern
"C"
JNIEXPORT
jlong
JNICALL
Java_org_jetbrains_skia_RuntimeShaderBuilderKt__1nMakeShader
(
JNIEnv
*
env
,
jclass
jclass
,
jlong
builderPtr
,
jfloatArray
localMatrixArr
)
{
SkRuntimeShaderBuilder
*
runtimeShaderBuilder
=
jlongToPtr
<
SkRuntimeShaderBuilder
*>
(
builderPtr
);
std
::
unique_ptr
<
SkMatrix
>
localMatrix
=
skMatrix
(
env
,
localMatrixArr
);
sk_sp
<
SkShader
>
shader
=
runtimeShaderBuilder
->
makeShader
(
localMatrix
.
get
());
return
reinterpret_cast
<
jlong
>
(
shader
.
release
());
}
skiko/src/nativeJsMain/cpp/RuntimeShaderBuilder.cc
View file @
a51e1cf9
...
@@ -103,3 +103,11 @@ SKIKO_EXPORT void org_jetbrains_skia_RuntimeShaderBuilder__1nChildColorFilter
...
@@ -103,3 +103,11 @@ SKIKO_EXPORT void org_jetbrains_skia_RuntimeShaderBuilder__1nChildColorFilter
sk_sp
<
SkColorFilter
>
colorFilter
=
sk_ref_sp
<
SkColorFilter
>
(
reinterpret_cast
<
SkColorFilter
*>
(
childColorFilterPtr
));
sk_sp
<
SkColorFilter
>
colorFilter
=
sk_ref_sp
<
SkColorFilter
>
(
reinterpret_cast
<
SkColorFilter
*>
(
childColorFilterPtr
));
runtimeShaderBuilder
->
child
(
skString
(
childName
).
c_str
())
=
colorFilter
;
runtimeShaderBuilder
->
child
(
skString
(
childName
).
c_str
())
=
colorFilter
;
}
}
SKIKO_EXPORT
KNativePointer
org_jetbrains_skia_RuntimeShaderBuilder__1nMakeShader
(
KNativePointer
builderPtr
,
KFloat
*
localMatrixArr
)
{
SkRuntimeShaderBuilder
*
runtimeShaderBuilder
=
reinterpret_cast
<
SkRuntimeShaderBuilder
*>
(
builderPtr
);
std
::
unique_ptr
<
SkMatrix
>
localMatrix
=
skMatrix
(
localMatrixArr
);
sk_sp
<
SkShader
>
shader
=
runtimeShaderBuilder
->
makeShader
(
localMatrix
.
get
());
return
reinterpret_cast
<
KNativePointer
>
(
shader
.
release
());
}
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