2003/10/19 02:21:59
[org.ibex.core.git] / src / org / xwt / plat / X11.cc
index ccbac13..cd5ce11 100644 (file)
@@ -19,7 +19,7 @@
 #include <org/xwt/plat/X11.h>
 #include <org/xwt/plat/X11$X11Surface.h>
 #include <org/xwt/plat/X11$X11Picture.h>
-#include <org/xwt/plat/X11$X11DoubleBuffer.h>
+#include <org/xwt/plat/X11$X11PixelBuffer.h>
 #include <org/xwt/util/Semaphore.h>
 #include <org/xwt/Platform.h>
 #include <java/lang/Long.h>
@@ -45,7 +45,7 @@ static int shm_size = 0;
 #define min(a, b) ((a) < (b) ? (a) : (b))
 #define max(a, b) ((a) < (b) ? (b) : (a))
 
-// X11DoubleBuffer //////////////////////////////////////////////////////////////////////
+// X11PixelBuffer //////////////////////////////////////////////////////////////////////
 
 // ensures that the shared memory is at least size bytes; if not, allocates 3/2 * size
 static void ensureShmSize(int size) {
@@ -66,7 +66,7 @@ static void ensureShmSize(int size) {
     }
 }
 
-void org::xwt::plat::X11$X11DoubleBuffer::fastDrawPicture(org::xwt::Picture* s,
+void org::xwt::plat::X11$X11PixelBuffer::fastDrawPicture(org::xwt::Picture* s,
                                                             jint dx1, jint dy1, jint dx2, jint dy2, jint sx1, jint sy1, jint sx2, jint sy2) {
     org::xwt::plat::X11$X11Picture* source = (org::xwt::plat::X11$X11Picture*)s;
 
@@ -88,8 +88,8 @@ void org::xwt::plat::X11$X11DoubleBuffer::fastDrawPicture(org::xwt::Picture* s,
     XCopyArea(display, *((Pixmap*)source->doublebuf->pm), (*((Pixmap*)pm)), (*((GC*)clipped_gc)), sx1, sy1, sx2 - sx1, sy2 - sy1, dx1, dy1);
 }
 
-void org::xwt::plat::X11$X11DoubleBuffer::slowDrawPicture(org::xwt::Picture* s,
-                                                            jint dx1, jint dy1, jint dx2, jint dy2, jint sx1, jint sy1, jint sx2, jint sy2) {
+void org::xwt::plat::X11$X11PixelBuffer::slowDrawPicture(org::xwt::Picture* s,
+                                                            jint dx1, jint dy1, jint dx2, jint dy2, jint sx1, jint sy1, jint sx2, jint sy2, int rgb, int alphaOnly) {
 
     org::xwt::plat::X11$X11Picture* source = (org::xwt::plat::X11$X11Picture*)s;
     XImage* xi; 
@@ -123,6 +123,9 @@ void org::xwt::plat::X11$X11DoubleBuffer::slowDrawPicture(org::xwt::Picture* s,
             
             int sourcepixel = sourcedata[source_x + source_y * source->getWidth()];
             int alpha = (sourcepixel & 0xFF000000) >> 24;
+
+            // FEATURE: be smarter here; can we do something better for the alphaonly case?
+            if (alphaOnly) sourcepixel = rgb;
             int source_red = (sourcepixel & 0x00FF0000) >> 16;
             int source_green = (sourcepixel & 0x0000FF00) >> 8;
             int source_blue = (sourcepixel & 0x000000FF);
@@ -189,7 +192,7 @@ void org::xwt::plat::X11$X11DoubleBuffer::slowDrawPicture(org::xwt::Picture* s,
     }
 }
 
-void org::xwt::plat::X11$X11DoubleBuffer::finalize() {
+void org::xwt::plat::X11$X11PixelBuffer::finalize() {
     if (shared_pixmap) {
         XShmSegmentInfo *sinfo = (XShmSegmentInfo*)shm_segment;
         XShmDetach(display, sinfo);
@@ -207,7 +210,7 @@ void org::xwt::plat::X11$X11DoubleBuffer::finalize() {
     XFreeGC(display, *((GC*)clipped_gc));
 }
 
-void org::xwt::plat::X11$X11DoubleBuffer::natInit() {
+void org::xwt::plat::X11$X11PixelBuffer::natInit() {
     
     if (width == 0 || height == 0) return;
     shared_pixmap &= shm_supported & shm_pixmaps_supported; // refuse to use shared pixmaps if we don't have shm
@@ -240,7 +243,7 @@ void org::xwt::plat::X11$X11DoubleBuffer::natInit() {
     XChangeGC(display, (*((GC*)clipped_gc)), GCGraphicsExposures, &vm);
 }    
 
-void org::xwt::plat::X11$X11DoubleBuffer::createStipple(org::xwt::plat::X11$X11Picture* xpi) {
+void org::xwt::plat::X11$X11PixelBuffer::createStipple(org::xwt::plat::X11$X11Picture* xpi) {
 
     stipple = (gnu::gcj::RawData*)malloc(sizeof(Pixmap));
     (*((Pixmap*)stipple)) = XCreatePixmap(display, RootWindow(display, screen_num), width, height, 1);
@@ -273,13 +276,13 @@ void org::xwt::plat::X11$X11DoubleBuffer::createStipple(org::xwt::plat::X11$X11P
     XPutImage(display, (*((Pixmap*)stipple)), stipple_gc, &xi, 0, 0, 0, 0, width, height);
 }
 
-void org::xwt::plat::X11$X11Surface::blit(org::xwt::DoubleBuffer* db, jint sx, jint sy, jint dx, jint dy, jint dx2, jint dy2) {
-    org::xwt::plat::X11$X11DoubleBuffer *xdb = (org::xwt::plat::X11$X11DoubleBuffer*)db;
+void org::xwt::plat::X11$X11Surface::blit(org::xwt::PixelBuffer* db, jint sx, jint sy, jint dx, jint dy, jint dx2, jint dy2) {
+    org::xwt::plat::X11$X11PixelBuffer *xdb = (org::xwt::plat::X11$X11PixelBuffer*)db;
     XCopyArea(display, *((Pixmap*)xdb->pm), *((Window*)window), *((GC*)gc), sx, sy, dx2 - dx, dy2 - dy, dx, dy);
     XFlush(display);
 }
 
-void org::xwt::plat::X11$X11DoubleBuffer::fillRect (jint x, jint y, jint x2, jint y2, jint argb) {
+void org::xwt::plat::X11$X11PixelBuffer::fillRect (jint x, jint y, jint x2, jint y2, jint argb) {
     
     jint w = x2 - x;
     jint h = y2 - y;
@@ -299,43 +302,13 @@ void org::xwt::plat::X11$X11DoubleBuffer::fillRect (jint x, jint y, jint x2, jin
     XFillRectangle(display, (*((Pixmap*)pm)), (*((GC*)gc)), x, y, w, h);
 }
 
-void org::xwt::plat::X11$X11DoubleBuffer::drawString(::java::lang::String* font, ::java::lang::String* text, jint x, jint y, jint argb) {
-    
-    XRectangle rect;
-    rect.x = clipx, rect.y = clipy; rect.width = clipw; rect.height = cliph;
-    XSetClipMask(display, (*((GC*)clipped_gc)), None);
-    XSetClipRectangles(display, (*((GC*)clipped_gc)), 0, 0, &rect, 1, YSorted);
-    XSetForeground(display, (*((GC*)clipped_gc)),
-                   ((((argb & 0x00FF0000) >> 16) * colormap_info->red_max) / 0xFF) * colormap_info->red_mult + 
-                   ((((argb & 0x0000FF00) >> 8) * colormap_info->green_max) / 0xFF) * colormap_info->green_mult + 
-                   ((((argb & 0x000000FF)) * colormap_info->blue_max) / 0xFF) * colormap_info->blue_mult +
-                   colormap_info->base_pixel
-                   );
-    
-    // Grab the string
-    int len = min(1024, JvGetStringUTFLength(text));
-    char buf[len + 1];
-    JvGetStringUTFRegion(text, 0, len, buf);
-    buf[len] = '\0';
-    
-    // Build the XTextItem structure
-    XTextItem textitem;
-    textitem.chars = buf;
-    textitem.nchars = len;
-    textitem.delta = 0;
-    textitem.font = ((XFontStruct*)org::xwt::plat::X11::fontToXFont(font))->fid;
-    
-    // Draw the text
-    XDrawText(display, (*((Pixmap*)pm)), (*((GC*)clipped_gc)), x, y, &textitem, 1);
-}
-
 
 // X11Surface //////////////////////////////////////////////////////////////////////
 
 void org::xwt::plat::X11$X11Surface::setIcon(org::xwt::Picture* pic) {
     org::xwt::plat::X11$X11Picture* p = ((org::xwt::plat::X11$X11Picture*)pic);
-    org::xwt::plat::X11$X11DoubleBuffer* old_dbuf = p->doublebuf;
-    p->buildDoubleBuffer(1);
+    org::xwt::plat::X11$X11PixelBuffer* old_dbuf = p->doublebuf;
+    p->buildPixelBuffer(1);
     XWMHints xwmh;
     memset(&xwmh, 0, sizeof(XWMHints));
     xwmh.flags |= IconPixmapHint | IconMaskHint;
@@ -376,7 +349,7 @@ void org::xwt::plat::X11$X11Surface::setSize (jint width, jint height) {
     XFlush(display);
 }
 
-void org::xwt::plat::X11$X11Surface::setLocation (jint x, jint y) { XMoveWindow(display, (*((Window*)window)), x, y); }
+void org::xwt::plat::X11$X11Surface::setLocation () { XMoveWindow(display, (*((Window*)window)), root->x, root->y); }
 void org::xwt::plat::X11$X11Surface::toFront() { XRaiseWindow(display, (*((Window*)window))); }
 void org::xwt::plat::X11$X11Surface::toBack() { XLowerWindow(display, (*((Window*)window))); }
 
@@ -791,34 +764,6 @@ void org::xwt::plat::X11::natInit() {
     org::xwt::util::Log::log(this->getClass(), JvNewStringLatin1(buf));
 }
 
-JArray<java::lang::String*>* org::xwt::plat::X11::listNativeFonts() {
-    int numfonts;
-    char** xfonts = XListFonts(display, "-*-*-*-*-normal-*-*-*-*-*-*-*-*-*", 0xFFFFFFFF, &numfonts);
-    JArray<java::lang::String*>* fonts = (JArray<java::lang::String*>*)JvNewObjectArray(numfonts, &(::java::lang::String::class$), NULL);
-    java::lang::String** jfonts = (java::lang::String**)(elements(fonts));
-    for(int i=0; i<numfonts; i++)
-        jfonts[i] = JvNewStringLatin1(xfonts[i], strlen(xfonts[i]));
-    return fonts;
-}
-
-gnu::gcj::RawData* org::xwt::plat::X11::fontStringToStruct(jstring s) {
-    int len = min(1024, JvGetStringUTFLength(s));
-    char buf[len + 1];
-    JvGetStringUTFRegion(s, 0, len, buf);
-    buf[len] = '\0';
-    return (gnu::gcj::RawData*)XLoadQueryFont(display, buf);
-}
-
-jint org::xwt::plat::X11::_getMaxAscent(::java::lang::String* font) { return ((XFontStruct*)fontToXFont(font))->max_bounds.ascent; }
-jint org::xwt::plat::X11::_getMaxDescent(::java::lang::String* font) { return ((XFontStruct*)fontToXFont(font))->max_bounds.descent; }
-jint org::xwt::plat::X11::_stringWidth(::java::lang::String* font, ::java::lang::String* text) {
-    if (text == NULL) return 0;
-    int len = JvGetStringUTFLength(text);
-    char buf[len + 1];
-    JvGetStringUTFRegion(text, 0, len, buf);
-    buf[len] = '\0';
-    return XTextWidth((XFontStruct*)fontToXFont(font), buf, len);
-}
 
 
 //////////////////////////////////////////////////////////////////////////////