javauis/m3g_akn/javasrc/javax/microedition/m3g/Graphics3D.java
branchRCL_3
changeset 19 71c436fe3ce0
parent 14 04becd199f91
child 24 6c158198356e
--- 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);
 }