diff options
author | Joseph Hunkeler <jhunkeler@gmail.com> | 2015-07-08 20:46:52 -0400 |
---|---|---|
committer | Joseph Hunkeler <jhunkeler@gmail.com> | 2015-07-08 20:46:52 -0400 |
commit | fa080de7afc95aa1c19a6e6fc0e0708ced2eadc4 (patch) | |
tree | bdda434976bc09c864f2e4fa6f16ba1952b1e555 /vendor/x11iraf/xaw3d/ThreeD.c | |
download | iraf-linux-fa080de7afc95aa1c19a6e6fc0e0708ced2eadc4.tar.gz |
Initial commit
Diffstat (limited to 'vendor/x11iraf/xaw3d/ThreeD.c')
-rw-r--r-- | vendor/x11iraf/xaw3d/ThreeD.c | 640 |
1 files changed, 640 insertions, 0 deletions
diff --git a/vendor/x11iraf/xaw3d/ThreeD.c b/vendor/x11iraf/xaw3d/ThreeD.c new file mode 100644 index 00000000..3081f1db --- /dev/null +++ b/vendor/x11iraf/xaw3d/ThreeD.c @@ -0,0 +1,640 @@ +/* -XT +* $KK: ThreeD.c,v 0.3 92/11/04 xx:xx:xx keithley Exp $ +* J. P. Terlouw, Kapteyn Astronomical Institute, Groningen The Netherlands, +* February 2001: modified for use with non-default visuals. +*/ + +/*********************************************************** +Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts, +and the Massachusetts Institute of Technology, Cambridge, Massachusetts. +Copyright 1992 by Kaleb Keithley + + All Rights Reserved + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the names of Digital, MIT, or Kaleb +Keithley not be used in advertising or publicity pertaining to distribution +of the software without specific, written prior permission. + +DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +SOFTWARE. + +******************************************************************/ + +#include <X11/Xlib.h> +#include <X11/StringDefs.h> +#include <X11/IntrinsicP.h> +#include <X11/Xaw3d/XawInit.h> +#include <X11/Xaw3d/ThreeDP.h> +#include <X11/Xosdefs.h> + +/* Initialization of defaults */ + +#define XtNtopShadowPixmap "topShadowPixmap" +#define XtCTopShadowPixmap "TopShadowPixmap" +#define XtNbottomShadowPixmap "bottomShadowPixmap" +#define XtCBottomShadowPixmap "BottomShadowPixmap" + +#define offset(field) XtOffsetOf(ThreeDRec, field) + +static XtResource resources[] = { + {XtNshadowWidth, XtCShadowWidth, XtRDimension, sizeof(Dimension), + offset(threeD.shadow_width), XtRImmediate, (XtPointer) 2}, + {XtNtopShadowPixel, XtCTopShadowPixel, XtRPixel, sizeof(Pixel), + offset(threeD.top_shadow_pixel), XtRString, XtDefaultForeground}, + {XtNbottomShadowPixel, XtCBottomShadowPixel, XtRPixel, sizeof(Pixel), + offset(threeD.bot_shadow_pixel), XtRString, XtDefaultForeground}, + {XtNtopShadowPixmap, XtCTopShadowPixmap, XtRPixmap, sizeof(Pixmap), + offset(threeD.top_shadow_pxmap), XtRImmediate, (XtPointer) NULL}, + {XtNbottomShadowPixmap, XtCBottomShadowPixmap, XtRPixmap, sizeof(Pixmap), + offset(threeD.bot_shadow_pxmap), XtRImmediate, (XtPointer) NULL}, + {XtNtopShadowContrast, XtCTopShadowContrast, XtRInt, sizeof(int), + offset(threeD.top_shadow_contrast), XtRImmediate, (XtPointer) 20}, + {XtNbottomShadowContrast, XtCBottomShadowContrast, XtRInt, sizeof(int), + offset(threeD.bot_shadow_contrast), XtRImmediate, (XtPointer) 40}, + {XtNuserData, XtCUserData, XtRPointer, sizeof(XtPointer), + offset(threeD.user_data), XtRPointer, (XtPointer) NULL}, + {XtNbeNiceToColormap, XtCBeNiceToColormap, XtRBoolean, sizeof(Boolean), + offset(threeD.be_nice_to_cmap), XtRImmediate, (XtPointer) True}, + {XtNborderWidth, XtCBorderWidth, XtRDimension, sizeof(Dimension), + XtOffsetOf(RectObjRec,rectangle.border_width), XtRImmediate, + (XtPointer)0} +}; + +#undef offset + +static void ClassPartInitialize(), Initialize(), Destroy(); +static void Redisplay(), Realize(), _Xaw3dDrawShadows(); +static Boolean SetValues(); + +ThreeDClassRec threeDClassRec = { + { /* core fields */ + /* superclass */ (WidgetClass) &simpleClassRec, + /* class_name */ "ThreeD", + /* widget_size */ sizeof(ThreeDRec), + /* class_initialize */ NULL, + /* class_part_initialize */ ClassPartInitialize, + /* class_inited */ FALSE, + /* initialize */ Initialize, + /* initialize_hook */ NULL, + /* realize */ Realize, + /* actions */ NULL, + /* num_actions */ 0, + /* resources */ resources, + /* resource_count */ XtNumber(resources), + /* xrm_class */ NULLQUARK, + /* compress_motion */ TRUE, + /* compress_exposure */ TRUE, + /* compress_enterleave */ TRUE, + /* visible_interest */ FALSE, + /* destroy */ Destroy, + /* resize */ XtInheritResize, + /* expose */ Redisplay, + /* set_values */ SetValues, + /* set_values_hook */ NULL, + /* set_values_almost */ XtInheritSetValuesAlmost, + /* get_values_hook */ NULL, + /* accept_focus */ NULL, + /* version */ XtVersion, + /* callback_private */ NULL, + /* tm_table */ NULL, + /* query_geometry */ XtInheritQueryGeometry, + /* display_accelerator */ XtInheritDisplayAccelerator, + /* extension */ NULL + }, + { /* simple fields */ + /* change_sensitive */ XtInheritChangeSensitive + }, + { /* threeD fields */ + /* shadow draw */ _Xaw3dDrawShadows + } +}; + +WidgetClass threeDWidgetClass = (WidgetClass) &threeDClassRec; + +/**************************************************************** + * + * Private Procedures + * + ****************************************************************/ + +#define mbshadowpm_size 3 +static char mbshadowpm_bits[] = {0x05, 0x03, 0x06}; + +#define mtshadowpm_size 3 +static char mtshadowpm_bits[] = {0x02, 0x04, 0x01}; + +#define shadowpm_size 2 +static char shadowpm_bits[] = {0x02, 0x01}; + +#define setPixel(p,dpy,scn) (p) + +/* ARGSUSED */ +static unsigned long WittePixel (w) + ThreeDWidget w; +{ + static XColor kleur; + if (!kleur.flags) { + kleur.flags = DoRed | DoGreen | DoBlue; + kleur.red = kleur.green = kleur.blue = 65535; + (void)XAllocColor(XtDisplay(w), w->core.colormap, &kleur); + } + return kleur.pixel; +} + +/* ARGSUSED */ +static unsigned long ZwartePixel (w) + ThreeDWidget w; +{ + static XColor kleur; + if (!kleur.flags) { + kleur.flags = DoRed | DoGreen | DoBlue; + kleur.red = kleur.green = kleur.blue = 0; + (void)XAllocColor(XtDisplay(w), w->core.colormap, &kleur); + } + return kleur.pixel; +} + +/* ARGSUSED */ +static void AllocTopShadowGC (w) + Widget w; +{ + ThreeDWidget tdw = (ThreeDWidget) w; + Screen *scn = XtScreen (w); + XtGCMask valuemask; + XGCValues myXGCV; + + if (tdw->threeD.be_nice_to_cmap || tdw->core.depth == 1) { + valuemask = GCTile | GCFillStyle; + myXGCV.tile = tdw->threeD.top_shadow_pxmap; + myXGCV.fill_style = FillTiled; + } else { + valuemask = GCForeground; + myXGCV.foreground = tdw->threeD.top_shadow_pixel; + } + tdw->threeD.top_shadow_GC = XtGetGC(w, valuemask, &myXGCV); +} + +/* ARGSUSED */ +static void AllocBotShadowGC (w) + Widget w; +{ + ThreeDWidget tdw = (ThreeDWidget) w; + Screen *scn = XtScreen (w); + XtGCMask valuemask; + XGCValues myXGCV; + + if (tdw->threeD.be_nice_to_cmap || tdw->core.depth == 1) { + valuemask = GCTile | GCFillStyle; + myXGCV.tile = tdw->threeD.bot_shadow_pxmap; + myXGCV.fill_style = FillTiled; + } else { + valuemask = GCForeground; + myXGCV.foreground = tdw->threeD.bot_shadow_pixel; + } + tdw->threeD.bot_shadow_GC = XtGetGC(w, valuemask, &myXGCV); +} + +/* ARGSUSED */ +static void AllocTopShadowPixmap (new) + Widget new; +{ + ThreeDWidget tdw = (ThreeDWidget) new; + Display *dpy = XtDisplay (new); + Screen *scn = XtScreen (new); + unsigned long top_fg_pixel = 0, top_bg_pixel = 0; + char *pm_data = NULL; + Boolean create_pixmap = FALSE; + unsigned int pm_size; + + /* + * I know, we're going to create two pixmaps for each and every + * shadow'd widget. Yeuck. I'm semi-relying on server side + * pixmap cacheing. + */ + + if (tdw->core.depth == 1) { + top_fg_pixel = ZwartePixel(tdw); + top_bg_pixel = WittePixel(tdw); + pm_data = mtshadowpm_bits; + pm_size = mtshadowpm_size; + create_pixmap = TRUE; + } else if (tdw->threeD.be_nice_to_cmap) { + if (tdw->core.background_pixel == WittePixel(tdw)) { + top_fg_pixel = setPixel( WittePixel(tdw), dpy, scn); + top_bg_pixel = ZwartePixel(tdw); + } else if (tdw->core.background_pixel == ZwartePixel(tdw)) { + top_fg_pixel = ZwartePixel(tdw); + top_bg_pixel = setPixel( WittePixel(tdw), dpy, scn); + } else { + top_fg_pixel = tdw->core.background_pixel; + top_bg_pixel = WittePixel(tdw); + } + if (tdw->core.background_pixel == WittePixel(tdw) || + tdw->core.background_pixel == ZwartePixel(tdw)) { + pm_data = mtshadowpm_bits; + pm_size = mtshadowpm_size; + } else + { + pm_data = shadowpm_bits; + pm_size = shadowpm_size; + } + + create_pixmap = TRUE; + } else { + pm_size = 0; /* keep gcc happy */ + } + + if (create_pixmap) + tdw->threeD.top_shadow_pxmap = XCreatePixmapFromBitmapData (dpy, + RootWindowOfScreen (scn), + pm_data, + pm_size, + pm_size, + top_fg_pixel, + top_bg_pixel, + ((ThreeDWidget)new)->core.depth); +} + +/* ARGSUSED */ +static void AllocBotShadowPixmap (new) + Widget new; +{ + ThreeDWidget tdw = (ThreeDWidget) new; + Display *dpy = XtDisplay (new); + Screen *scn = XtScreen (new); + unsigned long bot_fg_pixel = 0, bot_bg_pixel = 0; + char *pm_data = NULL; + Boolean create_pixmap = FALSE; + unsigned int pm_size; + + if (tdw->core.depth == 1) { + bot_fg_pixel = ZwartePixel(tdw); + bot_bg_pixel = WittePixel(tdw); + pm_data = mbshadowpm_bits; + pm_size = mbshadowpm_size; + create_pixmap = TRUE; + } else if (tdw->threeD.be_nice_to_cmap) { + if (tdw->core.background_pixel == WittePixel(tdw)) { + bot_fg_pixel = WittePixel(tdw); + bot_bg_pixel = setPixel( ZwartePixel(tdw), dpy, scn); + } else if (tdw->core.background_pixel == ZwartePixel(tdw)) { + bot_fg_pixel = setPixel( ZwartePixel(tdw), dpy, scn); + bot_bg_pixel = ZwartePixel(tdw); + } else { + bot_fg_pixel = tdw->core.background_pixel; + bot_bg_pixel = ZwartePixel(tdw); + } + if (tdw->core.background_pixel == WittePixel(tdw) || + tdw->core.background_pixel == ZwartePixel(tdw)) { + pm_data = mbshadowpm_bits; + pm_size = mbshadowpm_size; + } else + { + pm_data = shadowpm_bits; + pm_size = shadowpm_size; + } + create_pixmap = TRUE; + } else { + pm_size = 0; /* keep gcc happy */ + } + + if (create_pixmap) + tdw->threeD.bot_shadow_pxmap = XCreatePixmapFromBitmapData (dpy, + RootWindowOfScreen (scn), + pm_data, + pm_size, + pm_size, + bot_fg_pixel, + bot_bg_pixel, + ((ThreeDWidget)new)->core.depth); +} + +/* ARGSUSED */ +void Xaw3dComputeTopShadowRGB (new, xcol_out) + Widget new; + XColor *xcol_out; +{ + if (XtIsSubclass (new, threeDWidgetClass)) { + ThreeDWidget tdw = (ThreeDWidget) new; + XColor get_c; + double contrast; + Display *dpy = XtDisplay (new); + Screen *scn = XtScreen (new); + Colormap cmap = tdw->core.colormap; + + get_c.pixel = tdw->core.background_pixel; + if (get_c.pixel == WittePixel(tdw) || + get_c.pixel == ZwartePixel(tdw)) { + contrast = (100 - tdw->threeD.top_shadow_contrast) / 100.0; + xcol_out->red = contrast * 65535.0; + xcol_out->green = contrast * 65535.0; + xcol_out->blue = contrast * 65535.0; + } else { + contrast = 1.0 + tdw->threeD.top_shadow_contrast / 100.0; + XQueryColor (dpy, cmap, &get_c); +#define MIN(x,y) (unsigned short) (x < y) ? x : y + xcol_out->red = MIN (65535, (int) (contrast * (double) get_c.red)); + xcol_out->green = MIN (65535, (int) (contrast * (double) get_c.green)); + xcol_out->blue = MIN (65535, (int) (contrast * (double) get_c.blue)); +#undef MIN + } + } else + xcol_out->red = xcol_out->green = xcol_out->blue = 0; +} + +/* ARGSUSED */ +static void AllocTopShadowPixel (new) + Widget new; +{ + XColor set_c; + ThreeDWidget tdw = (ThreeDWidget) new; + Display *dpy = XtDisplay (new); + Screen *scn = XtScreen (new); + Colormap cmap = tdw->core.colormap; + + Xaw3dComputeTopShadowRGB (new, &set_c); + (void) XAllocColor (dpy, cmap, &set_c); + tdw->threeD.top_shadow_pixel = set_c.pixel; +} + +/* ARGSUSED */ +void Xaw3dComputeBottomShadowRGB (new, xcol_out) + Widget new; + XColor *xcol_out; +{ + if (XtIsSubclass (new, threeDWidgetClass)) { + ThreeDWidget tdw = (ThreeDWidget) new; + XColor get_c; + double contrast; + Display *dpy = XtDisplay (new); + Screen *scn = XtScreen (new); + Colormap cmap = tdw->core.colormap; + + get_c.pixel = tdw->core.background_pixel; + if (get_c.pixel == WittePixel(tdw) || + get_c.pixel == ZwartePixel(tdw)) { + contrast = tdw->threeD.bot_shadow_contrast / 100.0; + xcol_out->red = contrast * 65535.0; + xcol_out->green = contrast * 65535.0; + xcol_out->blue = contrast * 65535.0; + } else { + XQueryColor (dpy, cmap, &get_c); + contrast = (100 - tdw->threeD.bot_shadow_contrast) / 100.0; + xcol_out->red = contrast * get_c.red; + xcol_out->green = contrast * get_c.green; + xcol_out->blue = contrast * get_c.blue; + } + } else + xcol_out->red = xcol_out->green = xcol_out->blue = 0; +} + +/* ARGSUSED */ +static void AllocBotShadowPixel (new) + Widget new; +{ + XColor set_c; + ThreeDWidget tdw = (ThreeDWidget) new; + Display *dpy = XtDisplay (new); + Screen *scn = XtScreen (new); + Colormap cmap = tdw->core.colormap; + + Xaw3dComputeBottomShadowRGB (new, &set_c); + (void) XAllocColor (dpy, cmap, &set_c); + tdw->threeD.bot_shadow_pixel = set_c.pixel; +} + + +/* ARGSUSED */ +static void ClassPartInitialize (wc) + WidgetClass wc; + +{ + ThreeDClassRec *tdwc = (ThreeDClassRec*) wc; + ThreeDClassRec *super = (ThreeDClassRec*) tdwc->core_class.superclass; + + if (tdwc->threeD_class.shadowdraw == XtInheritXaw3dShadowDraw) + tdwc->threeD_class.shadowdraw = super->threeD_class.shadowdraw; +} + + +/* ARGSUSED */ +static void Initialize (request, new, args, num_args) + Widget request, new; + ArgList args; + Cardinal *num_args; +{ + ThreeDWidget tdw = (ThreeDWidget) new; + Screen *scr = XtScreen (new); + + if (tdw->threeD.be_nice_to_cmap || tdw->core.depth == 1) { + AllocTopShadowPixmap (new); + AllocBotShadowPixmap (new); + } else { + if (tdw->threeD.top_shadow_pixel == tdw->threeD.bot_shadow_pixel) { + /* + Eeek. We're probably going to XQueryColor() twice + for each widget. Necessary because you can set the + top and bottom shadows independent of each other in + SetValues. Some cacheing would certainly help... + */ + AllocTopShadowPixel (new); + AllocBotShadowPixel (new); + } + tdw->threeD.top_shadow_pxmap = tdw->threeD.bot_shadow_pxmap = (Pixmap) 0; + } + AllocTopShadowGC (new); + AllocBotShadowGC (new); +} + +static void Realize (gw, valueMask, attrs) + Widget gw; + XtValueMask *valueMask; + XSetWindowAttributes *attrs; +{ + /* + * This is necessary because Simple doesn't have a realize method + * XtInheritRealize in the ThreeD class record doesn't work. This + * daisychains through Simple to the Core class realize method + */ + (*threeDWidgetClass->core_class.superclass->core_class.realize) + (gw, valueMask, attrs); +} + +static void Destroy (w) + Widget w; +{ + ThreeDWidget tdw = (ThreeDWidget) w; + XtReleaseGC (w, tdw->threeD.top_shadow_GC); + XtReleaseGC (w, tdw->threeD.bot_shadow_GC); + if (tdw->threeD.top_shadow_pxmap) + XFreePixmap (XtDisplay (w), tdw->threeD.top_shadow_pxmap); + if (tdw->threeD.bot_shadow_pxmap) + XFreePixmap (XtDisplay (w), tdw->threeD.bot_shadow_pxmap); +} + +/* ARGSUSED */ +static void Redisplay (w, event, region) + Widget w; + XEvent *event; /* unused */ + Region region; /* unused */ +{ + _Xaw3dDrawShadows (w, event, region, True); +} + +/* ARGSUSED */ +static Boolean SetValues (gcurrent, grequest, gnew, args, num_args) + Widget gcurrent, grequest, gnew; + ArgList args; + Cardinal *num_args; +{ + ThreeDWidget current = (ThreeDWidget) gcurrent; + ThreeDWidget new = (ThreeDWidget) gnew; + Boolean redisplay = FALSE; + Boolean alloc_top_pixel = FALSE; + Boolean alloc_bot_pixel = FALSE; + Boolean alloc_top_pxmap = FALSE; + Boolean alloc_bot_pxmap = FALSE; + + (*threeDWidgetClass->core_class.superclass->core_class.set_values) + (gcurrent, grequest, gnew, NULL, 0); + if (new->threeD.shadow_width != current->threeD.shadow_width) + redisplay = TRUE; + if (new->threeD.be_nice_to_cmap != current->threeD.be_nice_to_cmap) { + if (new->threeD.be_nice_to_cmap) { + alloc_top_pxmap = TRUE; + alloc_bot_pxmap = TRUE; + } else { + alloc_top_pixel = TRUE; + alloc_bot_pixel = TRUE; + } + redisplay = TRUE; + } + if (!new->threeD.be_nice_to_cmap && + new->threeD.top_shadow_contrast != current->threeD.top_shadow_contrast) + alloc_top_pixel = TRUE; + if (!new->threeD.be_nice_to_cmap && + new->threeD.bot_shadow_contrast != current->threeD.bot_shadow_contrast) + alloc_bot_pixel = TRUE; + if (alloc_top_pixel) + AllocTopShadowPixel (gnew); + if (alloc_bot_pixel) + AllocBotShadowPixel (gnew); + if (alloc_top_pxmap) + AllocTopShadowPixmap (gnew); + if (alloc_bot_pxmap) + AllocBotShadowPixmap (gnew); + if (!new->threeD.be_nice_to_cmap && + new->threeD.top_shadow_pixel != current->threeD.top_shadow_pixel) + alloc_top_pixel = TRUE; + if (!new->threeD.be_nice_to_cmap && + new->threeD.bot_shadow_pixel != current->threeD.bot_shadow_pixel) + alloc_bot_pixel = TRUE; + if (new->threeD.be_nice_to_cmap) { + if (alloc_top_pxmap) { + XtReleaseGC (gcurrent, current->threeD.top_shadow_GC); + AllocTopShadowGC (gnew); + redisplay = True; + } + if (alloc_bot_pxmap) { + XtReleaseGC (gcurrent, current->threeD.bot_shadow_GC); + AllocBotShadowGC (gnew); + redisplay = True; + } + } else { + if (alloc_top_pixel) { + if (new->threeD.top_shadow_pxmap) { + XFreePixmap (XtDisplay (gnew), new->threeD.top_shadow_pxmap); + new->threeD.top_shadow_pxmap = (Pixmap) NULL; + } + XtReleaseGC (gcurrent, current->threeD.top_shadow_GC); + AllocTopShadowGC (gnew); + redisplay = True; + } + if (alloc_bot_pixel) { + if (new->threeD.bot_shadow_pxmap) { + XFreePixmap (XtDisplay (gnew), new->threeD.bot_shadow_pxmap); + new->threeD.bot_shadow_pxmap = (Pixmap) NULL; + } + XtReleaseGC (gcurrent, current->threeD.bot_shadow_GC); + AllocBotShadowGC (gnew); + redisplay = True; + } + } + return (redisplay); +} + +/* ARGSUSED */ +static void +_Xaw3dDrawShadows (gw, event, region, out) + Widget gw; + XEvent *event; + Region region; + Boolean out; +{ + XPoint pt[6]; + ThreeDWidget tdw = (ThreeDWidget) gw; + Dimension s = tdw->threeD.shadow_width; + /* + * draw the shadows using the core part width and height, + * and the threeD part shadow_width. + * + * no point to do anything if the shadow_width is 0 or the + * widget has not been realized. + */ + if((s > 0) && XtIsRealized (gw)){ + + Dimension h = tdw->core.height; + Dimension w = tdw->core.width; + Dimension wms = w - s; + Dimension hms = h - s; + Display *dpy = XtDisplay (gw); + Window win = XtWindow (gw); + GC top, bot; + + if (out) { + top = tdw->threeD.top_shadow_GC; + bot = tdw->threeD.bot_shadow_GC; + } else { + top = tdw->threeD.bot_shadow_GC; + bot = tdw->threeD.top_shadow_GC; + } + + /* top-left shadow */ + if ((region == NULL) || + (XRectInRegion (region, 0, 0, w, s) != RectangleOut) || + (XRectInRegion (region, 0, 0, s, h) != RectangleOut)) { + + pt[0].x = 0; pt[0].y = h; + pt[1].x = pt[1].y = 0; + pt[2].x = w; pt[2].y = 0; + pt[3].x = wms; pt[3].y = s; + pt[4].x = pt[4].y = s; + pt[5].x = s; pt[5].y = hms; + XFillPolygon (dpy, win, top, pt, 6,Complex,CoordModeOrigin); + } + + /* bottom-right shadow */ + if ((region == NULL) || + (XRectInRegion (region, 0, hms, w, s) != RectangleOut) || + (XRectInRegion (region, wms, 0, s, h) != RectangleOut)) { + + pt[0].x = 0; pt[0].y = h; + pt[1].x = w; pt[1].y = h; + pt[2].x = w; pt[2].y = 0; + pt[3].x = wms; pt[3].y = s; + pt[4].x = wms; pt[4].y = hms; + pt[5].x = s; pt[5].y = hms; + XFillPolygon (dpy, win, bot, pt,6, Complex,CoordModeOrigin); + } + } +} + |