javauis/lcdui_qt/src/javax/microedition/lcdui/DirectGraphicsImpl.java
changeset 21 2a9601315dfc
child 23 98ccebc37403
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/lcdui_qt/src/javax/microedition/lcdui/DirectGraphicsImpl.java	Mon May 03 12:27:20 2010 +0300
@@ -0,0 +1,455 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+package javax.microedition.lcdui;
+
+import javax.microedition.lcdui.game.Sprite;
+
+import com.nokia.mid.ui.DirectGraphics;
+
+/**
+ * DirectGraphics interface implementation class.
+ *
+ * @see DirectGraphics
+ */
+class DirectGraphicsImpl implements DirectGraphics {
+
+    private static final int MANIPULATION_MASK = 0x0FFF;
+
+    private Graphics graphics;
+
+    private int alpha;
+
+    DirectGraphicsImpl(Graphics g) {
+        graphics = g;
+    }
+
+    public void drawImage(Image img, int x, int y, int anchor,
+            int manipulation) {
+
+        int transform = getTransformation(manipulation);
+        if (transform < 0) {
+            throw new IllegalArgumentException(
+                    MsgRepository.DIRECTGRAPHICS_EXCEPTION_INVALID_MANIPULATION);
+        }
+        graphics.drawRegion(img, 0, 0, img.getWidth(), img.getHeight(),
+                transform, x, y, anchor);
+    }
+
+    public void drawPixels(final int[] pixels, final boolean transparency,
+            final int offset, final int scanlength, final int x, final int y,
+            final int width, final int height, final int manipulation,
+            final int format) {
+
+        int transform = getTransformation(manipulation);
+        if (transform < 0) {
+            throw new IllegalArgumentException(
+                    MsgRepository.DIRECTGRAPHICS_EXCEPTION_INVALID_MANIPULATION);
+        }
+        if (format != TYPE_INT_888_RGB && format != TYPE_INT_8888_ARGB) {
+            throw new IllegalArgumentException(
+                    MsgRepository.DIRECTGRAPHICS_EXCEPTION_INVALID_FORMAT);
+        }
+
+        final boolean processAlpha = (format == TYPE_INT_8888_ARGB);
+        ESWTUIThreadRunner.safeSyncExec(new Runnable() {
+            public void run() {
+                graphics.getGc().drawRGB(pixels, offset, scanlength,
+                        x, y, width, height, processAlpha,
+                        getNativeTransformValue(manipulation));
+            }
+        });
+    }
+
+    public void drawPixels(final byte[] pixels, final byte[] transparencyMask,
+            final int offset, final int scanlength, final int x, final int y,
+            final int width, final int height, final int manipulation,
+            final int format) {
+
+        int transform = getTransformation(manipulation);
+        if (transform < 0) {
+            throw new IllegalArgumentException(
+                    MsgRepository.DIRECTGRAPHICS_EXCEPTION_INVALID_MANIPULATION);
+        }
+        if (format != TYPE_BYTE_1_GRAY && format != TYPE_BYTE_2_GRAY) {
+            throw new IllegalArgumentException(
+                    MsgRepository.DIRECTGRAPHICS_EXCEPTION_INVALID_FORMAT);
+        }
+
+        ESWTUIThreadRunner.safeSyncExec(new Runnable() {
+            public void run() {
+                graphics.getGc().drawRGB(pixels, transparencyMask, offset, scanlength,
+                        x, y, width, height, getNativeTransformValue(manipulation),
+                        getNativeFormatValue(format));
+            }
+        });
+    }
+
+    public void drawPixels(final short[] pixels, final boolean transparency,
+            final int offset, final int scanlength, final int x, final int y,
+            final int width, final int height, final int manipulation,
+            final int format) {
+
+        int transform = getTransformation(manipulation);
+        if (transform < 0) {
+            throw new IllegalArgumentException(
+                    MsgRepository.DIRECTGRAPHICS_EXCEPTION_INVALID_MANIPULATION);
+        }
+        if (format != TYPE_USHORT_4444_ARGB
+                && format != TYPE_USHORT_444_RGB
+                && format != TYPE_USHORT_565_RGB
+                && format != TYPE_USHORT_555_RGB) {
+            throw new IllegalArgumentException(
+                    MsgRepository.DIRECTGRAPHICS_EXCEPTION_INVALID_FORMAT);
+        }
+
+        final boolean processAlpha = (format == TYPE_USHORT_4444_ARGB);
+        ESWTUIThreadRunner.safeSyncExec(new Runnable() {
+            public void run() {
+                graphics.getGc().drawRGB(pixels, offset, scanlength,
+                        x, y, width, height, processAlpha,
+                        getNativeTransformValue(manipulation),
+                        getNativeFormatValue(format));
+            }
+        });
+    }
+
+    public void drawPolygon(int[] xPoints, int xOffset, int[] yPoints,
+            int yOffset, int nPoints, int argbColor) {
+        setARGBColor(argbColor);
+        final int[] points = new int[nPoints * 2];
+        for (int i = 0; i < nPoints; i++) {
+            points[i * 2] = xPoints[xOffset + i];
+            points[(i * 2) + 1] = yPoints[yOffset + i];
+        }
+        ESWTUIThreadRunner.safeSyncExec(new Runnable() {
+            public void run() {
+                graphics.getGc().drawPolygon(points);
+            }
+        });
+    }
+
+    public void drawTriangle(int x1, int y1, int x2, int y2, int x3, int y3,
+            int argbColor) {
+        setARGBColor(argbColor);
+        final int[] points = {x1, y1, x2, y2, x3, y3};
+        ESWTUIThreadRunner.safeSyncExec(new Runnable() {
+            public void run() {
+                graphics.getGc().drawPolygon(points);
+            }
+        });
+    }
+
+    public void fillPolygon(int[] xPoints, int xOffset, int[] yPoints,
+            int yOffset, int nPoints, int argbColor) {
+        setARGBColor(argbColor);
+        final int[] points = new int[nPoints * 2];
+        for (int i = 0; i < nPoints; i++) {
+            points[i * 2] = xPoints[xOffset + i];
+            points[(i * 2) + 1] = yPoints[yOffset + i];
+        }
+        ESWTUIThreadRunner.safeSyncExec(new Runnable() {
+            public void run() {
+                graphics.getGc().fillPolygon(points);
+            }
+        });
+    }
+
+    public void fillTriangle(int x1, int y1, int x2, int y2, int x3, int y3,
+            int argbColor) {
+        setARGBColor(argbColor);
+        final int[] points = {x1, y1, x2, y2, x3, y3};
+        ESWTUIThreadRunner.safeSyncExec(new Runnable() {
+            public void run() {
+                graphics.getGc().fillPolygon(points);
+            }
+        });
+    }
+
+
+    public void getPixels(final int[] pixels, final int offset,
+            final int scanlength, final int x, final int y, final int width,
+            final int height, final int format) {
+        if (format != TYPE_INT_888_RGB) {
+            throw new IllegalArgumentException(
+                    MsgRepository.DIRECTGRAPHICS_EXCEPTION_INVALID_FORMAT);
+        }
+        if (width < 0 || height < 0) {
+            throw new IllegalArgumentException(
+                   MsgRepository.DIRECTGRAPHICS_EXCEPTION_INVALID_WIDTH_HEIGHT);
+        }
+        ESWTUIThreadRunner.safeSyncExec(new Runnable() {
+            public void run() {
+                org.eclipse.swt.internal.qt.graphics.Image cgImg;
+                Object target = graphics.getGc().getBoundTarget();
+                if (target != null && target instanceof org.eclipse.swt.internal.qt.graphics.Image) {
+                    cgImg = (org.eclipse.swt.internal.qt.graphics.Image) target;
+                }
+                else {
+                    cgImg = new org.eclipse.swt.internal.qt.graphics.Image(width, height);
+                    // TODO: in future the copyArea() signature will change
+                    graphics.getGc().copyArea(cgImg, x, y);
+                }
+                cgImg.getRGB(pixels, offset, scanlength, x, y, width, height);
+                if (target == null || !(target instanceof org.eclipse.swt.internal.qt.graphics.Image)) {
+                    cgImg.dispose();
+                }
+            }
+        });
+    }
+
+    public void getPixels(final byte[] pixels, final byte[] transparencyMask,
+            final int offset, final int scanlength, final int x, final int y,
+            final int width, final int height, final int format) {
+        if (format != TYPE_BYTE_1_GRAY) {
+            throw new IllegalArgumentException(
+                    MsgRepository.DIRECTGRAPHICS_EXCEPTION_INVALID_FORMAT);
+        }
+        if (width < 0 || height < 0) {
+            throw new IllegalArgumentException(
+                   MsgRepository.DIRECTGRAPHICS_EXCEPTION_INVALID_WIDTH_HEIGHT);
+        }
+        ESWTUIThreadRunner.safeSyncExec(new Runnable() {
+            public void run() {
+                org.eclipse.swt.internal.qt.graphics.Image cgImg;
+                Object target = graphics.getGc().getBoundTarget();
+                if (target != null && target instanceof org.eclipse.swt.internal.qt.graphics.Image) {
+                    cgImg = (org.eclipse.swt.internal.qt.graphics.Image) target;
+                }
+                else {
+                    cgImg = new org.eclipse.swt.internal.qt.graphics.Image(width, height);
+                    graphics.getGc().copyArea(cgImg, x, y);
+                }
+                cgImg.getRGB(pixels, transparencyMask, offset, scanlength, x, y, width,
+                        height, getNativeFormatValue(format));
+                if (target == null || !(target instanceof org.eclipse.swt.internal.qt.graphics.Image)) {
+                    cgImg.dispose();
+                }
+            }
+        });
+    }
+
+    public void getPixels(final short[] pixels, final int offset,
+            final int scanlength, final int x, final int y, final int width,
+            final int height, final int format) {
+        if (format != TYPE_USHORT_4444_ARGB
+            && format != TYPE_USHORT_444_RGB
+            && format != TYPE_USHORT_565_RGB
+            && format != TYPE_USHORT_555_RGB) {
+            throw new IllegalArgumentException(
+                    MsgRepository.DIRECTGRAPHICS_EXCEPTION_INVALID_FORMAT);
+        }
+        if (width < 0 || height < 0) {
+            throw new IllegalArgumentException(
+                   MsgRepository.DIRECTGRAPHICS_EXCEPTION_INVALID_WIDTH_HEIGHT);
+        }
+        ESWTUIThreadRunner.safeSyncExec(new Runnable() {
+            public void run() {
+                org.eclipse.swt.internal.qt.graphics.Image cgImg;
+                Object target = graphics.getGc().getBoundTarget();
+                if (target != null && target instanceof org.eclipse.swt.internal.qt.graphics.Image) {
+                    cgImg = (org.eclipse.swt.internal.qt.graphics.Image) target;
+                }
+                else {
+                    cgImg = new org.eclipse.swt.internal.qt.graphics.Image(width, height);
+                    graphics.getGc().copyArea(cgImg, x, y);
+                }
+                cgImg.getRGB(pixels, offset, scanlength, 0, 0, width, height, getNativeFormatValue(format));
+                if (target == null || !(target instanceof org.eclipse.swt.internal.qt.graphics.Image)) {
+                    cgImg.dispose();
+                }
+            }
+        });
+    }
+
+    public void setARGBColor(int argbColor) {
+        alpha = (argbColor >> 24) & Graphics.COMPONENT_MASK;
+        graphics.setColor(argbColor);
+        ESWTUIThreadRunner.safeSyncExec(new Runnable() {
+            public void run() {
+                graphics.getGc().setForegroundAlpha(alpha);
+                graphics.getGc().setBackgroundAlpha(alpha);
+            }
+        });
+    }
+
+    public int getAlphaComponent() {
+        return alpha;
+    }
+
+    public int getNativePixelFormat() {
+        // TODO: is this the native pixel format ?
+        return TYPE_INT_8888_ARGB;
+    }
+
+    private static int getTransformation(int manipulation) {
+        // manipulations are C-CW and sprite rotations are CW
+        int ret = -1;
+        int rotation = manipulation & MANIPULATION_MASK;
+        if ((manipulation & FLIP_HORIZONTAL) != 0) {
+            if ((manipulation & FLIP_VERTICAL) != 0) {
+                // horiz and vertical flipping
+                switch (rotation) {
+                    case 0:
+                        ret = Sprite.TRANS_ROT180;
+                        break;
+                    case ROTATE_90:
+                        ret = Sprite.TRANS_ROT90;
+                        break;
+                    case ROTATE_180:
+                        ret = Sprite.TRANS_NONE;
+                        break;
+                    case ROTATE_270:
+                        ret = Sprite.TRANS_ROT270;
+                        break;
+                    default:
+                }
+            }
+            else {
+                // horizontal flipping
+                switch (rotation) {
+                    case 0:
+                        ret = Sprite.TRANS_MIRROR_ROT180;
+                        break;
+                    case ROTATE_90:
+                        ret = Sprite.TRANS_MIRROR_ROT90;
+                        break;
+                    case ROTATE_180:
+                        ret = Sprite.TRANS_MIRROR;
+                        break;
+                    case ROTATE_270:
+                        ret = Sprite.TRANS_MIRROR_ROT270;
+                        break;
+                    default:
+                }
+            }
+        }
+        else {
+            if ((manipulation & FLIP_VERTICAL) != 0) {
+                // vertical flipping
+                switch (rotation) {
+                    case 0:
+                        ret = Sprite.TRANS_MIRROR;
+                        break;
+                    case ROTATE_90:
+                        ret = Sprite.TRANS_MIRROR_ROT270;
+                        break;
+                    case ROTATE_180:
+                        ret = Sprite.TRANS_MIRROR_ROT180;
+                        break;
+                    case ROTATE_270:
+                        ret = Sprite.TRANS_MIRROR_ROT90;
+                        break;
+                    default:
+                }
+            }
+            else {
+                // no flipping
+                switch (rotation) {
+                    case 0:
+                        ret = Sprite.TRANS_NONE;
+                        break;
+                    case ROTATE_90:
+                        ret = Sprite.TRANS_ROT270;
+                        break;
+                    case ROTATE_180:
+                        ret = Sprite.TRANS_ROT180;
+                        break;
+                    case ROTATE_270:
+                        ret = Sprite.TRANS_ROT90;
+                        break;
+                    default:
+                }
+            }
+        }
+        return ret;
+    }
+
+    /**
+     * Get Native transformation value out of given LCDUI manipulation
+     *
+     * @param manipulation LCDUI manipulation
+     *
+     * @return corresponding native transformation value
+     */
+    private static int getNativeTransformValue(int manipulation) {
+        int returnVal = 0;
+        switch (manipulation) {
+            case 0:
+                returnVal =  org.eclipse.swt.internal.qt.graphics.Image.TRANS_NONE;
+                break;
+            case DirectGraphics.FLIP_HORIZONTAL:
+                returnVal =  org.eclipse.swt.internal.qt.graphics.Image.TRANS_FLIP_HORIZONTAL;
+                break;
+            case DirectGraphics.FLIP_VERTICAL:
+                returnVal =  org.eclipse.swt.internal.qt.graphics.Image.TRANS_FLIP_VERTICAL;
+                break;
+            case DirectGraphics.ROTATE_90:
+                returnVal =  org.eclipse.swt.internal.qt.graphics.Image.TRANS_ROT90;
+                break;
+            case DirectGraphics.ROTATE_180:
+                returnVal =  org.eclipse.swt.internal.qt.graphics.Image.TRANS_ROT180;
+                break;
+            case DirectGraphics.ROTATE_270:
+                returnVal =  org.eclipse.swt.internal.qt.graphics.Image.TRANS_ROT270;
+                break;
+            default:
+                returnVal =  org.eclipse.swt.internal.qt.graphics.Image.TRANS_NONE;
+        }
+        return returnVal;
+    }
+
+    /**
+     * Get Native format value out of given LCDUI format
+     *
+     * @param format LCDUI format
+     *
+     * @return corresponding native format value
+     */
+    private static int getNativeFormatValue(int format) {
+        int returnVal = 0;
+        switch (format) {
+            case 0:
+                returnVal = org.eclipse.swt.internal.qt.graphics.Image.FORMAT_IMG_NONE;
+                break;
+            case DirectGraphics.TYPE_BYTE_1_GRAY:
+                returnVal = org.eclipse.swt.internal.qt.graphics.Image.FORMAT_IMG_MONO;
+                break;
+            case DirectGraphics.TYPE_INT_8888_ARGB:
+                returnVal = org.eclipse.swt.internal.qt.graphics.Image.FORMAT_IMG_ARGB32;
+                break;
+            case DirectGraphics.TYPE_INT_888_RGB:
+                returnVal = org.eclipse.swt.internal.qt.graphics.Image.FORMAT_IMG_RGB32;
+                break;
+            case DirectGraphics.TYPE_USHORT_4444_ARGB:
+                returnVal = org.eclipse.swt.internal.qt.graphics.Image.FORMAT_IMG_RGB4444PREMULTIPLIED;
+                break;
+            case DirectGraphics.TYPE_USHORT_444_RGB:
+                returnVal = org.eclipse.swt.internal.qt.graphics.Image.FORMAT_IMG_RGB444;
+                break;
+            case DirectGraphics.TYPE_USHORT_555_RGB:
+                returnVal = org.eclipse.swt.internal.qt.graphics.Image.FORMAT_IMG_RGB555;
+                break;
+            case DirectGraphics.TYPE_USHORT_565_RGB:
+                returnVal = org.eclipse.swt.internal.qt.graphics.Image.FORMAT_IMG_RGB16;
+                break;
+            default:
+                break;
+        }
+        return returnVal;
+    }
+
+}