From 4eedf52fc92aeec78cd303a8c375dd947fe11ed4 Mon Sep 17 00:00:00 2001 From: "giwoong.kim" Date: Tue, 24 Jul 2012 15:30:33 +0900 Subject: [PATCH] [Title] added EmulatorSdlSkin & EmulatorShmSkin [Type] feature [Module] Emulator / skin [Priority] major [Jira#] [Redmine#] [Problem] [Cause] supprot mac [Solution] [TestCase] --- .../org/tizen/emulator/skin/EmulatorSdlSkin.java | 13 ++ .../org/tizen/emulator/skin/EmulatorShmSkin.java | 150 +++++++++++++++++++++ .../src/org/tizen/emulator/skin/EmulatorSkin.java | 35 +++-- .../org/tizen/emulator/skin/EmulatorSkinMain.java | 10 +- .../emulator/skin/screenshot/ScreenShotDialog.java | 12 +- 5 files changed, 199 insertions(+), 21 deletions(-) create mode 100644 tizen/src/skin/client/src/org/tizen/emulator/skin/EmulatorSdlSkin.java create mode 100644 tizen/src/skin/client/src/org/tizen/emulator/skin/EmulatorShmSkin.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 index 0000000..0cfb5b9 --- /dev/null +++ b/tizen/src/skin/client/src/org/tizen/emulator/skin/EmulatorSdlSkin.java @@ -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 index 0000000..d7602b4 --- /dev/null +++ b/tizen/src/skin/client/src/org/tizen/emulator/skin/EmulatorShmSkin.java @@ -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; + } +} 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 71d2dc8..b34e5c2 100644 --- a/tizen/src/skin/client/src/org/tizen/emulator/skin/EmulatorSkin.java +++ b/tizen/src/skin/client/src/org/tizen/emulator/skin/EmulatorSkin.java @@ -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; diff --git a/tizen/src/skin/client/src/org/tizen/emulator/skin/EmulatorSkinMain.java b/tizen/src/skin/client/src/org/tizen/emulator/skin/EmulatorSkinMain.java index 8510ca3..15d5273 100644 --- a/tizen/src/skin/client/src/org/tizen/emulator/skin/EmulatorSkinMain.java +++ b/tizen/src/skin/client/src/org/tizen/emulator/skin/EmulatorSkinMain.java @@ -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 ); diff --git a/tizen/src/skin/client/src/org/tizen/emulator/skin/screenshot/ScreenShotDialog.java b/tizen/src/skin/client/src/org/tizen/emulator/skin/screenshot/ScreenShotDialog.java index 9d78edb..e2e3f48 100644 --- a/tizen/src/skin/client/src/org/tizen/emulator/skin/screenshot/ScreenShotDialog.java +++ b/tizen/src/skin/client/src/org/tizen/emulator/skin/screenshot/ScreenShotDialog.java @@ -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(); -- 2.7.4