javauis/lcdui_qt/src/javax/microedition/lcdui/Canvas.java
changeset 35 85266cc22c7f
parent 26 dc7c549001d5
child 47 f40128debb5d
child 49 35baca0e7a2e
--- a/javauis/lcdui_qt/src/javax/microedition/lcdui/Canvas.java	Thu May 27 12:49:31 2010 +0300
+++ b/javauis/lcdui_qt/src/javax/microedition/lcdui/Canvas.java	Fri Jun 11 13:33:44 2010 +0300
@@ -158,8 +158,12 @@
     // Canvas Graphics object passed to paint(Graphics g)
     private Graphics canvasGraphics;
 
+    // Graphics object for transferring return values
+    // from UI thread
+    private Graphics tempGraphics;
+    
     // Graphics command buffer for this instance
-	CanvasBuffer graphicsBuffer;
+	Buffer graphicsBuffer;
 	
     //On Screen Keypad
     //private Composite keypadComposite;
@@ -209,7 +213,6 @@
         cleanupLock = new Object();
         construct();
         keysPressed = new Vector();
-        graphicsBuffer = new CanvasBuffer(this, getContentComp());
     }
 
     /* (non-Javadoc)
@@ -301,6 +304,8 @@
             onScreenkeypad = new CanvasKeypad(this, canvasComp, oskAttr);
         }
 
+        // create graphics buffer
+        graphicsBuffer = Buffer.createInstance(this, canvasComp);
 
         return canvasComp;
     }
@@ -622,7 +627,15 @@
      */
     final Graphics getGameBufferGraphics()
     {
-        return graphicsBuffer.getGraphics();
+    	tempGraphics = null;
+   		ESWTUIThreadRunner.safeSyncExec(new Runnable() 
+		{
+			public void run()
+			{
+				tempGraphics =  graphicsBuffer.getGraphics();
+			}
+		});
+    	return tempGraphics;
     }
 
     CanvasKeypad getCanvasKeypad()
@@ -666,11 +679,18 @@
     void flushGameBuffer(final int x, final int y, final int width,
                          final int height)
     {
-        synchronized(graphicsBuffer)
+    	synchronized(graphicsBuffer)
         {
-            flushGraphicsBuffer(x, y, width, height);
+    		ESWTUIThreadRunner.safeSyncExec(new Runnable() 
+			{
+				public void run()
+				{
+					graphicsBuffer.sync();
+					graphicsBuffer.blitToDisplay(null, getContentComp());
+				}
+            });
         }
-    }
+    }	
 
     /**
      * Called by ShellListener when shell gets activated.
@@ -708,10 +728,9 @@
     {
         super.eswtHandleResizeEvent(width, height);
         // update new bounds to graphicsBuffer
-        synchronized(graphicsBuffer)
-        {
-            graphicsBuffer.setControlBounds(getContentComp());
-        }
+        // this call must not be synchronized as we 
+        // cannot use locking in UI thread
+        graphicsBuffer.setControlBounds(getContentComp());
         synchronized(cleanupLock)
         {
             cleanupNeeded = true;
@@ -739,26 +758,33 @@
      */
     class CanvasShellPaintListener implements PaintListener
     {
-
         public void paintControl(PaintEvent pe)
         {
-            // Native toolkit is requesting an update of an area that has
-            // become invalid. Can't do anything here because the contents
-            // need to be queried from the MIDlet in another thread by
-            // a paint callback. For this a paint callback event is posted.
-            // For a moment the native toolkit thinks that the area has
-            // been validated when in truth it will be painted later after
-            // the paint callback has been executed.
-            EventDispatcher eventDispatcher = EventDispatcher.instance();
-            LCDUIEvent event = eventDispatcher.newEvent(
-                                   LCDUIEvent.CANVAS_PAINT_NATIVE_REQUEST,
-                                   javax.microedition.lcdui.Canvas.this);
-            event.x = pe.x;
-            event.y = pe.y;
-            event.width = pe.width;
-            event.height = pe.height;
-            event.widget = pe.widget;
-            eventDispatcher.postEvent(event);
+            // Check if we got here from buffer flush
+        	if(graphicsBuffer.isPaintingActive()) 
+        	{
+        	    graphicsBuffer.blitToDisplay(pe.gc.getGCData().internalGc, null);
+        	}
+        	else
+        	{
+                // Native toolkit is requesting an update of an area that has
+                // become invalid. Can't do anything here because the contents
+                // need to be queried from the MIDlet in another thread by
+                // a paint callback. For this a paint callback event is posted.
+                // For a moment the native toolkit thinks that the area has
+                // been validated when in truth it will be painted later after
+                // the paint callback has been executed.
+                EventDispatcher eventDispatcher = EventDispatcher.instance();
+                LCDUIEvent event = eventDispatcher.newEvent(
+                                       LCDUIEvent.CANVAS_PAINT_NATIVE_REQUEST,
+                                       javax.microedition.lcdui.Canvas.this);
+                event.x = pe.x;
+                event.y = pe.y;
+                event.width = pe.width;
+                event.height = pe.height;
+                event.widget = pe.widget;
+                eventDispatcher.postEvent(event);
+        	}
         }
     }
 
@@ -851,7 +877,14 @@
         // Create instance of Graphics if not created yet
         if(canvasGraphics == null)
         {
-            canvasGraphics = graphicsBuffer.getGraphics();
+        	 ESWTUIThreadRunner.safeSyncExec(new Runnable() 
+             {
+          	    public void run()
+         	    {
+                    canvasGraphics = graphicsBuffer.getGraphics();
+                    canvasGraphics.setSyncStrategy(Graphics.SYNC_LEAVE_SURFACE_SESSION_OPEN);
+         	    }
+             });
         }
 
         // Clean the background if dirty, buffer the operations.
@@ -877,29 +910,22 @@
         // The callback
         paint(canvasGraphics);
 
-
-        // Flush drawn graphics to display
-        synchronized(graphicsBuffer)
-        {
-            flushGraphicsBuffer(redrawNowX, redrawNowY, redrawNowW, redrawNowH);
-        }
-    }
-
-    private void flushGraphicsBuffer(final int redrawNowX, final int redrawNowY, final int redrawNowW, final int redrawNowH)
-    {
-        ESWTUIThreadRunner.safeSyncExec(new Runnable()
+        // Blit frame to display
+        synchronized(graphicsBuffer) 
         {
-            public void run()
+            ESWTUIThreadRunner.safeSyncExec(new Runnable() 
             {
-                graphicsBuffer.setupWindowSurface();
-                Rectangle rect = graphicsBuffer.toWindowCoordinates(redrawNowX, redrawNowY, redrawNowW, redrawNowH);
-                graphicsBuffer.windowSurface.beginPaint(rect.x, rect.y, rect.width, rect.height);
-                graphicsBuffer.sync();
-                graphicsBuffer.windowSurface.endPaint();
-                graphicsBuffer.windowSurface.flush();
-            }
-
-        });
+         	    public void run()
+        	    {
+        		    if(event.widget.isDisposed())
+        		    {
+        			    return;
+        		    }
+        		    graphicsBuffer.sync();
+        		    graphicsBuffer.blitToDisplay(null, event.widget);
+                }
+            });
+        }
     }
 
     /*