1/* 2 3Copyright 1988, 1998 The Open Group 4 5Permission to use, copy, modify, distribute, and sell this software and its 6documentation for any purpose is hereby granted without fee, provided that 7the above copyright notice appear in all copies and that both that 8copyright notice and this permission notice appear in supporting 9documentation. 10 11The above copyright notice and this permission notice shall be included in 12all copies or substantial portions of the Software. 13 14THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 17OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 18AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 19CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 20 21Except as contained in this notice, the name of The Open Group shall not be 22used in advertising or otherwise to promote the sale, use or other dealings 23in this Software without prior written authorization from The Open Group. 24 25*/ 26 27/* 28 * XmuDrawRoundedRectangle, XmuFillRoundedRectangle 29 * 30 * Draw/Fill a rounded rectangle, where x, y, w, h are the dimensions of 31 * the overall rectangle, and ew and eh are the sizes of a bounding box 32 * that the corners are drawn inside of. 33 */ 34 35#ifdef HAVE_CONFIG_H 36#include <config.h> 37#endif 38#include <X11/Xlib.h> 39#include <X11/Xmu/Drawing.h> 40 41void 42XmuDrawRoundedRectangle(Display *dpy, Drawable draw, GC gc, 43 int x, int y, int w, int h, int ew, int eh) 44{ 45 XArc arcs[8]; 46 int ew2, eh2; 47 48 if ((ew2 = (ew << 1)) > w) 49 ew2 = ew = 0; 50 if ((eh2 = (eh << 1)) > h) 51 eh2 = eh = 0; 52 53 arcs[0].x = x; 54 arcs[0].y = y; 55 arcs[0].width = ew2; 56 arcs[0].height = eh2; 57 arcs[0].angle1 = 180 * 64; 58 arcs[0].angle2 = -90 * 64; 59 60 arcs[1].x = x + ew; 61 arcs[1].y = y; 62 arcs[1].width = w - ew2; 63 arcs[1].height = 0; 64 arcs[1].angle1 = 180 * 64; 65 arcs[1].angle2 = -180 * 64; 66 67 arcs[2].x = x + w - ew2; 68 arcs[2].y = y; 69 arcs[2].width = ew2; 70 arcs[2].height = eh2; 71 arcs[2].angle1 = 90 * 64; 72 arcs[2].angle2 = -90 * 64; 73 74 arcs[3].x = x + w; 75 arcs[3].y = y + eh; 76 arcs[3].width = 0; 77 arcs[3].height = h - eh2; 78 arcs[3].angle1 = 90 * 64; 79 arcs[3].angle2 = -180 * 64; 80 81 arcs[4].x = x + w - ew2; 82 arcs[4].y = y + h - eh2; 83 arcs[4].width = ew2; 84 arcs[4].height = eh2; 85 arcs[4].angle1 = 0; 86 arcs[4].angle2 = -90 * 64; 87 88 arcs[5].x = x + ew; 89 arcs[5].y = y + h; 90 arcs[5].width = w - ew2; 91 arcs[5].height = 0; 92 arcs[5].angle1 = 0; 93 arcs[5].angle2 = -180 * 64; 94 95 arcs[6].x = x; 96 arcs[6].y = y + h - eh2; 97 arcs[6].width = ew2; 98 arcs[6].height = eh2; 99 arcs[6].angle1 = 270 * 64; 100 arcs[6].angle2 = -90 * 64; 101 102 arcs[7].x = x; 103 arcs[7].y = y + eh; 104 arcs[7].width = 0; 105 arcs[7].height = h - eh2; 106 arcs[7].angle1 = 270 * 64; 107 arcs[7].angle2 = -180 * 64; 108 109 XDrawArcs(dpy, draw, gc, arcs, 8); 110} 111 112void 113XmuFillRoundedRectangle(Display *dpy, Drawable draw, GC gc, 114 int x, int y, int w, int h, int ew, int eh) 115{ 116 XArc arcs[4]; 117 XRectangle rects[3]; 118 XGCValues vals; 119 int ew2, eh2; 120 121 XGetGCValues(dpy, gc, GCArcMode, &vals); 122 if (vals.arc_mode != ArcPieSlice) 123 XSetArcMode(dpy, gc, ArcPieSlice); 124 125 if ((ew2 = (ew << 1)) > w) 126 ew2 = ew = 0; 127 if ((eh2 = (eh << 1)) > h) 128 eh2 = eh = 0; 129 130 arcs[0].x = x; 131 arcs[0].y = y; 132 arcs[0].width = ew2; 133 arcs[0].height = eh2; 134 arcs[0].angle1 = 180 * 64; 135 arcs[0].angle2 = -90 * 64; 136 137 arcs[1].x = x + w - ew2 - 1; 138 arcs[1].y = y; 139 arcs[1].width = ew2; 140 arcs[1].height = eh2; 141 arcs[1].angle1 = 90 * 64; 142 arcs[1].angle2 = -90 * 64; 143 144 arcs[2].x = x + w - ew2 - 1; 145 arcs[2].y = y + h - eh2 - 1; 146 arcs[2].width = ew2; 147 arcs[2].height = eh2; 148 arcs[2].angle1 = 0; 149 arcs[2].angle2 = -90 * 64; 150 151 arcs[3].x = x; 152 arcs[3].y = y + h - eh2 - 1; 153 arcs[3].width = ew2; 154 arcs[3].height = eh2; 155 arcs[3].angle1 = 270 * 64; 156 arcs[3].angle2 = -90 * 64; 157 158 XFillArcs(dpy, draw, gc, arcs, 4); 159 160 rects[0].x = x + ew; 161 rects[0].y = y; 162 rects[0].width = w - ew2; 163 rects[0].height = h; 164 165 rects[1].x = x; 166 rects[1].y = y + eh; 167 rects[1].width = ew; 168 rects[1].height = h - eh2; 169 170 rects[2].x = x + w - ew; 171 rects[2].y = y + eh; 172 rects[2].width = ew; 173 rects[2].height = h - eh2; 174 175 XFillRectangles(dpy, draw, gc, rects, 3); 176 177 if (vals.arc_mode != ArcPieSlice) 178 XSetArcMode(dpy, gc, vals.arc_mode); 179} 180