diff -r 85266cc22c7f -r f40128debb5d javauis/lcdui_qt/src/javax/microedition/lcdui/Buffer.java --- a/javauis/lcdui_qt/src/javax/microedition/lcdui/Buffer.java Fri Jun 11 13:33:44 2010 +0300 +++ b/javauis/lcdui_qt/src/javax/microedition/lcdui/Buffer.java Wed Jun 23 18:07:10 2010 +0300 @@ -56,12 +56,16 @@ final static int HOST_TYPE_CUSTOMITEM = 3; // Flags for raising settings validation - private final static int NONE = 0; - private final static int COLOR = 1; - private final static int CLIP = 2; - private final static int FONT = 4; - private final static int STROKESTYLE = 8; - private final static int COORS_TRANSLATION = 16; + // FORCE_SETTINGS Forces settings to validated also in case + // there's only one Graphics instance as client, normally + // settings are not checked in such case + final static int NONE = 0; + final static int COLOR = 1; + final static int CLIP = 2; + final static int FONT = 4; + final static int STROKESTYLE = 8; + final static int COORDS_TRANSLATION = 16; + final static int FORCE_SETTINGS = 32; // Graphics settings active in buffer // all values are comparable to those @@ -107,35 +111,35 @@ */ static Buffer createInstance(Object host, Control control) { - if(host instanceof Canvas) - { - if(OS.windowServer == OS.WS_SYMBIAN_S60) - { - return new CanvasBufferSymbian((Canvas) host, control); - } - else if(OS.windowServer == OS.WS_X11) - { - return new CanvasBufferLinux((Canvas) host, control); - } - return null; - } - else if(host instanceof CustomItem) - { - if(OS.windowServer == OS.WS_SYMBIAN_S60) - { - return new CustomItemBufferSymbian((CustomItem) host, control); - } - else if(OS.windowServer == OS.WS_X11) - { - return new CustomItemBufferLinux((CustomItem) host, control); - } - return null; - } - else if(host instanceof Image) - { - return new ImageBuffer((Image) host); - } - return null; + if(host instanceof Canvas) + { + if(OS.windowServer == OS.WS_SYMBIAN_S60) + { + return new CanvasBufferSymbian((Canvas) host, control); + } + else if(OS.windowServer == OS.WS_X11) + { + return new CanvasBufferLinux((Canvas) host, control); + } + return null; + } + else if(host instanceof CustomItem) + { + if(OS.windowServer == OS.WS_SYMBIAN_S60) + { + return new CustomItemBufferSymbian((CustomItem) host, control); + } + else if(OS.windowServer == OS.WS_X11) + { + return new CustomItemBufferLinux((CustomItem) host, control); + } + return null; + } + else if(host instanceof Image) + { + return new ImageBuffer((Image) host); + } + return null; } /** @@ -154,8 +158,7 @@ /** * Defines the bounds of the host. * Bounds are used for restricting the rendering in - * the area of the control that is being updated. With Images - * the bounds are not used. + * the area of the control that is being updated. * * @param crtl The Control of the host * @param clienArea The area of the control which can be drawn by Graphics @@ -177,6 +180,20 @@ } /** + * Defines the bounds of the host. + * + * @param crtl The Control of the host + * @param clienArea The area of the control which can be drawn by Graphics + */ + void setImageBounds(int width, int height) + { + hostBounds.x = 0; + hostBounds.y = 0; + hostBounds.width = width; + hostBounds.height = height; + } + + /** * Prepares surface for a new frame and starts paint session. * Must be called in UI thread (sync calls this automatically) * and at the start of new frame. The rectangle provided as @@ -189,11 +206,11 @@ */ void startFrame(int x, int y, int w, int h) { - if(!isSurfaceSessionOpen) - { - beginPaint(x, y, w, h); - isSurfaceSessionOpen = true; - } + if(!isSurfaceSessionOpen) + { + beginPaint(x, y, w, h); + isSurfaceSessionOpen = true; + } } /** @@ -202,11 +219,11 @@ */ void endFrame() { - if(isSurfaceSessionOpen) - { - endPaint(); - isSurfaceSessionOpen = false; - } + if(isSurfaceSessionOpen) + { + endPaint(); + isSurfaceSessionOpen = false; + } } /** @@ -216,8 +233,8 @@ */ void blitToDisplay(GraphicsContext gc, Widget widget) { - endFrame(); - blit(gc, widget); + endFrame(); + blit(gc, widget); } /** @@ -286,7 +303,7 @@ // write the default values to the buffer if(clientCount == 1) { - writeDefaultValuesToBuffer(); + writeDefaultValuesToBuffer(); } return new Graphics(this, hostBounds ); } @@ -299,7 +316,7 @@ */ void sync() { - sync(true); + sync(true); } /** @@ -325,7 +342,7 @@ } // Start surface session if not started yet - startFrame(hostBounds.x, hostBounds.y , hostBounds.width , hostBounds.height); + startFrame(hostBounds.x, hostBounds.y , hostBounds.width , hostBounds.height); doRelease(); bindToHost(gc); @@ -365,12 +382,12 @@ */ void dispose() { - if(gc != null) - { + if(gc != null) + { doRelease(); gc.dispose(); gc = null; - } + } commandBuffer = null; } @@ -381,31 +398,31 @@ void fillRect(int x, int y, int w, int h, Graphics client) { - validateAndApplySettings((COLOR|CLIP|COORS_TRANSLATION), client); + validateAndApplySettings((COLOR|CLIP|COORDS_TRANSLATION), client); gc.fillRect(x, y, w, h); } void fillRoundRect(int x, int y, int w, int h, int arcW, int arcH, Graphics client) { - validateAndApplySettings((COLOR|CLIP|COORS_TRANSLATION), client); + validateAndApplySettings((COLOR|CLIP|COORDS_TRANSLATION), client); gc.fillRoundRect(x, y, w, h, arcW, arcH); } void fillArc(int x, int y, int w, int h, int startAngle, int arcAngle, Graphics client) { - validateAndApplySettings((COLOR|CLIP|COORS_TRANSLATION), client); + validateAndApplySettings((COLOR|CLIP|COORDS_TRANSLATION), client); gc.fillArc(x, y, w, h, startAngle, arcAngle); } void fillTriangle(int[] points, Graphics client) { - validateAndApplySettings((COLOR|CLIP|COORS_TRANSLATION), client); + validateAndApplySettings((COLOR|CLIP|COORDS_TRANSLATION), client); gc.fillPolygon(points); } void setClip(int x, int y, int w, int h, Graphics client) { - validateAndApplySettings(COORS_TRANSLATION, client); + validateAndApplySettings(COORDS_TRANSLATION, client); // check if given clip is already active in buffer if((bufferClip.x == x) && (bufferClip.y == y) && (bufferClip.width == w) && (bufferClip.height== h)) @@ -420,7 +437,7 @@ } // translate clip to display coordinates and apply - Rectangle rect = clipToDisplayCoords(x, y, w, h); + Rectangle rect = clipToWindowCoords(x, y, w, h); if(rect.isEmpty()) { // check is buffer clip is already up to date @@ -452,6 +469,11 @@ gc.setClip(rect.x, rect.y, rect.width, rect.height, false); } + void setGraphicsDefaults(Graphics client) + { + validateAndApplySettings((FONT|COLOR|STROKESTYLE|COORDS_TRANSLATION|FORCE_SETTINGS), client); + } + void setColor(int r, int g, int b, Graphics client) { // check if given color is already active in buffer @@ -503,37 +525,37 @@ void drawLine(int xStart, int yStart, int xEnd, int yEnd, Graphics client) { - validateAndApplySettings((COLOR|CLIP|COORS_TRANSLATION|STROKESTYLE), client); + validateAndApplySettings((COLOR|CLIP|COORDS_TRANSLATION|STROKESTYLE), client); gc.drawLine(xStart, yStart, xEnd, yEnd); } void drawRect(int x, int y, int w, int h, Graphics client) { - validateAndApplySettings((COLOR|CLIP|COORS_TRANSLATION|STROKESTYLE), client); + validateAndApplySettings((COLOR|CLIP|COORDS_TRANSLATION|STROKESTYLE), client); gc.drawRect(x, y, w, h); } void drawRoundRect(int x, int y, int w, int h, int arcW, int arcH, Graphics client) { - validateAndApplySettings((COLOR|CLIP|COORS_TRANSLATION|STROKESTYLE), client); + validateAndApplySettings((COLOR|CLIP|COORDS_TRANSLATION|STROKESTYLE), client); gc.drawRoundRect(x, y, w, h, arcW, arcH); } void drawArc(int x, int y, int w, int h, int startAngle, int arcAngle, Graphics client) { - validateAndApplySettings((COLOR|CLIP|COORS_TRANSLATION|STROKESTYLE), client); + validateAndApplySettings((COLOR|CLIP|COORDS_TRANSLATION|STROKESTYLE), client); gc.drawArc(x, y, w, h, startAngle, arcAngle); } void drawString(String string, int x, int y, Graphics client) { - validateAndApplySettings((COLOR|CLIP|COORS_TRANSLATION|FONT), client); + validateAndApplySettings((COLOR|CLIP|COORDS_TRANSLATION|FONT), client); gc.drawString(string, x, y, true); } void drawImage(org.eclipse.swt.internal.qt.graphics.Image image, int x,int y, Graphics client) { - validateAndApplySettings((CLIP|COORS_TRANSLATION), client); + validateAndApplySettings((CLIP|COORDS_TRANSLATION), client); gc.drawImage(image, x, y); } @@ -541,7 +563,7 @@ int wDst, int hDst, int xSrc, int ySrc, int wSrc, int hSrc, int transform, Graphics client) { - validateAndApplySettings((CLIP|COORS_TRANSLATION), client); + validateAndApplySettings((CLIP|COORDS_TRANSLATION), client); gc.drawImage(image, xDst, yDst, wDst, hDst, xSrc, ySrc, wSrc, hSrc, transform); } @@ -555,7 +577,7 @@ boolean alpha, Graphics client) { - validateAndApplySettings((CLIP|COORS_TRANSLATION), client); + validateAndApplySettings((CLIP|COORDS_TRANSLATION), client); gc.drawRGB(rgb, offset, scanlength, x, y, w, h, alpha); } @@ -570,7 +592,7 @@ int manipulation, Graphics client) { - validateAndApplySettings((CLIP|COORS_TRANSLATION), client); + validateAndApplySettings((CLIP|COORDS_TRANSLATION), client); gc.drawRGB(rgb, offset, scanlength, x, y, w, h, alpha, manipulation); } @@ -586,7 +608,7 @@ int format, Graphics client) { - validateAndApplySettings((CLIP|COORS_TRANSLATION), client); + validateAndApplySettings((CLIP|COORDS_TRANSLATION), client); gc.drawRGB(rgb, transparencyMask, offset, scanlength, x, y, w, h, manipulation, format); } @@ -602,19 +624,19 @@ int format, Graphics client) { - validateAndApplySettings((CLIP|COORS_TRANSLATION), client); + validateAndApplySettings((CLIP|COORDS_TRANSLATION), client); gc.drawRGB(rgb, offset, scanlength, x, y, w, h, alpha, manipulation, format); } void drawPolygon(int[] points, Graphics client) { - validateAndApplySettings((COLOR|CLIP|COORS_TRANSLATION|STROKESTYLE), client); + validateAndApplySettings((COLOR|CLIP|COORDS_TRANSLATION|STROKESTYLE), client); gc.drawPolygon(points); } void fillPolygon(int[] points, Graphics client) { - validateAndApplySettings((COLOR|CLIP|COORS_TRANSLATION), client); + validateAndApplySettings((COLOR|CLIP|COORDS_TRANSLATION), client); gc.fillPolygon(points); } @@ -658,8 +680,16 @@ return null; } + boolean containsDrawnPrimitives() { + boolean result = false; + if(commandBuffer != null) { + result = commandBuffer.containsDrawnPrimitives(); + } + return result; + } + /** - * Translates given rectangle to display/window surface coordinates + * Translates given rectangle to window surface coordinates * and outlines the clip inside the control bounds. * * @param x The x-coordinate of the rectangle @@ -668,7 +698,7 @@ * @param h The height of the rectangle * */ - private Rectangle clipToDisplayCoords(int x, int y, int w, int h) + private Rectangle clipToWindowCoords(int x, int y, int w, int h) { // Bottom-right corner of control bounds in window coordinates final int hostX2 = hostBounds.x + hostBounds.width; @@ -701,7 +731,7 @@ clipY2 = clipY2Dpy < hostBounds.y ? (clipY2 + (hostBounds.y - clipY1Dpy)) : clipY2; clipY2 = clipY2Dpy > hostY2 ? (clipY2 - (clipY1Dpy - hostY2)) : clipY2; - return new Rectangle(clipX1, clipY1, (clipX2 - clipX1) , (clipY1 - clipY2)); + return new Rectangle(clipX1, clipY1, (clipX2 - clipX1) , (clipY2 - clipY1)); } /** @@ -715,7 +745,7 @@ */ private void validateAndApplySettings(int flags, Graphics client) { - if(!clientChanged(client)) + if(!clientChanged(client) && (FORCE_SETTINGS & flags) == 0) { return; } @@ -736,7 +766,7 @@ client.currentClip[3] != bufferClip.height) { - Rectangle rect = clipToDisplayCoords(client.currentClip[0], client.currentClip[1], + Rectangle rect = clipToWindowCoords(client.currentClip[0], client.currentClip[1], client.currentClip[2], client.currentClip[3]); gc.setClip(rect.x, rect.y, rect.width, rect.height, false); bufferClip.x = client.currentClip[0]; @@ -745,7 +775,7 @@ bufferClip.height = client.currentClip[3]; } } - if((COORS_TRANSLATION & flags) != 0) + if((COORDS_TRANSLATION & flags) != 0) { if((bufferTranslateX != client.translateX) && (bufferTranslateY != client.translateY)) { @@ -815,6 +845,9 @@ /** * Writes Graphics default values to buffer + * @param force If true defaults are written unconditionally to buffer, + * otherwise only values that different than the ones in buffer + * are written */ private void writeDefaultValuesToBuffer() {