50 #include <X11/Xutil.h>
51 #include <X11/Xatom.h>
52 #include <X11/cursorfont.h>
53 #include <X11/keysym.h>
62 # include <sys/socket.h>
77 int,
int,
char*,
int);
146 EnterWindowMask | LeaveWindowMask |
147 PointerMotionMask | KeyPressMask |
150 EnterWindowMask | LeaveWindowMask;
156 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
157 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
158 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
161 struct RXGCValues:XGCValues{};
162 struct RXColor:XColor{};
163 struct RXImage:XImage{};
164 struct RXPoint:XPoint{};
165 struct RXVisualInfo:XVisualInfo{};
166 struct RVisual:Visual{};
286 fWindows[i].fDoubleBuffer =
org.fWindows[i].fDoubleBuffer;
298 fWindows[i].fNewColors =
org.fWindows[i].fNewColors;
309 while (it.Next(key, value)) {
332 while (it.
Next(key, value)) {
369 if (XAllocColor((Display*)
fDisplay, cmap, color))
386 XQueryColors((Display*)
fDisplay, cmap, color, ncolors);
389 for (
Int_t i = 0; i < ncolors; i++) {
399 color[i].flags = DoRed | DoGreen | DoBlue;
411 unsigned int ww, hh, border, depth;
412 XGetGeometry((Display*)
fDisplay, *pix, &root, &xx, &yy, &ww, &hh, &border, &depth);
424 if (!
gCws->fIsPixmap && !
gCws->fDoubleBuffer) {
472 if (
gCws->fNewColors) {
475 delete []
gCws->fNewColors;
476 gCws->fNewColors = 0;
501 gTws->fHeight, xpos, ypos);
512 unsigned int ww, hh, border, depth;
514 XGetGeometry((Display*)
fDisplay, *pix, &root, &xx, &yy, &ww, &hh, &border, &depth);
561 int i, j, icol, ix, iy, w,
h, current_icol;
568 for (i = 0; i < nx; i++) {
570 for (j = 0; j < ny; j++) {
572 if (icol != current_icol) {
591 XPoint *
xy = (XPoint*)xyt;
598 xy,
n, Nonconvex, CoordModeOrigin);
626 XPoint *
xy = (XPoint*)xyt;
628 const Int_t kMaxPoints = 1000001;
630 if (
n > kMaxPoints) {
632 int iend = kMaxPoints - 1;
636 iend += kMaxPoints - 1;
652 for (i = 1; i <
n; i++) {
653 int dx =
xy[i].x -
xy[i-1].x;
654 int dy =
xy[i].y -
xy[i-1].y;
655 if (dx < 0) dx = - dx;
656 if (dy < 0) dy = - dy;
678 XPoint *
xy = (XPoint*)xyt;
681 const int kNMAX = 1000000;
683 for (
int it=0;it<=nt;it++) {
694 for (
m = 0;
m <
n;
m++) {
713 for (i = 0; i <
gMarker.n; i++) {
723 for (i = 0; i <
gMarker.n; i++) {
730 for (i = 0; i <
gMarker.n; i += 2)
785 if (((vis->c_class != TrueColor && vis->c_class != DirectColor) ||
789 static XVisualInfo templates[] = {
791 { 0 , 0 , 0 , 24 , TrueColor , 0 , 0 , 0 , 0 , 0 },
792 { 0 , 0 , 0 , 32 , TrueColor , 0 , 0 , 0 , 0 , 0 },
793 { 0 , 0 , 0 , 16 , TrueColor , 0 , 0 , 0 , 0 , 0 },
794 { 0 , 0 , 0 , 15 , TrueColor , 0 , 0 , 0 , 0 , 0 },
796 { 0 , 0 , 0 , 24 , DirectColor, 0 , 0 , 0 , 0 , 0 },
797 { 0 , 0 , 0 , 32 , DirectColor, 0 , 0 , 0 , 0 , 0 },
798 { 0 , 0 , 0 , 16 , DirectColor, 0 , 0 , 0 , 0 , 0 },
799 { 0 , 0 , 0 , 15 , DirectColor, 0 , 0 , 0 , 0 , 0 },
800 { 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 },
804 XVisualInfo *vlist = 0;
805 for (
Int_t i = 0; templates[i].depth != 0; i++) {
806 Int_t mask = VisualScreenMask|VisualDepthMask|VisualClassMask;
808 if ((vlist = XGetVisualInfo((Display*)
fDisplay, mask, &(templates[i]), &nitems))) {
830 Printf(
"Selected visual 0x%lx: depth %d, class %d, colormap: %s",
850 Int_t (*oldErrorHandler)(Display *, XErrorEvent *) =
853 XSetWindowAttributes attr;
854 memset(&attr, 0,
sizeof(attr));
858 for (
Int_t i = 0; i < nitems; i++) {
867 attr.colormap = XCreateColormap((Display*)
fDisplay, root, vlist[i].visual, AllocNone);
870 static XColor black_xcol = { 0, 0x0000, 0x0000, 0x0000, DoRed|DoGreen|DoBlue, 0 };
871 static XColor white_xcol = { 0, 0xFFFF, 0xFFFF, 0xFFFF, DoRed|DoGreen|DoBlue, 0 };
872 XAllocColor((Display*)
fDisplay, attr.colormap, &black_xcol);
873 XAllocColor((Display*)
fDisplay, attr.colormap, &white_xcol);
874 attr.border_pixel = black_xcol.pixel;
875 attr.override_redirect =
True;
877 w = XCreateWindow((Display*)
fDisplay, root, -20, -20, 10, 10, 0, vlist[i].depth,
878 CopyFromParent, vlist[i].visual,
879 CWColormap|CWBorderPixel|CWOverrideRedirect, &attr);
880 if (w != None && XGetGeometry((Display*)
fDisplay, w, &wjunk, &junk, &junk,
881 &
width, &height, &ujunk, &ujunk)) {
882 fVisual = (RVisual*)vlist[i].visual;
891 XFreeColormap((Display*)
fDisplay, attr.colormap);
893 XSetErrorHandler(oldErrorHandler);
933 if (which >=
kMAXGC || which < 0) {
934 Error(
"GetGC",
"trying to get illegal GC (which = %d)", which);
949 return gTws->fDoubleBuffer;
972 unsigned int border, depth;
973 unsigned int width, height;
977 &
width, &height, &border, &depth);
979 0, 0, &
x, &
y, &junkwin);
984 if (
width > 0 && height > 0) {
986 gTws->fHeight = height;
998 return XDisplayName(dpyName);
1031 }
else if (index == 1) {
1051 if (strlen(mess)==0)
return;
1083 if (!
gTws->fOpen)
return;
1093 Pixmap pixmp1, pixmp2;
1113 strlcpy(vendor, XServerVendor((Display*)
fDisplay),132);
1116 for (i = 0; i <
kMAXGC; i++)
1120 if (XGetGCValues((Display*)
fDisplay, *
gGCtext, GCForeground|GCBackground, &values)) {
1124 Error(
"OpenDisplay",
"cannot get GC values");
1136 if (strstr(vendor,
"Hewlett"))
1137 echov.function = GXxor;
1139 echov.function = GXinvert;
1142 GCForeground | GCBackground | GCFunction,
1146 static int isdisp = 0;
1152 fontlist = XListFonts((Display*)
fDisplay,
"*courier*", 1, &fontcount);
1153 if (fontlist && fontcount != 0) {
1158 XFreeFontNames(fontlist);
1161 fontlist = XListFonts((Display*)
fDisplay,
"fixed", 1, &fontcount);
1162 if (fontlist && fontcount != 0) {
1167 XFreeFontNames(fontlist);
1169 Warning(
"OpenDisplay",
"no default font loaded");
1206 if (
fVisual->c_class == TrueColor) {
1210 if ((
fVisual->blue_mask >> i) == 1) {
1218 if ((
fVisual->green_mask >> i) == 1) {
1226 if ((
fVisual->red_mask >> i) == 1) {
1246 unsigned int wval, hval;
1248 unsigned int ww, hh, border, depth;
1273 XGetGeometry((Display*)
fDisplay,
gCws->fWindow, &root, &xx, &yy, &ww, &hh, &border, &depth);
1275 for (i = 0; i <
kMAXGC; i++)
1285 gCws->fDoubleBuffer = 0;
1286 gCws->fIsPixmap = 1;
1288 gCws->fWidth = wval;
1289 gCws->fHeight = hval;
1290 gCws->fNewColors = 0;
1303 XSetWindowAttributes attributes;
1307 unsigned int wval, hval, border, depth;
1312 XGetGeometry((Display*)
fDisplay, wind, &root, &xval, &yval, &wval, &hval, &border, &depth);
1338 attr_mask |= CWBackPixel;
1340 attr_mask |= CWBorderPixel;
1341 attributes.event_mask = NoEventMask;
1342 attr_mask |= CWEventMask;
1343 attributes.backing_store = Always;
1344 attr_mask |= CWBackingStore;
1345 attributes.bit_gravity = NorthWestGravity;
1346 attr_mask |= CWBitGravity;
1349 attr_mask |= CWColormap;
1352 gCws->fWindow = XCreateWindow((Display*)
fDisplay, wind,
1353 xval, yval, wval, hval, 0,
fDepth,
1355 attr_mask, &attributes);
1364 gCws->fDoubleBuffer = 0;
1365 gCws->fIsPixmap = 0;
1367 gCws->fWidth = wval;
1368 gCws->fHeight = hval;
1369 gCws->fNewColors = 0;
1403 gCws->fWindow = qwid;
1408 gCws->fDoubleBuffer = 0;
1409 gCws->fIsPixmap = 0;
1413 gCws->fNewColors = 0;
1428 if (
gCws->fNewColors) {
1431 delete []
gCws->fNewColors;
1432 gCws->fNewColors = 0;
1456 Window root_return, child_return;
1457 int win_x_return, win_y_return;
1458 int root_x_return, root_y_return;
1459 unsigned int mask_return;
1461 XQueryPointer((Display*)
fDisplay,
gCws->fWindow, &root_return,
1462 &child_return, &root_x_return, &root_y_return, &win_x_return,
1463 &win_y_return, &mask_return);
1474 XFreePixmap((Display*)
fDisplay,*pix);
1507 static int xloc = 0;
1508 static int yloc = 0;
1509 static int xlocp = 0;
1510 static int ylocp = 0;
1511 static Cursor cursor = 0;
1523 cursor = XCreateFontCursor((Display*)
fDisplay, XC_crosshair);
1524 XDefineCursor((Display*)
fDisplay,
gCws->fWindow, cursor);
1532 while (button_press == 0) {
1541 xloc, 0, xloc,
gCws->fHeight);
1543 0, yloc,
gCws->fWidth, yloc);
1548 (yloc-ylocp)*(yloc-ylocp)));
1550 xlocp-radius, ylocp-radius,
1551 2*radius, 2*radius, 0, 23040);
1556 xlocp, ylocp, xloc, yloc);
1569 while (XEventsQueued( (Display*)
fDisplay, QueuedAlready) > 1) {
1570 XNextEvent((Display*)
fDisplay, &event);
1581 xloc, 0, xloc,
gCws->fHeight);
1583 0, yloc,
gCws->fWidth, yloc);
1588 (yloc-ylocp)*(yloc-ylocp)));
1590 xlocp-radius, ylocp-radius,
1591 2*radius, 2*radius, 0, 23040);
1596 xlocp, ylocp, xloc, yloc);
1609 xloc =
event.xbutton.x;
1610 yloc =
event.xbutton.y;
1612 switch (event.type) {
1617 XNextEvent((Display*)
fDisplay, &event);
1618 if (event.type == EnterNotify)
break;
1626 button_press =
event.xbutton.button ;
1627 xlocp =
event.xbutton.x;
1628 ylocp =
event.xbutton.y;
1633 case ButtonRelease :
1635 button_press = 10+
event.xbutton.button ;
1636 xlocp =
event.xbutton.x;
1637 ylocp =
event.xbutton.y;
1643 button_press =
event.xkey.keycode;
1644 xlocp =
event.xbutton.x;
1645 ylocp =
event.xbutton.y;
1651 button_press = -
event.xkey.keycode;
1652 xlocp =
event.xbutton.x;
1653 ylocp =
event.xbutton.y;
1662 if (button_press == 0)
1667 x =
event.xbutton.x;
1668 y =
event.xbutton.y;
1670 return button_press;
1685 static Cursor cursor = 0;
1686 static int percent = 0;
1692 int len_text = strlen(
text);
1698 XKeyboardState kbstate;
1699 cursor = XCreateFontCursor((Display*)
fDisplay, XC_question_arrow);
1700 XGetKeyboardControl((Display*)
fDisplay, &kbstate);
1701 percent = kbstate.bell_percent;
1704 XDefineCursor((Display*)
fDisplay,
gCws->fWindow, cursor);
1705 for (nt = len_text; nt > 0 &&
text[nt-1] ==
' '; nt--) { }
1707 XGetInputFocus((Display*)
fDisplay, &focuswindow, &focusrevert);
1708 XSetInputFocus((Display*)
fDisplay,
gCws->fWindow, focusrevert, CurrentTime);
1719 x + dx,
y,
pt < len_text ? &
text[
pt] :
" ", 1);
1721 switch (event.type) {
1724 XSetInputFocus((Display*)
fDisplay,
gCws->fWindow, focusrevert, CurrentTime);
1727 XSetInputFocus((Display*)
fDisplay, focuswindow, focusrevert, CurrentTime);
1730 nbytes = XLookupString(&event.xkey, keybuf,
sizeof(keybuf),
1743 if (isascii(keybuf[0]) && isprint(keybuf[0])) {
1747 for (i = nt - 1; i >
pt; i--)
1749 if (
pt < len_text) {
1754 switch (keybuf[0]) {
1761 for (i =
pt; i < nt; i++)
1780 for (i =
pt; i < nt; i++)
1798 for (i =
pt; i < nt; i++)
1819 XBell((Display*)
fDisplay, percent);
1824 XSetInputFocus((Display*)
fDisplay, focuswindow, focusrevert, CurrentTime);
1846 if (!
gTws->fOpen)
return;
1849 if (
gTws->fWidth == w &&
gTws->fHeight ==
h)
return;
1853 if (
gTws->fBuffer) {
1855 if (
gTws->fWidth < w ||
gTws->fHeight <
h) {
1863 if (
gTws->fDoubleBuffer)
gTws->fDrawing =
gTws->fBuffer;
1878 unsigned int wval, hval;
1880 unsigned int ww, hh, border, depth;
1891 if (
gTws->fWidth >= wval-1 &&
gTws->fWidth <= wval+1 &&
1892 gTws->fHeight >= hval-1 &&
gTws->fHeight <= hval+1)
return 0;
1895 if (
gTws->fWidth < wval ||
gTws->fHeight < hval) {
1899 XGetGeometry((Display*)
fDisplay,
gTws->fWindow, &root, &xx, &yy, &ww, &hh, &border, &depth);
1901 for (i = 0; i <
kMAXGC; i++)
1910 gTws->fWidth = wval;
1911 gTws->fHeight = hval;
1924 unsigned int wval=0, hval=0, border=0, depth=0;
1928 win =
gTws->fWindow;
1930 XGetGeometry((Display*)
fDisplay, win, &root,
1931 &xval, &yval, &wval, &hval, &border, &depth);
1932 if (wval >= 65500) wval = 1;
1933 if (hval >= 65500) hval = 1;
1936 if (
gTws->fWidth == wval &&
gTws->fHeight == hval)
return;
1938 XResizeWindow((Display*)
fDisplay,
gTws->fWindow, wval, hval);
1940 if (
gTws->fBuffer) {
1941 if (
gTws->fWidth < wval ||
gTws->fHeight < hval) {
1949 if (
gTws->fDoubleBuffer)
gTws->fDrawing =
gTws->fBuffer;
1951 gTws->fWidth = wval;
1952 gTws->fHeight = hval;
1967 if (
gCws->fClip && !
gCws->fIsPixmap && !
gCws->fDoubleBuffer) {
1968 region.x =
gCws->fXclip;
1969 region.y =
gCws->fYclip;
1970 region.width =
gCws->fWclip;
1971 region.height =
gCws->fHclip;
1972 for (i = 0; i <
kMAXGC; i++)
1973 XSetClipRectangles((Display*)
fDisplay,
gGClist[i], 0, 0, ®ion, 1, YXBanded);
1975 for (i = 0; i <
kMAXGC; i++)
1987 if (chupx == 0 && chupy == 0)
fTextAngle = 0;
1988 else if (chupx == 0 && chupy == 1)
fTextAngle = 0;
1989 else if (chupx == -1 && chupy == 0)
fTextAngle = 90;
1990 else if (chupx == 0 && chupy == -1)
fTextAngle = 180;
1991 else if (chupx == 1 && chupy == 0)
fTextAngle = 270;
2009 for (
int i = 0; i <
kMAXGC; i++)
2029 if (
gTws->fClip && !
gTws->fIsPixmap && !
gTws->fDoubleBuffer) {
2031 region.x =
gTws->fXclip;
2032 region.y =
gTws->fYclip;
2033 region.width =
gTws->fWclip;
2034 region.height =
gTws->fHclip;
2035 for (
int i = 0; i <
kMAXGC; i++)
2036 XSetClipRectangles((Display*)
fDisplay,
gGClist[i], 0, 0, ®ion, 1, YXBanded);
2054 }
else if (!
fColormap && (ci < 0 || ci > 1)) {
2060 XGetGCValues((Display*)
fDisplay, gc, GCBackground, &values);
2061 XSetForeground((Display*)
fDisplay, gc, col.
fPixel ^ values.background);
2067 XGetGCValues((Display*)
fDisplay, gc, GCForeground | GCBackground, &values);
2068 if (values.foreground == values.background)
2109 if (!
gTws->fOpen)
return;
2126 if (!
gTws->fDoubleBuffer)
return;
2127 gTws->fDoubleBuffer = 0;
2136 if (
gTws->fDoubleBuffer ||
gTws->fIsPixmap)
return;
2137 if (!
gTws->fBuffer) {
2145 gTws->fDoubleBuffer = 1;
2207 Int_t fasi = fstyle%1000;
2216 static int current_fasi = 0;
2234 if (fasi != current_fasi) {
2239 int stn = (fasi >= 1 && fasi <=25) ? fasi : 2;
2245 current_fasi = fasi;
2259 XSetWindowAttributes attributes;
2264 attr_mask = CWEventMask;
2265 XChangeWindowAttributes((Display*)
fDisplay,
gCws->fWindow, attr_mask, &attributes);
2267 attributes.event_mask = NoEventMask;
2268 attr_mask = CWEventMask;
2269 XChangeWindowAttributes((Display*)
fDisplay,
gCws->fWindow, attr_mask, &attributes);
2278 if (cindex < 0)
return;
2325 static Int_t dashed[2] = {3,3};
2326 static Int_t dotted[2] = {1,2};
2327 static Int_t dasheddotted[4] = {3,4,1,4};
2333 }
else if (lstyle == 2 ) {
2335 }
else if (lstyle == 3 ) {
2337 }
else if (lstyle == 4 ) {
2345 for (
Int_t j = 0; j<nt; j++) {
2347 sscanf(((
TObjString*)tokens->
At(j))->GetName(),
"%d", &it);
2348 linestyle[j] = (
Int_t)(it/4);
2351 delete [] linestyle;
2383 if (cindex < 0)
return;
2400 if (msize < 0)
return;
2425 for (
int i = 0; i <
gMarker.n; i++) {
2438 static RXPoint shape[30];
2444 if (markerstyle == 1 || markerstyle == 6 || markerstyle == 7) {
2445 XSetLineAttributes((Display*)
fDisplay, *
gGCmark, 0, LineSolid, CapButt, JoinMiter);
2453 if (markerstyle == 2) {
2455 shape[0].x = -im; shape[0].y = 0;
2456 shape[1].x = im; shape[1].y = 0;
2457 shape[2].x = 0 ; shape[2].y = -im;
2458 shape[3].x = 0 ; shape[3].y = im;
2460 }
else if (markerstyle == 3 || markerstyle == 31) {
2462 shape[0].x = -im; shape[0].y = 0;
2463 shape[1].x = im; shape[1].y = 0;
2464 shape[2].x = 0 ; shape[2].y = -im;
2465 shape[3].x = 0 ; shape[3].y = im;
2467 shape[4].x = -im; shape[4].y = -im;
2468 shape[5].x = im; shape[5].y = im;
2469 shape[6].x = -im; shape[6].y = im;
2470 shape[7].x = im; shape[7].y = -im;
2472 }
else if (markerstyle == 4 || markerstyle == 24) {
2475 }
else if (markerstyle == 5) {
2478 shape[0].x = -im; shape[0].y = -im;
2479 shape[1].x = im; shape[1].y = im;
2480 shape[2].x = -im; shape[2].y = im;
2481 shape[3].x = im; shape[3].y = -im;
2483 }
else if (markerstyle == 6) {
2485 shape[0].x = -1 ; shape[0].y = 0;
2486 shape[1].x = 1 ; shape[1].y = 0;
2487 shape[2].x = 0 ; shape[2].y = -1;
2488 shape[3].x = 0 ; shape[3].y = 1;
2490 }
else if (markerstyle == 7) {
2492 shape[0].x = -1 ; shape[0].y = 1;
2493 shape[1].x = 1 ; shape[1].y = 1;
2494 shape[2].x = -1 ; shape[2].y = 0;
2495 shape[3].x = 1 ; shape[3].y = 0;
2496 shape[4].x = -1 ; shape[4].y = -1;
2497 shape[5].x = 1 ; shape[5].y = -1;
2499 }
else if (markerstyle == 8 || markerstyle == 20) {
2502 }
else if (markerstyle == 21) {
2504 shape[0].x = -im; shape[0].y = -im;
2505 shape[1].x = im; shape[1].y = -im;
2506 shape[2].x = im; shape[2].y = im;
2507 shape[3].x = -im; shape[3].y = im;
2508 shape[4].x = -im; shape[4].y = -im;
2510 }
else if (markerstyle == 22) {
2512 shape[0].x = -im; shape[0].y = im;
2513 shape[1].x = im; shape[1].y = im;
2514 shape[2].x = 0; shape[2].y = -im;
2515 shape[3].x = -im; shape[3].y = im;
2517 }
else if (markerstyle == 23) {
2519 shape[0].x = 0; shape[0].y = im;
2520 shape[1].x = im; shape[1].y = -im;
2521 shape[2].x = -im; shape[2].y = -im;
2522 shape[3].x = 0; shape[3].y = im;
2524 }
else if (markerstyle == 25) {
2526 shape[0].x = -im; shape[0].y = -im;
2527 shape[1].x = im; shape[1].y = -im;
2528 shape[2].x = im; shape[2].y = im;
2529 shape[3].x = -im; shape[3].y = im;
2530 shape[4].x = -im; shape[4].y = -im;
2532 }
else if (markerstyle == 26) {
2534 shape[0].x = -im; shape[0].y = im;
2535 shape[1].x = im; shape[1].y = im;
2536 shape[2].x = 0; shape[2].y = -im;
2537 shape[3].x = -im; shape[3].y = im;
2539 }
else if (markerstyle == 27) {
2541 Int_t imx =
Int_t(2.66*MarkerSizeReduced + 0.5);
2542 shape[0].x =-imx; shape[0].y = 0;
2543 shape[1].x = 0; shape[1].y = -im;
2544 shape[2].x = imx; shape[2].y = 0;
2545 shape[3].x = 0; shape[3].y = im;
2546 shape[4].x =-imx; shape[4].y = 0;
2548 }
else if (markerstyle == 28) {
2550 Int_t imx =
Int_t(1.33*MarkerSizeReduced + 0.5);
2551 shape[0].x = -im; shape[0].y =-imx;
2552 shape[1].x =-imx; shape[1].y =-imx;
2553 shape[2].x =-imx; shape[2].y = -im;
2554 shape[3].x = imx; shape[3].y = -im;
2555 shape[4].x = imx; shape[4].y =-imx;
2556 shape[5].x = im; shape[5].y =-imx;
2557 shape[6].x = im; shape[6].y = imx;
2558 shape[7].x = imx; shape[7].y = imx;
2559 shape[8].x = imx; shape[8].y = im;
2560 shape[9].x =-imx; shape[9].y = im;
2561 shape[10].x=-imx; shape[10].y= imx;
2562 shape[11].x= -im; shape[11].y= imx;
2563 shape[12].x= -im; shape[12].y=-imx;
2565 }
else if (markerstyle == 29) {
2567 Int_t im1 =
Int_t(0.66*MarkerSizeReduced + 0.5);
2568 Int_t im2 =
Int_t(2.00*MarkerSizeReduced + 0.5);
2569 Int_t im3 =
Int_t(2.66*MarkerSizeReduced + 0.5);
2570 Int_t im4 =
Int_t(1.33*MarkerSizeReduced + 0.5);
2571 shape[0].x = -im; shape[0].y = im4;
2572 shape[1].x =-im2; shape[1].y =-im1;
2573 shape[2].x =-im3; shape[2].y = -im;
2574 shape[3].x = 0; shape[3].y =-im2;
2575 shape[4].x = im3; shape[4].y = -im;
2576 shape[5].x = im2; shape[5].y =-im1;
2577 shape[6].x = im; shape[6].y = im4;
2578 shape[7].x = im4; shape[7].y = im4;
2579 shape[8].x = 0; shape[8].y = im;
2580 shape[9].x =-im4; shape[9].y = im4;
2581 shape[10].x= -im; shape[10].y= im4;
2583 }
else if (markerstyle == 30) {
2585 Int_t im1 =
Int_t(0.66*MarkerSizeReduced + 0.5);
2586 Int_t im2 =
Int_t(2.00*MarkerSizeReduced + 0.5);
2587 Int_t im3 =
Int_t(2.66*MarkerSizeReduced + 0.5);
2588 Int_t im4 =
Int_t(1.33*MarkerSizeReduced + 0.5);
2589 shape[0].x = -im; shape[0].y = im4;
2590 shape[1].x =-im2; shape[1].y =-im1;
2591 shape[2].x =-im3; shape[2].y = -im;
2592 shape[3].x = 0; shape[3].y =-im2;
2593 shape[4].x = im3; shape[4].y = -im;
2594 shape[5].x = im2; shape[5].y =-im1;
2595 shape[6].x = im; shape[6].y = im4;
2596 shape[7].x = im4; shape[7].y = im4;
2597 shape[8].x = 0; shape[8].y = im;
2598 shape[9].x =-im4; shape[9].y = im4;
2599 shape[10].x= -im; shape[10].y= im4;
2601 }
else if (markerstyle == 32) {
2603 shape[0].x = 0; shape[0].y = im;
2604 shape[1].x = im; shape[1].y = -im;
2605 shape[2].x = -im; shape[2].y = -im;
2606 shape[3].x = 0; shape[3].y = im;
2608 }
else if (markerstyle == 33) {
2610 Int_t imx =
Int_t(2.66*MarkerSizeReduced + 0.5);
2611 shape[0].x =-imx; shape[0].y = 0;
2612 shape[1].x = 0; shape[1].y = -im;
2613 shape[2].x = imx; shape[2].y = 0;
2614 shape[3].x = 0; shape[3].y = im;
2615 shape[4].x =-imx; shape[4].y = 0;
2617 }
else if (markerstyle == 34) {
2619 Int_t imx =
Int_t(1.33*MarkerSizeReduced + 0.5);
2620 shape[0].x = -im; shape[0].y =-imx;
2621 shape[1].x =-imx; shape[1].y =-imx;
2622 shape[2].x =-imx; shape[2].y = -im;
2623 shape[3].x = imx; shape[3].y = -im;
2624 shape[4].x = imx; shape[4].y =-imx;
2625 shape[5].x = im; shape[5].y =-imx;
2626 shape[6].x = im; shape[6].y = imx;
2627 shape[7].x = imx; shape[7].y = imx;
2628 shape[8].x = imx; shape[8].y = im;
2629 shape[9].x =-imx; shape[9].y = im;
2630 shape[10].x=-imx; shape[10].y= imx;
2631 shape[11].x= -im; shape[11].y= imx;
2632 shape[12].x= -im; shape[12].y=-imx;
2634 }
else if (markerstyle == 35) {
2636 shape[0].x =-im; shape[0].y = 0;
2637 shape[1].x = 0; shape[1].y = -im;
2638 shape[2].x = im; shape[2].y = 0;
2639 shape[3].x = 0; shape[3].y = im;
2640 shape[4].x =-im; shape[4].y = 0;
2641 shape[5].x = im; shape[5].y = 0;
2642 shape[6].x = 0; shape[6].y = im;
2643 shape[7].x = 0; shape[7].y =-im;
2645 }
else if (markerstyle == 36) {
2647 shape[0].x = -im; shape[0].y = -im;
2648 shape[1].x = im; shape[1].y = -im;
2649 shape[2].x = im; shape[2].y = im;
2650 shape[3].x = -im; shape[3].y = im;
2651 shape[4].x = -im; shape[4].y = -im;
2652 shape[5].x = im; shape[5].y = im;
2653 shape[6].x = -im; shape[6].y = im;
2654 shape[7].x = im; shape[7].y = -im;
2656 }
else if (markerstyle == 37) {
2658 Int_t im2 =
Int_t(2.0*MarkerSizeReduced + 0.5);
2659 shape[0].x = 0; shape[0].y = 0;
2660 shape[1].x =-im2; shape[1].y = im;
2661 shape[2].x = im2; shape[2].y = im;
2662 shape[3].x = 0; shape[3].y = 0;
2663 shape[4].x =-im2; shape[4].y = -im;
2664 shape[5].x = -im; shape[5].y = 0;
2665 shape[6].x = 0; shape[6].y = 0;
2666 shape[7].x = im; shape[7].y = 0;
2667 shape[8].x = im2; shape[8].y = -im;
2668 shape[9].x = 0; shape[9].y = 0;
2670 }
else if (markerstyle == 38) {
2672 Int_t im2 =
Int_t(2.0*MarkerSizeReduced + 0.5);
2673 shape[0].x = -im; shape[0].y = 0;
2674 shape[1].x = -im; shape[1].y =-im2;
2675 shape[2].x =-im2; shape[2].y = -im;
2676 shape[3].x = im2; shape[3].y = -im;
2677 shape[4].x = im; shape[4].y =-im2;
2678 shape[5].x = im; shape[5].y = im2;
2679 shape[6].x = im2; shape[6].y = im;
2680 shape[7].x =-im2; shape[7].y = im;
2681 shape[8].x = -im; shape[8].y = im2;
2682 shape[9].x = -im; shape[9].y = 0;
2683 shape[10].x = im; shape[10].y = 0;
2684 shape[11].x = 0; shape[11].y = 0;
2685 shape[12].x = 0; shape[12].y = -im;
2686 shape[13].x = 0; shape[13].y = im;
2687 shape[14].x = 0; shape[14].y = 0;
2689 }
else if (markerstyle == 39) {
2691 Int_t im2 =
Int_t(2.0*MarkerSizeReduced + 0.5);
2692 shape[0].x = 0; shape[0].y = 0;
2693 shape[1].x =-im2; shape[1].y = im;
2694 shape[2].x = im2; shape[2].y = im;
2695 shape[3].x = 0; shape[3].y = 0;
2696 shape[4].x =-im2; shape[4].y = -im;
2697 shape[5].x = -im; shape[5].y = 0;
2698 shape[6].x = 0; shape[6].y = 0;
2699 shape[7].x = im; shape[7].y = 0;
2700 shape[8].x = im2; shape[8].y = -im;
2702 }
else if (markerstyle == 40) {
2704 Int_t im2 =
Int_t(2.0*MarkerSizeReduced + 0.5);
2705 shape[0].x = 0; shape[0].y = 0;
2706 shape[1].x = im2; shape[1].y = im;
2707 shape[2].x = im; shape[2].y = im2;
2708 shape[3].x = 0; shape[3].y = 0;
2709 shape[4].x = im; shape[4].y = -im2;
2710 shape[5].x = im2; shape[5].y = -im;
2711 shape[6].x = 0; shape[6].y = 0;
2712 shape[7].x = -im2; shape[7].y = -im;
2713 shape[8].x = -im; shape[8].y = -im2;
2714 shape[9].x = 0; shape[9].y = 0;
2715 shape[10].x = -im; shape[10].y = im2;
2716 shape[11].x = -im2; shape[11].y = im;
2717 shape[12].x = 0; shape[12].y = 0;
2719 }
else if (markerstyle == 41) {
2721 Int_t im2 =
Int_t(2.0*MarkerSizeReduced + 0.5);
2722 shape[0].x = 0; shape[0].y = 0;
2723 shape[1].x = im2; shape[1].y = im;
2724 shape[2].x = im; shape[2].y = im2;
2725 shape[3].x = 0; shape[3].y = 0;
2726 shape[4].x = im; shape[4].y = -im2;
2727 shape[5].x = im2; shape[5].y = -im;
2728 shape[6].x = 0; shape[6].y = 0;
2729 shape[7].x = -im2; shape[7].y = -im;
2730 shape[8].x = -im; shape[8].y = -im2;
2731 shape[9].x = 0; shape[9].y = 0;
2732 shape[10].x = -im; shape[10].y = im2;
2733 shape[11].x = -im2; shape[11].y = im;
2734 shape[12].x = 0; shape[12].y = 0;
2736 }
else if (markerstyle == 42) {
2739 shape[0].x= 0; shape[0].y= im;
2740 shape[1].x= -imx; shape[1].y= imx;
2741 shape[2].x = -im; shape[2].y = 0;
2742 shape[3].x = -imx; shape[3].y = -imx;
2743 shape[4].x = 0; shape[4].y = -im;
2744 shape[5].x = imx; shape[5].y = -imx;
2745 shape[6].x = im; shape[6].y = 0;
2746 shape[7].x= imx; shape[7].y= imx;
2747 shape[8].x= 0; shape[8].y= im;
2749 }
else if (markerstyle == 43) {
2752 shape[0].x = 0; shape[0].y = im;
2753 shape[1].x = -imx; shape[1].y = imx;
2754 shape[2].x = -im; shape[2].y = 0;
2755 shape[3].x = -imx; shape[3].y = -imx;
2756 shape[4].x = 0; shape[4].y = -im;
2757 shape[5].x = imx; shape[5].y = -imx;
2758 shape[6].x = im; shape[6].y = 0;
2759 shape[7].x = imx; shape[7].y = imx;
2760 shape[8].x = 0; shape[8].y = im;
2762 }
else if (markerstyle == 44) {
2764 Int_t im2 =
Int_t(2.0*MarkerSizeReduced + 0.5);
2765 shape[0].x = 0; shape[0].y = 0;
2766 shape[1].x = im2; shape[1].y = im;
2767 shape[2].x = -im2; shape[2].y = im;
2768 shape[3].x = im2; shape[3].y = -im;
2769 shape[4].x = -im2; shape[4].y = -im;
2770 shape[5].x = 0; shape[5].y = 0;
2771 shape[6].x = im; shape[6].y = im2;
2772 shape[7].x = im; shape[7].y = -im2;
2773 shape[8].x = -im; shape[8].y = im2;
2774 shape[9].x = -im; shape[9].y = -im2;
2775 shape[10].x = 0; shape[10].y = 0;
2777 }
else if (markerstyle == 45) {
2779 Int_t im0 =
Int_t(0.4*MarkerSizeReduced + 0.5);
2780 Int_t im2 =
Int_t(2.0*MarkerSizeReduced + 0.5);
2781 shape[0].x = im0; shape[0].y = im0;
2782 shape[1].x = im2; shape[1].y = im;
2783 shape[2].x = -im2; shape[2].y = im;
2784 shape[3].x = -im0; shape[3].y = im0;
2785 shape[4].x = -im; shape[4].y = im2;
2786 shape[5].x = -im; shape[5].y = -im2;
2787 shape[6].x = -im0; shape[6].y = -im0;
2788 shape[7].x = -im2; shape[7].y = -im;
2789 shape[8].x = im2; shape[8].y = -im;
2790 shape[9].x = im0; shape[9].y = -im0;
2791 shape[10].x = im; shape[10].y = -im2;
2792 shape[11].x = im; shape[11].y = im2;
2793 shape[12].x = im0; shape[12].y = im0;
2795 }
else if (markerstyle == 46) {
2797 Int_t im2 =
Int_t(2.0*MarkerSizeReduced + 0.5);
2798 shape[0].x = 0; shape[0].y = im2;
2799 shape[1].x = -im2; shape[1].y = im;
2800 shape[2].x = -im; shape[2].y = im2;
2801 shape[3].x = -im2; shape[3].y = 0;
2802 shape[4].x = -im; shape[4].y = -im2;
2803 shape[5].x = -im2; shape[5].y = -im;
2804 shape[6].x = 0; shape[6].y = -im2;
2805 shape[7].x = im2; shape[7].y = -im;
2806 shape[8].x = im; shape[8].y = -im2;
2807 shape[9].x = im2; shape[9].y = 0;
2808 shape[10].x = im; shape[10].y = im2;
2809 shape[11].x = im2; shape[11].y = im;
2810 shape[12].x = 0; shape[12].y = im2;
2812 }
else if (markerstyle == 47) {
2814 Int_t im2 =
Int_t(2.0*MarkerSizeReduced + 0.5);
2815 shape[0].x = 0; shape[0].y = im2;
2816 shape[1].x = -im2; shape[1].y = im;
2817 shape[2].x = -im; shape[2].y = im2;
2818 shape[3].x = -im2; shape[3].y = 0;
2819 shape[4].x = -im; shape[4].y = -im2;
2820 shape[5].x = -im2; shape[5].y = -im;
2821 shape[6].x = 0; shape[6].y = -im2;
2822 shape[7].x = im2; shape[7].y = -im;
2823 shape[8].x = im; shape[8].y = -im2;
2824 shape[9].x = im2; shape[9].y = 0;
2825 shape[10].x = im; shape[10].y = im2;
2826 shape[11].x = im2; shape[11].y = im;
2827 shape[12].x = 0; shape[12].y = im2;
2829 }
else if (markerstyle == 48) {
2831 Int_t im2 =
Int_t(2.0*MarkerSizeReduced + 0.5);
2832 shape[0].x = 0; shape[0].y = im2*1.005;
2833 shape[1].x = -im2; shape[1].y = im;
2834 shape[2].x = -im; shape[2].y = im2;
2835 shape[3].x = -im2; shape[3].y = 0;
2836 shape[4].x = -im; shape[4].y = -im2;
2837 shape[5].x = -im2; shape[5].y = -im;
2838 shape[6].x = 0; shape[6].y = -im2;
2839 shape[7].x = im2; shape[7].y = -im;
2840 shape[8].x = im; shape[8].y = -im2;
2841 shape[9].x = im2; shape[9].y = 0;
2842 shape[10].x = im; shape[10].y = im2;
2843 shape[11].x = im2; shape[11].y = im;
2844 shape[12].x = 0; shape[12].y = im2*0.995;
2845 shape[13].x = im2*0.995; shape[13].y = 0;
2846 shape[14].x = 0; shape[14].y = -im2*0.995;
2847 shape[15].x = -im2*0.995; shape[15].y = 0;
2848 shape[16].x = 0; shape[16].y = im2*0.995;
2850 }
else if (markerstyle == 49) {
2852 Int_t imx =
Int_t(1.33*MarkerSizeReduced + 0.5);
2853 shape[0].x =-imx; shape[0].y =-imx*1.005;
2854 shape[1].x =-imx; shape[1].y = -im;
2855 shape[2].x = imx; shape[2].y = -im;
2856 shape[3].x = imx; shape[3].y =-imx;
2857 shape[4].x = im; shape[4].y =-imx;
2858 shape[5].x = im; shape[5].y = imx;
2859 shape[6].x = imx; shape[6].y = imx;
2860 shape[7].x = imx; shape[7].y = im;
2861 shape[8].x =-imx; shape[8].y = im;
2862 shape[9].x =-imx; shape[9].y = imx;
2863 shape[10].x = -im; shape[10].y = imx;
2864 shape[11].x = -im; shape[11].y =-imx;
2865 shape[12].x =-imx; shape[12].y =-imx*0.995;
2866 shape[13].x =-imx; shape[13].y = imx;
2867 shape[14].x = imx; shape[14].y = imx;
2868 shape[15].x = imx; shape[15].y =-imx;
2869 shape[16].x =-imx; shape[16].y =-imx*1.005;
2887 if (percent == 0)
return;
2890 ULong_t *orgcolors = 0, *tmpc = 0;
2891 Int_t maxcolors = 0, ncolors = 0, ntmpc = 0;
2894 if (
gCws->fNewColors) {
2895 tmpc =
gCws->fNewColors;
2896 ntmpc =
gCws->fNcolors;
2900 XImage *image = XGetImage((Display*)
fDisplay,
gCws->fDrawing, 0, 0,
gCws->fWidth,
2901 gCws->fHeight, AllPlanes, ZPixmap);
2912 XDestroyImage(image);
2913 ::operator
delete(orgcolors);
2920 if (
gCws->fNewColors) {
2926 XPutPixel(image,
x,
y,
gCws->fNewColors[idx]);
2942 XDestroyImage(image);
2943 ::operator
delete(orgcolors);
2952 if (maxcolors == 0) {
2955 orgcolors = (
ULong_t*) ::
operator new(maxcolors*
sizeof(
ULong_t));
2958 for (
int i = 0; i < ncolors; i++)
2959 if (pixel == orgcolors[i])
return;
2961 if (ncolors >= maxcolors) {
2967 orgcolors[ncolors++] = pixel;
2976 if (ncolors == 0)
return;
2978 RXColor *xcol =
new RXColor[ncolors];
2981 for (i = 0; i < ncolors; i++) {
2982 xcol[i].pixel = orgcolors[i];
2983 xcol[i].red = xcol[i].green = xcol[i].blue = 0;
2984 xcol[i].flags = DoRed | DoGreen | DoBlue;
2991 for (i = 0; i < ncolors; i++) {
2992 val = xcol[i].red + add;
2995 val = xcol[i].green + add;
2998 val = xcol[i].blue + add;
3002 Warning(
"MakeOpaqueColors",
"failed to allocate color %hd, %hd, %hd",
3003 xcol[i].red, xcol[i].green, xcol[i].blue);
3008 gCws->fNcolors = ncolors;
3010 for (i = 0; i < ncolors; i++)
3011 gCws->fNewColors[i] = xcol[i].pixel;
3021 for (
int i = 0; i < ncolors; i++)
3022 if (pixel == orgcolors[i])
return i;
3024 Error(
"FindColor",
"did not find color, should never happen!");
3042 xcol.flags = DoRed | DoGreen | DoBlue;
3046 if (col.
fRed == xcol.red && col.
fGreen == xcol.green &&
3047 col.
fBlue == xcol.blue)
3056 col.
fRed = xcol.red;
3058 col.
fBlue = xcol.blue;
3070 Int_t txalh = talign/10;
3071 Int_t txalv = talign%10;
3127 if (cindex < 0)
return;
3134 if (XGetGCValues((Display*)
fDisplay, *
gGCtext, GCForeground | GCBackground, &values)) {
3138 Error(
"SetTextColor",
"cannot get GC values");
3160 if (mode ==
kLoad) {
3162 if (strcmp(fontname,
gFont[i].
name) == 0) {
3171 fontlist = XListFonts((Display*)
fDisplay, fontname, 1, &fontcount);
3173 if (fontlist && fontcount != 0) {
3174 if (mode ==
kLoad) {
3185 XFreeFontNames(fontlist);
3220 XSynchronize((Display*)
fDisplay,1);
3224 XSynchronize((Display*)
fDisplay,0);
3240 if (
gCws->fDoubleBuffer) {
3267 XWarpPointer((Display*)
fDisplay, None, (
Window)
id, 0, 0, 0, 0, ix, iy);
3280 unsigned int wval, hval;
3285 XWriteBitmapFile((Display*)
fDisplay, pxname,
gTws->fDrawing, wval, hval, -1, -1);
3300 void (*get_scline) (
int,
int,
Byte_t *),
void (*pb)(
Byte_t));
3302 int GIFinfo(
Byte_t *gifArr,
int *Width,
int *Height,
int *Ncols);
3310 for (
int i = 0; i <
width; i++)
3334 Int_t maxcolors = 0, ncolors = 0;
3346 RXColor *xcol =
new RXColor[ncolors];
3349 for (i = 0; i < ncolors; i++) {
3350 xcol[i].pixel = orgcolors[i];
3351 xcol[i].red = xcol[i].green = xcol[i].blue = 0;
3352 xcol[i].flags = DoRed | DoGreen | DoBlue;
3362 for (i = 0; i < ncolors; i++) {
3364 G[i] = xcol[i].green;
3365 B[i] = xcol[i].blue;
3374 XPutPixel(image,
x,
y, idx);
3380 ::operator
delete(orgcolors);
3389 Byte_t scline[2000],
r[256],
b[256],
g[256];
3390 Int_t *red, *green, *blue;
3391 Int_t ncol, maxcol, i;
3400 AllPlanes, ZPixmap);
3406 Error(
"WriteGIF",
"Cannot create GIF of image containing more than 256 colors. Try in batch mode.");
3414 for (i = 0; i < ncol; i++) {
3415 if (maxcol < red[i] ) maxcol = red[i];
3416 if (maxcol < green[i] ) maxcol = green[i];
3417 if (maxcol < blue[i] ) maxcol = blue[i];
3423 for (i = 0; i < ncol; i++) {
3424 r[i] = red[i] * 255/maxcol;
3425 g[i] = green[i] * 255/maxcol;
3426 b[i] = blue[i] * 255/maxcol;
3438 Error(
"WriteGIF",
"cannot write file: %s",
name);
3453 const int maxSegment = 20;
3454 int i,
n,
x,
y, xcur,
x1,
x2, y1, y2;
3455 unsigned char *jimg, *jbase, icol;
3457 XSegment lines[256][maxSegment];
3463 id =
gCws->fDrawing;
3466 for (i = 0; i < 256; i++) nlines[i] = 0;
3470 jbase = image + (
ymin-1)*nx +
xmin;
3472 for (
y = y2;
y >= y1;
y--) {
3473 xcur =
x1; jbase += nx;
3474 for (jimg = jbase, icol = *jimg++,
x =
x1+1;
x <=
x2; jimg++,
x++) {
3475 if (icol != *jimg) {
3476 if (icol != itran) {
3478 lines[icol][
n].x1 = xcur; lines[icol][
n].y1 =
y;
3479 lines[icol][
n].x2 =
x-1; lines[icol][
n].y2 =
y;
3480 if (nlines[icol] == maxSegment) {
3487 icol = *jimg; xcur =
x;
3490 if (icol != itran) {
3492 lines[icol][
n].x1 = xcur; lines[icol][
n].y1 =
y;
3493 lines[icol][
n].x2 =
x-1; lines[icol][
n].y2 =
y;
3494 if (nlines[icol] == maxSegment) {
3503 for (i = 0; i < 256; i++) {
3504 if (nlines[i] != 0) {
3519 unsigned char *gifArr, *pixArr, red[256], green[256], blue[256], *j1, *j2, icol;
3520 int i, j, k,
width, height, ncolor, irep, offset;
3524 fd = fopen(
file,
"r");
3526 Error(
"ReadGIF",
"unable to open GIF file");
3531 long ft = ftell(fd);
3533 Error(
"ReadGIF",
"unable to open GIF file");
3541 if (!(gifArr = (
unsigned char *)
calloc(filesize+256,1))) {
3542 Error(
"ReadGIF",
"unable to allocate array for gif");
3547 if (fread(gifArr, filesize, 1, fd) != 1) {
3548 Error(
"ReadGIF",
"GIF file read failed");
3561 if (!(pixArr = (
unsigned char *)
calloc((
width*height),1))) {
3562 Error(
"ReadGIF",
"unable to allocate array for image");
3567 irep =
GIFdecode(gifArr, pixArr, &
width, &height, &ncolor, red, green, blue);
3578 for (i = 0; i < ncolor; i++) {
3588 for (i = 1; i <= height/2; i++) {
3589 j1 = pixArr + (i-1)*
width;
3590 j2 = pixArr + (height-i)*
width;
3591 for (k = 0; k <
width; k++) {
3592 icol = *j1; *j1++ = *j2; *j2++ = icol;
3596 PutImage(offset,-1,x0,y0,
width,height,0,0,
width-1,height-1,pixArr,pic);
3603 else if (
gCws->fDrawing)
3657 fWindows, newsize *
sizeof(XWindow_t),
3669 gCws->fWindow = pixid;
3672 gCws->fDoubleBuffer = 0;
3673 gCws->fIsPixmap = 1;
3677 gCws->fNewColors = 0;
3694 Int_t major_opcode, first_event, first_error;
3697 return XQueryExtension((Display*)
fDisplay, ext, &major_opcode, &first_event, &first_error);