feat!: added textures to improve indicators and other visuals

Removes `timeline_cached_ranges` option.

closes #206
This commit is contained in:
tomasklaen
2022-09-18 00:11:21 +02:00
parent 32011e46d6
commit c909409254
24 changed files with 640 additions and 91 deletions

BIN
fonts/uosc_textures.ttf Normal file

Binary file not shown.

View File

@@ -22,9 +22,6 @@ timeline_opacity=0.9
timeline_border=1
# When scrolling above timeline, wheel will seek by this amount of seconds
timeline_step=5
# Display seekable buffered ranges for streaming videos, syntax `color:opacity`,
# color is an BBGGRR hex code, set to `none` to disable.
timeline_cached_ranges=4e845c:0.5
# Timeline chapters style: never, dots, lines, lines-top, lines-bottom
timeline_chapters=dots
timeline_chapters_opacity=0.2

View File

@@ -155,9 +155,8 @@ local options = {
timeline_opacity = 0.9,
timeline_border = 1,
timeline_step = 5,
timeline_cached_ranges = '4e845c:0.8',
timeline_chapters = 'dots',
timeline_chapters_opacity = 0.2,
timeline_chapters_opacity = 0.4,
timeline_chapters_width = 6,
controls = 'menu,gap,subtitles,<has_audio,!audio>audio,<stream>stream-quality,gap,space,speed,space,shuffle,loop-playlist,loop-file,gap,prev,items,next,gap,fullscreen',
@@ -241,11 +240,6 @@ local config = {
media_types = split(options.media_types, ' *, *'),
subtitle_types = split(options.subtitle_types, ' *, *'),
stream_quality_options = split(options.stream_quality_options, ' *, *'),
cached_ranges = (function()
if options.timeline_cached_ranges == '' or options.timeline_cached_ranges == 'no' then return nil end
local parts = split(options.timeline_cached_ranges, ':')
return parts[1] and {color = parts[1], opacity = tonumber(parts[2])} or nil
end)(),
menu_items = (function()
local input_conf_property = mp.get_property_native('input-conf');
local input_conf_path = mp.command_native({
@@ -400,7 +394,7 @@ local state = {
handle_mouse_leave()
end),
mouse_bindings_enabled = false,
cached_ranges = nil,
uncached_ranges = nil,
render_delay = config.render_delay,
first_real_mouse_move_received = false,
playlist_count = 0,
@@ -1078,6 +1072,29 @@ function ass_mt:circle(x, y, radius, opts)
self:rect(x - radius, y - radius, x + radius, y + radius, opts)
end
-- Texture
---@param ax number
---@param ay number
---@param bx number
---@param by number
---@param char string Texture font character.
---@param opts {size?: number; color: string; align?: number; shift?: number; opacity?: number; clip?: string}
function ass_mt:texture(ax, ay, bx, by, char, opts)
opts = opts or {}
local width, height, align = bx - ax, by - ay, opts.align or 1
local clip = opts.clip or ('\\clip(' .. ax .. ',' .. ay .. ',' .. bx .. ',' .. by .. ')')
local tile_size, opacity = opts.size or 100, opts.opacity or 0.2
local align_modulo = align % 3
local shift = (opts.shift or 0) * (align_modulo == 0 and -1 or 1)
local line = string.rep(char, math.ceil((width + shift) / tile_size))
local lines = ''
for i = 1, math.ceil(height / tile_size), 1 do lines = lines .. (lines == '' and '' or '\\N') .. line end
self:txt(
(align_modulo == 1 and ax or align_modulo == 0 and bx or ax + width / 2) - shift,
align < 4 and by or align > 6 and ay or ay + height / 2,
align, lines, {font = 'uosc_textures', size = tile_size, color = opts.color, opacity = opacity, clip = clip})
end
--[[ ELEMENTS COLLECTION ]]
local Elements = {itable = {}}
@@ -1718,11 +1735,10 @@ function Menu:update_dimensions()
for _, menu in ipairs(self.all) do
menu.width = round(math.min(math.max(menu.max_width, min_width), display.width * 0.9))
local title_height = (menu.is_root and menu.title) and self.scroll_step or 0
local title_top_adjustment = title_height > 0 and self.scroll_step / 2 or 0
local max_height = round((display.height - title_height) * 0.9)
local content_height = self.scroll_step * #menu.items
menu.height = math.min(content_height - self.item_spacing, max_height)
menu.top = round((display.height - menu.height) / 2 + title_top_adjustment)
menu.top = round(math.max((display.height - menu.height) / 2, title_height * 1.5))
menu.scroll_height = math.max(content_height - menu.height - self.item_spacing, 0)
self:scroll_to(menu.scroll_y, menu) -- re-applies scroll limits
end
@@ -2140,12 +2156,15 @@ function Menu:render()
-- Background
ass:rect(ax + 2, title_ay, bx - 2, title_ay + title_height, {
color = options.color_foreground, opacity = opacity * 0.55, radius = 2,
color = options.color_foreground, opacity = opacity * 0.8, radius = 2,
})
ass:texture(ax + 2, title_ay, bx - 2, title_ay + title_height, 'n', {
size = 80, color = options.color_background, opacity = opacity * 0.1,
})
-- Title
ass:txt(ax + menu.width / 2, title_ay + (title_height / 2), 5, menu.title, {
size = self.font_size, bold = true, color = options.color_background, wrap = 2, opacity = self.opacity,
size = self.font_size, bold = true, color = options.color_background, wrap = 2, opacity = opacity,
clip = '\\clip(' .. ax .. ',' .. title_ay .. ',' .. bx .. ',' .. ay .. ')',
})
end
@@ -2717,7 +2736,7 @@ function Timeline:render()
fbx = bax + self.width * progress
end
local time_x = bax + line_width / 2
local time_ax = bax + line_width / 2
local time_width = self.width - line_width
local foreground_size = fby - fay
local foreground_coordinates = round(fax) .. ',' .. fay .. ',' .. round(fbx) .. ',' .. fby -- for clipping
@@ -2736,12 +2755,29 @@ function Timeline:render()
-- Progress
ass:rect(fax, fay, fbx, fby, {opacity = options.timeline_opacity})
-- Uncached ranges
state.uncached_ranges = {{0, 600}}
if state.uncached_ranges then
local texture_opts = {size = 80, opacity = 0.4 - (0.2 * text_opacity), align = 3}
local texture_char = text_opacity > 0 and 'b' or 'a'
for _, range in ipairs(state.uncached_ranges) do
local ax = range[1] < 0.5 and bax or math.floor(time_ax + time_width * (range[1] / state.duration))
local bx = range[2] > state.duration - 0.5 and bbx or
math.ceil(time_ax + time_width * (range[2] / state.duration))
texture_opts.color = 'ffffff'
ass:texture(ax, fay, bx, fby, texture_char, texture_opts)
texture_opts.color = '000000'
texture_opts.shift = texture_opts.size / 50
ass:texture(ax, fay, bx, fby, texture_char, texture_opts)
end
end
-- Custom ranges
if state.chapter_ranges ~= nil then
for i, chapter_range in ipairs(state.chapter_ranges) do
for i, range in ipairs(chapter_range.ranges) do
local rax = time_x + time_width * (range['start'].time / state.duration)
local rbx = time_x + time_width * (range['end'].time / state.duration)
local rax = time_ax + time_width * (range['start'].time / state.duration)
local rbx = time_ax + time_width * (range['end'].time / state.duration)
-- for 1px chapter size, use the whole size of the bar including padding
local ray = size <= 1 and bay or fay
local rby = size <= 1 and bby or fby
@@ -2751,24 +2787,40 @@ function Timeline:render()
end
-- Chapters
if (options.timeline_chapters ~= 'never'
local chapters_style = options.timeline_chapters
if (chapters_style ~= 'never'
and (state.chapters ~= nil and #state.chapters > 0 or state.ab_loop_a or state.ab_loop_b)
) then
local dots = false
-- Defaults are for `lines`
local chapter_width = options.timeline_chapters_width
local dots = false
local chapter_width, chapter_opacity = options.timeline_chapters_width, options.timeline_chapters_opacity
local chapter_height, chapter_y
if options.timeline_chapters == 'dots' then
-- Improve visibility on thin timeline
if chapters_style == 'dots' then
if foreground_size < 3 then
chapters_style, chapter_width = 'lines', 3
chapter_opacity = math.min(chapter_opacity * 1.5, 1)
end
else
if foreground_size < 6 then
chapters_style, chapter_width = 'lines', math.max(chapter_width, 3)
chapter_opacity = math.min(chapter_opacity * 1.5, 1)
end
end
if chapters_style == 'dots' then
dots = true
chapter_height = math.min(chapter_width, (foreground_size / 2) + 1)
chapter_height = math.min(chapter_width, foreground_size)
chapter_y = fay + chapter_height / 2
elseif options.timeline_chapters == 'lines' then
elseif chapters_style == 'lines' then
chapter_height = size
chapter_y = fay + (chapter_height / 2)
elseif options.timeline_chapters == 'lines-top' then
elseif chapters_style == 'lines-top' then
chapter_height = math.min(self.size_max / 3, size)
chapter_y = fay + (chapter_height / 2)
elseif options.timeline_chapters == 'lines-bottom' then
elseif chapters_style == 'lines-bottom' then
chapter_height = math.min(self.size_max / 3, size)
chapter_y = fay + size - (chapter_height / 2)
end
@@ -2779,12 +2831,11 @@ function Timeline:render()
local chapter_half_width = chapter_width / 2
local chapter_half_height = chapter_height / 2
local function draw_chapter(time)
local chapter_x = time_x + time_width * (time / state.duration)
local chapter_x = time_ax + time_width * (time / state.duration)
local ax, bx = chapter_x - chapter_half_width, chapter_x + chapter_half_width
local opts = {
color = options.color_foreground,
color = options.color_foreground, opacity = chapter_opacity,
clip = dots and '\\iclip(' .. foreground_coordinates .. ')' or nil,
opacity = options.timeline_chapters_opacity,
}
if dots then
@@ -2826,46 +2877,22 @@ function Timeline:render()
end
end
-- Cached ranges
if config.cached_ranges and state.cached_ranges then
local range_height = math.max(math.floor(math.min(self.size_max / 10, foreground_size / 2)), 1)
local range_ay = fby - range_height
-- Fully include the start and end pixels of the time range
local left_ax = math.floor(time_x)
local right_bx = math.ceil(time_x + time_width)
local cache_width = right_bx - left_ax
for _, range in ipairs(state.cached_ranges) do
local range_start = math.max(type(range['start']) == 'number' and range['start'] or 0.000001, 0.000001)
local range_end = math.min(type(range['end']) and range['end'] or state.duration, state.duration)
ass:rect(
left_ax + cache_width * (range_start / state.duration), range_ay,
left_ax + cache_width * (range_end / state.duration), range_ay + range_height,
{color = config.cached_ranges.color, opacity = config.cached_ranges.opacity}
)
end
-- Visualize padded time area limits
if (left_ax - bax) > 0 then
local notch_ay = math.max(range_ay - 2, fay)
local opts = {color = config.cached_ranges.color, opacity = options.timeline_opacity}
ass:rect(left_ax - 1, notch_ay, left_ax, bby, opts)
ass:rect(right_bx, notch_ay, right_bx + 1, bby, opts)
end
end
-- Time values
if text_opacity > 0 then
local opts = {size = self.font_size, opacity = text_opacity}
local opts = {
size = self.font_size, opacity = math.min(options.timeline_opacity + 0.1, 1) * text_opacity, border = 2,
}
-- Elapsed time
if state.time_human then
local elapsed_x = bax + spacing
local elapsed_y = fay + (size / 2)
opts.color = options.color_foreground_text
opts.border_color = options.color_foreground
opts.clip = '\\clip(' .. foreground_coordinates .. ')'
ass:txt(elapsed_x, elapsed_y, 4, state.time_human, opts)
opts.color = options.color_background_text
opts.border_color = options.color_background
opts.clip = '\\iclip(' .. foreground_coordinates .. ')'
ass:txt(elapsed_x, elapsed_y, 4, state.time_human, opts)
end
@@ -2875,9 +2902,11 @@ function Timeline:render()
local end_x = bbx - spacing
local end_y = fay + (size / 2)
opts.color = options.color_foreground_text
opts.border_color = options.color_foreground
opts.clip = '\\clip(' .. foreground_coordinates .. ')'
ass:txt(end_x, end_y, 6, state.duration_or_remaining_time_human, opts)
opts.color = options.color_background_text
opts.border_color = options.color_background
opts.clip = '\\iclip(' .. foreground_coordinates .. ')'
ass:txt(end_x, end_y, 6, state.duration_or_remaining_time_human, opts)
end
@@ -3520,34 +3549,15 @@ function VolumeSlider:render()
-- Disabled stripes for no audio
if not state.has_audio then
-- Create 100 foreground clip path
local fg_100_path = create_nudged_path(options.volume_border)
-- Render stripes
local stripe_height = 12
local skew_height = stripe_height
local colors = {'000000', 'ffffff'}
for c, color in ipairs(colors) do
local stripe_y = self.ay + stripe_height * (c - 1)
ass:new_event()
ass:append('{\\blur0\\bord0\\shad0\\1c&H' .. color ..
'\\clip(' .. fg_100_path.scale .. ',' .. fg_100_path.text .. ')}')
ass:opacity(0.15 * visibility)
ass:pos(0, 0)
ass:draw_start()
while stripe_y - skew_height < self.by do
ass:move_to(self.ax, stripe_y)
ass:line_to(self.bx, stripe_y - skew_height)
ass:line_to(self.bx, stripe_y - skew_height + stripe_height)
ass:line_to(self.ax, stripe_y + stripe_height)
stripe_y = stripe_y + stripe_height * #colors
end
ass:draw_stop()
end
local texture_opts = {
size = 200, color = options.color_foreground, opacity = visibility * 0.1,
clip = '\\clip(' .. fg_100_path.scale .. ',' .. fg_100_path.text .. ')',
}
ass:texture(ax, ay, bx, by, 'a', texture_opts)
texture_opts.color = options.color_background
texture_opts.shift = 5
ass:texture(ax, ay, bx, by, 'a', texture_opts)
end
return ass
@@ -4133,13 +4143,33 @@ mp.observe_property('osd-dimensions', 'native', function(name, val)
end)
mp.observe_property('display-hidpi-scale', 'native', update_display_dimensions)
mp.observe_property('demuxer-cache-state', 'native', function(prop, cache_state)
if cache_state == nil then
state.cached_ranges = nil
return
local cached_ranges = cache_state and cache_state['seekable-ranges'] or {}
local uncached_ranges = nil
if state.duration and #cached_ranges > 0 then
-- Normalize
local ranges = {}
for _, range in ipairs(cached_ranges) do
ranges[#ranges + 1] = {
math.max(range['start'] or 0, 0),
math.min(range['end'] or state.duration, state.duration),
}
end
table.sort(ranges, function(a, b) return a[1] < b[1] end)
-- Invert cached ranges into uncached ranges, as that's what we're rendering
uncached_ranges = {}
for _, cached in pairs(ranges) do
local last_uncached = uncached_ranges[#uncached_ranges]
if cached[2] - cached[1] > 0.5 then
if not last_uncached then
if cached[1] > 0.5 then uncached_ranges[#uncached_ranges + 1] = {0, cached[1]} end
else
if last_uncached[2] > cached[1] then last_uncached[2] = cached[1] end
end
uncached_ranges[#uncached_ranges + 1] = {cached[2], state.duration}
end
end
end
local cache_ranges = cache_state['seekable-ranges']
state.cached_ranges = #cache_ranges > 0 and cache_ranges or nil
request_render()
set_state('uncached_ranges', uncached_ranges)
end)
mp.observe_property('display-fps', 'native', observe_display_fps)
mp.observe_property('estimated-display-fps', 'native', update_render_delay)

1
src/textures/a.svg Normal file
View File

@@ -0,0 +1 @@
<svg width="100" height="100" xmlns="http://www.w3.org/2000/svg"><path d="M5.023.707.707 5.023v2.829L7.852.707Zm7.141 0L.707 12.164v2.828L14.992.707Zm7.145 0L.707 19.309v2.828L22.137.707Zm7.14 0L.707 26.449v2.828L29.277.707Zm7.145 0L.707 33.594v2.828L36.422.707Zm7.14 0L.707 40.734v2.828L43.562.708Zm7.145 0L.707 47.879v2.828l50-50Zm7.144 0L.707 55.023v2.829L57.852.707Zm7.141 0L.707 62.164v2.828L64.992.707Zm7.145 0L.707 69.309v2.828L72.137.707Zm7.14 0L.707 76.449v2.828L79.277.707Zm7.145 0L.707 83.594v2.828L86.422.707Zm7.14 0L.707 90.734v2.829L93.563.707Zm7.145 0L.707 97.879v2.828l100-100Zm2.828 4.316L5.023 100.707h2.829l92.855-92.855Zm0 7.141-88.543 88.543h2.828l85.715-85.715Zm0 7.145-81.398 81.398h2.828l78.57-78.57Zm0 7.14-74.258 74.258h2.828l71.43-71.43Zm0 7.145-67.113 67.113h2.828l64.285-64.285Zm0 7.14-59.973 59.973h2.828l57.145-57.144Zm0 7.145-52.828 52.828h2.828l50-50Zm0 7.144-45.684 45.684h2.829l42.855-42.855Zm0 7.141-38.543 38.543h2.828l35.715-35.715Zm0 7.145-31.398 31.398h2.828l28.57-28.57Zm0 7.14-24.258 24.258h2.828l21.43-21.43Zm0 7.145-17.113 17.113h2.828l14.285-14.285Zm0 7.14-9.973 9.973h2.829l7.144-7.144zm0 7.145-2.828 2.828h2.828z"/></svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

1
src/textures/b.svg Normal file
View File

@@ -0,0 +1 @@
<svg width="100" height="100" xmlns="http://www.w3.org/2000/svg"><path d="M0 0v1.414L1.414 0Zm6.918 0L0 6.918v2.828L9.746 0Zm8.336 0L0 15.254v2.828L18.082 0Zm8.332 0L0 23.586v2.828L26.414 0Zm8.332 0L0 31.918v2.828L34.746 0Zm8.336 0L0 40.254v2.828L43.082 0Zm8.332 0L0 48.586v2.828L51.414 0Zm8.332 0L0 56.918v2.828L59.746 0Zm8.336 0L0 65.254v2.828L68.082 0Zm8.332 0L0 73.586v2.828L76.414 0Zm8.332 0L0 81.918v2.828L84.746 0Zm8.336 0L0 90.254v2.828L93.082 0Zm8.332 0L0 98.586V100h1.414L100 1.414V0ZM100 6.918 6.918 100h2.828L100 9.746Zm0 8.336L15.254 100h2.828L100 18.082Zm0 8.332L23.586 100h2.828L100 26.414Zm0 8.332L31.918 100h2.828L100 34.746Zm0 8.336L40.254 100h2.828L100 43.082zm0 8.332L48.586 100h2.828L100 51.414Zm0 8.332L56.918 100h2.828L100 59.746Zm0 8.336L65.254 100h2.828L100 68.082zm0 8.332L73.586 100h2.828L100 76.414Zm0 8.332L81.918 100h2.828L100 84.746Zm0 8.336L90.254 100h2.828L100 93.082zm0 8.332L98.586 100H100Z"/></svg>

After

Width:  |  Height:  |  Size: 934 B

1
src/textures/c.svg Normal file
View File

@@ -0,0 +1 @@
<svg width="100" height="100" xmlns="http://www.w3.org/2000/svg"><path d="M0 0v1.414L1.414 0Zm9.695 0L0 9.695v2.828L12.523 0ZM20.81 0 0 20.809v2.828L23.637 0Zm11.109 0L0 31.918v2.828L34.746 0Zm11.113 0L0 43.031v2.828L45.86 0Zm11.11 0L0 54.14v2.829L56.969 0Zm11.113 0L0 65.254v2.828L68.082 0Zm11.11 0L0 76.363v2.828L79.191 0Zm11.113 0L0 87.477v2.828L90.305 0Zm11.109 0L0 98.586V100h1.414L100 1.414V0ZM100 9.695 9.695 100h2.828L100 12.523Zm0 11.114L20.809 100h2.828L100 23.637Zm0 11.109L31.918 100h2.828L100 34.746Zm0 11.113L43.031 100h2.828L100 45.86Zm0 11.11L54.14 100h2.829L100 56.969Zm0 11.113L65.254 100h2.828L100 68.082Zm0 11.11L76.363 100h2.828L100 79.191Zm0 11.113L87.477 100h2.828L100 90.305Zm0 11.109L98.586 100H100Z"/></svg>

After

Width:  |  Height:  |  Size: 733 B

1
src/textures/d.svg Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 9.4 KiB

1
src/textures/e.svg Normal file
View File

@@ -0,0 +1 @@
<svg width="100" height="100" xmlns="http://www.w3.org/2000/svg"><path d="M0 0v5h5V0Zm5 5v5h5V5Zm5 0h5V0h-5zm5 0v5h5V5Zm5 0h5V0h-5zm5 0v5h5V5Zm5 0h5V0h-5zm5 0v5h5V5Zm5 0h5V0h-5zm5 0v5h5V5Zm5 0h5V0h-5zm5 0v5h5V5Zm5 0h5V0h-5zm5 0v5h5V5Zm5 0h5V0h-5zm5 0v5h5V5Zm5 0h5V0h-5zm5 0v5h5V5Zm5 0h5V0h-5zm5 0v5h5V5Zm0 5h-5v5h5zm0 5v5h5v-5zm0 5h-5v5h5zm0 5v5h5v-5zm0 5h-5v5h5zm0 5v5h5v-5zm0 5h-5v5h5zm0 5v5h5v-5zm0 5h-5v5h5zm0 5v5h5v-5zm0 5h-5v5h5zm0 5v5h5v-5zm0 5h-5v5h5zm0 5v5h5v-5zm0 5h-5v5h5zm0 5v5h5v-5zm0 5h-5v5h5zm0 5v5h5v-5zm-5 0h-5v5h5zm-5 0v-5h-5v5zm-5 0h-5v5h5zm-5 0v-5h-5v5zm-5 0h-5v5h5zm-5 0v-5h-5v5zm-5 0h-5v5h5zm-5 0v-5h-5v5zm-5 0h-5v5h5zm-5 0v-5h-5v5zm-5 0h-5v5h5zm-5 0v-5h-5v5zm-5 0h-5v5h5zm-5 0v-5h-5v5zm-5 0h-5v5h5zm-5 0v-5h-5v5zm-5 0H5v5h5zm-5 0v-5H0v5zm0-5h5v-5H5Zm0-5v-5H0v5zm0-5h5v-5H5Zm0-5v-5H0v5zm0-5h5v-5H5Zm0-5v-5H0v5zm0-5h5v-5H5Zm0-5v-5H0v5zm0-5h5v-5H5Zm0-5v-5H0v5zm0-5h5v-5H5Zm0-5v-5H0v5zm0-5h5v-5H5Zm0-5v-5H0v5zm0-5h5v-5H5Zm0-5v-5H0v5zm5 0h5v-5h-5zm5 0v5h5v-5zm5 0h5v-5h-5zm5 0v5h5v-5zm5 0h5v-5h-5zm5 0v5h5v-5zm5 0h5v-5h-5zm5 0v5h5v-5zm5 0h5v-5h-5zm5 0v5h5v-5zm5 0h5v-5h-5zm5 0v5h5v-5zm5 0h5v-5h-5zm5 0v5h5v-5zm5 0h5v-5h-5zm5 0v5h5v-5zm0 5h-5v5h5zm0 5v5h5v-5zm0 5h-5v5h5zm0 5v5h5v-5zm0 5h-5v5h5zm0 5v5h5v-5zm0 5h-5v5h5zm0 5v5h5v-5zm0 5h-5v5h5zm0 5v5h5v-5zm0 5h-5v5h5zm0 5v5h5v-5zm0 5h-5v5h5zm0 5v5h5v-5zm-5 0h-5v5h5zm-5 0v-5h-5v5zm-5 0h-5v5h5zm-5 0v-5h-5v5zm-5 0h-5v5h5zm-5 0v-5h-5v5zm-5 0h-5v5h5zm-5 0v-5h-5v5zm-5 0h-5v5h5zm-5 0v-5h-5v5zm-5 0h-5v5h5zm-5 0v-5h-5v5zm-5 0h-5v5h5zm-5 0v-5h-5v5zm0-5h5v-5h-5zm0-5v-5h-5v5zm0-5h5v-5h-5zm0-5v-5h-5v5zm0-5h5v-5h-5zm0-5v-5h-5v5zm0-5h5v-5h-5zm0-5v-5h-5v5zm0-5h5v-5h-5zm0-5v-5h-5v5zm0-5h5v-5h-5zm0-5v-5h-5v5zm5 0h5v-5h-5zm5 0v5h5v-5zm5 0h5v-5h-5zm5 0v5h5v-5zm5 0h5v-5h-5zm5 0v5h5v-5zm5 0h5v-5h-5zm5 0v5h5v-5zm5 0h5v-5h-5zm5 0v5h5v-5zm5 0h5v-5h-5zm5 0v5h5v-5zm0 5h-5v5h5zm0 5v5h5v-5zm0 5h-5v5h5zm0 5v5h5v-5zm0 5h-5v5h5zm0 5v5h5v-5zm0 5h-5v5h5zm0 5v5h5v-5zm0 5h-5v5h5zm0 5v5h5v-5zm-5 0h-5v5h5zm-5 0v-5h-5v5zm-5 0h-5v5h5zm-5 0v-5h-5v5zm-5 0h-5v5h5zm-5 0v-5h-5v5zm-5 0h-5v5h5zm-5 0v-5h-5v5zm-5 0h-5v5h5zm-5 0v-5h-5v5zm0-5h5v-5h-5zm0-5v-5h-5v5zm0-5h5v-5h-5zm0-5v-5h-5v5zm0-5h5v-5h-5zm0-5v-5h-5v5zm0-5h5v-5h-5zm0-5v-5h-5v5zm5 0h5v-5h-5zm5 0v5h5v-5zm5 0h5v-5h-5zm5 0v5h5v-5zm5 0h5v-5h-5zm5 0v5h5v-5zm5 0h5v-5h-5zm5 0v5h5v-5zm0 5h-5v5h5zm0 5v5h5v-5zm0 5h-5v5h5zm0 5v5h5v-5zm0 5h-5v5h5zm0 5v5h5v-5zm-5 0h-5v5h5zm-5 0v-5h-5v5zm-5 0h-5v5h5zm-5 0v-5h-5v5zm-5 0h-5v5h5zm-5 0v-5h-5v5zm0-5h5v-5h-5zm0-5v-5h-5v5zm0-5h5v-5h-5zm0-5v-5h-5v5zm5 0h5v-5h-5zm5 0v5h5v-5zm5 0h5v-5h-5zm5 0v5h5v-5zm0 5h-5v5h5zm0 5v5h5v-5zm-5 0h-5v5h5zm-5 0v-5h-5v5z"/></svg>

After

Width:  |  Height:  |  Size: 2.5 KiB

1
src/textures/f.svg Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 5.9 KiB

1
src/textures/g.svg Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 15 KiB

1
src/textures/h.svg Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 9.1 KiB

1
src/textures/i.svg Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 13 KiB

1
src/textures/j.svg Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 6.7 KiB

1
src/textures/k.svg Normal file
View File

@@ -0,0 +1 @@
<svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" xml:space="preserve" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="2"><path d="M5.309 24H.692l2.309-1.8L5.309 24Zm6.001 0H6.694l2.308-1.8L11.31 24Zm6.002 0h-4.617l2.309-1.8 2.308 1.8Zm6.001 0h-4.616l2.308-1.8 2.308 1.8ZM6.001 20.4l2.155 1.68-2.155 1.68-2.154-1.68 2.154-1.68Zm6.002 0 2.154 1.68-2.154 1.68-2.155-1.68 2.155-1.68Zm6.001 0 2.155 1.68-2.155 1.68-2.154-1.68 2.154-1.68Zm-15.85 1.68L0 23.76V20.4l2.154 1.68ZM24 20.404v3.352l-2.149-1.676L24 20.404ZM9.002 18.84l2.001 1.56-2.001 1.56-2-1.56 2-1.56Zm6.002 0 2 1.56-2 1.56-2.001-1.56 2.001-1.56Zm-12.003 0 2 1.56-2 1.56L1 20.4l2.001-1.56Zm18.004 0 2 1.56-2 1.56-2.001-1.56 2.001-1.56Zm-15.004-1.8 1.847 1.44-1.847 1.44-1.846-1.44 1.846-1.44Zm12.003 0 1.847 1.44-1.847 1.44-1.846-1.44 1.846-1.44Zm-6.001 0 1.846 1.44-1.846 1.44-1.847-1.44 1.847-1.44ZM0 17.04l1.847 1.44L0 19.92v-2.88Zm24 .004v2.872l-1.841-1.436L24 17.044ZM9.002 15.48l1.693 1.32-1.693 1.32-1.693-1.32 1.693-1.32Zm6.002 0 1.692 1.32-1.692 1.32-1.693-1.32 1.693-1.32Zm-12.003 0 1.692 1.32-1.692 1.32-1.693-1.32 1.693-1.32Zm18.004 0 1.693 1.32-1.693 1.32-1.693-1.32 1.693-1.32Zm-3.001-1.8 1.539 1.2-1.539 1.2-1.539-1.2 1.539-1.2Zm-12.003 0 1.539 1.2-1.539 1.2-1.538-1.2 1.538-1.2Zm6.002 0 1.539 1.2-1.539 1.2-1.539-1.2 1.539-1.2Zm-10.464 1.2L0 16.08v-2.4l1.539 1.2ZM24 13.684v2.392l-1.533-1.196L24 13.684Zm-8.996-1.564 1.384 1.08-1.384 1.08-1.385-1.08 1.385-1.08Zm6.001 0 1.385 1.08-1.385 1.08-1.385-1.08 1.385-1.08Zm-12.003 0 1.385 1.08-1.385 1.08-1.385-1.08 1.385-1.08Zm-6.001 0 1.385 1.08-1.385 1.08-1.385-1.08 1.385-1.08Zm9.002-1.8 1.231.96-1.231.96-1.231-.96 1.231-.96ZM0 10.32l1.231.96L0 12.24v-1.92Zm6.001 0 1.231.96-1.231.96-1.231-.96 1.231-.96Zm12.003 0 1.231.96-1.231.96-1.231-.96 1.231-.96Zm5.996.004v1.912l-1.225-.956L24 10.324ZM15.004 8.76l1.077.84-1.077.84-1.078-.84 1.078-.84Zm6.001 0 1.077.84-1.077.84-1.077-.84 1.077-.84Zm-12.003 0 1.077.84-1.077.84-1.077-.84 1.077-.84Zm-6.001 0 1.077.84-1.077.84-1.077-.84 1.077-.84ZM0 6.96l.923.72L0 8.4V6.96Zm12.003 0 .923.72-.923.72-.923-.72.923-.72Zm6.001 0 .924.72-.924.72-.923-.72.923-.72Zm-12.003 0 .924.72-.924.72-.923-.72.923-.72ZM24 6.964v1.432l-.918-.716.918-.716ZM3.001 5.4l.769.6-.769.6-.77-.6.77-.6Zm12.003 0 .769.6-.769.6-.77-.6.77-.6Zm6.001 0 .769.6-.769.6-.769-.6.769-.6Zm-12.003 0 .77.6-.77.6-.769-.6.769-.6Zm9.002-1.8.616.48-.616.48-.615-.48.615-.48Zm-12.003 0 .616.48-.616.48-.615-.48.615-.48Zm6.002 0 .615.48-.615.48-.616-.48.616-.48ZM.616 4.08 0 4.56V3.6l.616.48ZM24 3.604v.952l-.61-.476.61-.476ZM3.001 2.04l.461.36-.461.36-.462-.36.462-.36Zm6.001 0 .462.36-.462.36-.462-.36.462-.36Zm6.002 0 .461.36-.461.36-.462-.36.462-.36Zm6.001 0 .462.36-.462.36-.462-.36.462-.36ZM6.001.24l.308.24-.308.24-.307-.24.307-.24Zm6.002 0 .308.24-.308.24-.308-.24.308-.24Zm6.001 0 .308.24-.308.24-.308-.24.308-.24ZM.308.48 0 .72V.24l.308.24ZM24 .244v.472L23.698.48 24 .244Z"/></svg>

After

Width:  |  Height:  |  Size: 2.9 KiB

1
src/textures/l.svg Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 6.2 KiB

1
src/textures/m.svg Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 6.4 KiB

1
src/textures/n.svg Normal file
View File

@@ -0,0 +1 @@
<svg width="100" height="100" xmlns="http://www.w3.org/2000/svg"><path d="M0 0v4.167h7.143V0Zm25 0v4.167h7.143V0Zm8.333 0v4.167h7.143V0Zm8.334 0v4.167h7.143V0ZM50 0v4.167h7.143V0Zm25 0v4.167h7.143V0Zm8.333 0v4.167h7.143V0Zm8.334 0v4.167h7.143V0ZM0 5.556v4.166h7.143V5.556Zm8.333 0v4.166h7.143V5.556Zm8.334 0v4.166h7.143V5.556Zm8.333 0v4.166h7.143V5.556Zm8.333 0v4.166h7.143V5.556Zm16.667 0v4.166h7.143V5.556Zm8.333 0v4.166h7.143V5.556Zm8.334 0v4.166h7.143V5.556Zm8.333 0v4.166h7.143V5.556Zm8.333 0v4.166h7.143V5.556Zm-75 5.555v4.167h7.143V11.11zm8.334 0v4.167h7.143V11.11zm16.666 0v4.167h7.143V11.11zm8.334 0v4.167h7.143V11.11zm16.666 0v4.167h7.143V11.11zm8.334 0v4.167h7.143V11.11zm16.666 0v4.167h7.143V11.11zm8.334 0v4.167h7.143V11.11ZM0 16.667v4.166h7.143v-4.166zm8.333 0v4.166h7.143v-4.166zm16.667 0v4.166h7.143v-4.166zm8.333 0v4.166h7.143v-4.166zm16.667 0v4.166h7.143v-4.166zm8.333 0v4.166h7.143v-4.166zm16.667 0v4.166h7.143v-4.166zm8.333 0v4.166h7.143v-4.166ZM0 22.222v4.167h7.143v-4.167zm8.333 0v4.167h7.143v-4.167zm8.334 0v4.167h7.143v-4.167zm16.666 0v4.167h7.143v-4.167zm8.334 0v4.167h7.143v-4.167zm8.333 0v4.167h7.143v-4.167zm8.333 0v4.167h7.143v-4.167zm8.334 0v4.167h7.143v-4.167zm16.666 0v4.167h7.143v-4.167zm8.334 0v4.167h7.143v-4.167ZM8.333 27.778v4.166h7.143v-4.166zm8.334 0v4.166h7.143v-4.166zm8.333 0v4.166h7.143v-4.166zm16.667 0v4.166h7.143v-4.166zm16.666 0v4.166h7.143v-4.166zm8.334 0v4.166h7.143v-4.166zm8.333 0v4.166h7.143v-4.166zm16.667 0v4.166h7.143v-4.166ZM0 33.333V37.5h7.143v-4.167zm25 0V37.5h7.143v-4.167zm8.333 0V37.5h7.143v-4.167zm8.334 0V37.5h7.143v-4.167zm8.333 0V37.5h7.143v-4.167zm25 0V37.5h7.143v-4.167zm8.333 0V37.5h7.143v-4.167zm8.334 0V37.5h7.143v-4.167ZM0 38.89v4.167h7.143V38.89zm8.333 0v4.167h7.143V38.89zm8.334 0v4.167h7.143V38.89zm8.333 0v4.167h7.143V38.89zm8.333 0v4.167h7.143V38.89zm16.667 0v4.167h7.143V38.89zm8.333 0v4.167h7.143V38.89zm8.334 0v4.167h7.143V38.89zm8.333 0v4.167h7.143V38.89zm8.333 0v4.167h7.143V38.89Zm-75 5.555v4.167h7.143v-4.167zm8.334 0v4.167h7.143v-4.167zm16.666 0v4.167h7.143v-4.167zm8.334 0v4.167h7.143v-4.167zm16.666 0v4.167h7.143v-4.167zm8.334 0v4.167h7.143v-4.167zm16.666 0v4.167h7.143v-4.167zm8.334 0v4.167h7.143v-4.167ZM0 50v4.167h7.143V50Zm8.333 0v4.167h7.143V50ZM25 50v4.167h7.143V50Zm8.333 0v4.167h7.143V50ZM50 50v4.167h7.143V50Zm8.333 0v4.167h7.143V50ZM75 50v4.167h7.143V50Zm8.333 0v4.167h7.143V50ZM0 55.556v4.166h7.143v-4.166zm8.333 0v4.166h7.143v-4.166zm8.334 0v4.166h7.143v-4.166zm16.666 0v4.166h7.143v-4.166zm8.334 0v4.166h7.143v-4.166zm8.333 0v4.166h7.143v-4.166zm8.333 0v4.166h7.143v-4.166zm8.334 0v4.166h7.143v-4.166zm16.666 0v4.166h7.143v-4.166zm8.334 0v4.166h7.143v-4.166ZM8.333 61.11v4.167h7.143V61.11zm8.334 0v4.167h7.143V61.11zm8.333 0v4.167h7.143V61.11zm16.667 0v4.167h7.143V61.11zm16.666 0v4.167h7.143V61.11zm8.334 0v4.167h7.143V61.11zm8.333 0v4.167h7.143V61.11zm16.667 0v4.167h7.143V61.11ZM0 66.667v4.166h7.143v-4.166zm25 0v4.166h7.143v-4.166zm8.333 0v4.166h7.143v-4.166zm8.334 0v4.166h7.143v-4.166zm8.333 0v4.166h7.143v-4.166zm25 0v4.166h7.143v-4.166zm8.333 0v4.166h7.143v-4.166zm8.334 0v4.166h7.143v-4.166ZM0 72.222v4.167h7.143v-4.167zm8.333 0v4.167h7.143v-4.167zm8.334 0v4.167h7.143v-4.167zm8.333 0v4.167h7.143v-4.167zm8.333 0v4.167h7.143v-4.167zm16.667 0v4.167h7.143v-4.167zm8.333 0v4.167h7.143v-4.167zm8.334 0v4.167h7.143v-4.167zm8.333 0v4.167h7.143v-4.167zm8.333 0v4.167h7.143v-4.167Zm-75 5.556v4.166h7.143v-4.166zm8.334 0v4.166h7.143v-4.166zm16.666 0v4.166h7.143v-4.166zm8.334 0v4.166h7.143v-4.166zm16.666 0v4.166h7.143v-4.166zm8.334 0v4.166h7.143v-4.166zm16.666 0v4.166h7.143v-4.166zm8.334 0v4.166h7.143v-4.166ZM0 83.333V87.5h7.143v-4.167zm8.333 0V87.5h7.143v-4.167Zm16.667 0V87.5h7.143v-4.167zm8.333 0V87.5h7.143v-4.167zm16.667 0V87.5h7.143v-4.167zm8.333 0V87.5h7.143v-4.167zm16.667 0V87.5h7.143v-4.167zm8.333 0V87.5h7.143v-4.167ZM0 88.89v4.167h7.143V88.89zm8.333 0v4.167h7.143V88.89zm8.334 0v4.167h7.143V88.89zm16.666 0v4.167h7.143V88.89zm8.334 0v4.167h7.143V88.89zm8.333 0v4.167h7.143V88.89zm8.333 0v4.167h7.143V88.89zm8.334 0v4.167h7.143V88.89zm16.666 0v4.167h7.143V88.89zm8.334 0v4.167h7.143V88.89ZM8.333 94.444v4.167h7.143v-4.167zm8.334 0v4.167h7.143v-4.167zm8.333 0v4.167h7.143v-4.167zm16.667 0v4.167h7.143v-4.167zm16.666 0v4.167h7.143v-4.167zm8.334 0v4.167h7.143v-4.167zm8.333 0v4.167h7.143v-4.167zm16.667 0v4.167h7.143v-4.167z" fill-rule="evenodd"/></svg>

After

Width:  |  Height:  |  Size: 4.3 KiB

1
src/textures/o.svg Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 6.2 KiB

1
src/textures/q.svg Normal file
View File

@@ -0,0 +1 @@
<svg width="100" height="100" xmlns="http://www.w3.org/2000/svg"><path d="M100 0H0v5h100zm0 10H0v5h100zm0 10H0v5h100zm0 10H0v5h100zm0 10H0v5h100zm0 10H0v5h100zm0 10H0v5h100zm0 10H0v5h100zm0 10H0v5h100zm0 10H0v5h100z" fill-rule="evenodd"/></svg>

After

Width:  |  Height:  |  Size: 244 B

1
src/textures/s.svg Normal file
View File

@@ -0,0 +1 @@
<svg width="100" height="100" xmlns="http://www.w3.org/2000/svg"><path d="M0 0v100h5V0Zm10 0v100h5V0Zm10 0v100h5V0Zm10 0v100h5V0Zm10 0v100h5V0Zm10 0v100h5V0Zm10 0v100h5V0Zm10 0v100h5V0Zm10 0v100h5V0Zm10 0v100h5V0Z" fill-rule="evenodd"/></svg>

After

Width:  |  Height:  |  Size: 242 B

1
src/textures/t.svg Normal file
View File

@@ -0,0 +1 @@
<svg width="100" height="100" xmlns="http://www.w3.org/2000/svg"><path d="M9.21 0v2.63H2.63v6.58H0v.66h2.63v13.155h13.817v-6.578h6.578V2.631H9.87V0Zm30.265 0v2.63H26.316v13.817h6.579v6.578H46.71V9.87h2.63v29.606h-2.63v-13.16H32.895v6.579h-6.579V46.71h13.159v2.63H9.869v-2.63h13.156V32.895h-6.578v-6.579H2.631v13.159H0v.656h2.63v6.58h6.58v2.63H0V50h9.21v2.63H2.63v6.58H0v.66h2.63v13.155h13.817v-6.578h6.578V52.631H9.87V50h29.606v2.63h-13.16v13.817h6.579v6.578H46.71V59.87h2.63v29.606h-2.63v-13.16H32.895v6.579h-6.579V96.71h13.159v2.63H9.869v-2.63h13.156V82.895h-6.578v-6.579H2.631v13.159H0v.656h2.63v6.58h6.58v2.63H0V100h100V0h-.658v9.21H96.71V2.63h-6.58V0h-.656v2.63H76.316v13.817h6.579v6.578H96.71V9.87h2.63v29.606h-2.63v-13.16H82.895v6.579h-6.579V46.71h13.159v2.63H59.869v-2.63h13.156V32.895h-6.578v-6.579H52.631v13.159H50V9.869h2.63v13.156h13.817v-6.578h6.578V2.631H59.87V0h-.658v2.63h-6.58v6.58H50V0h-.658v9.21H46.71V2.63h-6.58V0ZM3.289 3.29h5.922v5.92H3.289zm6.58 0h12.5v5.92h-6.58v6.58H9.211v6.58H3.289V9.87h6.58zm17.106 0h12.5v6.58h6.578v12.5H40.13v-6.58h-6.578V9.21h-6.578zm13.156 0h5.922v5.92H40.13zm13.158 0h5.922v5.92h-5.922zm6.58 0h12.5v5.92h-6.58v6.58h-6.578v6.58h-5.922V9.87h6.58zm17.106 0h12.5v6.58h6.578v12.5H90.13v-6.58h-6.578V9.21h-6.578zm13.156 0h5.922v5.92H90.13ZM16.447 9.87h5.922v5.92h-5.922zm10.528 0h5.92v5.92h-5.92zm39.472 0h5.922v5.92h-5.922zm10.528 0h5.92v5.92h-5.92ZM9.869 16.446h5.92v5.922H9.87Zm23.684 0h5.922v5.922h-5.922zm26.316 0h5.92v5.922h-5.92zm23.684 0h5.922v5.922h-5.922ZM3.289 26.975h5.922v6.578h6.578v6.578h6.58v5.922H9.87v-6.578H3.29Zm6.58 0h5.92v5.92H9.87Zm23.684 0h5.922v5.92h-5.922zm6.578 0h5.922v12.5h-6.578v6.578h-12.5V40.13h6.578v-6.578h6.578zm13.158 0h5.922v6.578h6.578v6.578h6.58v5.922h-12.5v-6.578h-6.58zm6.58 0h5.92v5.92h-5.92zm23.684 0h5.922v5.92h-5.922zm6.578 0h5.922v12.5h-6.578v6.578h-12.5V40.13h6.578v-6.578h6.578zm-73.684 6.578h5.922v5.922h-5.922zm10.528 0h5.92v5.922h-5.92zm39.472 0h5.922v5.922h-5.922zm10.528 0h5.92v5.922h-5.92ZM3.289 40.13h5.922v5.922H3.289zm36.842 0h5.922v5.922H40.13zm6.58 0h2.63v9.21h-9.21v-2.63h6.58zm3.289 0h2.63v6.58h6.58v2.63H50Zm3.29 0h5.92v5.922h-5.92zm36.84 0h5.923v5.922H90.13zm6.58 0h2.632v9.21H90.13v-2.63h6.58zM40.13 50h9.212v9.21H46.71v-6.58h-6.58ZM50 50h9.21v2.63h-6.58v6.58H50Zm9.87 0h29.605v2.63H76.316v13.817h6.579v6.578H96.71V59.87h2.63v29.606h-2.63v-13.16H82.895v6.579h-6.579V96.71h13.159v2.63H59.869v-2.63h13.156V82.895h-6.578v-6.579H52.631v13.159H50V59.869h2.63v13.156h13.817v-6.578h6.578V52.631H59.87zm30.26 0h9.212v9.21H96.71v-6.58h-6.58ZM3.29 53.29h5.92v5.92H3.29zm6.58 0h12.5v5.92h-6.58v6.58H9.21v6.58H3.29v-12.5h6.58zm17.105 0h12.5v6.58h6.578v12.5H40.13v-6.58h-6.578v-6.58h-6.578zm13.156 0h5.922v5.92H40.13zm13.158 0h5.922v5.92h-5.922zm6.58 0h12.5v5.92h-6.58v6.58h-6.578v6.58h-5.922v-12.5h6.58zm17.106 0h12.5v6.58h6.578v12.5H90.13v-6.58h-6.578v-6.58h-6.578zm13.156 0h5.922v5.92H90.13zm-73.684 6.58h5.922v5.92h-5.922zm10.528 0h5.92v5.92h-5.92zm39.472 0h5.922v5.92h-5.922zm10.528 0h5.92v5.92h-5.92ZM9.869 66.446h5.92v5.922H9.87Zm23.684 0h5.922v5.922h-5.922zm26.316 0h5.92v5.922h-5.92zm23.684 0h5.922v5.922h-5.922ZM3.289 76.975h5.922v6.578h6.578v6.578h6.58v5.922H9.87v-6.578H3.29Zm6.58 0h5.92v5.92H9.87Zm23.684 0h5.922v5.92h-5.922zm6.578 0h5.922v12.5h-6.578v6.578h-12.5V90.13h6.578v-6.578h6.578zm13.158 0h5.922v6.578h6.578v6.578h6.58v5.922h-12.5v-6.578h-6.58zm6.58 0h5.92v5.92h-5.92zm23.684 0h5.922v5.92h-5.922zm6.578 0h5.922v12.5h-6.578v6.578h-12.5V90.13h6.578v-6.578h6.578zm-73.684 6.578h5.922v5.922h-5.922zm10.528 0h5.92v5.922h-5.92zm39.472 0h5.922v5.922h-5.922zm10.528 0h5.92v5.922h-5.92ZM3.289 90.13h5.922v5.922H3.289zm36.842 0h5.922v5.922H40.13zm6.58 0h2.63v9.21h-9.21v-2.63h6.58zm3.289 0h2.63v6.58h6.58v2.63H50Zm3.29 0h5.92v5.922h-5.92zm36.84 0h5.923v5.922H90.13zm6.58 0h2.632v9.21H90.13v-2.63h6.58z" fill-rule="evenodd"/></svg>

After

Width:  |  Height:  |  Size: 3.7 KiB

File diff suppressed because one or more lines are too long

1
src/textures/z.svg Normal file
View File

@@ -0,0 +1 @@
<svg width="100" height="100" xmlns="http://www.w3.org/2000/svg"><path d="M5.145 0 0 5.143v4.714L9.861 0Zm10.003 0L5.145 10 0 15.143v4.714L9.861 10l6.81-6.81L23.485 10l9.85 9.846v.011l.006-.005.006.005v-.011L43.193 10l6.813-6.81L56.818 10l9.848 9.846v.011l.006-.005.006.005v-.011L76.523 10l6.811-6.81L90.143 10 100 19.857v-4.714L94.857 10l-10-10h-3.046l-10 10-5.14 5.137L61.534 10 51.53 0h-3.047L38.48 10l-5.14 5.137L28.202 10 18.197 0Zm8.336 0 9.85 9.846v.011l.006-.005.006.005v-.011L43.193 0H38.48l-5.14 5.137L28.202 0Zm33.334 0 9.848 9.846v.011l.006-.005.006.005v-.011L76.523 0h-4.712l-5.14 5.137L61.534 0Zm33.325 0L100 9.857V5.143L94.857 0ZM16.672 8.477 15.148 10 5.145 20 0 25.143v4.714L9.861 20l6.81-6.81L23.485 20l9.85 9.846v.011l.006-.005.006.005v-.011L43.193 20l6.813-6.81L56.818 20l9.848 9.846v.011l.006-.005.006.005v-.011L76.523 20l6.811-6.81L90.143 20 100 29.857v-4.714L94.857 20l-10-10-1.523-1.523L81.811 10l-10 10-5.14 5.137L61.534 20 51.53 10l-1.523-1.523L48.482 10 38.48 20l-5.14 5.137L28.202 20 18.197 10Zm0 10L15.148 20 5.145 30 0 35.143v4.714L9.861 30l6.81-6.81L23.485 30l9.85 9.846v.011l.006-.005.006.005v-.011L43.193 30l6.813-6.81L56.818 30l9.848 9.846v.011l.006-.005.006.005v-.011L76.523 30l6.811-6.81L90.143 30 100 39.857v-4.714L94.857 30l-10-10-1.523-1.523L81.811 20l-10 10-5.14 5.137L61.534 30 51.53 20l-1.523-1.523L48.482 20 38.48 30l-5.14 5.137L28.202 30 18.197 20Zm0 10L15.148 30 5.145 40 0 45.143v4.714L9.861 40l6.81-6.81L23.485 40l9.85 9.846v.011l.006-.005.006.005v-.011L43.193 40l6.813-6.81L56.818 40l9.848 9.846v.011l.006-.005.006.005v-.011L76.523 40l6.811-6.81L90.143 40 100 49.857v-4.714L94.857 40l-10-10-1.523-1.523L81.811 30l-10 10-5.14 5.137L61.534 40 51.53 30l-1.523-1.523L48.482 30 38.48 40l-5.14 5.137L28.202 40 18.197 30Zm0 10L15.148 40 5.145 50 0 55.143v4.714L9.861 50l6.81-6.81L23.485 50l9.85 9.846v.011l.006-.005.006.005v-.011L43.193 50l6.813-6.81L56.818 50l9.848 9.846v.011l.006-.005.006.005v-.011L76.523 50l6.811-6.81L90.143 50 100 59.857v-4.714L94.857 50l-10-10-1.523-1.523L81.811 40l-10 10-5.14 5.137L61.534 50 51.53 40l-1.523-1.523L48.482 40 38.48 50l-5.14 5.137L28.202 50 18.197 40Zm0 10L15.148 50 5.145 60 0 65.143v4.714L9.861 60l6.81-6.81L23.485 60l9.85 9.846v.011l.006-.005.006.005v-.011L43.193 60l6.813-6.81L56.818 60l9.848 9.846v.011l.006-.005.006.005v-.011L76.523 60l6.811-6.81L90.143 60 100 69.857v-4.714L94.857 60l-10-10-1.523-1.523L81.811 50l-10 10-5.14 5.137L61.534 60 51.53 50l-1.523-1.523L48.482 50 38.48 60l-5.14 5.137L28.202 60 18.197 50Zm0 10L15.148 60 5.145 70 0 75.143v4.714L9.861 70l6.81-6.81L23.485 70l9.85 9.846v.011l.006-.005.006.005v-.011L43.193 70l6.813-6.81L56.818 70l9.848 9.846v.011l.006-.005.006.005v-.011L76.523 70l6.811-6.81L90.143 70 100 79.857v-4.714L94.857 70l-10-10-1.523-1.523L81.811 60l-10 10-5.14 5.137L61.534 70 51.53 60l-1.523-1.523L48.482 60 38.48 70l-5.14 5.137L28.202 70 18.197 60Zm0 10L15.148 70 5.145 80 0 85.143v4.714L9.861 80l6.81-6.81L23.485 80l9.85 9.846v.011l.006-.005.006.005v-.011L43.193 80l6.813-6.81L56.818 80l9.848 9.846v.011l.006-.005.006.005v-.011L76.523 80l6.811-6.81L90.143 80 100 89.857v-4.714L94.857 80l-10-10-1.523-1.523L81.811 70l-10 10-5.14 5.137L61.534 80 51.53 70l-1.523-1.523L48.482 70 38.48 80l-5.14 5.137L28.202 80 18.197 70Zm0 10L15.148 80 5.145 90 0 95.143v4.714L9.861 90l6.81-6.81L23.485 90l9.85 9.846v.011l.006-.005.006.005v-.011L43.193 90l6.813-6.81L56.818 90l9.848 9.846v.011l.006-.005.006.005v-.011L76.523 90l6.811-6.81L90.143 90 100 99.857v-4.714L94.857 90l-10-10-1.523-1.523L81.811 80l-10 10-5.14 5.137L61.534 90 51.53 80l-1.523-1.523L48.482 80 38.48 90l-5.14 5.137L28.202 90 18.197 80Zm0 10L15.148 90 5.145 100H9.86l6.81-6.81 6.813 6.81H28.2L18.197 90Zm33.334 0L48.482 90 38.48 100h4.714l6.813-6.81 6.812 6.81h4.715L51.53 90Zm33.328 0L81.811 90l-10 10h4.712l6.811-6.81 6.809 6.81h4.714l-10-10zm-66.662 10L15.148 100h3.05zm33.334 0L48.482 100h3.047zm33.328 0L81.811 100h3.046z" fill-rule="evenodd"/></svg>

After

Width:  |  Height:  |  Size: 3.8 KiB