From 93bcfeb093ed84e26fdadcf8b4077eab2669a7f2 Mon Sep 17 00:00:00 2001 From: Tim Edwards Date: Wed, 4 Oct 2017 14:53:01 -0400 Subject: [PATCH] Finally worked out how to correctly use the OpenGL general-purpose frame buffers and render buffers, and use fast frame buffer bit block transfers to do copies to and from backing store. Also found a long-standing problem where multiple windows fail to refresh properly in OpenGL and Cairo interfaces due to a lack of calling GrLock() and GrUnlock() around the call to fetch backing store after an expose event. The use of the general purpose frame buffer allows magic to avoid calling any indirect rendering methods and should now (finally) allow magic to run in OpenGL mode over a VNC. Use of direct rendering methods only also means that magic does not need to be compiled with the ad hoc switch to have Cairo handle drawing into pixmaps for the icons (this remains to be tested). --- defs.mak | 4 +- graphics/grOGL1.c | 2 + graphics/grTCairo1.c | 2 + graphics/grTOGL1.c | 31 +- graphics/grTOGL3.c | 149 +++++--- graphics/grTOGL3.c.new | 804 ++++++++++++++++++++++++++++++++++++++++ graphics/grTOGL3.c.orig | 723 ++++++++++++++++++++++++++++++++++++ graphics/grTk1.c | 2 + graphics/grX11su1.c | 2 + scripts/config.log | 26 +- scripts/config.status | 13 +- scripts/configure | 4 +- scripts/configure.in | 4 +- scripts/defs.mak | 4 +- windows/windView.c | 2 + 15 files changed, 1678 insertions(+), 94 deletions(-) create mode 100644 graphics/grTOGL3.c.new create mode 100644 graphics/grTOGL3.c.orig diff --git a/defs.mak b/defs.mak index 7c95e6a0..07220479 100644 --- a/defs.mak +++ b/defs.mak @@ -61,14 +61,14 @@ LIB_SPECS = -L/usr/lib64 -ltk8.6 -L/usr/lib64 -ltcl8.6 WISH_EXE = /usr/bin/wish TCL_LIB_DIR = /usr/lib MAGIC_VERSION = 8.2 -MAGIC_REVISION = 27 +MAGIC_REVISION = 29 CC = gcc CPP = gcc -E CXX = g++ CPPFLAGS = -I. -I${MAGICDIR} -DFLAGS = -DCAD_DIR=\"${LIBDIR}\" -DBIN_DIR=\"${BINDIR}\" -DTCL_DIR=\"${TCLDIR}\" -DPACKAGE_NAME=\"\" -DPACKAGE_TARNAME=\"\" -DPACKAGE_VERSION=\"\" -DPACKAGE_STRING=\"\" -DPACKAGE_BUGREPORT=\"\" -DPACKAGE_URL=\"\" -DMAGIC_VERSION=\"8.2\" -DMAGIC_REVISION=\"27\" -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DSIZEOF_VOID_P=8 -DSIZEOF_UNSIGNED_INT=4 -DSIZEOF_UNSIGNED_LONG=8 -DSIZEOF_UNSIGNED_LONG_LONG=8 -DSTDC_HEADERS=1 -DHAVE_SETENV=1 -DHAVE_PUTENV=1 -DHAVE_SYS_MMAN_H=1 -DHAVE_DIRENT_H=1 -DHAVE_LIMITS_H=1 -DHAVE_PATHS_H=1 -DHAVE_VA_COPY=1 -DHAVE___VA_COPY=1 -DFILE_LOCKS=1 -DCALMA_MODULE=1 -DCIF_MODULE=1 -DX11_BACKING_STORE=1 -DPLOT_MODULE=1 -DLEF_MODULE=1 -DROUTE_MODULE=1 -DUSE_NEW_MACROS=1 -DHAVE_LIBGL=1 -DHAVE_LIBGLU=1 -DVECTOR_FONTS=1 -DHAVE_LIBCAIRO=1 -DCAIRO_OFFSCREEN_RENDER=1 -DMAGIC_WRAPPER=1 -DTHREE_D=1 -Dlinux=1 -DSYSV=1 -DISC=1 -DNDEBUG -DGCORE=\"/bin/gcore\" +DFLAGS = -DCAD_DIR=\"${LIBDIR}\" -DBIN_DIR=\"${BINDIR}\" -DTCL_DIR=\"${TCLDIR}\" -DPACKAGE_NAME=\"\" -DPACKAGE_TARNAME=\"\" -DPACKAGE_VERSION=\"\" -DPACKAGE_STRING=\"\" -DPACKAGE_BUGREPORT=\"\" -DPACKAGE_URL=\"\" -DMAGIC_VERSION=\"8.2\" -DMAGIC_REVISION=\"29\" -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DSIZEOF_VOID_P=8 -DSIZEOF_UNSIGNED_INT=4 -DSIZEOF_UNSIGNED_LONG=8 -DSIZEOF_UNSIGNED_LONG_LONG=8 -DSTDC_HEADERS=1 -DHAVE_SETENV=1 -DHAVE_PUTENV=1 -DHAVE_SYS_MMAN_H=1 -DHAVE_DIRENT_H=1 -DHAVE_LIMITS_H=1 -DHAVE_PATHS_H=1 -DHAVE_VA_COPY=1 -DHAVE___VA_COPY=1 -DFILE_LOCKS=1 -DCALMA_MODULE=1 -DCIF_MODULE=1 -DPLOT_MODULE=1 -DLEF_MODULE=1 -DROUTE_MODULE=1 -DUSE_NEW_MACROS=1 -DHAVE_LIBGL=1 -DHAVE_LIBGLU=1 -DVECTOR_FONTS=1 -DHAVE_LIBCAIRO=1 -DMAGIC_WRAPPER=1 -DTHREE_D=1 -Dlinux=1 -DSYSV=1 -DISC=1 -DNDEBUG -DGCORE=\"/bin/gcore\" DFLAGS += -DSHDLIB_EXT=\".so\" CFLAGS = -g -m64 -fPIC -Wimplicit-int -fPIC diff --git a/graphics/grOGL1.c b/graphics/grOGL1.c index 7488372b..ec856bb2 100644 --- a/graphics/grOGL1.c +++ b/graphics/grOGL1.c @@ -562,7 +562,9 @@ pipehandler() if (mw->w_backingStore != (ClientData)NULL) { Rect surface; + (*GrLockPtr)(mw, FALSE); (*GrGetBackingStorePtr)(mw, &screenRect); + (*GrUnlockPtr)(mw); WindScreenToSurface(mw, &screenRect, &surface); DBWHLRedrawPrepWindow(mw, &surface); WindDrawBorder(mw, &screenRect); diff --git a/graphics/grTCairo1.c b/graphics/grTCairo1.c index f0311a7b..5435a1c8 100644 --- a/graphics/grTCairo1.c +++ b/graphics/grTCairo1.c @@ -816,7 +816,9 @@ keys_and_buttons: if (mw->w_backingStore != (ClientData)NULL) { Rect surface; + (*GrLockPtr)(mw, FALSE); (*GrGetBackingStorePtr)(mw, &screenRect); + (*GrUnlockPtr)(mw); WindScreenToSurface(mw, &screenRect, &surface); DBWHLRedrawPrepWindow(mw, &surface); WindDrawBorder(mw, &screenRect); diff --git a/graphics/grTOGL1.c b/graphics/grTOGL1.c index b832d88f..2fd71302 100644 --- a/graphics/grTOGL1.c +++ b/graphics/grTOGL1.c @@ -299,9 +299,28 @@ GrTOGLInit () grXscrn = grVisualInfo->screen; toglCurrent.depth = grVisualInfo->depth; - /* TRUE = Direct rendering, FALSE = Indirect rendering */ - /* (note that direct rendering may not be able to deal with pixmaps) */ + /* glXCreateContext() 4th argument: */ + /* TRUE = Direct rendering, FALSE = Indirect rendering */ + + /* Direct rendering may not be able to deal with pixmaps. */ + /* Normally, magic should compile with OpenGL framebuffer */ + /* backing store and pbuffer offscreen rendering. However, */ + /* if X11_BACKING_STORE is selected then force indirect */ + /* rendering. This can be avoided if the backing store */ + /* functions sync between OpenGL and X11; this has not */ + /* been done yet. */ + + /* The CAIRO_OFFSCREEN_RENDER compile-time option uses */ + /* Cairo to do the off-screen rendering, which allows */ + /* OpenGL to run in direct-rendering mode only. To do: */ + /* determine from OpenGL attributes if indirect rendering */ + /* is allowed, and handle automatically. */ + +#ifdef X11_BACKING_STORE grXcontext = glXCreateContext(grXdpy, grVisualInfo, NULL, GL_FALSE); +#else + grXcontext = glXCreateContext(grXdpy, grVisualInfo, NULL, GL_TRUE); +#endif /* Basic GL parameters */ @@ -868,7 +887,9 @@ keys_and_buttons: if (mw->w_backingStore != (ClientData)NULL) { Rect surface; + (*GrLockPtr)(mw, FALSE); (*GrGetBackingStorePtr)(mw, &screenRect); + (*GrUnlockPtr)(mw); WindScreenToSurface(mw, &screenRect, &surface); DBWHLRedrawPrepWindow(mw, &surface); WindDrawBorder(mw, &screenRect); @@ -898,8 +919,6 @@ keys_and_buttons: void toglOnScreen() { - // GrLockPtr = GrTOGLLock; - // GrUnlockPtr = GrTOGLUnlock; GrSetCMapPtr = GrTOGLSetCMap; GrFlushPtr = GrTOGLFlush; @@ -1377,7 +1396,6 @@ void GrTOGLUnlock(w) MagWindow *w; { - GrTOGLFlush(); #ifdef CAIRO_OFFSCREEN_RENDER /* Use Cairo graphics for off-screen rendering */ @@ -1390,6 +1408,8 @@ GrTOGLUnlock(w) } #endif + GrTOGLFlush(); + if ((w != GR_LOCK_SCREEN) && (w->w_flags & WIND_OFFSCREEN)) { GC grXcopyGC; @@ -1439,7 +1459,6 @@ GrTOGLUnlock(w) freeMagic(pdata); XFreeGC(grXdpy, grXcopyGC); } - grSimpleUnlock(w); } diff --git a/graphics/grTOGL3.c b/graphics/grTOGL3.c index 8cc8dde6..458af7f3 100644 --- a/graphics/grTOGL3.c +++ b/graphics/grTOGL3.c @@ -37,6 +37,11 @@ extern Display *grXdpy; GLuint grXBases[4]; +typedef struct { + GLuint framebuffer; + GLuint renderbuffer; +} RenderFrame; + /*--------------------------------------------------------- * grtoglDrawGrid: @@ -241,15 +246,24 @@ GrTOGLTextSize(text, size, r) /* backing store contains valid data or not. */ void -grtoglFreeBackingStore(MagWindow *window) +grtoglFreeBackingStore(MagWindow *w) { - window->w_backingStore = (ClientData)0; + RenderFrame *rf; + + rf = (RenderFrame *)w->w_backingStore; + glDeleteFramebuffers(1, &rf->framebuffer); + glDeleteRenderbuffers(1, &rf->renderbuffer); + freeMagic(w->w_backingStore); + w->w_backingStore = (ClientData)0; } void grtoglCreateBackingStore(MagWindow *w) { + RenderFrame *rf; + Tk_Window tkwind = (Tk_Window)w->w_grdata; + unsigned int width, height; /* ignore all windows other than layout */ if (w->w_client != DBWclientID) return; @@ -257,19 +271,33 @@ grtoglCreateBackingStore(MagWindow *w) /* Deferred */ if (tkwind == NULL) return; - w->w_backingStore = (ClientData)1; + width = w->w_screenArea.r_xtop - w->w_screenArea.r_xbot; + height = w->w_screenArea.r_ytop - w->w_screenArea.r_ybot; + + rf = (RenderFrame *)w->w_backingStore; + if (rf != (ClientData)NULL) { + glDeleteFramebuffers(1, &rf->framebuffer); + glDeleteRenderbuffers(1, &rf->renderbuffer); + } + else { + rf = (RenderFrame *)mallocMagic(sizeof(RenderFrame)); + w->w_backingStore = (ClientData)rf; + } + + glGenFramebuffers(1, &rf->framebuffer); + glGenRenderbuffers(1, &rf->renderbuffer); + glBindRenderbuffer(GL_RENDERBUFFER, rf->renderbuffer); + glRenderbufferStorage(GL_RENDERBUFFER, GL_RGB, width, height); } bool grtoglGetBackingStore(MagWindow *w, Rect *area) { + RenderFrame *rf; unsigned int width, height; int xbot, ybot; Rect r; - // GLboolean result; - // GLint rasterpos[4]; - if (w->w_backingStore == (ClientData)0) return FALSE; GEO_EXPAND(area, 1, &r); @@ -281,22 +309,20 @@ grtoglGetBackingStore(MagWindow *w, Rect *area) xbot = r.r_xbot; ybot = r.r_ybot; + rf = (RenderFrame *)w->w_backingStore; + + glBindFramebuffer(GL_READ_FRAMEBUFFER, rf->framebuffer); + glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0); + glFramebufferRenderbuffer(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, + GL_RENDERBUFFER, rf->renderbuffer); + glDrawBuffer(GL_FRONT); - glReadBuffer(GL_BACK); - glRasterPos2i((GLint)xbot, (GLint)ybot); + glReadBuffer(GL_COLOR_ATTACHMENT0); - /* Check for valid raster position */ - // glGetBooleanv(GL_CURRENT_RASTER_POSITION_VALID, (GLboolean *)(&result)); - // glGetIntegerv(GL_CURRENT_RASTER_POSITION, (GLint *)(&rasterpos[0])); - - // TxPrintf("Raster valid = %d, position = %d %d %d %d\n", - // (int)result, (int)rasterpos[0], (int)rasterpos[1], - // (int)rasterpos[2], (int)rasterpos[3]); - // if (result == 0) - // TxPrintf("Intended position = %d %d\n", xbot, ybot); - - glDisable(GL_BLEND); - glCopyPixels(xbot, ybot, width, height, GL_COLOR); + glBlitFramebuffer(r.r_xbot, r.r_ybot, r.r_xtop, r.r_ytop, + r.r_xbot, r.r_ybot, r.r_xtop, r.r_ytop, + GL_COLOR_BUFFER_BIT, GL_LINEAR); + glBindFramebuffer(GL_READ_FRAMEBUFFER, 0); return TRUE; } @@ -305,12 +331,14 @@ grtoglGetBackingStore(MagWindow *w, Rect *area) bool grtoglScrollBackingStore(MagWindow *w, Point *shift) { + RenderFrame *rf; + GLuint FramebufferName, RenderbufferName; unsigned int width, height; int xorigin, yorigin, xshift, yshift; if (w->w_backingStore == (ClientData)0) { - TxPrintf("grtoglScrollBackingStore %d %d failure\n", + fprintf(stdout, "grtoglScrollBackingStore %d %d failure\n", shift->p_x, shift->p_y); return FALSE; } @@ -339,13 +367,23 @@ grtoglScrollBackingStore(MagWindow *w, Point *shift) yshift = 0; } - glDrawBuffer(GL_BACK); - glReadBuffer(GL_BACK); - glRasterPos2i((GLint)xshift, (GLint)yshift); - glDisable(GL_BLEND); - glCopyPixels(xorigin, yorigin, width, height, GL_COLOR); + rf = (RenderFrame *)w->w_backingStore; - glDrawBuffer(GL_FRONT); + glBindFramebuffer(GL_READ_FRAMEBUFFER, rf->framebuffer); + glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0); + glFramebufferRenderbuffer(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, + GL_RENDERBUFFER, rf->renderbuffer); + + glBlitFramebuffer(xorigin, yorigin, xorigin + width, yorigin + height, + xshift, yshift, xshift + width, yshift + height, + GL_COLOR_BUFFER_BIT, GL_LINEAR); + + glBindFramebuffer(GL_READ_FRAMEBUFFER, 0); + glBindFramebuffer(GL_DRAW_FRAMEBUFFER, rf->framebuffer); + glBlitFramebuffer(xshift, yshift, xshift + width, yshift + height, + xshift, yshift, xshift + width, yshift + height, + GL_COLOR_BUFFER_BIT, GL_LINEAR); + glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0); return TRUE; } @@ -353,48 +391,41 @@ grtoglScrollBackingStore(MagWindow *w, Point *shift) void grtoglPutBackingStore(MagWindow *w, Rect *area) { + RenderFrame *rf; + GLuint FramebufferName, RenderbufferName; unsigned int width, height; int ybot, xbot; - - // GLboolean result; - // GLint rasterpos[4]; + Rect r; if (w->w_backingStore == (ClientData)0) return; - width = area->r_xtop - area->r_xbot; - height = area->r_ytop - area->r_ybot; - - ybot = area->r_ybot; - xbot = area->r_xbot; - - if (xbot < 0) { - width -= xbot; - xbot = 0; + if (w->w_flags & WIND_OBSCURED) + { + grtoglFreeBackingStore(w); + return; } - if (ybot < 0) { - height -= ybot; - ybot = 0; - } + GEO_EXPAND(area, 1, &r); + GeoClip(&r, &(w->w_screenArea)); + width = r.r_xtop - r.r_xbot; + height = r.r_ytop - r.r_ybot; + ybot = r.r_ybot; + xbot = r.r_xbot; + + rf = (RenderFrame *)w->w_backingStore; + glBindFramebuffer(GL_READ_FRAMEBUFFER, 0); + glBindFramebuffer(GL_DRAW_FRAMEBUFFER, rf->framebuffer); + glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, + GL_RENDERBUFFER, rf->renderbuffer); + + glDrawBuffer(GL_COLOR_ATTACHMENT0); glReadBuffer(GL_FRONT); - glDrawBuffer(GL_BACK); - glRasterPos2i((GLint)xbot, (GLint)ybot); - /* Check for valid raster position */ - // glGetBooleanv(GL_CURRENT_RASTER_POSITION_VALID, (GLboolean *)(&result)); - // glGetIntegerv(GL_CURRENT_RASTER_POSITION, (GLint *)(&rasterpos[0])); - - // TxPrintf("Raster valid = %d, position = %d %d %d %d\n", - // (int)result, (int)rasterpos[0], (int)rasterpos[1], - // (int)rasterpos[2], (int)rasterpos[3]); - // if (result == 0) - // TxPrintf("Intended position = %d %d\n", xbot, ybot); - - glDisable(GL_BLEND); - glCopyPixels(xbot, ybot, width, height, GL_COLOR); - - glDrawBuffer(GL_FRONT); /* Return to normal front rendering */ + glBlitFramebuffer(r.r_xbot, r.r_ybot, r.r_xtop, r.r_ytop, + r.r_xbot, r.r_ybot, r.r_xtop, r.r_ytop, + GL_COLOR_BUFFER_BIT, GL_LINEAR); + glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0); } diff --git a/graphics/grTOGL3.c.new b/graphics/grTOGL3.c.new new file mode 100644 index 00000000..47ec181c --- /dev/null +++ b/graphics/grTOGL3.c.new @@ -0,0 +1,804 @@ +/* grTOGL3.c - + * + * Copyright 2003 Open Circuit Design, Inc., for MultiGiG Ltd. + * + * This file contains additional functions to manipulate an X window system + * color display. Included here are device-dependent routines to draw and + * erase text and draw a grid. + * + */ + +#include +#include + +#include +#include +#include + +#include "tcltk/tclmagic.h" +#include "utils/magic.h" +#include "utils/geometry.h" +#include "utils/malloc.h" +#include "windows/windows.h" +#include "graphics/graphics.h" +#include "graphics/graphicsInt.h" +#include "dbwind/dbwind.h" +#include "textio/textio.h" +#include "utils/signals.h" +#include "utils/utils.h" +#include "utils/hash.h" +#include "graphics/grTOGLInt.h" +#include "graphics/grTkCommon.h" +#include "database/fonts.h" + +extern Display *grXdpy; + +/* locals */ + +GLuint grXBases[4]; + + +/*--------------------------------------------------------- + * grtoglDrawGrid: + * grxDrawGrid adds a grid to the grid layer, using the current + * write mask and color. + * + * Results: + * TRUE is returned normally. However, if the grid gets too small + * to be useful, then nothing is drawn and FALSE is returned. + * + * Side Effects: None. + *--------------------------------------------------------- + */ + +bool +grtoglDrawGrid (prect, outline, clip) + Rect *prect; /* A rectangle that forms the template + * for the grid. Note: in order to maintain + * precision for the grid, the rectangle + * coordinates are specified in units of + * screen coordinates multiplied by SUBPIXEL. + */ + int outline; /* the outline style */ + Rect *clip; /* a clipping rectangle */ +{ + int xsize, ysize; + int x, y; + int xstart, ystart; + int snum, low, hi, shifted; + + xsize = prect->r_xtop - prect->r_xbot; + ysize = prect->r_ytop - prect->r_ybot; + if (!xsize || !ysize || GRID_TOO_SMALL(xsize, ysize)) + return FALSE; + + xstart = prect->r_xbot % xsize; + while (xstart < clip->r_xbot << SUBPIXELBITS) xstart += xsize; + ystart = prect->r_ybot % ysize; + while (ystart < clip->r_ybot << SUBPIXELBITS) ystart += ysize; + + grtoglSetLineStyle(outline); + + glBegin(GL_LINES); + + snum = 0; + low = clip->r_ybot; + hi = clip->r_ytop; + for (x = xstart; x < (clip->r_xtop+1) << SUBPIXELBITS; x += xsize) + { + shifted = x >> SUBPIXELBITS; + glVertex2i(shifted, low); + glVertex2i(shifted, hi); + snum++; + } + + snum = 0; + low = clip->r_xbot; + hi = clip->r_xtop; + for (y = ystart; y < (clip->r_ytop+1) << SUBPIXELBITS; y += ysize) + { + shifted = y >> SUBPIXELBITS; + glVertex2i(low, shifted); + glVertex2i(hi, shifted); + snum++; + } + glEnd(); + return TRUE; +} + + +/*--------------------------------------------------------- + * grtoglLoadFont + * This local routine transfers the X font bitmaps + * into OpenGL display lists for simple text + * rendering. + * + * Results: Success/Failure + * + * Side Effects: None. + *--------------------------------------------------------- + */ + +bool +grtoglLoadFont() +{ + Font id; + unsigned int i; + + for (i = 0; i < 4; i++) { + id = Tk_FontId(grTkFonts[i]); + + grXBases[i] = glGenLists(256); + if (grXBases[i] == 0) { + TxError("Out of display lists!\n"); + return FALSE; + } + glXUseXFont(id, 0, 256, grXBases[i]); + } + return TRUE; +} + + +/*--------------------------------------------------------- + * grtoglSetCharSize: + * This local routine sets the character size in the display, + * if necessary. + * + * Results: None. + * + * Side Effects: None. + *--------------------------------------------------------- + */ + +void +grtoglSetCharSize (size) + int size; /* Width of characters, in pixels (6 or 8). */ +{ + toglCurrent.fontSize = size; + switch (size) + { + case GR_TEXT_DEFAULT: + case GR_TEXT_SMALL: + toglCurrent.font = grSmallFont; + break; + case GR_TEXT_MEDIUM: + toglCurrent.font = grMediumFont; + break; + case GR_TEXT_LARGE: + toglCurrent.font = grLargeFont; + break; + case GR_TEXT_XLARGE: + toglCurrent.font = grXLargeFont; + break; + default: + TxError("%s%d\n", "grtoglSetCharSize: Unknown character size ", + size ); + break; + } +} + + +/* + * ---------------------------------------------------------------------------- + * GrTOGLTextSize -- + * + * Determine the size of a text string. + * + * Results: + * None. + * + * Side effects: + * A rectangle is filled in that is the size of the text in pixels. + * The origin (0, 0) of this rectangle is located on the baseline + * at the far left side of the string. + * ---------------------------------------------------------------------------- + */ + +void +GrTOGLTextSize(text, size, r) + char *text; + int size; + Rect *r; +{ + Tk_FontMetrics overall; + Tk_Font font; + int width; + + switch (size) { + case GR_TEXT_DEFAULT: + case GR_TEXT_SMALL: + font = grSmallFont; + break; + case GR_TEXT_MEDIUM: + font = grMediumFont; + break; + case GR_TEXT_LARGE: + font = grLargeFont; + break; + case GR_TEXT_XLARGE: + font = grXLargeFont; + break; + default: + TxError("%s%d\n", "GrTOGLTextSize: Unknown character size ", + size ); + break; + } + if (font == NULL) return; + Tk_GetFontMetrics(font, &overall); + width = Tk_TextWidth(font, text, strlen(text)); + /* Hack alert! Tk_TextWidth returns values too small! */ + width = width + (width >> 4); + r->r_ytop = overall.ascent; + r->r_ybot = -overall.descent; + r->r_xtop = width; + r->r_xbot = 0; +} + +static GLuint FramebufferName = 0; + +/* OpenGL backing store functions (now removed from the X11-based ones) */ +/* Since we always paint into the front buffer, the back buffer is */ +/* always available for backing store. We need not create or destroy */ +/* it. We just use the w_backingStore location to store whether the */ +/* backing store contains valid data or not. */ + +void +grtoglFreeBackingStore(MagWindow *window) +{ + GLuint RenderbufferName; + + RenderbufferName = (GLuint)window->w_backingStore; + glDeleteRenderbuffers(1, &RenderbufferName); + window->w_backingStore = (ClientData)0; +} + +void +grtoglCreateBackingStore(MagWindow *w) +{ + GLuint RenderbufferName; + Tk_Window tkwind = (Tk_Window)w->w_grdata; + unsigned int width, height; + + /* ignore all windows other than layout */ + if (w->w_client != DBWclientID) return; + + /* Deferred */ + if (tkwind == NULL) return; + + width = w->w_screenArea.r_xtop - w->w_screenArea.r_xbot; + height = w->w_screenArea.r_ytop - w->w_screenArea.r_ybot; + + /* Do this only once */ + if (FramebufferName == 0) { + glGenFramebuffers(1, &FramebufferName); + } + + RenderbufferName = (GLuint)(w->w_backingStore); + if (RenderbufferName != 0) { + glDeleteRenderbuffers(1, &RenderbufferName); + } + + glGenRenderbuffers(1, &RenderbufferName); + TxPrintf("create: Renderbuffer is %d\n", RenderbufferName); + glBindRenderbuffer(GL_RENDERBUFFER, RenderbufferName); + glRenderbufferStorage(GL_RENDERBUFFER, GL_RGB, width, height); + w->w_backingStore = (ClientData)RenderbufferName; +} + +bool +grtoglGetBackingStore(MagWindow *w, Rect *area) +{ + GLuint RenderbufferName; + unsigned int width, height; + int xbot, ybot; + Rect r; + + // GLboolean result; + // GLint rasterpos[4]; + + if (w->w_backingStore == (ClientData)0) return FALSE; + + GEO_EXPAND(area, 1, &r); + GeoClip(&r, &(w->w_screenArea)); + + width = r.r_xtop - r.r_xbot; + height = r.r_ytop - r.r_ybot; + + xbot = r.r_xbot; + ybot = r.r_ybot; + + glBindFramebuffer(GL_READ_FRAMEBUFFER, FramebufferName); + glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0); + + RenderbufferName = (GLuint)w->w_backingStore; + TxPrintf("get: Renderbuffer is %d\n", RenderbufferName); + glFramebufferRenderbuffer(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, + GL_RENDERBUFFER, RenderbufferName); + + glDrawBuffer(GL_FRONT); + glReadBuffer(GL_COLOR_ATTACHMENT0); + + // glDrawBuffer(GL_FRONT); + // glReadBuffer(GL_BACK); + // glRasterPos2i((GLint)xbot, (GLint)ybot); + + /* Check for valid raster position */ + // glGetBooleanv(GL_CURRENT_RASTER_POSITION_VALID, (GLboolean *)(&result)); + // glGetIntegerv(GL_CURRENT_RASTER_POSITION, (GLint *)(&rasterpos[0])); + + // TxPrintf("Raster valid = %d, position = %d %d %d %d\n", + // (int)result, (int)rasterpos[0], (int)rasterpos[1], + // (int)rasterpos[2], (int)rasterpos[3]); + // if (result == 0) + // TxPrintf("Intended position = %d %d\n", xbot, ybot); + + // glDisable(GL_BLEND); + // glCopyPixels(xbot, ybot, width, height, GL_COLOR); + + glBlitFramebuffer(r.r_xbot, r.r_ybot, r.r_xtop, r.r_ytop, + r.r_xbot, r.r_ybot, r.r_xtop, r.r_ytop, + GL_COLOR_BUFFER_BIT, GL_LINEAR); + glBindFramebuffer(GL_READ_FRAMEBUFFER, 0); + + return TRUE; +} + + +bool +grtoglScrollBackingStore(MagWindow *w, Point *shift) +{ + GLuint RenderbufferName; + unsigned int width, height; + int xorigin, yorigin, xshift, yshift; + + if (w->w_backingStore == (ClientData)0) + { + TxPrintf("grtoglScrollBackingStore %d %d failure\n", + shift->p_x, shift->p_y); + return FALSE; + } + + width = w->w_screenArea.r_xtop - w->w_screenArea.r_xbot; + height = w->w_screenArea.r_ytop - w->w_screenArea.r_ybot; + xorigin = 0; + yorigin = 0; + xshift = shift->p_x; + yshift = shift->p_y; + + if (xshift > 0) + width -= xshift; + else if (xshift < 0) + { + width += xshift; + xorigin = -xshift; + xshift = 0; + } + if (yshift > 0) + height -= yshift; + else if (yshift < 0) + { + height += yshift; + yorigin = -yshift; + yshift = 0; + } + + glBindFramebuffer(GL_READ_FRAMEBUFFER, FramebufferName); + glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0); + + RenderbufferName = (GLuint)w->w_backingStore; + TxPrintf("scroll: Renderbuffer is %d\n", RenderbufferName); + glFramebufferRenderbuffer(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, + GL_RENDERBUFFER, RenderbufferName); + + + // glDrawBuffer(GL_BACK); + // glReadBuffer(GL_BACK); + // glRasterPos2i((GLint)xshift, (GLint)yshift); + // glDisable(GL_BLEND); + // glCopyPixels(xorigin, yorigin, width, height, GL_COLOR); + + glBlitFramebuffer(xorigin, yorigin, xorigin + width, yorigin + height, + xshift, yshift, xshift + width, yshift + height, + GL_COLOR_BUFFER_BIT, GL_LINEAR); + + glBindFramebuffer(GL_READ_FRAMEBUFFER, 0); + +/* + glBindFramebuffer(GL_DRAW_FRAMEBUFFER, FramebufferName); + + glBlitFramebuffer(xshift, yshift, xshift + width, yshift + height, + xshift, yshift, xshift + width, yshift + height, + GL_COLOR_BUFFER_BIT, GL_LINEAR); + glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0); +*/ + // glDrawBuffer(GL_FRONT); + + return TRUE; +} + +void +grtoglPutBackingStore(MagWindow *w, Rect *area) +{ + GLuint RenderbufferName; + unsigned int width, height; + int ybot, xbot; + Rect r; + + // GLboolean result; + // GLint rasterpos[4]; + + if (w->w_backingStore == (ClientData)0) return; + + GEO_EXPAND(area, 1, &r); + GeoClip(&r, &(w->w_screenArea)); + + /* + width = area->r_xtop - area->r_xbot; + height = area->r_ytop - area->r_ybot; + + ybot = area->r_ybot; + xbot = area->r_xbot; + */ + + width = r.r_xtop - r.r_xbot; + height = r.r_ytop - r.r_ybot; + ybot = r.r_ybot; + xbot = r.r_xbot; + + /* + if (xbot < 0) { + width -= xbot; + xbot = 0; + } + + if (ybot < 0) { + height -= ybot; + ybot = 0; + } + */ + + glBindFramebuffer(GL_READ_FRAMEBUFFER, 0); + glBindFramebuffer(GL_DRAW_FRAMEBUFFER, FramebufferName); + + RenderbufferName = (GLuint)w->w_backingStore; + TxPrintf("put: Renderbuffer is %d\n", RenderbufferName); + glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, + GL_RENDERBUFFER, RenderbufferName); + + glDrawBuffer(GL_COLOR_ATTACHMENT0); + glReadBuffer(GL_FRONT); + // glReadBuffer(GL_FRONT); + // glDrawBuffer(GL_BACK); + // glRasterPos2i((GLint)xbot, (GLint)ybot); + + /* Check for valid raster position */ + // glGetBooleanv(GL_CURRENT_RASTER_POSITION_VALID, (GLboolean *)(&result)); + // glGetIntegerv(GL_CURRENT_RASTER_POSITION, (GLint *)(&rasterpos[0])); + + // TxPrintf("Raster valid = %d, position = %d %d %d %d\n", + // (int)result, (int)rasterpos[0], (int)rasterpos[1], + // (int)rasterpos[2], (int)rasterpos[3]); + // if (result == 0) + // TxPrintf("Intended position = %d %d\n", xbot, ybot); + + /* This area may need to be expanded by a pixel and/or */ + /* expanded by GrPixelCorrect to compensate for the OpenGL */ + /* coordinate system. */ + + // glDisable(GL_BLEND); + // glCopyPixels(xbot, ybot, width, height, GL_COLOR); + + glBlitFramebuffer(r.r_xbot, r.r_ybot, r.r_xtop, r.r_ytop, + r.r_xbot, r.r_ybot, r.r_xtop, r.r_ytop, + GL_COLOR_BUFFER_BIT, GL_LINEAR); + glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0); + + // glDrawBuffer(GL_FRONT); /* Return to normal front rendering */ +} + + +/* + * ---------------------------------------------------------------------------- + * GrTOGLReadPixel -- + * + * Read one pixel from the screen. + * + * Results: + * An integer containing the pixel's color. + * + * Side effects: + * none. + * + * ---------------------------------------------------------------------------- + */ + +int +GrTOGLReadPixel (w, x, y) + MagWindow *w; + int x,y; /* the location of a pixel in screen coords */ +{ + return 0; /* OpenGL has no such function, so return 0 */ +} + + +/* + * ---------------------------------------------------------------------------- + * GrTOGLBitBlt -- + * + * Copy information in bit block transfers. + * + * Results: + * None. + * + * Side effects: + * changes the screen. + * ---------------------------------------------------------------------------- + */ + +void +GrTOGLBitBlt(r, p) + Rect *r; + Point *p; +{ + glCopyPixels(r->r_xbot, r->r_ybot, r->r_xtop - r->r_xbot + 1, + r->r_ytop - r->r_ybot + 1, GL_COLOR); +} + +#ifdef VECTOR_FONTS + +/* + *---------------------------------------------------------------------- + * + * Technically, there should be no self-intersecting polygons in outline + * fonts. However, decomposition of bezier curves into line segments + * may occasionally produce one, so it needs to be handled. + *---------------------------------------------------------------------- + */ + +void +myCombine(GLdouble coords[3], GLdouble *vertex_data[4], + GLfloat weight[4], GLdouble **outData, void *dataptr) +{ + /* This needs to be free'd at the end of gluTessEndPolygon()! */ + GLdouble *new = (GLdouble *)mallocMagic(2 * sizeof(GLdouble)); + new[0] = coords[0]; + new[1] = coords[1]; + *outData = new; + /* Diagnostic */ + TxError("Intersecting polygon in char \"%c\" at %g %g!\n", + *((char *)dataptr), coords[0], coords[1]); +} + +/* + *---------------------------------------------------------------------- + * Draw a text character + * This routine differs from grtoglFillPolygon() in that it uses the + * glu library to handle non-convex polygons as may appear in font + * outlines. + *---------------------------------------------------------------------- + */ + +void +grtoglDrawCharacter(clist, tc, pixsize) + FontChar *clist; + unsigned char tc; + int pixsize; +{ + Point *tp; + int np, nptotal; + int i, j; + static GLUtesselator *tess = NULL; + static GLdouble *v = NULL; + static int maxnp = 0; + FontChar *ccur; + + if (pixsize < 5) return; /* Label too small to be useful */ + + if (tess == NULL) + { + tess = gluNewTess(); + gluTessCallback(tess, GLU_TESS_BEGIN, (_GLUfuncptr)glBegin); + gluTessCallback(tess, GLU_TESS_VERTEX, (_GLUfuncptr)glVertex3dv); + gluTessCallback(tess, GLU_TESS_END, (_GLUfuncptr)glEnd); + gluTessCallback(tess, GLU_TESS_COMBINE_DATA, (_GLUfuncptr)myCombine); + } + // Boundary-only does not look particularly good. . . + gluTessProperty(tess, GLU_TESS_BOUNDARY_ONLY, GL_FALSE); + + nptotal = 0; + for (ccur = clist; ccur != NULL; ccur = ccur->fc_next) + nptotal += ccur->fc_numpoints; + + if (nptotal > maxnp) + { + if (v != NULL) freeMagic((char *)v); + maxnp = nptotal; + v = (GLdouble *)mallocMagic(nptotal * 3 * sizeof(GLdouble)); + } + + j = 0; + for (ccur = clist; ccur != NULL; ccur = ccur->fc_next) + { + tp = ccur->fc_points; + np = ccur->fc_numpoints; + + for (i = 0; i < np; i++, j += 3) { + v[j] = tp[i].p_x; + v[j + 1] = tp[i].p_y; + v[j + 2] = 0; + } + } + + gluTessBeginPolygon(tess, (GLvoid *)(&tc)); + j = 0; + for (ccur = clist; ccur != NULL; ccur = ccur->fc_next) + { + np = ccur->fc_numpoints; + gluTessBeginContour(tess); + for (i = 0; i < np; i++, j += 3) { + gluTessVertex(tess, &v[j], &v[j]); + } + gluTessEndContour(tess); + } + gluTessEndPolygon(tess); +} + +/*--------------------------------------------------------- + * grtoglFontText: + * + * This routine draws text from font vectors using the + * font vector routines in DBlabel.c. Text is clipped + * to the clipping rectangle. + * + * For speed, we should be transferring the font + * vectors into OpenGL display lists! + * + *--------------------------------------------------------- + */ + +void +grtoglFontText(text, font, size, rotate, pos, clip, obscure) + char *text; /* The text to be drawn */ + int font; /* Font to use from fontList */ + int size; /* Pixel size of the font */ + int rotate; /* Text rotation */ + Point *pos; /* Text base position */ + Rect *clip; /* Clipping area */ + LinkedRect *obscure; /* List of obscuring areas */ +{ + char *tptr; + Point *coffset; /* vector to next character */ + Rect *cbbox; + GLfloat fsize, matvals[16]; + FontChar *clist; + int cheight, baseline; + float tmp; + + /* Keep it simple for now---ignore clip and obscure */ + + glDisable(GL_BLEND); + glPushMatrix(); + glTranslated(pos->p_x, pos->p_y, 0); + glRotated(rotate, 0, 0, 1); + + /* Get label size */ + cbbox = &DBFontList[font]->mf_extents; + + fsize = (GLfloat)size / (GLfloat)cbbox->r_ytop; + glScalef(fsize, fsize, 1.0); + + /* Adjust to baseline */ + baseline = 0; + for (tptr = text; *tptr != '\0'; tptr++) + { + DBFontChar(font, *tptr, NULL, NULL, &cbbox); + if (cbbox->r_ybot < baseline) + baseline = cbbox->r_ybot; + } + glTranslated(0, -baseline, 0); + + for (tptr = text; *tptr != '\0'; tptr++) + { + DBFontChar(font, *tptr, &clist, &coffset, NULL); + grtoglDrawCharacter(clist, *tptr, size); + glTranslated(coffset->p_x, coffset->p_y, 0); + } + glPopMatrix(); +} + +#endif /* VECTOR_FONTS */ + +/*--------------------------------------------------------- + * grtoglPutText: + * (modified on SunPutText) + * + * This routine puts a chunk of text on the screen in the current + * color, size, etc. The caller must ensure that it fits on + * the screen -- no clipping is done except to the obscuring rectangle + * list and the clip rectangle. + * + * Results: + * none. + * + * Side Effects: + * The text is drawn on the screen. + * + *--------------------------------------------------------- + */ + +void +grtoglPutText (text, pos, clip, obscure) + char *text; /* The text to be drawn. */ + Point *pos; /* A point located at the leftmost point of + * the baseline for this string. + */ + Rect *clip; /* A rectangle to clip against */ + LinkedRect *obscure; /* A list of obscuring rectangles */ + +{ + Rect location; + Rect overlap; + Rect textrect; + LinkedRect *ob; + void grTOGLGeoSub(); + int i; + float tscale; + + GrTOGLTextSize(text, toglCurrent.fontSize, &textrect); + + location.r_xbot = pos->p_x + textrect.r_xbot; + location.r_xtop = pos->p_x + textrect.r_xtop; + location.r_ybot = pos->p_y + textrect.r_ybot; + location.r_ytop = pos->p_y + textrect.r_ytop; + + /* erase parts of the bitmap that are obscured */ + for (ob = obscure; ob != NULL; ob = ob->r_next) + { + if (GEO_TOUCH(&ob->r_r, &location)) + { + overlap = location; + GeoClip(&overlap, &ob->r_r); + grTOGLGeoSub(&location, &overlap); + } + } + + overlap = location; + GeoClip(&overlap, clip); + + /* copy the text to the color screen */ + if ((overlap.r_xbot < overlap.r_xtop)&&(overlap.r_ybot <= overlap.r_ytop)) + { + glScissor(overlap.r_xbot, overlap.r_ybot, overlap.r_xtop - overlap.r_xbot, + overlap.r_ytop - overlap.r_ybot); + glEnable(GL_SCISSOR_TEST); + glDisable(GL_BLEND); + glRasterPos2i(pos->p_x, pos->p_y); + glListBase(grXBases[(toglCurrent.fontSize == GR_TEXT_DEFAULT) ? + GR_TEXT_SMALL : toglCurrent.fontSize]); + glCallLists(strlen(text), GL_UNSIGNED_BYTE, (unsigned char *)text); + glDisable(GL_SCISSOR_TEST); + } +} + + +/* grTOGLGeoSub: + * return the tallest sub-rectangle of r not obscured by area + * area must be within r. + */ + +void +grTOGLGeoSub(r, area) +Rect *r; /* Rectangle to be subtracted from. */ +Rect *area; /* Area to be subtracted. */ + +{ + if (r->r_xbot == area->r_xbot) r->r_xbot = area->r_xtop; + else + if (r->r_xtop == area->r_xtop) r->r_xtop = area->r_xbot; + else + if (r->r_ybot <= area->r_ybot) r->r_ybot = area->r_ytop; + else + if (r->r_ytop == area->r_ytop) r->r_ytop = area->r_ybot; + else + r->r_xtop = area->r_xbot; +} diff --git a/graphics/grTOGL3.c.orig b/graphics/grTOGL3.c.orig new file mode 100644 index 00000000..c9b388ee --- /dev/null +++ b/graphics/grTOGL3.c.orig @@ -0,0 +1,723 @@ +/* grTOGL3.c - + * + * Copyright 2003 Open Circuit Design, Inc., for MultiGiG Ltd. + * + * This file contains additional functions to manipulate an X window system + * color display. Included here are device-dependent routines to draw and + * erase text and draw a grid. + * + */ + +#include +#include + +#include +#include +#include + +#include "tcltk/tclmagic.h" +#include "utils/magic.h" +#include "utils/geometry.h" +#include "utils/malloc.h" +#include "windows/windows.h" +#include "graphics/graphics.h" +#include "graphics/graphicsInt.h" +#include "dbwind/dbwind.h" +#include "textio/textio.h" +#include "utils/signals.h" +#include "utils/utils.h" +#include "utils/hash.h" +#include "graphics/grTOGLInt.h" +#include "graphics/grTkCommon.h" +#include "database/fonts.h" + +extern Display *grXdpy; + +/* locals */ + +GLuint grXBases[4]; + + +/*--------------------------------------------------------- + * grtoglDrawGrid: + * grxDrawGrid adds a grid to the grid layer, using the current + * write mask and color. + * + * Results: + * TRUE is returned normally. However, if the grid gets too small + * to be useful, then nothing is drawn and FALSE is returned. + * + * Side Effects: None. + *--------------------------------------------------------- + */ + +bool +grtoglDrawGrid (prect, outline, clip) + Rect *prect; /* A rectangle that forms the template + * for the grid. Note: in order to maintain + * precision for the grid, the rectangle + * coordinates are specified in units of + * screen coordinates multiplied by SUBPIXEL. + */ + int outline; /* the outline style */ + Rect *clip; /* a clipping rectangle */ +{ + int xsize, ysize; + int x, y; + int xstart, ystart; + int snum, low, hi, shifted; + + xsize = prect->r_xtop - prect->r_xbot; + ysize = prect->r_ytop - prect->r_ybot; + if (!xsize || !ysize || GRID_TOO_SMALL(xsize, ysize)) + return FALSE; + + xstart = prect->r_xbot % xsize; + while (xstart < clip->r_xbot << SUBPIXELBITS) xstart += xsize; + ystart = prect->r_ybot % ysize; + while (ystart < clip->r_ybot << SUBPIXELBITS) ystart += ysize; + + grtoglSetLineStyle(outline); + + glBegin(GL_LINES); + + snum = 0; + low = clip->r_ybot; + hi = clip->r_ytop; + for (x = xstart; x < (clip->r_xtop+1) << SUBPIXELBITS; x += xsize) + { + shifted = x >> SUBPIXELBITS; + glVertex2i(shifted, low); + glVertex2i(shifted, hi); + snum++; + } + + snum = 0; + low = clip->r_xbot; + hi = clip->r_xtop; + for (y = ystart; y < (clip->r_ytop+1) << SUBPIXELBITS; y += ysize) + { + shifted = y >> SUBPIXELBITS; + glVertex2i(low, shifted); + glVertex2i(hi, shifted); + snum++; + } + glEnd(); + return TRUE; +} + + +/*--------------------------------------------------------- + * grtoglLoadFont + * This local routine transfers the X font bitmaps + * into OpenGL display lists for simple text + * rendering. + * + * Results: Success/Failure + * + * Side Effects: None. + *--------------------------------------------------------- + */ + +bool +grtoglLoadFont() +{ + Font id; + unsigned int i; + + for (i = 0; i < 4; i++) { + id = Tk_FontId(grTkFonts[i]); + + grXBases[i] = glGenLists(256); + if (grXBases[i] == 0) { + TxError("Out of display lists!\n"); + return FALSE; + } + glXUseXFont(id, 0, 256, grXBases[i]); + } + return TRUE; +} + + +/*--------------------------------------------------------- + * grtoglSetCharSize: + * This local routine sets the character size in the display, + * if necessary. + * + * Results: None. + * + * Side Effects: None. + *--------------------------------------------------------- + */ + +void +grtoglSetCharSize (size) + int size; /* Width of characters, in pixels (6 or 8). */ +{ + toglCurrent.fontSize = size; + switch (size) + { + case GR_TEXT_DEFAULT: + case GR_TEXT_SMALL: + toglCurrent.font = grSmallFont; + break; + case GR_TEXT_MEDIUM: + toglCurrent.font = grMediumFont; + break; + case GR_TEXT_LARGE: + toglCurrent.font = grLargeFont; + break; + case GR_TEXT_XLARGE: + toglCurrent.font = grXLargeFont; + break; + default: + TxError("%s%d\n", "grtoglSetCharSize: Unknown character size ", + size ); + break; + } +} + + +/* + * ---------------------------------------------------------------------------- + * GrTOGLTextSize -- + * + * Determine the size of a text string. + * + * Results: + * None. + * + * Side effects: + * A rectangle is filled in that is the size of the text in pixels. + * The origin (0, 0) of this rectangle is located on the baseline + * at the far left side of the string. + * ---------------------------------------------------------------------------- + */ + +void +GrTOGLTextSize(text, size, r) + char *text; + int size; + Rect *r; +{ + Tk_FontMetrics overall; + Tk_Font font; + int width; + + switch (size) { + case GR_TEXT_DEFAULT: + case GR_TEXT_SMALL: + font = grSmallFont; + break; + case GR_TEXT_MEDIUM: + font = grMediumFont; + break; + case GR_TEXT_LARGE: + font = grLargeFont; + break; + case GR_TEXT_XLARGE: + font = grXLargeFont; + break; + default: + TxError("%s%d\n", "GrTOGLTextSize: Unknown character size ", + size ); + break; + } + if (font == NULL) return; + Tk_GetFontMetrics(font, &overall); + width = Tk_TextWidth(font, text, strlen(text)); + /* Hack alert! Tk_TextWidth returns values too small! */ + width = width + (width >> 4); + r->r_ytop = overall.ascent; + r->r_ybot = -overall.descent; + r->r_xtop = width; + r->r_xbot = 0; +} + +/* OpenGL backing store functions (now removed from the X11-based ones) */ +/* Since we always paint into the front buffer, the back buffer is */ +/* always available for backing store. We need not create or destroy */ +/* it. We just use the w_backingStore location to store whether the */ +/* backing store contains valid data or not. */ + +void +grtoglFreeBackingStore(MagWindow *window) +{ + window->w_backingStore = (ClientData)0; +} + +void +grtoglCreateBackingStore(MagWindow *w) +{ + Tk_Window tkwind = (Tk_Window)w->w_grdata; + + /* ignore all windows other than layout */ + if (w->w_client != DBWclientID) return; + + /* Deferred */ + if (tkwind == NULL) return; + + w->w_backingStore = (ClientData)1; +} + +bool +grtoglGetBackingStore(MagWindow *w, Rect *area) +{ + unsigned int width, height; + int xbot, ybot; + Rect r; + + // GLboolean result; + // GLint rasterpos[4]; + + if (w->w_backingStore == (ClientData)0) return FALSE; + + GEO_EXPAND(area, 1, &r); + GeoClip(&r, &(w->w_screenArea)); + + width = r.r_xtop - r.r_xbot; + height = r.r_ytop - r.r_ybot; + + xbot = r.r_xbot; + ybot = r.r_ybot; + + glDrawBuffer(GL_FRONT); + glReadBuffer(GL_BACK); + glRasterPos2i((GLint)xbot, (GLint)ybot); + + /* Check for valid raster position */ + // glGetBooleanv(GL_CURRENT_RASTER_POSITION_VALID, (GLboolean *)(&result)); + // glGetIntegerv(GL_CURRENT_RASTER_POSITION, (GLint *)(&rasterpos[0])); + + // TxPrintf("Raster valid = %d, position = %d %d %d %d\n", + // (int)result, (int)rasterpos[0], (int)rasterpos[1], + // (int)rasterpos[2], (int)rasterpos[3]); + // if (result == 0) + // TxPrintf("Intended position = %d %d\n", xbot, ybot); + + glDisable(GL_BLEND); + glCopyPixels(xbot, ybot, width, height, GL_COLOR); + + return TRUE; +} + + +bool +grtoglScrollBackingStore(MagWindow *w, Point *shift) +{ + unsigned int width, height; + int xorigin, yorigin, xshift, yshift; + + if (w->w_backingStore == (ClientData)0) + { + TxPrintf("grtoglScrollBackingStore %d %d failure\n", + shift->p_x, shift->p_y); + return FALSE; + } + + width = w->w_screenArea.r_xtop - w->w_screenArea.r_xbot; + height = w->w_screenArea.r_ytop - w->w_screenArea.r_ybot; + xorigin = 0; + yorigin = 0; + xshift = shift->p_x; + yshift = shift->p_y; + + if (xshift > 0) + width -= xshift; + else if (xshift < 0) + { + width += xshift; + xorigin = -xshift; + xshift = 0; + } + if (yshift > 0) + height -= yshift; + else if (yshift < 0) + { + height += yshift; + yorigin = -yshift; + yshift = 0; + } + + glDrawBuffer(GL_BACK); + glReadBuffer(GL_BACK); + glRasterPos2i((GLint)xshift, (GLint)yshift); + glDisable(GL_BLEND); + glCopyPixels(xorigin, yorigin, width, height, GL_COLOR); + + glDrawBuffer(GL_FRONT); + + return TRUE; +} + +void +grtoglPutBackingStore(MagWindow *w, Rect *area) +{ + unsigned int width, height; + int ybot, xbot; + Rect r; + + // GLboolean result; + // GLint rasterpos[4]; + + if (w->w_backingStore == (ClientData)0) return; + + GEO_EXPAND(area, 1, &r); + GeoClip(&r, &(w->w_screenArea)); + + /* + width = area->r_xtop - area->r_xbot; + height = area->r_ytop - area->r_ybot; + + ybot = area->r_ybot; + xbot = area->r_xbot; + */ + + width = r.r_xtop - r.r_xbot; + height = r.r_ytop - r.r_ybot; + ybot = r.r_ybot; + xbot = r.r_xbot; + + if (xbot < 0) { + width -= xbot; + xbot = 0; + } + + if (ybot < 0) { + height -= ybot; + ybot = 0; + } + + glReadBuffer(GL_FRONT); + glDrawBuffer(GL_BACK); + glRasterPos2i((GLint)xbot, (GLint)ybot); + + /* Check for valid raster position */ + // glGetBooleanv(GL_CURRENT_RASTER_POSITION_VALID, (GLboolean *)(&result)); + // glGetIntegerv(GL_CURRENT_RASTER_POSITION, (GLint *)(&rasterpos[0])); + + // TxPrintf("Raster valid = %d, position = %d %d %d %d\n", + // (int)result, (int)rasterpos[0], (int)rasterpos[1], + // (int)rasterpos[2], (int)rasterpos[3]); + // if (result == 0) + // TxPrintf("Intended position = %d %d\n", xbot, ybot); + + /* This area may need to be expanded by a pixel and/or */ + /* expanded by GrPixelCorrect to compensate for the OpenGL */ + /* coordinate system. */ + + width--; + height--; + + glDisable(GL_BLEND); + glCopyPixels(xbot, ybot, width, height, GL_COLOR); + + glDrawBuffer(GL_FRONT); /* Return to normal front rendering */ +} + + +/* + * ---------------------------------------------------------------------------- + * GrTOGLReadPixel -- + * + * Read one pixel from the screen. + * + * Results: + * An integer containing the pixel's color. + * + * Side effects: + * none. + * + * ---------------------------------------------------------------------------- + */ + +int +GrTOGLReadPixel (w, x, y) + MagWindow *w; + int x,y; /* the location of a pixel in screen coords */ +{ + return 0; /* OpenGL has no such function, so return 0 */ +} + + +/* + * ---------------------------------------------------------------------------- + * GrTOGLBitBlt -- + * + * Copy information in bit block transfers. + * + * Results: + * None. + * + * Side effects: + * changes the screen. + * ---------------------------------------------------------------------------- + */ + +void +GrTOGLBitBlt(r, p) + Rect *r; + Point *p; +{ + glCopyPixels(r->r_xbot, r->r_ybot, r->r_xtop - r->r_xbot + 1, + r->r_ytop - r->r_ybot + 1, GL_COLOR); +} + +#ifdef VECTOR_FONTS + +/* + *---------------------------------------------------------------------- + * + * Technically, there should be no self-intersecting polygons in outline + * fonts. However, decomposition of bezier curves into line segments + * may occasionally produce one, so it needs to be handled. + *---------------------------------------------------------------------- + */ + +void +myCombine(GLdouble coords[3], GLdouble *vertex_data[4], + GLfloat weight[4], GLdouble **outData, void *dataptr) +{ + /* This needs to be free'd at the end of gluTessEndPolygon()! */ + GLdouble *new = (GLdouble *)mallocMagic(2 * sizeof(GLdouble)); + new[0] = coords[0]; + new[1] = coords[1]; + *outData = new; + /* Diagnostic */ + TxError("Intersecting polygon in char \"%c\" at %g %g!\n", + *((char *)dataptr), coords[0], coords[1]); +} + +/* + *---------------------------------------------------------------------- + * Draw a text character + * This routine differs from grtoglFillPolygon() in that it uses the + * glu library to handle non-convex polygons as may appear in font + * outlines. + *---------------------------------------------------------------------- + */ + +void +grtoglDrawCharacter(clist, tc, pixsize) + FontChar *clist; + unsigned char tc; + int pixsize; +{ + Point *tp; + int np, nptotal; + int i, j; + static GLUtesselator *tess = NULL; + static GLdouble *v = NULL; + static int maxnp = 0; + FontChar *ccur; + + if (pixsize < 5) return; /* Label too small to be useful */ + + if (tess == NULL) + { + tess = gluNewTess(); + gluTessCallback(tess, GLU_TESS_BEGIN, (_GLUfuncptr)glBegin); + gluTessCallback(tess, GLU_TESS_VERTEX, (_GLUfuncptr)glVertex3dv); + gluTessCallback(tess, GLU_TESS_END, (_GLUfuncptr)glEnd); + gluTessCallback(tess, GLU_TESS_COMBINE_DATA, (_GLUfuncptr)myCombine); + } + // Boundary-only does not look particularly good. . . + gluTessProperty(tess, GLU_TESS_BOUNDARY_ONLY, GL_FALSE); + + nptotal = 0; + for (ccur = clist; ccur != NULL; ccur = ccur->fc_next) + nptotal += ccur->fc_numpoints; + + if (nptotal > maxnp) + { + if (v != NULL) freeMagic((char *)v); + maxnp = nptotal; + v = (GLdouble *)mallocMagic(nptotal * 3 * sizeof(GLdouble)); + } + + j = 0; + for (ccur = clist; ccur != NULL; ccur = ccur->fc_next) + { + tp = ccur->fc_points; + np = ccur->fc_numpoints; + + for (i = 0; i < np; i++, j += 3) { + v[j] = tp[i].p_x; + v[j + 1] = tp[i].p_y; + v[j + 2] = 0; + } + } + + gluTessBeginPolygon(tess, (GLvoid *)(&tc)); + j = 0; + for (ccur = clist; ccur != NULL; ccur = ccur->fc_next) + { + np = ccur->fc_numpoints; + gluTessBeginContour(tess); + for (i = 0; i < np; i++, j += 3) { + gluTessVertex(tess, &v[j], &v[j]); + } + gluTessEndContour(tess); + } + gluTessEndPolygon(tess); +} + +/*--------------------------------------------------------- + * grtoglFontText: + * + * This routine draws text from font vectors using the + * font vector routines in DBlabel.c. Text is clipped + * to the clipping rectangle. + * + * For speed, we should be transferring the font + * vectors into OpenGL display lists! + * + *--------------------------------------------------------- + */ + +void +grtoglFontText(text, font, size, rotate, pos, clip, obscure) + char *text; /* The text to be drawn */ + int font; /* Font to use from fontList */ + int size; /* Pixel size of the font */ + int rotate; /* Text rotation */ + Point *pos; /* Text base position */ + Rect *clip; /* Clipping area */ + LinkedRect *obscure; /* List of obscuring areas */ +{ + char *tptr; + Point *coffset; /* vector to next character */ + Rect *cbbox; + GLfloat fsize, matvals[16]; + FontChar *clist; + int cheight, baseline; + float tmp; + + /* Keep it simple for now---ignore clip and obscure */ + + glDisable(GL_BLEND); + glPushMatrix(); + glTranslated(pos->p_x, pos->p_y, 0); + glRotated(rotate, 0, 0, 1); + + /* Get label size */ + cbbox = &DBFontList[font]->mf_extents; + + fsize = (GLfloat)size / (GLfloat)cbbox->r_ytop; + glScalef(fsize, fsize, 1.0); + + /* Adjust to baseline */ + baseline = 0; + for (tptr = text; *tptr != '\0'; tptr++) + { + DBFontChar(font, *tptr, NULL, NULL, &cbbox); + if (cbbox->r_ybot < baseline) + baseline = cbbox->r_ybot; + } + glTranslated(0, -baseline, 0); + + for (tptr = text; *tptr != '\0'; tptr++) + { + DBFontChar(font, *tptr, &clist, &coffset, NULL); + grtoglDrawCharacter(clist, *tptr, size); + glTranslated(coffset->p_x, coffset->p_y, 0); + } + glPopMatrix(); +} + +#endif /* VECTOR_FONTS */ + +/*--------------------------------------------------------- + * grtoglPutText: + * (modified on SunPutText) + * + * This routine puts a chunk of text on the screen in the current + * color, size, etc. The caller must ensure that it fits on + * the screen -- no clipping is done except to the obscuring rectangle + * list and the clip rectangle. + * + * Results: + * none. + * + * Side Effects: + * The text is drawn on the screen. + * + *--------------------------------------------------------- + */ + +void +grtoglPutText (text, pos, clip, obscure) + char *text; /* The text to be drawn. */ + Point *pos; /* A point located at the leftmost point of + * the baseline for this string. + */ + Rect *clip; /* A rectangle to clip against */ + LinkedRect *obscure; /* A list of obscuring rectangles */ + +{ + Rect location; + Rect overlap; + Rect textrect; + LinkedRect *ob; + void grTOGLGeoSub(); + int i; + float tscale; + + GrTOGLTextSize(text, toglCurrent.fontSize, &textrect); + + location.r_xbot = pos->p_x + textrect.r_xbot; + location.r_xtop = pos->p_x + textrect.r_xtop; + location.r_ybot = pos->p_y + textrect.r_ybot; + location.r_ytop = pos->p_y + textrect.r_ytop; + + /* erase parts of the bitmap that are obscured */ + for (ob = obscure; ob != NULL; ob = ob->r_next) + { + if (GEO_TOUCH(&ob->r_r, &location)) + { + overlap = location; + GeoClip(&overlap, &ob->r_r); + grTOGLGeoSub(&location, &overlap); + } + } + + overlap = location; + GeoClip(&overlap, clip); + + /* copy the text to the color screen */ + if ((overlap.r_xbot < overlap.r_xtop)&&(overlap.r_ybot <= overlap.r_ytop)) + { + glScissor(overlap.r_xbot, overlap.r_ybot, overlap.r_xtop - overlap.r_xbot, + overlap.r_ytop - overlap.r_ybot); + glEnable(GL_SCISSOR_TEST); + glDisable(GL_BLEND); + glRasterPos2i(pos->p_x, pos->p_y); + glListBase(grXBases[(toglCurrent.fontSize == GR_TEXT_DEFAULT) ? + GR_TEXT_SMALL : toglCurrent.fontSize]); + glCallLists(strlen(text), GL_UNSIGNED_BYTE, (unsigned char *)text); + glDisable(GL_SCISSOR_TEST); + } +} + + +/* grTOGLGeoSub: + * return the tallest sub-rectangle of r not obscured by area + * area must be within r. + */ + +void +grTOGLGeoSub(r, area) +Rect *r; /* Rectangle to be subtracted from. */ +Rect *area; /* Area to be subtracted. */ + +{ + if (r->r_xbot == area->r_xbot) r->r_xbot = area->r_xtop; + else + if (r->r_xtop == area->r_xtop) r->r_xtop = area->r_xbot; + else + if (r->r_ybot <= area->r_ybot) r->r_ybot = area->r_ytop; + else + if (r->r_ytop == area->r_ytop) r->r_ytop = area->r_ybot; + else + r->r_xtop = area->r_xbot; +} diff --git a/graphics/grTk1.c b/graphics/grTk1.c index 76a595f3..3c5aa13a 100644 --- a/graphics/grTk1.c +++ b/graphics/grTk1.c @@ -1114,7 +1114,9 @@ keys_and_buttons: if (mw->w_backingStore != (ClientData)NULL) { Rect surface; + (*GrLockPtr)(mw, FALSE); (*GrGetBackingStorePtr)(mw, &screenRect); + (*GrUnlockPtr)(mw); WindScreenToSurface(mw, &screenRect, &surface); DBWHLRedrawPrepWindow(mw, &surface); WindDrawBorder(mw, &screenRect); diff --git a/graphics/grX11su1.c b/graphics/grX11su1.c index 17319799..054d2e13 100644 --- a/graphics/grX11su1.c +++ b/graphics/grX11su1.c @@ -841,7 +841,9 @@ grX11Stdin() if (w->w_backingStore != (ClientData)NULL) { Rect surface; + (*GrLockPtr)(w, FALSE); (*GrGetBackingStorePtr)(w, &screenRect); + (*GrUnlockPtr)(w); WindScreenToSurface(w, &screenRect, &surface); DBWHLRedrawPrepWindow(w, &surface); WindDrawBorder(w, &screenRect); diff --git a/scripts/config.log b/scripts/config.log index 278434fe..f7a4d99e 100644 --- a/scripts/config.log +++ b/scripts/config.log @@ -4,7 +4,7 @@ running configure, to aid debugging if configure makes a mistake. It was created by configure, which was generated by GNU Autoconf 2.69. Invocation command line was - $ ./configure --enable-cairo-offscreen + $ ./configure ## --------- ## ## Platform. ## @@ -125,7 +125,7 @@ configure: failed program was: | #define PACKAGE_BUGREPORT "" | #define PACKAGE_URL "" | #define MAGIC_VERSION "8.2" -| #define MAGIC_REVISION "27" +| #define MAGIC_REVISION "29" | /* end confdefs.h. */ | #include configure:3474: result: gcc -E @@ -146,7 +146,7 @@ configure: failed program was: | #define PACKAGE_BUGREPORT "" | #define PACKAGE_URL "" | #define MAGIC_VERSION "8.2" -| #define MAGIC_REVISION "27" +| #define MAGIC_REVISION "29" | /* end confdefs.h. */ | #include configure:3594: checking for g++ @@ -302,7 +302,7 @@ configure: failed program was: | #define PACKAGE_BUGREPORT "" | #define PACKAGE_URL "" | #define MAGIC_VERSION "8.2" -| #define MAGIC_REVISION "27" +| #define MAGIC_REVISION "29" | #define STDC_HEADERS 1 | #define HAVE_SYS_TYPES_H 1 | #define HAVE_SYS_STAT_H 1 @@ -343,7 +343,7 @@ configure: failed program was: | #define PACKAGE_BUGREPORT "" | #define PACKAGE_URL "" | #define MAGIC_VERSION "8.2" -| #define MAGIC_REVISION "27" +| #define MAGIC_REVISION "29" | #define STDC_HEADERS 1 | #define HAVE_SYS_TYPES_H 1 | #define HAVE_SYS_STAT_H 1 @@ -433,7 +433,7 @@ configure: failed program was: | #define PACKAGE_BUGREPORT "" | #define PACKAGE_URL "" | #define MAGIC_VERSION "8.2" -| #define MAGIC_REVISION "27" +| #define MAGIC_REVISION "29" | #define STDC_HEADERS 1 | #define HAVE_SYS_TYPES_H 1 | #define HAVE_SYS_STAT_H 1 @@ -506,7 +506,7 @@ configure: failed program was: | #define PACKAGE_BUGREPORT "" | #define PACKAGE_URL "" | #define MAGIC_VERSION "8.2" -| #define MAGIC_REVISION "27" +| #define MAGIC_REVISION "29" | #define STDC_HEADERS 1 | #define HAVE_SYS_TYPES_H 1 | #define HAVE_SYS_STAT_H 1 @@ -651,8 +651,8 @@ generated by GNU Autoconf 2.69. Invocation command line was on stravinsky -config.status:800: creating defs.mak -config.status:903: WARNING: 'defs.mak.in' seems to ignore the --datarootdir setting +config.status:799: creating defs.mak +config.status:902: WARNING: 'defs.mak.in' seems to ignore the --datarootdir setting ## ---------------- ## ## Cache variables. ## @@ -759,7 +759,7 @@ CPPFLAGS='' CSH='/bin/csh' CXX='g++' CXXFLAGS='-g -O2' -DEFS='-DPACKAGE_NAME=\"\" -DPACKAGE_TARNAME=\"\" -DPACKAGE_VERSION=\"\" -DPACKAGE_STRING=\"\" -DPACKAGE_BUGREPORT=\"\" -DPACKAGE_URL=\"\" -DMAGIC_VERSION=\"8.2\" -DMAGIC_REVISION=\"27\" -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DSIZEOF_VOID_P=8 -DSIZEOF_UNSIGNED_INT=4 -DSIZEOF_UNSIGNED_LONG=8 -DSIZEOF_UNSIGNED_LONG_LONG=8 -DSTDC_HEADERS=1 -DHAVE_SETENV=1 -DHAVE_PUTENV=1 -DHAVE_SYS_MMAN_H=1 -DHAVE_DIRENT_H=1 -DHAVE_LIMITS_H=1 -DHAVE_PATHS_H=1 -DHAVE_VA_COPY=1 -DHAVE___VA_COPY=1 -DFILE_LOCKS=1 -DCALMA_MODULE=1 -DCIF_MODULE=1 -DX11_BACKING_STORE=1 -DPLOT_MODULE=1 -DLEF_MODULE=1 -DROUTE_MODULE=1 -DUSE_NEW_MACROS=1 -DHAVE_LIBGL=1 -DHAVE_LIBGLU=1 -DVECTOR_FONTS=1 -DHAVE_LIBCAIRO=1 -DCAIRO_OFFSCREEN_RENDER=1 -DMAGIC_WRAPPER=1 -DTHREE_D=1 -Dlinux=1 -DSYSV=1 -DISC=1' +DEFS='-DPACKAGE_NAME=\"\" -DPACKAGE_TARNAME=\"\" -DPACKAGE_VERSION=\"\" -DPACKAGE_STRING=\"\" -DPACKAGE_BUGREPORT=\"\" -DPACKAGE_URL=\"\" -DMAGIC_VERSION=\"8.2\" -DMAGIC_REVISION=\"29\" -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DSIZEOF_VOID_P=8 -DSIZEOF_UNSIGNED_INT=4 -DSIZEOF_UNSIGNED_LONG=8 -DSIZEOF_UNSIGNED_LONG_LONG=8 -DSTDC_HEADERS=1 -DHAVE_SETENV=1 -DHAVE_PUTENV=1 -DHAVE_SYS_MMAN_H=1 -DHAVE_DIRENT_H=1 -DHAVE_LIMITS_H=1 -DHAVE_PATHS_H=1 -DHAVE_VA_COPY=1 -DHAVE___VA_COPY=1 -DFILE_LOCKS=1 -DCALMA_MODULE=1 -DCIF_MODULE=1 -DPLOT_MODULE=1 -DLEF_MODULE=1 -DROUTE_MODULE=1 -DUSE_NEW_MACROS=1 -DHAVE_LIBGL=1 -DHAVE_LIBGLU=1 -DVECTOR_FONTS=1 -DHAVE_LIBCAIRO=1 -DMAGIC_WRAPPER=1 -DTHREE_D=1 -Dlinux=1 -DSYSV=1 -DISC=1' DEPEND_FLAG='-MM' ECHO_C='' ECHO_N='printf' @@ -783,7 +783,7 @@ LIBS='-lcairo -lGLU -lGL ' LIB_SPECS=' -L/usr/lib64 -ltk8.6 -L/usr/lib64 -ltcl8.6' LTLIBOBJS='' M4='/bin/m4' -MAGIC_REVISION='27' +MAGIC_REVISION='29' MAGIC_VERSION='8.2' MCPP='${MAGICDIR}/scripts/preproc.py' OA='' @@ -884,7 +884,7 @@ unused=' readline lisp' #define PACKAGE_BUGREPORT "" #define PACKAGE_URL "" #define MAGIC_VERSION "8.2" -#define MAGIC_REVISION "27" +#define MAGIC_REVISION "29" #define STDC_HEADERS 1 #define HAVE_SYS_TYPES_H 1 #define HAVE_SYS_STAT_H 1 @@ -911,7 +911,6 @@ unused=' readline lisp' #define FILE_LOCKS 1 #define CALMA_MODULE 1 #define CIF_MODULE 1 -#define X11_BACKING_STORE 1 #define PLOT_MODULE 1 #define LEF_MODULE 1 #define ROUTE_MODULE 1 @@ -920,7 +919,6 @@ unused=' readline lisp' #define HAVE_LIBGLU 1 #define VECTOR_FONTS 1 #define HAVE_LIBCAIRO 1 -#define CAIRO_OFFSCREEN_RENDER 1 #define MAGIC_WRAPPER 1 #define THREE_D 1 #define linux 1 diff --git a/scripts/config.status b/scripts/config.status index 64bf572e..7516ef4f 100755 --- a/scripts/config.status +++ b/scripts/config.status @@ -417,7 +417,7 @@ $config_files Report bugs to the package provider." -ac_cs_config="'--enable-cairo-offscreen' 'CFLAGS=-g'" +ac_cs_config="'CFLAGS=-g'" ac_cs_version="\ config.status configured by ./configure, generated by GNU Autoconf 2.69, @@ -496,7 +496,7 @@ if $ac_cs_silent; then fi if $ac_cs_recheck; then - set X /bin/sh './configure' '--enable-cairo-offscreen' 'CFLAGS=-g' $ac_configure_extra_args --no-create --no-recursion + set X /bin/sh './configure' 'CFLAGS=-g' $ac_configure_extra_args --no-create --no-recursion shift $as_echo "running CONFIG_SHELL=/bin/sh $*" >&6 CONFIG_SHELL='/bin/sh' @@ -588,7 +588,7 @@ S["INSTALL_TARGET"]="install-tcl" S["ALL_TARGET"]="tcl" S["OA_LIBS"]="" S["OA"]="" -S["MAGIC_REVISION"]="27" +S["MAGIC_REVISION"]="29" S["MAGIC_VERSION"]="8.2" S["SCPP"]="gcc -E -x c" S["MCPP"]="${MAGICDIR}/scripts/preproc.py" @@ -674,12 +674,11 @@ S["ECHO_T"]="" S["ECHO_N"]="-n" S["ECHO_C"]="" S["DEFS"]="-DPACKAGE_NAME=\\\"\\\" -DPACKAGE_TARNAME=\\\"\\\" -DPACKAGE_VERSION=\\\"\\\" -DPACKAGE_STRING=\\\"\\\" -DPACKAGE_BUGREPORT=\\\"\\\" -DPACKAGE_URL=\\\"\\\" -DMAGIC_VERSION="\ -"\\\"8.2\\\" -DMAGIC_REVISION=\\\"27\\\" -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHA"\ +"\\\"8.2\\\" -DMAGIC_REVISION=\\\"29\\\" -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHA"\ "VE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DSIZEOF_VOID_P=8 -DSIZEOF_UNSIGNED_INT=4 -DSIZEOF_UNSIGNED_LONG=8 -DSIZEOF_U"\ "NSIGNED_LONG_LONG=8 -DSTDC_HEADERS=1 -DHAVE_SETENV=1 -DHAVE_PUTENV=1 -DHAVE_SYS_MMAN_H=1 -DHAVE_DIRENT_H=1 -DHAVE_LIMITS_H=1 -DHAVE_PATHS_H=1 -DHAVE"\ -"_VA_COPY=1 -DHAVE___VA_COPY=1 -DFILE_LOCKS=1 -DCALMA_MODULE=1 -DCIF_MODULE=1 -DX11_BACKING_STORE=1 -DPLOT_MODULE=1 -DLEF_MODULE=1 -DROUTE_MODULE=1 -"\ -"DUSE_NEW_MACROS=1 -DHAVE_LIBGL=1 -DHAVE_LIBGLU=1 -DVECTOR_FONTS=1 -DHAVE_LIBCAIRO=1 -DCAIRO_OFFSCREEN_RENDER=1 -DMAGIC_WRAPPER=1 -DTHREE_D=1 -Dlinux"\ -"=1 -DSYSV=1 -DISC=1" +"_VA_COPY=1 -DHAVE___VA_COPY=1 -DFILE_LOCKS=1 -DCALMA_MODULE=1 -DCIF_MODULE=1 -DPLOT_MODULE=1 -DLEF_MODULE=1 -DROUTE_MODULE=1 -DUSE_NEW_MACROS=1 -DHA"\ +"VE_LIBGL=1 -DHAVE_LIBGLU=1 -DVECTOR_FONTS=1 -DHAVE_LIBCAIRO=1 -DMAGIC_WRAPPER=1 -DTHREE_D=1 -Dlinux=1 -DSYSV=1 -DISC=1" S["mandir"]="${datarootdir}/man" S["localedir"]="${datarootdir}/locale" S["libdir"]="${exec_prefix}/lib" diff --git a/scripts/configure b/scripts/configure index c2363817..cd936d97 100755 --- a/scripts/configure +++ b/scripts/configure @@ -1408,7 +1408,7 @@ Optional Features: --disable-cif disable cif package --disable-client-render disable OpenGL client-side rendering --enable-invert-y invert screen top to bottom in OpenGL - --enable-framebuffer-backing-store enable OpenGL framebuffer backing store + --disable-framebuffer-backing-store disable OpenGL framebuffer backing store --disable-plot disable plot package --disable-lef disable LEF package --disable-readline disable readline package @@ -6942,7 +6942,7 @@ fi if test "${enable_framebuffer_backing_store+set}" = set; then : enableval=$enable_framebuffer_backing_store; else - enable_framebuffer_backing_store=no + enable_framebuffer_backing_store=yes fi diff --git a/scripts/configure.in b/scripts/configure.in index 37b60534..d70e98ee 100644 --- a/scripts/configure.in +++ b/scripts/configure.in @@ -975,9 +975,9 @@ if test "x$enable_invert_y" = "xyes" ; then fi AC_ARG_ENABLE(framebuffer-backing-store, -[ --enable-framebuffer-backing-store enable OpenGL framebuffer backing store], +[ --disable-framebuffer-backing-store disable OpenGL framebuffer backing store], [], -[enable_framebuffer_backing_store=no]) +[enable_framebuffer_backing_store=yes]) if test "x$enable_framebuffer_backing_store" != "xyes" ; then AC_DEFINE(X11_BACKING_STORE) diff --git a/scripts/defs.mak b/scripts/defs.mak index 7c95e6a0..07220479 100644 --- a/scripts/defs.mak +++ b/scripts/defs.mak @@ -61,14 +61,14 @@ LIB_SPECS = -L/usr/lib64 -ltk8.6 -L/usr/lib64 -ltcl8.6 WISH_EXE = /usr/bin/wish TCL_LIB_DIR = /usr/lib MAGIC_VERSION = 8.2 -MAGIC_REVISION = 27 +MAGIC_REVISION = 29 CC = gcc CPP = gcc -E CXX = g++ CPPFLAGS = -I. -I${MAGICDIR} -DFLAGS = -DCAD_DIR=\"${LIBDIR}\" -DBIN_DIR=\"${BINDIR}\" -DTCL_DIR=\"${TCLDIR}\" -DPACKAGE_NAME=\"\" -DPACKAGE_TARNAME=\"\" -DPACKAGE_VERSION=\"\" -DPACKAGE_STRING=\"\" -DPACKAGE_BUGREPORT=\"\" -DPACKAGE_URL=\"\" -DMAGIC_VERSION=\"8.2\" -DMAGIC_REVISION=\"27\" -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DSIZEOF_VOID_P=8 -DSIZEOF_UNSIGNED_INT=4 -DSIZEOF_UNSIGNED_LONG=8 -DSIZEOF_UNSIGNED_LONG_LONG=8 -DSTDC_HEADERS=1 -DHAVE_SETENV=1 -DHAVE_PUTENV=1 -DHAVE_SYS_MMAN_H=1 -DHAVE_DIRENT_H=1 -DHAVE_LIMITS_H=1 -DHAVE_PATHS_H=1 -DHAVE_VA_COPY=1 -DHAVE___VA_COPY=1 -DFILE_LOCKS=1 -DCALMA_MODULE=1 -DCIF_MODULE=1 -DX11_BACKING_STORE=1 -DPLOT_MODULE=1 -DLEF_MODULE=1 -DROUTE_MODULE=1 -DUSE_NEW_MACROS=1 -DHAVE_LIBGL=1 -DHAVE_LIBGLU=1 -DVECTOR_FONTS=1 -DHAVE_LIBCAIRO=1 -DCAIRO_OFFSCREEN_RENDER=1 -DMAGIC_WRAPPER=1 -DTHREE_D=1 -Dlinux=1 -DSYSV=1 -DISC=1 -DNDEBUG -DGCORE=\"/bin/gcore\" +DFLAGS = -DCAD_DIR=\"${LIBDIR}\" -DBIN_DIR=\"${BINDIR}\" -DTCL_DIR=\"${TCLDIR}\" -DPACKAGE_NAME=\"\" -DPACKAGE_TARNAME=\"\" -DPACKAGE_VERSION=\"\" -DPACKAGE_STRING=\"\" -DPACKAGE_BUGREPORT=\"\" -DPACKAGE_URL=\"\" -DMAGIC_VERSION=\"8.2\" -DMAGIC_REVISION=\"29\" -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DSIZEOF_VOID_P=8 -DSIZEOF_UNSIGNED_INT=4 -DSIZEOF_UNSIGNED_LONG=8 -DSIZEOF_UNSIGNED_LONG_LONG=8 -DSTDC_HEADERS=1 -DHAVE_SETENV=1 -DHAVE_PUTENV=1 -DHAVE_SYS_MMAN_H=1 -DHAVE_DIRENT_H=1 -DHAVE_LIMITS_H=1 -DHAVE_PATHS_H=1 -DHAVE_VA_COPY=1 -DHAVE___VA_COPY=1 -DFILE_LOCKS=1 -DCALMA_MODULE=1 -DCIF_MODULE=1 -DPLOT_MODULE=1 -DLEF_MODULE=1 -DROUTE_MODULE=1 -DUSE_NEW_MACROS=1 -DHAVE_LIBGL=1 -DHAVE_LIBGLU=1 -DVECTOR_FONTS=1 -DHAVE_LIBCAIRO=1 -DMAGIC_WRAPPER=1 -DTHREE_D=1 -Dlinux=1 -DSYSV=1 -DISC=1 -DNDEBUG -DGCORE=\"/bin/gcore\" DFLAGS += -DSHDLIB_EXT=\".so\" CFLAGS = -g -m64 -fPIC -Wimplicit-int -fPIC diff --git a/windows/windView.c b/windows/windView.c index 9b98d76e..e535dcc9 100644 --- a/windows/windView.c +++ b/windows/windView.c @@ -492,8 +492,10 @@ WindScroll(w, surfaceOffset, screenOffset) norefresh.r_ytop += moveorigin.p_y; } + GrLock(w, FALSE); (*GrScrollBackingStorePtr)(w, &moveorigin); (*GrGetBackingStorePtr)(w, &norefresh); + GrUnlock(w); WindAreaChanged(w, &refresh); /* Update highlights over entire screen area */ DBWHLRedrawPrepWindow(w, &(w->w_surfaceArea));