/* 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 #include #include #include #include #include #include #include #include #include #include #include #include #include #include typedef java::awt::Rectangle AWTRect; typedef JArray AWTRectArray; typedef std::vector 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(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; ibyte1 = 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 }