feat!: added textures to improve indicators and other visuals
Removes `timeline_cached_ranges` option. closes #206
BIN
fonts/uosc_textures.ttf
Normal 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
|
||||
|
206
scripts/uosc.lua
@@ -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
@@ -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
@@ -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
@@ -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
After Width: | Height: | Size: 9.4 KiB |
1
src/textures/e.svg
Normal 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
After Width: | Height: | Size: 5.9 KiB |
1
src/textures/g.svg
Normal file
After Width: | Height: | Size: 15 KiB |
1
src/textures/h.svg
Normal file
After Width: | Height: | Size: 9.1 KiB |
1
src/textures/i.svg
Normal file
After Width: | Height: | Size: 13 KiB |
1
src/textures/j.svg
Normal file
After Width: | Height: | Size: 6.7 KiB |
1
src/textures/k.svg
Normal 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
After Width: | Height: | Size: 6.2 KiB |
1
src/textures/m.svg
Normal file
After Width: | Height: | Size: 6.4 KiB |
1
src/textures/n.svg
Normal 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
After Width: | Height: | Size: 6.2 KiB |
1
src/textures/q.svg
Normal 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
@@ -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
@@ -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 |
503
src/textures/uosc_textures.json
Normal file
1
src/textures/z.svg
Normal 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 |