diff options
Diffstat (limited to 'libjava/gnu/gcj/xlib/Visual.java')
-rw-r--r-- | libjava/gnu/gcj/xlib/Visual.java | 152 |
1 files changed, 152 insertions, 0 deletions
diff --git a/libjava/gnu/gcj/xlib/Visual.java b/libjava/gnu/gcj/xlib/Visual.java new file mode 100644 index 000000000..46fd3ee99 --- /dev/null +++ b/libjava/gnu/gcj/xlib/Visual.java @@ -0,0 +1,152 @@ +/* Copyright (C) 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 gnu.gcj.RawData; + +/** + * A visual determines how a color is encoded into a pixel/bitfield + * value. It does not determine how the pixel/bitfield value is + * encoded into the image data. + * + * <p>This class encapsulates all three Xlib representations of a + * visual. + * + * <ul> + * + * <li>int: visual id. + * + * <li>Visual: opaque data structure used by a lot of Xlib functions. + * + * <li>VisualInfo: transparent data structure that binds the visual to + * a certain screen and depth. + * + * </ul> + * + * <p>Implementation note: This class does not examine nor manipulate + * the Visual structure, since the X manual says the structure is + * opaque, and that XVisualInfo should be used instead.</p> + * + * @author Rolf W. Rasmussen <rolfwr@ii.uib.no> + */ +public final class Visual +{ + public static final int VC_STATIC_GRAY = 0, + VC_GRAY_SCALE = 1, + VC_STATIC_COLOR = 2, + VC_PSEUDO_COLOR = 3, + VC_TRUE_COLOR = 4, + VC_DIRECT_COLOR = 5; + + protected static final int MASK_ID = 1 << 0, + MASK_SCREEN = 1 << 1, + MASK_DEPTH = 1 << 2, + MASK_CLASS = 1 << 3, + MASK_RED = 1 << 4, + MASK_GREEN = 1 << 5, + MASK_BLUE = 1 << 6, + MASK_COLORMAP_SIZE = 1 << 7, + MASK_BITS_PER_RGB = 1 << 8; + + protected static final int MASK_ALL = MASK_ID + | MASK_SCREEN + | MASK_DEPTH + | MASK_CLASS + | MASK_RED + | MASK_GREEN + | MASK_BLUE + | MASK_COLORMAP_SIZE + | MASK_BITS_PER_RGB; + + private static final int MASK_VISUAL_STRUCTURE = 1 << 31; + + Display display; + RawData xVisualInfo; + int infoMask; + Screen screen; + + Visual(RawData structure, Screen screen, int depth ) + { + this.display = screen.getDisplay(); + this.screen = screen; + init(structure, depth); + } + + Visual(Display display, RawData structure, int depth ) + { + this.display = display; + init(structure, depth); + } + + protected native void init(RawData structure, int depth); + + protected native void finalize(); + + /** + * + * Returns the a reference to the visual structure. This method has + * package accessibility since the data visual structure is only + * useful for direct Xlib calls. + * + * @return a pointer to the visual structure. + */ + native RawData getVisualStructure(); + + + // These methods only make sense if the visual is decomposed: + + public native int getRedMask(); + public native int getGreenMask(); + public native int getBlueMask(); + + public native int getScreenNumber(); + public native int getDepth(); + + public Screen getScreen() + { + if (screen == null) + screen = new Screen(display, getScreenNumber()); + return screen; + } + + public native int getVisualClass(); + + public boolean hasRGBSubfields() + { + switch (getVisualClass()) + { + case VC_TRUE_COLOR: + case VC_DIRECT_COLOR: + return true; + default: + return false; + } + } + + protected native void ensureXVisualInfo(int requiredMask); + + + public String toString() + { + int missingInfo = ~infoMask; + boolean hasSubfieldInfo = + (missingInfo & (MASK_CLASS|MASK_RED|MASK_GREEN|MASK_BLUE)) == 0; + + boolean hasDepth = (missingInfo & MASK_DEPTH) == 0; + + return getClass().getName() + "[" + + (hasDepth ? "depth=" + getDepth() : "") + + (hasRGBSubfields() ? + (", redMask=" + Integer.toHexString(getRedMask()) + + ", greenMask=" + Integer.toHexString(getGreenMask()) + + ", blueMask=" + Integer.toHexString(getBlueMask())) : + ", no-subfields") + ", class=" + getVisualClass() + + "]"; + } +} |