Actual source code: frame.c
2: /*
3: This file contains routines to draw a 3-d like frame about a given
4: box with a given width. Note that we might like to use a high/low
5: color for highlights.
7: The region has 6 parameters. These are the dimensions of the actual frame.
8: */
10: #include <../src/sys/draw/impls/x/ximpl.h>
14: /* 50% grey stipple pattern */
15: static Pixmap grey50 = (Pixmap)0;
16: #define cboard50_width 8
17: #define cboard50_height 8
18: static unsigned char cboard50_bits[] = {
19: 0x55,0xaa,0x55,0xaa,0x55,0xaa,0x55,0xaa};
21: static PixVal HiPix=0,LoPix=0;
22: /*
23: Set the colors for the highlights by name
24: */
27: PetscErrorCode XiFrameColors(PetscDraw_X* XiWin,XiDecoration *Rgn,char *Hi,char *Lo)
28: {
30: Rgn->Hi = XiGetColor(XiWin,Hi,1);
31: Rgn->Lo = XiGetColor(XiWin,Lo,1);
32: Rgn->HasColor = Rgn->Hi != Rgn->Lo;
33: return(0);
34: }
38: PetscErrorCode XiDrawFrame(PetscDraw_X *XiWin,XiDecoration *Rgn)
39: {
40: int xl = Rgn->Box.x,yl = Rgn->Box.y,xh = Rgn->Box.xh,yh = Rgn->Box.yh,
41: o = Rgn->width;
42: XPoint high[7],low[7];
43: PixVal Hi,Lo;
46: /* High polygon */
47: high[0].x = xl; high[0].y = yh;
48: high[1].x = xl + o; high[1].y = yh - o;
49: high[2].x = xh - o; high[2].y = yh - o;
50: high[3].x = xh - o; high[3].y = yl + o;
51: high[4].x = xh; high[4].y = yl;
52: high[5].x = xh; high[5].y = yh;
53: high[6].x = xl; high[6].y = yh; /* close path */
55: low[0].x = xl; low[0].y = yh;
56: low[1].x = xl; low[1].y = yl;
57: low[2].x = xh; low[2].y = yl;
58: low[3].x = xh - o; low[3].y = yl + o;
59: low[4].x = xl + o; low[4].y = yl + o;
60: low[5].x = xl + o; low[5].y = yh - o;
61: low[6].x = xl; low[6].y = yh; /* close path */
63: if (Rgn->HasColor) {
64: if (Rgn->Hi) Hi = Rgn->Hi;
65: else Hi = HiPix;
66: if (Rgn->Lo) Lo = Rgn->Lo;
67: else Lo = LoPix;
68: XiSetPixVal(XiWin,(Rgn->is_in !=0) ? Hi : Lo);
69: if (o <= 1)
70: XDrawLines(XiWin->disp,XiDrawable(XiWin),XiWin->gc.set,
71: high,7,CoordModeOrigin);
72: else
73: XFillPolygon(XiWin->disp,XiDrawable(XiWin),XiWin->gc.set,
74: high,7,Nonconvex,CoordModeOrigin);
75: XiSetPixVal(XiWin,(Rgn->is_in !=0) ? Lo : Hi);
76: if (o <= 1)
77: XDrawLines(XiWin->disp,XiDrawable(XiWin),XiWin->gc.set,
78: low,7,CoordModeOrigin);
79: else
80: XFillPolygon(XiWin->disp,XiDrawable(XiWin),XiWin->gc.set,
81: low,7,Nonconvex,CoordModeOrigin);
82: /* We could use additional highlights here,such as lines drawn
83: connecting the mitred edges. */
84: }
85: else {
86: if (!grey50)
87: grey50 = XCreatePixmapFromBitmapData(XiWin->disp,XiWin->win,
88: (char *)cboard50_bits,
89: cboard50_width,
90: cboard50_height,1,0,1);
91: XiSetPixVal(XiWin,Rgn->Hi);
92: XFillPolygon(XiWin->disp,XiDrawable(XiWin),XiWin->gc.set,
93: high,7,Nonconvex,CoordModeOrigin);
94: /* This can actually be done by using a stipple effect */
95: XSetFillStyle(XiWin->disp,XiWin->gc.set,FillStippled);
96: XSetStipple(XiWin->disp,XiWin->gc.set,grey50);
97: XFillPolygon(XiWin->disp,XiDrawable(XiWin),XiWin->gc.set,
98: low,7,Nonconvex,CoordModeOrigin);
99: XSetFillStyle(XiWin->disp,XiWin->gc.set,FillSolid);
100: }
101: return(0);
102: }
105: /*
106: Set the colors for the highlights by name
107: */
110: PetscErrorCode XiFrameColorsByName(PetscDraw_X* XiWin,char *Hi,char *Lo)
111: {
113: if (XiWin->numcolors > 2) {
114: HiPix = XiGetColor(XiWin,Hi,1);
115: LoPix = XiGetColor(XiWin,Lo,1);
116: }
117: return(0);
118: }