nyle 0.5.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +8 -0
- data/Gemfile +6 -0
- data/LICENSE.txt +21 -0
- data/README.md +37 -0
- data/Rakefile +2 -0
- data/doc/Nyle_reference.pdf +0 -0
- data/lib/nyle/frame.rb +107 -0
- data/lib/nyle/screen.rb +106 -0
- data/lib/nyle/version.rb +3 -0
- data/lib/nyle.rb +345 -0
- data/nyle.gemspec +44 -0
- data/samples/image/n_b_crocodile.png +0 -0
- data/samples/image/n_b_river.gif +0 -0
- data/samples/image/n_f_banana.png +0 -0
- data/samples/image/n_f_panda.png +0 -0
- data/samples/image/n_f_strawberry.png +0 -0
- data/samples/image/n_f_weapon.png +0 -0
- data/samples/image/n_i_bg.jpg +0 -0
- data/samples/image/n_i_chara.png +0 -0
- data/samples/nyle_basics.rb +69 -0
- data/samples/nyle_basics2.rb +70 -0
- data/samples/nyle_block.rb +188 -0
- data/samples/nyle_colors.rb +309 -0
- data/samples/nyle_falling.rb +298 -0
- data/samples/nyle_rpg.rb +98 -0
- data/samples/nyle_shape.rb +70 -0
- data/samples/nyle_sketch.rb +45 -0
- data/samples/nyle_tree.rb +48 -0
- data/samples/nyle_walk_notrace.rb +54 -0
- data/samples/nyle_walk_trace.rb +54 -0
- data/samples/readme_samples.txt +29 -0
- metadata +143 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 42ab8fbeb3f524b4e03c3007e5021196296a4492e62ba78ae2b5a596dcb02a46
|
4
|
+
data.tar.gz: 365227d4c2aaf246b5ed0f17cc928b179c533cf90f258fd4533106e91701bd66
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 330e8bac463e481d5066c9313ca6ea94cde526727ec88b9e21f1e9bf27259dab1862dfc60bfd32714591e2ac0c2c3887a46c16262e3c6279bcc46bbd6cc5775a
|
7
|
+
data.tar.gz: 1b98f3ef0709b13780a335109c5e880a1c371c3993598585ff82845f8e66b966a4365809fd0427cb1cc647db7e444d3d8d7bbe44f1d42452b880a0e38f8d8d60
|
data/.gitignore
ADDED
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
The MIT License (MIT)
|
2
|
+
|
3
|
+
Copyright (c) 2018 TODO: Write your name
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
7
|
+
in the Software without restriction, including without limitation the rights
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
10
|
+
furnished to do so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in
|
13
|
+
all copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
21
|
+
THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
# Nyle
|
2
|
+
|
3
|
+
'Nyle' is a minimal graphics framework using Ruby/GTK3 and Cairo.
|
4
|
+
|
5
|
+
## Requirements
|
6
|
+
|
7
|
+
* Ruby/GTK3
|
8
|
+
* rsvg2 (for Windows only)
|
9
|
+
|
10
|
+
## Installation
|
11
|
+
|
12
|
+
Install it yourself as:
|
13
|
+
|
14
|
+
$ gem install nyle
|
15
|
+
|
16
|
+
Or for Windows
|
17
|
+
|
18
|
+
$ gem install nyle
|
19
|
+
$ gem rsvg2
|
20
|
+
|
21
|
+
## Usage
|
22
|
+
|
23
|
+
```ruby
|
24
|
+
require 'nyle'
|
25
|
+
```
|
26
|
+
|
27
|
+
## Documents
|
28
|
+
|
29
|
+
Reference manual: https://github.com/spoolkitamura/nyle/tree/master/doc/Nyle_reference.pdf
|
30
|
+
|
31
|
+
## Samples
|
32
|
+
|
33
|
+
Reference manual: https://github.com/spoolkitamura/nyle/tree/master/samples
|
34
|
+
|
35
|
+
## License
|
36
|
+
|
37
|
+
The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
|
data/Rakefile
ADDED
Binary file
|
data/lib/nyle/frame.rb
ADDED
@@ -0,0 +1,107 @@
|
|
1
|
+
|
2
|
+
=begin
|
3
|
+
'Nyle'
|
4
|
+
minimal graphics framework using Ruby/GTK3 and Cairo
|
5
|
+
|
6
|
+
Copyright (c) 2018 Koki Kitamura
|
7
|
+
Released under the MIT license
|
8
|
+
https://opensource.org/licenses/mit-license.php
|
9
|
+
=end
|
10
|
+
|
11
|
+
module Nyle
|
12
|
+
class Error < StandardError; end
|
13
|
+
|
14
|
+
# Frame
|
15
|
+
class Frame < Gtk::Window
|
16
|
+
include Gdk::Keyval # Include key definication to omit 'Gdk::Keyval::' for subclass
|
17
|
+
def initialize(width = DEFAULT_WIDTH, height = DEFAULT_HEIGHT, title: DEFAULT_TITLE)
|
18
|
+
super()
|
19
|
+
self.set_size_request(width, height)
|
20
|
+
self.resizable = false
|
21
|
+
self.title = title
|
22
|
+
@transition = [] # Screen transition table
|
23
|
+
@interval_time = ENV['NYLE_INTERVAL'].to_i # milli seconds
|
24
|
+
@interval_time = 15 if @interval_time < 5 or @interval_time > 60
|
25
|
+
GLib::Timeout.add(@interval_time) do
|
26
|
+
if @current_screen
|
27
|
+
Nyle.module_eval {
|
28
|
+
_update_mouse_state
|
29
|
+
_update_key_state
|
30
|
+
}
|
31
|
+
update
|
32
|
+
@current_screen.queue_draw unless @current_screen.destroyed?
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
# Mouse events
|
37
|
+
self.add_events([:button_press_mask,
|
38
|
+
:button_release_mask])
|
39
|
+
|
40
|
+
# Signal handler for mouse pressed
|
41
|
+
self.signal_connect(:button_press_event) do |widget, event|
|
42
|
+
Nyle.module_eval {
|
43
|
+
_set_mouse_down(event.button, true)
|
44
|
+
}
|
45
|
+
false
|
46
|
+
end
|
47
|
+
|
48
|
+
# Signal handler for mouse released
|
49
|
+
self.signal_connect(:button_release_event) do |widget, event|
|
50
|
+
Nyle.module_eval {
|
51
|
+
_set_mouse_down(event.button, false)
|
52
|
+
}
|
53
|
+
false
|
54
|
+
end
|
55
|
+
|
56
|
+
# Signal handler for key pressed
|
57
|
+
self.signal_connect(:key_press_event) do |widget, event|
|
58
|
+
Nyle.module_eval {
|
59
|
+
_set_key_down(event.keyval, true)
|
60
|
+
}
|
61
|
+
# [debug]
|
62
|
+
# puts "keyname: [#{Gdk::Keyval.to_name(event.keyval)}]"
|
63
|
+
false
|
64
|
+
end
|
65
|
+
|
66
|
+
# Signal handler for key released
|
67
|
+
self.signal_connect(:key_release_event) do |widget, event|
|
68
|
+
Nyle.module_eval {
|
69
|
+
_set_key_down(event.keyval, false)
|
70
|
+
}
|
71
|
+
false
|
72
|
+
end
|
73
|
+
|
74
|
+
self.signal_connect(:destroy) do
|
75
|
+
Gtk.main_quit
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
def set_current(screen)
|
80
|
+
_set_current(screen)
|
81
|
+
end
|
82
|
+
|
83
|
+
private def _set_current(screen)
|
84
|
+
self.remove(@current_screen) if @current_screen
|
85
|
+
@current_screen = screen
|
86
|
+
self.add(@current_screen)
|
87
|
+
w = @current_screen.width
|
88
|
+
h = @current_screen.height
|
89
|
+
Nyle.module_eval {
|
90
|
+
_set_screen_size(w, h)
|
91
|
+
}
|
92
|
+
end
|
93
|
+
|
94
|
+
private def update
|
95
|
+
@transition.each do |tr|
|
96
|
+
if tr[:current] == @current_screen and tr[:status] == @current_screen.status
|
97
|
+
tr[:current].instance_eval { suspend } # Suspend for current screen
|
98
|
+
tr[:next].instance_eval { resume } # Resume for next screen
|
99
|
+
_set_current(tr[:next]) # Change screen
|
100
|
+
self.show_all
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
end
|
107
|
+
|
data/lib/nyle/screen.rb
ADDED
@@ -0,0 +1,106 @@
|
|
1
|
+
|
2
|
+
=begin
|
3
|
+
'Nyle'
|
4
|
+
minimal graphics framework using Ruby/GTK3 and Cairo
|
5
|
+
|
6
|
+
Copyright (c) 2018 Koki Kitamura
|
7
|
+
Released under the MIT license
|
8
|
+
https://opensource.org/licenses/mit-license.php
|
9
|
+
=end
|
10
|
+
|
11
|
+
module Nyle
|
12
|
+
class Error < StandardError; end
|
13
|
+
|
14
|
+
# Screen
|
15
|
+
class Screen < Gtk::DrawingArea
|
16
|
+
include Gdk::Keyval # Include key definication to omit 'Gdk::Keyval::' for subclass
|
17
|
+
attr_reader :width, :height, :status
|
18
|
+
def initialize(width = DEFAULT_WIDTH, height = DEFAULT_HEIGHT, bgcolor: :WHITE, trace: false)
|
19
|
+
super()
|
20
|
+
@width = width
|
21
|
+
@height = height
|
22
|
+
@trace = trace
|
23
|
+
@bgcolor = bgcolor
|
24
|
+
@running_count = 0
|
25
|
+
@status = nil
|
26
|
+
|
27
|
+
# Draw to 'CairoContext' of ImageSurface once, and copy to 'CairoContext' of DrawingArea
|
28
|
+
if @trace
|
29
|
+
# specified color background
|
30
|
+
# [WARN] Segmentation Fault happen after a while
|
31
|
+
#data = sprintf("%02X%02X%02X%02X", Cairo::Color.parse(@bgcolor).b * 255,
|
32
|
+
# Cairo::Color.parse(@bgcolor).g * 255,
|
33
|
+
# Cairo::Color.parse(@bgcolor).r * 255, 255) # Hex (e.g. CC7700FF; b=CC, g=77, r=00, a=FF)
|
34
|
+
#data = [data].pack("H*") # Pack as binary (e.g. \xCC\x77\x00\xFF)
|
35
|
+
#@canvas = Cairo::ImageSurface.new(data * @width * @height, :ARGB32, @width, @height, @width * 4)
|
36
|
+
@canvas = Cairo::ImageSurface.new(@width, @height)
|
37
|
+
else
|
38
|
+
# transparent background
|
39
|
+
@canvas = Cairo::ImageSurface.new(@width, @height)
|
40
|
+
end
|
41
|
+
self.signal_connect(:configure_event) do |widget, event|
|
42
|
+
; # For resizing and so on
|
43
|
+
end
|
44
|
+
|
45
|
+
self.signal_connect(:draw) do |widget, cairo_context|
|
46
|
+
# Draw to 'CairoContext' of ImageSurface
|
47
|
+
Cairo::Context.new(@canvas) do |cr|
|
48
|
+
Nyle.module_eval {
|
49
|
+
_set_cr(cr)
|
50
|
+
}
|
51
|
+
unless @trace # If not trace, fill screen each time
|
52
|
+
Nyle.cr.set_source_color(@bgcolor)
|
53
|
+
Nyle.cr.paint
|
54
|
+
end
|
55
|
+
update
|
56
|
+
draw
|
57
|
+
end
|
58
|
+
# Copy to 'CairoContext' of DrawingArea
|
59
|
+
Nyle.module_eval {
|
60
|
+
_set_cr(cairo_context)
|
61
|
+
}
|
62
|
+
pattern = Cairo::SurfacePattern.new(@canvas)
|
63
|
+
Nyle.cr.set_source(pattern)
|
64
|
+
Nyle.cr.paint
|
65
|
+
@running_count += 1
|
66
|
+
end
|
67
|
+
|
68
|
+
# Need not only :pointer_motion but also :button_press and :button_release
|
69
|
+
self.add_events([:button_press_mask,
|
70
|
+
:button_release_mask,
|
71
|
+
:pointer_motion_mask])
|
72
|
+
|
73
|
+
# Signal handler for mouse position
|
74
|
+
self.signal_connect(:motion_notify_event) do |widget, event|
|
75
|
+
Nyle.module_eval {
|
76
|
+
_set_mouse_pos(event.x, event.y)
|
77
|
+
}
|
78
|
+
false
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
# When single screen, create frame to show self
|
83
|
+
def show_all(title = DEFAULT_TITLE)
|
84
|
+
f = Nyle::Frame.new(@width, @height, {title: title})
|
85
|
+
f.set_current(self)
|
86
|
+
|
87
|
+
# Workaround for Segmentation Fault when ImageSureface instance create by using RGBA32 data at Screen.initialize
|
88
|
+
f.override_background_color(:normal, Gdk::RGBA::new(Cairo::Color.parse(@bgcolor).r,
|
89
|
+
Cairo::Color.parse(@bgcolor).g,
|
90
|
+
Cairo::Color.parse(@bgcolor).b, 1.0))
|
91
|
+
f.show_all
|
92
|
+
f
|
93
|
+
end
|
94
|
+
|
95
|
+
# Abstract methods to be overriden
|
96
|
+
private def update ; end
|
97
|
+
private def draw ; end
|
98
|
+
private def suspend ; end
|
99
|
+
private def resume ; end
|
100
|
+
end
|
101
|
+
|
102
|
+
end
|
103
|
+
|
104
|
+
|
105
|
+
# [TODO] :draw counter (for waiting, sleeping, idling)
|
106
|
+
|
data/lib/nyle/version.rb
ADDED
data/lib/nyle.rb
ADDED
@@ -0,0 +1,345 @@
|
|
1
|
+
|
2
|
+
=begin
|
3
|
+
'Nyle'
|
4
|
+
minimal graphics framework using Ruby/GTK3 and Cairo
|
5
|
+
|
6
|
+
Copyright (c) 2018 Koki Kitamura
|
7
|
+
Released under the MIT license
|
8
|
+
https://opensource.org/licenses/mit-license.php
|
9
|
+
=end
|
10
|
+
|
11
|
+
require 'gtk3'
|
12
|
+
require 'rbconfig'
|
13
|
+
|
14
|
+
require 'nyle/version'
|
15
|
+
require 'nyle/frame'
|
16
|
+
require 'nyle/screen'
|
17
|
+
|
18
|
+
module Nyle
|
19
|
+
class Error < StandardError; end
|
20
|
+
|
21
|
+
DEFAULT_WIDTH = 640
|
22
|
+
DEFAULT_HEIGHT = 480
|
23
|
+
DEFAULT_TITLE = 'Nyle'
|
24
|
+
|
25
|
+
@__cr = nil
|
26
|
+
@__screen_width = DEFAULT_WIDTH
|
27
|
+
@__screen_height = DEFAULT_HEIGHT
|
28
|
+
@__mouse_x = 0
|
29
|
+
@__mouse_y = 0
|
30
|
+
@__mouse_down = {}
|
31
|
+
@__mouse_down_last = {}
|
32
|
+
@__mouse_press = {}
|
33
|
+
@__mouse_release = {}
|
34
|
+
@__key_down = {}
|
35
|
+
@__key_down_last = {}
|
36
|
+
@__key_press = {}
|
37
|
+
@__key_release = {}
|
38
|
+
@__mask_control = false
|
39
|
+
@__mask_shift = false
|
40
|
+
|
41
|
+
@__os = (
|
42
|
+
host_os = RbConfig::CONFIG['host_os']
|
43
|
+
case host_os
|
44
|
+
when /mswin|msys|mingw|cygwin|bccwin|wince|emc/
|
45
|
+
:windows
|
46
|
+
when /darwin|mac os/
|
47
|
+
:mac
|
48
|
+
when /linux/
|
49
|
+
:linux
|
50
|
+
else
|
51
|
+
:unknown
|
52
|
+
end
|
53
|
+
)
|
54
|
+
|
55
|
+
|
56
|
+
# Singleton class
|
57
|
+
class << self
|
58
|
+
# private methods for classes in module 'Nyle'
|
59
|
+
private def _set_cr(cr)
|
60
|
+
@__cr = cr
|
61
|
+
end
|
62
|
+
|
63
|
+
private def _set_screen_size(w, h)
|
64
|
+
@__screen_width = w
|
65
|
+
@__screen_height = h
|
66
|
+
end
|
67
|
+
|
68
|
+
private def _set_mouse_pos(x, y)
|
69
|
+
@__mouse_x = x
|
70
|
+
@__mouse_y = y
|
71
|
+
end
|
72
|
+
|
73
|
+
private def _set_mouse_down(button, status)
|
74
|
+
@__mouse_down[button] = status
|
75
|
+
end
|
76
|
+
|
77
|
+
private def _set_key_down(keyval, status)
|
78
|
+
@__key_down[keyval] = status
|
79
|
+
end
|
80
|
+
|
81
|
+
private def _update_mouse_state
|
82
|
+
@__mouse_down.each_key do |k|
|
83
|
+
change = @__mouse_down[k] ^ @__mouse_down_last[k] # Get change of mouse press status (XOR)
|
84
|
+
press = change & @__mouse_down[k] # Detect change to press from release
|
85
|
+
release = change & !@__mouse_down[k] # Detect change to release from press
|
86
|
+
@__mouse_press[k] = press # Set mouse_press status
|
87
|
+
@__mouse_release[k] = release # Set mouse_release status
|
88
|
+
@__mouse_down_last[k] = @__mouse_down[k]
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
private def _update_key_state
|
93
|
+
@__key_down.each_key do |k|
|
94
|
+
change = @__key_down[k] ^ @__key_down_last[k] # Get change of key press status (XOR)
|
95
|
+
press = change & @__key_down[k] # Detect change to press from release
|
96
|
+
release = change & !@__key_down[k] # Detect change to release from press
|
97
|
+
@__key_press[k] = press # Set key_press status
|
98
|
+
@__key_release[k] = release # Set key_release status
|
99
|
+
@__key_down_last[k] = @__key_down[k]
|
100
|
+
|
101
|
+
if @__key_down[Gdk::Keyval::KEY_Control_L] or
|
102
|
+
@__key_down[Gdk::Keyval::KEY_Control_R]
|
103
|
+
@__mask_control = true # Set true to mask_control status
|
104
|
+
else
|
105
|
+
@__mask_control = false # Set false to mask_control status
|
106
|
+
end
|
107
|
+
|
108
|
+
if @__key_down[Gdk::Keyval::KEY_Shift_L] or
|
109
|
+
@__key_down[Gdk::Keyval::KEY_Shift_R]
|
110
|
+
@__mask_shift = true # Set true to mask_shift status
|
111
|
+
else
|
112
|
+
@__mask_shift = false # Set false to mask_shift status
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
|
119
|
+
# module functions for user
|
120
|
+
# (need module_eval{} statement to use including Nyle)
|
121
|
+
module_function def cr ; Nyle.module_eval{ @__cr } ; end
|
122
|
+
module_function def screen_width ; Nyle.module_eval{ @__screen_width } ; end
|
123
|
+
module_function def screen_height ; Nyle.module_eval{ @__screen_height } ; end
|
124
|
+
module_function def mouse_x ; Nyle.module_eval{ @__mouse_x } ; end
|
125
|
+
module_function def mouse_y ; Nyle.module_eval{ @__mouse_y } ; end
|
126
|
+
module_function def mouse_down?(button) ; Nyle.module_eval{ @__mouse_down [button] == true } ; end
|
127
|
+
module_function def mouse_press?(button) ; Nyle.module_eval{ @__mouse_press [button] == true } ; end
|
128
|
+
module_function def mouse_release?(button) ; Nyle.module_eval{ @__mouse_release[button] == true } ; end
|
129
|
+
module_function def key_down?(keyval) ; Nyle.module_eval{ @__key_down [keyval] == true } ; end
|
130
|
+
module_function def key_press?(keyval) ; Nyle.module_eval{ @__key_press [keyval] == true } ; end
|
131
|
+
module_function def key_release?(keyval) ; Nyle.module_eval{ @__key_release [keyval] == true } ; end
|
132
|
+
module_function def mask_control? ; Nyle.module_eval{ @__mask_control } ; end
|
133
|
+
module_function def mask_shift? ; Nyle.module_eval{ @__mask_shift } ; end
|
134
|
+
module_function def os ; Nyle.module_eval{ @__os } ; end
|
135
|
+
|
136
|
+
module_function def draw_line(x1, y1, x2, y2, weight: 2, cap: :BUTT, color: :BLACK, a: 1.0)
|
137
|
+
cr = Nyle.module_eval{ @__cr }
|
138
|
+
cr.save do
|
139
|
+
cr.line_width = weight
|
140
|
+
cr.line_cap = cap
|
141
|
+
if a == 1.0
|
142
|
+
cr.set_source_color(color)
|
143
|
+
else
|
144
|
+
cr.set_source_rgba(Cairo::Color.parse(color).r,
|
145
|
+
Cairo::Color.parse(color).g,
|
146
|
+
Cairo::Color.parse(color).b, a)
|
147
|
+
end
|
148
|
+
cr.move_to(x1, y1)
|
149
|
+
cr.line_to(x2, y2)
|
150
|
+
cr.stroke
|
151
|
+
end
|
152
|
+
end
|
153
|
+
|
154
|
+
module_function def draw_rect(x, y, w, h, weight: 2, cap: :BUTT, color: :BLACK, round: 0, fill: false, a: 1.0)
|
155
|
+
cr = Nyle.module_eval{ @__cr }
|
156
|
+
cr.save do
|
157
|
+
cr.line_width = weight
|
158
|
+
cr.line_cap = cap
|
159
|
+
if a == 1.0
|
160
|
+
cr.set_source_color(color)
|
161
|
+
else
|
162
|
+
cr.set_source_rgba(Cairo::Color.parse(color).r,
|
163
|
+
Cairo::Color.parse(color).g,
|
164
|
+
Cairo::Color.parse(color).b, a)
|
165
|
+
end
|
166
|
+
if round
|
167
|
+
cr.rounded_rectangle(x, y, w, h, round, round)
|
168
|
+
else
|
169
|
+
cr.rectangle(x, y, w, h)
|
170
|
+
end
|
171
|
+
if fill
|
172
|
+
cr.fill
|
173
|
+
else
|
174
|
+
cr.stroke
|
175
|
+
end
|
176
|
+
end
|
177
|
+
end
|
178
|
+
|
179
|
+
module_function def draw_circle(x, y, r, weight: 2, color: :BLACK, fill: false, a: 1.0)
|
180
|
+
cr = Nyle.module_eval{ @__cr }
|
181
|
+
cr.save do
|
182
|
+
cr.line_width = weight
|
183
|
+
if a == 1.0
|
184
|
+
cr.set_source_color(color)
|
185
|
+
else
|
186
|
+
cr.set_source_rgba(Cairo::Color.parse(color).r,
|
187
|
+
Cairo::Color.parse(color).g,
|
188
|
+
Cairo::Color.parse(color).b, a)
|
189
|
+
end
|
190
|
+
cr.circle(x, y, r)
|
191
|
+
if fill
|
192
|
+
cr.fill
|
193
|
+
else
|
194
|
+
cr.stroke
|
195
|
+
end
|
196
|
+
end
|
197
|
+
end
|
198
|
+
|
199
|
+
module_function def draw_shape(points, weight: 2, cap: :BUTT, color: :BLACK, a: 1.0, close: false, fill: false)
|
200
|
+
cr = Nyle.module_eval{ @__cr }
|
201
|
+
cr.save do
|
202
|
+
cr.line_width = weight
|
203
|
+
cr.line_cap = cap
|
204
|
+
if a == 1.0
|
205
|
+
cr.set_source_color(color)
|
206
|
+
else
|
207
|
+
cr.set_source_rgba(Cairo::Color.parse(color).r,
|
208
|
+
Cairo::Color.parse(color).g,
|
209
|
+
Cairo::Color.parse(color).b, a)
|
210
|
+
end
|
211
|
+
vertex = points.dup
|
212
|
+
vertex << vertex.first if close # closed shape
|
213
|
+
vertex.each do |v|
|
214
|
+
cr.line_to(v[0], v[1])
|
215
|
+
end
|
216
|
+
if fill
|
217
|
+
cr.fill
|
218
|
+
else
|
219
|
+
cr.stroke
|
220
|
+
end
|
221
|
+
end
|
222
|
+
end
|
223
|
+
|
224
|
+
module_function def draw_text(x, y, str, size: 32, color: :BLACK, a: 1.0)
|
225
|
+
cr = Nyle.module_eval{ @__cr }
|
226
|
+
cr.save do
|
227
|
+
cr.select_font_face("+") # Temporaly use "+" [TODO] (Need to confirm font name)
|
228
|
+
cr.font_size = size
|
229
|
+
if a == 1.0
|
230
|
+
cr.set_source_color(color)
|
231
|
+
else
|
232
|
+
cr.set_source_rgba(Cairo::Color.parse(color).r,
|
233
|
+
Cairo::Color.parse(color).g,
|
234
|
+
Cairo::Color.parse(color).b, a)
|
235
|
+
end
|
236
|
+
cr.move_to(x, y)
|
237
|
+
cr.show_text(str)
|
238
|
+
end
|
239
|
+
end
|
240
|
+
|
241
|
+
module INNER
|
242
|
+
# for Nyle.load_image* methods
|
243
|
+
class << self
|
244
|
+
private def _load_image(filename, color_key: nil)
|
245
|
+
loaded = GdkPixbuf::Pixbuf.new(file: filename)
|
246
|
+
if color_key
|
247
|
+
# Set transparent color with given color (alpha = 0)
|
248
|
+
loaded.add_alpha(true,
|
249
|
+
Cairo::Color.parse(color_key).r * 255, # 0 - 255
|
250
|
+
Cairo::Color.parse(color_key).g * 255, # 0 - 255
|
251
|
+
Cairo::Color.parse(color_key).b * 255) # 0 - 255
|
252
|
+
else
|
253
|
+
# Not to transpare
|
254
|
+
loaded
|
255
|
+
end
|
256
|
+
end
|
257
|
+
end
|
258
|
+
end
|
259
|
+
|
260
|
+
module_function def load_image(filename, color_key: nil, sx: 1.0, sy: 1.0, cx: nil, cy: nil, cw: nil, ch: nil)
|
261
|
+
loaded = Nyle::INNER.module_eval{ _load_image(filename, color_key: color_key) }
|
262
|
+
if !(cx.nil? or cy.nil? or cw.nil? or ch.nil?)
|
263
|
+
loaded = loaded.subpixbuf(cx, cy, cw, ch)
|
264
|
+
end
|
265
|
+
loaded = loaded.scale(loaded.width * sx, loaded.height * sy)
|
266
|
+
end
|
267
|
+
|
268
|
+
module_function def load_image_tiles(filename, xcount, ycount, color_key: nil, sx: 1.0, sy: 1.0)
|
269
|
+
loaded = Nyle::INNER.module_eval{ _load_image(filename, color_key: color_key) }
|
270
|
+
xcount = 1 if xcount < 1
|
271
|
+
ycount = 1 if ycount < 1
|
272
|
+
cw = loaded.width / xcount
|
273
|
+
ch = loaded.height / ycount
|
274
|
+
tiles = []
|
275
|
+
for i in (0...xcount) do
|
276
|
+
line = []
|
277
|
+
for j in (0...ycount) do
|
278
|
+
line << loaded.subpixbuf(cw * i, ch * j, cw, ch).scale(cw * sx, ch * sy)
|
279
|
+
end
|
280
|
+
tiles << line
|
281
|
+
end
|
282
|
+
tiles
|
283
|
+
end
|
284
|
+
|
285
|
+
module_function def draw_image(x, y, pixbuf)
|
286
|
+
cr = Nyle.module_eval{ @__cr }
|
287
|
+
cr.save do
|
288
|
+
cr.set_source_pixbuf(pixbuf, x, y)
|
289
|
+
cr.paint
|
290
|
+
end
|
291
|
+
end
|
292
|
+
|
293
|
+
module_function def save_image(filename)
|
294
|
+
cr = Nyle.module_eval{ @__cr }
|
295
|
+
cr.target.write_to_png(filename)
|
296
|
+
end
|
297
|
+
|
298
|
+
module_function def translate(tx, ty)
|
299
|
+
cr = Nyle.module_eval{ @__cr }
|
300
|
+
cr.translate(tx, ty)
|
301
|
+
end
|
302
|
+
|
303
|
+
module_function def rotate(angle)
|
304
|
+
cr = Nyle.module_eval{ @__cr }
|
305
|
+
cr.rotate(angle)
|
306
|
+
end
|
307
|
+
|
308
|
+
module_function def scale(sx, sy)
|
309
|
+
cr = Nyle.module_eval{ @__cr }
|
310
|
+
cr.scale(sx, sy)
|
311
|
+
end
|
312
|
+
|
313
|
+
module_function def quit
|
314
|
+
Gtk.main_quit
|
315
|
+
end
|
316
|
+
|
317
|
+
end
|
318
|
+
|
319
|
+
|
320
|
+
|
321
|
+
if $0 == __FILE__
|
322
|
+
p Nyle
|
323
|
+
p Nyle.instance_methods
|
324
|
+
p Nyle.private_instance_methods
|
325
|
+
#p Nyle.private_methods
|
326
|
+
p Nyle.protected_methods
|
327
|
+
#p Nyle.public_methods
|
328
|
+
p Nyle.singleton_methods
|
329
|
+
|
330
|
+
p Nyle::Frame
|
331
|
+
p Nyle::Frame.instance_methods(false)
|
332
|
+
p Nyle::Frame.private_instance_methods(false)
|
333
|
+
p Nyle::Frame.singleton_methods(false)
|
334
|
+
|
335
|
+
p Nyle::Screen
|
336
|
+
p Nyle::Screen.instance_methods(false)
|
337
|
+
p Nyle::Screen.private_instance_methods(false)
|
338
|
+
p Nyle::Screen.singleton_methods(false)
|
339
|
+
|
340
|
+
p Nyle.os
|
341
|
+
end
|
342
|
+
|
343
|
+
|
344
|
+
# [TODO] Font name (draw_text)
|
345
|
+
|
data/nyle.gemspec
ADDED
@@ -0,0 +1,44 @@
|
|
1
|
+
|
2
|
+
lib = File.expand_path("../lib", __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require "nyle/version"
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "nyle"
|
8
|
+
spec.version = Nyle::VERSION
|
9
|
+
spec.authors = ["Koki Kitamura"]
|
10
|
+
spec.email = ["spool.kitamura@nifty.ne.jp"]
|
11
|
+
|
12
|
+
spec.summary = %q{minimal graphics framework using Ruby/GTK3 with Cairo}
|
13
|
+
spec.description = %q{'Nyle' is a minimal graphics framework using Ruby/GTK3 with Cairo}
|
14
|
+
spec.homepage = "https://github.com/spoolkitamura/nyle"
|
15
|
+
spec.license = "MIT"
|
16
|
+
|
17
|
+
## Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
|
18
|
+
## to allow pushing to a single host or delete this section to allow pushing to any host.
|
19
|
+
#if spec.respond_to?(:metadata)
|
20
|
+
# spec.metadata["allowed_push_host"] = "TODO: Set to 'http://mygemserver.com'"
|
21
|
+
#
|
22
|
+
# spec.metadata["homepage_uri"] = spec.homepage
|
23
|
+
# spec.metadata["source_code_uri"] = "TODO: Put your gem's public repo URL here."
|
24
|
+
# spec.metadata["changelog_uri"] = "TODO: Put your gem's CHANGELOG.md URL here."
|
25
|
+
#else
|
26
|
+
# raise "RubyGems 2.0 or newer is required to protect against " \
|
27
|
+
# "public gem pushes."
|
28
|
+
#end
|
29
|
+
|
30
|
+
# Specify which files should be added to the gem when it is released.
|
31
|
+
# The `git ls-files -z` loads the files in the RubyGem that have been added into git.
|
32
|
+
spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
|
33
|
+
`git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
34
|
+
end
|
35
|
+
spec.bindir = "exe"
|
36
|
+
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
37
|
+
spec.require_paths = ["lib"]
|
38
|
+
|
39
|
+
spec.add_development_dependency "bundler", "~> 1.17"
|
40
|
+
spec.add_development_dependency "rake", "~> 10.0"
|
41
|
+
|
42
|
+
spec.add_runtime_dependency "gtk3", "~> 3.3.0", ">= 3.3.0"
|
43
|
+
spec.add_runtime_dependency "rsvg2", "~> 3.3.0", ">= 3.3.0"
|
44
|
+
end
|