From cab2ad6b4394b8577965d60d48e07f17ee5af2c0 Mon Sep 17 00:00:00 2001 From: Lyubomir Marinov Date: Fri, 25 Mar 2011 08:32:05 +0000 Subject: [PATCH] Fixes overlapping issues with the JAWTRenderer on Mac OS X. --- lib/native/mac/libjawtrenderer.jnilib | Bin 45008 -> 89800 bytes src/native/jawtrenderer/JAWTRenderer_MacOSX.m | 84 ++++++++---------- .../media/renderer/video/JAWTRenderer.java | 84 +++++++++++++++++- 3 files changed, 122 insertions(+), 46 deletions(-) diff --git a/lib/native/mac/libjawtrenderer.jnilib b/lib/native/mac/libjawtrenderer.jnilib index f4cc02fb64f8a71b3feba8d638ece8a1f922ebc3..c069b10ba855f1e2a5be09f273c37427366c7a4a 100755 GIT binary patch literal 89800 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 C%|aLe literal 45008 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 WM2)>`%+*~cCALayer-based painting is * to be performed by JAWTRenderer on Mac OS X. */ - private static final boolean USE_MACOSX_CALAYERS = false; + private static final boolean USE_MACOSX_CALAYERS = true; static { @@ -668,6 +668,11 @@ public void update(Graphics g) */ private static class NonVideoComponent { + /** + * The BufferedImage into which {@link #component} is to be + * painted so that it can be processed and then rendered by + * {@link #handle}. + */ private BufferedImage bufferedImage; /** @@ -682,12 +687,31 @@ private static class NonVideoComponent */ private long handle; + /** + * The height in pixels of {@link #bufferedImage} and {@link #rgb}. + */ private int height; + /** + * The pixels of {@link #bufferedImage} to be processed by + * {@link #handle}. + */ private int[] rgb; + /** + * The width in pixels of {@link #bufferedImage} and {@link #rgb}. + */ private int width; + /** + * Initializes a new NonVideoComponent instance which is to + * paint a specific Component in the context of a parent + * JAWTRenderer. + * + * @param component the Component to be painted + * @param parentHandle the handle of the native JAWTRenderer in + * the context of which component is to be painted + */ public NonVideoComponent(Component component, long parentHandle) { this.component = component; @@ -710,6 +734,10 @@ public NonVideoComponent(Component component, long parentHandle) } } + /** + * Releases the resources of this NonVideoComponent and + * prepares it to be garbage collected. + */ public void dispose() { if (handle != 0) @@ -721,10 +749,19 @@ public void dispose() } } + /** + * Paints the Component associated with this + * NonVideoComponent instance. + */ public void paint() { if (handle != 0) { + /* + * Make sure the location, the size and the visibility known to + * the associated native JAWTRenderer are in sync with these of + * the component. + */ Rectangle bounds = component.getBounds(); if (!component.isVisible()) @@ -736,9 +773,17 @@ public void paint() handle, bounds.x, bounds.y, bounds.width, bounds.height); + /* + * If the component is not visible, the native JAWTRenderer + * already knows that it is not to be rendered. + */ if ((bounds.height < 1) || (bounds.width < 1)) return; + /* + * Paint the component and tell the native JAWTRenderer about + * the latest painting. + */ if ((height != bounds.height) || (width != bounds.width)) { rgb = new int[bounds.width * bounds.height]; @@ -1167,9 +1212,18 @@ public void addNotify() @Override public boolean contains(int x, int y) { + /* + * Act as a "glass pane" i.e. be transparent with respect to points + * and pretend they are in whatever is underneath. + */ return false; } + /** + * Dispatches MouseEvents to whatever is underneath this + * SwingVideoComponentCanvas because it only renders + * Components i.e. it is like a "glass pane". + */ private boolean dispatchMouseEvent(MouseEvent e) { Component srcc = e.getComponent(); @@ -1201,6 +1255,20 @@ private boolean dispatchMouseEvent(MouseEvent e) return false; } + /** + * Determines the Component which is a child of a specific + * Container which contains a specific Point. Since + * SwingVideoComponentCanvas is like a "glass pane", it never + * contains the specified point. + * + * @param parent the Container which contains the + * Components which may contain the specified point + * @param point the point in the coordinate system of parent + * which is to be determined which Component contains it + * @return the Component which is a child of the specified + * Container and contains the specified Point or + * null if there is no such Component + */ private Component getComponentAt(Container parent, Point point) { Component[] components = parent.getComponents(); @@ -1313,6 +1381,10 @@ public void paint(Graphics g) @Override protected void processMouseEvent(MouseEvent e) { + /* + * Act as a "glass pane" i.e. be transparent with respect to + * MouseEvents and dispatch them to whatever is underneath. + */ if (!dispatchMouseEvent(e)) super.processMouseEvent(e); } @@ -1320,10 +1392,20 @@ protected void processMouseEvent(MouseEvent e) @Override protected void processMouseMotionEvent(MouseEvent e) { + /* + * Act as a "glass pane" i.e. be transparent with respect to + * MouseEvents and dispatch them to whatever is underneath. + */ if (!dispatchMouseEvent(e)) super.processMouseMotionEvent(e); } + /** + * Removes all NonVideoComponents from this + * SwingVideoComponentCanvas so that their associated + * Components are no longer painted by the reperesented native + * JAWTRenderer. + */ private void removeAllNonVideoComponents() { synchronized (nonVideoComponents)