From 6db39dc542c7f789fea08aed19cdd3917756e620 Mon Sep 17 00:00:00 2001 From: Sergey Bylokhov Date: Wed, 15 Aug 2012 15:02:34 +0400 Subject: [PATCH] 7172187: [macosx] JAWT native CALayer not positioned over Canvas Reviewed-by: art, anthony --- .../classes/sun/lwawt/LWComponentPeer.java | 2 +- .../classes/sun/lwawt/PlatformComponent.java | 33 ++++++++++++--- .../sun/lwawt/macosx/CFRetainedResource.java | 4 +- .../sun/lwawt/macosx/CPlatformComponent.java | 40 +++++++++---------- .../macosx/native/sun/awt/AWTSurfaceLayers.m | 5 +-- 5 files changed, 52 insertions(+), 32 deletions(-) diff --git a/jdk/src/macosx/classes/sun/lwawt/LWComponentPeer.java b/jdk/src/macosx/classes/sun/lwawt/LWComponentPeer.java index f6ad8838051..76d8161c749 100644 --- a/jdk/src/macosx/classes/sun/lwawt/LWComponentPeer.java +++ b/jdk/src/macosx/classes/sun/lwawt/LWComponentPeer.java @@ -282,7 +282,7 @@ public abstract class LWComponentPeer * Note that we call setVisible() at the end of initialization. */ public final void initialize() { - platformComponent.initialize(target, this, getPlatformWindow()); + platformComponent.initialize(getPlatformWindow()); initializeImpl(); setVisible(target.isVisible()); } diff --git a/jdk/src/macosx/classes/sun/lwawt/PlatformComponent.java b/jdk/src/macosx/classes/sun/lwawt/PlatformComponent.java index e791e0d57b0..836a19cd3f0 100644 --- a/jdk/src/macosx/classes/sun/lwawt/PlatformComponent.java +++ b/jdk/src/macosx/classes/sun/lwawt/PlatformComponent.java @@ -23,15 +23,38 @@ * questions. */ + package sun.lwawt; -import java.awt.Component; - +/** + * Can be used to store information about native resource related to the + * lightweight component. + */ public interface PlatformComponent { - public void initialize(Component target, LWComponentPeer peer, PlatformWindow platformWindow); + /** + * Initializes platform component. + * + * @param platformWindow already initialized {@code PlatformWindow}. + */ + void initialize(PlatformWindow platformWindow); - public void setBounds(int x, int y, int w, int h); + /** + * Moves and resizes this component. The new location of the top-left corner + * is specified by {@code x} and {@code y}, and the new size is specified by + * {@code w} and {@code h}. The location is specified relative to the {@code + * platformWindow}. + * + * @param x the X location of the component + * @param y the Y location of the component + * @param w the width of the component + * @param h the height of the component + */ + void setBounds(int x, int y, int w, int h); - public void dispose(); + /** + * Releases all of the native resources used by this {@code + * PlatformComponent}. + */ + void dispose(); } diff --git a/jdk/src/macosx/classes/sun/lwawt/macosx/CFRetainedResource.java b/jdk/src/macosx/classes/sun/lwawt/macosx/CFRetainedResource.java index 5ff47d63cd2..a92545e213b 100644 --- a/jdk/src/macosx/classes/sun/lwawt/macosx/CFRetainedResource.java +++ b/jdk/src/macosx/classes/sun/lwawt/macosx/CFRetainedResource.java @@ -33,8 +33,8 @@ package sun.lwawt.macosx; public class CFRetainedResource { private static native void nativeCFRelease(final long ptr, final boolean disposeOnAppKitThread); - final boolean disposeOnAppKitThread; - protected long ptr; + private final boolean disposeOnAppKitThread; + protected volatile long ptr; /** * @param ptr CFRetained native object pointer diff --git a/jdk/src/macosx/classes/sun/lwawt/macosx/CPlatformComponent.java b/jdk/src/macosx/classes/sun/lwawt/macosx/CPlatformComponent.java index dec254786b2..370b930ea98 100644 --- a/jdk/src/macosx/classes/sun/lwawt/macosx/CPlatformComponent.java +++ b/jdk/src/macosx/classes/sun/lwawt/macosx/CPlatformComponent.java @@ -23,27 +23,24 @@ * questions. */ + package sun.lwawt.macosx; -import java.awt.Component; import java.awt.Insets; import sun.lwawt.PlatformComponent; import sun.lwawt.PlatformWindow; -import sun.lwawt.LWComponentPeer; -import sun.lwawt.macosx.CFRetainedResource; +/** + * On OSX {@code CPlatformComponent} stores pointer to the native CAlayer which + * can be used from JAWT. + */ +final class CPlatformComponent extends CFRetainedResource + implements PlatformComponent { -public class CPlatformComponent extends CFRetainedResource implements PlatformComponent { + private volatile PlatformWindow platformWindow; - Component target; - LWComponentPeer peer; - PlatformWindow platformWindow; - - private native long nativeCreateComponent(long windowLayer); - private native long nativeSetBounds(long ptr, int x, int y, int width, int height); - - public CPlatformComponent() { + CPlatformComponent() { super(0, true); } @@ -51,27 +48,28 @@ public class CPlatformComponent extends CFRetainedResource implements PlatformCo return ptr; } - public void initialize(Component target, LWComponentPeer peer, PlatformWindow platformWindow) { - this.target = target; - this.peer = peer; + @Override + public void initialize(final PlatformWindow platformWindow) { this.platformWindow = platformWindow; - - long windowLayerPtr = platformWindow.getLayerPtr(); - setPtr(nativeCreateComponent(windowLayerPtr)); + setPtr(nativeCreateComponent(platformWindow.getLayerPtr())); } // TODO: visibility, z-order @Override - public void setBounds(int x, int y, int width, int height) { + public void setBounds(final int x, final int y, final int w, final int h) { // translates values from the coordinate system of the top-level window // to the coordinate system of the content view - Insets insets = platformWindow.getPeer().getInsets(); - nativeSetBounds(getPointer(), x - insets.left, y - insets.top, width, height); + final Insets insets = platformWindow.getPeer().getInsets(); + nativeSetBounds(getPointer(), x - insets.left, y - insets.top, w, h); } @Override public void dispose() { super.dispose(); } + + private native long nativeCreateComponent(long windowLayer); + + private native void nativeSetBounds(long ptr, int x, int y, int w, int h); } diff --git a/jdk/src/macosx/native/sun/awt/AWTSurfaceLayers.m b/jdk/src/macosx/native/sun/awt/AWTSurfaceLayers.m index f3ab2d75e41..74b0855ffa2 100644 --- a/jdk/src/macosx/native/sun/awt/AWTSurfaceLayers.m +++ b/jdk/src/macosx/native/sun/awt/AWTSurfaceLayers.m @@ -78,11 +78,10 @@ // translates values to the coordinate system of the "root" layer CGFloat newY = windowLayer.bounds.size.height - rect.origin.y - rect.size.height; + CGRect newRect = CGRectMake(rect.origin.x, newY, rect.size.width, rect.size.height); - // REMIND: why do we need to inverse position? - CGRect newRect = CGRectMake(-rect.origin.x, -newY, rect.size.width, rect.size.height); + layer.frame = newRect; - layer.bounds = newRect; [AWTSurfaceLayers repaintLayersRecursively:layer]; }