shoes 3.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (275) hide show
  1. data/.gitignore +12 -0
  2. data/CHANGELOG +29 -0
  3. data/COPYING +30 -0
  4. data/README.md +76 -0
  5. data/README.old +117 -0
  6. data/Rakefile +130 -0
  7. data/Rakefile.bk +651 -0
  8. data/app.yaml +7 -0
  9. data/bin/main.skel +104 -0
  10. data/bugs/issue-012e9468ddc7b0cb7e1503413a8a11c4f8707b67.yaml +21 -0
  11. data/bugs/issue-0711ff8b67baa63586f11d0096fee9dd4436bf58.yaml +23 -0
  12. data/bugs/issue-07f87998d93eb401e22395c11085676389b935c4.yaml +22 -0
  13. data/bugs/issue-0bff2d80008803cbc7efbcdacdc60ef2163664d2.yaml +22 -0
  14. data/bugs/issue-0c66f223d19efbca7b692f3b91961f407ad7abec.yaml +24 -0
  15. data/bugs/issue-183bc3c7a8f575aff2b24e0bf22aa0dfcc8e4fc2.yaml +29 -0
  16. data/bugs/issue-1bad1e60a04cb3adb6a8f3ded128af2e16b56ffe.yaml +18 -0
  17. data/bugs/issue-1f1d43f76bf4de79d7f94adbae6dd506a9d81633.yaml +41 -0
  18. data/bugs/issue-320924117cadb045cc91f2a6fca922b4d81d4bb5.yaml +20 -0
  19. data/bugs/issue-33e5c8355fbf65252ea9e939714651df8bd8cb3b.yaml +25 -0
  20. data/bugs/issue-36f7c8262a72bcd5e28cfa4ed29328b8237ea79b.yaml +20 -0
  21. data/bugs/issue-39bf04ee50c3bef67b89b8e9beb28657805587ce.yaml +18 -0
  22. data/bugs/issue-3e28ba7754f73d02ef416eef989af707a8c00f01.yaml +23 -0
  23. data/bugs/issue-3f638cc03f41f9c3fdf217355321f1563f8fee45.yaml +22 -0
  24. data/bugs/issue-41e48e14f1ef4f6deb69be68165d7dd3ffd99156.yaml +22 -0
  25. data/bugs/issue-4c9408166a2aa5dd333bbb05520deebf4ded08e0.yaml +22 -0
  26. data/bugs/issue-55c687e108ecd5aeb8e0d0aeb4294984f84acd3e.yaml +18 -0
  27. data/bugs/issue-5811d34692cc292717a58ec1df1f8948cf30d826.yaml +28 -0
  28. data/bugs/issue-5a7c1f59a0526f9cea7fb366867cf1e6ed8ef69d.yaml +22 -0
  29. data/bugs/issue-688a2c2566bef6a03efa57a4ae1f7cfa8fc74444.yaml +21 -0
  30. data/bugs/issue-78b16c7988ade2ef96e716fa8cb9a004bd4ced65.yaml +33 -0
  31. data/bugs/issue-804ee49f9800154eddf0650690c7a9bb5626253f.yaml +27 -0
  32. data/bugs/issue-807dd1c610b2e941a5d454e26b2eac27e89a0ab4.yaml +22 -0
  33. data/bugs/issue-822ee33ec11ebd25f90ea86e8438de7891e63aee.yaml +18 -0
  34. data/bugs/issue-82ff7152cebb8a1cb065b864cb4fe22de2328146.yaml +29 -0
  35. data/bugs/issue-856afbdcdd4970ad54b8ce4a6c017fbaab45f49d.yaml +31 -0
  36. data/bugs/issue-8d49e32fb21522651c67490adb4d80076dbb14e1.yaml +24 -0
  37. data/bugs/issue-91583359653a9d530c1e32be72d874d847a306e7.yaml +21 -0
  38. data/bugs/issue-af41a5229613172764e7d3c98431172db337053d.yaml +20 -0
  39. data/bugs/issue-bd9856b3788dd429c998a5af1b2aae8221cb80b7.yaml +28 -0
  40. data/bugs/issue-be22aef5c564fb7b5e9938343136a9cd6a2edb7b.yaml +22 -0
  41. data/bugs/issue-bf8697523c77c326e7e35fc82cf3dd739ae92310.yaml +27 -0
  42. data/bugs/issue-cdd4b4795f34d6ff46e56ece10f8216a4a5456b2.yaml +25 -0
  43. data/bugs/issue-d9bfb5581d745ef9deb3b9b2e08ef74d1cd43082.yaml +20 -0
  44. data/bugs/issue-e0ce2f687cc096f35715d28b0af88589f4ab6cc6.yaml +18 -0
  45. data/bugs/issue-e4b0aca4a10a574b333aeaecaaf221dbc5ed22c6.yaml +38 -0
  46. data/bugs/issue-f263746594b95ba778455730478ee8df60ee639d.yaml +22 -0
  47. data/bugs/project.yaml +72 -0
  48. data/builddeps.sh +102 -0
  49. data/fonts/Coolvetica.ttf +0 -0
  50. data/fonts/Lacuna.ttf +0 -0
  51. data/gemlib/shoes.rb +1 -0
  52. data/lib/shoes.rb +548 -0
  53. data/lib/shoes/cache.rb +54 -0
  54. data/lib/shoes/chipmunk.rb +35 -0
  55. data/lib/shoes/data.rb +39 -0
  56. data/lib/shoes/help.rb +468 -0
  57. data/lib/shoes/image.rb +25 -0
  58. data/lib/shoes/inspect.rb +128 -0
  59. data/lib/shoes/log.rb +48 -0
  60. data/lib/shoes/minitar.rb +986 -0
  61. data/lib/shoes/override.rb +38 -0
  62. data/lib/shoes/pack.rb +543 -0
  63. data/lib/shoes/search.rb +46 -0
  64. data/lib/shoes/setup.rb +329 -0
  65. data/lib/shoes/shy.rb +131 -0
  66. data/lib/shoes/shybuilder.rb +44 -0
  67. data/lib/shoes/version.rb +3 -0
  68. data/make/darwin/deps.vlc +12 -0
  69. data/make/darwin/dylibs.shoes +22 -0
  70. data/make/darwin/dylibs.video +11 -0
  71. data/make/darwin/env.rb +81 -0
  72. data/make/darwin/tasks.rb +105 -0
  73. data/make/linux/env.rb +65 -0
  74. data/make/linux/tasks.rb +61 -0
  75. data/make/make.rb +85 -0
  76. data/make/mingw/dlls +19 -0
  77. data/make/mingw/env.rb +69 -0
  78. data/make/mingw/tasks.rb +70 -0
  79. data/make/rakefile_common.rb +8 -0
  80. data/manual-snapshots/class-book.png +0 -0
  81. data/manual-snapshots/expert-definr.png +0 -0
  82. data/manual-snapshots/expert-funnies.png +0 -0
  83. data/manual-snapshots/expert-irb.png +0 -0
  84. data/manual-snapshots/expert-minesweeper.png +0 -0
  85. data/manual-snapshots/expert-othello.png +0 -0
  86. data/manual-snapshots/expert-pong.png +0 -0
  87. data/manual-snapshots/expert-tankspank.png +0 -0
  88. data/manual-snapshots/good-arc.png +0 -0
  89. data/manual-snapshots/good-clock.png +0 -0
  90. data/manual-snapshots/good-follow.png +0 -0
  91. data/manual-snapshots/good-reminder.png +0 -0
  92. data/manual-snapshots/good-vjot.png +0 -0
  93. data/manual-snapshots/simple-accordion.png +0 -0
  94. data/manual-snapshots/simple-anim-shapes.png +0 -0
  95. data/manual-snapshots/simple-anim-text.png +0 -0
  96. data/manual-snapshots/simple-arc.png +0 -0
  97. data/manual-snapshots/simple-bounce.png +0 -0
  98. data/manual-snapshots/simple-calc.png +0 -0
  99. data/manual-snapshots/simple-chipmunk.png +0 -0
  100. data/manual-snapshots/simple-control-sizes.png +0 -0
  101. data/manual-snapshots/simple-curve.png +0 -0
  102. data/manual-snapshots/simple-dialogs.png +0 -0
  103. data/manual-snapshots/simple-downloader.png +0 -0
  104. data/manual-snapshots/simple-draw.png +0 -0
  105. data/manual-snapshots/simple-editor.png +0 -0
  106. data/manual-snapshots/simple-form.png +0 -0
  107. data/manual-snapshots/simple-mask.png +0 -0
  108. data/manual-snapshots/simple-menu.png +0 -0
  109. data/manual-snapshots/simple-menu1.png +0 -0
  110. data/manual-snapshots/simple-rubygems.png +0 -0
  111. data/manual-snapshots/simple-slide.png +0 -0
  112. data/manual-snapshots/simple-sphere.png +0 -0
  113. data/manual-snapshots/simple-sqlite3.png +0 -0
  114. data/manual-snapshots/simple-timer.png +0 -0
  115. data/manual-snapshots/simple-video.png +0 -0
  116. data/platform/mac/Info.plist +55 -0
  117. data/platform/mac/build-deps.sh +658 -0
  118. data/platform/mac/command-manual.rb +1 -0
  119. data/platform/mac/deps-osx.patch +159 -0
  120. data/platform/mac/dmg_ds_store +0 -0
  121. data/platform/mac/pangorc +2 -0
  122. data/platform/mac/pkg-dmg +1447 -0
  123. data/platform/mac/shoes +31 -0
  124. data/platform/mac/shoes-launch +7 -0
  125. data/platform/mac/stub.m +178 -0
  126. data/platform/mac/version.plist +14 -0
  127. data/platform/msw/base.nsi +644 -0
  128. data/platform/msw/installer-1.bmp +0 -0
  129. data/platform/msw/installer-2.bmp +0 -0
  130. data/platform/msw/shoes.exe.manifest +17 -0
  131. data/platform/msw/shoes.ico +0 -0
  132. data/platform/msw/stub-inject.c +59 -0
  133. data/platform/msw/stub.c +271 -0
  134. data/platform/msw/stub32.h +14 -0
  135. data/platform/msw/stub32.rc +16 -0
  136. data/platform/nix/INSTALL +56 -0
  137. data/platform/nix/Makefile +144 -0
  138. data/platform/nix/shoes.launch +20 -0
  139. data/platform/skel.rb +27 -0
  140. data/rakefile_darwin.rb +7 -0
  141. data/rakefile_linux.rb +3 -0
  142. data/rakefile_mingw.rb +7 -0
  143. data/samples/class-book.rb +43 -0
  144. data/samples/class-book.yaml +387 -0
  145. data/samples/expert-definr.rb +23 -0
  146. data/samples/expert-funnies.rb +51 -0
  147. data/samples/expert-irb.rb +112 -0
  148. data/samples/expert-minesweeper.rb +267 -0
  149. data/samples/expert-othello.rb +319 -0
  150. data/samples/expert-pong.rb +62 -0
  151. data/samples/expert-tankspank.rb +385 -0
  152. data/samples/good-arc.rb +37 -0
  153. data/samples/good-clock.rb +51 -0
  154. data/samples/good-follow.rb +26 -0
  155. data/samples/good-reminder.rb +174 -0
  156. data/samples/good-vjot.rb +56 -0
  157. data/samples/simple-accordion.rb +75 -0
  158. data/samples/simple-anim-shapes.rb +17 -0
  159. data/samples/simple-anim-text.rb +13 -0
  160. data/samples/simple-arc.rb +23 -0
  161. data/samples/simple-bounce.rb +24 -0
  162. data/samples/simple-calc.rb +70 -0
  163. data/samples/simple-chipmunk.rb +26 -0
  164. data/samples/simple-control-sizes.rb +24 -0
  165. data/samples/simple-curve.rb +26 -0
  166. data/samples/simple-dialogs.rb +29 -0
  167. data/samples/simple-downloader.rb +27 -0
  168. data/samples/simple-draw.rb +13 -0
  169. data/samples/simple-editor.rb +28 -0
  170. data/samples/simple-form.rb +28 -0
  171. data/samples/simple-form.shy +0 -0
  172. data/samples/simple-mask.rb +21 -0
  173. data/samples/simple-menu.rb +31 -0
  174. data/samples/simple-menu1.rb +35 -0
  175. data/samples/simple-rubygems.rb +29 -0
  176. data/samples/simple-slide.rb +45 -0
  177. data/samples/simple-sphere.rb +28 -0
  178. data/samples/simple-sqlite3.rb +13 -0
  179. data/samples/simple-timer.rb +13 -0
  180. data/samples/simple-video.rb +13 -0
  181. data/shoes.gemspec +21 -0
  182. data/shoes/app.c +591 -0
  183. data/shoes/app.h +110 -0
  184. data/shoes/appwin32.h +13 -0
  185. data/shoes/appwin32.rc +28 -0
  186. data/shoes/canvas.c +2202 -0
  187. data/shoes/canvas.h +682 -0
  188. data/shoes/code.h +14 -0
  189. data/shoes/config.h +232 -0
  190. data/shoes/effects.c +243 -0
  191. data/shoes/effects.h +7 -0
  192. data/shoes/http.h +44 -0
  193. data/shoes/http/common.h +86 -0
  194. data/shoes/http/curl.c +259 -0
  195. data/shoes/http/nsurl.m +274 -0
  196. data/shoes/http/windownload.c +114 -0
  197. data/shoes/http/winhttp.c +216 -0
  198. data/shoes/http/winhttp.h +19 -0
  199. data/shoes/image.c +1020 -0
  200. data/shoes/internal.c +46 -0
  201. data/shoes/internal.h +63 -0
  202. data/shoes/native.h +110 -0
  203. data/shoes/native/cocoa.h +105 -0
  204. data/shoes/native/cocoa.m +1557 -0
  205. data/shoes/native/gtk.c +1257 -0
  206. data/shoes/native/windows.c +2392 -0
  207. data/shoes/ruby.c +5221 -0
  208. data/shoes/ruby.h +299 -0
  209. data/shoes/world.c +243 -0
  210. data/shoes/world.h +63 -0
  211. data/static/Shoes.icns +0 -0
  212. data/static/avatar.png +0 -0
  213. data/static/code_highlighter.js +188 -0
  214. data/static/code_highlighter_ruby.js +26 -0
  215. data/static/icon-debug.png +0 -0
  216. data/static/icon-error.png +0 -0
  217. data/static/icon-info.png +0 -0
  218. data/static/icon-warn.png +0 -0
  219. data/static/listbox_button1.png +0 -0
  220. data/static/listbox_button2.png +0 -0
  221. data/static/man-app.png +0 -0
  222. data/static/man-builds.png +0 -0
  223. data/static/man-builds1.png +0 -0
  224. data/static/man-editor-notepad.png +0 -0
  225. data/static/man-editor-osx.png +0 -0
  226. data/static/man-ele-background.png +0 -0
  227. data/static/man-ele-border.png +0 -0
  228. data/static/man-ele-button.png +0 -0
  229. data/static/man-ele-check.png +0 -0
  230. data/static/man-ele-editbox.png +0 -0
  231. data/static/man-ele-editline.png +0 -0
  232. data/static/man-ele-image.png +0 -0
  233. data/static/man-ele-listbox.png +0 -0
  234. data/static/man-ele-progress.png +0 -0
  235. data/static/man-ele-radio.png +0 -0
  236. data/static/man-ele-shape.png +0 -0
  237. data/static/man-ele-textblock.png +0 -0
  238. data/static/man-ele-video.png +0 -0
  239. data/static/man-intro-dmg.png +0 -0
  240. data/static/man-intro-exe.png +0 -0
  241. data/static/man-look-tiger.png +0 -0
  242. data/static/man-look-ubuntu.png +0 -0
  243. data/static/man-look-vista.png +0 -0
  244. data/static/man-run-osx.png +0 -0
  245. data/static/man-run-vista.png +0 -0
  246. data/static/man-run-xp.png +0 -0
  247. data/static/man-shot1.png +0 -0
  248. data/static/manual-en.txt +3531 -0
  249. data/static/manual-ja.txt +2825 -0
  250. data/static/manual.css +167 -0
  251. data/static/menu-corner1.png +0 -0
  252. data/static/menu-corner2.png +0 -0
  253. data/static/menu-gray.png +0 -0
  254. data/static/menu-left.png +0 -0
  255. data/static/menu-right.png +0 -0
  256. data/static/menu-top.png +0 -0
  257. data/static/shoes-dmg.jpg +0 -0
  258. data/static/shoes-icon-blue.png +0 -0
  259. data/static/shoes-icon.png +0 -0
  260. data/static/shoes-manual-apps.gif +0 -0
  261. data/static/shoes_main_window.png +0 -0
  262. data/static/stripe.png +0 -0
  263. data/static/stubs/blank.exe +0 -0
  264. data/static/stubs/blank.hfz +0 -0
  265. data/static/stubs/blank.run +375 -0
  266. data/static/stubs/cocoa-install +0 -0
  267. data/static/stubs/sh-install +49 -0
  268. data/static/stubs/shoes-stub-inject.exe +0 -0
  269. data/static/stubs/shoes-stub.exe +0 -0
  270. data/static/tutor-back.png +0 -0
  271. data/test/shoes_test.rb +8 -0
  272. data/test/test_helper.rb +25 -0
  273. data/use-deps +12 -0
  274. data/use-tmp-dep +8 -0
  275. metadata +509 -0
@@ -0,0 +1,14 @@
1
+ //
2
+ // shoes/code.h
3
+ // Success and error codes.
4
+ //
5
+ #ifndef SHOES_CODE_H
6
+ #define SHOES_CODE_H
7
+
8
+ typedef unsigned long shoes_code;
9
+
10
+ #define SHOES_OK 0
11
+ #define SHOES_FAIL 1
12
+ #define SHOES_QUIT 2
13
+
14
+ #endif
@@ -0,0 +1,232 @@
1
+ //
2
+ // shoes/config.h
3
+ // Most platform-specific definitions. Window handles and GUI elements for GTK,
4
+ // OSX and Win32.
5
+ //
6
+ // About SHOES_APP_OS and SHOES_SLOT_OS:
7
+ // =========================
8
+ //
9
+ // Okay, so I should mention why these two are split up. Obviously, these structures
10
+ // contain anything which is unique to a platform. So, on GTK, you'll see a bunch of
11
+ // GtkWidget pointers in these two structures. I try to isolate anything of that nature
12
+ // into SHOES_APP_OS or SHOES_SLOT_OS. Of course, for native widgets, I just go ahead and put it
13
+ // in the widget structures, to fit that all in here would be too pedantic.
14
+ //
15
+ // SHOES_APP_OS covers the toplevel window. So, there should only be one SHOES_APP_OS structure
16
+ // floating around. In fact, the `global_app` variable in shoes/app.c should always
17
+ // point to that one struct. Still, this struct has a pretty low visibility. I don't
18
+ // like to use `global_app`, except to get around platform limitations. So the SHOES_APP_OS
19
+ // struct is low-viz, it's only touched in the app-level API and in event handlers.
20
+ //
21
+ // SHOES_SLOT_OS travels down through nested windows, nested canvases. It's always handy at
22
+ // any level in the canvas stack. But, keep in mind, one is allocated per window or
23
+ // canvas. I guess I think of each drawing layer as a "slot". Each slot copies its
24
+ // parent slot. So, it's possible that the bottom slot will simply reference pointers
25
+ // that are kept in the top slot. But, in the case of nested fixed canvases (similar
26
+ // to a browser's IFRAMEs,) the slot will point to new window handles and pass that
27
+ // on to its children.
28
+ //
29
+ // Anyway, ultimately the idea is to occassionally use the native environment's window
30
+ // nesting, because these operating systems offer scrollbars (and some offer compositing)
31
+ // which would be wasteful to try to emulate.
32
+ //
33
+ #ifndef SHOES_CONFIG_H
34
+ #define SHOES_CONFIG_H
35
+
36
+ #define SHOES_BUFSIZE 4096
37
+
38
+ //
39
+ // gtk window struct
40
+ //
41
+ #ifdef SHOES_GTK
42
+ #include <gtk/gtk.h>
43
+ #include <gdk/gdkkeysyms.h>
44
+ #include <gdk/gdkx.h>
45
+ #include <curl/curl.h>
46
+ #include <curl/types.h>
47
+ #include <curl/easy.h>
48
+
49
+ #define SHOES_SIGNAL
50
+ #define SHOES_INIT_ARGS void
51
+ #define SHOES_EXTERN
52
+
53
+ typedef struct {
54
+ GtkWidget *vscroll, *canvas;
55
+ GdkEventExpose *expose;
56
+ int scrolly, scrollh, scrollw;
57
+ void *owner;
58
+ } shoes_slot_gtk, SHOES_SLOT_OS;
59
+
60
+ typedef struct {
61
+ GtkWidget *layout;
62
+ GtkWidget *radios;
63
+ } shoes_group_gtk, SHOES_GROUP_OS;
64
+
65
+ typedef struct {
66
+ GtkWidget *window;
67
+ } shoes_app_gtk, SHOES_APP_OS;
68
+
69
+ typedef struct {
70
+ int nada;
71
+ } shoes_world_gtk, SHOES_WORLD_OS;
72
+
73
+ #define USTR(str) str
74
+ #define SHOES_CONTROL_REF GtkWidget *
75
+ #define SHOES_SURFACE_REF GtkWidget *
76
+ #define SHOES_BOOL gboolean
77
+ #define SHOES_TIMER_REF guint
78
+ #define DC(slot) slot->canvas
79
+ #define HAS_DRAWABLE(slot) slot->canvas->window != 0
80
+ #define DRAWABLE(ref) GDK_DRAWABLE_XID(ref->window)
81
+ #define APP_WINDOW(app) (app == NULL ? NULL : GTK_WINDOW(app->os.window))
82
+ #define SHOES_TIME struct timespec
83
+ #define SHOES_DOWNLOAD_HEADERS struct curl_slist *
84
+ #define SHOES_DOWNLOAD_ERROR CURLcode
85
+ #endif
86
+
87
+ //
88
+ // quartz (osx) window struct
89
+ //
90
+ #ifdef SHOES_QUARTZ
91
+ // hacks to prevent T_DATA conflict between Ruby and Carbon headers
92
+ # define __OPENTRANSPORT__
93
+ # define __OPENTRANSPORTPROTOCOL__
94
+ # define __OPENTRANSPORTPROVIDERS__
95
+ #include <Cocoa/Cocoa.h>
96
+ #include "shoes/native/cocoa.h"
97
+ #include <cairo-quartz.h>
98
+
99
+ #define SHOES_SIGNAL
100
+ #define SHOES_HELP_MANUAL 3044
101
+ #define SHOES_CONTROL1 3045
102
+ #define SHOES_INIT_ARGS void
103
+ #define SHOES_EXTERN
104
+
105
+ typedef struct {
106
+ NSView *view;
107
+ NSScroller *vscroll;
108
+ CGContextRef context;
109
+ cairo_surface_t *surface;
110
+ VALUE controls;
111
+ int scrolly;
112
+ void *owner;
113
+ } shoes_slot_quartz, SHOES_SLOT_OS;
114
+
115
+ typedef struct {
116
+ char none;
117
+ } shoes_group_quartz, SHOES_GROUP_OS;
118
+
119
+ typedef struct {
120
+ ShoesWindow *window;
121
+ NSView *view;
122
+ NSRect normal;
123
+ } shoes_app_quartz, SHOES_APP_OS;
124
+
125
+ typedef struct {
126
+ ShoesEvents *events;
127
+ } shoes_world_quartz, SHOES_WORLD_OS;
128
+
129
+ #define kShoesViewClassID CFSTR("org.hackety.ShoesView")
130
+ #define kShoesBoundEvent 'Boun'
131
+ #define kShoesSlotData 'SLOT'
132
+
133
+ #define USTR(str) str
134
+ #define SHOES_CONTROL_REF NSControl *
135
+ #define SHOES_SURFACE_REF CGrafPtr
136
+ #define SHOES_BOOL BOOL
137
+ #define SHOES_TIMER_REF ShoesTimer *
138
+ #define DC(slot) slot->view
139
+ #define HAS_DRAWABLE(slot) slot->context != NULL
140
+ #define DRAWABLE(ref) ref
141
+ #define SHOES_TIME struct timeval
142
+ #define SHOES_DOWNLOAD_HEADERS NSDictionary *
143
+ #define SHOES_DOWNLOAD_ERROR NSError *
144
+
145
+ #endif
146
+
147
+ #ifdef SHOES_WIN32
148
+ #include <windows.h>
149
+ #include <commctrl.h>
150
+ #include <shellapi.h>
151
+ #include <cairo-win32.h>
152
+
153
+ #ifdef RUBY_1_9
154
+ #include "ruby/win32.h"
155
+ #else
156
+ #include "win32/win32.h"
157
+ #endif
158
+
159
+ #ifndef WM_MOUSEWHEEL
160
+ #define WM_MOUSEWHEEL 0x020A
161
+ #endif
162
+ #ifndef WHEEL_DELTA
163
+ #define WHEEL_DELTA 120
164
+ #endif
165
+ #ifndef SPI_GETWHEELSCROLLLINES
166
+ #define SPI_GETWHEELSCROLLLINES 104
167
+ #endif
168
+ #ifndef WHEEL_PAGESCROLL
169
+ #define WHEEL_PAGESCROLL UINT_MAX
170
+ #endif
171
+
172
+ #define SHOES_CONTROL1 3045
173
+ #define SHOES_WM_MESSAGE (WM_APP + 3045)
174
+ #define SHOES_INIT_ARGS HINSTANCE inst, int style
175
+ #define SHOES_EXTERN __declspec(dllexport)
176
+
177
+ typedef struct {
178
+ PAINTSTRUCT ps;
179
+ HDC dc, dc2;
180
+ HWND window;
181
+ VALUE focus;
182
+ VALUE controls;
183
+ cairo_surface_t *surface;
184
+ int scrolly;
185
+ char vscroll;
186
+ void *owner;
187
+ void *parent;
188
+ } shoes_slot_win32, SHOES_SLOT_OS;
189
+
190
+ typedef struct {
191
+ char none;
192
+ } shoes_group_win32, SHOES_GROUP_OS;
193
+
194
+ typedef struct {
195
+ LONG style;
196
+ RECT normal;
197
+ BOOL ctrlkey, altkey, shiftkey;
198
+ HWND window;
199
+ } shoes_app_win32, SHOES_APP_OS;
200
+
201
+ typedef struct {
202
+ HINSTANCE instance;
203
+ int style;
204
+ HWND hidden;
205
+ WNDCLASSEX classex, slotex, vlclassex, hiddenex;
206
+ ATOM classatom;
207
+ BOOL doublebuffer;
208
+ } shoes_world_win32, SHOES_WORLD_OS;
209
+
210
+ #define USTR(str) (const char *)L##str
211
+ #define SHOES_CONTROL_REF HWND
212
+ #define SHOES_SURFACE_REF HWND
213
+ #define SHOES_BOOL BOOL
214
+ #define SHOES_TIMER_REF long
215
+ #define DC(slot) slot->window
216
+ #define HAS_DRAWABLE(slot) slot->window != NULL
217
+ #define DRAWABLE(ref) (libvlc_drawable_t)ref
218
+ #define APP_WINDOW(app) (app == NULL ? NULL : app->slot->window)
219
+ #define SHOES_TIME DWORD
220
+ #define SHOES_DOWNLOAD_HEADERS LPWSTR
221
+ #define SHOES_DOWNLOAD_ERROR DWORD
222
+
223
+ #endif
224
+
225
+ #define KEY_STATE(sym) \
226
+ { \
227
+ VALUE str = rb_str_new2("" # sym "_"); \
228
+ rb_str_append(str, rb_funcall(v, s_to_s, 0)); \
229
+ v = rb_str_intern(str); \
230
+ }
231
+
232
+ #endif
@@ -0,0 +1,243 @@
1
+ //
2
+ // shoes/effects.c
3
+ // The blurring and shadowing effects.
4
+ //
5
+ #include "shoes/internal.h"
6
+ #include "shoes/app.h"
7
+ #include "shoes/canvas.h"
8
+ #include "shoes/ruby.h"
9
+ #include <math.h>
10
+
11
+ static unsigned char *
12
+ box_run(unsigned int size)
13
+ {
14
+ int i;
15
+ unsigned char *tmp = SHOE_ALLOC_N(unsigned char, size * 256);
16
+ for (i = 0; i < 256; i++)
17
+ memset(tmp + i * size, i, size);
18
+ return tmp;
19
+ }
20
+
21
+ #define BOX_H 1
22
+ #define BOX_V 2
23
+
24
+ static void
25
+ box_blur(unsigned char *in, unsigned char *out,
26
+ int stride, shoes_place *place,
27
+ unsigned int edge1, unsigned int edge2,
28
+ const unsigned char *run, int dir)
29
+ {
30
+ int i, j1, j2, l = 0, l2, l3, l4, lx = 0, c1, c2, c3, c4, start;
31
+ int boxSize = edge1 + edge2 + 1;
32
+ if (dir == BOX_H)
33
+ {
34
+ c1 = place->y;
35
+ c2 = place->y + place->h;
36
+ c3 = place->x;
37
+ c4 = place->x + place->w;
38
+ }
39
+ else
40
+ {
41
+ c1 = place->x;
42
+ c2 = place->x + place->w;
43
+ c3 = place->y;
44
+ c4 = place->y + place->h;
45
+ }
46
+
47
+ start = c3 - edge1;
48
+ for (j1 = c1; j1 < c2; j1++) {
49
+ unsigned int sums[4] = {0, 0, 0, 0};
50
+ if (dir == BOX_H)
51
+ l = stride * j1;
52
+ else
53
+ lx = j1 << 2;
54
+ for (i = 0; i < boxSize; i++) {
55
+ int pos = start + i;
56
+ pos = max(pos, c3);
57
+ pos = min(pos, c4 - 1);
58
+ if (dir == BOX_V)
59
+ l = stride * pos + lx;
60
+ sums[0] += in[l];
61
+ sums[1] += in[l + 1];
62
+ sums[2] += in[l + 2];
63
+ sums[3] += in[l + 3];
64
+ }
65
+ for (j2 = c3; j2 < c4; j2++) {
66
+ if (dir == BOX_H)
67
+ l2 = l + (j2 << 2);
68
+ else
69
+ l2 = stride * j2 + lx;
70
+ out[l2] = run[sums[0]];
71
+ out[l2 + 1] = run[sums[1]];
72
+ out[l2 + 2] = run[sums[2]];
73
+ out[l2 + 3] = run[sums[3]];
74
+
75
+ int tmp = j2 - edge1;
76
+ int last = max(tmp, c3);
77
+ int next = min(tmp + boxSize, c4 - 1);
78
+ if (dir == BOX_H)
79
+ {
80
+ l3 = l + (next << 2);
81
+ l4 = l + (last << 2);
82
+ }
83
+ else
84
+ {
85
+ l3 = stride * next + lx;
86
+ l4 = stride * last + lx;
87
+ }
88
+
89
+ sums[0] += in[l3] - in[l4];
90
+ sums[1] += in[l3 + 1] - in[l4 + 1];
91
+ sums[2] += in[l3 + 2] - in[l4 + 2];
92
+ sums[3] += in[l3 + 3] - in[l4 + 3];
93
+ }
94
+ }
95
+ }
96
+
97
+ #define RAW_FILTER_START(place) \
98
+ int width, height, stride; \
99
+ guchar *out; \
100
+ static const cairo_user_data_key_t key; \
101
+ cairo_surface_t *source = cairo_get_target(cr); \
102
+ cairo_surface_t *target; \
103
+ unsigned char *in = cairo_image_surface_get_data(source); \
104
+ \
105
+ place->x = place->y = 0; \
106
+ place->w = width = cairo_image_surface_get_width(source); \
107
+ place->h = height = cairo_image_surface_get_height(source); \
108
+ stride = cairo_image_surface_get_stride(source); \
109
+ \
110
+ out = (guchar *)g_malloc(4 * width * height); \
111
+ target = cairo_image_surface_create_for_data((unsigned char *)out, \
112
+ CAIRO_FORMAT_ARGB32, \
113
+ width, height, 4 * width); \
114
+ cairo_surface_set_user_data(target, &key, out, (cairo_destroy_func_t)g_free); \
115
+ unsigned int len = 4 * width * height
116
+
117
+ #define RAW_FILTER_END() \
118
+ cairo_set_operator(cr, CAIRO_OPERATOR_CLEAR); \
119
+ cairo_paint(cr); \
120
+ cairo_set_operator(cr, CAIRO_OPERATOR_OVER); \
121
+ cairo_set_source_surface(cr, target, 0, 0); \
122
+ cairo_paint(cr); \
123
+ cairo_surface_destroy(target);
124
+
125
+ void
126
+ shoes_gaussian_blur_filter(cairo_t *cr, VALUE attr, shoes_place *place)
127
+ {
128
+ float blur_d = ATTR2(dbl, attr, radius, 2.);
129
+ float blur_x = blur_d, blur_y = blur_d;
130
+ RAW_FILTER_START(place);
131
+ if (blur_x < 0 || blur_y < 0)
132
+ return;
133
+
134
+ if (blur_x == 0 || blur_y == 0)
135
+ memset(out, 0, len);
136
+
137
+ unsigned int dX, dY;
138
+ dX = (unsigned int) floor(blur_x * 3*sqrt(2*SHOES_PI)/4 + 0.5);
139
+ dY = (unsigned int) floor(blur_y * 3*sqrt(2*SHOES_PI)/4 + 0.5);
140
+
141
+ unsigned char *tmp = SHOE_ALLOC_N(unsigned char, len);
142
+
143
+ if (dX & 1) {
144
+ unsigned char *run = box_run(2 * (dX / 2) + 1);
145
+ box_blur(in, tmp, stride, place, dX/2, dX/2, run, BOX_H);
146
+ box_blur(tmp, out, stride, place, dX/2, dX/2, run, BOX_H);
147
+ box_blur(out, tmp, stride, place, dX/2, dX/2, run, BOX_H);
148
+ SHOE_FREE(run);
149
+ } else {
150
+ if (dX == 0) {
151
+ memcpy(tmp, in, len);
152
+ } else {
153
+ unsigned char *run1 = box_run(2 * (dX / 2) + 1);
154
+ unsigned char *run2 = box_run(2 * (dX / 2));
155
+ box_blur(in, tmp, stride, place, dX/2, dX/2 - 1, run2, BOX_H);
156
+ box_blur(tmp, out, stride, place, dX/2 - 1, dX/2, run2, BOX_H);
157
+ box_blur(out, tmp, stride, place, dX/2, dX/2, run1, BOX_H);
158
+ SHOE_FREE(run1);
159
+ SHOE_FREE(run2);
160
+ }
161
+ }
162
+
163
+ if (dY & 1) {
164
+ unsigned char *run = box_run(2 * (dY / 2) + 1);
165
+ box_blur(tmp, out, stride, place, dY/2, dY/2, run, BOX_V);
166
+ box_blur(out, tmp, stride, place, dY/2, dY/2, run, BOX_V);
167
+ box_blur(tmp, out, stride, place, dY/2, dY/2, run, BOX_V);
168
+ SHOE_FREE(run);
169
+ } else {
170
+ if (dY == 0) {
171
+ memcpy(out, tmp, len);
172
+ } else {
173
+ unsigned char *run1 = box_run(2 * (dY / 2) + 1);
174
+ unsigned char *run2 = box_run(2 * (dY / 2));
175
+ box_blur(tmp, out, stride, place, dY/2, dY/2 - 1, run2, BOX_V);
176
+ box_blur(out, tmp, stride, place, dY/2 - 1, dY/2, run2, BOX_V);
177
+ box_blur(tmp, out, stride, place, dY/2, dY/2, run1, BOX_V);
178
+ SHOE_FREE(run1);
179
+ SHOE_FREE(run2);
180
+ }
181
+ }
182
+
183
+ SHOE_FREE(tmp);
184
+ RAW_FILTER_END();
185
+ }
186
+
187
+ static void
188
+ shoes_layer_blur_filter(cairo_t *cr, VALUE attr, shoes_place *place,
189
+ cairo_operator_t blur_op, cairo_operator_t merge_op, int distance)
190
+ {
191
+ cairo_surface_t *source = cairo_get_target(cr);
192
+ int width = cairo_image_surface_get_width(source);
193
+ int height = cairo_image_surface_get_height(source);
194
+ VALUE fill = ATTR(attr, fill);
195
+
196
+ cairo_surface_t *target = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, width, height);
197
+ cairo_t *cr2 = cairo_create(target);
198
+ cairo_set_source_surface(cr2, source, distance, distance);
199
+ cairo_paint(cr2);
200
+ cairo_set_operator(cr2, blur_op);
201
+ if (NIL_P(fill))
202
+ cairo_set_source_rgb(cr2, 0., 0., 0.);
203
+ else if (rb_obj_is_kind_of(fill, cColor))
204
+ {
205
+ shoes_color *color;
206
+ Data_Get_Struct(fill, shoes_color, color);
207
+ cairo_set_source_rgba(cr, color->r / 255., color->g / 255., color->b / 255., color->a / 255.);
208
+ }
209
+ else
210
+ {
211
+ shoes_pattern *pattern;
212
+ Data_Get_Struct(fill, shoes_pattern, pattern);
213
+ cairo_set_source(cr2, PATTERN(pattern));
214
+ }
215
+ cairo_rectangle(cr2, 0, 0, width, height);
216
+ cairo_paint(cr2);
217
+ shoes_gaussian_blur_filter(cr2, attr, place);
218
+ cairo_set_operator(cr, merge_op);
219
+ cairo_set_source_surface(cr, target, 0, 0);
220
+ cairo_paint(cr);
221
+ cairo_destroy(cr2);
222
+ }
223
+
224
+ void
225
+ shoes_shadow_filter(cairo_t *cr, VALUE attr, shoes_place *place)
226
+ {
227
+ int distance = ATTR2(int, attr, distance, 4);
228
+ shoes_layer_blur_filter(cr, attr, place, CAIRO_OPERATOR_IN, CAIRO_OPERATOR_DEST_OVER, distance);
229
+ }
230
+
231
+ void
232
+ shoes_glow_filter(cairo_t *cr, VALUE attr, shoes_place *place)
233
+ {
234
+ cairo_operator_t blur_op = CAIRO_OPERATOR_IN;
235
+ cairo_operator_t merge_op = CAIRO_OPERATOR_DEST_OVER;
236
+ if (RTEST(ATTR(attr, inner)))
237
+ {
238
+ blur_op = CAIRO_OPERATOR_OUT;
239
+ merge_op = CAIRO_OPERATOR_ATOP;
240
+ }
241
+ shoes_layer_blur_filter(cr, attr, place, blur_op, merge_op, 0);
242
+ }
243
+