[Title] added EmulatorSdlSkin & EmulatorShmSkin
authorgiwoong.kim <giwoong.kim@samsung.com>
Tue, 24 Jul 2012 06:30:33 +0000 (15:30 +0900)
committergiwoong.kim <giwoong.kim@samsung.com>
Tue, 24 Jul 2012 06:30:33 +0000 (15:30 +0900)
[Type] feature
[Module] Emulator / skin
[Priority] major
[Jira#]
[Redmine#]
[Problem]
[Cause] supprot mac
[Solution]
[TestCase]

tizen/src/skin/client/src/org/tizen/emulator/skin/EmulatorSdlSkin.java [new file with mode: 0644]
tizen/src/skin/client/src/org/tizen/emulator/skin/EmulatorShmSkin.java [new file with mode: 0644]
tizen/src/skin/client/src/org/tizen/emulator/skin/EmulatorSkin.java
tizen/src/skin/client/src/org/tizen/emulator/skin/EmulatorSkinMain.java
tizen/src/skin/client/src/org/tizen/emulator/skin/screenshot/ScreenShotDialog.java

diff --git a/tizen/src/skin/client/src/org/tizen/emulator/skin/EmulatorSdlSkin.java b/tizen/src/skin/client/src/org/tizen/emulator/skin/EmulatorSdlSkin.java
new file mode 100644 (file)
index 0000000..0cfb5b9
--- /dev/null
@@ -0,0 +1,13 @@
+package org.tizen.emulator.skin;
+
+import org.tizen.emulator.skin.config.EmulatorConfig;
+
+public class EmulatorSdlSkin extends EmulatorSkin {
+       /**
+        *  Constructor
+        */
+       public EmulatorSdlSkin(EmulatorConfig config, boolean isOnTop) {
+               super(config, isOnTop);
+       }
+
+}
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
new file mode 100644 (file)
index 0000000..d7602b4
--- /dev/null
@@ -0,0 +1,150 @@
+package org.tizen.emulator.skin;
+
+import org.eclipse.swt.events.PaintEvent;
+import org.eclipse.swt.events.PaintListener;
+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.tizen.emulator.skin.config.EmulatorConfig;
+
+public class EmulatorShmSkin extends EmulatorSkin {
+       public static final int RED_MASK = 0x00FF0000;
+       public static final int GREEN_MASK = 0x0000FF00;
+       public static final int BLUE_MASK = 0x000000FF;
+       public static final int COLOR_DEPTH = 32;
+
+       /* define JNI functions */
+       public native int shmget(int size);
+       public native int shmdt();
+       public native int getPixels(int[] array);
+
+       PaletteData paletteData;
+       public PollFBThread pollThread;
+
+       class PollFBThread extends Thread {
+               private Display display;
+               private int lcdWidth;
+               private int lcdHeight;
+               private int[] array;
+               private ImageData imageData;
+               private Image framebuffer;
+
+               private volatile boolean stopRequest;
+               private Runnable runnable;
+
+               public PollFBThread(int lcdWidth, int lcdHeight) {
+                       this.display = Display.getDefault();
+                       this.lcdWidth = lcdWidth;
+                       this.lcdHeight = lcdHeight;
+                       this.array = new int[lcdWidth * lcdHeight];
+                       this.imageData = new ImageData(lcdWidth, lcdHeight, COLOR_DEPTH, paletteData);
+                       this.framebuffer = new Image(Display.getDefault(), imageData);
+
+                       this.runnable = new Runnable() {
+                               public void run() {
+                                       // logger.info("update lcd framebuffer");
+                                       lcdCanvas.redraw();
+                               }
+                       };
+               }
+
+               public void run() {
+                       stopRequest = false;
+
+                       while (!stopRequest) {
+                               synchronized (this) {
+                                       try {
+                                               this.wait(30); //30ms
+                                       } catch (InterruptedException ex) {
+                                               break;
+                                       }
+                               }
+
+                               int result = getPixels(array); //from shared memory
+                               //logger.info("getPixels navtive function returned " + result);
+
+                               for (int i = 0; i < lcdHeight; i++) {
+                                       imageData.setPixels(0, i, lcdWidth, array, i * lcdWidth);
+                               }
+
+                               Image temp = framebuffer;
+                               framebuffer = new Image(display, imageData);
+                               temp.dispose();
+
+                               display.asyncExec(runnable); //redraw canvas
+                       }
+               }
+
+               public void stopRequest() {
+                       stopRequest = true;
+               }
+       }
+
+       /**
+        *  Constructor
+        */
+       public EmulatorShmSkin(EmulatorConfig config, boolean isOnTop) {
+               super(config, isOnTop);
+
+               this.paletteData = new PaletteData(RED_MASK, GREEN_MASK, BLUE_MASK);
+       }
+
+       public long compose() {
+               long ret = super.compose();
+
+               int result = shmget(currentLcdWidth * currentLcdHeight); //initialize shared memory
+               //logger.info("shmget navtive function returned " + result);
+
+               pollThread = new PollFBThread(currentLcdWidth, currentLcdHeight); //update lcd thread
+
+               lcdCanvas.addPaintListener(new PaintListener() {
+                       public void paintControl(PaintEvent e) {
+                               /* e.gc.setAdvanced(true);
+                               if (!e.gc.getAdvanced()) {
+                                       logger.info("Advanced graphics not supported");
+                               } */
+
+                               int x = lcdCanvas.getSize().x;
+                               int y = lcdCanvas.getSize().y;
+                               if (currentAngle == 0) { //portrait
+                                       e.gc.drawImage(pollThread.framebuffer,
+                                                       0, 0, pollThread.lcdWidth, pollThread.lcdHeight,
+                                                       0, 0, x, y);
+                                       return;
+                               }
+
+                               Transform transform = new Transform(lcdCanvas.getDisplay());
+                               transform.rotate(currentAngle);
+
+                               if (currentAngle == 90) { //reverse landscape
+                                       int temp;
+                                       temp = x;
+                                       x = y;
+                                       y = temp;
+                                       transform.translate(0, y * -1);
+                               } else if (currentAngle == 180) { //reverse portrait
+                                       transform.translate(x * -1, y * -1);
+                               } else if (currentAngle == -90) { //landscape
+                                       int temp;
+                                       temp = x;
+                                       x = y;
+                                       y = temp;
+                                       transform.translate(x * -1, 0);
+                               }
+
+                               e.gc.setTransform(transform);
+                               e.gc.drawImage(pollThread.framebuffer,
+                                               0, 0, pollThread.lcdWidth, pollThread.lcdHeight,
+                                               0, 0, x, y);
+
+                               transform.dispose();
+                       }
+               });
+
+               pollThread.start();
+
+               return ret;
+       }
+}
index 71d2dc8..b34e5c2 100644 (file)
@@ -125,25 +125,26 @@ public class EmulatorSkin {
 
        public static final String GTK_OS_CLASS = "org.eclipse.swt.internal.gtk.OS";
        public static final String WIN32_OS_CLASS = "org.eclipse.swt.internal.win32.OS";
+       public static final String COCOA_OS_CLASS = "org.eclipse.swt.internal.cocoa.OS";
        
        private Logger logger = SkinLogger.getSkinLogger( EmulatorSkin.class ).getLogger();
 
-       private EmulatorConfig config;
+       protected EmulatorConfig config;
        private Shell shell;
        private ImageRegistry imageRegistry;
-       private Canvas lcdCanvas;
+       protected Canvas lcdCanvas;
        private Image currentImage;
        private Image currentKeyPressedImage;
        private Color hoverColor;
        private boolean isDefaultHoverColor;
 
-       private int currentScale;
-       private short currentRotationId;
-       private int currentAngle;
-       private int currentLcdWidth;
-       private int currentLcdHeight;
-       private SkinRegion currentHoverRegion;
-       private SkinRegion currentPressedRegion;
+       protected int currentScale;
+       protected short currentRotationId;
+       protected int currentAngle;
+       protected int currentLcdWidth;
+       protected int currentLcdHeight;
+       protected SkinRegion currentHoverRegion;
+       protected SkinRegion currentPressedRegion;
 
        private int pressedMouseX;
        private int pressedMouseY;
@@ -209,6 +210,7 @@ public class EmulatorSkin {
                short rotationId = EmulatorConfig.DEFAULT_WINDOW_ROTATION;
                
                composeInternal( lcdCanvas, x, y, lcdWidth, lcdHeight, scale, rotationId, false );
+               logger.info("lcdWidth : " + lcdWidth + ", lcdHeight : " + lcdHeight + ", scale : " + scale);
 
                // sdl uses this handle id.
                windowHandleId = getWindowHandleId();
@@ -331,7 +333,8 @@ public class EmulatorSkin {
 
                } else if ( SwtUtil.isMacPlatform() ) {
 
-                       // TODO
+                       // not supported
+                       windowHandleId = 0;
 
                } else {
                        logger.severe( "Not Supported OS platform:" + SWT.getPlatform() );
@@ -929,10 +932,12 @@ public class EmulatorSkin {
        private Field getOSField( String field ) {
 
                String className = "";
-               if ( SwtUtil.isLinuxPlatform() ) {
+               if (SwtUtil.isLinuxPlatform()) {
                        className = GTK_OS_CLASS;
-               } else if ( SwtUtil.isWindowsPlatform() ) {
+               } else if (SwtUtil.isWindowsPlatform()) {
                        className = WIN32_OS_CLASS;
+               } else if (SwtUtil.isMacPlatform()) {
+                       className = COCOA_OS_CLASS;
                }
 
                Field f = null;
@@ -952,10 +957,12 @@ public class EmulatorSkin {
        private Method getOSMethod( String method, Class<?>... parameterTypes ) {
 
                String className = "";
-               if ( SwtUtil.isLinuxPlatform() ) {
+               if (SwtUtil.isLinuxPlatform()) {
                        className = GTK_OS_CLASS;
-               } else if ( SwtUtil.isWindowsPlatform() ) {
+               } else if (SwtUtil.isWindowsPlatform()) {
                        className = WIN32_OS_CLASS;
+               } else if (SwtUtil.isMacPlatform()) {
+                       className = COCOA_OS_CLASS;
                }
 
                Method m = null;
index 8510ca3..15d5273 100644 (file)
@@ -56,6 +56,7 @@ import org.tizen.emulator.skin.log.SkinLogger.SkinLogLevel;
 import org.tizen.emulator.skin.util.IOUtil;
 import org.tizen.emulator.skin.util.JaxbUtil;
 import org.tizen.emulator.skin.util.StringUtil;
+import org.tizen.emulator.skin.util.SwtUtil;
 
 /**
  * 
@@ -148,7 +149,14 @@ public class EmulatorSkinMain {
                        String onTopVal = config.getSkinProperty( SkinPropertiesConstants.WINDOW_ONTOP, Boolean.FALSE.toString() );
                        boolean isOnTop = Boolean.parseBoolean( onTopVal );
 
-                       EmulatorSkin skin = new EmulatorSkin( config, isOnTop );
+                       /* create skin */
+                       EmulatorSkin skin;
+                       if (SwtUtil.isMacPlatform()) {
+                               skin = new EmulatorShmSkin(config, isOnTop);
+                       } else { // linux & windows
+                               skin = new EmulatorSdlSkin(config, isOnTop);
+                       }
+
                        long windowHandleId = skin.compose();
 
                        int uid = config.getArgInt( ArgsConstants.UID );
index 9d78edb..e2e3f48 100644 (file)
@@ -85,13 +85,13 @@ public class ScreenShotDialog {
 
        public final static String DEFAULT_FILE_EXTENSION = "png";
 
-       public final static int RED_MASK = 0x0000FF00;
-       public final static int GREEN_MASK = 0x00FF0000;
-       public final static int BLUE_MASK = 0xFF000000;
-       public final static int COLOR_DEPTH = 32;
+       public static final int RED_MASK = 0x0000FF00;
+       public static final int GREEN_MASK = 0x00FF0000;
+       public static final int BLUE_MASK = 0xFF000000;
+       public static final int COLOR_DEPTH = 32;
 
-       public final static int CANVAS_MARGIN = 30;
-       public final static int TOOLITEM_COOLTIME = 200;
+       public static final int CANVAS_MARGIN = 30;
+       public static final int TOOLITEM_COOLTIME = 200;
 
        private Logger logger = SkinLogger.getSkinLogger( ScreenShotDialog.class ).getLogger();