diff --git a/graphics/grTCairo2.c b/graphics/grTCairo2.c index c43056f1..440fb16e 100644 --- a/graphics/grTCairo2.c +++ b/graphics/grTCairo2.c @@ -82,8 +82,6 @@ int nb; cairo_move_to(tcairodata->context, lines[i].r_ll.p_x, lines[i].r_ll.p_y); cairo_line_to(tcairodata->context, lines[i].r_ur.p_x, lines[i].r_ur.p_y); } - // cairo_set_source_rgba(tcairodata->context, r, g, b, a); - // cairo_set_line_width(tcairodata->context, width); cairo_stroke(tcairodata->context); cairo_restore(tcairodata->context); } diff --git a/graphics/grTOGL1.c b/graphics/grTOGL1.c index 085ac305..fefbde3e 100644 --- a/graphics/grTOGL1.c +++ b/graphics/grTOGL1.c @@ -369,7 +369,7 @@ GrTOGLFlush () *--------------------------------------------------------- */ -static GLXPixmap glpmap = None; +static GLXPbuffer pbuffer = None; #define glTransYs(n) (DisplayHeight(grXdpy, grXscrn)-(n)) @@ -385,10 +385,23 @@ toglSetProjection(llx, lly, width, height) { if (toglCurrent.mw->w_flags & WIND_OFFSCREEN) { - if (glpmap != None) glXDestroyGLXPixmap(grXdpy, glpmap); - glpmap = glXCreateGLXPixmap(grXdpy, grVisualInfo, - (Pixmap)toglCurrent.windowid); - glXMakeCurrent(grXdpy, (GLXDrawable)glpmap, grXcontext); + int count = 0; + int PBattrib[] = { + GLX_PBUFFER_WIDTH, width, + GLX_PBUFFER_HEIGHT, height, + GLX_LARGEST_PBUFFER, False, + None + }; + GLXFBConfig *config; + + if (pbuffer != None) glXDestroyPbuffer(grXdpy, pbuffer); + config = glXGetFBConfigs(grXdpy, grXscrn, &count); + if (config != NULL && count != 0) + { + pbuffer = glXCreatePbuffer(grXdpy, config[0], PBattrib); + glXMakeCurrent(grXdpy, (GLXDrawable)pbuffer, grXcontext); + } + if (config != NULL) XFree(config); } else glXMakeCurrent(grXdpy, (GLXDrawable)toglCurrent.windowid, grXcontext); @@ -423,6 +436,9 @@ toglSetProjection(llx, lly, width, height) glTranslated(-(GLsizei)(width >> 1), -(GLsizei)(height >> 1), 0); + if (toglCurrent.mw->w_flags & WIND_OFFSCREEN) + glTranslatef((float)0.5, (float)0.5, 0); + /* Remaining transformations are done on the modelview matrix */ glMatrixMode(GL_MODELVIEW); @@ -1326,12 +1342,63 @@ void GrTOGLUnlock(w) MagWindow *w; { - /* GR_TOGL_FLUSH_BATCH(); */ - GrTOGLFlush(); /* (?) Adds glFlush and glFinish to the above. */ + GrTOGLFlush(); + + if ((w != GR_LOCK_SCREEN) && (w->w_flags & WIND_OFFSCREEN)) + { + GC grXcopyGC; + XGCValues gcValues; + unsigned char *pdata, *tdata; + int i, j; + + Window root_return; + int x_return, y_return; + unsigned int pbwidth, pbheight, wborder, depth; + + XGetGeometry(grXdpy, (Drawable)toglCurrent.windowid, &root_return, + &x_return, &y_return, &pbwidth, &pbheight, &wborder, &depth); + + pdata = (unsigned char *)mallocMagic((pbwidth * pbheight * 3) + * sizeof(unsigned int)); + + /* In offscreen-rendering mode, copy Pbuffer back to window */ + glReadBuffer(GL_FRONT); + glReadPixels(0, 0, pbwidth, pbheight, GL_RGB, GL_UNSIGNED_BYTE, pdata); + + gcValues.graphics_exposures = FALSE; + grXcopyGC = XCreateGC(grXdpy, (Drawable)toglCurrent.windowid, + GCGraphicsExposures, &gcValues); + + /* This is very slow, but the only way I've found to copy data */ + /* from a Pbuffer into a Pixmap. It is only used to make the */ + /* icon images for the toolbar, so it does not need to be */ + /* efficient. */ + + tdata = pdata; + for (i = 0; i < pbwidth; i++) { + for (j = 0; j < pbheight; j++) + { + unsigned long pcolor; + pcolor = *tdata++; + pcolor <<= 8; + pcolor |= *tdata++; + pcolor <<= 8; + pcolor |= *tdata++; + XSetForeground(grXdpy, grXcopyGC, pcolor); + XDrawPoint(grXdpy, (Drawable)toglCurrent.windowid, grXcopyGC, + pbwidth - i - 1, j); + } + } + + freeMagic(pdata); + XFreeGC(grXdpy, grXcopyGC); + } + grSimpleUnlock(w); } + /* *------------------------------------------------------------------------- * GrTOGLEventPending --