-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathCanvas.cc
104 lines (75 loc) · 2.61 KB
/
Canvas.cc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
/*
-------------------------------------------------------------------------
OBJECT NAME: Canvas.cc
FULL NAME: Generic X canvas manipulations
DESCRIPTION:
COPYRIGHT: University Corporation for Atmospheric Research, 1997
-------------------------------------------------------------------------
*/
#include "Canvas.h"
/* -------------------------------------------------------------------- */
Canvas::Canvas(Widget drawA) : w(drawA), dpy(XtDisplay(drawA)), win(XtWindow(drawA)), defaultGC(XDefaultGC(dpy, 0))
{
Cardinal n;
Arg args[2];
pixMap = 0;
n = 0;
XtSetArg(args[n], XtNforeground, &foreground); ++n;
XtSetArg(args[n], XtNbackground, &background); ++n;
XtGetValues(drawA, args, n);
Resize();
Clear();
} /* END CONSTRUCTOR */
/* -------------------------------------------------------------------- */
void Canvas::Clear() const
{
XSetForeground(dpy, defaultGC, background);
XFillRectangle(dpy, pixMap, defaultGC, 0, 0, width, height);
XSetForeground(dpy, defaultGC, foreground);
} /* END CLEAR */
/* -------------------------------------------------------------------- */
void Canvas::ClearArea(int x, int y, int w, int h) const
{
XSetForeground(dpy, defaultGC, background);
XFillRectangle(dpy, pixMap, defaultGC, x, y, w, h);
XSetForeground(dpy, defaultGC, foreground);
} /* END CLEARAREA */
/* -------------------------------------------------------------------- */
void Canvas::ExposeAll() const
{
XCopyArea(dpy, pixMap, win, defaultGC, 0, 0, width, height, 0, 0);
} /* END EXPOSEALL */
/* -------------------------------------------------------------------- */
void Canvas::ExposeArea(XmDrawingAreaCallbackStruct *call) const
{
XExposeEvent *evt = (XExposeEvent *)call->event;
XCopyArea(dpy, pixMap, win, defaultGC,
evt->x, evt->y, evt->width, evt->height, evt->x, evt->y);
} /* END EXPOSEAREA */
/* -------------------------------------------------------------------- */
void Canvas::Resize()
{
Cardinal n;
Arg args[5];
n = 0;
XtSetArg(args[n], XmNwidth, &width); ++n;
XtSetArg(args[n], XmNheight, &height); ++n;
XtSetArg(args[n], XtNdepth, &depth); ++n;
XtGetValues(w, args, n);
if (pixMap)
XFreePixmap(dpy, pixMap);
pixMap = XCreatePixmap(dpy, win, width, height, depth);
} /* END RESIZE */
/* -------------------------------------------------------------------- */
void Canvas::SetSize(int ht, int wd)
{
Cardinal n;
Arg args[2];
height = ht;
width = wd;
n = 0;
XtSetArg(args[n], XmNwidth, width); ++n;
XtSetArg(args[n], XmNheight, height); ++n;
XtSetValues(w, args, n);
} /* END SETSIZE */
/* END CANVAS.CC */