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.
- data/.gitignore +12 -0
- data/CHANGELOG +29 -0
- data/COPYING +30 -0
- data/README.md +76 -0
- data/README.old +117 -0
- data/Rakefile +130 -0
- data/Rakefile.bk +651 -0
- data/app.yaml +7 -0
- data/bin/main.skel +104 -0
- data/bugs/issue-012e9468ddc7b0cb7e1503413a8a11c4f8707b67.yaml +21 -0
- data/bugs/issue-0711ff8b67baa63586f11d0096fee9dd4436bf58.yaml +23 -0
- data/bugs/issue-07f87998d93eb401e22395c11085676389b935c4.yaml +22 -0
- data/bugs/issue-0bff2d80008803cbc7efbcdacdc60ef2163664d2.yaml +22 -0
- data/bugs/issue-0c66f223d19efbca7b692f3b91961f407ad7abec.yaml +24 -0
- data/bugs/issue-183bc3c7a8f575aff2b24e0bf22aa0dfcc8e4fc2.yaml +29 -0
- data/bugs/issue-1bad1e60a04cb3adb6a8f3ded128af2e16b56ffe.yaml +18 -0
- data/bugs/issue-1f1d43f76bf4de79d7f94adbae6dd506a9d81633.yaml +41 -0
- data/bugs/issue-320924117cadb045cc91f2a6fca922b4d81d4bb5.yaml +20 -0
- data/bugs/issue-33e5c8355fbf65252ea9e939714651df8bd8cb3b.yaml +25 -0
- data/bugs/issue-36f7c8262a72bcd5e28cfa4ed29328b8237ea79b.yaml +20 -0
- data/bugs/issue-39bf04ee50c3bef67b89b8e9beb28657805587ce.yaml +18 -0
- data/bugs/issue-3e28ba7754f73d02ef416eef989af707a8c00f01.yaml +23 -0
- data/bugs/issue-3f638cc03f41f9c3fdf217355321f1563f8fee45.yaml +22 -0
- data/bugs/issue-41e48e14f1ef4f6deb69be68165d7dd3ffd99156.yaml +22 -0
- data/bugs/issue-4c9408166a2aa5dd333bbb05520deebf4ded08e0.yaml +22 -0
- data/bugs/issue-55c687e108ecd5aeb8e0d0aeb4294984f84acd3e.yaml +18 -0
- data/bugs/issue-5811d34692cc292717a58ec1df1f8948cf30d826.yaml +28 -0
- data/bugs/issue-5a7c1f59a0526f9cea7fb366867cf1e6ed8ef69d.yaml +22 -0
- data/bugs/issue-688a2c2566bef6a03efa57a4ae1f7cfa8fc74444.yaml +21 -0
- data/bugs/issue-78b16c7988ade2ef96e716fa8cb9a004bd4ced65.yaml +33 -0
- data/bugs/issue-804ee49f9800154eddf0650690c7a9bb5626253f.yaml +27 -0
- data/bugs/issue-807dd1c610b2e941a5d454e26b2eac27e89a0ab4.yaml +22 -0
- data/bugs/issue-822ee33ec11ebd25f90ea86e8438de7891e63aee.yaml +18 -0
- data/bugs/issue-82ff7152cebb8a1cb065b864cb4fe22de2328146.yaml +29 -0
- data/bugs/issue-856afbdcdd4970ad54b8ce4a6c017fbaab45f49d.yaml +31 -0
- data/bugs/issue-8d49e32fb21522651c67490adb4d80076dbb14e1.yaml +24 -0
- data/bugs/issue-91583359653a9d530c1e32be72d874d847a306e7.yaml +21 -0
- data/bugs/issue-af41a5229613172764e7d3c98431172db337053d.yaml +20 -0
- data/bugs/issue-bd9856b3788dd429c998a5af1b2aae8221cb80b7.yaml +28 -0
- data/bugs/issue-be22aef5c564fb7b5e9938343136a9cd6a2edb7b.yaml +22 -0
- data/bugs/issue-bf8697523c77c326e7e35fc82cf3dd739ae92310.yaml +27 -0
- data/bugs/issue-cdd4b4795f34d6ff46e56ece10f8216a4a5456b2.yaml +25 -0
- data/bugs/issue-d9bfb5581d745ef9deb3b9b2e08ef74d1cd43082.yaml +20 -0
- data/bugs/issue-e0ce2f687cc096f35715d28b0af88589f4ab6cc6.yaml +18 -0
- data/bugs/issue-e4b0aca4a10a574b333aeaecaaf221dbc5ed22c6.yaml +38 -0
- data/bugs/issue-f263746594b95ba778455730478ee8df60ee639d.yaml +22 -0
- data/bugs/project.yaml +72 -0
- data/builddeps.sh +102 -0
- data/fonts/Coolvetica.ttf +0 -0
- data/fonts/Lacuna.ttf +0 -0
- data/gemlib/shoes.rb +1 -0
- data/lib/shoes.rb +548 -0
- data/lib/shoes/cache.rb +54 -0
- data/lib/shoes/chipmunk.rb +35 -0
- data/lib/shoes/data.rb +39 -0
- data/lib/shoes/help.rb +468 -0
- data/lib/shoes/image.rb +25 -0
- data/lib/shoes/inspect.rb +128 -0
- data/lib/shoes/log.rb +48 -0
- data/lib/shoes/minitar.rb +986 -0
- data/lib/shoes/override.rb +38 -0
- data/lib/shoes/pack.rb +543 -0
- data/lib/shoes/search.rb +46 -0
- data/lib/shoes/setup.rb +329 -0
- data/lib/shoes/shy.rb +131 -0
- data/lib/shoes/shybuilder.rb +44 -0
- data/lib/shoes/version.rb +3 -0
- data/make/darwin/deps.vlc +12 -0
- data/make/darwin/dylibs.shoes +22 -0
- data/make/darwin/dylibs.video +11 -0
- data/make/darwin/env.rb +81 -0
- data/make/darwin/tasks.rb +105 -0
- data/make/linux/env.rb +65 -0
- data/make/linux/tasks.rb +61 -0
- data/make/make.rb +85 -0
- data/make/mingw/dlls +19 -0
- data/make/mingw/env.rb +69 -0
- data/make/mingw/tasks.rb +70 -0
- data/make/rakefile_common.rb +8 -0
- data/manual-snapshots/class-book.png +0 -0
- data/manual-snapshots/expert-definr.png +0 -0
- data/manual-snapshots/expert-funnies.png +0 -0
- data/manual-snapshots/expert-irb.png +0 -0
- data/manual-snapshots/expert-minesweeper.png +0 -0
- data/manual-snapshots/expert-othello.png +0 -0
- data/manual-snapshots/expert-pong.png +0 -0
- data/manual-snapshots/expert-tankspank.png +0 -0
- data/manual-snapshots/good-arc.png +0 -0
- data/manual-snapshots/good-clock.png +0 -0
- data/manual-snapshots/good-follow.png +0 -0
- data/manual-snapshots/good-reminder.png +0 -0
- data/manual-snapshots/good-vjot.png +0 -0
- data/manual-snapshots/simple-accordion.png +0 -0
- data/manual-snapshots/simple-anim-shapes.png +0 -0
- data/manual-snapshots/simple-anim-text.png +0 -0
- data/manual-snapshots/simple-arc.png +0 -0
- data/manual-snapshots/simple-bounce.png +0 -0
- data/manual-snapshots/simple-calc.png +0 -0
- data/manual-snapshots/simple-chipmunk.png +0 -0
- data/manual-snapshots/simple-control-sizes.png +0 -0
- data/manual-snapshots/simple-curve.png +0 -0
- data/manual-snapshots/simple-dialogs.png +0 -0
- data/manual-snapshots/simple-downloader.png +0 -0
- data/manual-snapshots/simple-draw.png +0 -0
- data/manual-snapshots/simple-editor.png +0 -0
- data/manual-snapshots/simple-form.png +0 -0
- data/manual-snapshots/simple-mask.png +0 -0
- data/manual-snapshots/simple-menu.png +0 -0
- data/manual-snapshots/simple-menu1.png +0 -0
- data/manual-snapshots/simple-rubygems.png +0 -0
- data/manual-snapshots/simple-slide.png +0 -0
- data/manual-snapshots/simple-sphere.png +0 -0
- data/manual-snapshots/simple-sqlite3.png +0 -0
- data/manual-snapshots/simple-timer.png +0 -0
- data/manual-snapshots/simple-video.png +0 -0
- data/platform/mac/Info.plist +55 -0
- data/platform/mac/build-deps.sh +658 -0
- data/platform/mac/command-manual.rb +1 -0
- data/platform/mac/deps-osx.patch +159 -0
- data/platform/mac/dmg_ds_store +0 -0
- data/platform/mac/pangorc +2 -0
- data/platform/mac/pkg-dmg +1447 -0
- data/platform/mac/shoes +31 -0
- data/platform/mac/shoes-launch +7 -0
- data/platform/mac/stub.m +178 -0
- data/platform/mac/version.plist +14 -0
- data/platform/msw/base.nsi +644 -0
- data/platform/msw/installer-1.bmp +0 -0
- data/platform/msw/installer-2.bmp +0 -0
- data/platform/msw/shoes.exe.manifest +17 -0
- data/platform/msw/shoes.ico +0 -0
- data/platform/msw/stub-inject.c +59 -0
- data/platform/msw/stub.c +271 -0
- data/platform/msw/stub32.h +14 -0
- data/platform/msw/stub32.rc +16 -0
- data/platform/nix/INSTALL +56 -0
- data/platform/nix/Makefile +144 -0
- data/platform/nix/shoes.launch +20 -0
- data/platform/skel.rb +27 -0
- data/rakefile_darwin.rb +7 -0
- data/rakefile_linux.rb +3 -0
- data/rakefile_mingw.rb +7 -0
- data/samples/class-book.rb +43 -0
- data/samples/class-book.yaml +387 -0
- data/samples/expert-definr.rb +23 -0
- data/samples/expert-funnies.rb +51 -0
- data/samples/expert-irb.rb +112 -0
- data/samples/expert-minesweeper.rb +267 -0
- data/samples/expert-othello.rb +319 -0
- data/samples/expert-pong.rb +62 -0
- data/samples/expert-tankspank.rb +385 -0
- data/samples/good-arc.rb +37 -0
- data/samples/good-clock.rb +51 -0
- data/samples/good-follow.rb +26 -0
- data/samples/good-reminder.rb +174 -0
- data/samples/good-vjot.rb +56 -0
- data/samples/simple-accordion.rb +75 -0
- data/samples/simple-anim-shapes.rb +17 -0
- data/samples/simple-anim-text.rb +13 -0
- data/samples/simple-arc.rb +23 -0
- data/samples/simple-bounce.rb +24 -0
- data/samples/simple-calc.rb +70 -0
- data/samples/simple-chipmunk.rb +26 -0
- data/samples/simple-control-sizes.rb +24 -0
- data/samples/simple-curve.rb +26 -0
- data/samples/simple-dialogs.rb +29 -0
- data/samples/simple-downloader.rb +27 -0
- data/samples/simple-draw.rb +13 -0
- data/samples/simple-editor.rb +28 -0
- data/samples/simple-form.rb +28 -0
- data/samples/simple-form.shy +0 -0
- data/samples/simple-mask.rb +21 -0
- data/samples/simple-menu.rb +31 -0
- data/samples/simple-menu1.rb +35 -0
- data/samples/simple-rubygems.rb +29 -0
- data/samples/simple-slide.rb +45 -0
- data/samples/simple-sphere.rb +28 -0
- data/samples/simple-sqlite3.rb +13 -0
- data/samples/simple-timer.rb +13 -0
- data/samples/simple-video.rb +13 -0
- data/shoes.gemspec +21 -0
- data/shoes/app.c +591 -0
- data/shoes/app.h +110 -0
- data/shoes/appwin32.h +13 -0
- data/shoes/appwin32.rc +28 -0
- data/shoes/canvas.c +2202 -0
- data/shoes/canvas.h +682 -0
- data/shoes/code.h +14 -0
- data/shoes/config.h +232 -0
- data/shoes/effects.c +243 -0
- data/shoes/effects.h +7 -0
- data/shoes/http.h +44 -0
- data/shoes/http/common.h +86 -0
- data/shoes/http/curl.c +259 -0
- data/shoes/http/nsurl.m +274 -0
- data/shoes/http/windownload.c +114 -0
- data/shoes/http/winhttp.c +216 -0
- data/shoes/http/winhttp.h +19 -0
- data/shoes/image.c +1020 -0
- data/shoes/internal.c +46 -0
- data/shoes/internal.h +63 -0
- data/shoes/native.h +110 -0
- data/shoes/native/cocoa.h +105 -0
- data/shoes/native/cocoa.m +1557 -0
- data/shoes/native/gtk.c +1257 -0
- data/shoes/native/windows.c +2392 -0
- data/shoes/ruby.c +5221 -0
- data/shoes/ruby.h +299 -0
- data/shoes/world.c +243 -0
- data/shoes/world.h +63 -0
- data/static/Shoes.icns +0 -0
- data/static/avatar.png +0 -0
- data/static/code_highlighter.js +188 -0
- data/static/code_highlighter_ruby.js +26 -0
- data/static/icon-debug.png +0 -0
- data/static/icon-error.png +0 -0
- data/static/icon-info.png +0 -0
- data/static/icon-warn.png +0 -0
- data/static/listbox_button1.png +0 -0
- data/static/listbox_button2.png +0 -0
- data/static/man-app.png +0 -0
- data/static/man-builds.png +0 -0
- data/static/man-builds1.png +0 -0
- data/static/man-editor-notepad.png +0 -0
- data/static/man-editor-osx.png +0 -0
- data/static/man-ele-background.png +0 -0
- data/static/man-ele-border.png +0 -0
- data/static/man-ele-button.png +0 -0
- data/static/man-ele-check.png +0 -0
- data/static/man-ele-editbox.png +0 -0
- data/static/man-ele-editline.png +0 -0
- data/static/man-ele-image.png +0 -0
- data/static/man-ele-listbox.png +0 -0
- data/static/man-ele-progress.png +0 -0
- data/static/man-ele-radio.png +0 -0
- data/static/man-ele-shape.png +0 -0
- data/static/man-ele-textblock.png +0 -0
- data/static/man-ele-video.png +0 -0
- data/static/man-intro-dmg.png +0 -0
- data/static/man-intro-exe.png +0 -0
- data/static/man-look-tiger.png +0 -0
- data/static/man-look-ubuntu.png +0 -0
- data/static/man-look-vista.png +0 -0
- data/static/man-run-osx.png +0 -0
- data/static/man-run-vista.png +0 -0
- data/static/man-run-xp.png +0 -0
- data/static/man-shot1.png +0 -0
- data/static/manual-en.txt +3531 -0
- data/static/manual-ja.txt +2825 -0
- data/static/manual.css +167 -0
- data/static/menu-corner1.png +0 -0
- data/static/menu-corner2.png +0 -0
- data/static/menu-gray.png +0 -0
- data/static/menu-left.png +0 -0
- data/static/menu-right.png +0 -0
- data/static/menu-top.png +0 -0
- data/static/shoes-dmg.jpg +0 -0
- data/static/shoes-icon-blue.png +0 -0
- data/static/shoes-icon.png +0 -0
- data/static/shoes-manual-apps.gif +0 -0
- data/static/shoes_main_window.png +0 -0
- data/static/stripe.png +0 -0
- data/static/stubs/blank.exe +0 -0
- data/static/stubs/blank.hfz +0 -0
- data/static/stubs/blank.run +375 -0
- data/static/stubs/cocoa-install +0 -0
- data/static/stubs/sh-install +49 -0
- data/static/stubs/shoes-stub-inject.exe +0 -0
- data/static/stubs/shoes-stub.exe +0 -0
- data/static/tutor-back.png +0 -0
- data/test/shoes_test.rb +8 -0
- data/test/test_helper.rb +25 -0
- data/use-deps +12 -0
- data/use-tmp-dep +8 -0
- metadata +509 -0
data/shoes/code.h
ADDED
data/shoes/config.h
ADDED
@@ -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
|
data/shoes/effects.c
ADDED
@@ -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
|
+
|