From afc338e8df6f8d79f90030b07fc361ce34090c41 Mon Sep 17 00:00:00 2001 From: GiWoong Kim Date: Thu, 6 Mar 2014 13:14:33 +0900 Subject: [PATCH] display: optimize a paint listener on maru_shm 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 --- .../tizen/emulator/skin/EmulatorShmSkin.java | 81 +++++++++---------- .../org/tizen/emulator/skin/EmulatorSkin.java | 23 ++++++ .../layout/GeneralPurposeSkinComposer.java | 4 + .../layout/ProfileSpecificSkinComposer.java | 4 + 4 files changed, 70 insertions(+), 42 deletions(-) diff --git a/tizen/src/skin/client/src/org/tizen/emulator/skin/EmulatorShmSkin.java b/tizen/src/skin/client/src/org/tizen/emulator/skin/EmulatorShmSkin.java index 22e50a8fb3..0d4480e110 100644 --- a/tizen/src/skin/client/src/org/tizen/emulator/skin/EmulatorShmSkin.java +++ b/tizen/src/skin/client/src/org/tizen/emulator/skin/EmulatorShmSkin.java @@ -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); } }); @@ -404,6 +388,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() { diff --git a/tizen/src/skin/client/src/org/tizen/emulator/skin/EmulatorSkin.java b/tizen/src/skin/client/src/org/tizen/emulator/skin/EmulatorSkin.java index bd7f2aba78..5ef795ba17 100755 --- a/tizen/src/skin/client/src/org/tizen/emulator/skin/EmulatorSkin.java +++ b/tizen/src/skin/client/src/org/tizen/emulator/skin/EmulatorSkin.java @@ -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 */ } diff --git a/tizen/src/skin/client/src/org/tizen/emulator/skin/layout/GeneralPurposeSkinComposer.java b/tizen/src/skin/client/src/org/tizen/emulator/skin/layout/GeneralPurposeSkinComposer.java index 24c16b7eab..84988ecc7c 100644 --- a/tizen/src/skin/client/src/org/tizen/emulator/skin/layout/GeneralPurposeSkinComposer.java +++ b/tizen/src/skin/client/src/org/tizen/emulator/skin/layout/GeneralPurposeSkinComposer.java @@ -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) */ diff --git a/tizen/src/skin/client/src/org/tizen/emulator/skin/layout/ProfileSpecificSkinComposer.java b/tizen/src/skin/client/src/org/tizen/emulator/skin/layout/ProfileSpecificSkinComposer.java index 50d45ec941..1edab15dbc 100644 --- a/tizen/src/skin/client/src/org/tizen/emulator/skin/layout/ProfileSpecificSkinComposer.java +++ b/tizen/src/skin/client/src/org/tizen/emulator/skin/layout/ProfileSpecificSkinComposer.java @@ -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) */ -- 2.34.1