display: optimize a paint listener on maru_shm 05/17305/1
authorGiWoong Kim <giwoong.kim@samsung.com>
Thu, 6 Mar 2014 04:14:33 +0000 (13:14 +0900)
committerGiWoong Kim <giwoong.kim@samsung.com>
Thu, 6 Mar 2014 05:23:55 +0000 (14:23 +0900)
no need to create transforms at every repaint event
no need to rearrange the touch points at every repaint event

Change-Id: I10bee8b88a39b941287eb5b2f6fd88c65418bc98
Signed-off-by: GiWoong Kim <giwoong.kim@samsung.com>
tizen/src/skin/client/src/org/tizen/emulator/skin/EmulatorShmSkin.java
tizen/src/skin/client/src/org/tizen/emulator/skin/EmulatorSkin.java
tizen/src/skin/client/src/org/tizen/emulator/skin/layout/GeneralPurposeSkinComposer.java
tizen/src/skin/client/src/org/tizen/emulator/skin/layout/ProfileSpecificSkinComposer.java

index 22e50a8..0d4480e 100644 (file)
@@ -39,7 +39,6 @@ import org.eclipse.swt.graphics.GC;
 import org.eclipse.swt.graphics.Image;
 import org.eclipse.swt.graphics.ImageData;
 import org.eclipse.swt.graphics.PaletteData;
-import org.eclipse.swt.graphics.Transform;
 import org.eclipse.swt.widgets.Display;
 import org.eclipse.swt.widgets.MessageBox;
 import org.eclipse.swt.widgets.Shell;
@@ -312,7 +311,7 @@ public class EmulatorShmSkin extends EmulatorSkin {
                                currentState.getCurrentResolutionHeight());
 
                lcdCanvas.addPaintListener(new PaintListener() {
-                       public void paintControl(PaintEvent e) { //TODO: optimize
+                       public void paintControl(PaintEvent e) {
                                /* e.gc.setAdvanced(true);
                                if (!e.gc.getAdvanced()) {
                                        logger.info("Advanced graphics not supported");
@@ -341,54 +340,39 @@ public class EmulatorShmSkin extends EmulatorSkin {
                                        e.gc.setInterpolation(SWT.HIGH);
                                }
 
-                               if (currentState.getCurrentAngle() == 0) { /* portrait */
+                               switch(currentState.getCurrentAngle()) {
+                               case -90: /* landscape */
+                                       e.gc.setTransform(displayTransform);
+                                       e.gc.drawImage(bufferPainter.imageFramebuffer,
+                                                       0, 0, bufferPainter.widthFB, bufferPainter.heightFB,
+                                                       0, 0, screen_height, screen_width);
+                                       e.gc.setTransform(null); /* set to the identity transform */
+                                       break;
+                               case 180: /* reverse-portrait */
+                                       e.gc.setTransform(displayTransform);
                                        e.gc.drawImage(bufferPainter.imageFramebuffer,
                                                        0, 0, bufferPainter.widthFB, bufferPainter.heightFB,
                                                        0, 0, screen_width, screen_height);
-                               } else { /* non-portrait */
-                                       Transform newTransform = new Transform(lcdCanvas.getDisplay());
-                                       Transform oldTransform = new Transform(lcdCanvas.getDisplay());
-                                       newTransform.rotate(currentState.getCurrentAngle());
-
-                                       int frame_width = 0, frame_height = 0;
-                                       if (currentState.getCurrentAngle() == 90) { /* reverse landscape */
-                                               frame_width = screen_height;
-                                               frame_height = screen_width;
-                                               newTransform.translate(0, frame_height * -1);
-                                       } else if (currentState.getCurrentAngle() == 180) { /* reverse portrait */
-                                               frame_width = screen_width;
-                                               frame_height = screen_height;
-                                               newTransform.translate(frame_width * -1, frame_height * -1);
-                                       } else if (currentState.getCurrentAngle() == -90) { /* landscape */
-                                               frame_width = screen_height;
-                                               frame_height = screen_width;
-                                               newTransform.translate(frame_width * -1, 0);
-                                       }
-
-                                       /* save current transform as oldTransform */
-                                       e.gc.getTransform(oldTransform);
-                                       /* set to new transform */
-                                       e.gc.setTransform(newTransform);
+                                       e.gc.setTransform(null);
+                                       break;
+                               case 90: /* reverse-landscape */
+                                       e.gc.setTransform(displayTransform);
                                        e.gc.drawImage(bufferPainter.imageFramebuffer,
                                                        0, 0, bufferPainter.widthFB, bufferPainter.heightFB,
-                                                       0, 0, frame_width, frame_height);
-                                       /* back to old transform */
-                                       e.gc.setTransform(oldTransform);
-
-                                       newTransform.dispose();
-                                       oldTransform.dispose();
+                                                       0, 0, screen_height, screen_width);
+                                       e.gc.setTransform(null);
+                                       break;
+                               default: /* portrait */
+                                       e.gc.drawImage(bufferPainter.imageFramebuffer,
+                                                       0, 0, bufferPainter.widthFB, bufferPainter.heightFB,
+                                                       0, 0, screen_width, screen_height);
+                                       break;
                                }
 
-                               /* draw finger image for when rotate while use multitouch */
-                               if (finger.getMultiTouchEnable() == 1 ||
-                                               finger.getMultiTouchEnable() == 2) {
-                                       finger.rearrangeFingerPoints(currentState.getCurrentResolutionWidth(),
-                                                       currentState.getCurrentResolutionHeight(),
-                                                       currentState.getCurrentScale(),
-                                                       currentState.getCurrentRotationId());
+                               if (finger != null && finger.getMultiTouchEnable() != 0) {
+                                       /* draw points for multi-touch */
+                                       finger.drawFingerPoints(e.gc);
                                }
-
-                               finger.drawFingerPoints(e.gc);
                        }
                });
 
@@ -405,6 +389,19 @@ public class EmulatorShmSkin extends EmulatorSkin {
        }
 
        @Override
+       public void setSuitableTransform() {
+               super.setSuitableTransform();
+
+               if (finger != null) {
+                       finger.rearrangeFingerPoints(
+                                       currentState.getCurrentResolutionWidth(),
+                                       currentState.getCurrentResolutionHeight(),
+                                       currentState.getCurrentScale(),
+                                       currentState.getCurrentRotationId());
+               }
+       }
+
+       @Override
        public void setCoverImage(final Image image) {
                Display.getDefault().syncExec(new Runnable() {
                        @Override
index bd7f2ab..5ef795b 100755 (executable)
@@ -63,6 +63,7 @@ import org.eclipse.swt.graphics.Image;
 import org.eclipse.swt.graphics.Point;
 import org.eclipse.swt.graphics.RGB;
 import org.eclipse.swt.graphics.Rectangle;
+import org.eclipse.swt.graphics.Transform;
 import org.eclipse.swt.widgets.Canvas;
 import org.eclipse.swt.widgets.Display;
 import org.eclipse.swt.widgets.Event;
@@ -146,6 +147,7 @@ public class EmulatorSkin {
        protected ImageRegistry imageRegistry;
        protected Canvas lcdCanvas;
        private int displayCanvasStyle;
+       public Transform displayTransform;
        public SkinInformation skinInfo;
        protected ISkinComposer skinComposer;
 
@@ -1259,6 +1261,27 @@ public class EmulatorSkin {
                /* abstract */
        }
 
+       public void setSuitableTransform() {
+               if (displayTransform != null) {
+                       displayTransform.dispose();
+               }
+
+               displayTransform = new Transform(lcdCanvas.getDisplay());
+               displayTransform.rotate(currentState.getCurrentAngle());
+
+               if (currentState.getCurrentAngle() == -90) { /* landscape */
+                       displayTransform.translate(
+                                       lcdCanvas.getSize().y * -1, 0);
+               } else if (currentState.getCurrentAngle() == 180) { /* reverse-portrait */
+                       displayTransform.translate(
+                                       lcdCanvas.getSize().x * -1,
+                                       lcdCanvas.getSize().y * -1);
+               } else if (currentState.getCurrentAngle() == 90) { /* reverse-landscape */
+                       displayTransform.translate(
+                                       0, lcdCanvas.getSize().x * -1);
+               }
+       }
+
        public void setCoverImage(Image image) {
                /* abstract */
        }
index 24c16b7..84988ec 100644 (file)
@@ -424,6 +424,10 @@ public class GeneralPurposeSkinComposer implements ISkinComposer {
                        public void paintControl(final PaintEvent e) {
                                if (currentState.isNeedToUpdateDisplay() == true) {
                                        currentState.setNeedToUpdateDisplay(false);
+
+                                       logger.info("shell transform was changed");
+
+                                       skin.setSuitableTransform();
                                }
 
                                /* set window size once again (for ubuntu 12.04) */
index 50d45ec..1edab15 100644 (file)
@@ -348,9 +348,13 @@ public class ProfileSpecificSkinComposer implements ISkinComposer {
                                if (currentState.isNeedToUpdateDisplay() == true) {
                                        currentState.setNeedToUpdateDisplay(false);
 
+                                       logger.info("shell transform was changed");
+
                                        if (SwtUtil.isMacPlatform() == false) {
                                                lcdCanvas.setBounds(currentState.getDisplayBounds());
                                        }
+
+                                       skin.setSuitableTransform();
                                }
 
                                /* set window size once again (for ubuntu 12.04) */