diff options
Diffstat (limited to 'libjava/gnu/gcj/xlib/natGC.cc')
-rw-r--r-- | libjava/gnu/gcj/xlib/natGC.cc | 271 |
1 files changed, 271 insertions, 0 deletions
diff --git a/libjava/gnu/gcj/xlib/natGC.cc b/libjava/gnu/gcj/xlib/natGC.cc new file mode 100644 index 000000000..4529ebb60 --- /dev/null +++ b/libjava/gnu/gcj/xlib/natGC.cc @@ -0,0 +1,271 @@ +/* Copyright (C) 2000, 2003 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 <gcj/array.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); + ::GC gc = (::GC) structure; + if (gc == 0) + { + // If we haven't already created a GC, create one now + ::Drawable drawableXID = target->getXID(); + gc = XCreateGC(dpy, drawableXID, 0, 0); + structure = reinterpret_cast<gnu::gcj::RawData*>(gc); + 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 + } +} + +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; + + jint length = text->length(); + jchar* txt = JvGetStringChars(text); + + XChar2b xwchars[length]; + + // FIXME: Convert to the character set used in the font, which may + // or may not be unicode. For now, treat everything as 16-bit and + // use character codes directly, which should be OK for unicode or + // 8-bit ascii fonts. + + for (int i=0; i<length; i++) + { + XChar2b* xc = &(xwchars[i]); + jchar jc = txt[i]; + xc->byte1 = (jc >> 8) & 0xff; + xc->byte2 = jc & 0xff; + } + XDrawString16(dpy, drawableXID, gc, x, y, xwchars, length); +} + +void gnu::gcj::xlib::GC::drawPoint(jint x, jint y) +{ + Display* display = target->getDisplay(); + ::Display* dpy = (::Display*) (display->display); + ::Drawable drawableXID = target->getXID(); + ::GC gc = (::GC) structure; + XDrawPoint (dpy, drawableXID, gc, x, y); +} + +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::drawArc(jint x, jint y, jint w, jint h,jint startAngle, jint arcAngle) +{ + Display* display = target->getDisplay(); + ::Display* dpy = (::Display*) (display->display); + ::Drawable drawableXID = target->getXID(); + ::GC gc = (::GC) structure; + XDrawArc(dpy, drawableXID, gc, x, y, w, h, startAngle * 64, arcAngle * 64); +} + +void gnu::gcj::xlib::GC::fillArc(jint x, jint y, jint w, jint h,jint startAngle, jint arcAngle) +{ + Display* display = target->getDisplay(); + ::Display* dpy = (::Display*) (display->display); + ::Drawable drawableXID = target->getXID(); + ::GC gc = (::GC) structure; + XFillArc(dpy, drawableXID, gc, x, y, w, h, startAngle * 64, arcAngle * 64); +} + +void gnu::gcj::xlib::GC::fillPolygon(jintArray xPoints, jintArray yPoints, + jint nPoints, + jint translateX, jint translateY) +{ + Display* display = target->getDisplay(); + ::Display* dpy = (::Display*) (display->display); + ::Drawable drawableXID = target->getXID(); + ::GC gc = (::GC) structure; + typedef ::XPoint xpoint; + std::vector<xpoint> points(nPoints+1); + for (int i=0; i<nPoints; i++) + { + points[i].x = elements(xPoints)[i] + translateX; + points[i].y = elements(yPoints)[i] + translateY; + } + points[nPoints] = points[0]; + XFillPolygon(dpy, drawableXID, gc, &(points.front()), nPoints, + Complex, CoordModeOrigin); + // 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(AWTRectArray* rectangles) +{ + int numRect = JvGetArrayLength(rectangles); + XRectVector* xrectvector = new XRectVector(numRect); + + for (int i=0; i<numRect; i++) + { + AWTRect* awtrect = elements(rectangles)[i]; + XRectangle& xrect = (*xrectvector)[i]; + + xrect.x = awtrect->x; + xrect.y = awtrect->y; + xrect.width = awtrect->width; + xrect.height = awtrect->height; + } + + Display* display = target->getDisplay(); + ::Display* dpy = (::Display*) (display->display); + ::GC gc = (::GC) structure; + + int originX = 0; + int originY = 0; + int ordering = Unsorted; + XSetClipRectangles(dpy, gc, originX, originY, + &(xrectvector->front()), numRect, + ordering); + delete xrectvector; +} + +void gnu::gcj::xlib::GC::copyArea (gnu::gcj::xlib::Drawable * source, + 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; + ::Drawable srcXID = source->getXID (); + + XCopyArea (dpy, srcXID, drawableXID, gc, srcX, srcY, width, height, + destX, destY); +} |