| Title: | DECWINDOWS 26-JAN-89 to 29-NOV-90 |
| Notice: | See 1639.0 for VMS V5.3 kit; 2043.0 for 5.4 IFT kit |
| Moderator: | STAR::VATNE |
| Created: | Mon Oct 30 1989 |
| Last Modified: | Mon Dec 31 1990 |
| Last Successful Update: | Fri Jun 06 1997 |
| Number of topics: | 3726 |
| Total number of notes: | 19516 |
Hello, We have been looking at using the XFillPolygon for a large number of points and have come across some limitations that we cannot find explained in the documentation. We have found using 4094 points, that the code does not return from the XFillPolygon call. Using 4093 points the call returns but some corruption of the image is seen. The code we have used for testing is in the first reply. We have been testing on a VS3100 running V5.3-2 VMS, DECWindows V2 I have also posted this note in the Xlib conference. Any information or pointers gratefully recieved. Thanks in advance, Simon Austin (UK TSC)
| T.R | Title | User | Personal Name | Date | Lines |
|---|---|---|---|---|---|
| 3024.1 | The test code | PAPERS::AUSTIN | Mon Jul 02 1990 05:20 | 105 | |
#include <decw$include/xlib.h>
#include stdio
#include errno
#include math
/* Define size of drawables */
#define XMIN 0
#define YMIN 0
#define XMAX 800
#define YMAX 800
#define Window1Name "Circle"
#define DTOR 3.14159/180.0 /* Degrees to radians convertion */
#define RADIUS 380 /* Radius of circle */
#define XORI 400 /* X offset of origin */
#define YORI 400 /* Y offset of origin */
Display *dpy = 0 ;
GC gc1 ;
Window win1 ;
float delay = 3.0 ;
void setup() ;
void circle() ;
main()
{
int npts ; /* Number of points in the circle */
char *junk ;
setup() ;
printf("Enter value for no. of points [int] : ") ; scanf("%d", &npts) ;
circle(npts) ;
printf("Enter any string to exit : ") ;
scanf("%s", &junk) ;
}
/** -------------------------------- End of main --------------------------- **/
void setup()
{
Screen *screen ;
XSetWindowAttributes xswa ;
dpy = XOpenDisplay(0) ;
XSynchronize(dpy, 1) ;
screen = DefaultScreenOfDisplay(dpy) ;
xswa.background_pixel = XWhitePixelOfScreen(screen) ;
win1 = XCreateWindow(dpy,
RootWindow(dpy, DefaultScreen(dpy)),
100, 100, XMAX-XMIN, YMAX-YMIN, 0,
DefaultDepthOfScreen(screen), InputOutput,
DefaultVisualOfScreen(screen), CWBackPixel,
&xswa) ;
XStoreName(dpy, win1, Window1Name) ;
XMapWindow(dpy, win1) ;
gc1 = DefaultGC(dpy, DefaultScreen(dpy)) ; /* Get a GC */
/* Set up to draw black lines on white background */
XSetForeground(dpy, gc1, XBlackPixel(dpy, DefaultScreen(dpy))) ;
}
/* -------------------------------------------------------------------------- */
void circle(npts)
int npts ;
{
int ii ;
float var_1 ;
XPoint *points ;
/* (Bytes per int) * (ints per point) * (number of points) */
points = malloc(sizeof(XPoint)*npts) ;
if (points == 0) {
printf("Unable to malloc %d points\n", npts) ;
exit(vaxc$errno) ;
} /* .. if malloc failed */
var_1 = ( (double)360 / (double)npts ) * DTOR ; /* Simplify expression */
for (ii=0 ; ii<npts ; ii++) {
(points +ii)->x = (short)( (double)RADIUS * sin((double)ii * var_1) +
(double) XORI ) ;
(points +ii)->y = (short)( (double)RADIUS * cos((double)ii * var_1) +
(double) YORI ) ;
} /* .. for all points */
XDrawLines(dpy, win1, gc1, points, npts, CoordModeOrigin) ; /* ? */
printf("After DrawLines\n") ;
/** lib$wait(&delay) ; **/
/** XFillPolygon(dpy, win1, gc1, points, npts, Complex, CoordModeOrigin) ; /* ? */
/** XFillPolygon(dpy, win1, gc1, points, npts, Convex, CoordModeOrigin) ; /* ? */
/** XFillPolygon(dpy, win1, gc1, points, npts, Nonconvex, CoordModeOrigin) ; /* ? */
XFillPolygon(dpy, win1, gc1, points, npts, Complex, CoordModeOrigin) ; /* ? */
printf("After FillPolygon\n") ;
/** lib$wait(&delay) ; **/
}
| |||||
| 3024.2 | We've hit the same problem | SITBUL::MCCARTNEY | Tue Jul 03 1990 11:44 | 16 | |
We ran into this while developing UISX. We found that we can get
consistent action as long as week keep the list passed to XDrawSegments
to no more than 8184 segments; XDrawLines can take up to 32744 points;
XFillPoly can take up to 4092 and remain consistent. If we went over
any of these limits we got inconsistent behavior. Sometimes it crashed
the server (When the system appears hung above, restart the server and
then look in the old server error log. We found errors about bad
packets in there). Other times it gave strange messages about a bad GC.
You are right that this is not documented. I'm told that it's a bug
and that the X client side seems to be over running a packet instead of
breaking it properly. We found the above values by trial and error.
We've had to resort to having our code break the calls down into
multiple calls to get this to work.
Irene
| |||||
| 3024.3 | GILROY::klee | Tue Jul 03 1990 13:29 | 9 | ||
The XMaxRequestSize() Xlib function will tell you the size of the largest request you can make. The X protocol requires that this number be no smaller than 16384 bytes. This works out to 4093 points in XDrawLines, 4092 points in a XFillPolygon, and 2046 segments in a XDrawSegments. A particular implementation is allowed to exceed these limits and, in fact, DEC implementations are able to work around it for XDrawSegments and XDrawLines. No help for XFillPolygon, though. Ken | |||||
| 3024.4 | Better on RISC/Ultrix server! | ZSAZSA::READINGS | Richard Readings | Thu Jul 05 1990 11:59 | 32 |
I've tried running the example program on a VMS V5.5-1 system with the display
directed to a DECstation running Ultrix V4.0, using both TCP/IP and DECnet
transport. This way it runs O.K. up to over 16000 vertices, but crashes with
17000 vertices thus:
ZSAZSA>run xcircle
Enter value for no. of points [int] : 17000
X error event received from server: BadLength - request length incorrect; inter
nal Xlib error
Failed request major op code 69 (X_FillPoly)
Failed request minor op code 0 (if applicable)
ResourceID 0x100001 in failed request (if applicable)
Serial number of failed request 10
Current serial number in output stream 11
%XLIB-E-ERROREVENT, error event received from server
%TRACE-E-TRACEBACK, symbolic stack dump follows
module name routine name line rel PC abs PC
00064470 00064470
00064295 00064295
00065BE3 00065BE3
00065004 00065004
0005C43A 0005C43A
0005C2CE 0005C2CE
00082DD0 00082DD0
XCIRCLE circle 2543 000000F3 0000063F
I got the same result with a DECstation running UWS 2.2.
Richard
| |||||
| 3024.5 | What is VMS 5.5? | SITBUL::MCCARTNEY | Thu Jul 05 1990 14:58 | 3 | |
What is VMS V5.5-1? Last I heard V5.4 is still in field test.
Irene
| |||||
| 3024.6 | QUARK::LIONEL | Free advice is worth every cent | Thu Jul 05 1990 15:02 | 3 | |
Probably V5.3-1.... Steve | |||||
| 3024.7 | VMS 5.5 announcement | ZSAZSA::READINGS | Richard Readings | Fri Jul 06 1990 04:39 | 6 |
VMS 5.5 comes up on my VAXstation when the operator has 5 thumbs on each hand (and no fingers)! Sorry for the confusion (should be VMS V5.3-1) Richard | |||||
| 3024.8 | Transport buffer size limitation? | ZSAZSA::READINGS | Richard Readings | Wed Jul 18 1990 12:10 | 9 |
The Phigs boys tell me that this problem is caused by a limit in the transport buffer size which is operating system dependent. On Ultrix, this limit is, by default, usually 64K (16386 points * 4-bytes-per-point), and on VMS usually 16K (4096 points * 4-bytes-per-point). Is there any way I can modify this buffer size on VMS? Richard | |||||
| 3024.9 | DECWIN::JMSYNGE | James M Synge, VMS Development | Thu Jul 19 1990 17:56 | 10 | |
This is not so much an OS limitation, as one imposed by an X server.
At the time you open a display, it sends back a message which says
how big a request it is willing to accept. I think the protocol
requires you to support at least 16KB.
I think that it is the responsibility fo Xlib to partition large calls
into requests which fit in 16KB. If it is not doing so on your client
platform, then that is a bug, and should be reported.
James
| |||||