summaryrefslogtreecommitdiff
path: root/libjava/gnu/gcj/xlib/natGC.cc
diff options
context:
space:
mode:
authorupstream source tree <ports@midipix.org>2015-03-15 20:14:05 -0400
committerupstream source tree <ports@midipix.org>2015-03-15 20:14:05 -0400
commit554fd8c5195424bdbcabf5de30fdc183aba391bd (patch)
tree976dc5ab7fddf506dadce60ae936f43f58787092 /libjava/gnu/gcj/xlib/natGC.cc
downloadcbb-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/natGC.cc')
-rw-r--r--libjava/gnu/gcj/xlib/natGC.cc271
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);
+}