--- a/javauis/m3g_akn/javasrc/javax/microedition/m3g/Graphics3D.java Tue May 25 12:34:19 2010 +0300
+++ b/javauis/m3g_akn/javasrc/javax/microedition/m3g/Graphics3D.java Wed Jun 09 09:34:07 2010 +0300
@@ -107,6 +107,7 @@
private Rect viewport;
private Rect clip;
private boolean ngaEnabled = false;
+ private boolean foreground;
//------------------------------------------------------------------
@@ -127,7 +128,9 @@
}
if (instance.graphics3D == null)
{
+ // graphics3D must be assigned to interface before asking foreground status
instance.graphics3D = new Graphics3D();
+ instance.graphics3D.foreground = ToolkitInvoker.getToolkitInvoker().isForeground();
}
return instance.graphics3D;
}
@@ -154,8 +157,8 @@
this.viewport = new Rect();
this.clip = new Rect();
// Initializes NGA status - enabled or disabled
- this.ngaEnabled = ToolkitInvoker.getToolkitInvoker().isNgaEnabled();
- }
+ ngaEnabled = invoker.isNgaEnabled();
+ }
/**
*
@@ -182,99 +185,102 @@
*/
public void bindTarget(java.lang.Object target, boolean depth, int flags)
{
- integrityCheck();
- int eventSrcHandle = 0;
- if (currentTarget != null)
- {
- throw new IllegalStateException();
- }
-
- if (target == null)
+ synchronized (Interface.getInstance())
{
- throw new NullPointerException();
- }
- try
- {
- // Bind event source. This need to be released.
- eventSrcHandle = Interface.bindEventSource();
- if (target instanceof Graphics)
+ integrityCheck();
+ int eventSrcHandle = 0;
+ if (currentTarget != null)
+ {
+ throw new IllegalStateException();
+ }
+
+ if (target == null)
+ {
+ throw new NullPointerException();
+ }
+ try
{
- Graphics g = (Graphics) target;
- Platform.sync(g);
+ // Bind event source. This need to be released.
+ eventSrcHandle = Interface.bindEventSource();
+ if (target instanceof Graphics)
+ {
+ Graphics g = (Graphics) target;
+ Platform.sync(g);
+
+ if (g.getClipWidth() > Defs.MAX_VIEWPORT_WIDTH ||
+ g.getClipHeight() > Defs.MAX_VIEWPORT_HEIGHT)
+ {
+ throw new IllegalArgumentException();
+ }
+
+ offsetX = g.getTranslateX();
+ offsetY = g.getTranslateY();
+
+ ToolkitInvoker invoker = ToolkitInvoker.getToolkitInvoker();
+
+ // NGA specific change.
+ if (ngaEnabled)
+ {
+ // If overwrite is set, there is no need
+ // to update EGL surface with 2D content
+ eglContentValid = (flags & OVERWRITE) > 0;
+
+ // Clip and viewport are stored for later
+ // checks regarding Background clear
+ clip.x = g.getClipX() + offsetX;
+ clip.y = g.getClipY() + offsetY;
+ clip.width = g.getClipWidth();
+ clip.height = g.getClipHeight();
- if (g.getClipWidth() > Defs.MAX_VIEWPORT_WIDTH ||
- g.getClipHeight() > Defs.MAX_VIEWPORT_HEIGHT)
+ viewport.x = clip.x;
+ viewport.y = clip.y;
+ viewport.width = clip.width;
+ viewport.height = clip.height;
+
+ isImageTarget = _bindGraphics(
+ eventSrcHandle,
+ handle,
+ invoker.graphicsGetHandle(g),
+ clip.x, clip.y,
+ clip.width, clip.height,
+ depth, flags,
+ isProperRenderer);
+ }
+ else
+ {
+ isImageTarget = _bindGraphics(
+ eventSrcHandle,
+ handle,
+ invoker.graphicsGetHandle(g),
+ g.getClipX() + offsetX, g.getClipY() + offsetY,
+ g.getClipWidth(), g.getClipHeight(),
+ depth, flags,
+ isProperRenderer);
+ }
+ currentTarget = g;
+ }
+ else if (target instanceof Image2D)
+ {
+ Image2D img = (Image2D) target;
+
+ offsetX = offsetY = 0;
+
+ _bindImage(eventSrcHandle, handle, img.handle, depth, flags);
+ currentTarget = img;
+ }
+ else
{
throw new IllegalArgumentException();
}
-
- offsetX = g.getTranslateX();
- offsetY = g.getTranslateY();
-
- ToolkitInvoker invoker = ToolkitInvoker.getToolkitInvoker();
-
- // NGA specific change.
- if (ngaEnabled)
- {
- // If overwrite is set, there is no need
- // to update EGL surface with 2D content
- eglContentValid = (flags & OVERWRITE) > 0;
-
- // Clip and viewport are stored for later
- // checks regarding Background clear
- clip.x = g.getClipX() + offsetX;
- clip.y = g.getClipY() + offsetY;
- clip.width = g.getClipWidth();
- clip.height = g.getClipHeight();
-
- viewport.x = clip.x;
- viewport.y = clip.y;
- viewport.width = clip.width;
- viewport.height = clip.height;
-
- isImageTarget = _bindGraphics(
- eventSrcHandle,
- handle,
- invoker.graphicsGetHandle(g),
- clip.x, clip.y,
- clip.width, clip.height,
- depth, flags,
- isProperRenderer);
- }
- else
- {
- isImageTarget = _bindGraphics(
- eventSrcHandle,
- handle,
- invoker.graphicsGetHandle(g),
- g.getClipX() + offsetX, g.getClipY() + offsetY,
- g.getClipWidth(), g.getClipHeight(),
- depth, flags,
- isProperRenderer);
- }
- currentTarget = g;
}
- else if (target instanceof Image2D)
- {
- Image2D img = (Image2D) target;
-
- offsetX = offsetY = 0;
-
- _bindImage(eventSrcHandle, handle, img.handle, depth, flags);
- currentTarget = img;
- }
- else
+ finally
{
- throw new IllegalArgumentException();
+ // Release event source
+ Interface.releaseEventSource();
}
+ hints = flags;
+ depthEnabled = depth;
}
- finally
- {
- // Release event source
- Interface.releaseEventSource();
- }
- hints = flags;
- depthEnabled = depth;
}
/**
@@ -282,44 +288,56 @@
*/
public void releaseTarget()
{
- integrityCheck();
- if (currentTarget == null)
- {
- return;
- }
- try
+ synchronized (Interface.getInstance())
{
- // Bind event source
- int eventSrcHandle = Interface.bindEventSource();
- if (currentTarget instanceof Graphics)
+ integrityCheck();
+ if (currentTarget == null)
{
- Graphics g = (Graphics) currentTarget;
-
- ToolkitInvoker invoker = ToolkitInvoker.getToolkitInvoker();
-
- // NGA specific change.
- if (ngaEnabled)
+ return;
+ }
+
+ int eventSrcHandle = 0;
+
+ try
+ {
+ // Bind event source
+ eventSrcHandle = Interface.bindEventSource();
+ if (currentTarget instanceof Graphics)
{
- updateEglContent();
+ Graphics g = (Graphics) currentTarget;
+
+ ToolkitInvoker invoker = ToolkitInvoker.getToolkitInvoker();
+
+ // NGA specific change.
+ if (ngaEnabled)
+ {
+ updateEglContent();
+ }
+ _releaseGraphics(eventSrcHandle, handle,
+ invoker.graphicsGetHandle(g), isImageTarget, isProperRenderer);
}
- _releaseGraphics(eventSrcHandle, handle,
- invoker.graphicsGetHandle(g), isImageTarget, isProperRenderer);
- }
- else if (currentTarget instanceof Image2D)
- {
- _releaseImage(eventSrcHandle, handle);
+ else if (currentTarget instanceof Image2D)
+ {
+ _releaseImage(eventSrcHandle, handle);
+ }
+ else
+ {
+ throw new Error();
+ }
}
- else
+ finally
{
- throw new Error();
+ currentTarget = null;
+
+ if (ngaEnabled && !foreground && eventSrcHandle != 0)
+ {
+ _freeGLESResources(eventSrcHandle, handle);
+ }
+
+ // Release event source
+ Interface.releaseEventSource();
}
}
- finally
- {
- currentTarget = null;
- // Release event source
- Interface.releaseEventSource();
- }
}
/**
@@ -730,6 +748,27 @@
}
}
+ void setForeground(boolean foreground)
+ {
+ synchronized (Interface.getInstance())
+ {
+ this.foreground = foreground;
+ if (ngaEnabled &&
+ !foreground &&
+ currentTarget == null)
+ {
+ try
+ {
+ _freeGLESResources(Interface.bindEventSource(), handle);
+ }
+ finally
+ {
+ Interface.releaseEventSource();
+ }
+ }
+ }
+ }
+
private native static int _ctor(int hInterface);
private native static void _addRef(int hObject);
@@ -811,4 +850,6 @@
private native static int _getTargetWidth(int graphicsHandle);
private native static void _updateEglContent(int eventSourceHandle,
int graphicsHandle);
+ private native static void _freeGLESResources(int eventSourceHandle,
+ int handle);
}