diagrams.tex 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366
  1. % Define node group background
  2. % The first 4 arguments are nodes that define the group borders in (left,
  3. % top, right, bottom) order, the last argument is a text label
  4. \usetikzlibrary{shapes,arrows,positioning}
  5. \pgfdeclarelayer{background}
  6. \pgfdeclarelayer{foreground}
  7. \pgfsetlayers{background,main,foreground} % Layer order
  8. \newcommand{\group}[5]{
  9. \begin{pgfonlayer}{background}
  10. % Left top corner
  11. \path (#1.west |- #2.north)+(-0.7, 0.7)
  12. node (lefttop) {};
  13. % Right bottom corner
  14. \path (#3.east |- #4.south)+(0.7, -0.4)
  15. node (rightbottom) {};
  16. % Draw rectangle
  17. \path[draw, rounded corners, dashed] (lefttop) rectangle (rightbottom);
  18. % Text label
  19. \path (rightbottom.west |- lefttop.south)+(-1.2, -0.3) node {\emph{#5}};
  20. \end{pgfonlayer}
  21. }
  22. \tikzstyle{block} = [
  23. rectangle,
  24. draw=black,
  25. fill=white,
  26. thick,
  27. minimum height=2em,
  28. text centered,
  29. rounded corners,
  30. text width=6em
  31. ]
  32. \tikzstyle{lineto} = [
  33. ->,
  34. thick,
  35. shorten <= 2pt,
  36. shorten >= 2pt
  37. ]
  38. \tikzstyle{linefrom} = [
  39. <-,
  40. thick,
  41. shorten <= 2pt,
  42. shorten >= 2pt
  43. ]
  44. \newcommand{\architecture}[1]{
  45. \begin{tikzpicture}[node distance=6em, auto]
  46. \node[block] (driver) {Device driver};
  47. #1
  48. \end{tikzpicture}
  49. }
  50. \def\fulldiagram{
  51. \begin{figure}[h!]
  52. \center
  53. \architecture{
  54. \node[block, below of=driver] (eventdriver) {Event driver}
  55. edge[linefrom] node[right, near end] {device-specific messages} (driver);
  56. \node[block, below of=eventdriver] (area) {Event areas}
  57. edge[linefrom] node[right] {1} (eventdriver);
  58. \node[block, right of=area, xshift=7em] (tracker) {Gesture trackers}
  59. edge[linefrom, bend right=10] node[below=2pt] {2} (area)
  60. edge[lineto, bend left=10, dotted] (area);
  61. \node[block, below of=area] {Application}
  62. edge[linefrom, dotted] node[right, near start] {3} (area);
  63. \group{eventdriver}{eventdriver}{tracker}{area}{Architecture}
  64. }
  65. \caption{
  66. Components of the architecture design. The \emph{event driver}
  67. translates device-specific messages to low-level ``events''. These
  68. events are delegated to a number of \emph{event areas} (1), which
  69. restrict events to an area on the screen. \emph{Gesture trackers}
  70. translate low-level events to high-level ``gestures'' (2), which
  71. are handled by the application (3). Dotted arrows represent a flow
  72. of gestures, regular arrows represent events (unless labeled
  73. otherwise).
  74. }
  75. \label{fig:fulldiagram}
  76. \end{figure}
  77. }
  78. \def\multipledriversdiagram{
  79. \begin{figure}[H]
  80. \center
  81. \begin{tikzpicture}[node distance=6em]
  82. \node[block] (driver) {Device driver};
  83. \node[block, below of=driver] (eventdriver) {Event driver}
  84. edge[linefrom] (driver);
  85. \node[block, right of=driver, xshift=2em] (seconddriver) {Device driver};
  86. \node[block, below of=seconddriver] (secondeventdriver) {Event driver}
  87. edge[linefrom] node[right, near end] {device-specific messages} (seconddriver);
  88. \node[block, below of=eventdriver] (areas) {Event areas}
  89. edge[linefrom] (eventdriver)
  90. edge[linefrom] node[right=5pt] {events} (secondeventdriver);
  91. \node[block, right of=area, xshift=7em] (tracker) {Gesture trackers}
  92. edge[linefrom, bend right=10] (areas)
  93. edge[lineto, bend left=10, dotted] (areas);
  94. \node[block, below of=areas] {Application}
  95. edge[linefrom, dotted] node[right, near start] {gestures} (areas);
  96. \node[right of=seconddriver, xshift=2em] (dummy) {};
  97. \group{eventdriver}{eventdriver}{dummy}{areas}{Architecture}
  98. \end{tikzpicture}
  99. \caption{Multiple event drivers running simultaneously.}
  100. \label{fig:multipledrivers}
  101. \end{figure}
  102. }
  103. \def\examplediagram{
  104. \begin{figure}[h!]
  105. \center
  106. \architecture{
  107. \node[block, below of=driver] (eventdriver) {Event driver}
  108. edge[linefrom] node[right, near end] {device-specific messages} (driver);
  109. \node[block, below of=eventdriver] (rootarea) {Root area}
  110. edge[linefrom] (eventdriver);
  111. \node[block, right of=rootarea, xshift=4em] {\emph{pinch} tracker}
  112. edge[lineto, dotted, bend left=10] (rootarea)
  113. edge[linefrom, bend right=10] (rootarea);
  114. \node[block, below of=rootarea, xshift=-5em] (circlearea) {Circular area}
  115. edge[linefrom] (rootarea)
  116. edge[lineto, bend left=25] (rootarea);
  117. \node[block, left of=circlearea, xshift=-4em] (dragtracker) {\emph{drag} tracker}
  118. edge[lineto, dotted, bend right=10] (circlearea)
  119. edge[linefrom, bend left=10] (circlearea);
  120. \node[block, below of=rootarea, xshift=5em] (subarea) {Button area}
  121. edge[linefrom] (rootarea)
  122. edge[lineto, bend right=25] (rootarea);
  123. \node[block, right of=subarea, xshift=4em] (tracker) {\emph{tap} tracker}
  124. edge[lineto, dotted, bend left=10] (subarea)
  125. edge[linefrom, bend right=10] (subarea);
  126. \node[block, below of=rootarea, yshift=-5em] {Application}
  127. edge[linefrom, dotted] (circlearea)
  128. edge[linefrom, dotted] (rootarea)
  129. edge[linefrom, dotted] (subarea);
  130. \group{dragtracker}{eventdriver}{tracker}{subarea}{Architecture}
  131. }
  132. \caption{Diagram representation of an extended example, showing the
  133. flow of events and gestures in the architecture. The root area represents
  134. an application window that can be resized using \emph{pinch} gestures.
  135. The window contains a draggable circle, and a button that listens to
  136. \emph{tap} gestures. Dotted arrows represent a flow of gestures, regular
  137. arrows represent events (unless labeled otherwise).}
  138. \label{fig:examplediagram}
  139. \end{figure}
  140. }
  141. \def\lefthand{\includegraphics[width=50pt]{data/hand.png}}
  142. \def\righthand{\reflectbox{\includegraphics[width=50pt, angle=-45]{data/hand.png}}}
  143. \def\examplefigureone{
  144. \begin{figure}[h!]
  145. \center
  146. % TODO: draw finger touch points as circles with rotating arrow
  147. \begin{tikzpicture}
  148. \draw node[draw, black, minimum width=190, minimum height=140] at (0,0) {};
  149. \draw node[fill=gray!50, draw=black!70, minimum height=40, minimum width=40] at (-1,-1) {\lefthand};
  150. \draw node[] at (1.2,1) {\righthand};
  151. \draw node[draw=black!80, diamond, minimum height=70, minimum width=70] at (1.2,1) {};
  152. \end{tikzpicture}
  153. \caption{Two squares on the screen both listen to rotation. The user
  154. should be able to ``grab'' each of the squares independently and rotate
  155. them at the same time.}
  156. \label{fig:ex1}
  157. \end{figure}
  158. }
  159. \def\examplefiguretwo{
  160. \begin{figure}[h]
  161. \center
  162. \begin{tikzpicture}
  163. \draw node[draw, black, minimum width=190, minimum height=140] at (0,0) {};
  164. \draw node[draw=black!80, diamond, minimum height=50, minimum width=50] at (0.5, 0.3) {};
  165. \draw node[draw=black, diamond, dotted, minimum height=53, minimum width=53] at (0.5, 0.3) {};
  166. \draw node[draw=black, dotted, circle, minimum height=80, minimum width=80] at (0.5, 0.3) {};
  167. \fill (-0.3, -0.4) circle (0.15)
  168. (-0.4, 0.8) circle (0.15)
  169. (-0.1, 1.1) circle (0.15)
  170. (1.3, 0.9) circle (0.15);
  171. \draw (0.15, 0.55) circle (0.15) -- (-0.3, -0.4);
  172. \draw (0.15, 0.55) -- (-0.4, 0.8);
  173. \draw (0.15, 0.55) -- (-0.1, 1.1);
  174. \draw (0.15, 0.55) -- (1.3, 0.9);
  175. \end{tikzpicture}
  176. \caption{A square on the screen listens to rotation. The user can grab
  177. and rotate the square by positioning fingers around (but not in) it and
  178. and performing a rotating motion. An example pose of four fingers is
  179. shown by the filled black circles. While the events all occur in the
  180. dotted \emph{area}, the centroid of the rotation gesture is located in
  181. the square.}
  182. \label{fig:ex2}
  183. \end{figure}
  184. }
  185. \def\eventpropagationfigure{
  186. \begin{figure}[h!]
  187. \center
  188. \subfigure[
  189. An event is triggered in the white area. The event driver
  190. delegates the event to the event area tree (1) and the gray root
  191. area delegates it to the white area (2). The white area delegates
  192. it to drag tracker for gesture detection (3), which may trigger a
  193. gesture in the application (4-5). If propagation has not been
  194. stopped by the drag tracker, the event is propagated to the gray
  195. event area (6) which also detects drag gestures that may be
  196. triggered in the application (7-9).
  197. ]{
  198. \begin{tikzpicture}[node distance=5.5em]
  199. \draw node[draw=black, minimum width=190, minimum height=140] (screen) at (0,0) {};
  200. \draw node[fill=gray!50, draw=black!70, minimum height=100, minimum width=100] (screen) at (-0.1,-0.1) {};
  201. \draw node[fill=white, draw=black!80, diamond, minimum height=50, minimum width=50] (screen) at (0.3,0.4) {};
  202. \fill (0.4, 0.6) circle (0.15);
  203. \draw node[block, yshift=-10em, xshift=-3em] (driver) {Event driver};
  204. \draw node[block, below of=driver] (gray) {Gray event area}
  205. edge[linefrom] node[left] {1} (driver);
  206. \draw node[block, below of=gray] (white) {White event area}
  207. edge[linefrom, bend left=15] node[left] {2} (gray)
  208. edge[lineto, bend right=15] node[right] {6} (gray);
  209. \draw node[block, right of=white, xshift=4em] {drag tracker}
  210. edge[linefrom, bend right=15] node[above] {3} (white)
  211. edge[lineto, dotted, bend left=15] node[below] {4} (white);
  212. \draw node[block, right of=gray, xshift=4em] {drag tracker}
  213. edge[linefrom, bend right=15] node[above] {7} (gray)
  214. edge[lineto, dotted, bend left=15] node[below] {8} (gray);
  215. \draw node[block, below of=white] {Application}
  216. edge[linefrom, dotted, bend left=65] node[left] {9} (gray)
  217. edge[linefrom, dotted] node[left] {5} (white);
  218. \end{tikzpicture}
  219. }
  220. \quad
  221. \subfigure[
  222. An event is triggered in the gray area, but outside the white area.
  223. The event driver delegates the event to the gray event area (1).
  224. Since the white area does not contain the event, delegation stops
  225. and the event is passed on to the drag tracker of the gray event
  226. area (2). If a gesture is detected (3), the event area triggers the
  227. corresponding handler in the application (4).
  228. ]{
  229. \begin{tikzpicture}[node distance=5.5em]
  230. \draw node[draw=black, minimum width=190, minimum height=140] (screen) at (0,0) {};
  231. \draw node[fill=gray!50, draw=black!70, minimum height=100, minimum width=100] (screen) at (-0.1,-0.1) {};
  232. \draw node[fill=white, draw=black!80, diamond, minimum height=50, minimum width=50] (screen) at (0.3,0.4) {};
  233. \fill (-0.5, -0.7) circle (0.15);
  234. \draw node[block, yshift=-10em, xshift=-3em] (driver) {Event driver};
  235. \draw node[block, below of=driver] (gray) {Gray event area}
  236. edge[linefrom] node[left] {1} (driver);
  237. \draw node[block, below of=gray] (white) {White event area};
  238. \draw node[block, right of=white, xshift=4em] {drag tracker};
  239. \draw node[block, right of=gray, xshift=4em] {drag tracker}
  240. edge[linefrom, bend right=15] node[above] {2} (gray)
  241. edge[lineto, dotted, bend left=15] node[below] {3} (gray);
  242. \draw node[block, below of=white] {Application}
  243. edge[linefrom, dotted, bend left=65] node[left] {4} (gray);
  244. \end{tikzpicture}
  245. }
  246. \caption{
  247. Two nested squares both respond to ``drag'' gestures. When the
  248. white square is dragged, the gray square stays at its current
  249. position. The two figures both show a touch object triggering an
  250. event, represented by a black dot. The event is delegated and
  251. propagated through the event area tree in the order indicated by
  252. the numbered arrow labels. Dotted arrows represent a flow of
  253. gestures, regular arrows represent events.
  254. }
  255. \label{fig:eventpropagation}
  256. \end{figure}
  257. }
  258. \def\daemondiagram{
  259. \begin{figure}[h!]
  260. \centering
  261. \begin{tikzpicture}[node distance=4em]
  262. \node[block] (daemon) {Daemon};
  263. \node[block, above of=daemon] (driver) {Device driver}
  264. edge[lineto] (daemon);
  265. \node[block, xshift=-4em, left of=driver] {Device driver}
  266. edge[lineto] (daemon);
  267. \node[block, xshift=4em, right of=driver] {Device driver}
  268. edge[lineto] (daemon);
  269. \node[block, below of=daemon] (app) {Application}
  270. edge[linefrom, dotted] (daemon);
  271. \node[block, xshift=-4em, left of=app] {Application}
  272. edge[linefrom, dotted] (daemon);
  273. \node[block, xshift=4em, right of=app] {Application}
  274. edge[linefrom, dotted] (daemon);
  275. \draw[dashed] (app.north)+(-4, 0.35) -- node[right=4, yshift=1] {Network protocol} ++(4, 0.35);
  276. \end{tikzpicture}
  277. \caption{Daemon setup of an architecture implementation, serving
  278. gestures to multiple applications at the same time.}
  279. \label{fig:daemon}
  280. \end{figure}
  281. }
  282. \def\testappdiagram{
  283. \begin{figure}[h!]
  284. \center
  285. \architecture{
  286. \node[block, below of=driver] (eventdriver) {Event driver}
  287. edge[linefrom] node[right, near end] {device-specific messages} (driver);
  288. \node[block, below of=eventdriver] (rootarea) {Screen area}
  289. edge[linefrom] (eventdriver);
  290. \node[block, below of=rootarea, xshift=-5em] (appwindow) {Application window area}
  291. edge[lineto, <->] (rootarea);
  292. \node[block, left of=appwindow, xshift=-4em, text width=7em] {Transformation tracker}
  293. edge[lineto, dotted, bend right=10] (appwindow)
  294. edge[linefrom, bend left=10] (appwindow);
  295. \node[block, below of=rootarea, xshift=5em] (overlay) {Overlay area}
  296. edge[lineto, <->] (rootarea);
  297. \node[block, right of=overlay, xshift=4em] (tracker) {Hand tracker}
  298. edge[lineto, dotted, bend left=10] (overlay)
  299. edge[linefrom, bend right=10] (overlay);
  300. \node[block, below of=appwindow, xshift=-5em] (rectangle) {Rectangle area}
  301. edge[lineto, <->] (appwindow);
  302. \node[block, left of=rectangle, xshift=-4em, yshift=2em, text width=7em] (recttracker) {Transformation tracker}
  303. edge[lineto, dotted, bend left=10] (rectangle)
  304. edge[linefrom, bend right=10] (rectangle);
  305. \node[block, left of=rectangle, xshift=-4em, yshift=-2em, text width=7em] {Tap tracker}
  306. edge[lineto, dotted, bend right=10] (rectangle)
  307. edge[linefrom, bend left=10] (rectangle);
  308. \node[block, below of=appwindow, xshift=5em] (triangle) {Triangle area}
  309. edge[lineto, <->] (appwindow);
  310. \node[block, right of=triangle, xshift=4em, yshift=2em, text width=7em] {Transformation tracker}
  311. edge[lineto, dotted, bend right=10] (triangle)
  312. edge[linefrom, bend left=10] (triangle);
  313. \node[block, right of=triangle, xshift=4em, yshift=-2em, text width=7em] (taptracker) {Tap tracker}
  314. edge[lineto, dotted, bend left=10] (triangle)
  315. edge[linefrom, bend right=10] (triangle);
  316. \node[block, below of=rootarea, yshift=-12em] {Application}
  317. edge[linefrom, dotted, bend left=25] (appwindow)
  318. edge[linefrom, dotted] (rectangle)
  319. edge[linefrom, dotted] (triangle)
  320. edge[linefrom, dotted, bend right=25] (overlay);
  321. \group{recttracker}{eventdriver}{tracker}{taptracker}{Architecture}
  322. }
  323. \caption{Diagram representation of the second test application. A full
  324. screen event area contains an application window and a full screen
  325. overlay. The application window contains a rectangle and a triangle.
  326. the application window and its children can be transformed, and thus
  327. each have ``transformation tracker''. The rectangle and triangle also
  328. have a ``tap tracker'' that detects double tap gestures. Dotted arrows
  329. represent a flow of gestures, regular arrows represent events (unless
  330. labeled otherwise).}
  331. \label{fig:testappdiagram}
  332. \end{figure}
  333. }