001: /*
002: *
003: *
004: * Copyright 1990-2007 Sun Microsystems, Inc. All Rights Reserved.
005: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
006: *
007: * This program is free software; you can redistribute it and/or
008: * modify it under the terms of the GNU General Public License version
009: * 2 only, as published by the Free Software Foundation.
010: *
011: * This program is distributed in the hope that it will be useful, but
012: * WITHOUT ANY WARRANTY; without even the implied warranty of
013: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
014: * General Public License version 2 for more details (a copy is
015: * included at /legal/license.txt).
016: *
017: * You should have received a copy of the GNU General Public License
018: * version 2 along with this work; if not, write to the Free Software
019: * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
020: * 02110-1301 USA
021: *
022: * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
023: * Clara, CA 95054 or visit www.sun.com if you need additional
024: * information or have any questions.
025: */
026:
027: package com.sun.midp.chameleon;
028:
029: import javax.microedition.lcdui.*;
030: import java.util.Vector;
031:
032: /**
033: * Chameleon graphics queue class. This class contains methods
034: * to help to better control when, how, and how many pixels
035: * actually get blitted from the buffer to the physical display.
036: */
037: public class CGraphicsQ {
038: /**
039: * By turning on "debug" mode, all of Chameleon's graphics engine
040: * will output tracing info regarding dirty regions, layer locations,
041: * bounds, repaints, etc.
042: */
043: public static final boolean DEBUG = false;
044:
045: /** A queue of refresh areas, represented by 4 element arrays */
046: protected Vector refreshQ;
047:
048: /**
049: * Construct a new Graphics queue.
050: */
051: public CGraphicsQ() {
052: refreshQ = new Vector();
053: }
054:
055: /**
056: * Add the specified region to the queue of areas to be
057: * refreshed. That is, the region specified by the given
058: * coordinates represents a region that has been repainted
059: * and needs to be blitted to the display. The coordinates
060: * of the region should be in raw screen coordinates, that
061: * is, 0,0 would represent the topleft pixel on the screen.
062: *
063: * @param x the 'x' anchor coordinate of the region
064: * @param y the 'y' anchor coordinate of the region
065: * @param w the width of the region
066: * @param h the height of the region
067: */
068: public void queueRefresh(int x, int y, int w, int h) {
069: synchronized (refreshQ) {
070: int[] region;
071: for (int i = 0; i < refreshQ.size(); i++) {
072: region = (int[]) refreshQ.elementAt(i);
073:
074: // We test to see if we already have the dirty region
075: if (region[0] == x && region[1] == y && region[2] == w
076: && region[3] == h) {
077: return;
078: }
079:
080: // We also test to see if the dirty region is wholely
081: // contained within another region
082: if (x >= region[0] && y >= region[1]
083: && (x + w) <= (region[0] + region[1])
084: && (y + h) <= (region[1] + region[3])) {
085: return;
086: }
087:
088: // Lastly, we do a special case whereby the region
089: // is congruent with a previous region. For instance,
090: // when changing screens, the title area will repaint,
091: // the body area will repaint, and the soft button
092: // area will repaint. All 3 areas are congruent and
093: // can be coalesced.
094: if (x == region[0] && w == region[2]) {
095: if ((region[1] + region[3]) == y
096: || (y + h) == region[1]) {
097: if (region[1] > y) {
098: region[1] = y;
099: }
100: region[3] += h;
101: return;
102: }
103: }
104: }
105: refreshQ.addElement(new int[] { x, y, w, h });
106: }
107: }
108:
109: /**
110: * Get the queue of all areas of the screen to be refreshed
111: * (blitted to the screen). This method will empty the queue
112: * and return its contents. Each element in the array will be
113: * a 4 element int[] holding the x, y, w, and h of each refresh
114: * region
115: *
116: * @return the queue of all areas of the screen to be refreshed,
117: * as an array of arrays
118: */
119: public Object[] getRefreshRegions() {
120: synchronized (refreshQ) {
121: Object[] q = new Object[refreshQ.size()];
122: refreshQ.copyInto(q);
123: refreshQ.removeAllElements();
124: return q;
125: }
126: }
127: }
|