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
8be256ce
Unverified
Commit
8be256ce
authored
Nov 15, 2021
by
Aleksandr Veselov
Committed by
GitHub
Nov 15, 2021
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Implement PaintFilterCanvas for native (#377)
parent
5d25c129
Changes
6
Show whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
116 additions
and
29 deletions
+116
-29
PaintFilterCanvas.kt
...commonMain/kotlin/org/jetbrains/skia/PaintFilterCanvas.kt
+11
-8
PaintFilterCanvasTest.kt
...onTest/kotlin/org/jetbrains/skia/PaintFilterCanvasTest.kt
+36
-0
PaintFilterCanvas.cc
skiko/src/jvmMain/cpp/common/PaintFilterCanvas.cc
+3
-3
PaintFilterCanvas.jvm.kt
...vmMain/kotlin/org/jetbrains/skia/PaintFilterCanvas.jvm.kt
+9
-0
PaintFilterCanvas.cc
skiko/src/nativeJsMain/cpp/PaintFilterCanvas.cc
+43
-18
PaintFilterCanvas.nativejs.kt
...n/kotlin/org/jetbrains/skia/PaintFilterCanvas.nativejs.kt
+14
-0
No files found.
skiko/src/commonMain/kotlin/org/jetbrains/skia/PaintFilterCanvas.kt
View file @
8be256ce
package
org.jetbrains.skia
import
org.jetbrains.skia.impl.*
import
org.jetbrains.skia.impl.Library.Companion.staticLoad
import
org.jetbrains.skia.impl.NativePointer
import
org.jetbrains.skia.impl.Stats
import
org.jetbrains.skia.impl.getPtr
import
org.jetbrains.skia.impl.reachabilityBarrier
/**
* A utility proxy base class for implementing draw/paint filters.
*/
abstract
class
PaintFilterCanvas
(
canvas
:
Canvas
,
unrollDrawable
:
Boolean
)
:
abstract
class
PaintFilterCanvas
(
private
val
canvas
:
Canvas
,
unrollDrawable
:
Boolean
)
:
Canvas
(
PaintFilterCanvas_nMake
(
getPtr
(
canvas
),
unrollDrawable
),
true
,
canvas
)
{
companion
object
{
init
{
...
...
@@ -37,15 +34,21 @@ abstract class PaintFilterCanvas(canvas: Canvas, unrollDrawable: Boolean) :
*/
init
{
Stats
.
onNativeCall
()
_nAttachToJava
(
_ptr
)
doInit
(
_ptr
)
Stats
.
onNativeCall
()
reachabilityBarrier
(
canvas
)
}
}
internal
expect
fun
PaintFilterCanvas
.
doInit
(
ptr
:
NativePointer
)
@ExternalSymbolName
(
"org_jetbrains_skia_PaintFilterCanvas__1nMake"
)
private
external
fun
PaintFilterCanvas_nMake
(
canvasPtr
:
NativePointer
,
unrollDrawable
:
Boolean
):
NativePointer
@ExternalSymbolName
(
"org_jetbrains_skia_PaintFilterCanvas__1nAttachToJava"
)
external
fun
_nAttachToJava
(
canvasPtr
:
NativePointer
)
// Native/JS only
@ExternalSymbolName
(
"org_jetbrains_skia_PaintFilterCanvas__1nInit"
)
internal
external
fun
PaintFilterCanvas_nInit
(
ptr
:
NativePointer
,
onFilter
:
InteropPointer
)
@ExternalSymbolName
(
"org_jetbrains_skia_PaintFilterCanvas__1nGetOnFilterPaint"
)
internal
external
fun
PaintFilterCanvas_nGetOnFilterPaint
(
ptr
:
NativePointer
):
NativePointer
skiko/src/commonTest/kotlin/org/jetbrains/skia/PaintFilterCanvasTest.kt
0 → 100644
View file @
8be256ce
package
org.jetbrains.skia
import
kotlin.test.Test
import
kotlin.test.assertEquals
import
kotlin.test.assertTrue
class
PaintFilterCanvasTest
{
@Test
fun
canFilter
()
{
val
surface
=
Surface
.
makeRasterN32Premul
(
16
,
16
)
val
canvas
=
surface
.
canvas
var
called
=
false
val
canvasFilterRed
=
object
:
PaintFilterCanvas
(
canvas
,
true
)
{
override
fun
onFilter
(
paint
:
Paint
):
Boolean
{
called
=
true
return
paint
.
color
==
Color
.
RED
}
}
canvasFilterRed
.
drawRect
(
Rect
(
0f
,
0f
,
8f
,
8f
),
Paint
().
apply
{
color
=
Color
.
RED
}
)
canvasFilterRed
.
drawRect
(
Rect
(
0f
,
0f
,
8f
,
8f
),
Paint
().
apply
{
color
=
Color
.
BLUE
}
)
// Must not be drawn
val
pixels
=
Bitmap
.
makeFromImage
(
surface
.
makeImageSnapshot
())
assertTrue
(
called
)
assertEquals
(
Color
.
RED
,
pixels
.
getColor
(
2
,
2
))
}
}
\ No newline at end of file
skiko/src/jvmMain/cpp/common/PaintFilterCanvas.cc
View file @
8be256ce
...
...
@@ -32,11 +32,11 @@ protected:
}
private
:
float
unrollDrawable
;
bool
unrollDrawable
;
};
extern
"C"
JNIEXPORT
void
JNICALL
Java_org_jetbrains_skia_PaintFilterCanvas
Kt__1nAttachToJava
(
JNIEnv
*
env
,
j
object
jobj
,
jlong
canvasPtr
,
jboolean
unrollDrawable
)
{
extern
"C"
JNIEXPORT
void
JNICALL
Java_org_jetbrains_skia_PaintFilterCanvas
_1jvmKt_PaintFilterCanvas_1nInit
(
JNIEnv
*
env
,
j
class
jclass
,
jobject
jobj
,
jlong
canvasPtr
)
{
SkijaPaintFilterCanvas
*
canvas
=
reinterpret_cast
<
SkijaPaintFilterCanvas
*>
(
static_cast
<
uintptr_t
>
(
canvasPtr
));
canvas
->
jobj
=
skija
::
PaintFilterCanvas
::
attach
(
env
,
jobj
);
}
...
...
skiko/src/jvmMain/kotlin/org/jetbrains/skia/PaintFilterCanvas.jvm.kt
0 → 100644
View file @
8be256ce
package
org.jetbrains.skia
import
org.jetbrains.skia.impl.NativePointer
internal
actual
fun
PaintFilterCanvas
.
doInit
(
ptr
:
NativePointer
)
{
PaintFilterCanvas_nInit
(
this
,
ptr
)
}
private
external
fun
PaintFilterCanvas_nInit
(
thisPtr
:
PaintFilterCanvas
,
canvasPtr
:
NativePointer
)
skiko/src/nativeJsMain/cpp/PaintFilterCanvas.cc
View file @
8be256ce
...
...
@@ -7,33 +7,58 @@
#include "SkPaintFilterCanvas.h"
#include "common.h"
class
SkijaPaintFilterCanvas
:
public
SkPaintFilterCanvas
{
public
:
SkijaPaintFilterCanvas
(
SkCanvas
*
canvas
,
bool
unrollDrawable
)
:
SkPaintFilterCanvas
(
canvas
),
unrollDrawable
(
unrollDrawable
),
_onFilter
(
nullptr
),
_onFilterPaint
(
nullptr
)
{}
SKIKO_EXPORT
void
org_jetbrains_skia_PaintFilterCanvas__1nAttachToJava
(
KNativePointer
canvasPtr
,
KBoolean
unrollDrawable
)
{
TODO
(
"implement org_jetbrains_skia_PaintFilterCanvas__1nAttachToJava"
);
}
SkPaint
*
onFilterPaint
()
const
{
return
_onFilterPaint
;
}
#if 0
SKIKO_EXPORT void org_jetbrains_skia_PaintFilterCanvas__1nAttachToJava
(KNativePointer canvasPtr, KBoolean unrollDrawable) {
SkijaPaintFilterCanvas* canvas = reinterpret_cast<SkijaPaintFilterCanvas*>((canvasPtr));
canvas->jobj = skija::PaintFilterCanvas::attach(env, jobj);
}
#endif
void
init
(
KInteropPointer
onFilter
)
{
_onFilter
=
KBooleanCallback
(
onFilter
);
}
protected
:
bool
onFilter
(
SkPaint
&
paint
)
const
override
{
_onFilterPaint
=
&
paint
;
KBoolean
result
=
_onFilter
();
_onFilterPaint
=
nullptr
;
return
static_cast
<
bool
>
(
result
);
}
void
onDrawDrawable
(
SkDrawable
*
drawable
,
const
SkMatrix
*
matrix
)
override
{
if
(
unrollDrawable
)
{
drawable
->
draw
(
this
,
matrix
);
}
else
{
SkPaintFilterCanvas
::
onDrawDrawable
(
drawable
,
matrix
);
}
}
private
:
KBooleanCallback
_onFilter
;
mutable
SkPaint
*
_onFilterPaint
;
bool
unrollDrawable
;
};
SKIKO_EXPORT
KNativePointer
org_jetbrains_skia_PaintFilterCanvas__1nMake
(
KNativePointer
canvasPtr
,
KBoolean
unrollDrawable
)
{
TODO
(
"implement org_jetbrains_skia_PaintFilterCanvas__1nMake"
);
SKIKO_EXPORT
void
org_jetbrains_skia_PaintFilterCanvas__1nInit
(
KNativePointer
canvasPtr
,
KInteropPointer
onFilter
)
{
SkijaPaintFilterCanvas
*
canvas
=
reinterpret_cast
<
SkijaPaintFilterCanvas
*>
((
canvasPtr
));
canvas
->
init
(
onFilter
);
}
#if 0
SKIKO_EXPORT
KNativePointer
org_jetbrains_skia_PaintFilterCanvas__1nMake
(
KNativePointer
canvasPtr
,
KBoolean
unrollDrawable
)
{
SkCanvas
*
canvas
=
reinterpret_cast
<
SkCanvas
*>
((
canvasPtr
));
SkijaPaintFilterCanvas
*
filterCanvas
=
new
SkijaPaintFilterCanvas
(
canvas
,
unrollDrawable
);
return
reinterpret_cast
<
KNativePointer
>
(
filterCanvas
);
}
#endif
SKIKO_EXPORT
KNativePointer
org_jetbrains_skia_PaintFilterCanvas__1nGetOnFilterPaint
(
KNativePointer
canvasPtr
)
{
SkijaPaintFilterCanvas
*
canvas
=
reinterpret_cast
<
SkijaPaintFilterCanvas
*>
((
canvasPtr
));
return
reinterpret_cast
<
KNativePointer
>
(
canvas
->
onFilterPaint
());
}
skiko/src/nativeJsMain/kotlin/org/jetbrains/skia/PaintFilterCanvas.nativejs.kt
0 → 100644
View file @
8be256ce
package
org.jetbrains.skia
import
org.jetbrains.skia.impl.NativePointer
import
org.jetbrains.skia.impl.interopScope
internal
actual
fun
PaintFilterCanvas
.
doInit
(
ptr
:
NativePointer
)
{
interopScope
{
val
onFilter
=
virtualBoolean
{
val
paint
=
Paint
(
PaintFilterCanvas_nGetOnFilterPaint
(
ptr
),
false
)
onFilter
(
paint
)
}
PaintFilterCanvas_nInit
(
ptr
,
onFilter
)
}
}
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