img_to_script 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.rubocop.yml +25 -0
- data/.vscode/launch.json +21 -0
- data/CHANGELOG.md +7 -0
- data/LICENSE.txt +21 -0
- data/README.md +271 -0
- data/Rakefile +16 -0
- data/img_to_script.gemspec +41 -0
- data/lib/img_to_script/abs_token_type.rb +33 -0
- data/lib/img_to_script/abstract_token/abs_func.rb +19 -0
- data/lib/img_to_script/abstract_token/abstract_token.rb +23 -0
- data/lib/img_to_script/abstract_token/assign_value.rb +20 -0
- data/lib/img_to_script/abstract_token/clear_screen.rb +16 -0
- data/lib/img_to_script/abstract_token/data_read.rb +19 -0
- data/lib/img_to_script/abstract_token/data_store.rb +19 -0
- data/lib/img_to_script/abstract_token/draw_chunk_by_hex_value.rb +19 -0
- data/lib/img_to_script/abstract_token/draw_line_by_abs_coords.rb +22 -0
- data/lib/img_to_script/abstract_token/draw_pixel_by_abs_coords.rb +20 -0
- data/lib/img_to_script/abstract_token/go_to.rb +19 -0
- data/lib/img_to_script/abstract_token/if_condition.rb +20 -0
- data/lib/img_to_script/abstract_token/loop_begin.rb +21 -0
- data/lib/img_to_script/abstract_token/loop_end.rb +19 -0
- data/lib/img_to_script/abstract_token/math_add.rb +20 -0
- data/lib/img_to_script/abstract_token/math_greater_than.rb +20 -0
- data/lib/img_to_script/abstract_token/math_mult.rb +20 -0
- data/lib/img_to_script/abstract_token/math_sub.rb +20 -0
- data/lib/img_to_script/abstract_token/move_point_to_abs_coords.rb +20 -0
- data/lib/img_to_script/abstract_token/parentheses.rb +19 -0
- data/lib/img_to_script/abstract_token/program_begin.rb +16 -0
- data/lib/img_to_script/abstract_token/program_end.rb +16 -0
- data/lib/img_to_script/abstract_token/remark.rb +19 -0
- data/lib/img_to_script/abstract_token/sign_func.rb +19 -0
- data/lib/img_to_script/abstract_token/wait.rb +19 -0
- data/lib/img_to_script/abstract_token.rb +8 -0
- data/lib/img_to_script/container.rb +26 -0
- data/lib/img_to_script/current_line_placeholder.rb +40 -0
- data/lib/img_to_script/formatter.rb +34 -0
- data/lib/img_to_script/generators/generator.rb +134 -0
- data/lib/img_to_script/generators/hex_mask/default.rb +24 -0
- data/lib/img_to_script/generators/hex_mask/enhanced.rb +220 -0
- data/lib/img_to_script/generators/hex_mask/hex_mask.rb +100 -0
- data/lib/img_to_script/generators/hex_mask.rb +13 -0
- data/lib/img_to_script/generators/run_length_encoding/horizontal.rb +78 -0
- data/lib/img_to_script/generators/run_length_encoding/run_length_encoding.rb +304 -0
- data/lib/img_to_script/generators/run_length_encoding/vertical.rb +79 -0
- data/lib/img_to_script/generators/run_length_encoding.rb +10 -0
- data/lib/img_to_script/generators/segmental/data_read_draw/data_read_draw.rb +70 -0
- data/lib/img_to_script/generators/segmental/data_read_draw/horizontal.rb +54 -0
- data/lib/img_to_script/generators/segmental/data_read_draw/vertical.rb +54 -0
- data/lib/img_to_script/generators/segmental/data_read_draw.rb +18 -0
- data/lib/img_to_script/generators/segmental/direct_draw/direct_draw.rb +62 -0
- data/lib/img_to_script/generators/segmental/direct_draw/horizontal.rb +16 -0
- data/lib/img_to_script/generators/segmental/direct_draw/vertical.rb +16 -0
- data/lib/img_to_script/generators/segmental/direct_draw.rb +12 -0
- data/lib/img_to_script/generators/segmental/horizontal_mixin.rb +32 -0
- data/lib/img_to_script/generators/segmental/segmental.rb +101 -0
- data/lib/img_to_script/generators/segmental/vertical_mixin.rb +38 -0
- data/lib/img_to_script/generators/segmental.rb +10 -0
- data/lib/img_to_script/generators.rb +27 -0
- data/lib/img_to_script/import.rb +5 -0
- data/lib/img_to_script/language_token.rb +8 -0
- data/lib/img_to_script/languages/mk90_basic/formatters/formatter.rb +49 -0
- data/lib/img_to_script/languages/mk90_basic/formatters/minificator.rb +316 -0
- data/lib/img_to_script/languages/mk90_basic/formatters/sliceable_tokens_mixin.rb +15 -0
- data/lib/img_to_script/languages/mk90_basic/formatters.rb +13 -0
- data/lib/img_to_script/languages/mk90_basic/mk90_basic_token.rb +59 -0
- data/lib/img_to_script/languages/mk90_basic/translators/mixin.rb +205 -0
- data/lib/img_to_script/languages/mk90_basic/translators/mk90_basic_10.rb +27 -0
- data/lib/img_to_script/languages/mk90_basic/translators/mk90_basic_20.rb +27 -0
- data/lib/img_to_script/languages/mk90_basic/translators/translator.rb +205 -0
- data/lib/img_to_script/languages/mk90_basic/translators.rb +13 -0
- data/lib/img_to_script/languages/mk90_basic.rb +17 -0
- data/lib/img_to_script/languages.rb +10 -0
- data/lib/img_to_script/task.rb +26 -0
- data/lib/img_to_script/translator.rb +31 -0
- data/lib/img_to_script/version.rb +5 -0
- data/lib/img_to_script.rb +19 -0
- data/sig/img_to_script.rbs +4 -0
- metadata +204 -0
@@ -0,0 +1,79 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ImgToScript
|
4
|
+
module Generators
|
5
|
+
module RunLengthEncoding
|
6
|
+
#
|
7
|
+
# RLE - vertical scanlines.
|
8
|
+
#
|
9
|
+
class Vertical < RunLengthEncoding
|
10
|
+
private
|
11
|
+
|
12
|
+
def _generate
|
13
|
+
_transpose
|
14
|
+
@pixels = @image.get_pixels(0, 0, @image.width, @image.height)
|
15
|
+
_encode_pixels
|
16
|
+
_append_decoder
|
17
|
+
end
|
18
|
+
|
19
|
+
def _append_decoder
|
20
|
+
@image_size = @image.width + @y_offset
|
21
|
+
@segment_size = @image_size - 1
|
22
|
+
|
23
|
+
@major_axis_symbol = Y_LBL
|
24
|
+
@minor_axis_symbol = X_LBL
|
25
|
+
|
26
|
+
@major_axis_value = @y_offset
|
27
|
+
|
28
|
+
@part_line_pattern = _part_line_pattern
|
29
|
+
@full_line_pattern = _full_line_pattern
|
30
|
+
|
31
|
+
super
|
32
|
+
end
|
33
|
+
|
34
|
+
#
|
35
|
+
# Part-length line, i.e. a line that fills only
|
36
|
+
# a part of the scan line.
|
37
|
+
#
|
38
|
+
# Formatted for the vertical scan lines.
|
39
|
+
#
|
40
|
+
def _part_line_pattern
|
41
|
+
AbstractToken::DrawLineByAbsCoords.new(
|
42
|
+
x0: X_LBL,
|
43
|
+
y0: Y_LBL,
|
44
|
+
x1: X_LBL,
|
45
|
+
y1: _y1_expression
|
46
|
+
)
|
47
|
+
end
|
48
|
+
|
49
|
+
#
|
50
|
+
# Expression to evaluate y1 point.
|
51
|
+
#
|
52
|
+
def _y1_expression
|
53
|
+
AbstractToken::MathSub.new(
|
54
|
+
left: AbstractToken::MathAdd.new(
|
55
|
+
left: Y_LBL,
|
56
|
+
right: READ_VAR
|
57
|
+
),
|
58
|
+
right: "1"
|
59
|
+
)
|
60
|
+
end
|
61
|
+
|
62
|
+
#
|
63
|
+
# Full-length line pattern, i.e. a line that fills
|
64
|
+
# the whole scan line.
|
65
|
+
#
|
66
|
+
# Formatted for the vertical scan lines.
|
67
|
+
#
|
68
|
+
def _full_line_pattern
|
69
|
+
AbstractToken::DrawLineByAbsCoords.new(
|
70
|
+
x0: X_LBL,
|
71
|
+
y0: Y_LBL,
|
72
|
+
x1: X_LBL,
|
73
|
+
y1: @segment_size
|
74
|
+
)
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ImgToScript
|
4
|
+
module Generators
|
5
|
+
module Segmental
|
6
|
+
module DataReadDraw
|
7
|
+
#
|
8
|
+
# Base class for the 'DATA..READ' draw method.
|
9
|
+
#
|
10
|
+
# The segment's coordinates are stored via the DATA statement. Three
|
11
|
+
# coordinates are stored: two coordinates of the 'major' axis, and oneI
|
12
|
+
# coordinate of the 'minor' axis.
|
13
|
+
#
|
14
|
+
# The FOR..NEXT loop is defined after the DATA statements. It loops
|
15
|
+
# through the array of coordinates, reads three values in a row, and
|
16
|
+
# passes the values to the statement that draws a line.
|
17
|
+
#
|
18
|
+
class DataReadDraw < Segmental
|
19
|
+
private
|
20
|
+
|
21
|
+
def _generate
|
22
|
+
@data = []
|
23
|
+
|
24
|
+
super
|
25
|
+
end
|
26
|
+
|
27
|
+
#
|
28
|
+
# Append a loop to read values from DATA and pass them to the DRAWD
|
29
|
+
# statement that draws a line.
|
30
|
+
#
|
31
|
+
def _append_decoder
|
32
|
+
_append_data
|
33
|
+
_loop_begin
|
34
|
+
_read
|
35
|
+
_draw_line
|
36
|
+
_loop_end
|
37
|
+
end
|
38
|
+
|
39
|
+
def _append_data
|
40
|
+
@tokens.append(
|
41
|
+
AbstractToken::DataStore.new(
|
42
|
+
data: @data,
|
43
|
+
require_nl: true
|
44
|
+
)
|
45
|
+
)
|
46
|
+
end
|
47
|
+
|
48
|
+
def _loop_begin
|
49
|
+
@tokens.append(
|
50
|
+
AbstractToken::LoopBegin.new(
|
51
|
+
start_value: 1,
|
52
|
+
end_value: @n_black_segments,
|
53
|
+
var_name: LOOP_VAR,
|
54
|
+
require_nl: true
|
55
|
+
)
|
56
|
+
)
|
57
|
+
end
|
58
|
+
|
59
|
+
def _loop_end
|
60
|
+
@tokens.append(
|
61
|
+
AbstractToken::LoopEnd.new(
|
62
|
+
var_name: LOOP_VAR
|
63
|
+
)
|
64
|
+
)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ImgToScript
|
4
|
+
module Generators
|
5
|
+
module Segmental
|
6
|
+
module DataReadDraw
|
7
|
+
#
|
8
|
+
# DATA...READ (with horizontal scan lines).
|
9
|
+
#
|
10
|
+
class Horizontal < DataReadDraw
|
11
|
+
include HorizontalMixin
|
12
|
+
|
13
|
+
private
|
14
|
+
|
15
|
+
def _generate
|
16
|
+
@data = []
|
17
|
+
|
18
|
+
super
|
19
|
+
end
|
20
|
+
|
21
|
+
def _read
|
22
|
+
@tokens.append(
|
23
|
+
AbstractToken::DataRead.new(
|
24
|
+
var_list: READ_PATTERN_HORIZ
|
25
|
+
)
|
26
|
+
)
|
27
|
+
end
|
28
|
+
|
29
|
+
def _draw_line
|
30
|
+
@tokens.append(
|
31
|
+
AbstractToken::DrawLineByAbsCoords.new(
|
32
|
+
x0: X0_LBL,
|
33
|
+
y0: Y_LBL,
|
34
|
+
x1: X1_LBL,
|
35
|
+
y1: Y_LBL
|
36
|
+
)
|
37
|
+
)
|
38
|
+
end
|
39
|
+
|
40
|
+
#
|
41
|
+
# Convert a chunk of black pixel(s) to three coordinates: x0, x1, y.
|
42
|
+
#
|
43
|
+
# @param [Integer] count
|
44
|
+
# Run-length of the pixel block.
|
45
|
+
#
|
46
|
+
def _encode_chunk(count)
|
47
|
+
coordinates = _segment_coordinates(count)
|
48
|
+
@data.push(coordinates[:x0], coordinates[:x1], coordinates[:y0])
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ImgToScript
|
4
|
+
module Generators
|
5
|
+
module Segmental
|
6
|
+
module DataReadDraw
|
7
|
+
#
|
8
|
+
# DATA...READ (with vertical scan lines).
|
9
|
+
#
|
10
|
+
class Vertical < DataReadDraw
|
11
|
+
include VerticalMixin
|
12
|
+
|
13
|
+
private
|
14
|
+
|
15
|
+
def _generate
|
16
|
+
@data = []
|
17
|
+
|
18
|
+
super
|
19
|
+
end
|
20
|
+
|
21
|
+
def _read
|
22
|
+
@tokens.append(
|
23
|
+
AbstractToken::DataRead.new(
|
24
|
+
var_list: READ_PATTERN_VERT
|
25
|
+
)
|
26
|
+
)
|
27
|
+
end
|
28
|
+
|
29
|
+
def _draw_line
|
30
|
+
@tokens.append(
|
31
|
+
AbstractToken::DrawLineByAbsCoords.new(
|
32
|
+
x0: X_LBL,
|
33
|
+
y0: Y0_LBL,
|
34
|
+
x1: X_LBL,
|
35
|
+
y1: Y1_LBL
|
36
|
+
)
|
37
|
+
)
|
38
|
+
end
|
39
|
+
|
40
|
+
#
|
41
|
+
# Convert a chunk of black pixel(s) to three coordinates: y0, y1, x.
|
42
|
+
#
|
43
|
+
# @param [Integer] count
|
44
|
+
# Run-length of the pixel block.
|
45
|
+
#
|
46
|
+
def _encode_chunk(count)
|
47
|
+
coordinates = _segment_coordinates(count)
|
48
|
+
@data.push(coordinates[:y0], coordinates[:y1], coordinates[:x0])
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ImgToScript
|
4
|
+
module Generators
|
5
|
+
module Segmental
|
6
|
+
module DataReadDraw
|
7
|
+
X0_LBL = :a
|
8
|
+
X1_LBL = :b
|
9
|
+
|
10
|
+
Y0_LBL = :c
|
11
|
+
Y1_LBL = :d
|
12
|
+
|
13
|
+
READ_PATTERN_HORIZ = [X0_LBL, X1_LBL, Y_LBL].freeze
|
14
|
+
READ_PATTERN_VERT = [Y0_LBL, Y1_LBL, X_LBL].freeze
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ImgToScript
|
4
|
+
module Generators
|
5
|
+
module Segmental
|
6
|
+
module DirectDraw
|
7
|
+
#
|
8
|
+
# Base class for the 'direct' draw method. Segments are being drawed by
|
9
|
+
# calling the 'draw a pixel' and the 'draw a line' statements, and the
|
10
|
+
# coordinates of the segments are *directly* hard-coded as the statement's
|
11
|
+
# arguments. Hence the name.
|
12
|
+
#
|
13
|
+
class DirectDraw < Segmental
|
14
|
+
private
|
15
|
+
|
16
|
+
#
|
17
|
+
# Convert a chunk of black pixel(s) to a respective BASIC statement:
|
18
|
+
#
|
19
|
+
# - for a sequence of black pixels: append 'draw a line' statement;
|
20
|
+
# - for a single black pixel: append 'draw a dot' statement.
|
21
|
+
#
|
22
|
+
# @param [Integer] count
|
23
|
+
# Run-length of the pixel block.
|
24
|
+
#
|
25
|
+
def _encode_chunk(count)
|
26
|
+
if count > 1
|
27
|
+
_append_line(_segment_coordinates(count))
|
28
|
+
else
|
29
|
+
_append_dot(_segment_coordinates(count))
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
#
|
34
|
+
# Draw a dot by a pair of coordinates (x, y).
|
35
|
+
#
|
36
|
+
def _append_dot(coordinates)
|
37
|
+
@tokens.append(
|
38
|
+
AbstractToken::DrawPixelByAbsCoords.new(
|
39
|
+
x: coordinates[:x0],
|
40
|
+
y: coordinates[:y0]
|
41
|
+
)
|
42
|
+
)
|
43
|
+
end
|
44
|
+
|
45
|
+
#
|
46
|
+
# Draw a line by a pairs of coordinates (x0, y0), (x1, y1).
|
47
|
+
#
|
48
|
+
def _append_line(coordinates)
|
49
|
+
@tokens.append(
|
50
|
+
AbstractToken::DrawLineByAbsCoords.new(
|
51
|
+
x0: coordinates[:x0],
|
52
|
+
y0: coordinates[:y0],
|
53
|
+
x1: coordinates[:x1],
|
54
|
+
y1: coordinates[:y1]
|
55
|
+
)
|
56
|
+
)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ImgToScript
|
4
|
+
module Generators
|
5
|
+
module Segmental
|
6
|
+
#
|
7
|
+
# Methods specific to the horizontal scan lines.
|
8
|
+
#
|
9
|
+
module HorizontalMixin
|
10
|
+
private
|
11
|
+
|
12
|
+
#
|
13
|
+
# Return the segment's coordinates x0, y0, x1, y1.
|
14
|
+
#
|
15
|
+
# Formatted for the horizontal scan lines.
|
16
|
+
#
|
17
|
+
# @param [Integer] segment_length
|
18
|
+
#
|
19
|
+
# @return [Hash{ Symbol => Integer }]
|
20
|
+
#
|
21
|
+
def _segment_coordinates(segment_length)
|
22
|
+
{
|
23
|
+
x0: @major_axis + @x_offset,
|
24
|
+
y0: @minor_axis + @y_offset,
|
25
|
+
x1: @major_axis + @x_offset + segment_length - 1,
|
26
|
+
y1: @minor_axis + @y_offset
|
27
|
+
}
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,101 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ImgToScript
|
4
|
+
module Generators
|
5
|
+
module Segmental
|
6
|
+
#
|
7
|
+
# Base class for the segmental generators.
|
8
|
+
#
|
9
|
+
# Segmental generators are designed to scan an image vertically or horizontaly.
|
10
|
+
# In each scan line the isolated black px. segments are being parced out to
|
11
|
+
# get their coordinates (x0, y0), (x1, y1). Drawing lines using these coordinates
|
12
|
+
# will render the image on the target device.
|
13
|
+
#
|
14
|
+
class Segmental < Generator
|
15
|
+
SCAN_LINE_HEIGHT = 1
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
def _generate
|
20
|
+
# Keeps track of all black segment in the image.
|
21
|
+
# This value will be used in the depacker (in the DATA..READ scenario).
|
22
|
+
@n_black_segments = 0
|
23
|
+
|
24
|
+
@minor_axis = 0
|
25
|
+
|
26
|
+
_scan_image
|
27
|
+
_append_decoder
|
28
|
+
end
|
29
|
+
|
30
|
+
#
|
31
|
+
# Loop through all scan lines in the image.
|
32
|
+
#
|
33
|
+
def _scan_image
|
34
|
+
(0...@image.height).each do
|
35
|
+
@major_axis = 0
|
36
|
+
_process_scan_line(_encode_scan_line(_get_scan_line))
|
37
|
+
@minor_axis += 1
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
#
|
42
|
+
# Grab a horizontal line from the image.
|
43
|
+
#
|
44
|
+
# (To make a vertical scan line: simply transpose the image before a scan.)
|
45
|
+
#
|
46
|
+
# @return [Array<Magick::Pixel>]
|
47
|
+
#
|
48
|
+
def _get_scan_line
|
49
|
+
@image.get_pixels(@major_axis, @minor_axis, @image.width, SCAN_LINE_HEIGHT)
|
50
|
+
end
|
51
|
+
|
52
|
+
#
|
53
|
+
# Encode scan line with the RLE.
|
54
|
+
#
|
55
|
+
# @param [Array<Magick::Pixel>] scan_line
|
56
|
+
# Scan line to encode.
|
57
|
+
#
|
58
|
+
# @return [Array<RunLengthEncodingRb::RLEElement>]
|
59
|
+
#
|
60
|
+
def _encode_scan_line(scan_line)
|
61
|
+
RunLengthEncodingRb.encode(scan_line)
|
62
|
+
end
|
63
|
+
|
64
|
+
#
|
65
|
+
# Process current RLE-encoded scan line.
|
66
|
+
#
|
67
|
+
# @return [Array<RunLengthEncodingRb::RLEElement>] encoded_scan_line
|
68
|
+
#
|
69
|
+
def _process_scan_line(encoded_scan_line)
|
70
|
+
encoded_scan_line.each do |e|
|
71
|
+
_process_scan_line_chunk(e)
|
72
|
+
@major_axis += e.run_length
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
#
|
77
|
+
# Process a chunk of white or black pixels from the current scan line.
|
78
|
+
#
|
79
|
+
# Depending on the color value of the chunk, the chunk either gets ignored
|
80
|
+
# (white pixels), or gets processed to be appended to the result script
|
81
|
+
# (black pixels) as a respective statement.
|
82
|
+
#
|
83
|
+
# @param [RunLengthEncodingRb::RLEElement] element
|
84
|
+
# An RLE element.
|
85
|
+
#
|
86
|
+
def _process_scan_line_chunk(element)
|
87
|
+
pixel_color = element.chunk.to_color
|
88
|
+
return unless pixel_color == "black"
|
89
|
+
|
90
|
+
_encode_chunk(element.run_length)
|
91
|
+
@n_black_segments += 1
|
92
|
+
end
|
93
|
+
|
94
|
+
#
|
95
|
+
# Reserved for the DATA..READ scenario.
|
96
|
+
#
|
97
|
+
def _append_decoder; end
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ImgToScript
|
4
|
+
module Generators
|
5
|
+
module Segmental
|
6
|
+
#
|
7
|
+
# Methods specific to the vertical scan lines.
|
8
|
+
#
|
9
|
+
module VerticalMixin
|
10
|
+
private
|
11
|
+
|
12
|
+
def _generate
|
13
|
+
_transpose
|
14
|
+
|
15
|
+
super
|
16
|
+
end
|
17
|
+
|
18
|
+
#
|
19
|
+
# Return the segment's coordinates x0, y0, x1, y1.
|
20
|
+
#
|
21
|
+
# Formatted for the vertical scan lines.
|
22
|
+
#
|
23
|
+
# @param [Integer] segment_length
|
24
|
+
#
|
25
|
+
# @return [Hash{ Symbol => Integer }]
|
26
|
+
#
|
27
|
+
def _segment_coordinates(segment_length)
|
28
|
+
{
|
29
|
+
x0: @minor_axis + @x_offset,
|
30
|
+
y0: @major_axis + @y_offset,
|
31
|
+
x1: @minor_axis + @x_offset,
|
32
|
+
y1: @major_axis + @y_offset + segment_length - 1
|
33
|
+
}
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ImgToScript
|
4
|
+
#
|
5
|
+
# Namespace for generators.
|
6
|
+
#
|
7
|
+
# Generators generate array of abstract tokens that represent the image
|
8
|
+
# in terms of simple operations, e.g.: draw a line, draw a pixel, etc.
|
9
|
+
#
|
10
|
+
module Generators
|
11
|
+
X_LBL = :x
|
12
|
+
Y_LBL = :y
|
13
|
+
|
14
|
+
LOOP_VAR = :i
|
15
|
+
READ_VAR = :l
|
16
|
+
|
17
|
+
WAIT_LOOP_COUNT = 100
|
18
|
+
WAIT_TIME = 1024
|
19
|
+
|
20
|
+
X_OFFSET = 0
|
21
|
+
Y_OFFSET = 0
|
22
|
+
CLEAR_SCREEN = true
|
23
|
+
PAUSE_PROGRAM = true
|
24
|
+
PRORGAM_BEGIN_LBL = false
|
25
|
+
PROGRAM_END_LBL = false
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ImgToScript
|
4
|
+
module Languages
|
5
|
+
module MK90Basic
|
6
|
+
module Formatters
|
7
|
+
#
|
8
|
+
# MK90 BASIC formatter base class.
|
9
|
+
#
|
10
|
+
class Formatter < ImgToScript::Formatter
|
11
|
+
setting :line_offset, default: LINE_OFFSET
|
12
|
+
setting :line_step, default: LINE_STEP
|
13
|
+
setting :max_chars_per_line, default: MAX_CHARS_PER_LINE
|
14
|
+
setting :number_lines, default: true
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
def _format(basic_tokens, **)
|
19
|
+
_apply_config
|
20
|
+
_calc_initial_line_number
|
21
|
+
|
22
|
+
@script = []
|
23
|
+
|
24
|
+
_process_tokens(basic_tokens)
|
25
|
+
|
26
|
+
@script
|
27
|
+
end
|
28
|
+
|
29
|
+
def _process_tokens(basic_tokens)
|
30
|
+
basic_tokens.each do |token|
|
31
|
+
_append_token(token)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def _apply_config
|
36
|
+
@line_offset = config.line_offset
|
37
|
+
@line_step = config.line_step
|
38
|
+
@max_chars_per_line = config.max_chars_per_line
|
39
|
+
@number_lines = config.number_lines
|
40
|
+
end
|
41
|
+
|
42
|
+
def _calc_initial_line_number
|
43
|
+
@n_line = @line_offset - @line_step
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|