wrb 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (271) hide show
  1. checksums.yaml +7 -0
  2. data/README +28 -0
  3. data/Rakefile +66 -0
  4. data/bin/wrb +41 -0
  5. data/bin/wrb.bat +6 -0
  6. data/ext/rwin/aatree.c +192 -0
  7. data/ext/rwin/aatree.h +55 -0
  8. data/ext/rwin/extconf.rb +47 -0
  9. data/ext/rwin/rw_api.c +2058 -0
  10. data/ext/rwin/rw_devices.c +215 -0
  11. data/ext/rwin/rw_gdiplus.h +278 -0
  12. data/ext/rwin/rw_graphics.c +1583 -0
  13. data/ext/rwin/rw_resources.c +1988 -0
  14. data/ext/rwin/rw_ubfuncs.c +281 -0
  15. data/ext/rwin/rw_windows.c +1936 -0
  16. data/ext/rwin/rwin.c +451 -0
  17. data/ext/rwin/rwin.h +442 -0
  18. data/lib/rwin.rb +820 -0
  19. data/lib/wrb.rb +20 -0
  20. data/lib/wrb/applications/frmdesigner/angle.cur +0 -0
  21. data/lib/wrb/applications/frmdesigner/angle2.cur +0 -0
  22. data/lib/wrb/applications/frmdesigner/controls/Button.bmp +0 -0
  23. data/lib/wrb/applications/frmdesigner/controls/Button.rb +34 -0
  24. data/lib/wrb/applications/frmdesigner/controls/Checkbox.bmp +0 -0
  25. data/lib/wrb/applications/frmdesigner/controls/Checkbox.rb +10 -0
  26. data/lib/wrb/applications/frmdesigner/controls/Combobox.bmp +0 -0
  27. data/lib/wrb/applications/frmdesigner/controls/Combobox.rb +88 -0
  28. data/lib/wrb/applications/frmdesigner/controls/ComboboxEx.rb +97 -0
  29. data/lib/wrb/applications/frmdesigner/controls/Comboboxex.bmp +0 -0
  30. data/lib/wrb/applications/frmdesigner/controls/DateTimePicker.bmp +0 -0
  31. data/lib/wrb/applications/frmdesigner/controls/DateTimePicker.rb +11 -0
  32. data/lib/wrb/applications/frmdesigner/controls/Edit.bmp +0 -0
  33. data/lib/wrb/applications/frmdesigner/controls/Edit.rb +8 -0
  34. data/lib/wrb/applications/frmdesigner/controls/Groupbox.bmp +0 -0
  35. data/lib/wrb/applications/frmdesigner/controls/Groupbox.rb +9 -0
  36. data/lib/wrb/applications/frmdesigner/controls/Hotkeyctrl.bmp +0 -0
  37. data/lib/wrb/applications/frmdesigner/controls/Hotkeyctrl.rb +9 -0
  38. data/lib/wrb/applications/frmdesigner/controls/Imagelist.bmp +0 -0
  39. data/lib/wrb/applications/frmdesigner/controls/Imagelist.rb +115 -0
  40. data/lib/wrb/applications/frmdesigner/controls/Listbox.bmp +0 -0
  41. data/lib/wrb/applications/frmdesigner/controls/Listbox.rb +77 -0
  42. data/lib/wrb/applications/frmdesigner/controls/Listview.bmp +0 -0
  43. data/lib/wrb/applications/frmdesigner/controls/Listview.rb +157 -0
  44. data/lib/wrb/applications/frmdesigner/controls/Menu.bmp +0 -0
  45. data/lib/wrb/applications/frmdesigner/controls/Menu.rb +198 -0
  46. data/lib/wrb/applications/frmdesigner/controls/Menubar.bmp +0 -0
  47. data/lib/wrb/applications/frmdesigner/controls/Menubar.rb +9 -0
  48. data/lib/wrb/applications/frmdesigner/controls/MonthCalender.bmp +0 -0
  49. data/lib/wrb/applications/frmdesigner/controls/Monthcalender.rb +9 -0
  50. data/lib/wrb/applications/frmdesigner/controls/Panel.bmp +0 -0
  51. data/lib/wrb/applications/frmdesigner/controls/Panel.rb +30 -0
  52. data/lib/wrb/applications/frmdesigner/controls/Progressbar.rb +10 -0
  53. data/lib/wrb/applications/frmdesigner/controls/Radiobutton.bmp +0 -0
  54. data/lib/wrb/applications/frmdesigner/controls/Radiobutton.rb +13 -0
  55. data/lib/wrb/applications/frmdesigner/controls/Rebar.bmp +0 -0
  56. data/lib/wrb/applications/frmdesigner/controls/Rebar.rb +162 -0
  57. data/lib/wrb/applications/frmdesigner/controls/Splitter.bmp +0 -0
  58. data/lib/wrb/applications/frmdesigner/controls/Splitter.rb +66 -0
  59. data/lib/wrb/applications/frmdesigner/controls/Static.bmp +0 -0
  60. data/lib/wrb/applications/frmdesigner/controls/Static.rb +9 -0
  61. data/lib/wrb/applications/frmdesigner/controls/Statusbar.bmp +0 -0
  62. data/lib/wrb/applications/frmdesigner/controls/Statusbar.rb +103 -0
  63. data/lib/wrb/applications/frmdesigner/controls/Tabctrl.bmp +0 -0
  64. data/lib/wrb/applications/frmdesigner/controls/Tabctrl.rb +136 -0
  65. data/lib/wrb/applications/frmdesigner/controls/Timer.bmp +0 -0
  66. data/lib/wrb/applications/frmdesigner/controls/Timer.rb +36 -0
  67. data/lib/wrb/applications/frmdesigner/controls/Toolbar.bmp +0 -0
  68. data/lib/wrb/applications/frmdesigner/controls/Toolbar.rb +165 -0
  69. data/lib/wrb/applications/frmdesigner/controls/Trackbar.bmp +0 -0
  70. data/lib/wrb/applications/frmdesigner/controls/Trackbar.rb +34 -0
  71. data/lib/wrb/applications/frmdesigner/controls/Treeview.bmp +0 -0
  72. data/lib/wrb/applications/frmdesigner/controls/Treeview.rb +107 -0
  73. data/lib/wrb/applications/frmdesigner/controls/Updown.bmp +0 -0
  74. data/lib/wrb/applications/frmdesigner/controls/Updown.rb +31 -0
  75. data/lib/wrb/applications/frmdesigner/controls/default.bmp +0 -0
  76. data/lib/wrb/applications/frmdesigner/controls/progressbar.bmp +0 -0
  77. data/lib/wrb/applications/frmdesigner/controls/unselect.bmp +0 -0
  78. data/lib/wrb/applications/frmdesigner/fddialogs.rb +87 -0
  79. data/lib/wrb/applications/frmdesigner/fdesign.rb +1315 -0
  80. data/lib/wrb/applications/frmdesigner/fdmodules.rb +1394 -0
  81. data/lib/wrb/applications/frmdesigner/fdparseform.rb +197 -0
  82. data/lib/wrb/applications/frmdesigner/img13.bmp +0 -0
  83. data/lib/wrb/base.rb +1294 -0
  84. data/lib/wrb/combocommon.rb +77 -0
  85. data/lib/wrb/commctrlconst.rb +139 -0
  86. data/lib/wrb/commdlg.rb +77 -0
  87. data/lib/wrb/components/animate.rb +114 -0
  88. data/lib/wrb/components/bitmap.rb +116 -0
  89. data/lib/wrb/components/button.rb +134 -0
  90. data/lib/wrb/components/canvas.rb +266 -0
  91. data/lib/wrb/components/checkbox.rb +118 -0
  92. data/lib/wrb/components/choosecolordlg.rb +87 -0
  93. data/lib/wrb/components/choosefontdlg.rb +142 -0
  94. data/lib/wrb/components/clipboard.rb +174 -0
  95. data/lib/wrb/components/combobox.rb +282 -0
  96. data/lib/wrb/components/comboboxex.rb +574 -0
  97. data/lib/wrb/components/cursor.rb +91 -0
  98. data/lib/wrb/components/datetimepicker.rb +197 -0
  99. data/lib/wrb/components/ddeclient.rb +180 -0
  100. data/lib/wrb/components/ddeserver.rb +131 -0
  101. data/lib/wrb/components/dialog.rb +228 -0
  102. data/lib/wrb/components/edit.rb +412 -0
  103. data/lib/wrb/components/font.rb +35 -0
  104. data/lib/wrb/components/form.rb +65 -0
  105. data/lib/wrb/components/groupbox.rb +122 -0
  106. data/lib/wrb/components/header.rb +479 -0
  107. data/lib/wrb/components/hotkeyctrl.rb +72 -0
  108. data/lib/wrb/components/icon.rb +109 -0
  109. data/lib/wrb/components/imagelist.rb +396 -0
  110. data/lib/wrb/components/inifile.rb +97 -0
  111. data/lib/wrb/components/listbox.rb +149 -0
  112. data/lib/wrb/components/listview.rb +1467 -0
  113. data/lib/wrb/components/menu.rb +592 -0
  114. data/lib/wrb/components/menubar.rb +84 -0
  115. data/lib/wrb/components/monthcalender.rb +164 -0
  116. data/lib/wrb/components/openfilenamedlg.rb +147 -0
  117. data/lib/wrb/components/pager.rb +199 -0
  118. data/lib/wrb/components/panel.rb +103 -0
  119. data/lib/wrb/components/picture.rb +55 -0
  120. data/lib/wrb/components/printdlg.rb +148 -0
  121. data/lib/wrb/components/printdlgex.rb +117 -0
  122. data/lib/wrb/components/printer.rb +97 -0
  123. data/lib/wrb/components/progressbar.rb +140 -0
  124. data/lib/wrb/components/radiobutton.rb +49 -0
  125. data/lib/wrb/components/rebar.rb +830 -0
  126. data/lib/wrb/components/registry.rb +408 -0
  127. data/lib/wrb/components/richedit.rb +1181 -0
  128. data/lib/wrb/components/savefilenamedlg.rb +27 -0
  129. data/lib/wrb/components/scintilla.rb +1298 -0
  130. data/lib/wrb/components/scrollbar.rb +239 -0
  131. data/lib/wrb/components/splitter.rb +494 -0
  132. data/lib/wrb/components/static.rb +198 -0
  133. data/lib/wrb/components/statusbar.rb +490 -0
  134. data/lib/wrb/components/tabctrl.rb +686 -0
  135. data/lib/wrb/components/timer.rb +117 -0
  136. data/lib/wrb/components/toolbar.rb +1107 -0
  137. data/lib/wrb/components/tooltip.rb +651 -0
  138. data/lib/wrb/components/trackbar.rb +298 -0
  139. data/lib/wrb/components/treeview.rb +845 -0
  140. data/lib/wrb/components/updown.rb +198 -0
  141. data/lib/wrb/ddeml.rb +241 -0
  142. data/lib/wrb/documents/animate.html +46 -0
  143. data/lib/wrb/documents/bitmap.html +69 -0
  144. data/lib/wrb/documents/button.html +78 -0
  145. data/lib/wrb/documents/canvas.html +137 -0
  146. data/lib/wrb/documents/checkbox.html +77 -0
  147. data/lib/wrb/documents/choosecolordlg.html +29 -0
  148. data/lib/wrb/documents/choosefontdlg.html +31 -0
  149. data/lib/wrb/documents/clipboard.html +31 -0
  150. data/lib/wrb/documents/combobox.html +117 -0
  151. data/lib/wrb/documents/comboboxex.html +139 -0
  152. data/lib/wrb/documents/control.html +53 -0
  153. data/lib/wrb/documents/cursor.html +45 -0
  154. data/lib/wrb/documents/datetimepicker.html +70 -0
  155. data/lib/wrb/documents/ddeclient.html +33 -0
  156. data/lib/wrb/documents/ddeserver.html +26 -0
  157. data/lib/wrb/documents/dialog.html +78 -0
  158. data/lib/wrb/documents/edit.html +169 -0
  159. data/lib/wrb/documents/empty.html +11 -0
  160. data/lib/wrb/documents/favicon.png +0 -0
  161. data/lib/wrb/documents/font.html +38 -0
  162. data/lib/wrb/documents/form.html +63 -0
  163. data/lib/wrb/documents/groupbox.html +57 -0
  164. data/lib/wrb/documents/header.html +85 -0
  165. data/lib/wrb/documents/hotkeyctrl.html +42 -0
  166. data/lib/wrb/documents/icon.html +45 -0
  167. data/lib/wrb/documents/imagelist.html +101 -0
  168. data/lib/wrb/documents/images/button.png +0 -0
  169. data/lib/wrb/documents/images/checkbox.png +0 -0
  170. data/lib/wrb/documents/images/combobox.png +0 -0
  171. data/lib/wrb/documents/images/comboboxex.png +0 -0
  172. data/lib/wrb/documents/images/datetimepicker.png +0 -0
  173. data/lib/wrb/documents/images/edit.png +0 -0
  174. data/lib/wrb/documents/images/groupbox.png +0 -0
  175. data/lib/wrb/documents/images/hotkeyctrl.png +0 -0
  176. data/lib/wrb/documents/images/listbox.png +0 -0
  177. data/lib/wrb/documents/images/listview.png +0 -0
  178. data/lib/wrb/documents/images/menu.png +0 -0
  179. data/lib/wrb/documents/images/menubar.png +0 -0
  180. data/lib/wrb/documents/images/monthcalender.png +0 -0
  181. data/lib/wrb/documents/images/progressbar.png +0 -0
  182. data/lib/wrb/documents/images/radiobutton.png +0 -0
  183. data/lib/wrb/documents/images/rebar.png +0 -0
  184. data/lib/wrb/documents/images/richedit.png +0 -0
  185. data/lib/wrb/documents/images/splitter.png +0 -0
  186. data/lib/wrb/documents/images/static.png +0 -0
  187. data/lib/wrb/documents/images/statusbar.png +0 -0
  188. data/lib/wrb/documents/images/tabctrl.png +0 -0
  189. data/lib/wrb/documents/images/toolbar.png +0 -0
  190. data/lib/wrb/documents/images/tooltip.png +0 -0
  191. data/lib/wrb/documents/images/trackbar.png +0 -0
  192. data/lib/wrb/documents/images/treeview.png +0 -0
  193. data/lib/wrb/documents/images/updown.png +0 -0
  194. data/lib/wrb/documents/index.html +155 -0
  195. data/lib/wrb/documents/inifile.html +36 -0
  196. data/lib/wrb/documents/license.txt +22 -0
  197. data/lib/wrb/documents/listbox.html +96 -0
  198. data/lib/wrb/documents/listview.html +277 -0
  199. data/lib/wrb/documents/make_doc.rb +596 -0
  200. data/lib/wrb/documents/menu.html +144 -0
  201. data/lib/wrb/documents/menubar.html +54 -0
  202. data/lib/wrb/documents/monthcalender.html +48 -0
  203. data/lib/wrb/documents/openfilenamedlg.html +36 -0
  204. data/lib/wrb/documents/pager.html +63 -0
  205. data/lib/wrb/documents/panel.html +32 -0
  206. data/lib/wrb/documents/picture.html +48 -0
  207. data/lib/wrb/documents/printdlg.html +35 -0
  208. data/lib/wrb/documents/printdlgex.html +35 -0
  209. data/lib/wrb/documents/printer.html +40 -0
  210. data/lib/wrb/documents/progressbar.html +69 -0
  211. data/lib/wrb/documents/radiobutton.html +51 -0
  212. data/lib/wrb/documents/rebar.html +143 -0
  213. data/lib/wrb/documents/registry.html +36 -0
  214. data/lib/wrb/documents/richedit.html +232 -0
  215. data/lib/wrb/documents/samples/editimg.bmp +0 -0
  216. data/lib/wrb/documents/samples/editimg.iml +0 -0
  217. data/lib/wrb/documents/samples/fileimg.bmp +0 -0
  218. data/lib/wrb/documents/samples/fileimg.iml +0 -0
  219. data/lib/wrb/documents/samples/sample_button.rb +21 -0
  220. data/lib/wrb/documents/samples/sample_checkbox.rb +18 -0
  221. data/lib/wrb/documents/samples/sample_combobox.rb +18 -0
  222. data/lib/wrb/documents/samples/sample_comboboxex.rb +23 -0
  223. data/lib/wrb/documents/samples/sample_datetimepicker.rb +11 -0
  224. data/lib/wrb/documents/samples/sample_edit.rb +25 -0
  225. data/lib/wrb/documents/samples/sample_groupbox.rb +19 -0
  226. data/lib/wrb/documents/samples/sample_hotkeyctrl.rb +12 -0
  227. data/lib/wrb/documents/samples/sample_listbox.rb +12 -0
  228. data/lib/wrb/documents/samples/sample_listview.rb +32 -0
  229. data/lib/wrb/documents/samples/sample_menu.rb +21 -0
  230. data/lib/wrb/documents/samples/sample_menubar.rb +23 -0
  231. data/lib/wrb/documents/samples/sample_monthcalender.rb +11 -0
  232. data/lib/wrb/documents/samples/sample_progressbar.rb +14 -0
  233. data/lib/wrb/documents/samples/sample_radiobutton.rb +14 -0
  234. data/lib/wrb/documents/samples/sample_rebar.rb +25 -0
  235. data/lib/wrb/documents/samples/sample_richedit.rb +60 -0
  236. data/lib/wrb/documents/samples/sample_splitter.rb +33 -0
  237. data/lib/wrb/documents/samples/sample_static.rb +15 -0
  238. data/lib/wrb/documents/samples/sample_statusbar.rb +17 -0
  239. data/lib/wrb/documents/samples/sample_tabctrl.rb +19 -0
  240. data/lib/wrb/documents/samples/sample_toolbar.rb +29 -0
  241. data/lib/wrb/documents/samples/sample_tooltip.rb +50 -0
  242. data/lib/wrb/documents/samples/sample_trackbar.rb +30 -0
  243. data/lib/wrb/documents/samples/sample_treeview.rb +19 -0
  244. data/lib/wrb/documents/samples/sample_updown.rb +18 -0
  245. data/lib/wrb/documents/samples/sampleimg16.iml +0 -0
  246. data/lib/wrb/documents/samples/sampleimg32.iml +0 -0
  247. data/lib/wrb/documents/samples/samplemg16.png +0 -0
  248. data/lib/wrb/documents/samples/samplemg32.png +0 -0
  249. data/lib/wrb/documents/samples/wrb.ico +0 -0
  250. data/lib/wrb/documents/savefilenamedlg.html +19 -0
  251. data/lib/wrb/documents/scrollbar.html +60 -0
  252. data/lib/wrb/documents/splitter.html +96 -0
  253. data/lib/wrb/documents/static.html +84 -0
  254. data/lib/wrb/documents/statusbar.html +110 -0
  255. data/lib/wrb/documents/tabctrl.html +151 -0
  256. data/lib/wrb/documents/timer.html +43 -0
  257. data/lib/wrb/documents/toolbar.html +181 -0
  258. data/lib/wrb/documents/tooltip.html +131 -0
  259. data/lib/wrb/documents/trackbar.html +107 -0
  260. data/lib/wrb/documents/treeview.html +210 -0
  261. data/lib/wrb/documents/updown.html +85 -0
  262. data/lib/wrb/documents/wincontrol.html +258 -0
  263. data/lib/wrb/documents/window.html +499 -0
  264. data/lib/wrb/documents/wrb.css +228 -0
  265. data/lib/wrb/gmem.rb +26 -0
  266. data/lib/wrb/imecommon.rb +59 -0
  267. data/lib/wrb/listcommon.rb +185 -0
  268. data/lib/wrb/lzss.rb +126 -0
  269. data/lib/wrb/scrollinfo.rb +142 -0
  270. data/lib/wrb/toplevelcommon.rb +634 -0
  271. metadata +315 -0
@@ -0,0 +1,1583 @@
1
+ /*
2
+ # Project WRB was forked from Project VisualuRuby(temp-name).
3
+ # Author of this project: BANJO Koyu <banjokoyu at gmail.com>
4
+ # The URL of this project: https://bitbucket.org/wrb/
5
+ #
6
+ # This is a ext-library part of WRB.
7
+ */
8
+
9
+ #include "rwin.h"
10
+
11
+ /* Canvas */
12
+ VALUE cRwCanvas;
13
+
14
+ void RwCanvas_free(void *ptr){
15
+ if(ptr){
16
+ RwCanvas *cv = ptr;
17
+ if(cv->hwnd && cv->hdc) ReleaseDC(cv->hwnd, cv->hdc);
18
+ free(cv);
19
+ }
20
+ }
21
+
22
+
23
+ #ifdef HAVE_TYPE_RB_DATA_TYPE_T
24
+ static size_t
25
+ swdc_memsize(const void *ptr){
26
+ return ptr ? sizeof(RwCanvas) : 0;
27
+ }
28
+
29
+ const rb_data_type_t
30
+ rwcanvas_data_type = {
31
+ "Canvas", {NULL, RwCanvas_free, swdc_memsize}, NULL, NULL
32
+ };
33
+
34
+ #else
35
+ #error "Need RB_DATA_TYPE_T"
36
+ #endif
37
+
38
+ static VALUE
39
+ rwcvs_alloc(VALUE klass){
40
+ RwCanvas *cv;
41
+ VALUE obj = RwCanvas_Data_Make_Struct(klass, cv);
42
+ cv->hdc = 0;
43
+ cv->hwnd = 0;
44
+ cv->rx = 1.0;
45
+ cv->ry = 1.0;
46
+ return obj;
47
+ }
48
+
49
+ VALUE /* RwWindow uses this */
50
+ rwcvs_new_from_hdc(VALUE klass, HDC hdc){
51
+ RwCanvas *cv;
52
+ VALUE obj = RwCanvas_Data_Make_Struct(klass, cv);
53
+ cv->hwnd = 0;
54
+ cv->hdc = hdc;
55
+ cv->rx = 1.0;
56
+ cv->ry = 1.0;
57
+ return obj;
58
+ }
59
+
60
+ static VALUE
61
+ rwcvs1_draw(VALUE klass, VALUE arg){
62
+ RwCanvas *cv;
63
+ RwWindow *rw;
64
+ VALUE obj = RwCanvas_Data_Make_Struct(klass, cv);
65
+ switch (TYPE(arg)){
66
+ case T_FIXNUM:
67
+ case T_BIGNUM:
68
+ cv->hdc = (HDC)NUM2HANDLE(arg);
69
+ break;
70
+ default:
71
+ RwWindow_Data_Get_Struct(arg, rw);
72
+ RwCheckWindow(rw);
73
+ cv->hwnd = rw->hwnd;
74
+ cv->hdc = GetDC(rw->hwnd);
75
+ break;
76
+ }
77
+ if(!rb_block_given_p()){
78
+ rb_raise(rb_eArgError, "Need block");
79
+ } else{
80
+ rb_yield(obj);
81
+ if (cv->hwnd){
82
+ ReleaseDC(cv->hwnd, cv->hdc);
83
+ cv->hdc = NULL;
84
+ }
85
+ }
86
+ return obj;
87
+ }
88
+
89
+ static VALUE
90
+ rwcvs_initialize(VALUE self, VALUE arg){
91
+ RwWindow *rw;
92
+ RwCanvas *cv = DATA_PTR(self);
93
+ switch (TYPE(arg)){
94
+ case T_FIXNUM:
95
+ case T_BIGNUM:
96
+ cv->hdc = (HDC)NUM2HANDLE(arg);
97
+ break;
98
+ default:
99
+ RwWindow_Data_Get_Struct(arg, rw);
100
+ RwCheckWindow(rw);
101
+ cv->hwnd = rw->hwnd;
102
+ cv->hdc = GetDC(rw->hwnd);
103
+ break;
104
+ }
105
+ return self;
106
+ }
107
+
108
+ static VALUE
109
+ rwcvs_release(VALUE self){
110
+ RwCanvas *cv = DATA_PTR(self);
111
+ if(cv->hwnd && cv->hdc){
112
+ ReleaseDC(cv->hwnd, cv->hdc);
113
+ cv->hdc = NULL;
114
+ return Qtrue;
115
+ }
116
+ return Qfalse;
117
+ }
118
+
119
+ static VALUE
120
+ rwcvs_gethdc(VALUE self){
121
+ RwCanvas *cv = DATA_PTR(self);
122
+ return INT2NUM((ULONG_PTR)cv->hdc);
123
+ }
124
+
125
+ /* Lines */
126
+ static VALUE
127
+ rwcvs_anglearc(VALUE self, VALUE v_x, VALUE v_y,
128
+ VALUE v_radius, VALUE v_startangle, VALUE v_sweepangle){
129
+ int r;
130
+ RwCanvas *cv = DATA_PTR(self);
131
+ r = AngleArc(cv->hdc, FIX2INT(v_x), FIX2INT(v_y), FIX2INT(v_radius),
132
+ NUM2DBL(v_startangle), NUM2DBL(v_sweepangle));
133
+ return r ? Qtrue : Qfalse;
134
+ }
135
+
136
+ static VALUE
137
+ rwcvs_arc(VALUE self, VALUE v_left, VALUE v_top, VALUE v_right, VALUE v_bottom,
138
+ VALUE v_xstartarc, VALUE v_ystartarc, VALUE v_xendarc, VALUE v_yendarc){
139
+ int r;
140
+ RwCanvas *cv = DATA_PTR(self);
141
+ r = Arc(cv->hdc, FIX2INT(v_left), FIX2INT(v_top), FIX2INT(v_right), FIX2INT(v_bottom),
142
+ FIX2INT(v_xstartarc), FIX2INT(v_ystartarc), FIX2INT(v_xendarc), FIX2INT(v_yendarc));
143
+ return r ? Qtrue : Qfalse;
144
+ }
145
+
146
+ static VALUE
147
+ rwcvs_arcto(VALUE self, VALUE v_left, VALUE v_top, VALUE v_right, VALUE v_bottom,
148
+ VALUE v_xradial1, VALUE v_yradial1, VALUE v_xradial2, VALUE v_yrasial2){
149
+ int r;
150
+ RwCanvas *cv = DATA_PTR(self);
151
+ r = ArcTo(cv->hdc, FIX2INT(v_left), FIX2INT(v_top), FIX2INT(v_right), FIX2INT(v_bottom),
152
+ FIX2INT(v_xradial1), FIX2INT(v_yradial1), FIX2INT(v_xradial2), FIX2INT(v_yrasial2));
153
+ return r ? Qtrue : Qfalse;
154
+ }
155
+
156
+ static VALUE
157
+ rwcvs_getarcdir(VALUE self){
158
+ RwCanvas *cv = DATA_PTR(self);
159
+ return INT2FIX(GetArcDirection(cv->hdc));
160
+ }
161
+
162
+ static VALUE
163
+ rwcvs_moveto(VALUE self, VALUE v_x, VALUE v_y){
164
+ POINT pt;
165
+ RwCanvas *cv = DATA_PTR(self);
166
+ MoveToEx(cv->hdc, FIX2INT(v_x), FIX2INT(v_y), &pt);
167
+ return rb_ary_new3(2, INT2FIX(pt.x), INT2FIX(pt.y));
168
+ }
169
+
170
+ static VALUE
171
+ rwcvs_lineto(VALUE self, VALUE v_x, VALUE v_y){
172
+ int r;
173
+ RwCanvas *cv = DATA_PTR(self);
174
+ r = LineTo(cv->hdc, FIX2INT(v_x), FIX2INT(v_y));
175
+ return r ? Qtrue : Qfalse;
176
+ }
177
+
178
+ static VALUE
179
+ rwcvs_polybezier(int argc, VALUE* argv, VALUE self){
180
+ int r = 0;
181
+ RwCanvas *cv = DATA_PTR(self);
182
+ if (argc > 2){
183
+ int i;
184
+ POINT *pts = alloca(argc*sizeof(POINT));
185
+ for (i=0; i<argc; i++){
186
+ VALUE ar = argv[i];
187
+ pts[i].x = FIX2INT(rb_ary_entry(ar, 0));
188
+ pts[i].y = FIX2INT(rb_ary_entry(ar, 1));
189
+ }
190
+ r = PolyBezier(cv->hdc, (POINT*)&pts, (DWORD)argc);
191
+ }
192
+ return r ? Qtrue : Qfalse;
193
+ }
194
+
195
+ static VALUE
196
+ rwcvs_polybezierto(int argc, VALUE* argv, VALUE self){
197
+ int r = 0;
198
+ RwCanvas *cv = DATA_PTR(self);
199
+ if (argc > 2){
200
+ int i;
201
+ POINT *pts = alloca(argc*sizeof(POINT));
202
+ for (i=0; i<argc; i++){
203
+ VALUE ar = argv[i];
204
+ pts[i].x = FIX2INT(rb_ary_entry(ar, 0));
205
+ pts[i].y = FIX2INT(rb_ary_entry(ar, 1));
206
+ }
207
+ r = PolyBezierTo(cv->hdc, (POINT*)&pts, (DWORD)argc);
208
+ }
209
+ return r ? Qtrue : Qfalse;
210
+ }
211
+
212
+ static VALUE
213
+ rwcvs_polydraw(int argc, VALUE* argv, VALUE self){
214
+ int r = 0;
215
+ RwCanvas *cv = DATA_PTR(self);
216
+ if (argc > 0){
217
+ int i;
218
+ POINT *pts = alloca(argc*sizeof(POINT));
219
+ BYTE *types = alloca(argc);
220
+ for (i=0; i<argc; i++){
221
+ VALUE ar = argv[i];
222
+ pts[i].x = FIX2INT(rb_ary_entry(ar, 0));
223
+ pts[i].y = FIX2INT(rb_ary_entry(ar, 1));
224
+ types[i] = (BYTE)FIX2INT(rb_ary_entry(ar, 2));
225
+ }
226
+ r = PolyDraw(cv->hdc, (POINT*)&pts, (BYTE*)&types, (DWORD)argc);
227
+ }
228
+ return r ? Qtrue : Qfalse;
229
+ }
230
+
231
+ static VALUE
232
+ rwcvs_polyline(int argc, VALUE* argv, VALUE self){
233
+ int r = 0;
234
+ RwCanvas *cv = DATA_PTR(self);
235
+ if (argc>0){
236
+ int i;
237
+ POINT *pts = alloca(argc*sizeof(POINT));
238
+ for (i=0; i<argc; i++){
239
+ VALUE ar = argv[i];
240
+ pts[i].x = FIX2INT(rb_ary_entry(ar, 0));
241
+ pts[i].y = FIX2INT(rb_ary_entry(ar, 1));
242
+ }
243
+ r = Polyline(cv->hdc, (POINT*)&pts, argc);
244
+ }
245
+ return r ? Qtrue : Qfalse;
246
+ }
247
+
248
+ static VALUE
249
+ rwcvs_polylineto(int argc, VALUE* argv, VALUE self){
250
+ int r = 0;
251
+ RwCanvas *cv = DATA_PTR(self);
252
+ if (argc>0){
253
+ int i;
254
+ POINT *pts = alloca(argc*sizeof(POINT));
255
+ for (i=0; i<argc; i++){
256
+ VALUE ar = argv[i];
257
+ pts[i].x = FIX2INT(rb_ary_entry(ar, 0));
258
+ pts[i].y = FIX2INT(rb_ary_entry(ar, 1));
259
+ }
260
+ r = PolylineTo(cv->hdc, (POINT*)&pts, argc);
261
+ }
262
+ return r ? Qtrue : Qfalse;
263
+ }
264
+
265
+ static VALUE
266
+ rwcvs_polypolyline(int argc, VALUE* argv, VALUE self){
267
+ if(argc > 0){
268
+ int i;
269
+ int *polycounts = alloca(argc*sizeof(int));
270
+ int npoints = 0;
271
+ RwCanvas *cv = DATA_PTR(self);
272
+ for (i=0; i<argc; i++){
273
+ polycounts[i] = RARRAY_LEN(argv[i]);
274
+ npoints += polycounts[i];
275
+ }
276
+ if(npoints){
277
+ int r;
278
+ POINT *pts = alloca(npoints*sizeof(POINT));
279
+ int n = 0;
280
+ for (i=0; i<argc; i++){
281
+ int j;
282
+ VALUE ar = argv[i];
283
+ for (j=0; j<polycounts[i]; j++){
284
+ VALUE a = rb_ary_entry(ar, j);
285
+ pts[n].x = FIX2INT(rb_ary_entry(a, 0));
286
+ pts[n].y = FIX2INT(rb_ary_entry(a, 1));
287
+ n++;
288
+ }
289
+ }
290
+
291
+ r = PolyPolyline(cv->hdc, (POINT*)&pts, (DWORD*)&polycounts, argc);
292
+ return r ? Qtrue : Qfalse;
293
+ }
294
+ }
295
+ return Qfalse;
296
+ }
297
+
298
+ static VALUE
299
+ rwcvs_setarcdir(VALUE self, VALUE v_arcdir){
300
+ int r;
301
+ RwCanvas *cv = DATA_PTR(self);
302
+ r = SetArcDirection(cv->hdc, FIX2INT(v_arcdir));
303
+ return INT2FIX(r);
304
+ }
305
+
306
+ /* Filled Shapes */
307
+
308
+ static VALUE
309
+ rwcvs_chord(VALUE self, VALUE v_left, VALUE v_top, VALUE v_right, VALUE v_bottom,
310
+ VALUE v_xradial1, VALUE v_yradial1, VALUE v_xradial2, VALUE v_yradial2){
311
+ int r;
312
+ RwCanvas *cv = DATA_PTR(self);
313
+ r = Chord(cv->hdc, FIX2INT(v_left), FIX2INT(v_top), FIX2INT(v_right), FIX2INT(v_bottom),
314
+ FIX2INT(v_xradial1), FIX2INT(v_yradial1), FIX2INT(v_xradial2), FIX2INT(v_yradial2));
315
+ return r ? Qtrue : Qfalse;
316
+ }
317
+
318
+ static VALUE
319
+ rwcvs_ellipse(VALUE self, VALUE v_left, VALUE v_top, VALUE v_right, VALUE v_bottom){
320
+ int r;
321
+ RwCanvas *cv = DATA_PTR(self);
322
+ r = Ellipse(cv->hdc, FIX2INT(v_left), FIX2INT(v_top), FIX2INT(v_right), FIX2INT(v_bottom));
323
+ return r ? Qtrue : Qfalse;
324
+ }
325
+
326
+ static VALUE
327
+ rwcvs_fillrect(VALUE self, VALUE v_left, VALUE v_top, VALUE v_right, VALUE v_bottom,
328
+ VALUE v_brush){
329
+ int r;
330
+ RECT rct;
331
+ HBRUSH hbrush;
332
+ RwCanvas *cv = DATA_PTR(self);
333
+ rct.left = FIX2INT(v_left);
334
+ rct.top = FIX2INT(v_top);
335
+ rct.right = FIX2INT(v_right);
336
+ rct.bottom = FIX2INT(v_bottom);
337
+ if(rb_typeddata_is_kind_of(v_brush, &rwbrush_data_type)){
338
+ RwBrush *rb;
339
+ RwBrush_Data_Get_Struct(v_brush, rb);
340
+ hbrush = rb->hbrush;
341
+ } else {
342
+ hbrush = (HBRUSH)NUM2HANDLE(v_brush);
343
+ }
344
+ r = FillRect(cv->hdc, &rct, hbrush);
345
+ return r ? Qtrue : Qfalse;
346
+ }
347
+
348
+ static VALUE
349
+ rwcvs_framerect(VALUE self, VALUE v_left, VALUE v_top, VALUE v_right, VALUE v_bottom,
350
+ VALUE v_hbrush){
351
+ int r;
352
+ RECT rct;
353
+ RwCanvas *cv = DATA_PTR(self);
354
+ rct.left = FIX2INT(v_left);
355
+ rct.top = FIX2INT(v_top);
356
+ rct.right = FIX2INT(v_right);
357
+ rct.bottom = FIX2INT(v_bottom);
358
+ r = FrameRect(cv->hdc, &rct, (HBRUSH)NUM2HANDLE(v_hbrush));
359
+ return r ? Qtrue : Qfalse;
360
+ }
361
+
362
+ static VALUE
363
+ rwcvs_invertrect(VALUE self, VALUE v_left, VALUE v_top, VALUE v_right, VALUE v_bottom){
364
+ int r;
365
+ RECT rct;
366
+ RwCanvas *cv = DATA_PTR(self);
367
+ rct.left = FIX2INT(v_left);
368
+ rct.top = FIX2INT(v_top);
369
+ rct.right = FIX2INT(v_right);
370
+ rct.bottom = FIX2INT(v_bottom);
371
+ r = InvertRect(cv->hdc, &rct);
372
+ return r ? Qtrue : Qfalse;
373
+ }
374
+
375
+ static VALUE
376
+ rwcvs_pie(VALUE self, VALUE v_left, VALUE v_top, VALUE v_right, VALUE v_bottom,
377
+ VALUE v_xradial1, VALUE v_yradial1, VALUE v_xradial2, VALUE v_yradial2){
378
+ int r;
379
+ RwCanvas *cv = DATA_PTR(self);
380
+ r = Pie(cv->hdc, FIX2INT(v_left), FIX2INT(v_top), FIX2INT(v_right), FIX2INT(v_bottom),
381
+ FIX2INT(v_xradial1), FIX2INT(v_yradial1), FIX2INT(v_xradial2), FIX2INT(v_yradial2));
382
+ return r ? Qtrue : Qfalse;
383
+ }
384
+
385
+
386
+ static VALUE
387
+ rwcvs_polygon(int argc, VALUE* argv, VALUE self){
388
+ if(argc > 1){
389
+ int r;
390
+ int i;
391
+ POINT *pt = alloca(argc*sizeof(POINT));
392
+ RwCanvas *cv = DATA_PTR(self);
393
+ for (i=0; i<argc; i++){
394
+ VALUE v_pt = argv[i];
395
+ pt[i].x = FIX2INT(rb_ary_entry(v_pt, 0));
396
+ pt[i].y = FIX2INT(rb_ary_entry(v_pt, 1));
397
+ }
398
+ r = Polygon(cv->hdc, (POINT*)&pt, argc);
399
+ return r ? Qtrue : Qfalse;
400
+ }
401
+ return Qfalse;
402
+ }
403
+
404
+ static VALUE
405
+ rwcvs_polypolygon(int argc, VALUE* argv, VALUE self){ // Not tested
406
+ if(argc > 0){
407
+ int i;
408
+ int *polycounts = alloca(argc*sizeof(int));
409
+ int npoints = 0;
410
+ RwCanvas *cv = DATA_PTR(self);
411
+ for (i=0; i<argc; i++){
412
+ polycounts[i] = RARRAY_LEN(argv[i]);
413
+ npoints += polycounts[i];
414
+ }
415
+ if(npoints){
416
+ int r;
417
+ POINT *pts = alloca(npoints*sizeof(POINT));
418
+ int n = 0;
419
+ for (i=0; i<argc; i++){
420
+ int j;
421
+ VALUE ar = argv[i];
422
+ for (j=0; j<polycounts[i]; j++){
423
+ VALUE a = rb_ary_entry(ar, j);
424
+ pts[n].x = FIX2INT(rb_ary_entry(a, 0));
425
+ pts[n].y = FIX2INT(rb_ary_entry(a, 1));
426
+ n++;
427
+ }
428
+ }
429
+
430
+ r = PolyPolygon(cv->hdc, (POINT*)&pts, (int*)&polycounts, argc);
431
+ return r ? Qtrue : Qfalse;
432
+ }
433
+ }
434
+ return Qfalse;
435
+ }
436
+
437
+ static VALUE
438
+ rwcvs_rectangle(VALUE self, VALUE v_left, VALUE v_top, VALUE v_right, VALUE v_bottom){
439
+ int r;
440
+ RwCanvas *cv = DATA_PTR(self);
441
+ r = Rectangle(cv->hdc, FIX2INT(v_left), FIX2INT(v_top),
442
+ FIX2INT(v_right), FIX2INT(v_bottom));
443
+ return r ? Qtrue : Qfalse;
444
+ }
445
+
446
+ static VALUE
447
+ rwcvs_roundrect(VALUE self, VALUE v_left, VALUE v_top, VALUE v_right, VALUE v_bottom,
448
+ VALUE v_width, VALUE v_height){
449
+ int r;
450
+ RwCanvas *cv = DATA_PTR(self);
451
+ r = RoundRect(cv->hdc, FIX2INT(v_left), FIX2INT(v_top), FIX2INT(v_right), FIX2INT(v_bottom),
452
+ FIX2INT(v_width), FIX2INT(v_height));
453
+ return r ? Qtrue : Qfalse;
454
+ }
455
+
456
+ /* Pens and Brushes */
457
+
458
+ static VALUE
459
+ rwcvs_setpen(VALUE self, VALUE v_pen){
460
+ RwCanvas *cv = DATA_PTR(self);
461
+ if (FIXNUM_P(v_pen)) { // RGB (Fastest!)
462
+ COLORREF clr = SetDCPenColor(cv->hdc, FIX2INT(v_pen));
463
+ SelectObject(cv->hdc, GetStockObject(DC_PEN));
464
+ return INT2FIX(clr);
465
+ } else { //SWin::Pen
466
+ RwPen *pen;
467
+ HPEN hporig;
468
+ RwPen_Data_Get_Struct(v_pen, pen);
469
+ hporig = SelectObject(cv->hdc, pen->hpen);
470
+ return (VALUE)aaGetval(rsclist, (ULONG_PTR)hporig);
471
+ }
472
+ }
473
+
474
+ static VALUE
475
+ rwcvs_sethpen(VALUE self, VALUE v_hpen){
476
+ RwCanvas *cv = DATA_PTR(self);
477
+ SelectObject(cv->hdc, (HPEN)NUM2HANDLE(v_hpen));
478
+ return Qtrue;
479
+ }
480
+
481
+
482
+ static VALUE
483
+ rwcvs_setbrush(VALUE self, VALUE v_brush){
484
+ RwCanvas *cv = DATA_PTR(self);
485
+ if (FIXNUM_P(v_brush)) { // RGB (Fastest!)
486
+ COLORREF clr = SetDCBrushColor(cv->hdc, FIX2INT(v_brush));
487
+ SelectObject(cv->hdc, GetStockObject(DC_BRUSH));
488
+ return INT2FIX(clr);
489
+ } else { // RWin::Brush
490
+ RwBrush *brush;
491
+ HPEN hborig;
492
+ RwBrush_Data_Get_Struct(v_brush, brush);
493
+ hborig = SelectObject(cv->hdc, brush->hbrush);
494
+ return (VALUE)aaGetval(rsclist, (ULONG_PTR)hborig);
495
+ }
496
+ }
497
+
498
+ static VALUE
499
+ rwcvs_sethbrush(VALUE self, VALUE v_hbrush){
500
+ RwCanvas *cv = DATA_PTR(self);
501
+ SelectObject(cv->hdc, (HBRUSH)NUM2HANDLE(v_hbrush));
502
+ return Qtrue;
503
+ }
504
+
505
+
506
+ /* Fonts */
507
+
508
+ static VALUE
509
+ rwcvs_setfont(VALUE self, VALUE v_font){
510
+ RwFont *rf;
511
+ HFONT hforig;
512
+ RwCanvas *cv = DATA_PTR(self);
513
+ RwFont_Data_Get_Struct(v_font, rf);
514
+ hforig = SelectObject(cv->hdc, rf->hfont);
515
+ return (VALUE)aaGetval(rsclist, (ULONG_PTR)hforig);
516
+ }
517
+
518
+ static VALUE
519
+ rwcvs_sethfont(VALUE self, VALUE v_hfont){
520
+ RwCanvas *cv = DATA_PTR(self);
521
+ SelectObject(cv->hdc, (HFONT)NUM2HANDLE(v_hfont));
522
+ return Qtrue;
523
+ }
524
+
525
+ /* Texts */
526
+ static VALUE
527
+ rwcvs_drawtext(int argc, VALUE *argv, VALUE self){
528
+ int r;
529
+ size_t n;
530
+ VALUE v_text, v_format;
531
+ RECT rc;
532
+ RECT *rect;
533
+ TCHAR* text;
534
+ RwCanvas *cv = DATA_PTR(self);
535
+ v_text = argv[0];
536
+ if(TYPE(v_text)!=T_STRING) rb_raise(rb_eTypeError, "1st argument must be string");
537
+ text = rw_str2tchar2(v_text, &n);
538
+ n = n/sizeof(TCHAR);
539
+ if (rb_typeddata_is_kind_of(argv[1], &cstruct_data_type)){
540
+ VALUE v_rect;
541
+ CStructData *cs;
542
+ rb_scan_args(argc, argv, "21", &v_text, &v_rect, &v_format);
543
+ CStruct_Data_Get_Struct(v_rect, cs);
544
+ rect = (RECT*)(cs->dtstr + cs->dtoffset);
545
+ } else if(argc<5){
546
+ VALUE v_x, v_y;
547
+ rb_scan_args(argc, argv, "31", &v_text, &v_x, &v_y, &v_format);
548
+ rc.left = FIX2INT(v_x);
549
+ rc.top = FIX2INT(v_y);
550
+ DrawText(cv->hdc, text, n, &rc, DT_CALCRECT);
551
+ rect = &rc;
552
+ }else{
553
+ VALUE v_left, v_top, v_right, v_bottom;
554
+ rb_scan_args(argc, argv, "51", &v_text, &v_left, &v_top, &v_right, &v_bottom, &v_format);
555
+ rc.left = FIX2INT(v_left);
556
+ rc.top = FIX2INT(v_top);
557
+ rc.right = FIX2INT(v_right);
558
+ rc.bottom = FIX2INT(v_bottom);
559
+ rect = &rc;
560
+ }
561
+ r = DrawText(cv->hdc, text, n, rect, NIL_P(v_format) ? DT_LEFT : FIX2INT(v_format));
562
+ return r ? v_text : Qnil;
563
+ }
564
+
565
+ static VALUE
566
+ rwcvs_textout(VALUE self, VALUE v_x, VALUE v_y, VALUE v_txt){
567
+ TCHAR *txt;
568
+ size_t len;
569
+ RwCanvas *cv = DATA_PTR(self);
570
+ if(TYPE(v_txt)!=T_STRING) rb_raise(rb_eTypeError, "3rd argument must be string");
571
+ txt = rw_str2tchar2(v_txt, &len);
572
+ TextOut(cv->hdc, FIX2INT(v_x), FIX2INT(v_y), txt, len/sizeof(TCHAR));
573
+ return v_txt;
574
+ }
575
+
576
+ static VALUE
577
+ rwcvs_settextcolor(VALUE self, VALUE color){
578
+ RwCanvas *cv = DATA_PTR(self);
579
+ SetTextColor(cv->hdc, FIX2INT(color));
580
+ return color;
581
+ }
582
+
583
+ static VALUE
584
+ rwcvs_gettextcolor(VALUE self){
585
+ RwCanvas *cv = DATA_PTR(self);
586
+ return INT2FIX(GetTextColor(cv->hdc));
587
+ }
588
+
589
+ static VALUE
590
+ rwcvs_setbkcolor(VALUE self, VALUE color){
591
+ RwCanvas *cv = DATA_PTR(self);
592
+ SetBkColor(cv->hdc, NUM2UINT(color));
593
+ return color;
594
+ }
595
+
596
+ static VALUE
597
+ rwcvs_getbkcolor(VALUE self){
598
+ RwCanvas *cv = DATA_PTR(self);
599
+ return UINT2NUM(GetBkColor(cv->hdc));
600
+ }
601
+
602
+ static VALUE
603
+ swingdi_gettextextent(VALUE self, VALUE v_text){
604
+ VALUE v_ret;
605
+ TCHAR *text;
606
+ SIZE sz;
607
+ int n;
608
+ RwCanvas *cv = DATA_PTR(self);
609
+ text = rw_str2tchar(v_text);
610
+ n = RSTRING_LEN(v_text);
611
+ GetTextExtentPoint(cv->hdc, text, n, &sz);
612
+ v_ret = rb_ary_new2(2);
613
+ rb_ary_store(v_ret, 0, INT2FIX(sz.cx));
614
+ rb_ary_store(v_ret, 1, INT2FIX(sz.cy));
615
+ return v_ret;
616
+ }
617
+
618
+
619
+ /* Back mode */
620
+ static VALUE
621
+ rwcvs_bkmode_transparent(VALUE self){
622
+ RwCanvas *cv = DATA_PTR(self);
623
+ return SetBkMode(cv->hdc, TRANSPARENT) ? Qtrue : Qfalse;
624
+ }
625
+
626
+ static VALUE
627
+ rwcvs_bkmode_opaque(VALUE self){
628
+ RwCanvas *cv = DATA_PTR(self);
629
+ return SetBkMode(cv->hdc, OPAQUE) ? Qtrue : Qfalse;
630
+ }
631
+
632
+ /* SysColor */
633
+
634
+ static VALUE
635
+ rwcvs_getsyscolor(VALUE self, VALUE v_index){
636
+ return INT2FIX(GetSysColor(NUM2INT(v_index)));
637
+ }
638
+
639
+ /* Bitmaps */
640
+
641
+ static VALUE
642
+ rwcvs_floodfill(int argc, VALUE *argv, VALUE self){
643
+ int r;
644
+ UINT filltype;
645
+ VALUE v_x, v_y, v_color, v_filltype;
646
+ RwCanvas *cv = DATA_PTR(self);
647
+ rb_scan_args(argc, argv, "31", &v_x, &v_y, &v_color, &v_filltype);
648
+ filltype = (NIL_P(v_filltype) || !v_filltype)? FLOODFILLBORDER : FLOODFILLSURFACE;
649
+ r = ExtFloodFill(cv->hdc, FIX2INT(v_x), FIX2INT(v_y), FIX2INT(v_color), filltype);
650
+ return r ? Qtrue : Qfalse;
651
+ }
652
+
653
+ /* BitBlts */
654
+
655
+ /* BitBlt
656
+ Usage:
657
+ BitBlt(dst_x, dst_y, src_obj, rop=SRCCOPY) #or
658
+ BitBlt(dst_x, dst_y, dst_w, dst_h, src_obj, src_x, src_y, rop=SRCCOPY)
659
+ */
660
+ static VALUE
661
+ rwcvs_bitblt(int argc, VALUE *argv, VALUE self){
662
+ VALUE v_src;
663
+ int r;
664
+ BITMAP bmp;
665
+ HDC hdcsrc;
666
+ int xdst, ydst, wdst, hdst, xsrc, ysrc;
667
+ DWORD rop = SRCCOPY;
668
+ BOOL src_is_canvas = FALSE;
669
+ RwCanvas *cv = DATA_PTR(self);
670
+ xdst = ydst = xsrc = ysrc = wdst = hdst = 0;
671
+
672
+ if(argc > 6){
673
+ xdst = FIX2INT(*argv++);
674
+ ydst = FIX2INT(*argv++);
675
+ wdst = FIX2INT(*argv++);
676
+ hdst = FIX2INT(*argv++);
677
+ v_src = *argv++;
678
+ xsrc = FIX2INT(*argv++);
679
+ ysrc = FIX2INT(*argv++);
680
+ if (argc==8) rop = NUM2UINT(*argv++);
681
+ } else {
682
+ if (argc>4) rb_raise(rb_eArgError, "Illegal num of args: %d", argc);
683
+ if (src_is_canvas) rb_raise(rb_eArgError, "x, y, w, h needed when source is Canvas");
684
+ xdst = FIX2INT(*argv++);
685
+ ydst = FIX2INT(*argv++);
686
+ v_src = *argv++;
687
+ if (argc==4) rop = NUM2UINT(*argv++);
688
+ xsrc = 0;
689
+ ysrc = 0;
690
+ }
691
+
692
+ if(rb_typeddata_is_kind_of(v_src, &rwbitmap_data_type)){
693
+ HBITMAP hbmp;
694
+ RwBitmap *bmsrc;
695
+ RwBitmap_Data_Get_Struct(v_src, bmsrc);
696
+ hbmp = bmsrc->hbitmap;
697
+ hdcsrc = bmsrc->hdc;
698
+ GetObject(hbmp, sizeof(BITMAP), &bmp);
699
+ wdst = bmp.bmWidth;
700
+ hdst = bmp.bmHeight;
701
+ }else if(rb_typeddata_is_kind_of(v_src, &rwcanvas_data_type)){
702
+ RwCanvas *cvsrc;
703
+ RwCanvas_Data_Get_Struct(v_src, cvsrc);
704
+ hdcsrc = cvsrc->hdc;
705
+ src_is_canvas = TRUE;
706
+ } else {
707
+ rb_raise(rb_eArgError, "Source is Neither Bitmap nor Canvas");
708
+ }
709
+
710
+ r = BitBlt(cv->hdc, xdst, ydst, wdst, hdst, hdcsrc, xsrc, ysrc, rop);
711
+ return r ? Qtrue : Qfalse;
712
+ }
713
+
714
+ /* MaskBlt
715
+ Usage:
716
+ # default_rop = MAKEROP4(SRCCOPY, 0xAA0029) #(background is transparent)
717
+ MaskBlt(dst_x, dst_y, src_obj, mask_obj, rop=default_rop) # or
718
+ MaskBlt(dst_x, dst_y, dst_w, dst_h, src_obj, src_x, src_y, mask_obj, rop=default_rop)
719
+ */
720
+ static VALUE
721
+ rwcvs_maskblt(int argc, VALUE *argv, VALUE self){
722
+ int r;
723
+ HBITMAP hbmask;
724
+ HDC hdcsrc;
725
+ int xdst, ydst, wdst, hdst, xsrc, ysrc, xmask, ymask;
726
+ BOOL src_is_canvas = FALSE;
727
+ DWORD rop = MAKEROP4(SRCCOPY, 0xAA0029); // background is transparent
728
+ VALUE v_src, v_mask;
729
+ RwCanvas *cv = DATA_PTR(self);
730
+ xdst = ydst = wdst = hdst = xsrc = ysrc = xmask = ymask = 0;
731
+
732
+ if(argc > 7){
733
+ xdst = FIX2INT(*argv++);
734
+ ydst = FIX2INT(*argv++);
735
+ wdst = FIX2INT(*argv++);
736
+ hdst = FIX2INT(*argv++);
737
+ v_src = *argv++;
738
+ xsrc = FIX2INT(*argv++);
739
+ ysrc = FIX2INT(*argv++);
740
+ v_mask = *argv++;
741
+ if (argc==9) rop = NUM2UINT(*argv++);
742
+ } else {
743
+ if(argc > 5) rb_raise(rb_eArgError, "Illegal num of args: %d", argc);
744
+ if (src_is_canvas) rb_raise(rb_eArgError, "x, y, w, h needed when source is Canvas");
745
+ xdst = FIX2INT(*argv++);
746
+ ydst = FIX2INT(*argv++);
747
+ v_src = *argv++;
748
+ v_mask = *argv++;
749
+ if (argc==5) rop = NUM2UINT(*argv++);
750
+ }
751
+
752
+ if(rb_typeddata_is_kind_of(v_src, &rwbitmap_data_type)){
753
+ BITMAP bmp;
754
+ HBITMAP hbmp;
755
+ RwBitmap *bmsrc;
756
+ RwBitmap_Data_Get_Struct(v_src, bmsrc);
757
+ hbmp = bmsrc->hbitmap;
758
+ hdcsrc = bmsrc->hdc;
759
+ GetObject(hbmp, sizeof(BITMAP), &bmp);
760
+ wdst = bmp.bmWidth;
761
+ hdst = bmp.bmHeight;
762
+ }else if(rb_typeddata_is_kind_of(v_src, &rwcanvas_data_type)){
763
+ RwCanvas *cvsrc;
764
+ RwCanvas_Data_Get_Struct(v_src, cvsrc);
765
+ hdcsrc = cvsrc->hdc;
766
+ src_is_canvas = TRUE;
767
+ } else {
768
+ rb_raise(rb_eArgError, "Source is Neither Bitmap nor Canvas");
769
+ }
770
+
771
+ if (NIL_P(v_mask)){
772
+ hbmask = 0;
773
+ } else if(rb_typeddata_is_kind_of(v_mask, &rwbitmap_data_type)){
774
+ BITMAP bmm;
775
+ RwBitmap *bmmask;
776
+ RwBitmap_Data_Get_Struct(v_mask, bmmask);
777
+ hbmask = bmmask->hbitmap;
778
+ GetObject(hbmask, sizeof(BITMAP), &bmm);
779
+ if(bmm.bmBitsPixel>1) rb_raise(rb_eArgError, "Mask isn't monochrome");
780
+ } else {
781
+ rb_raise(rb_eArgError, "Mask isn't Bitmap");
782
+ }
783
+
784
+ r = MaskBlt(cv->hdc, xdst, ydst, wdst, hdst, hdcsrc, xsrc, ysrc, hbmask, xmask, ymask, rop);
785
+ return r ? Qtrue : Qfalse;
786
+ }
787
+
788
+ /* PatBlt
789
+ Usage:
790
+ PatBlt(x, y, w, h, rop=PATCOPY)
791
+ */
792
+ static VALUE
793
+ rwcvs_patblt(int argc, VALUE *argv, VALUE self){
794
+ int r;
795
+ VALUE v_x, v_y, v_w, v_h, v_rop;
796
+ RwCanvas *cv = DATA_PTR(self);
797
+ rb_scan_args(argc, argv, "41", &v_x, &v_y, &v_w, &v_h, &v_rop);
798
+ r = PatBlt(cv->hdc, FIX2INT(v_x), FIX2INT(v_y), FIX2INT(v_w), FIX2INT(v_h),
799
+ NIL_P(v_rop) ? PATCOPY : NUM2UINT(v_rop));
800
+ return r ? Qtrue : Qfalse;
801
+ }
802
+
803
+ /* StretchBlt
804
+ Usage:
805
+ StretchBlt(dst_x, dst_y, dst_w, dst_h, src_obj, rop=SRCCOPY) # or
806
+ StretchBlt(dst_x, dst_y, dst_w, dst_h, src_obj, src_x, src_y, src_w, src_h, rop=SRCCOPY)
807
+ */
808
+ static VALUE
809
+ rwcvs_stretchblt(int argc, VALUE *argv, VALUE self){
810
+ int r;
811
+ BITMAP bmp;
812
+ VALUE v_src;
813
+ HDC hdcsrc;
814
+ int xdst, ydst, wdst, hdst, xsrc, ysrc, wsrc, hsrc;
815
+ BOOL src_is_canvas = FALSE;
816
+ DWORD rop = SRCCOPY;
817
+ RwCanvas *cv = DATA_PTR(self);
818
+ xdst = ydst = xsrc = ysrc = wdst= hdst = wsrc = hsrc = 0;
819
+
820
+ if(argc < 5 || argc > 10){
821
+ rb_raise(rb_eArgError, "Illegal num of args: %d", argc);
822
+ }
823
+ if(argc > 8){ // This rayout must be change to set next of v_src.
824
+ xdst = FIX2INT(*argv++);
825
+ ydst = FIX2INT(*argv++);
826
+ wdst = FIX2INT(*argv++);
827
+ hdst = FIX2INT(*argv++);
828
+ v_src = *argv++;
829
+ xsrc = FIX2INT(*argv++);
830
+ ysrc = FIX2INT(*argv++);
831
+ wsrc = FIX2INT(*argv++);
832
+ hsrc = FIX2INT(*argv++);
833
+ if (argc==10) rop = FIX2INT(*argv++);
834
+ } else if(argc > 4){
835
+ if(src_is_canvas) rb_raise(rb_eArgError, "x, y, w, h needed when source is Canvas");
836
+ xdst = FIX2INT(*argv++);
837
+ ydst = FIX2INT(*argv++);
838
+ wdst = FIX2INT(*argv++);
839
+ hdst = FIX2INT(*argv++);
840
+ v_src = *argv++;
841
+ if (argc==6) rop = FIX2INT(*argv++);
842
+ wsrc = wdst;
843
+ hsrc = hdst;
844
+ }
845
+ if (!wdst || !hdst) rb_raise(rb_eRuntimeError, "Need x, y, w, h");
846
+
847
+ if(rb_typeddata_is_kind_of(v_src, &rwbitmap_data_type)){
848
+ HBITMAP hbmp;
849
+ RwBitmap *bmsrc;
850
+ RwBitmap_Data_Get_Struct(v_src, bmsrc);
851
+ hbmp = bmsrc->hbitmap;
852
+ hdcsrc = bmsrc->hdc;
853
+ GetObject(hbmp, sizeof(BITMAP), &bmp);
854
+ wdst = wsrc = bmp.bmWidth;
855
+ hdst = hsrc = bmp.bmHeight;
856
+ }else if(rb_typeddata_is_kind_of(v_src, &rwcanvas_data_type)){
857
+ RwCanvas *cvsrc;
858
+ RwCanvas_Data_Get_Struct(v_src, cvsrc);
859
+ hdcsrc = cvsrc->hdc;
860
+ src_is_canvas = TRUE;
861
+ } else {
862
+ rb_raise(rb_eArgError, "Source is Neither Bitmap nor Canvas");
863
+ }
864
+
865
+ r = StretchBlt(cv->hdc, xdst, ydst, wdst, hdst, hdcsrc, xsrc, ysrc, wsrc, hsrc, rop);
866
+ return r ? Qtrue : Qfalse;
867
+ }
868
+
869
+ static VALUE
870
+ rwcvs_getstretchmode(VALUE self){
871
+ RwCanvas *cv = DATA_PTR(self);
872
+ return INT2NUM(GetStretchBltMode(cv->hdc));
873
+ }
874
+
875
+ static VALUE
876
+ rwcvs_setstretchmode(VALUE self, VALUE v_mode){
877
+ int r;
878
+ RwCanvas *cv = DATA_PTR(self);
879
+ r = SetStretchBltMode(cv->hdc, NUM2INT(v_mode));
880
+ return r ? Qtrue : Qfalse;
881
+ }
882
+
883
+ /* PlgBlt
884
+ Usage:
885
+ PlgBlt(dst_pt1, dst_pt2, dst_pt3, src_obj, mask=nil) # or
886
+ PlgBlt(dst_pt1, dst_pt2, dst_pt3, src_obj, src_x, src_y, src_w, src_h, mask=nil)
887
+ */
888
+ static VALUE
889
+ rwcvs_plgblt(int argc, VALUE *argv, VALUE self){
890
+ POINT pt[3];
891
+ BITMAP bmp;
892
+ HBITMAP hbmask;
893
+ VALUE v_src;
894
+ VALUE v_pt1, v_pt2, v_pt3;
895
+ HDC hdcsrc;
896
+ int xsrc, ysrc, wsrc, hsrc, r;
897
+ BOOL src_is_canvas = FALSE;
898
+ VALUE v_mask = Qnil;
899
+ // VALUE v_src = *argv++;
900
+ RwCanvas *cv = DATA_PTR(self);
901
+ xsrc = ysrc = wsrc = hsrc = 0;
902
+
903
+ if (argc > 7){
904
+ v_pt1 = *argv++;
905
+ v_pt2 = *argv++;
906
+ v_pt3 = *argv++;
907
+ v_src = *argv++;
908
+ xsrc = FIX2INT(*argv++);
909
+ ysrc = FIX2INT(*argv++);
910
+ wsrc = FIX2INT(*argv++);
911
+ hsrc = FIX2INT(*argv++);
912
+ if (argc==9) v_mask = *argv++;
913
+ } else if(argc > 3) {
914
+ if (src_is_canvas) rb_raise(rb_eArgError, "x, y, w, h needed when source is Canvas");
915
+ v_pt1 = *argv++;
916
+ v_pt2 = *argv++;
917
+ v_pt3 = *argv++;
918
+ v_src = *argv++;
919
+ if (argc==5) v_mask = *argv++;
920
+ }else{
921
+ rb_raise(rb_eArgError, "Illegal num of args: %d", argc);
922
+ }
923
+ if(TYPE(v_pt1)!=T_ARRAY || TYPE(v_pt2)!=T_ARRAY || TYPE(v_pt3)!=T_ARRAY){
924
+ rb_raise(rb_eArgError, "First 3 arguments msut be arrays");
925
+ }
926
+ if(rb_typeddata_is_kind_of(v_src, &rwbitmap_data_type)){
927
+ HBITMAP hbmp;
928
+ RwBitmap *bmsrc;
929
+ RwBitmap_Data_Get_Struct(v_src, bmsrc);
930
+ hbmp = bmsrc->hbitmap;
931
+ hdcsrc = bmsrc->hdc;
932
+ GetObject(hbmp, sizeof(BITMAP), &bmp);
933
+ wsrc = bmp.bmWidth;
934
+ hsrc = bmp.bmHeight;
935
+ }else if(rb_typeddata_is_kind_of(v_src, &rwcanvas_data_type)){
936
+ RwCanvas *cvsrc;
937
+ RwCanvas_Data_Get_Struct(v_src, cvsrc);
938
+ hdcsrc = cvsrc->hdc;
939
+ src_is_canvas = TRUE;
940
+ } else {
941
+ rb_raise(rb_eArgError, "Source is Neither Bitmap nor Canvas");
942
+ }
943
+
944
+ pt[0].x = FIX2INT(rb_ary_entry(v_pt1, 0));
945
+ pt[0].y = FIX2INT(rb_ary_entry(v_pt1, 1));
946
+ pt[1].x = FIX2INT(rb_ary_entry(v_pt2, 0));
947
+ pt[1].y = FIX2INT(rb_ary_entry(v_pt2, 1));
948
+ pt[2].x = FIX2INT(rb_ary_entry(v_pt3, 0));
949
+ pt[2].y = FIX2INT(rb_ary_entry(v_pt3, 1));
950
+
951
+ if (NIL_P(v_mask)){
952
+ hbmask = 0;
953
+ } else if(rb_typeddata_is_kind_of(v_mask, &rwbitmap_data_type)){
954
+ BITMAP bmm;
955
+ RwBitmap *bmmask;
956
+ RwBitmap_Data_Get_Struct(v_mask, bmmask);
957
+ hbmask = bmmask->hbitmap;
958
+ GetObject(hbmask, sizeof(BITMAP), &bmm);
959
+ if(bmm.bmBitsPixel>1) rb_raise(rb_eArgError, "Mask isn't monochrome");
960
+ } else {
961
+ rb_raise(rb_eArgError, "Mask isn't Bitmap");
962
+ }
963
+
964
+ r = PlgBlt(cv->hdc, pt, hdcsrc, xsrc, ysrc, wsrc, hsrc, hbmask, 0, 0);
965
+ return r ? Qtrue : Qfalse;
966
+ }
967
+
968
+ static VALUE
969
+ rwcvs_drawicon(VALUE self, VALUE v_icon, VALUE v_x, VALUE v_y){
970
+ RwIcon *ri;
971
+ RwCanvas *cv = DATA_PTR(self);
972
+ if (!rb_typeddata_is_kind_of(v_icon, &rwicon_data_type)){
973
+ rb_raise(rb_eArgError,"RWin::Icon required.");
974
+ }
975
+ RwIcon_Data_Get_Struct(v_icon, ri);
976
+ return DrawIcon(cv->hdc, FIX2INT(v_x), FIX2INT(v_y), ri->hicon) ? Qtrue : Qnil;
977
+ }
978
+
979
+ static VALUE
980
+ rwcvs_drawimagelist(int argc, VALUE *argv, VALUE self){
981
+ VALUE v_imglist, v_idx, v_x, v_y, v_style;
982
+ int style;
983
+ RwImagelist *ri;
984
+ RwCanvas *cv = DATA_PTR(self);
985
+ rb_scan_args(argc, argv, "41", &v_imglist, &v_idx, &v_x, &v_y, &v_style);
986
+ if (!rb_typeddata_is_kind_of(v_imglist, &rwimagelist_data_type)){
987
+ rb_raise(rb_eArgError,"RWin::Imagelist required.");
988
+ }
989
+ RwImagelist_Data_Get_Struct(v_imglist, ri);
990
+ style = NIL_P(v_style) ? ILD_NORMAL : FIX2INT(v_style);
991
+ return ImageList_Draw(ri->himagelist, FIX2INT(v_idx),
992
+ cv->hdc, FIX2INT(v_x), FIX2INT(v_y),style) ? Qtrue : Qnil;
993
+ }
994
+
995
+ /* DeviceCaps */
996
+ static VALUE
997
+ rwcvs_getdevcaps(VALUE self, VALUE v_idx){
998
+ RwCanvas *cv = DATA_PTR(self);
999
+ return INT2NUM(GetDeviceCaps(cv->hdc, FIX2INT(v_idx)));
1000
+ }
1001
+
1002
+ static VALUE
1003
+ rwcvs_getlogpixels(VALUE self){
1004
+ RwCanvas *cv = DATA_PTR(self);
1005
+ return rb_ary_new3(2, INT2FIX(GetDeviceCaps(cv->hdc,LOGPIXELSX)),
1006
+ INT2FIX(GetDeviceCaps(cv->hdc,LOGPIXELSX)));
1007
+ }
1008
+
1009
+ /* RaterOperations */
1010
+ static VALUE
1011
+ rwcvs_setrop2(VALUE self, VALUE v_rop){
1012
+ RwCanvas *cv = DATA_PTR(self);
1013
+ return INT2FIX(SetROP2(cv->hdc, FIX2INT(v_rop)));
1014
+ }
1015
+
1016
+ VALUE
1017
+ rwcvs_getrop2(VALUE self){
1018
+ RwCanvas *cv = DATA_PTR(self);
1019
+ return INT2FIX(GetROP2(cv->hdc));
1020
+ }
1021
+
1022
+ /* #################################################################### */
1023
+
1024
+ static void
1025
+ rw_init_RwCanvas(){
1026
+ cRwCanvas = rb_define_class_under(mRwin, "Canvas", rb_cData);
1027
+ rb_define_alloc_func(cRwCanvas, rwcvs_alloc);
1028
+
1029
+ rb_define_singleton_method(cRwCanvas, "draw", rwcvs1_draw, 1);
1030
+
1031
+ rb_define_method(cRwCanvas, "initialize", rwcvs_initialize, 1);
1032
+ rb_define_method(cRwCanvas, "release", rwcvs_release, 0);
1033
+ rb_define_method(cRwCanvas, "_hdc", rwcvs_gethdc, 0);
1034
+
1035
+ /* Lines and Curves */
1036
+ rb_define_method(cRwCanvas, "AngleArc", rwcvs_anglearc, 5);
1037
+ rb_define_method(cRwCanvas, "Arc", rwcvs_arc, 8);
1038
+ rb_define_method(cRwCanvas, "ArcTo", rwcvs_arcto, 8);
1039
+ rb_define_method(cRwCanvas, "GetArcDirection", rwcvs_getarcdir, 0);
1040
+ rb_define_method(cRwCanvas, "LineTo", rwcvs_lineto, 2);
1041
+ rb_define_method(cRwCanvas, "MoveTo", rwcvs_moveto, 2);
1042
+ rb_define_method(cRwCanvas, "PolyBezier", rwcvs_polybezier, -1);
1043
+ rb_define_method(cRwCanvas, "PolyBezierTo", rwcvs_polybezierto, -1);
1044
+ rb_define_method(cRwCanvas, "PolyDraw", rwcvs_polydraw, -1);
1045
+ rb_define_method(cRwCanvas, "Polyline", rwcvs_polyline, -1);
1046
+ rb_define_method(cRwCanvas, "PolylineTo", rwcvs_polylineto, -1);
1047
+ rb_define_method(cRwCanvas, "PolyPolyline", rwcvs_polypolyline, -1); // Not Tested
1048
+ rb_define_method(cRwCanvas, "SetArcDirection", rwcvs_setarcdir, 1);
1049
+
1050
+ /* Filled Shapes */
1051
+ rb_define_method(cRwCanvas, "Chord", rwcvs_chord, 8);
1052
+ rb_define_method(cRwCanvas, "Ellipse", rwcvs_ellipse, 4);
1053
+ rb_define_method(cRwCanvas, "FillRect", rwcvs_fillrect, 5);
1054
+ rb_define_method(cRwCanvas, "FrameRect", rwcvs_framerect, 5);
1055
+ rb_define_method(cRwCanvas, "InvertRect", rwcvs_invertrect, 4);
1056
+ rb_define_method(cRwCanvas, "Pie", rwcvs_pie, 8);
1057
+ rb_define_method(cRwCanvas, "Polygon", rwcvs_polygon, -1);
1058
+ rb_define_method(cRwCanvas, "PolyPolygon", rwcvs_polypolygon, -1); // Not Tested
1059
+ rb_define_method(cRwCanvas, "Rectangle", rwcvs_rectangle, 4);
1060
+ rb_define_method(cRwCanvas, "RoundRect", rwcvs_roundrect, 6);
1061
+
1062
+ /* Pens and Brushes */
1063
+ rb_define_method(cRwCanvas, "SetPen", rwcvs_setpen, 1);
1064
+ rb_define_method(cRwCanvas, "SetHPen", rwcvs_sethpen, 1);
1065
+ rb_define_method(cRwCanvas, "SetBrush", rwcvs_setbrush, 1);
1066
+ rb_define_method(cRwCanvas, "SetHBrush", rwcvs_sethbrush, 1);
1067
+
1068
+
1069
+ /* Fonts */
1070
+ rb_define_method(cRwCanvas, "SetFont", rwcvs_setfont, 1);
1071
+ rb_define_method(cRwCanvas, "SetHFont", rwcvs_sethfont, 1);
1072
+
1073
+ /* Texts */
1074
+ rb_define_method(cRwCanvas, "DrawText", rwcvs_drawtext, -1);
1075
+ rb_define_method(cRwCanvas, "TextOut", rwcvs_textout, 3);
1076
+ rb_define_method(cRwCanvas, "SetTextColor", rwcvs_settextcolor, 1);
1077
+ rb_define_method(cRwCanvas, "GetTextColor", rwcvs_gettextcolor, 0);
1078
+ rb_define_method(cRwCanvas, "SetBkColor", rwcvs_setbkcolor, 1);
1079
+ rb_define_method(cRwCanvas, "GetBkColor", rwcvs_getbkcolor, 0);
1080
+ rb_define_method(cRwCanvas, "GetTextExtent", swingdi_gettextextent, 1);
1081
+
1082
+ /* BackMode */
1083
+ rb_define_method(cRwCanvas, "Transparent", rwcvs_bkmode_transparent, 0);
1084
+ rb_define_method(cRwCanvas, "Opaque", rwcvs_bkmode_opaque, 0);
1085
+
1086
+ /* SysColor */
1087
+ rb_define_method(cRwCanvas, "GetSysColor", rwcvs_getsyscolor, 1);
1088
+
1089
+ /* Bitmaps */
1090
+ rb_define_method(cRwCanvas, "FloodFill", rwcvs_floodfill, -1);
1091
+
1092
+ /* Bitblts */
1093
+ rb_define_method(cRwCanvas, "BitBlt", rwcvs_bitblt, -1);
1094
+ rb_define_method(cRwCanvas, "MaskBlt", rwcvs_maskblt, -1);
1095
+ rb_define_method(cRwCanvas, "PatBlt", rwcvs_patblt, -1);
1096
+ rb_define_method(cRwCanvas, "StretchBlt", rwcvs_stretchblt, -1);
1097
+ rb_define_method(cRwCanvas, "PlgBlt", rwcvs_plgblt, -1);
1098
+ rb_define_method(cRwCanvas, "GetStretchBltMode", rwcvs_getstretchmode, 0);
1099
+ rb_define_method(cRwCanvas, "SetStretchBltMode", rwcvs_setstretchmode, 1);
1100
+ rb_define_method(cRwCanvas, "DrawIcon", rwcvs_drawicon, 3);
1101
+ rb_define_method(cRwCanvas, "DrawImagelist", rwcvs_drawimagelist, -1);
1102
+ /* This is not API function, but named like it. */
1103
+
1104
+ /* DeviceCaps */
1105
+ rb_define_method(cRwCanvas, "GetDeviceCaps", rwcvs_getdevcaps, 1);
1106
+ rb_define_method(cRwCanvas, "GetLogPixels", rwcvs_getlogpixels, 0);
1107
+
1108
+
1109
+ /* Raster Operations */
1110
+ rb_define_method(cRwCanvas, "GetROP2", rwcvs_getrop2, 0);
1111
+ rb_define_method(cRwCanvas, "SetROP2", rwcvs_setrop2, 1);
1112
+
1113
+ /* Ratios */
1114
+ // rb_define_method(cRwCanvas, "SetRatio", rwcvs_setratio, -1);
1115
+ // rb_define_method(cRwCanvas, "GetRatio", rwcvs_getratio, 0);
1116
+
1117
+ }
1118
+
1119
+ /* GDI Plus (Wapper of gdiplusflat) */
1120
+
1121
+ const GdiplusStartupInput gdip_startup_input = {1, 0, 0, 0};
1122
+ ULONG_PTR gdip_token;
1123
+
1124
+ static void
1125
+ rwimage_free(void* ptr){
1126
+ RwImage* ri = ptr;
1127
+ Unregister_rsc(ri->himage);
1128
+ if(gdip_token && ri->himage) GdipDisposeImage(ri->himage);
1129
+ free(ri);
1130
+ }
1131
+
1132
+ static size_t
1133
+ rwimage_memsize(const void *ptr){
1134
+ return ptr ? sizeof(RwImage) : 0;
1135
+ }
1136
+
1137
+ const rb_data_type_t rwimage_data_type = {
1138
+ "Picture", {NULL, rwimage_free, rwimage_memsize}, NULL, NULL
1139
+ };
1140
+
1141
+ extern void rwbitmap_free(RwCanvas *rc);
1142
+ extern void rwicon_free(RwIcon *ri);
1143
+
1144
+ const GUID EncoderQuality ={0x1d5be4b5,0xfa4a,0x452d,{0x9c,0xdd,0x5d,0xb3,0x51,0x05,0xe7,0xeb}};
1145
+ const GUID EncoderSaveFlag={0x292266fc,0xac40,0x47bf,{0x8c,0xfc,0xa8,0x5b,0x89,0xa6,0x55,0xde}};
1146
+ const GUID EncoderVersion ={0x24d18c76,0x814a,0x41a4,{0xbf,0x53,0x1c,0x21,0x9c,0xcc,0xf7,0x97}};
1147
+
1148
+ VALUE cRwImage; /* holder of Image object */
1149
+
1150
+ void
1151
+ rwgdiplus_startup(){
1152
+ GdiplusStartup(&gdip_token, &gdip_startup_input, 0);
1153
+ }
1154
+
1155
+ void
1156
+ rwgdiplus_shutdown(){
1157
+ GdiplusShutdown(gdip_token);
1158
+ gdip_token = 0;
1159
+ }
1160
+
1161
+ static VALUE
1162
+ rwgdip1_picture_fromfilestream(VALUE klass, VALUE v_path){
1163
+ RwImage *ri;
1164
+ VALUE robj;
1165
+ int r;
1166
+ HANDLE hBuf;
1167
+ FILE *fp;
1168
+ BYTE *gmem;
1169
+ size_t sz;
1170
+ IStream *pstream;
1171
+ HANDLE hbmp = NULL;
1172
+ char path[RW_MAXPATH];
1173
+ rwconv2absolute_path(path, RSTRING_PTR(v_path));
1174
+ #ifdef __CYGWIN__
1175
+ if(!(fp=fopen(path, "r"))){
1176
+ #else
1177
+ if(fopen_s(&fp, path, "rb")){
1178
+ #endif
1179
+ rb_raise(rb_eIOError, "%s: file not found.", StringValuePtr(v_path));
1180
+ }
1181
+ fseek(fp, 0, SEEK_END);
1182
+ sz = ftell(fp);
1183
+ fseek(fp, 0, SEEK_SET);
1184
+ hBuf=GlobalAlloc(GMEM_MOVEABLE, sz);
1185
+ gmem = (BYTE*)GlobalLock(hBuf);
1186
+ if(!hBuf || !gmem) {
1187
+ fclose(fp);
1188
+ rb_raise(rb_eIOError, "Failed to allocate and lock memory");
1189
+ }
1190
+ fread(gmem, sizeof(BYTE), sz, fp);
1191
+ fclose(fp);
1192
+
1193
+ pstream = 0;
1194
+ if(CreateStreamOnHGlobal(hBuf, FALSE, &pstream)!=S_OK){
1195
+ GlobalFree(hBuf);
1196
+ rb_raise(rb_eIOError, "Failed to create memory stream");
1197
+ }
1198
+ if(r=GdipLoadImageFromStream(pstream, &hbmp)){
1199
+ rb_raise(rb_eRuntimeError, "Failed to create Picture: error code=%d", r);
1200
+ }
1201
+ robj = RwImage_Data_Make_Struct(klass, ri);
1202
+ ri->himage = hbmp;
1203
+ Register_rsc(ri->himage, robj);
1204
+ pstream->lpVtbl->Release(pstream);
1205
+ GlobalFree(hBuf);
1206
+ return robj;
1207
+ }
1208
+
1209
+ /*
1210
+ static VALUE
1211
+ rwgdip1_picture_fromfile(VALUE klass, VALUE v_path){
1212
+ RwImage *ri;
1213
+ VALUE robj;
1214
+ int r;
1215
+ HANDLE hFile;
1216
+ HANDLE hbmp = NULL;
1217
+
1218
+ hFile = CreateFileA(RSTRING_PTR(v_path), GENERIC_READ, 0, NULL,
1219
+ OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL );
1220
+ if(hFile==INVALID_HANDLE_VALUE){
1221
+ rb_raise(rb_eIOError, "%s: file not found.", StringValuePtr(v_path));
1222
+ }
1223
+ CloseHandle(hFile);
1224
+
1225
+ robj = RwImage_Data_Make_Struct(klass, ri);
1226
+ if(r=GdipLoadImageFromFile(rw_str2wchar(v_path), &hbmp)){
1227
+ rb_raise(rb_eRuntimeError, "Failed to create Picture: error code=%d", r);
1228
+ }
1229
+ ri->himage = hbmp;
1230
+ Register_rsc(ri->himage, robj);
1231
+ return robj;
1232
+ }
1233
+ */
1234
+
1235
+ VALUE
1236
+ rwgdip1__load_core(VALUE klass, LPVOID lpdata, size_t len){
1237
+ LPSTREAM pstream;
1238
+ VALUE robj;
1239
+ HGLOBAL hglobal = GlobalAlloc(GPTR, len);
1240
+ if (!hglobal) rb_raise(rb_eRuntimeError, "can't allocate Global memory");
1241
+ if(CreateStreamOnHGlobal(hglobal, TRUE, &pstream)==S_OK){
1242
+ HANDLE himage = NULL;
1243
+ char *buffer = GlobalLock(hglobal);
1244
+ memcpy(buffer, lpdata, len);
1245
+ if(GdipLoadImageFromStream(pstream, &himage)==Ok){
1246
+ RwImage *ri;
1247
+ robj = RwImage_Data_Make_Struct(klass, ri);
1248
+ ri->himage = himage;
1249
+ Register_rsc(himage, robj);
1250
+ pstream->lpVtbl->Release(pstream);
1251
+ GlobalFree(hglobal);
1252
+ } else {
1253
+ pstream->lpVtbl->Release(pstream);
1254
+ GlobalFree(hglobal);
1255
+ rb_raise(rb_eRuntimeError, "failed to load Image");
1256
+ }
1257
+ } else {
1258
+ rb_raise(rb_eRuntimeError, "failed to create stream");
1259
+ }
1260
+ return robj;
1261
+ }
1262
+
1263
+ static VALUE
1264
+ rwgdip1__load(VALUE klass, VALUE str){
1265
+ return rwgdip1__load_core(klass, RSTRING_PTR(str), RSTRING_LEN(str));
1266
+ }
1267
+
1268
+ int
1269
+ GetEncoderClsid(const WCHAR* format, CLSID* pClsid){ /* from msdn */
1270
+ UINT j;
1271
+ UINT num = 0; /* number of image encoders*/
1272
+ UINT size = 0; /* size of the image encoder array in bytes */
1273
+ ImageCodecInfo* pImageCodecInfo = NULL;
1274
+
1275
+ GdipGetImageEncodersSize(&num, &size);
1276
+ if(size == 0) return -1; /* Failure */
1277
+ pImageCodecInfo = (ImageCodecInfo*)(malloc(size));
1278
+ if(pImageCodecInfo == NULL) return -1; /* Failure */
1279
+ GdipGetImageEncoders(num, size, pImageCodecInfo);
1280
+
1281
+ for(j = 0; j < num; ++j){
1282
+ if( wcscmp(pImageCodecInfo[j].MimeType, format) == 0 ){
1283
+ *pClsid = pImageCodecInfo[j].Clsid;
1284
+ free(pImageCodecInfo);
1285
+ return j; /* Success */
1286
+ }
1287
+ }
1288
+ free(pImageCodecInfo);
1289
+ return -1; /* Failure */
1290
+ }
1291
+
1292
+ void
1293
+ set_encoder_params(EncoderParameters *encparams, int i_quality){
1294
+ encparams->Count = 1;
1295
+ memcpy(&encparams->Parameter[0].Guid, &EncoderQuality, sizeof(GUID));
1296
+ encparams->Parameter[0].NumberOfValues = 1;
1297
+ encparams->Parameter[0].Type = EncoderParameterValueTypeLong;
1298
+ encparams->Parameter[0].Value = &i_quality;
1299
+ }
1300
+
1301
+ VALUE
1302
+ stream2string(LPSTREAM pstream){
1303
+ VALUE rstr;
1304
+ HGLOBAL hglobal;
1305
+ int len;
1306
+ STATSTG stat;
1307
+ char *buffer;
1308
+ GetHGlobalFromStream(pstream, &hglobal);
1309
+ pstream->lpVtbl->Stat(pstream, &stat, 0);
1310
+ len = stat.cbSize.LowPart;
1311
+ buffer = GlobalLock(hglobal);
1312
+ rstr = rb_str_new(buffer, len);
1313
+ pstream->lpVtbl->Release(pstream);
1314
+ GlobalFree(hglobal);
1315
+ return rstr;
1316
+ }
1317
+
1318
+ static VALUE
1319
+ gdip_pic_save(VALUE self, VALUE v_encoder, VALUE v_encparam1, VALUE v_save2){
1320
+ EncoderParameters *enc_params;
1321
+ CLSID enc_clsid;
1322
+ int r, i_quality;
1323
+ VALUE robj;
1324
+ RwImage *ri = DATA_PTR(self);
1325
+
1326
+ if(TYPE(v_encoder)!=T_STRING)rb_raise(rb_eArgError, "Need encoder string sutch as \"image/png\"");
1327
+ r = GetEncoderClsid(rw_str2wchar(v_encoder), &enc_clsid);
1328
+ if(r<0) rb_raise(rb_eArgError, "No such encoder: %s", RSTRING_PTR(rb_inspect(v_encoder)));
1329
+
1330
+ if(rb_typeddata_is_kind_of(v_encparam1, &cstruct_data_type)){
1331
+ CStructData *cs;
1332
+ CStruct_Data_Get_Struct(v_encparam1, cs);
1333
+ enc_params = (EncoderParameters*)(cs->dtstr + cs->dtoffset);
1334
+ } else {
1335
+ enc_params = alloca(sizeof(EncoderParameters)); //+ 1*sizeof(EncoderParameter));
1336
+ i_quality = NIL_P(v_encparam1) ? 100 : FIX2INT(v_encparam1);
1337
+ set_encoder_params(enc_params, i_quality);
1338
+ }
1339
+
1340
+ if(NIL_P(v_save2)){
1341
+ LPSTREAM pstream;
1342
+ if(CreateStreamOnHGlobal(NULL, TRUE, &pstream)==S_OK){
1343
+ if(GdipSaveImageToStream(ri->himage, pstream, &enc_clsid, enc_params)==Ok){
1344
+ robj = stream2string(pstream);
1345
+ } else{
1346
+ pstream->lpVtbl->Release(pstream);
1347
+ rb_raise(rb_eRuntimeError, "failed to dump picture");
1348
+ }
1349
+ }else{
1350
+ rb_raise(rb_eRuntimeError, "failed to create stream");
1351
+ }
1352
+ } else {
1353
+ wchar_t saveto[RW_MAXPATH];
1354
+ wchar_t *path = rw_str2wchar(v_save2);
1355
+ rwconv2absolute_pathW(saveto, path);
1356
+ r = GdipSaveImageToFile(ri->himage, saveto, &enc_clsid, enc_params);
1357
+ robj = r==0 ? Qtrue : Qfalse;
1358
+ }
1359
+ return robj;
1360
+ }
1361
+
1362
+ /*
1363
+ Sequence:
1364
+ Picture#saveto(path, encoder, quality=100, save_flag=0)
1365
+ */
1366
+
1367
+ static VALUE
1368
+ rwgdip_picture_saveto_file(int argc, VALUE *argv, VALUE self){
1369
+ VALUE v_path, v_encoder, v_quality;
1370
+ rb_scan_args(argc, argv, "12", &v_path, &v_encoder, &v_quality);
1371
+ if(NIL_P(v_encoder)) v_encoder=rb_str_new_literal("image/png");
1372
+ return gdip_pic_save(self, v_encoder, v_quality, v_path);
1373
+ }
1374
+
1375
+ /*
1376
+ Sequence:
1377
+ Picture#_dump(encoder, quality=100, save_flag=0)
1378
+ */
1379
+
1380
+ static VALUE
1381
+ rwgdip_picture__dump(int argc, VALUE *argv, VALUE self){
1382
+ VALUE v_encoder, v_quality;
1383
+ rb_scan_args(argc, argv, "02", &v_encoder, &v_quality);
1384
+ if(NIL_P(v_encoder)) v_encoder=rb_str_new_literal("image/png");
1385
+ return gdip_pic_save(self, v_encoder, v_quality, Qnil);
1386
+ }
1387
+
1388
+ static VALUE
1389
+ rwgdip_himage(VALUE self){
1390
+ RwImage *ri = DATA_PTR(self);
1391
+ return UINT2NUM((ULONG_PTR)ri->himage);
1392
+ }
1393
+
1394
+ static VALUE
1395
+ rwgdip_to_bitmap(int argc, VALUE *argv, VALUE self){
1396
+ RwBitmap* rb;
1397
+ VALUE robj;
1398
+ HBITMAP hbitmap;
1399
+ VALUE v_background;
1400
+ DWORD background;
1401
+ RwImage *ri = DATA_PTR(self);
1402
+ rb_scan_args(argc, argv, "01", &v_background);
1403
+ background = NIL_P(v_background) ? 0 : NUM2UINT(v_background);
1404
+
1405
+ GdipCreateHBITMAPFromBitmap(ri->himage, &hbitmap, background);
1406
+
1407
+ robj = RwBitmap_Data_Make_Struct(cRwBitmap, rb);
1408
+ rb->hbitmap = hbitmap;
1409
+ rb->shared = FALSE;
1410
+ rb->hdc = CreateCompatibleDC(NULL);
1411
+ SelectObject(rb->hdc, rb->hbitmap);
1412
+
1413
+ Register_rsc(rb->hbitmap, robj);
1414
+ return robj;
1415
+ }
1416
+
1417
+ static VALUE
1418
+ rwgdip_to_icon(VALUE self){
1419
+ int r;
1420
+ VALUE robj;
1421
+ RwIcon* ric;
1422
+ HICON hicon;
1423
+ RwImage *ri = DATA_PTR(self);
1424
+ if(r=GdipCreateHICONFromBitmap(ri->himage, &hicon)){
1425
+ rb_raise(rb_eRuntimeError, "Failed to create icon: error code=%d", r);
1426
+ }
1427
+
1428
+ robj = RwIcon_Data_Make_Struct(cRwIcon, ric);
1429
+ ric->hicon = hicon;
1430
+ ric->shared = FALSE;
1431
+ Register_rsc(ric->hicon, robj);
1432
+ return robj;
1433
+ }
1434
+
1435
+ static VALUE
1436
+ rwgdip_rotateflip(VALUE self, VALUE v_rotate){
1437
+ RwImage *ri = DATA_PTR(self);
1438
+ if(GdipImageRotateFlip(ri->himage, FIX2INT(v_rotate))) return Qtrue;
1439
+ return Qfalse;
1440
+ }
1441
+
1442
+ static VALUE
1443
+ rwgdip_thumbnail(VALUE self, VALUE v_w, VALUE v_h){
1444
+ int r;
1445
+ HANDLE himage = NULL;
1446
+ RwImage *ri = DATA_PTR(self);
1447
+ r = GdipGetImageThumbnail(ri->himage,FIX2INT(v_w), FIX2INT(v_h), &himage, NULL, NULL);
1448
+ if(r==S_OK){
1449
+ RwImage *ri;
1450
+ VALUE robj = RwImage_Data_Make_Struct(cRwImage, ri);
1451
+ ri->himage = himage;
1452
+ Register_rsc(himage, robj);
1453
+ return robj;
1454
+ }else{
1455
+ return Qnil;
1456
+ }
1457
+ }
1458
+
1459
+ static VALUE
1460
+ rwgdip_getimagesize(VALUE self){
1461
+ UINT w = 0;
1462
+ UINT h = 0;
1463
+ RwImage *ri = DATA_PTR(self);
1464
+ GdipGetImageWidth(ri->himage, & w);
1465
+ GdipGetImageHeight(ri->himage, & h);
1466
+ return rb_ary_new3(2, INT2FIX(w), INT2FIX(h));
1467
+ }
1468
+
1469
+ static VALUE
1470
+ rwgdip_getimageresolution(VALUE self){
1471
+ REAL horiz = 0.0;
1472
+ REAL vert = 0.0;
1473
+ RwImage *ri = DATA_PTR(self);
1474
+ GdipGetImageHorizontalResolution(ri->himage, & horiz);
1475
+ GdipGetImageVerticalResolution(ri->himage, & vert);
1476
+ return rb_ary_new3(2, DBL2NUM(horiz), DBL2NUM(vert));
1477
+ }
1478
+
1479
+ static VALUE
1480
+ rwgdip_getpropertyitemlist(VALUE self){
1481
+ unsigned count, i;
1482
+ PROPID *propids;
1483
+ VALUE robj;
1484
+ RwImage *ri = DATA_PTR(self);
1485
+ GdipGetPropertyCount(ri->himage, &count);
1486
+ if(count==0) return Qnil;
1487
+ propids = malloc(count * sizeof(PROPID));
1488
+ GdipGetPropertyIdList(ri->himage, count, propids);
1489
+ robj = rb_ary_new2(count);
1490
+ for(i=0; i<count; i++){
1491
+ rb_ary_store(robj, i, INT2NUM(propids[i]));
1492
+ }
1493
+ return robj;
1494
+ }
1495
+
1496
+ static VALUE
1497
+ rwgdip_getproperty(VALUE self, VALUE v_id){
1498
+ VALUE robj;
1499
+ PropertyItem *pi;
1500
+ UINT size = 0;
1501
+ PROPID id = FIX2INT(v_id);
1502
+ RwImage *ri = DATA_PTR(self);
1503
+ GdipGetPropertyItemSize(ri->himage, id, &size);
1504
+ if(!size) rb_raise(rb_eArgError, "property id:%#x not exists in this picture", (int)id);
1505
+ pi = (PropertyItem*)malloc(size);
1506
+ GdipGetPropertyItem(ri->himage, id, size, pi);
1507
+ switch(pi->type){
1508
+ case PropertyTagTypeByte:
1509
+ case PropertyTagTypeShort:
1510
+ case PropertyTagTypeLong:
1511
+ robj = UINT2NUM(*(unsigned*)pi->value);
1512
+ break;
1513
+ case PropertyTagTypeASCII:
1514
+ robj = rb_str_new2(pi->value);
1515
+ break;
1516
+ case PropertyTagTypeRational:
1517
+ case PropertyTagTypeSRational:
1518
+ robj = DBL2NUM(*(double*)pi->value);
1519
+ break;
1520
+ case PropertyTagTypeSLONG:
1521
+ robj = INT2NUM(*(int*)pi->value);
1522
+ case PropertyTagTypeUndefined:
1523
+ default:
1524
+ free(pi);
1525
+ rb_raise(rb_eRuntimeError, "unknown type:%d", pi->type);
1526
+ }
1527
+ free(pi);
1528
+ return robj;
1529
+ }
1530
+
1531
+ static VALUE
1532
+ rwbitmap1_frompicture(int argc, VALUE *argv, VALUE klass){
1533
+ VALUE picobj, v_background, robj;
1534
+ RwBitmap *rb;
1535
+ RwImage *ri;
1536
+ DWORD background;
1537
+ HBITMAP hbitmap;
1538
+
1539
+ rb_scan_args(argc, argv, "11", &picobj, &v_background);
1540
+ background = NIL_P(v_background) ? 0 : NUM2UINT(v_background);
1541
+ RwImage_Data_Get_Struct(picobj, ri);
1542
+ GdipCreateHBITMAPFromBitmap(ri->himage, &hbitmap, background);
1543
+ robj = RwBitmap_Data_Make_Struct(klass, rb);
1544
+ rb->hbitmap = hbitmap;
1545
+ rb->shared = FALSE;
1546
+ rb->hdc = CreateCompatibleDC(NULL);
1547
+ SelectObject(rb->hdc, rb->hbitmap);
1548
+
1549
+ Register_rsc(rb->hbitmap, robj);
1550
+ return robj;
1551
+ }
1552
+
1553
+ static void
1554
+ rw_init_RwGdiplus(){
1555
+ rwgdiplus_startup();
1556
+ cRwImage = rb_define_class_under(mRwin, "Picture", rb_cObject);
1557
+
1558
+ // rb_define_singleton_method(cRwImage, "fromfile", rwgdip1_picture_fromfile, 1);
1559
+ rb_define_singleton_method(cRwImage, "fromfile", rwgdip1_picture_fromfilestream, 1);
1560
+ rb_define_singleton_method(cRwImage, "_load", rwgdip1__load, 1);
1561
+ rb_define_method(cRwImage, "saveto", rwgdip_picture_saveto_file, -1);
1562
+ rb_define_method(cRwImage, "_dump", rwgdip_picture__dump, -1);
1563
+
1564
+ rb_define_method(cRwImage, "_himage", rwgdip_himage, 0);
1565
+ rb_define_method(cRwImage, "to_bitmap", rwgdip_to_bitmap, -1);
1566
+ rb_define_method(cRwImage, "to_icon", rwgdip_to_icon, 0);
1567
+ rb_define_method(cRwImage, "rotateflip", rwgdip_rotateflip, 1);
1568
+ rb_define_method(cRwImage, "thumbnail", rwgdip_thumbnail, 2);
1569
+ rb_define_method(cRwImage, "size", rwgdip_getimagesize, 0);
1570
+ rb_define_method(cRwImage, "resolution", rwgdip_getimageresolution, 0);
1571
+ rb_define_method(cRwImage, "getpropertylist", rwgdip_getpropertyitemlist, 0);
1572
+ rb_define_method(cRwImage, "getproperty", rwgdip_getproperty, 1);
1573
+ // rb_define_method(cRwImage, "setproperty", rwgdip_setproperty, 2);
1574
+
1575
+ rb_define_singleton_method(cRwBitmap, "frompicture", rwbitmap1_frompicture, -1);
1576
+ }
1577
+
1578
+ /* Initializer */
1579
+ void
1580
+ Init_rw_graphics(){
1581
+ rw_init_RwCanvas();
1582
+ rw_init_RwGdiplus();
1583
+ }