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.
- checksums.yaml +7 -0
- data/README +28 -0
- data/Rakefile +66 -0
- data/bin/wrb +41 -0
- data/bin/wrb.bat +6 -0
- data/ext/rwin/aatree.c +192 -0
- data/ext/rwin/aatree.h +55 -0
- data/ext/rwin/extconf.rb +47 -0
- data/ext/rwin/rw_api.c +2058 -0
- data/ext/rwin/rw_devices.c +215 -0
- data/ext/rwin/rw_gdiplus.h +278 -0
- data/ext/rwin/rw_graphics.c +1583 -0
- data/ext/rwin/rw_resources.c +1988 -0
- data/ext/rwin/rw_ubfuncs.c +281 -0
- data/ext/rwin/rw_windows.c +1936 -0
- data/ext/rwin/rwin.c +451 -0
- data/ext/rwin/rwin.h +442 -0
- data/lib/rwin.rb +820 -0
- data/lib/wrb.rb +20 -0
- data/lib/wrb/applications/frmdesigner/angle.cur +0 -0
- data/lib/wrb/applications/frmdesigner/angle2.cur +0 -0
- data/lib/wrb/applications/frmdesigner/controls/Button.bmp +0 -0
- data/lib/wrb/applications/frmdesigner/controls/Button.rb +34 -0
- data/lib/wrb/applications/frmdesigner/controls/Checkbox.bmp +0 -0
- data/lib/wrb/applications/frmdesigner/controls/Checkbox.rb +10 -0
- data/lib/wrb/applications/frmdesigner/controls/Combobox.bmp +0 -0
- data/lib/wrb/applications/frmdesigner/controls/Combobox.rb +88 -0
- data/lib/wrb/applications/frmdesigner/controls/ComboboxEx.rb +97 -0
- data/lib/wrb/applications/frmdesigner/controls/Comboboxex.bmp +0 -0
- data/lib/wrb/applications/frmdesigner/controls/DateTimePicker.bmp +0 -0
- data/lib/wrb/applications/frmdesigner/controls/DateTimePicker.rb +11 -0
- data/lib/wrb/applications/frmdesigner/controls/Edit.bmp +0 -0
- data/lib/wrb/applications/frmdesigner/controls/Edit.rb +8 -0
- data/lib/wrb/applications/frmdesigner/controls/Groupbox.bmp +0 -0
- data/lib/wrb/applications/frmdesigner/controls/Groupbox.rb +9 -0
- data/lib/wrb/applications/frmdesigner/controls/Hotkeyctrl.bmp +0 -0
- data/lib/wrb/applications/frmdesigner/controls/Hotkeyctrl.rb +9 -0
- data/lib/wrb/applications/frmdesigner/controls/Imagelist.bmp +0 -0
- data/lib/wrb/applications/frmdesigner/controls/Imagelist.rb +115 -0
- data/lib/wrb/applications/frmdesigner/controls/Listbox.bmp +0 -0
- data/lib/wrb/applications/frmdesigner/controls/Listbox.rb +77 -0
- data/lib/wrb/applications/frmdesigner/controls/Listview.bmp +0 -0
- data/lib/wrb/applications/frmdesigner/controls/Listview.rb +157 -0
- data/lib/wrb/applications/frmdesigner/controls/Menu.bmp +0 -0
- data/lib/wrb/applications/frmdesigner/controls/Menu.rb +198 -0
- data/lib/wrb/applications/frmdesigner/controls/Menubar.bmp +0 -0
- data/lib/wrb/applications/frmdesigner/controls/Menubar.rb +9 -0
- data/lib/wrb/applications/frmdesigner/controls/MonthCalender.bmp +0 -0
- data/lib/wrb/applications/frmdesigner/controls/Monthcalender.rb +9 -0
- data/lib/wrb/applications/frmdesigner/controls/Panel.bmp +0 -0
- data/lib/wrb/applications/frmdesigner/controls/Panel.rb +30 -0
- data/lib/wrb/applications/frmdesigner/controls/Progressbar.rb +10 -0
- data/lib/wrb/applications/frmdesigner/controls/Radiobutton.bmp +0 -0
- data/lib/wrb/applications/frmdesigner/controls/Radiobutton.rb +13 -0
- data/lib/wrb/applications/frmdesigner/controls/Rebar.bmp +0 -0
- data/lib/wrb/applications/frmdesigner/controls/Rebar.rb +162 -0
- data/lib/wrb/applications/frmdesigner/controls/Splitter.bmp +0 -0
- data/lib/wrb/applications/frmdesigner/controls/Splitter.rb +66 -0
- data/lib/wrb/applications/frmdesigner/controls/Static.bmp +0 -0
- data/lib/wrb/applications/frmdesigner/controls/Static.rb +9 -0
- data/lib/wrb/applications/frmdesigner/controls/Statusbar.bmp +0 -0
- data/lib/wrb/applications/frmdesigner/controls/Statusbar.rb +103 -0
- data/lib/wrb/applications/frmdesigner/controls/Tabctrl.bmp +0 -0
- data/lib/wrb/applications/frmdesigner/controls/Tabctrl.rb +136 -0
- data/lib/wrb/applications/frmdesigner/controls/Timer.bmp +0 -0
- data/lib/wrb/applications/frmdesigner/controls/Timer.rb +36 -0
- data/lib/wrb/applications/frmdesigner/controls/Toolbar.bmp +0 -0
- data/lib/wrb/applications/frmdesigner/controls/Toolbar.rb +165 -0
- data/lib/wrb/applications/frmdesigner/controls/Trackbar.bmp +0 -0
- data/lib/wrb/applications/frmdesigner/controls/Trackbar.rb +34 -0
- data/lib/wrb/applications/frmdesigner/controls/Treeview.bmp +0 -0
- data/lib/wrb/applications/frmdesigner/controls/Treeview.rb +107 -0
- data/lib/wrb/applications/frmdesigner/controls/Updown.bmp +0 -0
- data/lib/wrb/applications/frmdesigner/controls/Updown.rb +31 -0
- data/lib/wrb/applications/frmdesigner/controls/default.bmp +0 -0
- data/lib/wrb/applications/frmdesigner/controls/progressbar.bmp +0 -0
- data/lib/wrb/applications/frmdesigner/controls/unselect.bmp +0 -0
- data/lib/wrb/applications/frmdesigner/fddialogs.rb +87 -0
- data/lib/wrb/applications/frmdesigner/fdesign.rb +1315 -0
- data/lib/wrb/applications/frmdesigner/fdmodules.rb +1394 -0
- data/lib/wrb/applications/frmdesigner/fdparseform.rb +197 -0
- data/lib/wrb/applications/frmdesigner/img13.bmp +0 -0
- data/lib/wrb/base.rb +1294 -0
- data/lib/wrb/combocommon.rb +77 -0
- data/lib/wrb/commctrlconst.rb +139 -0
- data/lib/wrb/commdlg.rb +77 -0
- data/lib/wrb/components/animate.rb +114 -0
- data/lib/wrb/components/bitmap.rb +116 -0
- data/lib/wrb/components/button.rb +134 -0
- data/lib/wrb/components/canvas.rb +266 -0
- data/lib/wrb/components/checkbox.rb +118 -0
- data/lib/wrb/components/choosecolordlg.rb +87 -0
- data/lib/wrb/components/choosefontdlg.rb +142 -0
- data/lib/wrb/components/clipboard.rb +174 -0
- data/lib/wrb/components/combobox.rb +282 -0
- data/lib/wrb/components/comboboxex.rb +574 -0
- data/lib/wrb/components/cursor.rb +91 -0
- data/lib/wrb/components/datetimepicker.rb +197 -0
- data/lib/wrb/components/ddeclient.rb +180 -0
- data/lib/wrb/components/ddeserver.rb +131 -0
- data/lib/wrb/components/dialog.rb +228 -0
- data/lib/wrb/components/edit.rb +412 -0
- data/lib/wrb/components/font.rb +35 -0
- data/lib/wrb/components/form.rb +65 -0
- data/lib/wrb/components/groupbox.rb +122 -0
- data/lib/wrb/components/header.rb +479 -0
- data/lib/wrb/components/hotkeyctrl.rb +72 -0
- data/lib/wrb/components/icon.rb +109 -0
- data/lib/wrb/components/imagelist.rb +396 -0
- data/lib/wrb/components/inifile.rb +97 -0
- data/lib/wrb/components/listbox.rb +149 -0
- data/lib/wrb/components/listview.rb +1467 -0
- data/lib/wrb/components/menu.rb +592 -0
- data/lib/wrb/components/menubar.rb +84 -0
- data/lib/wrb/components/monthcalender.rb +164 -0
- data/lib/wrb/components/openfilenamedlg.rb +147 -0
- data/lib/wrb/components/pager.rb +199 -0
- data/lib/wrb/components/panel.rb +103 -0
- data/lib/wrb/components/picture.rb +55 -0
- data/lib/wrb/components/printdlg.rb +148 -0
- data/lib/wrb/components/printdlgex.rb +117 -0
- data/lib/wrb/components/printer.rb +97 -0
- data/lib/wrb/components/progressbar.rb +140 -0
- data/lib/wrb/components/radiobutton.rb +49 -0
- data/lib/wrb/components/rebar.rb +830 -0
- data/lib/wrb/components/registry.rb +408 -0
- data/lib/wrb/components/richedit.rb +1181 -0
- data/lib/wrb/components/savefilenamedlg.rb +27 -0
- data/lib/wrb/components/scintilla.rb +1298 -0
- data/lib/wrb/components/scrollbar.rb +239 -0
- data/lib/wrb/components/splitter.rb +494 -0
- data/lib/wrb/components/static.rb +198 -0
- data/lib/wrb/components/statusbar.rb +490 -0
- data/lib/wrb/components/tabctrl.rb +686 -0
- data/lib/wrb/components/timer.rb +117 -0
- data/lib/wrb/components/toolbar.rb +1107 -0
- data/lib/wrb/components/tooltip.rb +651 -0
- data/lib/wrb/components/trackbar.rb +298 -0
- data/lib/wrb/components/treeview.rb +845 -0
- data/lib/wrb/components/updown.rb +198 -0
- data/lib/wrb/ddeml.rb +241 -0
- data/lib/wrb/documents/animate.html +46 -0
- data/lib/wrb/documents/bitmap.html +69 -0
- data/lib/wrb/documents/button.html +78 -0
- data/lib/wrb/documents/canvas.html +137 -0
- data/lib/wrb/documents/checkbox.html +77 -0
- data/lib/wrb/documents/choosecolordlg.html +29 -0
- data/lib/wrb/documents/choosefontdlg.html +31 -0
- data/lib/wrb/documents/clipboard.html +31 -0
- data/lib/wrb/documents/combobox.html +117 -0
- data/lib/wrb/documents/comboboxex.html +139 -0
- data/lib/wrb/documents/control.html +53 -0
- data/lib/wrb/documents/cursor.html +45 -0
- data/lib/wrb/documents/datetimepicker.html +70 -0
- data/lib/wrb/documents/ddeclient.html +33 -0
- data/lib/wrb/documents/ddeserver.html +26 -0
- data/lib/wrb/documents/dialog.html +78 -0
- data/lib/wrb/documents/edit.html +169 -0
- data/lib/wrb/documents/empty.html +11 -0
- data/lib/wrb/documents/favicon.png +0 -0
- data/lib/wrb/documents/font.html +38 -0
- data/lib/wrb/documents/form.html +63 -0
- data/lib/wrb/documents/groupbox.html +57 -0
- data/lib/wrb/documents/header.html +85 -0
- data/lib/wrb/documents/hotkeyctrl.html +42 -0
- data/lib/wrb/documents/icon.html +45 -0
- data/lib/wrb/documents/imagelist.html +101 -0
- data/lib/wrb/documents/images/button.png +0 -0
- data/lib/wrb/documents/images/checkbox.png +0 -0
- data/lib/wrb/documents/images/combobox.png +0 -0
- data/lib/wrb/documents/images/comboboxex.png +0 -0
- data/lib/wrb/documents/images/datetimepicker.png +0 -0
- data/lib/wrb/documents/images/edit.png +0 -0
- data/lib/wrb/documents/images/groupbox.png +0 -0
- data/lib/wrb/documents/images/hotkeyctrl.png +0 -0
- data/lib/wrb/documents/images/listbox.png +0 -0
- data/lib/wrb/documents/images/listview.png +0 -0
- data/lib/wrb/documents/images/menu.png +0 -0
- data/lib/wrb/documents/images/menubar.png +0 -0
- data/lib/wrb/documents/images/monthcalender.png +0 -0
- data/lib/wrb/documents/images/progressbar.png +0 -0
- data/lib/wrb/documents/images/radiobutton.png +0 -0
- data/lib/wrb/documents/images/rebar.png +0 -0
- data/lib/wrb/documents/images/richedit.png +0 -0
- data/lib/wrb/documents/images/splitter.png +0 -0
- data/lib/wrb/documents/images/static.png +0 -0
- data/lib/wrb/documents/images/statusbar.png +0 -0
- data/lib/wrb/documents/images/tabctrl.png +0 -0
- data/lib/wrb/documents/images/toolbar.png +0 -0
- data/lib/wrb/documents/images/tooltip.png +0 -0
- data/lib/wrb/documents/images/trackbar.png +0 -0
- data/lib/wrb/documents/images/treeview.png +0 -0
- data/lib/wrb/documents/images/updown.png +0 -0
- data/lib/wrb/documents/index.html +155 -0
- data/lib/wrb/documents/inifile.html +36 -0
- data/lib/wrb/documents/license.txt +22 -0
- data/lib/wrb/documents/listbox.html +96 -0
- data/lib/wrb/documents/listview.html +277 -0
- data/lib/wrb/documents/make_doc.rb +596 -0
- data/lib/wrb/documents/menu.html +144 -0
- data/lib/wrb/documents/menubar.html +54 -0
- data/lib/wrb/documents/monthcalender.html +48 -0
- data/lib/wrb/documents/openfilenamedlg.html +36 -0
- data/lib/wrb/documents/pager.html +63 -0
- data/lib/wrb/documents/panel.html +32 -0
- data/lib/wrb/documents/picture.html +48 -0
- data/lib/wrb/documents/printdlg.html +35 -0
- data/lib/wrb/documents/printdlgex.html +35 -0
- data/lib/wrb/documents/printer.html +40 -0
- data/lib/wrb/documents/progressbar.html +69 -0
- data/lib/wrb/documents/radiobutton.html +51 -0
- data/lib/wrb/documents/rebar.html +143 -0
- data/lib/wrb/documents/registry.html +36 -0
- data/lib/wrb/documents/richedit.html +232 -0
- data/lib/wrb/documents/samples/editimg.bmp +0 -0
- data/lib/wrb/documents/samples/editimg.iml +0 -0
- data/lib/wrb/documents/samples/fileimg.bmp +0 -0
- data/lib/wrb/documents/samples/fileimg.iml +0 -0
- data/lib/wrb/documents/samples/sample_button.rb +21 -0
- data/lib/wrb/documents/samples/sample_checkbox.rb +18 -0
- data/lib/wrb/documents/samples/sample_combobox.rb +18 -0
- data/lib/wrb/documents/samples/sample_comboboxex.rb +23 -0
- data/lib/wrb/documents/samples/sample_datetimepicker.rb +11 -0
- data/lib/wrb/documents/samples/sample_edit.rb +25 -0
- data/lib/wrb/documents/samples/sample_groupbox.rb +19 -0
- data/lib/wrb/documents/samples/sample_hotkeyctrl.rb +12 -0
- data/lib/wrb/documents/samples/sample_listbox.rb +12 -0
- data/lib/wrb/documents/samples/sample_listview.rb +32 -0
- data/lib/wrb/documents/samples/sample_menu.rb +21 -0
- data/lib/wrb/documents/samples/sample_menubar.rb +23 -0
- data/lib/wrb/documents/samples/sample_monthcalender.rb +11 -0
- data/lib/wrb/documents/samples/sample_progressbar.rb +14 -0
- data/lib/wrb/documents/samples/sample_radiobutton.rb +14 -0
- data/lib/wrb/documents/samples/sample_rebar.rb +25 -0
- data/lib/wrb/documents/samples/sample_richedit.rb +60 -0
- data/lib/wrb/documents/samples/sample_splitter.rb +33 -0
- data/lib/wrb/documents/samples/sample_static.rb +15 -0
- data/lib/wrb/documents/samples/sample_statusbar.rb +17 -0
- data/lib/wrb/documents/samples/sample_tabctrl.rb +19 -0
- data/lib/wrb/documents/samples/sample_toolbar.rb +29 -0
- data/lib/wrb/documents/samples/sample_tooltip.rb +50 -0
- data/lib/wrb/documents/samples/sample_trackbar.rb +30 -0
- data/lib/wrb/documents/samples/sample_treeview.rb +19 -0
- data/lib/wrb/documents/samples/sample_updown.rb +18 -0
- data/lib/wrb/documents/samples/sampleimg16.iml +0 -0
- data/lib/wrb/documents/samples/sampleimg32.iml +0 -0
- data/lib/wrb/documents/samples/samplemg16.png +0 -0
- data/lib/wrb/documents/samples/samplemg32.png +0 -0
- data/lib/wrb/documents/samples/wrb.ico +0 -0
- data/lib/wrb/documents/savefilenamedlg.html +19 -0
- data/lib/wrb/documents/scrollbar.html +60 -0
- data/lib/wrb/documents/splitter.html +96 -0
- data/lib/wrb/documents/static.html +84 -0
- data/lib/wrb/documents/statusbar.html +110 -0
- data/lib/wrb/documents/tabctrl.html +151 -0
- data/lib/wrb/documents/timer.html +43 -0
- data/lib/wrb/documents/toolbar.html +181 -0
- data/lib/wrb/documents/tooltip.html +131 -0
- data/lib/wrb/documents/trackbar.html +107 -0
- data/lib/wrb/documents/treeview.html +210 -0
- data/lib/wrb/documents/updown.html +85 -0
- data/lib/wrb/documents/wincontrol.html +258 -0
- data/lib/wrb/documents/window.html +499 -0
- data/lib/wrb/documents/wrb.css +228 -0
- data/lib/wrb/gmem.rb +26 -0
- data/lib/wrb/imecommon.rb +59 -0
- data/lib/wrb/listcommon.rb +185 -0
- data/lib/wrb/lzss.rb +126 -0
- data/lib/wrb/scrollinfo.rb +142 -0
- data/lib/wrb/toplevelcommon.rb +634 -0
- 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
|
+
}
|