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
31c7ba98
Commit
31c7ba98
authored
Sep 21, 2020
by
Roman Sedaikin
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Added support for correct rendering scaling at different dpi for each window.
parent
7e01dc01
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
68 additions
and
31 deletions
+68
-31
drawlayer.cc
skiko/src/jvmMain/cpp/linux/drawlayer.cc
+1
-1
SkiaWindow.kt
skiko/src/jvmMain/kotlin/org/jetbrains/skiko/SkiaWindow.kt
+38
-20
drawlayer.m
skiko/src/jvmMain/objectiveC/macos/drawlayer.m
+29
-10
No files found.
skiko/src/jvmMain/cpp/linux/drawlayer.cc
View file @
31c7ba98
...
@@ -96,7 +96,7 @@ LayersSet *findByObject(JNIEnv *env, jobject object)
...
@@ -96,7 +96,7 @@ LayersSet *findByObject(JNIEnv *env, jobject object)
return
layer
;
return
layer
;
}
}
}
}
fprintf
(
stderr
,
"The set does not contain this window.
\n
"
);
return
NULL
;
return
NULL
;
}
}
...
...
skiko/src/jvmMain/kotlin/org/jetbrains/skiko/SkiaWindow.kt
View file @
31c7ba98
...
@@ -66,26 +66,44 @@ open class SkiaLayer : HardwareLayer() {
...
@@ -66,26 +66,44 @@ open class SkiaLayer : HardwareLayer() {
private
fun
initSkija
()
{
private
fun
initSkija
()
{
val
dpi
=
contentScale
val
dpi
=
contentScale
skijaState
.
clear
()
initRenderTarget
(
dpi
)
val
gl
:
OpenGLApi
=
OpenGLApi
.
instance
initSurface
()
val
fbId
=
gl
.
glGetIntegerv
(
gl
.
GL_DRAW_FRAMEBUFFER_BINDING
)
scaleCanvas
(
dpi
)
skijaState
.
renderTarget
=
BackendRenderTarget
.
makeGL
(
}
(
width
*
dpi
).
toInt
(),
(
height
*
dpi
).
toInt
(),
private
fun
initRenderTarget
(
dpi
:
Float
)
{
0
,
skijaState
.
apply
{
8
,
clear
()
fbId
,
val
gl
:
OpenGLApi
=
OpenGLApi
.
instance
FramebufferFormat
.
GR_GL_RGBA8
val
fbId
=
gl
.
glGetIntegerv
(
gl
.
GL_DRAW_FRAMEBUFFER_BINDING
)
)
renderTarget
=
BackendRenderTarget
.
makeGL
(
skijaState
.
surface
=
Surface
.
makeFromBackendRenderTarget
(
(
width
*
dpi
).
toInt
(),
skijaState
.
context
,
(
height
*
dpi
).
toInt
(),
skijaState
.
renderTarget
,
0
,
SurfaceOrigin
.
BOTTOM_LEFT
,
8
,
SurfaceColorFormat
.
RGBA_8888
,
fbId
,
ColorSpace
.
getSRGB
()
FramebufferFormat
.
GR_GL_RGBA8
)
)
skijaState
.
canvas
=
skijaState
.
surface
!!
.
canvas
}
skijaState
.
canvas
!!
.
scale
(
dpi
,
dpi
)
}
private
fun
initSurface
()
{
skijaState
.
apply
{
surface
=
Surface
.
makeFromBackendRenderTarget
(
context
,
renderTarget
,
SurfaceOrigin
.
BOTTOM_LEFT
,
SurfaceColorFormat
.
RGBA_8888
,
ColorSpace
.
getSRGB
()
)
canvas
=
surface
!!
.
canvas
}
}
protected
open
fun
scaleCanvas
(
dpi
:
Float
)
{
skijaState
.
apply
{
canvas
!!
.
scale
(
dpi
,
dpi
)
}
}
}
}
}
...
...
skiko/src/jvmMain/objectiveC/macos/drawlayer.m
View file @
31c7ba98
...
@@ -75,6 +75,7 @@ jobject windowRef;
...
@@ -75,6 +75,7 @@ jobject windowRef;
@property
jobject
windowRef
;
@property
jobject
windowRef
;
@property
(
retain
,
strong
)
CALayer
*
caLayer
;
@property
(
retain
,
strong
)
CALayer
*
caLayer
;
@property
(
retain
,
strong
)
AWTGLLayer
*
glLayer
;
@property
(
retain
,
strong
)
AWTGLLayer
*
glLayer
;
@property
(
retain
,
strong
)
NSWindow
*
window
;
@end
@end
...
@@ -84,7 +85,7 @@ jobject windowRef;
...
@@ -84,7 +85,7 @@ jobject windowRef;
CALayer
*
caLayer
;
CALayer
*
caLayer
;
AWTGLLayer
*
glLayer
;
AWTGLLayer
*
glLayer
;
-
(
id
)
init
-
(
id
)
init
{
{
self
=
[
super
init
];
self
=
[
super
init
];
...
@@ -93,6 +94,7 @@ AWTGLLayer *glLayer;
...
@@ -93,6 +94,7 @@ AWTGLLayer *glLayer;
self
.
windowRef
=
NULL
;
self
.
windowRef
=
NULL
;
self
.
caLayer
=
NULL
;
self
.
caLayer
=
NULL
;
self
.
glLayer
=
NULL
;
self
.
glLayer
=
NULL
;
self
.
window
=
NULL
;
}
}
return
self
;
return
self
;
...
@@ -100,6 +102,9 @@ AWTGLLayer *glLayer;
...
@@ -100,6 +102,9 @@ AWTGLLayer *glLayer;
-
(
void
)
syncSize
-
(
void
)
syncSize
{
{
float
scaleFactor
=
[[
self
.
window
screen
]
backingScaleFactor
];
self
.
caLayer
.
contentsScale
=
scaleFactor
;
self
.
glLayer
.
contentsScale
=
scaleFactor
;
self
.
glLayer
.
bounds
=
self
.
caLayer
.
bounds
;
self
.
glLayer
.
bounds
=
self
.
caLayer
.
bounds
;
self
.
glLayer
.
frame
=
self
.
caLayer
.
frame
;
self
.
glLayer
.
frame
=
self
.
caLayer
.
frame
;
}
}
...
@@ -114,10 +119,12 @@ AWTGLLayer *glLayer;
...
@@ -114,10 +119,12 @@ AWTGLLayer *glLayer;
[
self
.
glLayer
dispose
];
[
self
.
glLayer
dispose
];
self
.
glLayer
=
NULL
;
self
.
glLayer
=
NULL
;
self
.
caLayer
=
NULL
;
self
.
caLayer
=
NULL
;
self
.
window
=
NULL
;
}
}
@end
@end
NSMutableArray
*
unknownWindows
=
nil
;
NSMutableSet
*
windowsSet
=
nil
;
NSMutableSet
*
windowsSet
=
nil
;
LayersSet
*
findByObject
(
JNIEnv
*
env
,
jobject
object
)
{
LayersSet
*
findByObject
(
JNIEnv
*
env
,
jobject
object
)
{
for
(
LayersSet
*
value
in
windowsSet
)
{
for
(
LayersSet
*
value
in
windowsSet
)
{
...
@@ -125,7 +132,7 @@ LayersSet * findByObject(JNIEnv *env, jobject object) {
...
@@ -125,7 +132,7 @@ LayersSet * findByObject(JNIEnv *env, jobject object) {
return
value
;
return
value
;
}
}
}
}
NSLog
(
@"The set does not contain this window."
);
return
NULL
;
return
NULL
;
}
}
...
@@ -180,28 +187,40 @@ JNIEXPORT void JNICALL Java_org_jetbrains_skiko_HardwareLayer_updateLayer(JNIEnv
...
@@ -180,28 +187,40 @@ JNIEXPORT void JNICALL Java_org_jetbrains_skiko_HardwareLayer_updateLayer(JNIEnv
LayersSet
*
layersSet
=
[[
LayersSet
alloc
]
init
];
LayersSet
*
layersSet
=
[[
LayersSet
alloc
]
init
];
[
windowsSet
addObject
:
layersSet
];
[
windowsSet
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
.
caLayer
=
[
dsi_mac
windowLayer
];
layersSet
.
caLayer
=
[
dsi_mac
windowLayer
];
[
layersSet
.
caLayer
removeAllAnimations
];
[
layersSet
.
caLayer
removeAllAnimations
];
[
layersSet
.
caLayer
setAutoresizingMask
:
(
kCALayerWidthSizable
|
kCALayerHeightSizable
)];
[
layersSet
.
caLayer
setAutoresizingMask
:
(
kCALayerWidthSizable
|
kCALayerHeightSizable
)];
[
layersSet
.
caLayer
setNeedsDisplayOnBoundsChange
:
YES
];
[
layersSet
.
caLayer
setNeedsDisplayOnBoundsChange
:
YES
];
NSScreen
*
screen
=
[
NSScreen
mainScreen
];
float
scaleFactor
=
screen
.
backingScaleFactor
;
layersSet
.
caLayer
.
contentsScale
=
scaleFactor
;
layersSet
.
glLayer
=
[
AWTGLLayer
new
];
layersSet
.
glLayer
=
[
AWTGLLayer
new
];
[
layersSet
.
caLayer
addSublayer
:
layersSet
.
glLayer
];
[
layersSet
.
caLayer
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
);
layersSet
.
glLayer
.
contentsScale
=
scaleFactor
;
jobject
windowRef
=
(
*
env
)
->
NewGlobalRef
(
env
,
window
);
jobject
windowRef
=
(
*
env
)
->
NewGlobalRef
(
env
,
window
);
[
layersSet
.
glLayer
setWindowRef
:
windowRef
];
[
layersSet
.
glLayer
setWindowRef
:
windowRef
];
[
layersSet
setWindowRef
:
windowRef
];
[
layersSet
setWindowRef
:
windowRef
];
[
layersSet
syncSize
];
[
layersSet
syncSize
];
}
}
ds
->
FreeDrawingSurfaceInfo
(
dsi
);
ds
->
FreeDrawingSurfaceInfo
(
dsi
);
...
@@ -226,7 +245,7 @@ JNIEXPORT void JNICALL Java_org_jetbrains_skiko_HardwareLayer_disposeLayer(JNIEn
...
@@ -226,7 +245,7 @@ JNIEXPORT void JNICALL Java_org_jetbrains_skiko_HardwareLayer_disposeLayer(JNIEn
JNIEXPORT
jfloat
JNICALL
Java_org_jetbrains_skiko_HardwareLayer_getContentScale
(
JNIEnv
*
env
,
jobject
window
)
{
JNIEXPORT
jfloat
JNICALL
Java_org_jetbrains_skiko_HardwareLayer_getContentScale
(
JNIEnv
*
env
,
jobject
window
)
{
LayersSet
*
layer
=
findByObject
(
env
,
window
);
LayersSet
*
layer
=
findByObject
(
env
,
window
);
if
(
layer
!=
NULL
)
{
if
(
layer
!=
NULL
)
{
return
[
layer
.
glLayer
contentsScale
]
;
return
layer
.
caLayer
.
contentsScale
;
}
}
return
1
.
0
f
;
return
1
.
0
f
;
}
}
...
...
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