skia 0.1.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.
Potentially problematic release.
This version of skia might be problematic. Click here for more details.
- checksums.yaml +7 -0
- data/CHANGELOG.md +12 -0
- data/LICENSE +21 -0
- data/README.md +345 -0
- data/Rakefile +8 -0
- data/examples/avatar_generator.rb +74 -0
- data/examples/bar_chart.rb +89 -0
- data/examples/basic_drawing.rb +43 -0
- data/examples/gradient.rb +32 -0
- data/examples/pdf_output.rb +48 -0
- data/examples/picture_recording.rb +62 -0
- data/examples/progress_gauge.rb +103 -0
- data/examples/social_card.rb +121 -0
- data/examples/text_drawing.rb +40 -0
- data/lib/skia/base.rb +40 -0
- data/lib/skia/canvas.rb +177 -0
- data/lib/skia/color.rb +82 -0
- data/lib/skia/data.rb +47 -0
- data/lib/skia/document.rb +76 -0
- data/lib/skia/font.rb +74 -0
- data/lib/skia/image.rb +137 -0
- data/lib/skia/matrix.rb +163 -0
- data/lib/skia/native/callbacks.rb +6 -0
- data/lib/skia/native/functions.rb +223 -0
- data/lib/skia/native/types.rb +284 -0
- data/lib/skia/native.rb +50 -0
- data/lib/skia/paint.rb +100 -0
- data/lib/skia/path.rb +135 -0
- data/lib/skia/picture.rb +120 -0
- data/lib/skia/point.rb +94 -0
- data/lib/skia/rect.rb +179 -0
- data/lib/skia/shader.rb +107 -0
- data/lib/skia/surface.rb +151 -0
- data/lib/skia/typeface.rb +39 -0
- data/lib/skia/version.rb +5 -0
- data/lib/skia.rb +31 -0
- data/skia-ruby.gemspec +30 -0
- metadata +93 -0
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Skia
|
|
4
|
+
module Native
|
|
5
|
+
typedef :uint32, :sk_color_t
|
|
6
|
+
typedef :uint32, :sk_pmcolor_t
|
|
7
|
+
typedef :pointer, :sk_surface_t
|
|
8
|
+
typedef :pointer, :sk_canvas_t
|
|
9
|
+
typedef :pointer, :sk_paint_t
|
|
10
|
+
typedef :pointer, :sk_path_t
|
|
11
|
+
typedef :pointer, :sk_image_t
|
|
12
|
+
typedef :pointer, :sk_data_t
|
|
13
|
+
typedef :pointer, :sk_shader_t
|
|
14
|
+
typedef :pointer, :sk_typeface_t
|
|
15
|
+
typedef :pointer, :sk_font_t
|
|
16
|
+
typedef :pointer, :sk_mask_filter_t
|
|
17
|
+
typedef :pointer, :sk_color_filter_t
|
|
18
|
+
typedef :pointer, :sk_image_filter_t
|
|
19
|
+
typedef :pointer, :sk_path_effect_t
|
|
20
|
+
typedef :pointer, :sk_pixmap_t
|
|
21
|
+
typedef :pointer, :sk_document_t
|
|
22
|
+
typedef :pointer, :sk_picture_t
|
|
23
|
+
typedef :pointer, :sk_picture_recorder_t
|
|
24
|
+
typedef :pointer, :sk_drawable_t
|
|
25
|
+
|
|
26
|
+
enum :sk_colortype_t, [
|
|
27
|
+
:unknown, 0,
|
|
28
|
+
:alpha_8, 1,
|
|
29
|
+
:rgb_565, 2,
|
|
30
|
+
:argb_4444, 3,
|
|
31
|
+
:rgba_8888, 4,
|
|
32
|
+
:rgb_888x, 5,
|
|
33
|
+
:bgra_8888, 6,
|
|
34
|
+
:rgba_1010102, 7,
|
|
35
|
+
:rgb_101010x, 8,
|
|
36
|
+
:gray_8, 9,
|
|
37
|
+
:rgba_f16, 10,
|
|
38
|
+
:rgba_f32, 11
|
|
39
|
+
]
|
|
40
|
+
|
|
41
|
+
enum :sk_alphatype_t, [
|
|
42
|
+
:unknown, 0,
|
|
43
|
+
:opaque, 1,
|
|
44
|
+
:premul, 2,
|
|
45
|
+
:unpremul, 3
|
|
46
|
+
]
|
|
47
|
+
|
|
48
|
+
enum :sk_paint_style_t, [
|
|
49
|
+
:fill, 0,
|
|
50
|
+
:stroke, 1,
|
|
51
|
+
:stroke_and_fill, 2
|
|
52
|
+
]
|
|
53
|
+
|
|
54
|
+
enum :sk_stroke_cap_t, [
|
|
55
|
+
:butt, 0,
|
|
56
|
+
:round, 1,
|
|
57
|
+
:square, 2
|
|
58
|
+
]
|
|
59
|
+
|
|
60
|
+
enum :sk_stroke_join_t, [
|
|
61
|
+
:miter, 0,
|
|
62
|
+
:round, 1,
|
|
63
|
+
:bevel, 2
|
|
64
|
+
]
|
|
65
|
+
|
|
66
|
+
enum :sk_blend_mode_t, [
|
|
67
|
+
:clear, 0,
|
|
68
|
+
:src, 1,
|
|
69
|
+
:dst, 2,
|
|
70
|
+
:src_over, 3,
|
|
71
|
+
:dst_over, 4,
|
|
72
|
+
:src_in, 5,
|
|
73
|
+
:dst_in, 6,
|
|
74
|
+
:src_out, 7,
|
|
75
|
+
:dst_out, 8,
|
|
76
|
+
:src_atop, 9,
|
|
77
|
+
:dst_atop, 10,
|
|
78
|
+
:xor, 11,
|
|
79
|
+
:plus, 12,
|
|
80
|
+
:modulate, 13,
|
|
81
|
+
:screen, 14,
|
|
82
|
+
:overlay, 15,
|
|
83
|
+
:darken, 16,
|
|
84
|
+
:lighten, 17,
|
|
85
|
+
:color_dodge, 18,
|
|
86
|
+
:color_burn, 19,
|
|
87
|
+
:hard_light, 20,
|
|
88
|
+
:soft_light, 21,
|
|
89
|
+
:difference, 22,
|
|
90
|
+
:exclusion, 23,
|
|
91
|
+
:multiply, 24,
|
|
92
|
+
:hue, 25,
|
|
93
|
+
:saturation, 26,
|
|
94
|
+
:color, 27,
|
|
95
|
+
:luminosity, 28
|
|
96
|
+
]
|
|
97
|
+
|
|
98
|
+
enum :sk_path_filltype_t, [
|
|
99
|
+
:winding, 0,
|
|
100
|
+
:even_odd, 1,
|
|
101
|
+
:inverse_winding, 2,
|
|
102
|
+
:inverse_even_odd, 3
|
|
103
|
+
]
|
|
104
|
+
|
|
105
|
+
enum :sk_path_direction_t, [
|
|
106
|
+
:cw, 0,
|
|
107
|
+
:ccw, 1
|
|
108
|
+
]
|
|
109
|
+
|
|
110
|
+
enum :sk_clipop_t, [
|
|
111
|
+
:difference, 0,
|
|
112
|
+
:intersect, 1
|
|
113
|
+
]
|
|
114
|
+
|
|
115
|
+
enum :sk_encoded_image_format_t, [
|
|
116
|
+
:bmp, 0,
|
|
117
|
+
:gif, 1,
|
|
118
|
+
:ico, 2,
|
|
119
|
+
:jpeg, 3,
|
|
120
|
+
:png, 4,
|
|
121
|
+
:wbmp, 5,
|
|
122
|
+
:webp, 6,
|
|
123
|
+
:pkm, 7,
|
|
124
|
+
:ktx, 8,
|
|
125
|
+
:astc, 9,
|
|
126
|
+
:dng, 10,
|
|
127
|
+
:heif, 11
|
|
128
|
+
]
|
|
129
|
+
|
|
130
|
+
enum :sk_shader_tilemode_t, [
|
|
131
|
+
:clamp, 0,
|
|
132
|
+
:repeat, 1,
|
|
133
|
+
:mirror, 2,
|
|
134
|
+
:decal, 3
|
|
135
|
+
]
|
|
136
|
+
|
|
137
|
+
enum :sk_font_style_slant_t, [
|
|
138
|
+
:upright, 0,
|
|
139
|
+
:italic, 1,
|
|
140
|
+
:oblique, 2
|
|
141
|
+
]
|
|
142
|
+
|
|
143
|
+
enum :sk_text_encoding_t, [
|
|
144
|
+
:utf8, 0,
|
|
145
|
+
:utf16, 1,
|
|
146
|
+
:utf32, 2,
|
|
147
|
+
:glyph_id, 3
|
|
148
|
+
]
|
|
149
|
+
|
|
150
|
+
class SKPoint < FFI::Struct
|
|
151
|
+
layout :x, :float,
|
|
152
|
+
:y, :float
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
class SKIPoint < FFI::Struct
|
|
156
|
+
layout :x, :int32,
|
|
157
|
+
:y, :int32
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
class SKRect < FFI::Struct
|
|
161
|
+
layout :left, :float,
|
|
162
|
+
:top, :float,
|
|
163
|
+
:right, :float,
|
|
164
|
+
:bottom, :float
|
|
165
|
+
end
|
|
166
|
+
|
|
167
|
+
class SKIRect < FFI::Struct
|
|
168
|
+
layout :left, :int32,
|
|
169
|
+
:top, :int32,
|
|
170
|
+
:right, :int32,
|
|
171
|
+
:bottom, :int32
|
|
172
|
+
end
|
|
173
|
+
|
|
174
|
+
class SKSize < FFI::Struct
|
|
175
|
+
layout :width, :float,
|
|
176
|
+
:height, :float
|
|
177
|
+
end
|
|
178
|
+
|
|
179
|
+
class SKISize < FFI::Struct
|
|
180
|
+
layout :width, :int32,
|
|
181
|
+
:height, :int32
|
|
182
|
+
end
|
|
183
|
+
|
|
184
|
+
class SKMatrix < FFI::Struct
|
|
185
|
+
layout :scaleX, :float,
|
|
186
|
+
:skewX, :float,
|
|
187
|
+
:transX, :float,
|
|
188
|
+
:skewY, :float,
|
|
189
|
+
:scaleY, :float,
|
|
190
|
+
:transY, :float,
|
|
191
|
+
:persp0, :float,
|
|
192
|
+
:persp1, :float,
|
|
193
|
+
:persp2, :float
|
|
194
|
+
end
|
|
195
|
+
|
|
196
|
+
# 4x4 matrix (row major order)
|
|
197
|
+
class SKMatrix44 < FFI::Struct
|
|
198
|
+
layout :m00, :float, :m01, :float, :m02, :float, :m03, :float,
|
|
199
|
+
:m10, :float, :m11, :float, :m12, :float, :m13, :float,
|
|
200
|
+
:m20, :float, :m21, :float, :m22, :float, :m23, :float,
|
|
201
|
+
:m30, :float, :m31, :float, :m32, :float, :m33, :float
|
|
202
|
+
end
|
|
203
|
+
|
|
204
|
+
class SKImageInfo < FFI::Struct
|
|
205
|
+
layout :colorspace, :pointer,
|
|
206
|
+
:width, :int32,
|
|
207
|
+
:height, :int32,
|
|
208
|
+
:colorType, :sk_colortype_t,
|
|
209
|
+
:alphaType, :sk_alphatype_t
|
|
210
|
+
end
|
|
211
|
+
|
|
212
|
+
class SKFontMetrics < FFI::Struct
|
|
213
|
+
layout :flags, :uint32,
|
|
214
|
+
:top, :float,
|
|
215
|
+
:ascent, :float,
|
|
216
|
+
:descent, :float,
|
|
217
|
+
:bottom, :float,
|
|
218
|
+
:leading, :float,
|
|
219
|
+
:avgCharWidth, :float,
|
|
220
|
+
:maxCharWidth, :float,
|
|
221
|
+
:xMin, :float,
|
|
222
|
+
:xMax, :float,
|
|
223
|
+
:xHeight, :float,
|
|
224
|
+
:capHeight, :float,
|
|
225
|
+
:underlineThickness, :float,
|
|
226
|
+
:underlinePosition, :float,
|
|
227
|
+
:strikeoutThickness, :float,
|
|
228
|
+
:strikeoutPosition, :float
|
|
229
|
+
end
|
|
230
|
+
|
|
231
|
+
# PNG Encoder
|
|
232
|
+
enum :sk_pngencoder_filterflags_t, [
|
|
233
|
+
:zero, 0x00,
|
|
234
|
+
:none, 0x08,
|
|
235
|
+
:sub, 0x10,
|
|
236
|
+
:up, 0x20,
|
|
237
|
+
:avg, 0x40,
|
|
238
|
+
:paeth, 0x80,
|
|
239
|
+
:all, 0xF8
|
|
240
|
+
]
|
|
241
|
+
|
|
242
|
+
class SKPngEncoderOptions < FFI::Struct
|
|
243
|
+
layout :fFilterFlags, :sk_pngencoder_filterflags_t,
|
|
244
|
+
:fZLibLevel, :int,
|
|
245
|
+
:fComments, :pointer,
|
|
246
|
+
:fICCProfile, :pointer,
|
|
247
|
+
:fICCProfileDescription, :pointer
|
|
248
|
+
end
|
|
249
|
+
|
|
250
|
+
# JPEG Encoder
|
|
251
|
+
enum :sk_jpegencoder_downsample_t, [
|
|
252
|
+
:downsample_420, 0,
|
|
253
|
+
:downsample_422, 1,
|
|
254
|
+
:downsample_444, 2
|
|
255
|
+
]
|
|
256
|
+
|
|
257
|
+
enum :sk_jpegencoder_alphaoption_t, [
|
|
258
|
+
:ignore, 0,
|
|
259
|
+
:blend_on_black, 1
|
|
260
|
+
]
|
|
261
|
+
|
|
262
|
+
class SKJpegEncoderOptions < FFI::Struct
|
|
263
|
+
layout :fQuality, :int,
|
|
264
|
+
:fDownsample, :sk_jpegencoder_downsample_t,
|
|
265
|
+
:fAlphaOption, :sk_jpegencoder_alphaoption_t,
|
|
266
|
+
:xmpMetadata, :pointer,
|
|
267
|
+
:fICCProfile, :pointer,
|
|
268
|
+
:fICCProfileDescription, :pointer
|
|
269
|
+
end
|
|
270
|
+
|
|
271
|
+
# WebP Encoder
|
|
272
|
+
enum :sk_webpencoder_compression_t, [
|
|
273
|
+
:lossy, 0,
|
|
274
|
+
:lossless, 1
|
|
275
|
+
]
|
|
276
|
+
|
|
277
|
+
class SKWebpEncoderOptions < FFI::Struct
|
|
278
|
+
layout :fCompression, :sk_webpencoder_compression_t,
|
|
279
|
+
:fQuality, :float,
|
|
280
|
+
:fICCProfile, :pointer,
|
|
281
|
+
:fICCProfileDescription, :pointer
|
|
282
|
+
end
|
|
283
|
+
end
|
|
284
|
+
end
|
data/lib/skia/native.rb
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Skia
|
|
4
|
+
module Native
|
|
5
|
+
extend FFI::Library
|
|
6
|
+
|
|
7
|
+
class << self
|
|
8
|
+
def find_library
|
|
9
|
+
lib_name, fallbacks = case RUBY_PLATFORM
|
|
10
|
+
when /darwin/
|
|
11
|
+
['libSkiaSharp.dylib', ['libskia.dylib']]
|
|
12
|
+
when /linux/
|
|
13
|
+
['libSkiaSharp.so', ['libskia.so']]
|
|
14
|
+
when /mingw|mswin/
|
|
15
|
+
['libSkiaSharp.dll', ['skia.dll']]
|
|
16
|
+
else
|
|
17
|
+
raise "Unsupported platform: #{RUBY_PLATFORM}"
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
gem_root = File.expand_path('../..', __dir__)
|
|
21
|
+
search_paths = [
|
|
22
|
+
File.join(gem_root, lib_name),
|
|
23
|
+
File.join(Dir.pwd, lib_name),
|
|
24
|
+
ENV['SKIA_LIBRARY_PATH'],
|
|
25
|
+
lib_name
|
|
26
|
+
].compact
|
|
27
|
+
|
|
28
|
+
found = search_paths.find { |p| File.exist?(p) }
|
|
29
|
+
return found if found
|
|
30
|
+
|
|
31
|
+
[lib_name] + fallbacks
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
ffi_lib_flags :now, :global
|
|
36
|
+
|
|
37
|
+
begin
|
|
38
|
+
lib_path = find_library
|
|
39
|
+
ffi_lib Array(lib_path).first
|
|
40
|
+
rescue LoadError => e
|
|
41
|
+
warn 'Failed to load Skia library. Please ensure libSkiaSharp is installed.'
|
|
42
|
+
warn 'Download from: https://www.nuget.org/packages/SkiaSharp.NativeAssets.macOS'
|
|
43
|
+
raise e
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
require_relative 'native/types'
|
|
47
|
+
require_relative 'native/functions'
|
|
48
|
+
require_relative 'native/callbacks'
|
|
49
|
+
end
|
|
50
|
+
end
|
data/lib/skia/paint.rb
ADDED
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Skia
|
|
4
|
+
class Paint < Base
|
|
5
|
+
def initialize(ptr = nil)
|
|
6
|
+
super(ptr || Native.sk_paint_new, :sk_paint_delete)
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def antialias?
|
|
10
|
+
Native.sk_paint_is_antialias(@ptr)
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def antialias=(value)
|
|
14
|
+
Native.sk_paint_set_antialias(@ptr, value)
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def color
|
|
18
|
+
Color.new(Native.sk_paint_get_color(@ptr))
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def color=(value)
|
|
22
|
+
color_value = value.is_a?(Color) ? value.to_i : value
|
|
23
|
+
Native.sk_paint_set_color(@ptr, color_value)
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def style
|
|
27
|
+
Native.sk_paint_get_style(@ptr)
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def style=(value)
|
|
31
|
+
Native.sk_paint_set_style(@ptr, value)
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def stroke_width
|
|
35
|
+
Native.sk_paint_get_stroke_width(@ptr)
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def stroke_width=(value)
|
|
39
|
+
Native.sk_paint_set_stroke_width(@ptr, value.to_f)
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def stroke_cap
|
|
43
|
+
Native.sk_paint_get_stroke_cap(@ptr)
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def stroke_cap=(value)
|
|
47
|
+
Native.sk_paint_set_stroke_cap(@ptr, value)
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def stroke_join
|
|
51
|
+
Native.sk_paint_get_stroke_join(@ptr)
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def stroke_join=(value)
|
|
55
|
+
Native.sk_paint_set_stroke_join(@ptr, value)
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def stroke_miter
|
|
59
|
+
Native.sk_paint_get_stroke_miter(@ptr)
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def stroke_miter=(value)
|
|
63
|
+
Native.sk_paint_set_stroke_miter(@ptr, value.to_f)
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def blend_mode
|
|
67
|
+
Native.sk_paint_get_blendmode(@ptr)
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def blend_mode=(value)
|
|
71
|
+
Native.sk_paint_set_blendmode(@ptr, value)
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
def shader
|
|
75
|
+
ptr = Native.sk_paint_get_shader(@ptr)
|
|
76
|
+
return nil if ptr.nil? || ptr.null?
|
|
77
|
+
|
|
78
|
+
Shader.wrap(ptr)
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
def shader=(value)
|
|
82
|
+
Native.sk_paint_set_shader(@ptr, value&.ptr)
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
def clone
|
|
86
|
+
self.class.new(Native.sk_paint_clone(@ptr))
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
def reset
|
|
90
|
+
Native.sk_paint_reset(@ptr)
|
|
91
|
+
self
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
def with(**options)
|
|
95
|
+
cloned = clone
|
|
96
|
+
options.each { |k, v| cloned.send(:"#{k}=", v) }
|
|
97
|
+
cloned
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
end
|
data/lib/skia/path.rb
ADDED
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Skia
|
|
4
|
+
class Path < Base
|
|
5
|
+
def initialize(ptr = nil)
|
|
6
|
+
super(ptr || Native.sk_path_new, :sk_path_delete)
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def self.build(&block)
|
|
10
|
+
path = new
|
|
11
|
+
path.instance_eval(&block) if block
|
|
12
|
+
path
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def move_to(x, y)
|
|
16
|
+
Native.sk_path_move_to(@ptr, x.to_f, y.to_f)
|
|
17
|
+
self
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def line_to(x, y)
|
|
21
|
+
Native.sk_path_line_to(@ptr, x.to_f, y.to_f)
|
|
22
|
+
self
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def quad_to(x1, y1, x2, y2)
|
|
26
|
+
Native.sk_path_quad_to(@ptr, x1.to_f, y1.to_f, x2.to_f, y2.to_f)
|
|
27
|
+
self
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def conic_to(x1, y1, x2, y2, weight)
|
|
31
|
+
Native.sk_path_conic_to(@ptr, x1.to_f, y1.to_f, x2.to_f, y2.to_f, weight.to_f)
|
|
32
|
+
self
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def cubic_to(x1, y1, x2, y2, x3, y3)
|
|
36
|
+
Native.sk_path_cubic_to(@ptr, x1.to_f, y1.to_f, x2.to_f, y2.to_f, x3.to_f, y3.to_f)
|
|
37
|
+
self
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def arc_to(rx, ry, x_axis_rotate, x, y)
|
|
41
|
+
Native.sk_path_arc_to(@ptr, rx.to_f, ry.to_f, x_axis_rotate.to_f, x.to_f, y.to_f)
|
|
42
|
+
self
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def arc_to_with_oval(oval, start_angle, sweep_angle, force_move_to = false)
|
|
46
|
+
rect_struct = oval.to_struct
|
|
47
|
+
Native.sk_path_arc_to_with_oval(@ptr, rect_struct, start_angle.to_f, sweep_angle.to_f, force_move_to)
|
|
48
|
+
self
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def close
|
|
52
|
+
Native.sk_path_close(@ptr)
|
|
53
|
+
self
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def add_rect(rect, direction = :cw)
|
|
57
|
+
rect_struct = rect.to_struct
|
|
58
|
+
Native.sk_path_add_rect(@ptr, rect_struct, direction)
|
|
59
|
+
self
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def add_oval(rect, direction = :cw)
|
|
63
|
+
rect_struct = rect.to_struct
|
|
64
|
+
Native.sk_path_add_oval(@ptr, rect_struct, direction)
|
|
65
|
+
self
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def add_circle(cx, cy, radius, direction = :cw)
|
|
69
|
+
Native.sk_path_add_circle(@ptr, cx.to_f, cy.to_f, radius.to_f, direction)
|
|
70
|
+
self
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
def add_arc(rect, start_angle, sweep_angle)
|
|
74
|
+
rect_struct = rect.to_struct
|
|
75
|
+
Native.sk_path_add_arc(@ptr, rect_struct, start_angle.to_f, sweep_angle.to_f)
|
|
76
|
+
self
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
def add_path(other, extend_path: false)
|
|
80
|
+
mode = extend_path ? 1 : 0
|
|
81
|
+
Native.sk_path_add_path(@ptr, other.ptr, mode, 0)
|
|
82
|
+
self
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
def add_path_offset(other, dx, dy, extend_path: false)
|
|
86
|
+
mode = extend_path ? 1 : 0
|
|
87
|
+
Native.sk_path_add_path_offset(@ptr, other.ptr, dx.to_f, dy.to_f, mode)
|
|
88
|
+
self
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
def add_path_matrix(other, matrix, extend_path: false)
|
|
92
|
+
mode = extend_path ? 1 : 0
|
|
93
|
+
matrix_struct = matrix.to_struct
|
|
94
|
+
Native.sk_path_add_path_matrix(@ptr, other.ptr, matrix_struct, mode)
|
|
95
|
+
self
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
def fill_type
|
|
99
|
+
Native.sk_path_get_filltype(@ptr)
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
def fill_type=(value)
|
|
103
|
+
Native.sk_path_set_filltype(@ptr, value)
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
def bounds
|
|
107
|
+
rect_struct = Native::SKRect.new
|
|
108
|
+
Native.sk_path_get_bounds(@ptr, rect_struct)
|
|
109
|
+
Rect.from_struct(rect_struct)
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
def empty?
|
|
113
|
+
Native.sk_path_count_verbs(@ptr) == 0
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
def contains?(x, y)
|
|
117
|
+
Native.sk_path_contains(@ptr, x.to_f, y.to_f)
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
def transform(matrix)
|
|
121
|
+
matrix_struct = matrix.to_struct
|
|
122
|
+
Native.sk_path_transform(@ptr, matrix_struct)
|
|
123
|
+
self
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
def clone
|
|
127
|
+
self.class.new(Native.sk_path_clone(@ptr))
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
def reset
|
|
131
|
+
Native.sk_path_reset(@ptr)
|
|
132
|
+
self
|
|
133
|
+
end
|
|
134
|
+
end
|
|
135
|
+
end
|
data/lib/skia/picture.rb
ADDED
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Skia
|
|
4
|
+
class Picture < Base
|
|
5
|
+
def initialize(ptr)
|
|
6
|
+
super(ptr, :sk_picture_unref)
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def self.from_data(data)
|
|
10
|
+
data_obj = data.is_a?(Data) ? data : Data.new(data)
|
|
11
|
+
ptr = Native.sk_picture_deserialize_from_data(data_obj.ptr)
|
|
12
|
+
raise Error, "Failed to deserialize picture" if ptr.nil? || ptr.null?
|
|
13
|
+
|
|
14
|
+
new(ptr)
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def self.record(bounds, &block)
|
|
18
|
+
recorder = PictureRecorder.new
|
|
19
|
+
recorder.begin_recording(bounds, &block)
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def unique_id
|
|
23
|
+
Native.sk_picture_get_unique_id(@ptr)
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def cull_rect
|
|
27
|
+
rect_struct = Native::SKRect.new
|
|
28
|
+
Native.sk_picture_get_cull_rect(@ptr, rect_struct)
|
|
29
|
+
Rect.from_struct(rect_struct)
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def playback(canvas)
|
|
33
|
+
Native.sk_picture_playback(@ptr, canvas.ptr)
|
|
34
|
+
self
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def serialize
|
|
38
|
+
data_ptr = Native.sk_picture_serialize_to_data(@ptr)
|
|
39
|
+
raise Error, "Failed to serialize picture" if data_ptr.nil? || data_ptr.null?
|
|
40
|
+
|
|
41
|
+
Data.new(data_ptr)
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def approximate_op_count(nested: true)
|
|
45
|
+
Native.sk_picture_approximate_op_count(@ptr, nested)
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def approximate_bytes_used
|
|
49
|
+
Native.sk_picture_approximate_bytes_used(@ptr)
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def save(path)
|
|
53
|
+
data = serialize
|
|
54
|
+
File.binwrite(path, data.to_s)
|
|
55
|
+
self
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def self.load(path)
|
|
59
|
+
data = Data.from_file(path)
|
|
60
|
+
from_data(data)
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
class PictureRecorder
|
|
65
|
+
def initialize
|
|
66
|
+
@ptr = Native.sk_picture_recorder_new
|
|
67
|
+
raise Error, "Failed to create picture recorder" if @ptr.nil? || @ptr.null?
|
|
68
|
+
|
|
69
|
+
@recording = false
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def ptr
|
|
73
|
+
@ptr
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
def begin_recording(bounds)
|
|
77
|
+
bounds_struct = bounds.to_struct
|
|
78
|
+
canvas_ptr = Native.sk_picture_recorder_begin_recording(@ptr, bounds_struct)
|
|
79
|
+
raise Error, "Failed to begin recording" if canvas_ptr.nil? || canvas_ptr.null?
|
|
80
|
+
|
|
81
|
+
@recording = true
|
|
82
|
+
canvas = Canvas.new(canvas_ptr)
|
|
83
|
+
|
|
84
|
+
if block_given?
|
|
85
|
+
yield canvas
|
|
86
|
+
end_recording
|
|
87
|
+
else
|
|
88
|
+
canvas
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
def recording_canvas
|
|
93
|
+
return nil unless @recording
|
|
94
|
+
|
|
95
|
+
canvas_ptr = Native.sk_picture_get_recording_canvas(@ptr)
|
|
96
|
+
return nil if canvas_ptr.nil? || canvas_ptr.null?
|
|
97
|
+
|
|
98
|
+
Canvas.new(canvas_ptr)
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
def end_recording
|
|
102
|
+
return nil unless @recording
|
|
103
|
+
|
|
104
|
+
ptr = Native.sk_picture_recorder_end_recording(@ptr)
|
|
105
|
+
@recording = false
|
|
106
|
+
raise Error, "Failed to end recording" if ptr.nil? || ptr.null?
|
|
107
|
+
|
|
108
|
+
Picture.new(ptr)
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
def recording?
|
|
112
|
+
@recording
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
def delete
|
|
116
|
+
Native.sk_picture_recorder_delete(@ptr) if @ptr
|
|
117
|
+
@ptr = nil
|
|
118
|
+
end
|
|
119
|
+
end
|
|
120
|
+
end
|