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
b36a31e8
Commit
b36a31e8
authored
Oct 23, 2020
by
Roman Sedaikin
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Refactored the source code related to native layer management and dpi scaling.
parent
2acd99da
Changes
6
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
152 additions
and
194 deletions
+152
-194
App.kt
...kijaInjectSample/src/main/kotlin/SkijaInjectSample/App.kt
+1
-1
drawlayer.cc
skiko/src/jvmMain/cpp/linux/drawlayer.cc
+27
-31
drawlayer.cc
skiko/src/jvmMain/cpp/windows/drawlayer.cc
+33
-52
HardwareLayer.kt
...o/src/jvmMain/kotlin/org/jetbrains/skiko/HardwareLayer.kt
+1
-1
SkiaWindow.kt
skiko/src/jvmMain/kotlin/org/jetbrains/skiko/SkiaWindow.kt
+1
-1
drawlayer.m
skiko/src/jvmMain/objectiveC/macos/drawlayer.m
+89
-108
No files found.
samples/SkijaInjectSample/src/main/kotlin/SkijaInjectSample/App.kt
View file @
b36a31e8
...
@@ -27,7 +27,7 @@ import javax.swing.KeyStroke
...
@@ -27,7 +27,7 @@ import javax.swing.KeyStroke
import
java.awt.Toolkit
import
java.awt.Toolkit
fun
main
(
args
:
Array
<
String
>)
{
fun
main
(
args
:
Array
<
String
>)
{
createWindow
(
"First window"
)
;
createWindow
(
"First window"
)
}
}
fun
createWindow
(
title
:
String
)
{
fun
createWindow
(
title
:
String
)
{
...
...
skiko/src/jvmMain/cpp/linux/drawlayer.cc
View file @
b36a31e8
...
@@ -16,19 +16,21 @@ extern "C" jboolean Skiko_GetAWT(JNIEnv *env, JAWT *awt);
...
@@ -16,19 +16,21 @@ extern "C" jboolean Skiko_GetAWT(JNIEnv *env, JAWT *awt);
JavaVM
*
jvm
=
NULL
;
JavaVM
*
jvm
=
NULL
;
class
Layer
sSet
class
Layer
Handler
{
{
public
:
public
:
jobject
canvasRef
;
jobject
canvas
Global
Ref
;
GLXContext
context
;
GLXContext
context
;
void
update
()
void
update
LayerContent
()
{
{
draw
();
draw
();
}
}
void
dispose
(
)
void
dispose
Layer
(
JNIEnv
*
env
)
{
{
env
->
DeleteGlobalRef
(
canvasGlobalRef
);
canvasGlobalRef
=
NULL
;
context
=
NULL
;
context
=
NULL
;
}
}
...
@@ -56,7 +58,7 @@ private:
...
@@ -56,7 +58,7 @@ private:
return
;
return
;
}
}
ds
=
awt
.
GetDrawingSurface
(
env
,
canvasRef
);
ds
=
awt
.
GetDrawingSurface
(
env
,
canvas
Global
Ref
);
lock
=
ds
->
Lock
(
ds
);
lock
=
ds
->
Lock
(
ds
);
dsi
=
ds
->
GetDrawingSurfaceInfo
(
ds
);
dsi
=
ds
->
GetDrawingSurfaceInfo
(
ds
);
dsi_x11
=
(
JAWT_X11DrawingSurfaceInfo
*
)
dsi
->
platformInfo
;
dsi_x11
=
(
JAWT_X11DrawingSurfaceInfo
*
)
dsi
->
platformInfo
;
...
@@ -68,14 +70,16 @@ private:
...
@@ -68,14 +70,16 @@ private:
glXMakeCurrent
(
display
,
window
,
context
);
glXMakeCurrent
(
display
,
window
,
context
);
jclass
wndClass
=
env
->
GetObjectClass
(
canvasRef
);
static
jclass
wndClass
=
NULL
;
jmethodID
drawMethod
=
env
->
GetMethodID
(
wndClass
,
"draw"
,
"()V"
);
if
(
!
wndClass
)
wndClass
=
env
->
GetObjectClass
(
canvasGlobalRef
);
static
jmethodID
drawMethod
=
NULL
;
if
(
!
drawMethod
)
drawMethod
=
env
->
GetMethodID
(
wndClass
,
"draw"
,
"()V"
);
if
(
NULL
==
drawMethod
)
if
(
NULL
==
drawMethod
)
{
{
fprintf
(
stderr
,
"The method Window.draw() not found!
\n
"
);
fprintf
(
stderr
,
"The method Window.draw() not found!
\n
"
);
return
;
return
;
}
}
env
->
CallVoidMethod
(
canvasRef
,
drawMethod
);
env
->
CallVoidMethod
(
canvas
Global
Ref
,
drawMethod
);
glFinish
();
glFinish
();
glXSwapBuffers
(
display
,
window
);
glXSwapBuffers
(
display
,
window
);
}
}
...
@@ -86,12 +90,12 @@ private:
...
@@ -86,12 +90,12 @@ private:
}
}
};
};
set
<
Layer
sSet
*>
*
windowsSet
=
NULL
;
set
<
Layer
Handler
*>
*
layerStorage
=
NULL
;
Layer
sSet
*
findByObject
(
JNIEnv
*
env
,
jobject
object
)
Layer
Handler
*
findByObject
(
JNIEnv
*
env
,
jobject
object
)
{
{
for
(
auto
&
layer
:
*
windowsSet
)
for
(
auto
&
layer
:
*
layerStorage
)
{
{
if
(
env
->
IsSameObject
(
object
,
layer
->
canvasRef
)
==
JNI_TRUE
)
if
(
env
->
IsSameObject
(
object
,
layer
->
canvas
Global
Ref
)
==
JNI_TRUE
)
{
{
return
layer
;
return
layer
;
}
}
...
@@ -102,19 +106,16 @@ LayersSet *findByObject(JNIEnv *env, jobject object)
...
@@ -102,19 +106,16 @@ LayersSet *findByObject(JNIEnv *env, jobject object)
extern
"C"
extern
"C"
{
{
JNIEXPORT
void
JNICALL
Java_org_jetbrains_skiko_HardwareLayer_updateLayer
(
JNIEnv
*
env
,
jobject
canvas
)
JNIEXPORT
void
JNICALL
Java_org_jetbrains_skiko_HardwareLayer_updateLayer
(
JNIEnv
*
env
,
jobject
canvas
)
{
{
if
(
windowsSet
!=
NULL
)
if
(
layerStorage
!=
NULL
)
{
{
Layer
sSet
*
layer
=
findByObject
(
env
,
canvas
);
Layer
Handler
*
layer
=
findByObject
(
env
,
canvas
);
if
(
layer
!=
NULL
)
if
(
layer
!=
NULL
)
{
{
if
(
layer
->
context
==
NULL
)
if
(
layer
->
context
==
NULL
)
{
{
env
->
DeleteGlobalRef
(
layer
->
canvasRef
);
layerStorage
->
erase
(
layer
);
layer
->
canvasRef
=
NULL
;
windowsSet
->
erase
(
layer
);
delete
layer
;
delete
layer
;
}
}
return
;
return
;
...
@@ -122,7 +123,7 @@ extern "C"
...
@@ -122,7 +123,7 @@ extern "C"
}
}
else
else
{
{
windowsSet
=
new
set
<
LayersSet
*>
();
layerStorage
=
new
set
<
LayerHandler
*>
();
}
}
if
(
jvm
==
NULL
)
if
(
jvm
==
NULL
)
...
@@ -160,12 +161,12 @@ extern "C"
...
@@ -160,12 +161,12 @@ extern "C"
XVisualInfo
*
vi
=
glXChooseVisual
(
display
,
0
,
att
);
XVisualInfo
*
vi
=
glXChooseVisual
(
display
,
0
,
att
);
GLXContext
context
=
glXCreateContext
(
display
,
vi
,
NULL
,
GL_TRUE
);
GLXContext
context
=
glXCreateContext
(
display
,
vi
,
NULL
,
GL_TRUE
);
Layer
sSet
*
layer
=
new
LayersSet
();
Layer
Handler
*
layer
=
new
LayerHandler
();
windowsSet
->
insert
(
layer
);
layerStorage
->
insert
(
layer
);
jobject
canvasRef
=
env
->
NewGlobalRef
(
canvas
);
jobject
canvasRef
=
env
->
NewGlobalRef
(
canvas
);
layer
->
canvasRef
=
canvasRef
;
layer
->
canvas
Global
Ref
=
canvasRef
;
layer
->
context
=
context
;
layer
->
context
=
context
;
}
}
ds
->
FreeDrawingSurfaceInfo
(
dsi
);
ds
->
FreeDrawingSurfaceInfo
(
dsi
);
...
@@ -175,27 +176,22 @@ extern "C"
...
@@ -175,27 +176,22 @@ extern "C"
JNIEXPORT
void
JNICALL
Java_org_jetbrains_skiko_HardwareLayer_redrawLayer
(
JNIEnv
*
env
,
jobject
canvas
)
JNIEXPORT
void
JNICALL
Java_org_jetbrains_skiko_HardwareLayer_redrawLayer
(
JNIEnv
*
env
,
jobject
canvas
)
{
{
Layer
sSet
*
layer
=
findByObject
(
env
,
canvas
);
Layer
Handler
*
layer
=
findByObject
(
env
,
canvas
);
if
(
layer
!=
NULL
)
if
(
layer
!=
NULL
)
{
{
layer
->
update
();
layer
->
update
LayerContent
();
}
}
}
}
JNIEXPORT
void
JNICALL
Java_org_jetbrains_skiko_HardwareLayer_disposeLayer
(
JNIEnv
*
env
,
jobject
canvas
)
JNIEXPORT
void
JNICALL
Java_org_jetbrains_skiko_HardwareLayer_disposeLayer
(
JNIEnv
*
env
,
jobject
canvas
)
{
{
Layer
sSet
*
layer
=
findByObject
(
env
,
canvas
);
Layer
Handler
*
layer
=
findByObject
(
env
,
canvas
);
if
(
layer
!=
NULL
)
if
(
layer
!=
NULL
)
{
{
layer
->
dispose
(
);
layer
->
dispose
Layer
(
env
);
}
}
}
}
JNIEXPORT
jfloat
JNICALL
Java_org_jetbrains_skiko_HardwareLayer_getContentScale
(
JNIEnv
*
env
,
jobject
canvas
)
{
return
1.0
f
;
}
JNIEXPORT
jlong
JNICALL
Java_org_jetbrains_skiko_HardwareLayer_getWindowHandle
(
JNIEnv
*
env
,
jobject
canvas
)
JNIEXPORT
jlong
JNICALL
Java_org_jetbrains_skiko_HardwareLayer_getWindowHandle
(
JNIEnv
*
env
,
jobject
canvas
)
{
{
JAWT
awt
;
JAWT
awt
;
...
...
skiko/src/jvmMain/cpp/windows/drawlayer.cc
View file @
b36a31e8
...
@@ -15,23 +15,23 @@ using namespace std;
...
@@ -15,23 +15,23 @@ using namespace std;
JavaVM
*
jvm
=
NULL
;
JavaVM
*
jvm
=
NULL
;
extern
"C"
jboolean
Skiko_GetAWT
(
JNIEnv
*
env
,
JAWT
*
awt
);
extern
"C"
jboolean
Skiko_GetAWT
(
JNIEnv
*
env
,
JAWT
*
awt
);
class
Layer
sSet
class
Layer
Handler
{
{
public
:
public
:
jobject
window
Ref
;
jobject
canvasGlobal
Ref
;
HGLRC
context
;
HGLRC
context
;
HWND
handler
;
HDC
device
;
HDC
device
;
void
update
()
void
update
LayerContent
()
{
{
draw
();
draw
();
}
}
void
dispose
(
)
void
dispose
Layer
(
JNIEnv
*
env
)
{
{
env
->
DeleteGlobalRef
(
canvasGlobalRef
);
canvasGlobalRef
=
NULL
;
context
=
NULL
;
context
=
NULL
;
handler
=
NULL
;
device
=
NULL
;
device
=
NULL
;
}
}
...
@@ -44,14 +44,16 @@ private:
...
@@ -44,14 +44,16 @@ private:
jvm
->
GetEnv
((
void
**
)
&
env
,
JNI_VERSION_10
);
jvm
->
GetEnv
((
void
**
)
&
env
,
JNI_VERSION_10
);
wglMakeCurrent
(
device
,
context
);
wglMakeCurrent
(
device
,
context
);
jclass
wndClass
=
env
->
GetObjectClass
(
windowRef
);
static
jclass
wndClass
=
NULL
;
jmethodID
drawMethod
=
env
->
GetMethodID
(
wndClass
,
"draw"
,
"()V"
);
if
(
!
wndClass
)
wndClass
=
env
->
GetObjectClass
(
canvasGlobalRef
);
static
jmethodID
drawMethod
=
NULL
;
if
(
!
drawMethod
)
drawMethod
=
env
->
GetMethodID
(
wndClass
,
"draw"
,
"()V"
);
if
(
NULL
==
drawMethod
)
if
(
NULL
==
drawMethod
)
{
{
fprintf
(
stderr
,
"The method Window.draw() not found!
\n
"
);
fprintf
(
stderr
,
"The method Window.draw() not found!
\n
"
);
return
;
return
;
}
}
env
->
CallVoidMethod
(
window
Ref
,
drawMethod
);
env
->
CallVoidMethod
(
canvasGlobal
Ref
,
drawMethod
);
glFinish
();
glFinish
();
SwapBuffers
(
device
);
SwapBuffers
(
device
);
...
@@ -59,12 +61,12 @@ private:
...
@@ -59,12 +61,12 @@ private:
}
}
};
};
set
<
Layer
sSet
*>
*
windowsSet
=
NULL
;
set
<
Layer
Handler
*>
*
layerStorage
=
NULL
;
Layer
sSet
*
findByObject
(
JNIEnv
*
env
,
jobject
object
)
Layer
Handler
*
findByObject
(
JNIEnv
*
env
,
jobject
object
)
{
{
for
(
auto
&
layer
:
*
windowsSet
)
for
(
auto
&
layer
:
*
layerStorage
)
{
{
if
(
env
->
IsSameObject
(
object
,
layer
->
window
Ref
)
==
JNI_TRUE
)
if
(
env
->
IsSameObject
(
object
,
layer
->
canvasGlobal
Ref
)
==
JNI_TRUE
)
{
{
return
layer
;
return
layer
;
}
}
...
@@ -75,19 +77,16 @@ LayersSet *findByObject(JNIEnv *env, jobject object)
...
@@ -75,19 +77,16 @@ LayersSet *findByObject(JNIEnv *env, jobject object)
extern
"C"
extern
"C"
{
{
JNIEXPORT
void
JNICALL
Java_org_jetbrains_skiko_HardwareLayer_updateLayer
(
JNIEnv
*
env
,
jobject
canvas
)
JNIEXPORT
void
JNICALL
Java_org_jetbrains_skiko_HardwareLayer_updateLayer
(
JNIEnv
*
env
,
jobject
window
)
{
{
if
(
windowsSet
!=
NULL
)
if
(
layerStorage
!=
NULL
)
{
{
Layer
sSet
*
layer
=
findByObject
(
env
,
window
);
Layer
Handler
*
layer
=
findByObject
(
env
,
canvas
);
if
(
layer
!=
NULL
)
if
(
layer
!=
NULL
)
{
{
if
(
layer
->
context
==
NULL
)
if
(
layer
->
context
==
NULL
)
{
{
env
->
DeleteGlobalRef
(
layer
->
windowRef
);
layerStorage
->
erase
(
layer
);
layer
->
windowRef
=
NULL
;
windowsSet
->
erase
(
layer
);
delete
layer
;
delete
layer
;
}
}
return
;
return
;
...
@@ -95,7 +94,7 @@ extern "C"
...
@@ -95,7 +94,7 @@ extern "C"
}
}
else
else
{
{
windowsSet
=
new
set
<
LayersSet
*>
();
layerStorage
=
new
set
<
LayerHandler
*>
();
}
}
JAWT
awt
;
JAWT
awt
;
...
@@ -122,7 +121,7 @@ extern "C"
...
@@ -122,7 +121,7 @@ extern "C"
env
->
GetJavaVM
(
&
jvm
);
env
->
GetJavaVM
(
&
jvm
);
}
}
ds
=
awt
.
GetDrawingSurface
(
env
,
window
);
ds
=
awt
.
GetDrawingSurface
(
env
,
canvas
);
lock
=
ds
->
Lock
(
ds
);
lock
=
ds
->
Lock
(
ds
);
dsi
=
ds
->
GetDrawingSurfaceInfo
(
ds
);
dsi
=
ds
->
GetDrawingSurfaceInfo
(
ds
);
dsi_win
=
(
JAWT_Win32DrawingSurfaceInfo
*
)
dsi
->
platformInfo
;
dsi_win
=
(
JAWT_Win32DrawingSurfaceInfo
*
)
dsi
->
platformInfo
;
...
@@ -144,14 +143,13 @@ extern "C"
...
@@ -144,14 +143,13 @@ extern "C"
DescribePixelFormat
(
device
,
iPixelFormat
,
sizeof
(
PIXELFORMATDESCRIPTOR
),
&
pixFormatDscr
);
DescribePixelFormat
(
device
,
iPixelFormat
,
sizeof
(
PIXELFORMATDESCRIPTOR
),
&
pixFormatDscr
);
context
=
wglCreateContext
(
device
);
context
=
wglCreateContext
(
device
);
Layer
sSet
*
layer
=
new
LayersSet
();
Layer
Handler
*
layer
=
new
LayerHandler
();
windowsSet
->
insert
(
layer
);
layerStorage
->
insert
(
layer
);
jobject
windowRef
=
env
->
NewGlobalRef
(
window
);
jobject
canvasRef
=
env
->
NewGlobalRef
(
canvas
);
layer
->
windowRef
=
window
Ref
;
layer
->
canvasGlobalRef
=
canvas
Ref
;
layer
->
context
=
context
;
layer
->
context
=
context
;
layer
->
handler
=
hwnd
;
layer
->
device
=
device
;
layer
->
device
=
device
;
}
}
...
@@ -160,42 +158,25 @@ extern "C"
...
@@ -160,42 +158,25 @@ extern "C"
awt
.
FreeDrawingSurface
(
ds
);
awt
.
FreeDrawingSurface
(
ds
);
}
}
JNIEXPORT
void
JNICALL
Java_org_jetbrains_skiko_HardwareLayer_redrawLayer
(
JNIEnv
*
env
,
jobject
window
)
JNIEXPORT
void
JNICALL
Java_org_jetbrains_skiko_HardwareLayer_redrawLayer
(
JNIEnv
*
env
,
jobject
canvas
)
{
{
Layer
sSet
*
layer
=
findByObject
(
env
,
window
);
Layer
Handler
*
layer
=
findByObject
(
env
,
canvas
);
if
(
layer
!=
NULL
)
if
(
layer
!=
NULL
)
{
{
layer
->
update
();
layer
->
update
LayerContent
();
}
}
}
}
JNIEXPORT
void
JNICALL
Java_org_jetbrains_skiko_HardwareLayer_disposeLayer
(
JNIEnv
*
env
,
jobject
window
)
JNIEXPORT
void
JNICALL
Java_org_jetbrains_skiko_HardwareLayer_disposeLayer
(
JNIEnv
*
env
,
jobject
canvas
)
{
{
Layer
sSet
*
layer
=
findByObject
(
env
,
window
);
Layer
Handler
*
layer
=
findByObject
(
env
,
canvas
);
if
(
layer
!=
NULL
)
if
(
layer
!=
NULL
)
{
{
layer
->
dispose
();
layer
->
disposeLayer
(
env
);
}
}
JNIEXPORT
jfloat
JNICALL
Java_org_jetbrains_skiko_HardwareLayer_getContentScale
(
JNIEnv
*
env
,
jobject
window
)
{
LayersSet
*
layer
=
findByObject
(
env
,
window
);
if
(
layer
!=
NULL
)
{
// get scale dpi factor of current monitor
HWND
parent
=
GetParent
(
layer
->
handler
);
if
(
parent
!=
NULL
)
{
UINT
dpi
=
GetDpiForWindow
(
parent
);
float
result
=
dpi
/
96.0
;
return
result
;
}
}
}
return
1.0
f
;
}
}
JNIEXPORT
jlong
JNICALL
Java_org_jetbrains_skiko_HardwareLayer_getWindowHandle
(
JNIEnv
*
env
,
jobject
window
)
JNIEXPORT
jlong
JNICALL
Java_org_jetbrains_skiko_HardwareLayer_getWindowHandle
(
JNIEnv
*
env
,
jobject
canvas
)
{
{
JAWT
awt
;
JAWT
awt
;
JAWT_DrawingSurface
*
ds
=
NULL
;
JAWT_DrawingSurface
*
ds
=
NULL
;
...
@@ -221,7 +202,7 @@ extern "C"
...
@@ -221,7 +202,7 @@ extern "C"
env
->
GetJavaVM
(
&
jvm
);
env
->
GetJavaVM
(
&
jvm
);
}
}
ds
=
awt
.
GetDrawingSurface
(
env
,
window
);
ds
=
awt
.
GetDrawingSurface
(
env
,
canvas
);
lock
=
ds
->
Lock
(
ds
);
lock
=
ds
->
Lock
(
ds
);
dsi
=
ds
->
GetDrawingSurfaceInfo
(
ds
);
dsi
=
ds
->
GetDrawingSurfaceInfo
(
ds
);
dsi_win
=
(
JAWT_Win32DrawingSurfaceInfo
*
)
dsi
->
platformInfo
;
dsi_win
=
(
JAWT_Win32DrawingSurfaceInfo
*
)
dsi
->
platformInfo
;
...
...
skiko/src/jvmMain/kotlin/org/jetbrains/skiko/HardwareLayer.kt
View file @
b36a31e8
...
@@ -18,5 +18,5 @@ open class HardwareLayer : Canvas(), Drawable {
...
@@ -18,5 +18,5 @@ open class HardwareLayer : Canvas(), Drawable {
override
val
windowHandle
:
Long
override
val
windowHandle
:
Long
external
get
external
get
override
val
contentScale
:
Float
override
val
contentScale
:
Float
external
get
get
()
=
graphicsConfiguration
.
defaultTransform
.
scaleX
.
toFloat
()
}
}
\ No newline at end of file
skiko/src/jvmMain/kotlin/org/jetbrains/skiko/SkiaWindow.kt
View file @
b36a31e8
...
@@ -70,7 +70,7 @@ open class SkiaLayer() : HardwareLayer() {
...
@@ -70,7 +70,7 @@ open class SkiaLayer() : HardwareLayer() {
}
}
private
fun
initSkija
()
{
private
fun
initSkija
()
{
val
dpi
=
graphicsConfiguration
.
defaultTransform
.
scaleX
.
toFloat
()
val
dpi
=
contentScale
initRenderTarget
(
dpi
)
initRenderTarget
(
dpi
)
initSurface
()
initSurface
()
scaleCanvas
(
dpi
)
scaleCanvas
(
dpi
)
...
...
skiko/src/jvmMain/objectiveC/macos/drawlayer.m
100644 → 100755
View file @
b36a31e8
...
@@ -15,14 +15,12 @@ JavaVM *jvm = NULL;
...
@@ -15,14 +15,12 @@ JavaVM *jvm = NULL;
@interface
AWTGLLayer
:
CAOpenGLLayer
@interface
AWTGLLayer
:
CAOpenGLLayer
@property
jobject
window
Ref
;
@property
jobject
canvasGlobal
Ref
;
@end
@end
@implementation
AWTGLLayer
@implementation
AWTGLLayer
jobject
windowRef
;
-
(
id
)
init
-
(
id
)
init
{
{
self
=
[
super
init
];
self
=
[
super
init
];
...
@@ -33,7 +31,7 @@ jobject windowRef;
...
@@ -33,7 +31,7 @@ jobject windowRef;
[
self
setAutoresizingMask
:
(
kCALayerWidthSizable
|
kCALayerHeightSizable
)];
[
self
setAutoresizingMask
:
(
kCALayerWidthSizable
|
kCALayerHeightSizable
)];
[
self
setNeedsDisplayOnBoundsChange
:
YES
];
[
self
setNeedsDisplayOnBoundsChange
:
YES
];
self
.
window
Ref
=
NULL
;
self
.
canvasGlobal
Ref
=
NULL
;
}
}
return
self
;
return
self
;
...
@@ -51,40 +49,30 @@ jobject windowRef;
...
@@ -51,40 +49,30 @@ jobject windowRef;
(
*
jvm
)
->
AttachCurrentThread
(
jvm
,
(
void
**
)
&
env
,
NULL
);
(
*
jvm
)
->
AttachCurrentThread
(
jvm
,
(
void
**
)
&
env
,
NULL
);
static
jclass
wndClass
=
NULL
;
static
jclass
wndClass
=
NULL
;
if
(
!
wndClass
)
wndClass
=
(
*
env
)
->
GetObjectClass
(
env
,
self
.
window
Ref
);
if
(
!
wndClass
)
wndClass
=
(
*
env
)
->
GetObjectClass
(
env
,
self
.
canvasGlobal
Ref
);
static
jmethodID
drawMethod
=
NULL
;
static
jmethodID
drawMethod
=
NULL
;
if
(
!
drawMethod
)
drawMethod
=
(
*
env
)
->
GetMethodID
(
env
,
wndClass
,
"draw"
,
"()V"
);
if
(
!
drawMethod
)
drawMethod
=
(
*
env
)
->
GetMethodID
(
env
,
wndClass
,
"draw"
,
"()V"
);
if
(
NULL
==
drawMethod
)
{
if
(
NULL
==
drawMethod
)
{
NSLog
(
@"The method Window.draw() not found!"
);
NSLog
(
@"The method Window.draw() not found!"
);
return
;
return
;
}
}
(
*
env
)
->
CallVoidMethod
(
env
,
self
.
window
Ref
,
drawMethod
);
(
*
env
)
->
CallVoidMethod
(
env
,
self
.
canvasGlobal
Ref
,
drawMethod
);
}
}
[
super
drawInCGLContext
:
ctx
pixelFormat
:
pf
forLayerTime
:
t
displayTime
:
ts
];
[
super
drawInCGLContext
:
ctx
pixelFormat
:
pf
forLayerTime
:
t
displayTime
:
ts
];
}
}
-
(
void
)
dispose
{
self
.
windowRef
=
NULL
;
}
@end
@end
@interface
Layer
sSet
:
NSObject
@interface
Layer
Handler
:
NSObject
@property
jobject
windowRef
;
@property
(
retain
,
strong
)
CALayer
*
container
;
@property
(
retain
,
strong
)
CALayer
*
caLayer
;
@property
(
retain
,
strong
)
AWTGLLayer
*
glLayer
;
@property
(
retain
,
strong
)
AWTGLLayer
*
glLayer
;
@property
(
retain
,
strong
)
NSWindow
*
window
;
@end
@end
@implementation
LayersSet
@implementation
LayerHandler
jobject
windowRef
;
CALayer
*
caLayer
;
AWTGLLayer
*
glLayer
;
-
(
id
)
init
-
(
id
)
init
{
{
...
@@ -92,49 +80,66 @@ AWTGLLayer *glLayer;
...
@@ -92,49 +80,66 @@ AWTGLLayer *glLayer;
if
(
self
)
if
(
self
)
{
{
self
.
windowRef
=
NULL
;
self
.
container
=
NULL
;
self
.
caLayer
=
NULL
;
self
.
glLayer
=
NULL
;
self
.
glLayer
=
NULL
;
self
.
window
=
NULL
;
}
}
return
self
;
return
self
;
}
}
-
(
void
)
syncSize
-
(
void
)
sync
Layers
Size
{
{
self
.
glLayer
.
bounds
=
self
.
c
aLay
er
.
bounds
;
self
.
glLayer
.
bounds
=
self
.
c
ontain
er
.
bounds
;
self
.
glLayer
.
frame
=
self
.
c
aLay
er
.
frame
;
self
.
glLayer
.
frame
=
self
.
c
ontain
er
.
frame
;
float
scaleFactor
=
[[
self
.
window
screen
]
backingScaleFactor
];
if
(
jvm
!=
NULL
)
{
if
(
scaleFactor
==
0
)
{
JNIEnv
*
env
;
return
;
(
*
jvm
)
->
AttachCurrentThread
(
jvm
,
(
void
**
)
&
env
,
NULL
);
static
jclass
wndClass
=
NULL
;
if
(
!
wndClass
)
{
wndClass
=
(
*
env
)
->
GetObjectClass
(
env
,
self
.
glLayer
.
canvasGlobalRef
);
}
static
jmethodID
contentScaleMethod
=
NULL
;
if
(
!
contentScaleMethod
)
{
contentScaleMethod
=
(
*
env
)
->
GetMethodID
(
env
,
wndClass
,
"getContentScale"
,
"()F"
);
}
if
(
NULL
==
contentScaleMethod
)
{
NSLog
(
@"The method Window.getContentScale() not found!"
);
return
;
}
float
scaleFactor
=
(
*
env
)
->
CallFloatMethod
(
env
,
self
.
glLayer
.
canvasGlobalRef
,
contentScaleMethod
);
assert
(
scaleFactor
!=
0
);
self
.
container
.
contentsScale
=
scaleFactor
;
self
.
glLayer
.
contentsScale
=
scaleFactor
;
}
}
self
.
caLayer
.
contentsScale
=
scaleFactor
;
self
.
glLayer
.
contentsScale
=
scaleFactor
;
}
}
-
(
void
)
update
-
(
void
)
update
LayerContent
{
{
[
self
.
glLayer
performSelectorOnMainThread
:
@selector
(
setNeedsDisplay
)
withObject
:
0
waitUntilDone
:
NO
];
[
self
.
glLayer
performSelectorOnMainThread
:
@selector
(
setNeedsDisplay
)
withObject
:
0
waitUntilDone
:
NO
];
}
}
-
(
void
)
dispose
-
(
void
)
dispose
Layer
:
(
JNIEnv
*
)
env
{
{
[
self
.
glLayer
dispose
];
(
*
env
)
->
DeleteGlobalRef
(
env
,
self
.
glLayer
.
canvasGlobalRef
);
self
.
glLayer
.
canvasGlobalRef
=
NULL
;
self
.
glLayer
=
NULL
;
self
.
glLayer
=
NULL
;
self
.
caLayer
=
NULL
;
self
.
container
=
NULL
;
self
.
window
=
NULL
;
}
}
@end
@end
NSMutableArray
*
unknownWindows
=
nil
;
NSMutableSet
*
layerStorage
=
nil
;
NSMutableSet
*
windowsSet
=
nil
;
LayerHandler
*
findByObject
(
JNIEnv
*
env
,
jobject
object
)
LayersSet
*
findByObject
(
JNIEnv
*
env
,
jobject
object
)
{
{
for
(
LayersSet
*
value
in
windowsSet
)
{
for
(
LayerHandler
*
layer
in
layerStorage
)
if
((
*
env
)
->
IsSameObject
(
env
,
object
,
value
.
windowRef
)
==
JNI_TRUE
)
{
{
return
value
;
if
((
*
env
)
->
IsSameObject
(
env
,
object
,
layer
.
glLayer
.
canvasGlobalRef
)
==
JNI_TRUE
)
{
return
layer
;
}
}
}
}
...
@@ -143,22 +148,25 @@ LayersSet * findByObject(JNIEnv *env, jobject object) {
...
@@ -143,22 +148,25 @@ LayersSet * findByObject(JNIEnv *env, jobject object) {
extern
jboolean
Skiko_GetAWT
(
JNIEnv
*
env
,
JAWT
*
awt
);
extern
jboolean
Skiko_GetAWT
(
JNIEnv
*
env
,
JAWT
*
awt
);
JNIEXPORT
void
JNICALL
Java_org_jetbrains_skiko_HardwareLayer_updateLayer
(
JNIEnv
*
env
,
jobject
window
)
JNIEXPORT
void
JNICALL
Java_org_jetbrains_skiko_HardwareLayer_updateLayer
(
JNIEnv
*
env
,
jobject
canvas
)
{
{
if
(
windowsSet
!=
nil
||
[
windowsSet
count
]
>
0
)
{
if
(
layerStorage
!=
nil
||
[
layerStorage
count
]
>
0
)
LayersSet
*
layer
=
findByObject
(
env
,
window
);
{
if
(
layer
!=
NULL
)
{
LayerHandler
*
layer
=
findByObject
(
env
,
canvas
);
if
(
layer
.
caLayer
==
NULL
&&
layer
.
glLayer
==
NULL
)
{
if
(
layer
!=
NULL
)
(
*
env
)
->
DeleteGlobalRef
(
env
,
layer
.
windowRef
);
{
layer
.
windowRef
=
NULL
;
if
(
layer
.
container
==
NULL
&&
layer
.
glLayer
==
NULL
)
[
windowsSet
removeObject
:
layer
];
{
[
layerStorage
removeObject
:
layer
];
return
;
return
;
}
}
[
layer
syncSize
];
[
layer
sync
Layers
Size
];
return
;
return
;
}
}
}
else
{
}
windowsSet
=
[[
NSMutableSet
alloc
]
init
];
else
{
layerStorage
=
[[
NSMutableSet
alloc
]
init
];
}
}
JAWT
awt
;
JAWT
awt
;
...
@@ -177,7 +185,7 @@ JNIEXPORT void JNICALL Java_org_jetbrains_skiko_HardwareLayer_updateLayer(JNIEnv
...
@@ -177,7 +185,7 @@ JNIEXPORT void JNICALL Java_org_jetbrains_skiko_HardwareLayer_updateLayer(JNIEnv
(
*
env
)
->
GetJavaVM
(
env
,
&
jvm
);
(
*
env
)
->
GetJavaVM
(
env
,
&
jvm
);
ds
=
awt
.
GetDrawingSurface
(
env
,
window
);
ds
=
awt
.
GetDrawingSurface
(
env
,
canvas
);
assert
(
ds
!=
NULL
);
assert
(
ds
!=
NULL
);
lock
=
ds
->
Lock
(
ds
);
lock
=
ds
->
Lock
(
ds
);
...
@@ -189,49 +197,24 @@ JNIEXPORT void JNICALL Java_org_jetbrains_skiko_HardwareLayer_updateLayer(JNIEnv
...
@@ -189,49 +197,24 @@ JNIEXPORT void JNICALL Java_org_jetbrains_skiko_HardwareLayer_updateLayer(JNIEnv
{
{
dsi_mac
=
(
__bridge
NSObject
<
JAWT_SurfaceLayers
>
*
)
dsi
->
platformInfo
;
dsi_mac
=
(
__bridge
NSObject
<
JAWT_SurfaceLayers
>
*
)
dsi
->
platformInfo
;
LayersSet
*
layersSet
=
[[
LayersSet
alloc
]
init
];
LayerHandler
*
layersSet
=
[[
LayerHandler
alloc
]
init
];
[
windowsSet
addObject
:
layersSet
];
[
layerStorage
addObject
:
layersSet
];
NSMutableArray
<
NSWindow
*>
*
windows
=
[
NSMutableArray
arrayWithArray
:
[[
NSApplication
sharedApplication
]
windows
]];
if
([
windowsSet
count
]
==
1
)
{
NSWindow
*
mainWindow
=
[[
NSApplication
sharedApplication
]
mainWindow
];
layersSet
.
window
=
mainWindow
;
[
windows
removeObject
:
mainWindow
];
unknownWindows
=
windows
;
}
else
{
for
(
NSWindow
*
value
in
unknownWindows
)
{
[
windows
removeObject
:
value
];
}
for
(
LayersSet
*
value
in
windowsSet
)
{
[
windows
removeObject
:
value
.
window
];
}
layersSet
.
window
=
[
windows
firstObject
];
}
layersSet
.
c
aLay
er
=
[
dsi_mac
windowLayer
];
layersSet
.
c
ontain
er
=
[
dsi_mac
windowLayer
];
[
layersSet
.
c
aLay
er
removeAllAnimations
];
[
layersSet
.
c
ontain
er
removeAllAnimations
];
[
layersSet
.
c
aLay
er
setAutoresizingMask
:
(
kCALayerWidthSizable
|
kCALayerHeightSizable
)];
[
layersSet
.
c
ontain
er
setAutoresizingMask
:
(
kCALayerWidthSizable
|
kCALayerHeightSizable
)];
[
layersSet
.
c
aLay
er
setNeedsDisplayOnBoundsChange
:
YES
];
[
layersSet
.
c
ontain
er
setNeedsDisplayOnBoundsChange
:
YES
];
layersSet
.
glLayer
=
[
AWTGLLayer
new
];
layersSet
.
glLayer
=
[
AWTGLLayer
new
];
[
layersSet
.
c
aLay
er
addSublayer
:
layersSet
.
glLayer
];
[
layersSet
.
c
ontain
er
addSublayer
:
layersSet
.
glLayer
];
CGFloat
white
[]
=
{
1
.
0
f
,
1
.
0
f
,
1
.
0
f
,
1
.
0
f
};
CGFloat
white
[]
=
{
1
.
0
f
,
1
.
0
f
,
1
.
0
f
,
1
.
0
f
};
layersSet
.
glLayer
.
backgroundColor
=
CGColorCreate
(
CGColorSpaceCreateDeviceRGB
(),
white
);
layersSet
.
glLayer
.
backgroundColor
=
CGColorCreate
(
CGColorSpaceCreateDeviceRGB
(),
white
);
jobject
windowRef
=
(
*
env
)
->
NewGlobalRef
(
env
,
window
);
jobject
canvasGlobalRef
=
(
*
env
)
->
NewGlobalRef
(
env
,
canvas
);
[
layersSet
.
glLayer
setWindowRef
:
windowRef
];
[
layersSet
.
glLayer
setCanvasGlobalRef
:
canvasGlobalRef
];
[
layersSet
setWindowRef
:
windowRef
];
NSScreen
*
screen
=
[
NSScreen
mainScreen
];
[
layersSet
syncLayersSize
];
float
scaleFactor
=
screen
.
backingScaleFactor
;
layersSet
.
caLayer
.
contentsScale
=
scaleFactor
;
layersSet
.
glLayer
.
contentsScale
=
scaleFactor
;
layersSet
.
glLayer
.
bounds
=
layersSet
.
caLayer
.
bounds
;
layersSet
.
glLayer
.
frame
=
layersSet
.
caLayer
.
frame
;
}
}
ds
->
FreeDrawingSurfaceInfo
(
dsi
);
ds
->
FreeDrawingSurfaceInfo
(
dsi
);
...
@@ -239,33 +222,31 @@ JNIEXPORT void JNICALL Java_org_jetbrains_skiko_HardwareLayer_updateLayer(JNIEnv
...
@@ -239,33 +222,31 @@ JNIEXPORT void JNICALL Java_org_jetbrains_skiko_HardwareLayer_updateLayer(JNIEnv
awt
.
FreeDrawingSurface
(
ds
);
awt
.
FreeDrawingSurface
(
ds
);
}
}
JNIEXPORT
void
JNICALL
Java_org_jetbrains_skiko_HardwareLayer_redrawLayer
(
JNIEnv
*
env
,
jobject
window
)
{
JNIEXPORT
void
JNICALL
Java_org_jetbrains_skiko_HardwareLayer_redrawLayer
(
JNIEnv
*
env
,
jobject
canvas
)
LayersSet
*
layer
=
findByObject
(
env
,
window
);
{
if
(
layer
!=
NULL
)
{
LayerHandler
*
layer
=
findByObject
(
env
,
canvas
);
[
layer
update
];
if
(
layer
!=
NULL
)
}
{
}
[
layer
updateLayerContent
];
JNIEXPORT
void
JNICALL
Java_org_jetbrains_skiko_HardwareLayer_disposeLayer
(
JNIEnv
*
env
,
jobject
window
)
{
LayersSet
*
layer
=
findByObject
(
env
,
window
);
if
(
layer
!=
NULL
)
{
[
layer
dispose
];
}
}
}
}
JNIEXPORT
jfloat
JNICALL
Java_org_jetbrains_skiko_HardwareLayer_getContentScale
(
JNIEnv
*
env
,
jobject
window
)
{
JNIEXPORT
void
JNICALL
Java_org_jetbrains_skiko_HardwareLayer_disposeLayer
(
JNIEnv
*
env
,
jobject
canvas
)
LayersSet
*
layer
=
findByObject
(
env
,
window
);
{
if
(
layer
!=
NULL
)
{
LayerHandler
*
layer
=
findByObject
(
env
,
canvas
);
return
layer
.
caLayer
.
contentsScale
;
if
(
layer
!=
NULL
)
{
[
layer
disposeLayer
:
env
];
}
}
return
1
.
0
f
;
}
}
JNIEXPORT
jlong
JNICALL
Java_org_jetbrains_skiko_HardwareLayer_getWindowHandle
(
JNIEnv
*
env
,
jobject
window
)
{
JNIEXPORT
jlong
JNICALL
Java_org_jetbrains_skiko_HardwareLayer_getWindowHandle
(
JNIEnv
*
env
,
jobject
canvas
)
{
return
(
jlong
)
kNullWindowHandle
;
return
(
jlong
)
kNullWindowHandle
;
}
}
void
getMetalDeviceAndQueue
(
void
**
device
,
void
**
queue
)
{
void
getMetalDeviceAndQueue
(
void
**
device
,
void
**
queue
)
{
id
<
MTLDevice
>
fDevice
=
MTLCreateSystemDefaultDevice
();
id
<
MTLDevice
>
fDevice
=
MTLCreateSystemDefaultDevice
();
id
<
MTLCommandQueue
>
fQueue
=
[
fDevice
newCommandQueue
];
id
<
MTLCommandQueue
>
fQueue
=
[
fDevice
newCommandQueue
];
*
device
=
(
__bridge
void
*
)
fDevice
;
*
device
=
(
__bridge
void
*
)
fDevice
;
...
...
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