diff options
author | upstream source tree <ports@midipix.org> | 2015-03-15 20:14:05 -0400 |
---|---|---|
committer | upstream source tree <ports@midipix.org> | 2015-03-15 20:14:05 -0400 |
commit | 554fd8c5195424bdbcabf5de30fdc183aba391bd (patch) | |
tree | 976dc5ab7fddf506dadce60ae936f43f58787092 /libjava/gnu/gcj/xlib/Drawable.java | |
download | cbb-gcc-4.6.4-554fd8c5195424bdbcabf5de30fdc183aba391bd.tar.bz2 cbb-gcc-4.6.4-554fd8c5195424bdbcabf5de30fdc183aba391bd.tar.xz |
obtained gcc-4.6.4.tar.bz2 from upstream website;upstream
verified gcc-4.6.4.tar.bz2.sig;
imported gcc-4.6.4 source tree from verified upstream tarball.
downloading a git-generated archive based on the 'upstream' tag
should provide you with a source tree that is binary identical
to the one extracted from the above tarball.
if you have obtained the source via the command 'git clone',
however, do note that line-endings of files in your working
directory might differ from line-endings of the respective
files in the upstream repository.
Diffstat (limited to 'libjava/gnu/gcj/xlib/Drawable.java')
-rw-r--r-- | libjava/gnu/gcj/xlib/Drawable.java | 118 |
1 files changed, 118 insertions, 0 deletions
diff --git a/libjava/gnu/gcj/xlib/Drawable.java b/libjava/gnu/gcj/xlib/Drawable.java new file mode 100644 index 000000000..fa12ba2b3 --- /dev/null +++ b/libjava/gnu/gcj/xlib/Drawable.java @@ -0,0 +1,118 @@ +/* Copyright (C) 1999, 2000 Free Software Foundation + + This file is part of libgcj. + +This software is copyrighted work licensed under the terms of the +Libgcj License. Please consult the file "LIBGCJ_LICENSE" for +details. */ + +package gnu.gcj.xlib; + +import java.awt.Rectangle; + +/** An X11 drawable. + * + * @author Rolf W. Rasmussen <rolfwr@ii.uib.no> + */ +public class Drawable extends XID +{ + private GC[] gcCache = new GC[10]; + private int gcCachedCount = 0; + + public Drawable(Display display, int xid) + { + super(display, xid); + } + + /** + * Gets as much as possible of the image data within the requested + * region. Data from obscured parts of windows may not be + * retrievable. + * + * @param dest where to place the image data. + * + * @return the actual region of image data that was retrieved. + */ + public Rectangle copyIntoXImage(XImage dest, Rectangle bounds, + int destX, int destY) + { + Rectangle newBounds = null; + int tries = 5; + while (!bounds.isEmpty()) + { + if (copyIntoXImageImpl(dest, bounds.x, bounds.y, + bounds.width, bounds.height, + destX, destY)) + return bounds; + + // failed, likely due to wrong bounds... + + newBounds = getBounds(newBounds); + + bounds = newBounds.intersection(bounds); + + tries--; + + if (tries < 0) + throw new RuntimeException("copyIntoXImage is buggy"); + + } + + return bounds; // always empty + } + + + + /** + * Performs an XGetSubImage. This method will fail if the X server + * does not possess the requested image data. This might occur when + * requesting the image date of a window that is partially obscured. + * + * @param desitantionImage where to place the image data + * + * @return false if method was unable to read the requested region. + */ + private native boolean copyIntoXImageImpl(XImage destinationImage, + int x, int y, + int width, int height, + int destX, int destY); + + public native Rectangle getBounds(Rectangle rv); + + public native int getDepth (); + + private static final String MSG_XGETSUBIMAGE_FAILED = + "XGetSubImage() failed."; + + protected void finalize() throws Throwable + { + // Dispose all the cached GCs, to reduce X server resource usage + for (int i=0; i<gcCachedCount; i++) + gcCache[i].disposeImpl (); + gcCachedCount = 0; + super.finalize(); + } + + /** Put a GC in the cache for this drawable, so it can be retrieved later. + * @param gc The GC to put + */ + void putGCInCache (GC gc) + { + if (gcCachedCount >= gcCache.length) + { + // List full - extend it to double its present size + GC[] oldList = gcCache; + gcCache = new GC[oldList.length*2]; + System.arraycopy (oldList,0,gcCache,0,oldList.length); + } + gcCache[gcCachedCount++] = gc; + } + + /** Get a GC from the cache, if available + * @return A GC from the cache, or null if the cache is empty + */ + GC getGCFromCache () + { + return (gcCachedCount>0) ? gcCache[--gcCachedCount] : null; + } +} |