shoes 3.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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
+