📄 natgc.cc
字号:
/* Copyright (C) 2000, 2003 Free Software Foundation This file is part of libgcj.This software is copyrighted work licensed under the terms of theLibgcj License. Please consult the file "LIBGCJ_LICENSE" fordetails. */#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);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -