wrb 2.0.0

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