--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/java.desktop/macosx/native/libawt_lwawt/awt/AWTSurfaceLayers.m Tue Sep 12 19:03:39 2017 +0200
@@ -0,0 +1,136 @@
+/*
+ * Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+#import "AWTSurfaceLayers.h"
+#import "ThreadUtilities.h"
+#import "LWCToolkit.h"
+
+#import <JavaNativeFoundation/JavaNativeFoundation.h>
+#import <QuartzCore/CATransaction.h>
+
+@implementation AWTSurfaceLayers
+
+@synthesize windowLayer;
+
+- (id) initWithWindowLayer:(CALayer *)aWindowLayer {
+ self = [super init];
+ if (self == nil) return self;
+
+ self.windowLayer = aWindowLayer;
+
+ return self;
+}
+
+- (void) dealloc {
+ self.windowLayer = nil;
+ [super dealloc];
+}
+
+- (CALayer *) layer {
+ return layer;
+}
+
+- (void) setLayer:(CALayer *)newLayer {
+ if (layer != newLayer) {
+ if (layer != nil || newLayer == nil) {
+ [layer removeFromSuperlayer];
+ [layer release];
+ }
+
+ if (newLayer != nil) {
+ layer = [newLayer retain];
+ // REMIND: window layer -> container layer
+ [windowLayer addSublayer: layer];
+ }
+ }
+}
+
+// Updates back buffer size of the layer if it's an OpenGL layer
+// including all OpenGL sublayers
++ (void) repaintLayersRecursively:(CALayer*)aLayer {
+ if ([aLayer isKindOfClass:[CAOpenGLLayer class]]) {
+ [aLayer setNeedsDisplay];
+ }
+ for(CALayer *child in aLayer.sublayers) {
+ [AWTSurfaceLayers repaintLayersRecursively: child];
+ }
+}
+
+- (void) setBounds:(CGRect)rect {
+ // translates values to the coordinate system of the "root" layer
+ rect.origin.y = windowLayer.bounds.size.height - rect.origin.y - rect.size.height;
+ [CATransaction begin];
+ [CATransaction setDisableActions:YES];
+ layer.frame = rect;
+ [CATransaction commit];
+ [AWTSurfaceLayers repaintLayersRecursively:layer];
+}
+
+@end
+
+/*
+ * Class: sun_lwawt_macosx_CPlatformComponent
+ * Method: nativeCreateLayer
+ * Signature: ()J
+ */
+JNIEXPORT jlong JNICALL
+Java_sun_lwawt_macosx_CPlatformComponent_nativeCreateComponent
+(JNIEnv *env, jobject obj, jlong windowLayerPtr)
+{
+ __block AWTSurfaceLayers *surfaceLayers = nil;
+
+JNF_COCOA_ENTER(env);
+
+ [ThreadUtilities performOnMainThreadWaiting:YES block:^(){
+
+ CALayer *windowLayer = jlong_to_ptr(windowLayerPtr);
+ surfaceLayers = [[AWTSurfaceLayers alloc] initWithWindowLayer: windowLayer];
+ }];
+
+JNF_COCOA_EXIT(env);
+
+ return ptr_to_jlong(surfaceLayers);
+}
+
+/*
+ * Class: sun_lwawt_macosx_CPlatformComponent
+ * Method: nativeSetBounds
+ * Signature: (JIIII)V
+ */
+JNIEXPORT void JNICALL Java_sun_lwawt_macosx_CPlatformComponent_nativeSetBounds
+(JNIEnv *env, jclass clazz, jlong surfaceLayersPtr, jint x, jint y, jint width, jint height)
+{
+JNF_COCOA_ENTER(env);
+
+ AWTSurfaceLayers *surfaceLayers = OBJC(surfaceLayersPtr);
+
+ [ThreadUtilities performOnMainThreadWaiting:NO block:^(){
+
+ CGRect rect = CGRectMake(x, y, width, height);
+ [surfaceLayers setBounds: rect];
+ }];
+
+JNF_COCOA_EXIT(env);
+}