aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorlecoanet2001-10-12 07:22:27 +0000
committerlecoanet2001-10-12 07:22:27 +0000
commit58a522ef73cc1e9bd2a96b7307389f13abdbe475 (patch)
tree9491b4846dda397547a6c4a1bbab85989a0fe8bc
parent687abcd3214f880b152686a6a5e8567ee73c9812 (diff)
downloadtkzinc-58a522ef73cc1e9bd2a96b7307389f13abdbe475.zip
tkzinc-58a522ef73cc1e9bd2a96b7307389f13abdbe475.tar.gz
tkzinc-58a522ef73cc1e9bd2a96b7307389f13abdbe475.tar.bz2
tkzinc-58a522ef73cc1e9bd2a96b7307389f13abdbe475.tar.xz
Suppression du code libart.
Am�lioration du rapport de version GLX et demande d'un visual avec accumulation d'alpha. Correction d'un core dump dans la fonction 'currentpart' si il n'y avait pas de current item. Les alphastipples font maintenant 32x32 au lieu de 8x8.
-rw-r--r--generic/tkZinc.c268
1 files changed, 76 insertions, 192 deletions
diff --git a/generic/tkZinc.c b/generic/tkZinc.c
index 793d2a9..e4a5f8f 100644
--- a/generic/tkZinc.c
+++ b/generic/tkZinc.c
@@ -61,14 +61,11 @@ static const char compile_id[]="$Compile: " __FILE__ " " __DATE__ " " __TIME__ "
#include <string.h>
#include <math.h>
#include <X11/Xatom.h>
-#ifdef SHM
-#include <sys/shm.h>
-#include <X11/extensions/XShm.h>
-#endif
#ifdef GLX
#include <GL/glx.h>
#endif
+/*#define PRINT_CONFIG*/
#if 0
typedef struct TagSearch {
@@ -128,7 +125,7 @@ static unsigned char dither4x4[4][4] = {
{ 3, 11, 1, 9 },
{ 15, 7, 13, 5 }
};
-static unsigned char bitmaps[NUM_ALPHA_STEPS][8];
+static unsigned char bitmaps[NUM_ALPHA_STEPS][32][4];
static ZnBool inited = False;
static Tk_Uid all_uid;
@@ -376,75 +373,6 @@ ZnNeedRedisplay(WidgetInfo *wi)
/*
*----------------------------------------------------------------------
*
- * CreateSharedImageBuffer --
- *
- *----------------------------------------------------------------------
- */
-#ifdef LIBART
-#ifdef SHM
-void
-CreateSharedImageBuffer(WidgetInfo *wi)
-{
- /*
- * Allocate a shared image to be used as the back buffer.
- * The sequence is extracted from gdk image.
- */
- wi->draw_buffer_im = XShmCreateImage(wi->dpy, Tk_Visual(wi->win), Tk_Depth(wi->win),
- ZPixmap, NULL, &wi->x_shm_info,
- wi->width, wi->height);
- if (wi->draw_buffer_im == NULL) {
- ZnWarning("XShmCreateImage failed, unable to use local rendering");
- wi->render = False;
- }
- else {
- wi->x_shm_info.shmid = shmget(IPC_PRIVATE,
- wi->draw_buffer_im->bytes_per_line *
- wi->draw_buffer_im->height,
- IPC_CREAT | 0777);
- if (wi->x_shm_info.shmid == -1) {
- XDestroyImage(wi->draw_buffer_im);
- wi->draw_buffer_im = NULL;
- ZnWarning("shmget failed, unable to use local rendering");
- wi->render = False;
- }
- else {
- wi->x_shm_info.readOnly = False;
- wi->x_shm_info.shmaddr = shmat(wi->x_shm_info.shmid, 0, 0);
- wi->draw_buffer_im->data = wi->x_shm_info.shmaddr;
- if (wi->x_shm_info.shmaddr == (char *) -1) {
- shmctl(wi->x_shm_info.shmid, IPC_RMID, 0);
- XDestroyImage(wi->draw_buffer_im);
- wi->draw_buffer_im = NULL;
- ZnWarning("shmat failed, unable to use local rendering");
- wi->render = False;
- }
- else {
- wi->buf.buf = ZnMalloc(wi->draw_buffer_im->bytes_per_line *
- wi->draw_buffer_im->height * 3);
- wi->buf.rowstride = wi->draw_buffer_im->bytes_per_line * 3;
- wi->buf.ox = wi->buf.oy = 0;
- wi->buf.cx = wi->width;
- wi->buf.cy = wi->height;
- XShmAttach(wi->dpy, &wi->x_shm_info);
- XSync(wi->dpy, False);
- /* We mark the segment as destroyed so that when
- * the last process detaches, it will be deleted.
- * There is a small possibility of leaking if
- * we die in XShmAttach. In theory, a signal handler
- * could be set up.
- */
- shmctl(wi->x_shm_info.shmid, IPC_RMID, 0);
- }
- }
- }
-}
-#endif
-#endif
-
-
-/*
- *----------------------------------------------------------------------
- *
* ZincObjCmd --
*
* This procedure is invoked to process the "zinc" Tcl
@@ -452,7 +380,6 @@ CreateSharedImageBuffer(WidgetInfo *wi)
*
*----------------------------------------------------------------------
*/
-
int
ZincObjCmd(ClientData client_data, /* Main window associated with
* interpreter. */
@@ -464,7 +391,7 @@ ZincObjCmd(ClientData client_data, /* Main window associated with
WidgetInfo *wi;
Tk_Window tkwin;
unsigned int num;
- int major_op, minor_op, first_err, first_evt;
+ int major_op, first_err, first_evt;
if (!inited) {
InitZinc(interp);
@@ -493,32 +420,20 @@ ZincObjCmd(ClientData client_data, /* Main window associated with
wi->interp = interp;
wi->dpy = Tk_Display(tkwin);
wi->screen = Tk_Screen(tkwin);
- wi->has_glx = False;
#ifdef GLX
if (glXQueryExtension(wi->dpy, &first_err, &first_evt)) {
+ int minor_op;
if (glXQueryVersion(wi->dpy, &major_op, &minor_op)) {
- if ((major_op == 1) && (minor_op >= 2)) {
-#if 0
+ if ((major_op == 1) && (minor_op >= 1)) {
+#if 1
printf("GLX version %d.%d\n", major_op, minor_op);
- printf("OpenGL version %s\n", (char *) glGetString(GL_VERSION));
- printf(" moteur de rendu : %s\n", (char *) glGetString(GL_RENDERER));
- printf(" fabriquant : %s\n", (char *) glGetString(GL_VENDOR));
- printf(" extensions présentes : %s\n", (char *) glGetString(GL_EXTENSIONS));
-#endif
+#endif
wi->has_glx = True;
}
}
}
#endif
- wi->has_x_shm = False;
-#ifdef SHM
- if (XQueryExtension(wi->dpy, "MIT-SHM", &major_op, &first_evt, &first_err)) {
- ZnBool pixmaps;
- if (XShmQueryVersion(wi->dpy, &major_op, &minor_op, &pixmaps) == True) {
- wi->has_x_shm = True;
- }
- }
-#endif
+
#ifdef SHAPE
wi->has_x_shape = XQueryExtension(wi->dpy, "SHAPE",
&major_op, &first_evt, &first_err);
@@ -581,9 +496,6 @@ ZincObjCmd(ClientData client_data, /* Main window associated with
#endif
wi->gc = 0;
wi->draw_buffer = 0;
-#ifdef LIBART
- wi->draw_buffer_im = 0;
-#endif
wi->events_flags = 0;
wi->pick_aperture = 0;
wi->new_item = wi->current_item = ZN_NO_ITEM;
@@ -596,8 +508,11 @@ ZincObjCmd(ClientData client_data, /* Main window associated with
wi->work_item_list = NULL;
wi->work_pts = ZnListNew(8, sizeof(ZnPoint));
+#ifdef GLX
+ wi->work_doubles = ZnListNew(8, sizeof(double));
+#endif
wi->work_xpts = ZnListNew(8, sizeof(XPoint));
-
+
/*
* Text management init.
*/
@@ -654,18 +569,16 @@ ZincObjCmd(ClientData client_data, /* Main window associated with
* Allocate double buffer pixmap/image.
*/
if (wi->render) {
-#ifdef LIBART
-#ifdef SHM
- CreateSharedImageBuffer(wi);
-#endif
-#endif
#ifdef GLX
if (wi->has_glx) {
+#ifdef PRINT_CONFIG
int val;
+#endif
int attribs[] = { GLX_RGBA,
GLX_DOUBLEBUFFER,
- GLX_BUFFER_SIZE, 16,
- GLX_STENCIL_SIZE, 1,
+ GLX_BUFFER_SIZE, 32,
+ GLX_STENCIL_SIZE, 8,
+ GLX_ALPHA_SIZE, 8,
None };
wi->gl_visual = glXChooseVisual(wi->dpy, XScreenNumberOfScreen(wi->screen), attribs);
@@ -674,32 +587,34 @@ ZincObjCmd(ClientData client_data, /* Main window associated with
wi->render = False;
}
else {
- printf("Visual is 0x%x, ", (int) wi->gl_visual->visualid);
- glXGetConfig(wi->dpy, wi->gl_visual, GLX_RGBA, &val);
- printf("RGBA %d, ", val);
- glXGetConfig(wi->dpy, wi->gl_visual, GLX_DOUBLEBUFFER, &val);
- printf("Double Buffer %d, ", val);
- glXGetConfig(wi->dpy, wi->gl_visual, GLX_STENCIL_SIZE, &val);
- printf("Stencil %d, ", val);
- glXGetConfig(wi->dpy, wi->gl_visual, GLX_BUFFER_SIZE, &val);
- printf("depth %d, ", val);
- glXGetConfig(wi->dpy, wi->gl_visual, GLX_RED_SIZE, &val);
- printf("red %d, ", val);
- glXGetConfig(wi->dpy, wi->gl_visual, GLX_GREEN_SIZE, &val);
- printf("green %d, ", val);
- glXGetConfig(wi->dpy, wi->gl_visual, GLX_BLUE_SIZE, &val);
- printf("blue %d, ", val);
- glXGetConfig(wi->dpy, wi->gl_visual, GLX_ALPHA_SIZE, &val);
- printf("alpha %d\n", val);
wi->gl_context = glXCreateContext(wi->dpy, wi->gl_visual, NULL, True);
if (!wi->gl_context) {
printf("No glx context\n");
wi->render = False;
}
else {
- printf("Context: %d\n", glXIsDirect(wi->dpy, wi->gl_context));
+#if PRINT_CONFIG
+ printf(" Visual : 0x%x, ", (int) wi->gl_visual->visualid);
+ glXGetConfig(wi->dpy, wi->gl_visual, GLX_RGBA, &val);
+ printf("RGBA : %d, ", val);
+ glXGetConfig(wi->dpy, wi->gl_visual, GLX_DOUBLEBUFFER, &val);
+ printf("Double Buffer : %d, ", val);
+ glXGetConfig(wi->dpy, wi->gl_visual, GLX_STENCIL_SIZE, &val);
+ printf("Stencil : %d, ", val);
+ glXGetConfig(wi->dpy, wi->gl_visual, GLX_BUFFER_SIZE, &val);
+ printf("depth : %d, ", val);
+ glXGetConfig(wi->dpy, wi->gl_visual, GLX_RED_SIZE, &val);
+ printf("red : %d, ", val);
+ glXGetConfig(wi->dpy, wi->gl_visual, GLX_GREEN_SIZE, &val);
+ printf("green : %d, ", val);
+ glXGetConfig(wi->dpy, wi->gl_visual, GLX_BLUE_SIZE, &val);
+ printf("blue : %d, ", val);
+ glXGetConfig(wi->dpy, wi->gl_visual, GLX_ALPHA_SIZE, &val);
+ printf("alpha : %d\n", val);
+ printf(" Direct Rendering: %d\n", glXIsDirect(wi->dpy, wi->gl_context));
+#endif
Tk_SetWindowVisual(wi->win, wi->gl_visual->visual,
- 16,
+ 24,
XCreateColormap(wi->dpy, RootWindowOfScreen(wi->screen),
wi->gl_visual->visual, AllocNone));
}
@@ -3045,7 +2960,7 @@ WidgetObjCmd(ClientData client_data, /* Information about the widget. */
Tcl_WrongNumArgs(interp, 1, args, "currentpart");
goto error;
}
- if (wi->current_item->class->Part != NULL) {
+ if ((wi->current_item != ZN_NO_ITEM) && (wi->current_item->class->Part != NULL)) {
l = NULL;
wi->current_item->class->Part(wi->current_item, &l, &wi->current_part);
Tcl_SetObjResult(interp, l);
@@ -4317,35 +4232,6 @@ Configure(Tcl_Interp *interp,/* Used for error reporting. */
return ZN_ERROR;
}
-#ifdef LIBART
- if (flags & TK_CONFIG_ARGV_ONLY) {
- /*
- * Do not allow modification of the rendering scheme after
- * the widget creation.
- */
- wi->render = render;
- }
- else {
- Visual *visual;
- int depth;
- /*
- * Turn off local rendering if shared memory is not supported.
- * or if we cannot use the chosen visual, we cannot work with
- * any visuals, only true color, 16, 24, 32 bits, and perhaps 15 bits
- * and direct color (to be checked).
- */
- wi->render = wi->render && wi->has_x_shm;
- if (wi->render) {
- visual = Tk_Visual(wi->win);
- depth = Tk_Depth(wi->win);
- if (((visual->class != TrueColor) && (visual->class != DirectColor)) ||
- ((depth != 16) && (depth != 24) && (depth != 32))) {
- wi->render = False;
- }
- }
- }
-#endif
-
/*
* Maintain the pick aperture within meaningful bounds.
*/
@@ -4555,7 +4441,21 @@ Event(ClientData client_data, /* Information about widget. */
wi->realized = True;
#ifdef GLX
if (wi->render) {
+ GLfloat r[2];
+
glXMakeCurrent(wi->dpy, ZnWindowId(wi->win), wi->gl_context);
+ /*glGetFloatv(GL_ALIASED_LINE_WIDTH_RANGE, r);*/
+ glGetFloatv(GL_SMOOTH_LINE_WIDTH_RANGE, r);
+ wi->max_line_width = r[1];
+ /*glGetFloatv(GL_ALIASED_POINT_SIZE_RANGE, r);*/
+ glGetFloatv(GL_SMOOTH_POINT_SIZE_RANGE, r);
+ wi->max_point_width = r[1];
+#if PRINT_CONFIG
+ printf("OpenGL version %s\n", (char *) glGetString(GL_VERSION));
+ printf(" Moteur de rendu : %s, ", (char *) glGetString(GL_RENDERER));
+ printf(" Fabriquant : %s\n", (char *) glGetString(GL_VENDOR));
+ printf(" Extensions présentes : %s\n", (char *) glGetString(GL_EXTENSIONS));
+#endif
}
#endif
/*
@@ -4651,20 +4551,6 @@ Event(ClientData client_data, /* Information about widget. */
/*
* Reallocate the double buffer pixmap/image.
*/
- if (wi->render) {
-#ifdef LIBART
-#ifdef SHM
- /* Free the image and allocate a bigger one. */
- XShmDetach(wi->dpy, &wi->x_shm_info);
- XDestroyImage(wi->draw_buffer_im);
- wi->draw_buffer_im = NULL;
- shmdt(wi->x_shm_info.shmaddr);
- shmctl(wi->x_shm_info.shmid, IPC_RMID, 0);
- ZnFree(wi->buf.buf);
- CreateSharedImageBuffer(wi);
-#endif
-#endif
- }
if (!wi->render) {
XFreePixmap(wi->dpy, wi->draw_buffer);
wi->draw_buffer = XCreatePixmap(wi->dpy, RootWindowOfScreen(wi->screen),
@@ -5439,17 +5325,6 @@ Destroy(char *mem_ptr) /* Info about the widget. */
if (wi->draw_buffer) {
XFreePixmap(wi->dpy, wi->draw_buffer);
}
-#ifdef LIBART
-#ifdef SHM
- if (wi->draw_buffer_im) {
- XShmDetach(wi->dpy, &wi->x_shm_info);
- XDestroyImage(wi->draw_buffer_im);
- shmdt(wi->x_shm_info.shmaddr);
- shmctl(wi->x_shm_info.shmid, IPC_RMID, 0);
- ZnFree(wi->buf.buf);
- }
-#endif
-#endif
#ifdef GLX
if (wi->gl_context) {
glXDestroyContext(wi->dpy, wi->gl_context);
@@ -5470,8 +5345,11 @@ Destroy(char *mem_ptr) /* Info about the widget. */
ITEM_P.FreeClipStack(wi);
ZnListFree(wi->work_pts);
+#ifdef GLX
+ ZnListFree(wi->work_doubles);
+#endif
ZnListFree(wi->work_xpts);
-
+
FreeChrono(wi->total_draw_chrono);
FreeChrono(wi->this_draw_chrono);
@@ -5562,12 +5440,6 @@ Redisplay(ClientData client_data) /* Information about the widget. */
if (!IsEmptyBBox(&merge)) {
BBox2XRect(&merge, &r);
if (wi->render) {
-#ifdef LIBART
-#ifdef SHM
- XPutImage(wi->dpy, ZnWindowId(wi->win), wi->gc, wi->draw_buffer_im,
- r.x, r.y, r.x+wi->inset, r.y+wi->inset, r.width, r.height);
-#endif
-#endif
#ifdef GLX
/* Switch the GL buffers. */
glXSwapBuffers(wi->dpy, ZnWindowId(wi->win));
@@ -6513,8 +6385,7 @@ InitZinc(Tcl_Interp *interp) {
for (i = 0; i < NUM_ALPHA_STEPS; i++) {
for (y = 0; y < 4; y++) {
- bitmaps[i][y] = 0;
- bitmaps[i][y+4] = 0;
+ bitmaps[i][y][0] = 0;
for (x = 0; x < 4; x++) {
/*
* Use the dither4x4 matrix to determine if this bit is on
@@ -6525,15 +6396,28 @@ InitZinc(Tcl_Interp *interp) {
* mirror the pattern in x & y to make an 8x8 bitmap.
*/
if (bit) {
- bitmaps[i][y] |= (1 << x);
- bitmaps[i][y] |= (1 << (4 + x));
- bitmaps[i][4+y] |= (1 << x);
- bitmaps[i][4+y] |= (1 << (4 + x));
+ bitmaps[i][y][0] |= (1 << x);
+ bitmaps[i][y][0] |= (1 << (4 + x));
}
}
+ bitmaps[i][y][1] = bitmaps[i][y][2] = bitmaps[i][y][3] = bitmaps[i][y][0];
+ bitmaps[i][y+4][0] = bitmaps[i][y+4][1] = bitmaps[i][y][0];
+ bitmaps[i][y+4][2] = bitmaps[i][y+4][3] = bitmaps[i][y][0];
+ bitmaps[i][y+8][0] = bitmaps[i][y+8][1] = bitmaps[i][y][0];
+ bitmaps[i][y+8][2] = bitmaps[i][y+8][3] = bitmaps[i][y][0];
+ bitmaps[i][y+12][0] = bitmaps[i][y+12][1] = bitmaps[i][y][0];
+ bitmaps[i][y+12][2] = bitmaps[i][y+12][3] = bitmaps[i][y][0];
+ bitmaps[i][y+16][0] = bitmaps[i][y+16][1] = bitmaps[i][y][0];
+ bitmaps[i][y+16][2] = bitmaps[i][y+16][3] = bitmaps[i][y][0];
+ bitmaps[i][y+20][0] = bitmaps[i][y+20][1] = bitmaps[i][y][0];
+ bitmaps[i][y+20][2] = bitmaps[i][y+20][3] = bitmaps[i][y][0];
+ bitmaps[i][y+24][0] = bitmaps[i][y+24][1] = bitmaps[i][y][0];
+ bitmaps[i][y+24][2] = bitmaps[i][y+24][3] = bitmaps[i][y][0];
+ bitmaps[i][y+28][0] = bitmaps[i][y+28][1] = bitmaps[i][y][0];
+ bitmaps[i][y+28][2] = bitmaps[i][y+28][3] = bitmaps[i][y][0];
}
sprintf(name, "AlphaStipple%d", i);
- Tk_DefineBitmap(interp, Tk_GetUid(name), (char *) bitmaps[i], 8, 8);
+ Tk_DefineBitmap(interp, Tk_GetUid(name), (char *) bitmaps[i], 32, 32);
}
/*