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) ...@@ -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;
} }
......
...@@ -66,10 +66,17 @@ open class SkiaLayer : HardwareLayer() { ...@@ -66,10 +66,17 @@ open class SkiaLayer : HardwareLayer() {
private fun initSkija() { private fun initSkija() {
val dpi = contentScale val dpi = contentScale
skijaState.clear() initRenderTarget(dpi)
initSurface()
scaleCanvas(dpi)
}
private fun initRenderTarget(dpi: Float) {
skijaState.apply {
clear()
val gl: OpenGLApi = OpenGLApi.instance val gl: OpenGLApi = OpenGLApi.instance
val fbId = gl.glGetIntegerv(gl.GL_DRAW_FRAMEBUFFER_BINDING) val fbId = gl.glGetIntegerv(gl.GL_DRAW_FRAMEBUFFER_BINDING)
skijaState.renderTarget = BackendRenderTarget.makeGL( renderTarget = BackendRenderTarget.makeGL(
(width * dpi).toInt(), (width * dpi).toInt(),
(height * dpi).toInt(), (height * dpi).toInt(),
0, 0,
...@@ -77,15 +84,26 @@ open class SkiaLayer : HardwareLayer() { ...@@ -77,15 +84,26 @@ open class SkiaLayer : HardwareLayer() {
fbId, fbId,
FramebufferFormat.GR_GL_RGBA8 FramebufferFormat.GR_GL_RGBA8
) )
skijaState.surface = Surface.makeFromBackendRenderTarget( }
skijaState.context, }
skijaState.renderTarget,
private fun initSurface() {
skijaState.apply {
surface = Surface.makeFromBackendRenderTarget(
context,
renderTarget,
SurfaceOrigin.BOTTOM_LEFT, SurfaceOrigin.BOTTOM_LEFT,
SurfaceColorFormat.RGBA_8888, SurfaceColorFormat.RGBA_8888,
ColorSpace.getSRGB() ColorSpace.getSRGB()
) )
skijaState.canvas = skijaState.surface!!.canvas canvas = surface!!.canvas
skijaState.canvas!!.scale(dpi, dpi) }
}
protected open fun scaleCanvas(dpi: Float) {
skijaState.apply {
canvas!!.scale(dpi, dpi)
}
} }
} }
......
...@@ -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.0f, 1.0f, 1.0f, 1.0f }; CGFloat white[] = { 1.0f, 1.0f, 1.0f, 1.0f };
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.0f; 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