| /* 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. */ |
| |
| #include <vector> |
| |
| #include <X11/Xlib.h> |
| |
| #include <gcj/cni.h> |
| #include <gnu/gcj/RawData.h> |
| #include <java/lang/String.h> |
| #include <java/awt/Rectangle.h> |
| |
| #include <gnu/gcj/xlib/Display.h> |
| #include <gnu/gcj/xlib/XID.h> |
| #include <gnu/gcj/xlib/Drawable.h> |
| #include <gnu/gcj/xlib/Font.h> |
| #include <gnu/gcj/xlib/XImage.h> |
| #include <gnu/gcj/xlib/XException.h> |
| #include <gnu/gcj/xlib/Clip.h> |
| #include <gnu/gcj/xlib/GC.h> |
| #include <gnu/gcj/xlib/XException.h> |
| |
| typedef java::awt::Rectangle AWTRect; |
| typedef JArray<AWTRect*> AWTRectArray; |
| typedef std::vector<XRectangle> XRectVector; |
| |
| void gnu::gcj::xlib::GC::initStructure(GC* copyFrom) |
| { |
| Display* display = target->getDisplay(); |
| ::Display* dpy = (::Display*) (display->display); |
| ::Drawable drawableXID = target->getXID(); |
| |
| ::GC gc = XCreateGC(dpy, drawableXID, 0, 0); |
| |
| if (gc == 0) |
| throw new XException(JvNewStringLatin1("GC creation failed")); |
| |
| if (copyFrom != 0) |
| { |
| ::GC fromGC = (::GC) copyFrom->structure; |
| XCopyGC(dpy, fromGC, ~0, gc); |
| // no fast fail |
| } |
| |
| structure = reinterpret_cast<gnu::gcj::RawData*>(gc); |
| } |
| |
| void gnu::gcj::xlib::GC::disposeImpl() |
| { |
| gnu::gcj::RawData* lStructure = structure; |
| Drawable* lTargetType = target; |
| |
| if ((lStructure == 0) || (lTargetType == 0)) |
| return; |
| |
| structure = 0; |
| target = 0; |
| |
| Display* display = lTargetType->getDisplay(); |
| ::Display* dpy = (::Display*) (display->display); |
| ::GC gc = (::GC) lStructure; |
| |
| XFreeGC(dpy, gc); |
| // no fast fail |
| } |
| |
| void gnu::gcj::xlib::GC::setForeground(jlong pixel) |
| { |
| Display* display = target->getDisplay(); |
| ::Display* dpy = (::Display*) (display->display); |
| ::GC gc = (::GC) structure; |
| XSetForeground(dpy, gc, pixel); |
| // no fast fail |
| } |
| |
| void gnu::gcj::xlib::GC::setFont(Font* font) |
| { |
| Display* display = target->getDisplay(); |
| ::Display* dpy = (::Display*) (display->display); |
| ::GC gc = (::GC) structure; |
| XSetFont(dpy, gc, font->getXID()); |
| // no fast fail |
| } |
| |
| void gnu::gcj::xlib::GC::drawString(jstring text, jint x, jint y) |
| { |
| Display* display = target->getDisplay(); |
| ::Display* dpy = (::Display*) (display->display); |
| ::Drawable drawableXID = target->getXID(); |
| ::GC gc = (::GC) structure; |
| |
| /* |
| FIXME: do something along the lines of the following instead: |
| |
| jint length = text->length(); |
| jchar* txt = JvGetStringChars(text); |
| |
| XChar2b xwchars[length]; |
| |
| // FIXME: Add convertion and caching |
| |
| for (int i=0; i<length; i++) |
| { |
| XChar2b* xc = &(xwchars[i]); |
| jchar jc = txt[i]; |
| xc->byte1 = jc & 0xff; |
| xc->byte2 = jc >> 8; |
| } |
| |
| XDrawString16(dpy, drawableXID, gc, x, y, xwchars, length); |
| */ |
| |
| // FIXME, temporary code: |
| int len = JvGetStringUTFLength(text); |
| char ctxt[len+1]; |
| JvGetStringUTFRegion(text, 0, text->length(), ctxt); |
| ctxt[len] = '\0'; |
| XDrawString(dpy, drawableXID, gc, x, y, ctxt, len); |
| // no fast fail |
| } |
| |
| void gnu::gcj::xlib::GC::drawLine(jint x1, jint y1, jint x2, jint y2) |
| { |
| Display* display = target->getDisplay(); |
| ::Display* dpy = (::Display*) (display->display); |
| ::Drawable drawableXID = target->getXID(); |
| ::GC gc = (::GC) structure; |
| XDrawLine(dpy, drawableXID, gc, x1, y1, x2, y2); |
| // no fast fail |
| } |
| |
| void gnu::gcj::xlib::GC::drawRectangle(jint x, jint y, jint w, jint h) |
| { |
| Display* display = target->getDisplay(); |
| ::Display* dpy = (::Display*) (display->display); |
| ::Drawable drawableXID = target->getXID(); |
| ::GC gc = (::GC) structure; |
| XDrawRectangle(dpy, drawableXID, gc, x, y, w, h); |
| // no fast fail |
| } |
| |
| void gnu::gcj::xlib::GC::fillRectangle(jint x, jint y, jint w, jint h) |
| { |
| Display* display = target->getDisplay(); |
| ::Display* dpy = (::Display*) (display->display); |
| ::Drawable drawableXID = target->getXID(); |
| ::GC gc = (::GC) structure; |
| XFillRectangle(dpy, drawableXID, gc, x, y, w, h); |
| // no fast fail |
| } |
| |
| void gnu::gcj::xlib::GC::clearArea(jint x, jint y, jint w, jint h, |
| jboolean exposures) |
| { |
| Display* display = target->getDisplay(); |
| ::Display* dpy = (::Display*) (display->display); |
| ::Drawable drawableXID = target->getXID(); |
| |
| XClearArea(dpy, drawableXID, x, y, w, h, |
| exposures ? True : False); |
| // no fast fail |
| } |
| |
| |
| void gnu::gcj::xlib::GC::putImage(XImage* image, |
| jint srcX, jint srcY, |
| jint destX, jint destY, |
| jint width, jint height) |
| { |
| Display* display = target->getDisplay(); |
| ::Display* dpy = (::Display*) (display->display); |
| ::Drawable drawableXID = target->getXID(); |
| ::GC gc = (::GC) structure; |
| ::XImage* ximage = (::XImage*) (image->structure); |
| |
| XPutImage(dpy, drawableXID, gc, ximage, |
| srcX, srcY, |
| destX, destY, |
| width, height); |
| // no fast fail |
| } |
| |
| void gnu::gcj::xlib::GC::updateClip() |
| { |
| if (clip == 0) |
| return; |
| |
| Display* display = target->getDisplay(); |
| ::Display* dpy = (::Display*) (display->display); |
| ::GC gc = (::GC) structure; |
| |
| XRectVector* xrectvector = (XRectVector*) (clip->xrects); |
| int numRect = xrectvector->size(); |
| |
| int originX = 0; |
| int originY = 0; |
| int ordering = Unsorted; |
| XSetClipRectangles(dpy, gc, originX, originY, |
| &(xrectvector->front()), numRect, |
| ordering); |
| // no fast fail |
| } |