Commit 31c7ba98 authored by Roman Sedaikin's avatar Roman Sedaikin

Added support for correct rendering scaling at different dpi for each window.

parent 7e01dc01
......@@ -96,7 +96,7 @@ LayersSet *findByObject(JNIEnv *env, jobject object)
return layer;
}
}
fprintf(stderr, "The set does not contain this window.\n");
return NULL;
}
......
......@@ -66,26 +66,44 @@ open class SkiaLayer : HardwareLayer() {
private fun initSkija() {
val dpi = contentScale
skijaState.clear()
val gl: OpenGLApi = OpenGLApi.instance
val fbId = gl.glGetIntegerv(gl.GL_DRAW_FRAMEBUFFER_BINDING)
skijaState.renderTarget = BackendRenderTarget.makeGL(
(width * dpi).toInt(),
(height * dpi).toInt(),
0,
8,
fbId,
FramebufferFormat.GR_GL_RGBA8
)
skijaState.surface = Surface.makeFromBackendRenderTarget(
skijaState.context,
skijaState.renderTarget,
SurfaceOrigin.BOTTOM_LEFT,
SurfaceColorFormat.RGBA_8888,
ColorSpace.getSRGB()
)
skijaState.canvas = skijaState.surface!!.canvas
skijaState.canvas!!.scale(dpi, dpi)
initRenderTarget(dpi)
initSurface()
scaleCanvas(dpi)
}
private fun initRenderTarget(dpi: Float) {
skijaState.apply {
clear()
val gl: OpenGLApi = OpenGLApi.instance
val fbId = gl.glGetIntegerv(gl.GL_DRAW_FRAMEBUFFER_BINDING)
renderTarget = BackendRenderTarget.makeGL(
(width * dpi).toInt(),
(height * dpi).toInt(),
0,
8,
fbId,
FramebufferFormat.GR_GL_RGBA8
)
}
}
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)
}
}
}
......
......@@ -75,6 +75,7 @@ jobject windowRef;
@property jobject windowRef;
@property (retain, strong) CALayer *caLayer;
@property (retain, strong) AWTGLLayer *glLayer;
@property (retain, strong) NSWindow *window;
@end
......@@ -84,7 +85,7 @@ jobject windowRef;
CALayer *caLayer;
AWTGLLayer *glLayer;
- (id)init
- (id) init
{
self = [super init];
......@@ -93,6 +94,7 @@ AWTGLLayer *glLayer;
self.windowRef = NULL;
self.caLayer = NULL;
self.glLayer = NULL;
self.window = NULL;
}
return self;
......@@ -100,6 +102,9 @@ AWTGLLayer *glLayer;
- (void) syncSize
{
float scaleFactor = [[self.window screen] backingScaleFactor];
self.caLayer.contentsScale = scaleFactor;
self.glLayer.contentsScale = scaleFactor;
self.glLayer.bounds = self.caLayer.bounds;
self.glLayer.frame = self.caLayer.frame;
}
......@@ -114,10 +119,12 @@ AWTGLLayer *glLayer;
[self.glLayer dispose];
self.glLayer = NULL;
self.caLayer = NULL;
self.window = NULL;
}
@end
NSMutableArray *unknownWindows = nil;
NSMutableSet *windowsSet = nil;
LayersSet * findByObject(JNIEnv *env, jobject object) {
for (LayersSet* value in windowsSet) {
......@@ -125,7 +132,7 @@ LayersSet * findByObject(JNIEnv *env, jobject object) {
return value;
}
}
NSLog(@"The set does not contain this window.");
return NULL;
}
......@@ -180,28 +187,40 @@ JNIEXPORT void JNICALL Java_org_jetbrains_skiko_HardwareLayer_updateLayer(JNIEnv
LayersSet *layersSet = [[LayersSet alloc] init];
[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 removeAllAnimations];
[layersSet.caLayer setAutoresizingMask: (kCALayerWidthSizable|kCALayerHeightSizable)];
[layersSet.caLayer setNeedsDisplayOnBoundsChange: YES];
NSScreen *screen = [NSScreen mainScreen];
float scaleFactor = screen.backingScaleFactor;
layersSet.caLayer.contentsScale = scaleFactor;
layersSet.glLayer = [AWTGLLayer new];
[layersSet.caLayer addSublayer: layersSet.glLayer];
CGFloat white[] = { 1.0f, 1.0f, 1.0f, 1.0f };
layersSet.glLayer.backgroundColor = CGColorCreate(CGColorSpaceCreateDeviceRGB(), white);
layersSet.glLayer.contentsScale = scaleFactor;
jobject windowRef = (*env)->NewGlobalRef(env, window);
[layersSet.glLayer setWindowRef: windowRef];
[layersSet setWindowRef: windowRef];
[layersSet syncSize];
}
ds->FreeDrawingSurfaceInfo(dsi);
......@@ -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) {
LayersSet *layer = findByObject(env, window);
if (layer != NULL) {
return [layer.glLayer contentsScale];
return layer.caLayer.contentsScale;
}
return 1.0f;
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment