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,1988 @@
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
+ /* from https://msdn.microsoft.com/en-us/library/ms997538.aspx */
12
+ typedef struct
13
+ {
14
+ WORD idReserved; // Reserved (must be 0)
15
+ WORD idType; // Resource Type (1 for icons)
16
+ WORD idCount; // How many images?
17
+ } ICONDIR;
18
+
19
+ typedef struct
20
+ {
21
+ BYTE bWidth; // Width, in pixels, of the image
22
+ BYTE bHeight; // Height, in pixels, of the image
23
+ BYTE bColorCount; // Number of colors in image (0 if >=8bpp)
24
+ BYTE bReserved; // Reserved ( must be 0)
25
+ WORD wPlanes; // Color Planes
26
+ WORD wBitCount; // Bits per pixel
27
+ DWORD dwBytesInRes; // How many bytes in this resource?
28
+ DWORD dwImageOffset; // Where in the file is this image?
29
+ } ICONDIRENTRY;
30
+
31
+ /* Bitmap */
32
+
33
+ VALUE cRwBitmap;
34
+
35
+ void
36
+ rwbitmap_free(void* ptr){
37
+ RwBitmap* rb = ptr;
38
+ DeleteDC(rb->hdc);
39
+ DeleteObject(rb->hddbitmap);
40
+ if(!rb->shared) DeleteObject(rb->hbitmap);
41
+ free(rb);
42
+ }
43
+
44
+ static size_t
45
+ rwbitmap_memsize(const void *ptr){
46
+ return ptr ? sizeof(RwBitmap) : 0;
47
+ }
48
+
49
+ const rb_data_type_t
50
+ rwbitmap_data_type = {
51
+ "Bitmap", {NULL, rwbitmap_free, rwbitmap_memsize}, NULL, NULL
52
+ };
53
+
54
+ static VALUE
55
+ alloc_rwbitmap(VALUE klass){
56
+ RwBitmap* rb;
57
+ VALUE robj = RwBitmap_Data_Make_Struct(klass, rb);
58
+ rb->type = RcBitmap;
59
+ rb->hbitmap = 0;
60
+ rb->hddbitmap = 0;
61
+ rb->hdc = 0;
62
+ rb->shared = FALSE;
63
+ return robj;
64
+ }
65
+
66
+ static void
67
+ rw_setbihdr(BITMAPINFOHEADER *bih, int w, int h, int planes, int bitcount, size_t szimage){
68
+ bih->biSize = sizeof(BITMAPINFOHEADER);
69
+ bih->biWidth = w;
70
+ bih->biHeight = h;
71
+ bih->biPlanes = planes;
72
+ bih->biBitCount = bitcount;
73
+ bih->biCompression = BI_RGB; /* 0L */
74
+ bih->biSizeImage = szimage;
75
+ bih->biXPelsPerMeter = 0; /* not used */
76
+ bih->biYPelsPerMeter = 0; /* not used */
77
+ bih->biClrUsed = 0;
78
+ bih->biClrImportant = 0;
79
+ }
80
+
81
+ HBITMAP
82
+ rw_dib2ddb(RwBitmap *rb){
83
+ BITMAP bmp;
84
+ BITMAPINFO *pbi;
85
+ void *dibdata;
86
+ size_t bisize = sizeof(BITMAPINFO);
87
+
88
+ if(rb->hddbitmap) DeleteObject(rb->hddbitmap);
89
+ GetObject(rb->hbitmap, sizeof(BITMAP), &bmp);
90
+ switch(bmp.bmBitsPixel){
91
+ case 1:
92
+ case 4:
93
+ case 8:
94
+ bisize += (2<<(bmp.bmBitsPixel-1))*4;
95
+ }
96
+ RW_MALLOC(pbi, bisize);
97
+ rw_setbihdr((BITMAPINFOHEADER*)pbi, bmp.bmWidth, bmp.bmHeight, 1, bmp.bmBitsPixel, 0);
98
+ GetDIBits(rb->hdc, rb->hbitmap, 0, bmp.bmHeight, NULL, pbi, DIB_RGB_COLORS);
99
+ RW_MALLOC(dibdata, pbi->bmiHeader.biSizeImage);
100
+ GetDIBits(rb->hdc, rb->hbitmap, 0, bmp.bmHeight, dibdata, pbi, DIB_RGB_COLORS);
101
+ rb->hddbitmap = CreateDIBitmap(rb->hdc, &pbi->bmiHeader, CBM_INIT, dibdata,
102
+ pbi, DIB_RGB_COLORS);
103
+ free(pbi);
104
+ free(dibdata);
105
+ return rb->hddbitmap;
106
+ }
107
+
108
+ void
109
+ rw_bitmap_set_dc(RwBitmap *rb, int w, int h){
110
+ HDC hdctmp = GetDC(NULL);
111
+ rb->hbitmap = CreateCompatibleBitmap(hdctmp, w, h);
112
+ rb->hdc = CreateCompatibleDC(hdctmp);
113
+ SelectObject(rb->hdc, rb->hbitmap);
114
+ ReleaseDC(NULL, hdctmp);
115
+ }
116
+
117
+ static VALUE
118
+ rwbitmap_initialize(int argc, VALUE *argv, VALUE self){
119
+ VALUE v_w, v_h, v_color;
120
+ int w, h;
121
+ RwBitmap *rb = DATA_PTR(self);
122
+ rb_scan_args(argc, argv, "21", &v_w, &v_h, &v_color);
123
+ w = FIX2INT(v_w); h = FIX2INT(v_h);
124
+ rw_bitmap_set_dc(rb, w, h);
125
+ if(!NIL_P(v_color)){
126
+ RECT rect;
127
+ COLORREF prevcolor = SetDCBrushColor(rb->hdc, FIX2INT(v_color));
128
+ rect.left = -1; rect.top = -1; rect.right = w + 1; rect.bottom = h + 1;
129
+ FillRect(rb->hdc, &rect, GetStockObject(DC_BRUSH));
130
+ SetDCBrushColor(rb->hdc, prevcolor);
131
+ }
132
+ Register_rsc(rb->hbitmap, self);
133
+ return self;
134
+ }
135
+
136
+ static VALUE
137
+ rwbitmap1_fromfile(VALUE klass, VALUE fname){
138
+ char abspath[RW_MAXPATH];
139
+ RwBitmap* rb;
140
+ VALUE robj = RwBitmap_Data_Make_Struct(klass, rb);
141
+ rwconv2absolute_path(abspath, RSTRING_PTR(fname));
142
+ rb->hbitmap = LoadImageA(NULL, abspath, IMAGE_BITMAP, 0, 0, LR_DEFAULTSIZE | LR_LOADFROMFILE);
143
+ if(!rb->hbitmap){
144
+ char pwd[256];
145
+ getcwd(pwd, sizeof(pwd));
146
+ rb_raise(rb_eRuntimeError, "Bitmap load failed(%s), err=%d, pwd=%s.",
147
+ abspath, (int)GetLastError(), pwd);
148
+ }
149
+ rb->shared = FALSE;
150
+ rb->type = RcBitmap;
151
+ rb->hdc = CreateCompatibleDC(NULL);
152
+ SelectObject(rb->hdc, rb->hbitmap);
153
+
154
+ Register_rsc(rb->hbitmap, robj);
155
+ return robj;
156
+ }
157
+
158
+ static VALUE
159
+ rwbitmap1_fromhandle_core(VALUE klass, HBITMAP hbitmap){
160
+ VALUE robj;
161
+ RwBitmap* rb;
162
+ HDC hdc = CreateCompatibleDC(NULL);
163
+ if (!SelectObject(hdc, hbitmap)) rb_raise(rb_eRuntimeError, "Bitmap create failed.");
164
+ robj = RwBitmap_Data_Make_Struct(klass, rb);
165
+ rb->hbitmap = hbitmap;
166
+ rb->hdc = hdc;
167
+ Register_rsc(rb->hbitmap, robj);
168
+ return robj;
169
+ }
170
+
171
+ static VALUE
172
+ rwbitmap1_fromhandle(VALUE klass, VALUE v_hbitmap){
173
+ VALUE robj = Get_rsc(NUM2INT(v_hbitmap));
174
+ if (robj) return robj;
175
+ return rwbitmap1_fromhandle_core(klass, (HANDLE)NUM2ULONG_PTR(v_hbitmap));
176
+ }
177
+
178
+ static VALUE
179
+ rwbitmap1_monochrome(VALUE klass, VALUE v_w, VALUE v_h){
180
+ RwBitmap* rb;
181
+ VALUE robj = RwBitmap_Data_Make_Struct(klass, rb);
182
+ rb->hbitmap = CreateBitmap(FIX2INT(v_w), FIX2INT(v_h), 1, 1, NULL);
183
+ rb->hdc = CreateCompatibleDC(NULL);
184
+ SelectObject(rb->hdc, rb->hbitmap);
185
+ Register_rsc(rb->hbitmap, robj);
186
+ return robj;
187
+ }
188
+
189
+ static VALUE
190
+ rwbitmap_hbitmap(VALUE self){
191
+ RwBitmap *rb = DATA_PTR(self);
192
+ return ULONG_PTR2NUM((ULONG_PTR)rb->hbitmap);
193
+ }
194
+
195
+ static VALUE
196
+ rwbitmap_hddbitmap(VALUE self){
197
+ RwBitmap *rb = DATA_PTR(self);
198
+ if(!rb->hddbitmap) rw_dib2ddb(rb);
199
+ return ULONG_PTR2NUM((ULONG_PTR)rb->hddbitmap);
200
+ }
201
+
202
+
203
+ static VALUE
204
+ rwbitmap_hdc(VALUE self){
205
+ RwBitmap *rb = DATA_PTR(self);
206
+ return ULONG_PTR2NUM((ULONG_PTR)rb->hdc);
207
+ }
208
+
209
+ static VALUE
210
+ rwbitmap_width(VALUE self){
211
+ BITMAP bmp;
212
+ RwBitmap *rb = DATA_PTR(self);
213
+ GetObject(rb->hbitmap, sizeof(BITMAP), &bmp);
214
+ return INT2FIX(bmp.bmWidth);
215
+ }
216
+
217
+ static VALUE
218
+ rwbitmap_height(VALUE self){
219
+ BITMAP bmp;
220
+ RwBitmap *rb = DATA_PTR(self);
221
+ GetObject(rb->hbitmap, sizeof(BITMAP), &bmp);
222
+ return INT2FIX(bmp.bmHeight);
223
+ }
224
+
225
+ static VALUE
226
+ rwbitmap_draw(int argc, VALUE *argv, VALUE self){
227
+ VALUE klass, obj;
228
+ RwCanvas *cv;
229
+ RwBitmap *rb = DATA_PTR(self);
230
+ rb_scan_args(argc, argv, "01", &klass);
231
+ if(!rb_block_given_p()) rb_raise(rb_eArgError, "Need block");
232
+ if (NIL_P(klass)) klass = cRwCanvas;
233
+ obj = RwCanvas_Data_Make_Struct(klass, cv);
234
+ cv->hdc = rb->hdc;
235
+ rb_yield(obj);
236
+ return self;
237
+ }
238
+
239
+ static VALUE
240
+ rwbitmap_dispose(VALUE self){
241
+ RwBitmap *rb = DATA_PTR(self);
242
+ DeleteDC(rb->hdc);
243
+ if (rb->hbitmap) {
244
+ if(!rb->shared) DeleteObject(rb->hbitmap);
245
+ rb->hbitmap = NULL;
246
+ return Qtrue;
247
+ }
248
+ return Qnil;
249
+ }
250
+ /* moved to wrb/components/Bitmap.rb
251
+ static VALUE
252
+ rwbitmap_create_mask(VALUE self, VALUE v_mskclr){
253
+ COLORREF oldbkclr;
254
+ int w, h;
255
+ VALUE robj;
256
+ BITMAP bmp;
257
+ RwBitmap *rmsk;
258
+ RwBitmap *rb = DATA_PTR(self);
259
+ GetObject(rb->hbitmap, sizeof(BITMAP), &bmp);
260
+ w = bmp.bmWidth; h = bmp.bmHeight;
261
+ robj = RwBitmap_Data_Make_Struct(CLASS_OF(self), rmsk);
262
+ oldbkclr = SetBkColor(rb->hdc, NUM2INT(v_mskclr));
263
+ rmsk->hdc = CreateCompatibleDC(NULL);
264
+ rmsk->hbitmap = CreateBitmap(w, h, 1, 1, NULL);
265
+ SelectObject(rmsk->hdc, rmsk->hbitmap);
266
+ BitBlt(rmsk->hdc, 0, 0, w, h, rb->hdc, 0, 0, NOTSRCCOPY);
267
+ SetBkColor(rb->hdc, oldbkclr);
268
+ Register_rsc(rmsk->hbitmap, robj);
269
+ return robj;
270
+ }
271
+
272
+ static VALUE
273
+ rwbitmap_create_maskimage(VALUE self, VALUE v_mskclr){
274
+ COLORREF oldbkclr;
275
+ int w, h;
276
+ VALUE robj;
277
+ BITMAP bmp;
278
+ HBITMAP hbmptmp;
279
+ HDC hdctmp;
280
+ RwBitmap *rmsk;
281
+ RwBitmap *rb = DATA_PTR(self);
282
+ GetObject(rb->hbitmap, sizeof(BITMAP), &bmp);
283
+ w = bmp.bmWidth; h = bmp.bmHeight;
284
+ robj = RwBitmap_Data_Make_Struct(CLASS_OF(self), rmsk);
285
+ oldbkclr = SetBkColor(rb->hdc, NUM2INT(v_mskclr));
286
+ hdctmp = CreateCompatibleDC(NULL);
287
+ hbmptmp = CreateBitmap(w, h, 1, 1, NULL);
288
+ SelectObject(hdctmp, hbmptmp);
289
+ BitBlt(hdctmp, 0, 0, w, h, rb->hdc, 0, 0, SRCCOPY);
290
+ SetBkColor(rb->hdc, oldbkclr);
291
+
292
+ rw_bitmap_set_dc(rmsk, w, h);
293
+ SelectObject(rmsk->hdc, rmsk->hbitmap);
294
+ BitBlt(rmsk->hdc, 0, 0, w, h, hdctmp, 0, 0, SRCCOPY);
295
+ DeleteObject(hbmptmp);
296
+ ReleaseDC(NULL, hdctmp);
297
+ Register_rsc(rmsk->hbitmap, robj);
298
+ return robj;
299
+ }
300
+ */
301
+
302
+ static VALUE
303
+ rwbitmap_getpixel(VALUE self, VALUE v_x, VALUE v_y){
304
+ RwBitmap *rb = DATA_PTR(self);
305
+ return UINT2NUM(GetPixel(rb->hdc, FIX2INT(v_x), FIX2INT(v_y)));
306
+ }
307
+
308
+ static VALUE
309
+ rwbitmap_setpixel(VALUE self, VALUE v_x, VALUE v_y, VALUE v_clr){
310
+ RwBitmap *rb = DATA_PTR(self);
311
+ return UINT2NUM(SetPixel(rb->hdc, FIX2INT(v_x), FIX2INT(v_y), (COLORREF)FIX2INT(v_clr)));
312
+ }
313
+
314
+ static VALUE
315
+ rwbitmap_getdepth(VALUE self){
316
+ BITMAP bmp;
317
+ RwBitmap *rb = DATA_PTR(self);
318
+ GetObject(rb->hbitmap,sizeof(BITMAP), &bmp);
319
+ return INT2FIX(bmp.bmBitsPixel);
320
+ }
321
+
322
+ static VALUE
323
+ rwbitmap1__load(VALUE klass, VALUE str){
324
+ RwBitmap* rb;
325
+ VALUE robj;
326
+ BITMAPINFO *bi;
327
+ int biw, bih;
328
+ char *ptr = RSTRING_PTR(str);
329
+ char *bits;
330
+ BITMAPFILEHEADER *bf = (BITMAPFILEHEADER*)ptr;
331
+ if(bf->bfType!=0x4d42) rb_raise(rb_eArgError, "Not a bitmap file");
332
+ bi = (BITMAPINFO*)(ptr + sizeof(BITMAPFILEHEADER));
333
+ bits = ptr + bf->bfOffBits;
334
+ biw = bi->bmiHeader.biWidth;
335
+ bih = bi->bmiHeader.biHeight;
336
+
337
+ robj = RwBitmap_Data_Make_Struct(klass, rb);
338
+ rb->type = RcBitmap;
339
+ rw_bitmap_set_dc(rb, biw, bih);
340
+ SetDIBitsToDevice(rb->hdc, 0, 0, biw, bih, 0, 0, 0, bih, bits, bi, DIB_RGB_COLORS);
341
+ Register_rsc(rb->hbitmap, robj);
342
+ return robj;
343
+ }
344
+
345
+ static size_t
346
+ rwbitmap__dump_core(VALUE self, LPVOID lpbmpdata, int cdpth, size_t szimage, int cctbl){
347
+ LPVOID lpvBits;
348
+ BITMAP bmp;
349
+ RwBitmap *rb = DATA_PTR(self);
350
+
351
+ GetObject(rb->hbitmap, sizeof(BITMAP), &bmp);
352
+ if(!lpbmpdata){
353
+ BITMAPINFO *bi = alloca(sizeof(BITMAPINFOHEADER)+1024);
354
+ rw_setbihdr((BITMAPINFOHEADER*)bi, bmp.bmWidth, bmp.bmHeight, 1, cdpth, szimage);
355
+ GetDIBits(rb->hdc, rb->hbitmap, 0, bmp.bmHeight, NULL, bi, DIB_RGB_COLORS);
356
+ return bi->bmiHeader.biSizeImage;
357
+ } else {
358
+ BITMAPINFO *bi = (BITMAPINFO*)((char*)lpbmpdata + sizeof(BITMAPFILEHEADER));
359
+ BITMAPFILEHEADER *bmifilehdr = (BITMAPFILEHEADER *)lpbmpdata;
360
+ bmifilehdr->bfType = 0x4d42; /* "BM" */
361
+ bmifilehdr->bfSize = szimage + sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
362
+ bmifilehdr->bfReserved1 = 0;
363
+ bmifilehdr->bfReserved2 = 0;
364
+ bmifilehdr->bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + cctbl;
365
+
366
+ rw_setbihdr((BITMAPINFOHEADER*)bi, bmp.bmWidth, bmp.bmHeight, 1, cdpth, szimage);
367
+ lpvBits = (char*)lpbmpdata + sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + cctbl;
368
+ return GetDIBits(rb->hdc, rb->hbitmap, 0, bmp.bmHeight, lpvBits, bi, DIB_RGB_COLORS);
369
+ }
370
+ }
371
+
372
+ // fprintf(stderr, "cdpth=%d, biSize=%d, biWidth=%d, biPlanes=%d, biBitCount=%d, biCompression=%d, biSizeImage=%d, biXPelsPerMeter=%d, biYPelsPerMeter=%d, biClrUsed=%d, biClrImportant=%d\n", cdpth, bi.bmiHeader.biSize, bi.bmiHeader.biWidth, bi.bmiHeader.biPlanes, bi.bmiHeader.biBitCount, bi.bmiHeader.biCompression, bi.bmiHeader.biSizeImage, bi.bmiHeader.biXPelsPerMeter, bi.bmiHeader.biYPelsPerMeter, bi.bmiHeader.biClrUsed, bi.bmiHeader.biClrImportant);
373
+
374
+ static int
375
+ rw_get_colortable_len(int clrdpth){
376
+ switch(clrdpth){
377
+ case 1: case 4: case 8:
378
+ return 4 * (2 << (clrdpth-1));
379
+ case 16: case 24: case 32:
380
+ return 0;
381
+ default:
382
+ rb_raise(rb_eArgError, "Color depth must be 1, 4, 8, 16, 24 or 32, but got %d.", clrdpth);
383
+ }
384
+ }
385
+
386
+ static VALUE
387
+ rwbitmap__dump(int argc, VALUE* argv, VALUE self){
388
+ LPVOID lpbmpdata = NULL;
389
+ int offsetbits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
390
+ int cdpth = argc>0 ? FIX2INT(argv[0]) : 32;
391
+ int cctbl = rw_get_colortable_len(cdpth);
392
+ size_t szimage = rwbitmap__dump_core(self, NULL, cdpth, 0, cctbl);
393
+ RW_MALLOC(lpbmpdata, szimage + offsetbits + cctbl);
394
+ if(rwbitmap__dump_core(self, lpbmpdata, cdpth, szimage, cctbl)){
395
+ VALUE str = rb_str_new((char*)lpbmpdata, szimage + offsetbits + cctbl);
396
+ if(lpbmpdata) free(lpbmpdata);
397
+ return str;
398
+ } else {
399
+ if(lpbmpdata) free(lpbmpdata);
400
+ return Qnil;
401
+ }
402
+ }
403
+
404
+ //VALUE rwgdip1__load_core(VALUE klass, LPVOID lpdata, size_t len); /* prottyping */
405
+ /*
406
+ static VALUE
407
+ rwbitmap_to_image(VALUE self){
408
+ LPVOID lpbmpdata = NULL;
409
+ int offsetbits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
410
+ size_t szimage = rwbitmap__dump_core(self, lpbmpdata, 32, 0, 0);
411
+ RW_MALLOC(lpbmpdata, szimage + offsetbits);
412
+ if(rwbitmap__dump_core(self, lpbmpdata, 32, szimage, 0)){
413
+ VALUE robj=rwgdip1__load_core(cRwImage, lpbmpdata, szimage + offsetbits);
414
+ if(lpbmpdata) free(lpbmpdata);
415
+ return robj;
416
+ } else {
417
+ if(lpbmpdata) free(lpbmpdata);
418
+ return Qnil;
419
+ }
420
+ }*/
421
+
422
+ static void
423
+ rw_init_Bitmap(){
424
+ cRwBitmap = rb_define_class_under(mRwin, "Bitmap", rb_cData);
425
+ rb_define_alloc_func(cRwBitmap, alloc_rwbitmap);
426
+
427
+ rb_define_singleton_method(cRwBitmap, "fromfile", rwbitmap1_fromfile, 1);
428
+ rb_define_singleton_method(cRwBitmap, "fromhandle", rwbitmap1_fromhandle, 1);
429
+ rb_define_singleton_method(cRwBitmap, "monochrome", rwbitmap1_monochrome, 2);
430
+
431
+ rb_define_method(cRwBitmap, "initialize", rwbitmap_initialize, -1);
432
+ rb_define_method(cRwBitmap, "_hbitmap", rwbitmap_hbitmap, 0);
433
+ rb_define_method(cRwBitmap, "_hddbitmap", rwbitmap_hddbitmap, 0);
434
+ rb_define_method(cRwBitmap, "_hdc", rwbitmap_hdc, 0);
435
+ rb_define_method(cRwBitmap, "width", rwbitmap_width, 0);
436
+ rb_define_method(cRwBitmap, "height", rwbitmap_height, 0);
437
+ rb_define_method(cRwBitmap, "depth", rwbitmap_getdepth, 0);
438
+ rb_define_method(cRwBitmap, "draw", rwbitmap_draw, -1);
439
+ rb_define_method(cRwBitmap, "dispose", rwbitmap_dispose, 0);
440
+ // rb_define_method(cRwBitmap, "to_mask", rwbitmap_create_mask, 1);
441
+ // rb_define_method(cRwBitmap, "to_maskimage", rwbitmap_create_maskimage, 1);
442
+ // rb_define_method(cRwBitmap, "to_maskimage", rwbitmap_create_maskimage, 1);
443
+
444
+ /* GDI functions (except Canvas) */
445
+ rb_define_method(cRwBitmap, "GetPixel", rwbitmap_getpixel, 2);
446
+ rb_define_method(cRwBitmap, "SetPixel", rwbitmap_setpixel, 3);
447
+
448
+ rb_define_singleton_method(cRwBitmap, "_load", rwbitmap1__load, 1);
449
+ rb_define_method(cRwBitmap, "_dump", rwbitmap__dump, -1);
450
+ // rb_define_method(cRwBitmap, "to_image", rwbitmap_to_image, 0);
451
+ }
452
+
453
+ /* Icon */
454
+
455
+ VALUE cRwIcon;
456
+
457
+ void
458
+ rwicon_free(void* ptr){
459
+ RwIcon* ri = ptr;
460
+ if(!ri->shared) DestroyIcon(ri->hicon);
461
+ free(ri);
462
+ }
463
+
464
+ static size_t
465
+ rwicon_memsize(const void *ptr){
466
+ return ptr ? sizeof(RwIcon) : 0;
467
+ }
468
+
469
+ const rb_data_type_t
470
+ rwicon_data_type = {
471
+ "Icon", {NULL, rwicon_free, rwicon_memsize}, NULL, NULL
472
+ };
473
+
474
+ static VALUE
475
+ alloc_rwicon(VALUE klass){
476
+ RwIcon* ri;
477
+ VALUE robj = RwIcon_Data_Make_Struct(klass, ri);
478
+ ri->type = RcIcon;
479
+ return robj;
480
+ }
481
+
482
+ static VALUE
483
+ rwicon1_fromfile(int argc, VALUE* argv, VALUE klass){
484
+ char abspath[RW_MAXPATH];
485
+ RwIcon* ri;
486
+ VALUE robj, fname, disired_x, disired_y;
487
+ int dx, dy;
488
+ rb_scan_args(argc, argv, "12", &fname, &disired_x, &disired_y);
489
+ dx = NIL_P(disired_x) ? 0 : FIX2INT(disired_x);
490
+ dy = NIL_P(disired_y) ? dx : FIX2INT(disired_y);
491
+ robj = RwIcon_Data_Make_Struct(klass, ri);
492
+ ri->type = RcIcon;
493
+ rwconv2absolute_path(abspath, RSTRING_PTR(fname));
494
+ ri->hicon = LoadImageA(NULL, abspath, IMAGE_ICON, dx, dy, LR_LOADFROMFILE);
495
+ ri->shared = FALSE;
496
+ if(!ri->hicon){
497
+ rb_raise(rb_eRuntimeError, "Icon load failed(%s).", StringValuePtr(fname));
498
+ }
499
+ Register_rsc(ri->hicon, robj);
500
+ return robj;
501
+ }
502
+
503
+ static VALUE
504
+ rwicon1_fromrsrc(VALUE klass, VALUE idicon){
505
+ RwIcon* ri;
506
+ VALUE robj = RwIcon_Data_Make_Struct(klass, ri);
507
+ ri->type = RcIcon;
508
+ ri->hicon = LoadImage(hInstance, MAKEINTRESOURCE(FIX2INT(idicon)), IMAGE_ICON, 0, 0, LR_DEFAULTSIZE);
509
+ if(ri->hicon==NULL){
510
+ rb_raise(rb_eRuntimeError, "Icon load failed from resource (%d, %d).", FIX2INT(idicon), (int)GetLastError());
511
+ }
512
+ ri->shared = FALSE;
513
+ Register_rsc(ri->hicon, robj);
514
+ return robj;
515
+ }
516
+
517
+ static VALUE
518
+ rwicon_initialize(VALUE self, VALUE v_bmmask, VALUE v_bmcolor){
519
+ RwBitmap *rbmask, *rbcolor;
520
+ ICONINFO iinfo;
521
+ RwIcon *ri = DATA_PTR(self);
522
+ iinfo.fIcon = TRUE;
523
+ iinfo.xHotspot = 0;
524
+ iinfo.xHotspot = 0;
525
+ RwBitmap_Data_Get_Struct(v_bmmask, rbmask);
526
+ iinfo.hbmMask = rw_dib2ddb(rbmask);
527
+ RwBitmap_Data_Get_Struct(v_bmcolor, rbcolor);
528
+ iinfo.hbmColor = rw_dib2ddb(rbcolor);
529
+ ri->hicon = CreateIconIndirect(&iinfo);
530
+ if (!ri->hicon) rb_raise(rb_eRuntimeError, "failed to create icon");
531
+ ri->shared = FALSE;
532
+ return self;
533
+ }
534
+
535
+ static VALUE
536
+ rwicon_hicon(VALUE self){
537
+ RwIcon *ri = DATA_PTR(self);
538
+ return ULONG_PTR2NUM((ULONG_PTR)ri->hicon);
539
+ }
540
+
541
+ static VALUE
542
+ rwicon_dispose(VALUE self){
543
+ RwIcon *ri = DATA_PTR(self);
544
+ if (ri->hicon) {
545
+ if(!ri->shared) DestroyIcon(ri->hicon);
546
+ ri->hicon = NULL;
547
+ return Qtrue;
548
+ }
549
+ return Qnil;
550
+ }
551
+
552
+ static VALUE
553
+ rwicon_to_bmps(VALUE self){
554
+ ICONINFO iinfo;
555
+ VALUE v_bmmask, v_bmcolor;
556
+ RwIcon *ri = DATA_PTR(self);
557
+ GetIconInfo(ri->hicon, &iinfo);
558
+ v_bmmask = rwbitmap1_fromhandle_core(cRwBitmap, iinfo.hbmMask);
559
+ v_bmcolor = iinfo.hbmColor ? rwbitmap1_fromhandle_core(cRwBitmap, iinfo.hbmColor) : Qnil;
560
+ DeleteObject(iinfo.hbmMask);
561
+ DeleteObject(iinfo.hbmColor);
562
+ if(iinfo.fIcon) return rb_ary_new3(2, v_bmmask, v_bmcolor);
563
+ return rb_ary_new3(4, v_bmmask, v_bmcolor, INT2FIX(iinfo.xHotspot), INT2FIX(iinfo.yHotspot));
564
+ }
565
+
566
+ static VALUE
567
+ rwicon__dump_core(ICONINFO *ii, ICONDIRENTRY *pid, int clrdpth){
568
+ int ccmsk, ccclr, ccalloc, cctable;
569
+ char *ptr, *pimage;
570
+ HANDLE hbmclr;
571
+ BITMAP bmmsk, bmclr;
572
+ BITMAPINFO *pbimsk, *pbiclr, *pbi;
573
+ VALUE res;
574
+
575
+ HDC hdc = CreateCompatibleDC(NULL);
576
+ hbmclr = ii->hbmColor;
577
+ clrdpth = hbmclr ? clrdpth : 1;
578
+ cctable = rw_get_colortable_len(clrdpth);
579
+ ccclr = 0;
580
+ GetObject(ii->hbmMask, sizeof(BITMAP), &bmmsk);
581
+ GetObject(ii->hbmColor, sizeof(BITMAP), &bmclr);
582
+ if(bmmsk.bmBitsPixel!=1) rb_raise(rb_eArgError, "Mask bitmap may be broken.");
583
+
584
+ ccalloc = sizeof(BITMAPINFOHEADER) + cctable;
585
+ RW_CALLOC(pbimsk, sizeof(BITMAPINFOHEADER)+1024);
586
+ rw_setbihdr((BITMAPINFOHEADER*)pbimsk, bmmsk.bmWidth, bmmsk.bmHeight, 1, 1, 0);
587
+ GetDIBits(hdc, ii->hbmMask, 0, bmmsk.bmHeight, NULL, pbimsk, DIB_RGB_COLORS);
588
+ ccmsk = pbimsk->bmiHeader.biSizeImage;
589
+ free(pbimsk);
590
+ ccalloc += ccmsk;
591
+ if(hbmclr){
592
+ RW_CALLOC(pbiclr, sizeof(BITMAPINFOHEADER)+cctable);
593
+ rw_setbihdr((BITMAPINFOHEADER*)pbiclr, bmclr.bmWidth, bmclr.bmHeight, 1, clrdpth, 0);
594
+ GetDIBits(hdc, ii->hbmColor, 0, bmclr.bmHeight, NULL, pbiclr, DIB_RGB_COLORS);
595
+ ccclr = pbiclr->bmiHeader.biSizeImage;
596
+ free(pbiclr);
597
+ ccalloc += ccclr;
598
+ }
599
+ pid->bWidth = bmmsk.bmWidth;
600
+ pid->bHeight = hbmclr ? bmclr.bmHeight : bmmsk.bmHeight/2;
601
+ pid->wPlanes = ii->fIcon ? 1 : ii->xHotspot;
602
+ pid->wBitCount = ii->fIcon ? clrdpth : (WORD)ii->yHotspot;
603
+ pid->dwBytesInRes = sizeof(BITMAPINFOHEADER) + cctable + ccmsk + ccclr;
604
+ pid->dwImageOffset = sizeof(ICONDIR) + sizeof(ICONDIRENTRY);
605
+ // fprintf(stderr, "w=%d, h=%d, cctable=%d, ccmsk=%d, ccclr=%d, clrdpth=%d, ccalloc=%d\n", pid->bWidth, pid->bHeight, cctable, ccmsk, ccclr, clrdpth, ccalloc);
606
+
607
+ RW_CALLOC(ptr, ccalloc);
608
+ pimage = ptr;
609
+ pbi = (BITMAPINFO*)pimage;
610
+ /* Set mask bits at first. */
611
+ rw_setbihdr((BITMAPINFOHEADER*)pbi, bmmsk.bmWidth, bmmsk.bmHeight, 1, 1, 0);
612
+ pimage += sizeof(BITMAPINFOHEADER) + cctable;
613
+ GetDIBits(hdc, ii->hbmMask, 0, bmmsk.bmHeight, pimage+ccclr, pbi, DIB_RGB_COLORS);
614
+ if(hbmclr){ /* Set color bits next. */
615
+ rw_setbihdr((BITMAPINFOHEADER*)pbi, bmclr.bmWidth, bmclr.bmHeight, 1, clrdpth, 0);
616
+ GetDIBits(hdc, ii->hbmColor, 0, bmclr.bmHeight, pimage, pbi, DIB_RGB_COLORS);
617
+ pimage += pbi->bmiHeader.biSizeImage;
618
+ pbi->bmiHeader.biHeight += bmmsk.bmHeight;
619
+ }
620
+ pbi->bmiHeader.biSizeImage = 0;
621
+ res = rb_str_new(ptr, ccalloc);
622
+ ReleaseDC(NULL, hdc);
623
+ free(ptr);
624
+ return res;
625
+ }
626
+
627
+ static VALUE
628
+ rwicon__dump(int argc, VALUE *argv, VALUE self){
629
+ VALUE robj, rstr;
630
+ char *pstr;
631
+ ICONINFO ii;
632
+ ICONDIR *idir;
633
+ ICONDIRENTRY *idirent;
634
+ int clrdpth = argc>0 ? FIX2INT(argv[0]) : 24;
635
+ RwIcon *ri = DATA_PTR(self);
636
+ int ccalloc = sizeof(ICONDIR) + sizeof(ICONDIRENTRY);
637
+ RW_CALLOC(pstr, ccalloc);
638
+ GetIconInfo(ri->hicon, &ii);
639
+ idir = (ICONDIR*)pstr;
640
+ idir->idType = ii.fIcon ? 1 : 2;
641
+ idir->idCount = 1;
642
+ idirent = (ICONDIRENTRY*)(pstr+sizeof(ICONDIR));
643
+ rstr = rwicon__dump_core(&ii, idirent, clrdpth);
644
+ robj = rb_str_new(pstr, ccalloc);
645
+ rb_str_cat(robj, RSTRING_PTR(rstr), RSTRING_LEN(rstr));
646
+ return robj;
647
+ }
648
+
649
+ /* Obsolete
650
+ static VALUE
651
+ rwicon1__dump(int argc, VALUE *argv, VALUE klass){
652
+ VALUE robj, rstr;
653
+ char *pstr;
654
+ int i, ofst, ccalloc, clrdpth, imageoffset;
655
+ ICONDIR *idir;
656
+ ICONDIRENTRY *idirent;
657
+ if (FIXNUM_P(argv[0])){
658
+ clrdpth = FIX2INT(argv[0]);
659
+ argc --;
660
+ ofst = 1;
661
+ } else {
662
+ clrdpth = 24;
663
+ ofst = 0;
664
+ }
665
+ ccalloc = sizeof(ICONDIR) + sizeof(ICONDIRENTRY)*argc;
666
+ RW_CALLOC(pstr, ccalloc);
667
+ idir = (ICONDIR*)pstr;
668
+ idir->idType = 1;
669
+ idir->idCount = argc;
670
+ rstr = rb_str_new(NULL, 0);
671
+ idirent = (ICONDIRENTRY*)(pstr + sizeof(ICONDIR));
672
+ imageoffset = ccalloc;
673
+ for(i=0; i<argc; i++){
674
+ VALUE rstr1;
675
+ ICONINFO ii;
676
+ RwIcon *ri;
677
+ RwIcon_Data_Get_Struct(argv[i+ofst], ri);
678
+ GetIconInfo(ri->hicon, &ii);
679
+ rstr1 = rwicon__dump_core(&ii, &idirent[i], clrdpth);
680
+ idirent[i].dwImageOffset = imageoffset;
681
+ imageoffset += RSTRING_LEN(rstr1);
682
+ rb_str_cat(rstr, RSTRING_PTR(rstr1), RSTRING_LEN(rstr1));
683
+ } //;fprintf(stderr, "argc=%d, ccalloc=%d", argc, ccalloc);
684
+ robj = rb_str_new(pstr, ccalloc);
685
+ rb_str_cat(robj, RSTRING_PTR(rstr), RSTRING_LEN(rstr));
686
+ return robj;
687
+ }
688
+ */
689
+
690
+ static HANDLE
691
+ rwicon1__load_core(char *pstr, ICONDIRENTRY *idirent, BOOL ficon){
692
+ BITMAPINFOHEADER *bihdr;
693
+ BITMAPINFO *bimsk;
694
+ int w, h, bc, offset;
695
+ HBITMAP hbmmsk, hbmclr;
696
+ ICONINFO ii;
697
+ HDC hdc;
698
+ HANDLE hicon;
699
+ char *ptr;
700
+ ptr = pstr + idirent->dwImageOffset;
701
+ w = idirent->bWidth;
702
+ h = idirent->bHeight;
703
+ bihdr = (BITMAPINFOHEADER*) ptr;
704
+ bc = ficon ? idirent->wBitCount : bihdr->biBitCount;
705
+ offset = bc<=8 ? (2<<(bc-1))*4 : 0; /* size of color table */
706
+ ptr += sizeof(BITMAPINFOHEADER) + offset;
707
+ hdc = GetDC(NULL);
708
+ if(bc>1){
709
+ bihdr->biWidth = w;
710
+ bihdr->biHeight = h;
711
+ bihdr->biSizeImage = w*h*bc/8;
712
+ hbmclr = CreateDIBitmap(hdc, bihdr, CBM_INIT, ptr, (BITMAPINFO*)bihdr, DIB_RGB_COLORS);
713
+ ptr += bihdr->biSizeImage;
714
+ } else {
715
+ h = h*2;
716
+ hbmclr = NULL;
717
+ }
718
+
719
+ RW_CALLOC(bimsk, sizeof(BITMAPINFOHEADER) + 1024);
720
+ rw_setbihdr((BITMAPINFOHEADER*)bimsk, w, h, 1, 1, 0);
721
+ bimsk->bmiColors[1].rgbBlue = 0xff;
722
+ bimsk->bmiColors[1].rgbGreen = 0xff;
723
+ bimsk->bmiColors[1].rgbRed = 0xff;
724
+ bimsk->bmiHeader.biSizeImage = w*h/8;
725
+ hbmmsk = CreateDIBitmap(hdc, (BITMAPINFOHEADER*)bimsk, CBM_INIT, ptr, bimsk, DIB_RGB_COLORS);
726
+ ReleaseDC(NULL, hdc);
727
+ free(bimsk);
728
+
729
+ ii.fIcon = ficon;
730
+ ii.xHotspot = idirent->wPlanes;
731
+ ii.yHotspot = idirent->wBitCount;
732
+ ii.hbmMask = hbmmsk;
733
+ ii.hbmColor = hbmclr;
734
+
735
+ hicon = CreateIconIndirect(&ii);
736
+ DeleteObject(hbmmsk);
737
+ DeleteObject(hbmclr);
738
+ return hicon;
739
+ }
740
+
741
+ static VALUE
742
+ rwicon1__load(VALUE klass, VALUE str){
743
+ int i;
744
+ char *pstr = RSTRING_PTR(str);
745
+ ICONDIR *idir = (ICONDIR*)pstr;
746
+ VALUE ary = rb_ary_new();
747
+ for(i=0; i < idir->idCount; i++){
748
+ ICONDIRENTRY *idirent = (ICONDIRENTRY*)(pstr + sizeof(ICONDIR) + i*sizeof(ICONDIRENTRY));
749
+ HICON hicon = rwicon1__load_core(pstr, idirent, idir->idType==1);
750
+ if(hicon) {
751
+ RwIcon *ri;
752
+ VALUE robj;
753
+ robj = RwIcon_Data_Make_Struct(klass, ri);
754
+ ri->type = RcIcon;
755
+ ri->hicon = hicon;
756
+ Register_rsc(ri->hicon, robj);
757
+ rb_ary_push(ary, robj);
758
+ } else rb_raise(rb_eRuntimeError, "Icon load failed.");
759
+ }
760
+ return ary;
761
+ }
762
+
763
+ static void
764
+ rw_init_Icon(){
765
+ cRwIcon = rb_define_class_under(mRwin, "Icon", rb_cData);
766
+ rb_define_alloc_func(cRwIcon, alloc_rwicon);
767
+
768
+ rb_define_singleton_method(cRwIcon, "fromfile", rwicon1_fromfile, -1);
769
+ rb_define_singleton_method(cRwIcon, "fromresource", rwicon1_fromrsrc, 1);
770
+ // rb_define_singleton_method(cRwIcon, "_dump", rwicon1__dump, -1);
771
+
772
+ rb_define_method(cRwIcon, "initialize", rwicon_initialize, 2);
773
+ rb_define_method(cRwIcon, "_hicon", rwicon_hicon, 0);
774
+ rb_define_method(cRwIcon, "dispose", rwicon_dispose, 0);
775
+ rb_define_method(cRwIcon, "to_bmps", rwicon_to_bmps, 0);
776
+ rb_define_method(cRwIcon, "_dump", rwicon__dump, -1);
777
+ rb_define_singleton_method(cRwIcon, "_load", rwicon1__load, 1);
778
+ }
779
+
780
+ /* Cursor */
781
+ VALUE cRwCursor;
782
+
783
+ void
784
+ rwcursor_free(void* ptr){
785
+ RwCursor *rc = ptr;
786
+ if(!rc->shared) DestroyCursor(rc->hcursor);
787
+ free(rc);
788
+ }
789
+
790
+ static size_t
791
+ rwcursor_memsize(const void *ptr){
792
+ return ptr ? sizeof(RwCursor) : 0;
793
+ }
794
+
795
+ const rb_data_type_t
796
+ rwcursor_data_type = {
797
+ "Cursor", {NULL, rwcursor_free, rwcursor_memsize}, NULL, NULL
798
+ };
799
+
800
+ static VALUE
801
+ alloc_rwcursor(VALUE klass){
802
+ RwCursor *rc;
803
+ VALUE robj = RwCursor_Data_Make_Struct(klass, rc);
804
+ rc->type = RcCursor;
805
+ return robj;
806
+ }
807
+
808
+ static VALUE
809
+ rwcursor_initialize(VALUE self, VALUE v_xhot, VALUE v_yhot, VALUE v_bmmask, VALUE v_bmcolor){
810
+ RwBitmap *rbmask, *rbcolor;
811
+ ICONINFO iinfo;
812
+ RwCursor *rc = DATA_PTR(self);
813
+ iinfo.fIcon = FALSE;
814
+ iinfo.xHotspot = FIX2INT(v_xhot);
815
+ iinfo.yHotspot = FIX2INT(v_yhot);
816
+ RwBitmap_Data_Get_Struct(v_bmmask, rbmask);
817
+ iinfo.hbmMask = rw_dib2ddb(rbmask);
818
+ RwBitmap_Data_Get_Struct(v_bmcolor, rbcolor);
819
+ iinfo.hbmColor = rw_dib2ddb(rbcolor);
820
+ rc->hcursor = CreateIconIndirect(&iinfo);
821
+ if (!rc->hcursor) rb_raise(rb_eRuntimeError, "failed to create cursor");
822
+ rc->shared = FALSE;
823
+ return self;
824
+ }
825
+
826
+ static VALUE
827
+ rwcursor1_loadfromfile(VALUE klass, VALUE fname){
828
+ RwCursor* rc;
829
+ VALUE robj = RwCursor_Data_Make_Struct(klass, rc);
830
+
831
+ if(!FIXNUM_P(fname)){
832
+ char abspath[RW_MAXPATH];
833
+ rwconv2absolute_path(abspath, RSTRING_PTR(fname));
834
+ rc->hcursor = LoadImageA(NULL, abspath, IMAGE_CURSOR, 0, 0, LR_LOADFROMFILE);
835
+ } else {
836
+ rc->hcursor = LoadCursor(NULL, MAKEINTRESOURCE(FIX2INT(fname)));
837
+ }
838
+ if(!rc->hcursor) rb_raise(rb_eRuntimeError, "failed to create cursor");
839
+ rc->type = RcCursor;
840
+ rc->shared = FIXNUM_P(fname) ? TRUE : FALSE;
841
+ return robj;
842
+ }
843
+
844
+ static VALUE
845
+ rwcursor_delete(VALUE self){
846
+ RwCursor *rc = DATA_PTR(self);
847
+ Unregister_rsc(rc->hcursor);
848
+ DestroyCursor(rc->hcursor);
849
+ rc->hcursor = 0;
850
+ return Qtrue;
851
+ }
852
+
853
+ static VALUE
854
+ rwcursor_hcursor(VALUE self){
855
+ RwCursor *rc = DATA_PTR(self);
856
+ return ULONG_PTR2NUM((ULONG_PTR)rc->hcursor);
857
+ }
858
+
859
+ static VALUE
860
+ rwapp_setcursor(VALUE mod, VALUE v_cur){
861
+ HCURSOR hc;
862
+ RwCursor *rc;
863
+ switch(TYPE(v_cur)){
864
+ case T_FIXNUM: case T_BIGNUM:
865
+ hc = (HCURSOR)NUM2ULONG_PTR(v_cur);
866
+ break;
867
+ default:
868
+ RwCursor_Data_Get_Struct(v_cur, rc);
869
+ RwCheckResource(rc);
870
+ hc = rc->hcursor;
871
+ }
872
+ SetCursor(hc);
873
+ return v_cur;
874
+ }
875
+
876
+ static VALUE
877
+ rwapp_getcursor(){
878
+ HANDLE hCursor = GetCursor();
879
+ VALUE v_cursor = Get_rsc(hCursor);
880
+ return NIL_P(v_cursor) ? ULONG_PTR2NUM((ULONG_PTR)hCursor) : v_cursor;
881
+ }
882
+
883
+ static VALUE
884
+ rwapp_showcursor(VALUE mod, VALUE v_show){
885
+ BOOL bShow = (!v_show || NIL_P(v_show)) ? FALSE : TRUE;
886
+ return INT2FIX(ShowCursor(bShow));
887
+ }
888
+
889
+ static VALUE
890
+ rwcursor1__load(VALUE klass, VALUE str){
891
+ char *pstr = RSTRING_PTR(str);
892
+ ICONDIR *idir = (ICONDIR*)pstr;
893
+ ICONDIRENTRY *idirent = (ICONDIRENTRY *)(pstr + sizeof(ICONDIR));
894
+ HCURSOR hcursor = rwicon1__load_core(pstr, idirent, idir->idType==1);
895
+ if(hcursor){
896
+ RwCursor *rc;
897
+ VALUE robj;
898
+ robj = RwCursor_Data_Make_Struct(klass, rc);
899
+ rc->type = RcCursor;
900
+ rc->hcursor = hcursor;
901
+ Register_rsc(rc->hcursor, robj);
902
+ return robj;
903
+ }
904
+ return Qnil;
905
+ }
906
+
907
+ void
908
+ rw_init_Cursor(){
909
+ cRwCursor = rb_define_class_under(mRwin, "Cursor", rb_cData);
910
+ rb_define_alloc_func(cRwCursor, alloc_rwcursor);
911
+ rb_define_singleton_method(cRwCursor, "fromfile", rwcursor1_loadfromfile, 1);
912
+ rb_define_singleton_method(cRwCursor, "_load", rwcursor1__load, 1);
913
+ rb_define_method(cRwCursor, "initialize", rwcursor_initialize, 4);
914
+ rb_define_method(cRwCursor, "_hcursor", rwcursor_hcursor, 0);
915
+ rb_define_method(cRwCursor, "dispose", rwcursor_delete, 0);
916
+ rb_define_method(cRwCursor, "to_bmps", rwicon_to_bmps, 0);
917
+ rb_define_method(cRwCursor, "_dump", rwicon__dump, -1);
918
+
919
+ rb_define_singleton_method(mRwApp, "SetCursor", rwapp_setcursor, 1);
920
+ rb_define_singleton_method(mRwApp, "GetCursor", rwapp_getcursor, 0);
921
+ rb_define_singleton_method(mRwApp, "ShowCursor", rwapp_showcursor, 1);
922
+ }
923
+
924
+ /* Pen */
925
+
926
+ VALUE cRwPen;
927
+
928
+ void
929
+ rwpen_free(void* ptr){
930
+ RwPen *rp = ptr;
931
+ if(rp->hpen) DeleteObject(rp->hpen);
932
+ free(rp);
933
+ }
934
+
935
+ static size_t
936
+ rwpen_memsize(const void *ptr){
937
+ return ptr ? sizeof(RwPen) : 0;
938
+ }
939
+
940
+ const rb_data_type_t
941
+ rwpen_data_type = {
942
+ "Pen", {NULL, rwpen_free, rwpen_memsize}, NULL, NULL
943
+ };
944
+
945
+ static VALUE
946
+ alloc_rwpen(VALUE klass){
947
+ RwPen *rp;
948
+ VALUE robj = RwPen_Data_Make_Struct(klass, rp);
949
+ rp->type = RcPen;
950
+ return robj;
951
+ }
952
+
953
+ static void
954
+ init_rwpen(int argc, VALUE *argv, RwPen *rp){
955
+ VALUE v_color, v_width, v_style;
956
+ if (argc<1) rb_raise(rb_eArgError, "need color");
957
+ rb_scan_args(argc, argv, "12", &v_color, &v_width, &v_style);
958
+ if(FIXNUM_P(v_color)){
959
+ int color = FIX2INT(v_color);
960
+ int width = NIL_P(v_width) ? 0 : FIX2INT(v_width);
961
+ int style = NIL_P(v_style) ? PS_SOLID : FIX2INT(v_style);
962
+ rp->hpen = CreatePen(style, width, (COLORREF)color);
963
+ } else {
964
+ CStructData *cslp;
965
+ CStruct_Data_Get_Struct(v_color, cslp);
966
+ rp->hpen = CreatePenIndirect((LOGPEN*)(cslp->dtstr + cslp->dtoffset));
967
+ }
968
+ }
969
+
970
+ static VALUE
971
+ rwpen_initialize(int argc, VALUE *argv, VALUE self){
972
+ RwPen *rp = DATA_PTR(self);
973
+ init_rwpen(argc, argv, rp);
974
+ return self;
975
+ }
976
+
977
+ static VALUE
978
+ rwpen_hpen(VALUE self){
979
+ RwPen *rp = DATA_PTR(self);
980
+ return ULONG_PTR2NUM((ULONG_PTR)rp->hpen);
981
+ }
982
+
983
+ static VALUE
984
+ rwpen_dispose(VALUE self){
985
+ RwPen *rp = DATA_PTR(self);
986
+ if (rp->hpen) {
987
+ DeleteObject(rp->hpen);
988
+ rp->hpen = NULL;
989
+ return Qtrue;
990
+ }
991
+ return Qnil;
992
+ }
993
+
994
+ void
995
+ rw_init_Pen(){
996
+ cRwPen = rb_define_class_under(mRwin, "Pen", rb_cData);
997
+ rb_define_alloc_func(cRwPen, alloc_rwpen);
998
+ rb_define_method(cRwPen, "initialize", rwpen_initialize, -1);
999
+ rb_define_method(cRwPen, "_hpen", rwpen_hpen, 0);
1000
+ rb_define_method(cRwPen, "dispose", rwpen_dispose, 0);
1001
+ }
1002
+
1003
+
1004
+ // Brush
1005
+
1006
+ VALUE cRwBrush;
1007
+
1008
+ void
1009
+ rwbrush_free(void* ptr){
1010
+ RwBrush *rb = ptr;
1011
+ if(rb->hbrush) DeleteObject(rb->hbrush);
1012
+ free(rb);
1013
+ }
1014
+
1015
+ static size_t
1016
+ rwbrush_memsize(const void *ptr){
1017
+ return ptr ? sizeof(RwBrush) : 0;
1018
+ }
1019
+
1020
+ const rb_data_type_t
1021
+ rwbrush_data_type = {
1022
+ "Brush", {NULL, rwbrush_free, rwbrush_memsize}, NULL, NULL
1023
+ };
1024
+
1025
+ static VALUE
1026
+ alloc_rwbrush(VALUE klass){
1027
+ RwBrush *rb;
1028
+ VALUE robj = RwBrush_Data_Make_Struct(klass, rb);
1029
+ rb->type = RcBrush;
1030
+ return robj;
1031
+ }
1032
+
1033
+ static void
1034
+ init_rwbrush(int argc, VALUE *argv, RwBrush *rb){
1035
+ VALUE v_color, v_style, v_hatch;
1036
+ if (!argc) rb_raise(rb_eArgError,"need color or LOGBRUSH");
1037
+ rb_scan_args(argc, argv, "12", &v_color, &v_style, &v_hatch);
1038
+ if(FIXNUM_P(v_color)){
1039
+ LOGBRUSH lb;
1040
+ lb.lbColor = FIX2INT(v_color);
1041
+ lb.lbStyle = NIL_P(v_style) ? BS_SOLID : NUM2INT(v_style);
1042
+ lb.lbHatch = NIL_P(v_hatch) ? HS_DIAGCROSS : NUM2INT(v_hatch);
1043
+ rb->hbrush = CreateBrushIndirect(&lb);
1044
+ } else {
1045
+ CStructData *cslb;
1046
+ CStruct_Data_Get_Struct(v_color, cslb);
1047
+ rb->hbrush = CreateBrushIndirect((LOGBRUSH*)(cslb->dtstr + cslb->dtoffset));
1048
+ }
1049
+ }
1050
+
1051
+ static VALUE
1052
+ rwbrush_initialize(int argc, VALUE *argv, VALUE obj){
1053
+ RwBrush *rb;
1054
+ RwBrush_Data_Get_Struct(obj, rb);
1055
+ init_rwbrush(argc, argv, rb);
1056
+ return obj;
1057
+ }
1058
+
1059
+ static VALUE
1060
+ rwbrush_hbrush(VALUE obj){
1061
+ RwBrush *rb;
1062
+ RwBrush_Data_Get_Struct(obj, rb);
1063
+ return ULONG_PTR2NUM((ULONG_PTR)rb->hbrush);
1064
+ }
1065
+
1066
+ static VALUE
1067
+ rwbrush_dispose(VALUE obj){
1068
+ RwBrush *rb;
1069
+ RwBrush_Data_Get_Struct(obj, rb);
1070
+ if (rb->hbrush) {
1071
+ DeleteObject(rb->hbrush);
1072
+ rb->hbrush = NULL;
1073
+ return Qtrue;
1074
+ }
1075
+ return Qnil;
1076
+ }
1077
+
1078
+ void
1079
+ rw_init_Brush(){
1080
+ cRwBrush = rb_define_class_under(mRwin, "Brush", rb_cData);
1081
+ rb_define_alloc_func(cRwBrush, alloc_rwbrush);
1082
+ rb_define_method(cRwBrush, "initialize", rwbrush_initialize, -1);
1083
+ rb_define_method(cRwBrush, "_hbrush", rwbrush_hbrush, 0);
1084
+ rb_define_method(cRwBrush, "dispose", rwbrush_dispose, 0);
1085
+ }
1086
+
1087
+ /* ImageList */
1088
+
1089
+ VALUE cRwImagelist;
1090
+
1091
+ void
1092
+ rwimagelist_free(void* ptr){
1093
+ RwImagelist *ri = ptr;
1094
+ if(ri->himagelist) ImageList_Destroy(ri->himagelist);
1095
+ free(ri);
1096
+ }
1097
+
1098
+ static size_t
1099
+ rwimagelist_memsize(const void *ptr){
1100
+ return ptr ? sizeof(RwImagelist) : 0;
1101
+ }
1102
+
1103
+ const rb_data_type_t
1104
+ rwimagelist_data_type = {
1105
+ "Imagelist", {NULL, rwimagelist_free, rwimagelist_memsize}, NULL, NULL
1106
+ };
1107
+
1108
+ static VALUE
1109
+ alloc_rwimagelist(VALUE klass){
1110
+ RwImagelist *ri;
1111
+ VALUE robj = RwImagelist_Data_Make_Struct(klass, ri);
1112
+ ri->type = RcImagelist;
1113
+ return robj;
1114
+ }
1115
+
1116
+ static void
1117
+ init_imglist(int argc, VALUE *argv, RwImagelist *ri){
1118
+ VALUE v_cx, v_cy, v_flag, v_initial, v_glow;
1119
+ int cx, cy, flag, initial, grow;
1120
+
1121
+ rb_scan_args(argc, argv, "05", &v_cx, &v_cy, &v_flag, &v_initial, &v_glow);
1122
+ cx = NIL_P(v_cx) ? 32 : FIX2INT(v_cx);
1123
+ cy = NIL_P(v_cy) ? 32 : FIX2INT(v_cy);
1124
+ flag = NIL_P(v_flag) ? ILC_COLOR : NUM2UINT(v_flag);
1125
+ initial = (argc>3 && argv[3]!=Qnil)? NUM2UINT(argv[3]) : 0;
1126
+ grow = (argc>4 && argv[4]!=Qnil)? NUM2UINT(argv[4]) : 1;
1127
+ ri->himagelist = ImageList_Create(cx, cy, flag, initial, grow);
1128
+ // ri->flags = flag;
1129
+ if (!ri->himagelist) rb_raise(rb_eRuntimeError,"ImageList_Create failed");
1130
+ }
1131
+
1132
+ static VALUE
1133
+ rwimagelist_initialize(int argc,VALUE* argv, VALUE self){
1134
+ RwImagelist *ri = DATA_PTR(self);
1135
+ init_imglist(argc, argv, ri);
1136
+ Register_rsc(ri->himagelist, self);
1137
+ return self;
1138
+ }
1139
+
1140
+ static VALUE
1141
+ rwimagelist_delete(VALUE self){
1142
+ RwImagelist *ri = DATA_PTR(self);
1143
+ RwCheckResource(ri);
1144
+ Unregister_rsc(ri->himagelist);
1145
+ ImageList_Destroy(ri->himagelist);
1146
+ ri->himagelist = NULL;
1147
+ return self;
1148
+ }
1149
+
1150
+ static VALUE
1151
+ rwimagelist_add(int argc, VALUE* argv, VALUE self){
1152
+ VALUE v_image, v_mask;
1153
+ HBITMAP hbmimg, hbmmask;
1154
+ int r;
1155
+ RwImagelist *ri = DATA_PTR(self);
1156
+ RwCheckResource(ri);
1157
+ rb_scan_args(argc, argv, "11", &v_image, &v_mask);
1158
+
1159
+ if(rb_typeddata_is_kind_of(v_image, &rwbitmap_data_type)){
1160
+ RwBitmap* rb;
1161
+ RwBitmap_Data_Get_Struct(v_image, rb);
1162
+ RwCheckResource(rb);
1163
+ hbmimg = rw_dib2ddb(rb);
1164
+ } else {
1165
+ rb_raise(rb_eArgError, "Not a Bitmap");
1166
+ }
1167
+
1168
+ if(NIL_P(v_mask)) {
1169
+ hbmmask = NULL;
1170
+ }else if(rb_typeddata_is_kind_of(v_mask, &rwbitmap_data_type)){
1171
+ RwBitmap* rm;
1172
+ RwBitmap_Data_Get_Struct(v_mask, rm);
1173
+ RwCheckResource(rm);
1174
+ hbmmask = rw_dib2ddb(rm);
1175
+ } else {
1176
+ DeleteObject(hbmimg);
1177
+ rb_raise(rb_eArgError, "Not a Bitmap");
1178
+ }
1179
+ r = ImageList_Add(ri->himagelist, hbmimg, hbmmask);
1180
+
1181
+ DeleteObject(hbmimg);
1182
+ if(hbmmask) DeleteObject(hbmmask);
1183
+ if(r==-1) rb_raise(rb_eRuntimeError, "ImageList_Add failed");
1184
+ return self;
1185
+ }
1186
+
1187
+ static VALUE
1188
+ rwimagelist_addmasked(VALUE self, VALUE v_bmi, VALUE maskcolor){
1189
+ HBITMAP hbmimg;
1190
+ int r;
1191
+ RwImagelist *ri = DATA_PTR(self);
1192
+ RwCheckResource(ri);
1193
+ if(rb_typeddata_is_kind_of(v_bmi, &rwbitmap_data_type)){
1194
+ RwBitmap* rb;
1195
+ RwBitmap_Data_Get_Struct(v_bmi, rb);
1196
+ RwCheckResource(rb);
1197
+ hbmimg = rw_dib2ddb(rb);
1198
+ } else {
1199
+ rb_raise(rb_eArgError, "Not a Bitmap");
1200
+ }
1201
+ r = ImageList_AddMasked(ri->himagelist, hbmimg, NUM2UINT(maskcolor));
1202
+ DeleteObject(hbmimg);
1203
+
1204
+ if(r<0) rb_raise(rb_eRuntimeError, "ImageList_AddMasked failed");
1205
+ return self;
1206
+ }
1207
+
1208
+ static VALUE
1209
+ rwimagelist_removeimage(VALUE self, VALUE idx){
1210
+ int r;
1211
+ RwImagelist *ri = DATA_PTR(self);
1212
+ RwCheckResource(ri);
1213
+ r = ImageList_Remove(ri->himagelist, FIX2INT(idx));
1214
+ return r ? self : Qnil;
1215
+ }
1216
+
1217
+ static VALUE
1218
+ rwimagelist_removeallimage(VALUE self){
1219
+ int r;
1220
+ RwImagelist *ri = DATA_PTR(self);
1221
+ RwCheckResource(ri);
1222
+ r = ImageList_RemoveAll(ri->himagelist);
1223
+ return r ? self : Qnil;
1224
+ }
1225
+
1226
+ static VALUE
1227
+ rwimagelist_countimage(VALUE self){
1228
+ int r;
1229
+ RwImagelist *ri = DATA_PTR(self);
1230
+ RwCheckResource(ri);
1231
+ r = ImageList_GetImageCount(ri->himagelist);
1232
+ return INT2FIX(r);
1233
+ }
1234
+
1235
+ static VALUE
1236
+ rwimagelist_himglist(VALUE self){
1237
+ RwImagelist *ri = DATA_PTR(self);
1238
+ RwCheckResource(ri);
1239
+ return ULONG_PTR2NUM((ULONG_PTR)ri->himagelist);
1240
+ }
1241
+
1242
+ static VALUE
1243
+ rwimagelist_geticon(int argc, VALUE* argv, VALUE self){
1244
+ RwIcon *icon;
1245
+ int idx;
1246
+ UINT flags;
1247
+ HICON hicon;
1248
+ VALUE robj, v_idx, v_flags;
1249
+ RwImagelist *ri = DATA_PTR(self);
1250
+ RwCheckResource(ri);
1251
+ rb_scan_args(argc, argv, "11", &v_idx, &v_flags);
1252
+ idx = NUM2UINT(v_idx);
1253
+ flags = NIL_P(v_flags) ? ILD_NORMAL : NUM2UINT(v_flags);
1254
+
1255
+ hicon = ImageList_GetIcon(ri->himagelist, idx, flags);
1256
+ if(!hicon) rb_raise(rb_eRuntimeError, "ImageList_GetIcon failed");
1257
+ robj = RwIcon_Data_Make_Struct(cRwIcon, icon);
1258
+ Register_rsc(hicon, robj);
1259
+ icon->hicon = hicon;
1260
+ icon->shared = FALSE;
1261
+ return robj;
1262
+ }
1263
+
1264
+ static VALUE
1265
+ rwimagelist_getimageinfo(VALUE self, VALUE v_idx){
1266
+ CStructData *cs;
1267
+ IMAGEINFO iminfo;
1268
+ int idx;
1269
+ VALUE v_iminfo;
1270
+
1271
+ RwImagelist *ri = DATA_PTR(self);
1272
+ idx = NUM2INT(v_idx);
1273
+ RwCheckResource(ri);
1274
+ if(ImageList_GetImageInfo(ri->himagelist, idx, &iminfo)==0){
1275
+ rb_raise(rb_eRuntimeError, "ImageList_GetImageInfo failed for idx:%d", idx);
1276
+ }
1277
+
1278
+ v_iminfo = CStruct_Data_Make_Struct(ccsIMAGEINFO, cs);
1279
+ // cst_set_memory_to_struct(cs, (char*)&iminfo, (unsigned)sizeof(IMAGEINFO));
1280
+ cs->dtstr = malloc(sizeof(IMAGEINFO));
1281
+ if(!cs->dtstr) rb_raise(rb_eRuntimeError,"Failed to allocate memory");
1282
+ memcpy(cs->dtstr, (char*)&iminfo, sizeof(IMAGEINFO));
1283
+
1284
+ return v_iminfo;
1285
+ }
1286
+
1287
+ static VALUE
1288
+ rwimagelist_getbkcolor(VALUE self){
1289
+ COLORREF c;
1290
+ RwImagelist *ri = DATA_PTR(self);
1291
+ RwCheckResource(ri);
1292
+ c = ImageList_GetBkColor(ri->himagelist);
1293
+ return (c==CLR_NONE) ? Qnil : INT2FIX(c);
1294
+ }
1295
+
1296
+ static VALUE
1297
+ rwimagelist_setbkcolor(VALUE self, VALUE v_bk){
1298
+ COLORREF c;
1299
+ RwImagelist *ri = DATA_PTR(self);
1300
+ RwCheckResource(ri);
1301
+ c = (NIL_P(v_bk)) ? CLR_NONE : (COLORREF)FIX2INT(v_bk);
1302
+ ImageList_SetBkColor(ri->himagelist, c);
1303
+ return self;
1304
+ }
1305
+
1306
+ static VALUE
1307
+ rwimagelist_addicon(VALUE self, VALUE v_ico){
1308
+ int r;
1309
+ RwIcon *ico;
1310
+ RwImagelist *ri = DATA_PTR(self);
1311
+ RwCheckResource(ri);
1312
+ RwIcon_Data_Get_Struct(v_ico, ico);
1313
+ r = ImageList_AddIcon(ri->himagelist, ico->hicon);
1314
+ if(r<0)rb_raise(rb_eRuntimeError,"Imagelist_AddIcon failed(hicon=%#x)",
1315
+ (int)(ULONG_PTR)ico->hicon);
1316
+ return self;
1317
+ }
1318
+
1319
+ static VALUE
1320
+ rwimagelist_resize(VALUE self, VALUE newsize){
1321
+ RwImagelist *ri = DATA_PTR(self);
1322
+ int r = ImageList_SetImageCount(ri->himagelist, FIX2INT(newsize));
1323
+ if(!r) rb_raise(rb_eRuntimeError, "failed to resize");
1324
+ return self;
1325
+ }
1326
+
1327
+ static VALUE
1328
+ rwimagelist_merge(VALUE self, int i1, VALUE other, int i2, int dx, int dy){
1329
+ VALUE newimg;
1330
+ RwImagelist *rio, *rinew;
1331
+ RwImagelist *ri = DATA_PTR(self);
1332
+ RwCheckResource(ri);
1333
+ RwImagelist_Data_Get_Struct(other, rio);
1334
+ RwCheckResource(rio);
1335
+ newimg = RwImagelist_Data_Make_Struct(CLASS_OF(self), rinew);
1336
+ rinew->himagelist = ImageList_Merge(ri->himagelist, FIX2INT(i1),
1337
+ rio->himagelist, FIX2INT(i2), FIX2INT(dx), FIX2INT(dy));
1338
+ if(!rinew->himagelist) rb_raise(rb_eRuntimeError, "failed to merge");
1339
+ Register_rsc(rinew->himagelist, newimg);
1340
+ return newimg;
1341
+ }
1342
+
1343
+ static VALUE
1344
+ rwimagelist_replace(VALUE self,VALUE v_idx, VALUE v_bmp, VALUE v_mask){
1345
+ int r;
1346
+ RwBitmap *rb , *rm;
1347
+ HBITMAP hbmp;
1348
+ HBITMAP hmask = NULL;
1349
+ RwImagelist *ri = DATA_PTR(self);
1350
+ RwCheckResource(ri);
1351
+ RwBitmap_Data_Get_Struct(v_bmp, rb);
1352
+ hbmp = rw_dib2ddb(rb);
1353
+ if(!NIL_P(v_mask)){
1354
+ RwBitmap_Data_Get_Struct(v_mask, rm);
1355
+ hmask = rw_dib2ddb(rm);
1356
+ }
1357
+ r = ImageList_Replace(ri->himagelist, FIX2INT(v_idx), hbmp, hmask);
1358
+ // fprintf(stderr, "@1456: r=%d\n", r);
1359
+ return r ? self : Qnil;
1360
+ }
1361
+
1362
+ static VALUE
1363
+ rwimagelist_replace_icon(VALUE self,VALUE v_idx, VALUE v_icon){
1364
+ int r;
1365
+ RwIcon *rico;
1366
+ RwImagelist *ri = DATA_PTR(self);
1367
+ RwCheckResource(ri);
1368
+ RwIcon_Data_Get_Struct(v_icon, rico);
1369
+ r = ImageList_ReplaceIcon(ri->himagelist, FIX2INT(v_idx), rico->hicon);
1370
+ return r ? self : Qnil;
1371
+ }
1372
+
1373
+ static VALUE
1374
+ rwimagelist_geticonsize(VALUE self){
1375
+ int cx, cy;
1376
+ RwImagelist *ri = DATA_PTR(self);
1377
+ RwCheckResource(ri);
1378
+ ImageList_GetIconSize(ri->himagelist, &cx, &cy);
1379
+ return rb_ary_new3(2, INT2FIX(cx), INT2FIX(cy));
1380
+ }
1381
+
1382
+ static VALUE
1383
+ rwimagelist_duplicate(VALUE self){
1384
+ VALUE robj;
1385
+ RwImagelist *rinew;
1386
+ HIMAGELIST himagelistnew;
1387
+ RwImagelist *ri = DATA_PTR(self);
1388
+ RwCheckResource(ri);
1389
+ himagelistnew = ImageList_Duplicate(ri->himagelist);
1390
+ robj = RwImagelist_Data_Make_Struct(rb_class_of(self), rinew);
1391
+ rinew->himagelist = himagelistnew;
1392
+ rinew->type = RcImagelist;
1393
+ Register_rsc(himagelistnew, robj);
1394
+ return robj;
1395
+ }
1396
+
1397
+ /*
1398
+ # Usage:
1399
+ Imagelist#_dump(downlevel=nil)
1400
+ */
1401
+ static VALUE
1402
+ rwimagelist_dump(int argc, VALUE* argv, VALUE self){
1403
+ LPSTREAM pstream;
1404
+ VALUE robj = Qnil;
1405
+ if(CreateStreamOnHGlobal(NULL, TRUE, &pstream)==S_OK){
1406
+ BOOL res;
1407
+ DWORD flag;
1408
+ RwImagelist *ri = DATA_PTR(self);
1409
+ flag = (argc>0 && argv[0]==Qtrue) ? ILP_DOWNLEVEL : ILP_NORMAL;
1410
+ if(FIX2INT(COMCTL_MAJOR_VERSION)==6){
1411
+ HANDLE hdll = LoadLibrary(TEXT("comctl32.dll"));
1412
+ FARPROC pImageList_WriteEx = GetProcAddress(hdll, "ImageList_WriteEx");
1413
+ res = (pImageList_WriteEx(ri->himagelist, flag, pstream)==S_OK);
1414
+ } else {
1415
+ res = ImageList_Write(ri->himagelist, pstream);
1416
+ }
1417
+ if(res){
1418
+ robj = stream2string(pstream);
1419
+ } else {
1420
+ pstream->lpVtbl->Release(pstream);
1421
+ rb_raise(rb_eRuntimeError, "failed to dump Imagelist");
1422
+ }
1423
+ } else {
1424
+ rb_raise(rb_eRuntimeError, "failed to createstream");
1425
+ }
1426
+ return robj;
1427
+ }
1428
+
1429
+ static VALUE
1430
+ rwimagelist1__load(VALUE klass, VALUE str){
1431
+ VALUE fstring;
1432
+ HGLOBAL hglobal;
1433
+ HRESULT hres;
1434
+ HIMAGELIST himagelist;
1435
+ LPSTREAM pstream;
1436
+ long len;
1437
+ VALUE robj;
1438
+
1439
+ fstring = StringValue(str);
1440
+ len = RSTRING_LEN(fstring);
1441
+ hglobal = GlobalAlloc(GPTR, len);
1442
+ if (!hglobal) rb_raise(rb_eRuntimeError, "can't allocate Global memory");
1443
+ hres = CreateStreamOnHGlobal(hglobal, TRUE, &pstream);
1444
+ if(hres==S_OK){
1445
+ RwImagelist *ri;
1446
+ char *buffer = GlobalLock(hglobal);
1447
+ memcpy(buffer, RSTRING_PTR(fstring), len);
1448
+ GlobalUnlock(hglobal);
1449
+ if(himagelist = ImageList_Read(pstream)){
1450
+ robj = RwImagelist_Data_Make_Struct(klass, ri);
1451
+ ri->himagelist = himagelist;
1452
+ ri->type = RcImagelist;
1453
+ Register_rsc(himagelist, robj);
1454
+ pstream->lpVtbl->Release(pstream);
1455
+ } else {
1456
+ pstream->lpVtbl->Release(pstream);
1457
+ rb_raise(rb_eRuntimeError, "failed to load Imagelist");
1458
+ }
1459
+ } else {
1460
+ rb_raise(rb_eRuntimeError, "failed to create stream");
1461
+ }
1462
+ return robj;
1463
+ }
1464
+
1465
+ static void
1466
+ rw_init_Imagelist(){
1467
+ cRwImagelist = rb_define_class_under(mRwin, "Imagelist", rb_cData);
1468
+ rb_define_alloc_func(cRwImagelist, alloc_rwimagelist);
1469
+ rb_define_method(cRwImagelist, "initialize", rwimagelist_initialize, -1);
1470
+ rb_define_method(cRwImagelist, "delete", rwimagelist_delete, 0);
1471
+ rb_define_method(cRwImagelist, "dispose", rwimagelist_delete, 0);
1472
+ rb_define_method(cRwImagelist, "add", rwimagelist_add, -1);
1473
+ rb_define_method(cRwImagelist, "addmasked", rwimagelist_addmasked, 2);
1474
+ rb_define_method(cRwImagelist, "remove", rwimagelist_removeimage, 1);
1475
+ rb_define_method(cRwImagelist, "clear", rwimagelist_removeallimage, 0);
1476
+ rb_define_method(cRwImagelist, "size", rwimagelist_countimage, 0);
1477
+ rb_define_method(cRwImagelist, "_himagelist", rwimagelist_himglist, 0);
1478
+ rb_define_method(cRwImagelist, "icon", rwimagelist_geticon, -1);
1479
+ rb_define_method(cRwImagelist, "imageinfo", rwimagelist_getimageinfo, 1);
1480
+ rb_define_method(cRwImagelist, "bkcolor", rwimagelist_getbkcolor, 0);
1481
+ rb_define_method(cRwImagelist, "bkcolor=", rwimagelist_setbkcolor, 1);
1482
+ rb_define_method(cRwImagelist, "addicon", rwimagelist_addicon, 1);
1483
+ rb_define_method(cRwImagelist, "resize", rwimagelist_resize, 1);
1484
+ rb_define_method(cRwImagelist, "merge", rwimagelist_merge, 5);
1485
+ rb_define_method(cRwImagelist, "replace", rwimagelist_replace, 3);
1486
+ rb_define_method(cRwImagelist, "replaceicon", rwimagelist_replace_icon, 2);
1487
+ rb_define_method(cRwImagelist, "iconsize", rwimagelist_geticonsize, 0);
1488
+ rb_define_method(cRwImagelist, "dup", rwimagelist_duplicate, 0);
1489
+
1490
+ rb_define_method(cRwImagelist, "_dump", rwimagelist_dump, -1);
1491
+ rb_define_singleton_method(cRwImagelist, "_load", rwimagelist1__load, 1);
1492
+ }
1493
+
1494
+ /* Font */
1495
+
1496
+ VALUE cRwFont;
1497
+ static void
1498
+ rwfont_free(void* ptr){
1499
+ RwFont* rf = ptr;
1500
+ if (rf->hfont && !rf->external) DeleteObject(rf->hfont);
1501
+ free(rf);
1502
+ }
1503
+
1504
+ static size_t
1505
+ rwfont_memsize(const void *ptr){
1506
+ return ptr ? sizeof(RwFont) : 0;
1507
+ }
1508
+
1509
+ const rb_data_type_t
1510
+ rwfont_data_type = {
1511
+ "Font", {NULL, rwfont_free, rwfont_memsize}, NULL, NULL
1512
+ };
1513
+
1514
+ static VALUE
1515
+ alloc_rwfont(VALUE klass){
1516
+ RwFont *rf;
1517
+ VALUE robj = RwFont_Data_Make_Struct(klass, rf);
1518
+ rf->type = RcFont;
1519
+ return robj;
1520
+ }
1521
+
1522
+ static VALUE
1523
+ rwfont_initialize(int argc, VALUE *argv, VALUE self){
1524
+ RwFont *rf = DATA_PTR(self);
1525
+ if (argc==1){
1526
+ CStructData *cs;
1527
+ LOGFONT *lf;
1528
+ if(!rb_typeddata_is_kind_of(argv[0], &cstruct_data_type)){
1529
+ rb_raise(rb_eArgError, "Not CStruct");
1530
+ }
1531
+ CStruct_Data_Get_Struct(argv[0], cs);
1532
+ lf = (LOGFONT*)(cs->dtstr + cs->dtoffset);
1533
+ rf->hfont = CreateFontIndirect(lf);
1534
+ } else {
1535
+ LOGFONT lf;
1536
+ TCHAR *fontname;
1537
+ size_t n;
1538
+ VALUE v_name, v_height, v_weight, v_italic, v_underline, v_strikeout;
1539
+ rb_scan_args(argc, argv, "24",
1540
+ &v_name, &v_height, &v_weight, &v_italic, &v_underline, &v_strikeout);
1541
+ fontname = rw_str2tchar2(v_name, &n);
1542
+ if(n/sizeof(TCHAR) > LF_FACESIZE){
1543
+ rb_raise(rb_eArgError, "face name size over (>%d)", LF_FACESIZE);
1544
+ }
1545
+ ZeroMemory(&lf, sizeof(LOGFONT));
1546
+ memcpy(lf.lfFaceName, fontname, n);
1547
+ lf.lfHeight = FIX2INT(v_height);
1548
+ lf.lfWeight = NIL_P(v_weight) ? FW_DONTCARE : FIX2INT(v_weight);
1549
+ lf.lfItalic = (NIL_P(v_italic) || !v_italic) ? FALSE : TRUE;
1550
+ lf.lfUnderline = (NIL_P(v_underline) || !v_underline) ? FALSE : TRUE;
1551
+ lf.lfStrikeOut = (NIL_P(v_strikeout) || !v_strikeout) ? FALSE : TRUE;
1552
+ lf.lfCharSet = DEFAULT_CHARSET;
1553
+ rf->hfont = CreateFontIndirect(&lf);
1554
+ }
1555
+ if(!rf->hfont) rb_raise(rb_eRuntimeError, "CreateFont failed");
1556
+ Register_rsc(rf->hfont, self);
1557
+ return self;
1558
+ }
1559
+
1560
+ static VALUE
1561
+ rwfont1_wrap_hfont(VALUE klass, VALUE v_hfont){
1562
+ RwFont* rf;
1563
+ VALUE robj = RwFont_Data_Make_Struct(klass, rf);
1564
+ rf->hfont = (HANDLE)NUM2ULONG_PTR(v_hfont);
1565
+ rf->type = RcFont;
1566
+ rf->external = 1;
1567
+ return robj;
1568
+ }
1569
+
1570
+ static VALUE
1571
+ rwfont_fname(VALUE self){
1572
+ LOGFONT lf;
1573
+ RwFont *rf = DATA_PTR(self);
1574
+ if(!rf->hfont) return Qnil;
1575
+ GetObject(rf->hfont, sizeof(LOGFONT), &lf);
1576
+ return rw_encode_external(lf.lfFaceName);
1577
+ }
1578
+
1579
+ static VALUE
1580
+ rwfont_height(VALUE self){
1581
+ LOGFONT lf;
1582
+ RwFont *rf = DATA_PTR(self);
1583
+ if(!rf->hfont) return Qnil;
1584
+ GetObject(rf->hfont, sizeof(LOGFONT), &lf);
1585
+ return INT2NUM(lf.lfHeight);
1586
+ }
1587
+
1588
+ static VALUE
1589
+ rwfont_hfont(VALUE self){
1590
+ RwFont *rf = DATA_PTR(self);
1591
+ return ULONG_PTR2NUM((ULONG_PTR)rf->hfont);
1592
+ }
1593
+
1594
+ static VALUE
1595
+ rwfont_delete(VALUE self){
1596
+ RwFont *rf = DATA_PTR(self);
1597
+ if (rf->external) rb_raise(rb_eRuntimeError, "external font can't be deleted");
1598
+ Unregister_rsc(rf->hfont);
1599
+ DeleteObject(rf->hfont);
1600
+ rf->hfont=0;
1601
+ return Qtrue;
1602
+ }
1603
+
1604
+ static VALUE
1605
+ rwfont_logfont(VALUE self){
1606
+ RwFont *rf = DATA_PTR(self);
1607
+ if(!rf->hfont) {
1608
+ return Qnil;
1609
+ } else {
1610
+ CStructData *cd;
1611
+ VALUE v_lf = CStruct_Data_Make_Struct(ccsLOGFONT, cd);
1612
+ cd->dtstr = malloc(sizeof(LOGFONT));
1613
+ GetObject(rf->hfont, sizeof(LOGFONT), cd->dtstr);
1614
+ cd->dtoffset = 0;
1615
+ cd->dtlen = sizeof(LOGFONT);
1616
+ cd->dtparent = 0;
1617
+ cd->dtreferences = 0;
1618
+ cd->dtwrapped = 0;
1619
+ return v_lf;
1620
+ }
1621
+ }
1622
+
1623
+ static VALUE
1624
+ rwfont_external_p(VALUE self){
1625
+ RwFont *rf = DATA_PTR(self);
1626
+ return rf->external ? Qtrue : Qfalse;
1627
+ }
1628
+
1629
+ static void
1630
+ rw_init_Font(){
1631
+ cRwFont = rb_define_class_under(mRwin, "Font", rb_cData);
1632
+ rb_define_alloc_func(cRwFont, alloc_rwfont);
1633
+ rb_define_singleton_method(cRwFont,"wraphandle", rwfont1_wrap_hfont, 1);
1634
+
1635
+ rb_define_method(cRwFont, "initialize", rwfont_initialize, -1);
1636
+ rb_define_method(cRwFont, "facename", rwfont_fname, 0);
1637
+ rb_define_method(cRwFont, "height", rwfont_height, 0);
1638
+ rb_define_method(cRwFont, "_hfont", rwfont_hfont, 0);
1639
+ rb_define_method(cRwFont, "dispose", rwfont_delete, 0);
1640
+ rb_define_method(cRwFont, "logfont", rwfont_logfont, 0);
1641
+ rb_define_method(cRwFont, "external?", rwfont_external_p, 0);
1642
+ }
1643
+
1644
+ /* Menu */
1645
+
1646
+ VALUE cRwMenu;
1647
+
1648
+ void
1649
+ rwmenu_free(void* ptr){
1650
+ RwMenu* rm = ptr;
1651
+ if(rm->hmenu) {
1652
+ Unregister_rsc(rm->hmenu);
1653
+ DestroyMenu(rm->hmenu);
1654
+ }
1655
+ free(rm);
1656
+ }
1657
+
1658
+ static size_t
1659
+ rwmenu_memsize(const void *ptr){
1660
+ return ptr ? sizeof(RwMenu) : 0;
1661
+ }
1662
+
1663
+ const rb_data_type_t
1664
+ rwmenu_data_type = {
1665
+ "Menu", {NULL, rwmenu_free, rwmenu_memsize}, NULL, NULL
1666
+ };
1667
+
1668
+ static VALUE
1669
+ alloc_rwmenu(VALUE klass){
1670
+ RwMenu *rm;
1671
+ VALUE robj = RwMenu_Data_Make_Struct(klass, rm);
1672
+ rm->type = RcMenu;
1673
+ rm->hmenu = 0;
1674
+ rm->hwnd = 0;
1675
+ return robj;
1676
+ }
1677
+
1678
+ static VALUE
1679
+ rwmenu_hmenu(VALUE self){
1680
+ RwMenu *rm = DATA_PTR(self);
1681
+ return ULONG_PTR2NUM((ULONG_PTR)rm->hmenu);
1682
+ }
1683
+
1684
+ static VALUE
1685
+ rwmenu_alive_p(VALUE self){
1686
+ RwMenu *rm = DATA_PTR(self);
1687
+ return rm->hmenu ? Qtrue : Qfalse;
1688
+ }
1689
+
1690
+ static VALUE
1691
+ rwmenu_createmenu(VALUE self){
1692
+ RwMenu *rm = DATA_PTR(self);
1693
+ rm->hmenu = CreateMenu();
1694
+ Register_rsc(rm->hmenu, self);
1695
+ return self;
1696
+ }
1697
+
1698
+ static VALUE
1699
+ rwmenu_createpopup(VALUE self){
1700
+ RwMenu *rm = DATA_PTR(self);
1701
+ rm->hmenu = CreatePopupMenu();
1702
+ Register_rsc(rm->hmenu, self);
1703
+ return self;
1704
+ }
1705
+
1706
+ static VALUE
1707
+ rwmenu_insert(int argc, VALUE *argv, VALUE self){
1708
+ int r;
1709
+ VALUE v_next, v_byposition, v_item, v_type, v_idcmd;
1710
+ BOOL fByPosition;
1711
+ MENUITEMINFO *mii;
1712
+ RwMenu *rm = DATA_PTR(self);
1713
+ if(argc==3 && rb_class_of(argv[2])==ccsMENUITEMINFO){ /* if MENUITEMINFO */
1714
+ CStructData *cs;
1715
+ v_next = argv[0];
1716
+ v_byposition = argv[1];
1717
+ fByPosition = (NIL_P(v_byposition) || !v_byposition) ? FALSE : TRUE;
1718
+ CStruct_Data_Get_Struct(argv[2], cs);
1719
+ mii = (MENUITEMINFO*)(cs->dtstr + cs->dtoffset);
1720
+ r = InsertMenuItem(rm->hmenu, FIX2INT(v_next), fByPosition, mii);
1721
+ } else { /* if Array */
1722
+ size_t len;
1723
+ mii = calloc(sizeof(MENUITEMINFO), 1);
1724
+ rb_scan_args(argc, argv, "41", &v_next, &v_byposition, &v_item, &v_idcmd, &v_type);
1725
+ mii->cbSize = sizeof(MENUITEMINFO);
1726
+ if(rb_typeddata_is_kind_of(v_idcmd, &rwmenu_data_type)){
1727
+ RwMenu* mi;
1728
+ RwMenu_Data_Get_Struct(v_idcmd, mi);
1729
+ RwCheckResource(mi);
1730
+ mii->fMask = MIIM_TYPE | MIIM_SUBMENU;
1731
+ mii->hSubMenu = mi->hmenu;
1732
+ } else {
1733
+ mii->fMask = MIIM_TYPE | MIIM_ID;
1734
+ mii->wID = FIX2INT(v_idcmd);
1735
+ }
1736
+ mii->fType = NIL_P(v_type) ? MFT_STRING : NUM2INT(v_type);
1737
+ mii->dwTypeData = rw_str2tchar2(v_item, &len);
1738
+ mii->cch = len/sizeof(TCHAR);
1739
+ fByPosition = (NIL_P(v_byposition) || !v_byposition) ? FALSE : TRUE;
1740
+ r = InsertMenuItem(rm->hmenu, FIX2INT(v_next), fByPosition, mii);
1741
+ free(mii);
1742
+ }
1743
+ if(!r) rb_raise(rb_eRuntimeError, "failed to insert menu");
1744
+ if(rm->hwnd) DrawMenuBar(rm->hwnd);
1745
+ return self;
1746
+ }
1747
+
1748
+ /*static void
1749
+ rwmenu_do_destroy(RwMenu* rm){
1750
+ int i;
1751
+ for(i=0; i<GetMenuItemCount(rm->hmenu); i++){
1752
+ HMENU hsubmenu = GetSubMenu(rm->hmenu, i);
1753
+ if(hsubmenu){
1754
+ RwMenu* sm;
1755
+ VALUE v_sm = Get_rsc(hsubmenu);
1756
+ RwMenu_Data_Get_Struct(v_sm, sm);
1757
+ rwmenu_do_destroy(sm);
1758
+ }
1759
+ }
1760
+ Unregister_rsc(rm->hmenu);
1761
+ rm->hmenu = 0;
1762
+ }
1763
+
1764
+ static VALUE
1765
+ rwmenu_destroy(VALUE self){
1766
+ HMENU hmdispose;
1767
+ RwMenu *rm = DATA_PTR(self);
1768
+ RwCheckResource(rm);
1769
+ hmdispose = rm->hmenu;
1770
+ rwmenu_do_destroy(rm);
1771
+ return DestroyMenu(hmdispose) ? Qtrue : Qfalse;
1772
+ }*/
1773
+
1774
+ static void
1775
+ rwmenu_do_destroy(HMENU hm){
1776
+ int i;
1777
+ for(i=0; i<GetMenuItemCount(hm); i++){
1778
+ HMENU hsubmenu = GetSubMenu(hm, i);
1779
+ if(hsubmenu){
1780
+ RwMenu* sm;
1781
+ VALUE v_sm = Get_rsc(hsubmenu);
1782
+ RwMenu_Data_Get_Struct(v_sm, sm);
1783
+ rwmenu_do_destroy(sm->hmenu);
1784
+ sm->hmenu = NULL;
1785
+ }
1786
+ }
1787
+ Unregister_rsc(hm);
1788
+ }
1789
+
1790
+ static VALUE
1791
+ rwmenu_destroy(VALUE self){
1792
+ int r;
1793
+ RwMenu *rm = DATA_PTR(self);
1794
+ RwCheckResource(rm);
1795
+ rwmenu_do_destroy(rm->hmenu);
1796
+ r = DestroyMenu(rm->hmenu);
1797
+ rm->hmenu = NULL;
1798
+ return r ? Qtrue : Qfalse;
1799
+ }
1800
+
1801
+ static VALUE
1802
+ rwmenu_delete(VALUE self, VALUE v_item, VALUE v_flag){
1803
+ int r;
1804
+ UINT fByPosition;
1805
+ RwMenu *rm = DATA_PTR(self);
1806
+ RwCheckResource(rm);
1807
+ fByPosition = (NIL_P(v_flag) || !v_flag) ? MF_BYCOMMAND : MF_BYPOSITION;
1808
+ if(fByPosition){
1809
+ HMENU hsubmenu = GetSubMenu(rm->hmenu, NUM2UINT(v_item));
1810
+ if(hsubmenu){
1811
+ RwMenu* sm;
1812
+ VALUE v_sm = Get_rsc(hsubmenu);
1813
+ RwMenu_Data_Get_Struct(v_sm, sm);
1814
+ rwmenu_do_destroy(hsubmenu);
1815
+ sm->hmenu = NULL;
1816
+ }
1817
+ }
1818
+ r = DeleteMenu(rm->hmenu, NUM2UINT(v_item), fByPosition);
1819
+ if(rm->hwnd) DrawMenuBar(rm->hwnd);
1820
+ return r? Qtrue : Qfalse;
1821
+ }
1822
+
1823
+ static VALUE
1824
+ rwmenu_getmenuitemcount(VALUE self){
1825
+ RwMenu *rm = DATA_PTR(self);
1826
+ RwCheckResource(rm);
1827
+ return INT2NUM(GetMenuItemCount(rm->hmenu));
1828
+ }
1829
+
1830
+ static VALUE
1831
+ rwmenu_getmenuiteminfo(VALUE self, VALUE v_item, VALUE v_flag, VALUE v_info){
1832
+ int r;
1833
+ CStructData *cs; MENUITEMINFO *pmii;
1834
+ BOOL fByPosition;
1835
+ RwMenu *rm = DATA_PTR(self);
1836
+ RwCheckResource(rm);
1837
+ if(rb_class_of(v_info)!=ccsMENUITEMINFO){
1838
+ rb_raise(rb_eArgError, "Argument must be a MENUITEMINFO");
1839
+ }
1840
+ CStruct_Data_Get_Struct(v_info, cs); pmii = (MENUITEMINFO*)(cs->dtstr + cs->dtoffset);
1841
+ pmii->cbSize = sizeof(MENUITEMINFO);
1842
+ fByPosition = (NIL_P(v_flag) || !v_flag) ? MF_BYCOMMAND : MF_BYPOSITION;
1843
+ r = GetMenuItemInfo(rm->hmenu, NUM2UINT(v_item), fByPosition, pmii);
1844
+ return r ? v_info : Qnil;
1845
+ }
1846
+
1847
+ static VALUE
1848
+ rwmenu_setmenuiteminfo(VALUE self, VALUE v_item, VALUE v_flag, VALUE v_info){
1849
+ CStructData *cs; MENUITEMINFO *pmii;
1850
+ BOOL fByPosition;
1851
+ RwMenu *rm = DATA_PTR(self);
1852
+ RwCheckResource(rm);
1853
+ if(rb_class_of(v_info)!=ccsMENUITEMINFO){
1854
+ rb_raise(rb_eArgError, "Argument must be a MENUITEMINFO");
1855
+ }
1856
+ CStruct_Data_Get_Struct(v_info, cs); pmii = (MENUITEMINFO*)(cs->dtstr + cs->dtoffset);
1857
+ pmii->cbSize = sizeof(MENUITEMINFO);
1858
+ fByPosition = (NIL_P(v_flag) || !v_flag) ? MF_BYCOMMAND : MF_BYPOSITION;
1859
+ SetMenuItemInfo(rm->hmenu, NUM2UINT(v_item), fByPosition, pmii);
1860
+ if(rm->hwnd) DrawMenuBar(rm->hwnd);
1861
+ return self;
1862
+ }
1863
+
1864
+ /* // Tnis is obsolate on MSC of WIN64
1865
+ static VALUE
1866
+ rwmenu_getmenustring(VALUE self, VALUE v_item, VALUE v_flag){
1867
+ int r;
1868
+ BOOL fByPosition;
1869
+ TCHAR* buff;
1870
+ RwMenu *rm = DATA_PTR(self);
1871
+ RwCheckResource(rm);
1872
+ fByPosition = (NIL_P(v_flag) || !v_flag) ? MF_BYCOMMAND : MF_BYPOSITION;
1873
+ r = GetMenuString(rm->hmenu, NUM2INT(v_item), NULL, 0, fByPosition);
1874
+ if (r==0) return rb_enc_str_new_literal("", rw_external_enc);
1875
+ buff = alloca(r*sizeof(WCHAR));
1876
+ GetMenuString(rm->hmenu, NUM2INT(v_item), buff, r*sizeof(TCHAR), fByPosition);
1877
+ return rw_encode_external(buff);
1878
+ }*/
1879
+
1880
+ static VALUE
1881
+ rwmenu_getmenuitemid(VALUE self, VALUE v_idx){
1882
+ RwMenu *rm = DATA_PTR(self);
1883
+ return INT2FIX(GetMenuItemID(rm->hmenu, FIX2INT(v_idx)));
1884
+ }
1885
+
1886
+ static VALUE
1887
+ rwmenu_getsubmenu(VALUE self, VALUE v_idx){
1888
+ HMENU hmenu;
1889
+ RwMenu *rm = DATA_PTR(self);
1890
+ hmenu = GetSubMenu(rm->hmenu, FIX2INT(v_idx));
1891
+ return hmenu ? Get_rsc(hmenu) : Qnil;
1892
+ }
1893
+
1894
+ static VALUE
1895
+ rwwin_setmenu(VALUE self, VALUE v_menu){
1896
+ RwMenu *rm;
1897
+ RwWindow *rw = DATA_PTR(self);
1898
+ RwCheckWindow(rw);
1899
+ if (NIL_P(v_menu)){
1900
+ SetMenu(rw->hwnd, NULL);
1901
+ } else {
1902
+ RwMenu_Data_Get_Struct(v_menu, rm);
1903
+ RwCheckResource(rm);
1904
+ SetMenu(rw->hwnd, rm->hmenu);
1905
+ rm->hwnd = rw->hwnd;
1906
+ }
1907
+ DrawMenuBar(rw->hwnd);
1908
+ return self;
1909
+ }
1910
+
1911
+ static VALUE
1912
+ rwwin_drawmenubar(VALUE self){
1913
+ RwWindow *rw = DATA_PTR(self);
1914
+ RwCheckWindow(rw);
1915
+ DrawMenuBar(rw->hwnd);
1916
+ return self;
1917
+ }
1918
+
1919
+ static VALUE
1920
+ rwwin_trackpopupmenu(int argc, VALUE *argv, VALUE self){
1921
+ VALUE v_menu, v_x, v_y, v_align, v_exclude;
1922
+ int falign, r;
1923
+ RwMenu *rm;
1924
+ POINT pos;
1925
+ TPMPARAMS *lptpm;
1926
+ RwWindow *rw = DATA_PTR(self);
1927
+ RwCheckWindow(rw);
1928
+ rb_scan_args(argc, argv, "32", &v_menu, &v_x, &v_y, &v_align, &v_exclude);
1929
+ RwMenu_Data_Get_Struct(v_menu, rm);
1930
+ RwCheckResource(rm);
1931
+ falign = NIL_P(v_align) ? TPM_LEFTALIGN : FIX2INT(v_align);
1932
+ if(NIL_P(v_exclude)){
1933
+ lptpm = NULL;
1934
+ } else {
1935
+ CStructData *cs;
1936
+ CStruct_Data_Get_Struct(v_exclude, cs);
1937
+ if(cs->dtlen!=sizeof(TPMPARAMS)) {
1938
+ rb_raise(rb_eArgError, "last argument size is not same as TPMPARAMS's");
1939
+ }
1940
+ lptpm = (TPMPARAMS*)(cs->dtstr + cs->dtoffset);
1941
+ }
1942
+ pos.x = FIX2INT(v_x);
1943
+ pos.y = FIX2INT(v_y);
1944
+ ClientToScreen(rw->hwnd, &pos);
1945
+ r = TrackPopupMenuEx(rm->hmenu, falign, pos.x, pos.y, rw->hwnd, lptpm);
1946
+ return r ? Qtrue : Qfalse;
1947
+ }
1948
+
1949
+ static void
1950
+ rw_init_Menu(){
1951
+ cRwMenu = rb_define_class_under(mRwin, "Menu", rb_cData);
1952
+ rb_define_alloc_func(cRwMenu, alloc_rwmenu);
1953
+
1954
+ rb_define_method(cRwMenu, "_hmenu", rwmenu_hmenu, 0);
1955
+ rb_define_method(cRwMenu, "alive?", rwmenu_alive_p, 0);
1956
+ rb_define_method(cRwMenu, "createmenu", rwmenu_createmenu, 0);
1957
+ rb_define_method(cRwMenu, "createpopup", rwmenu_createpopup, 0);
1958
+ rb_define_method(cRwMenu, "insert", rwmenu_insert, -1);
1959
+ rb_define_method(cRwMenu, "delete", rwmenu_delete, 2);
1960
+ rb_define_method(cRwMenu, "destroy", rwmenu_destroy, 0);
1961
+
1962
+
1963
+ /* API Functions */
1964
+ rb_define_method(cRwMenu, "GetMenuItemCount", rwmenu_getmenuitemcount, 0);
1965
+ rb_define_method(cRwMenu, "GetMenuItemInfo", rwmenu_getmenuiteminfo, 3);
1966
+ rb_define_method(cRwMenu, "SetMenuItemInfo", rwmenu_setmenuiteminfo, 3);
1967
+ // rb_define_method(cRwMenu, "GetMenuString", rwmenu_getmenustring, 2);
1968
+ rb_define_method(cRwMenu, "GetMenuItemID", rwmenu_getmenuitemid, 1);
1969
+ rb_define_method(cRwMenu, "GetSubMenu", rwmenu_getsubmenu, 1);
1970
+
1971
+ /* Window functions */
1972
+ rb_define_method(cRwWindow, "SetMenu", rwwin_setmenu, 1);
1973
+ rb_define_method(cRwWindow, "DrawMenuBar", rwwin_drawmenubar, 0);
1974
+ rb_define_method(cRwWindow, "TrackPopupMenu", rwwin_trackpopupmenu, -1);
1975
+ }
1976
+
1977
+ /* Initialize */
1978
+ void
1979
+ Init_rw_resources(){
1980
+ rw_init_Bitmap();
1981
+ rw_init_Icon();
1982
+ rw_init_Cursor();
1983
+ rw_init_Pen();
1984
+ rw_init_Brush();
1985
+ rw_init_Imagelist();
1986
+ rw_init_Font();
1987
+ rw_init_Menu();
1988
+ }