Files
ab_glyph_rasterizer
adler
adler32
andrew
bitflags
bytemuck
byteorder
calloop
cfg_if
color_quant
crc32fast
crossbeam_channel
crossbeam_deque
crossbeam_epoch
crossbeam_utils
deflate
dlib
downcast_rs
draw_state
either
event_loop
float
fnv
gfx
gfx_core
gfx_device_gl
gfx_gl
gfx_graphics
gfx_texture
gif
gl
glutin
api
platform
platform_impl
glutin_egl_sys
glutin_glx_sys
glutin_window
graphics
glyph_cache
graphics_api_version
image
codecs
bmp
hdr
ico
jpeg
pnm
tga
webp
imageops
io
math
utils
input
instant
interpolation
iovec
jpeg_decoder
lazy_static
lazycell
libc
unix
libloading
lock_api
log
maybe_uninit
memchr
memmap2
memoffset
miniz_oxide
mio
deprecated
net
sys
mio_extras
net2
nix
net
sys
nom
bits
branch
bytes
character
combinator
multi
number
sequence
num_cpus
num_integer
num_iter
num_rational
num_traits
once_cell
osmesa_sys
owned_ttf_parser
parking_lot
parking_lot_core
percent_encoding
piston
piston_window
png
proc_macro2
quote
raw_window_handle
rayon
collections
compile_fail
iter
chain.rschunks.rscloned.rscopied.rsempty.rsenumerate.rsextend.rsfilter.rsfilter_map.rsfind.rsflat_map.rsflat_map_iter.rsflatten.rsflatten_iter.rsfold.rsfor_each.rsfrom_par_iter.rsinspect.rsinterleave.rsinterleave_shortest.rsintersperse.rslen.rsmap.rsmap_with.rsmod.rsmultizip.rsnoop.rsonce.rspanic_fuse.rspar_bridge.rspositions.rsproduct.rsreduce.rsrepeat.rsrev.rsskip.rssplitter.rsstep_by.rssum.rstake.rstry_fold.rstry_reduce.rstry_reduce_with.rsunzip.rsupdate.rswhile_some.rszip.rszip_eq.rs
slice
rayon_core
compile_fail
join
scope
sleep
spawn
thread_pool
read_color
rusttype
same_file
scoped_threadpool
scoped_tls
scopeguard
serde
de
private
ser
serde_derive
shader_version
shaders_graphics2d
shared_library
slab
smallvec
smithay_client_toolkit
data_device
primary_selection
seat
shell
shm
window
spin_sleep
syn
attr.rsawait.rsbigint.rsbuffer.rscustom_keyword.rscustom_punctuation.rsdata.rsderive.rsdiscouraged.rserror.rsexport.rsexpr.rsext.rsfile.rsgenerics.rsgroup.rsident.rsitem.rslib.rslifetime.rslit.rslookahead.rsmac.rsmacros.rsop.rsparse.rsparse_macro_input.rsparse_quote.rspat.rspath.rsprint.rspunctuated.rsreserved.rssealed.rsspan.rsspanned.rsstmt.rsthread.rstoken.rstt.rsty.rsverbatim.rswhitespace.rs
texture
tiff
ttf_parser
tables
unicode_xid
vecmath
viewport
walkdir
wayland_client
wayland_commons
wayland_cursor
wayland_egl
wayland_protocols
wayland_sys
weezl
window
winit
platform
platform_impl
linux
wayland
event_loop
seat
keyboard
pointer
text_input
touch
window
x11
x11_dl
xcursor
xdg
xml
reader
parser
writer
>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
// https://docs.microsoft.com/en-us/typography/opentype/spec/svg use crate::GlyphId; use crate::parser::{Stream, FromData, Offset, Offset32, NumFrom}; #[derive(Clone, Copy)] struct SvgDocumentRecord { start_glyph_id: GlyphId, end_glyph_id: GlyphId, svg_doc_offset: Option<Offset32>, svg_doc_length: u32, } impl FromData for SvgDocumentRecord { const SIZE: usize = 12; #[inline] fn parse(data: &[u8]) -> Option<Self> { let mut s = Stream::new(data); Some(SvgDocumentRecord { start_glyph_id: s.read()?, end_glyph_id: s.read()?, svg_doc_offset: s.read()?, svg_doc_length: s.read()?, }) } } pub fn parse( data: &[u8], glyph_id: GlyphId, ) -> Option<&[u8]> { let mut s = Stream::new(data); s.skip::<u16>(); // version let doc_list_offset = s.read::<Option<Offset32>>()??; let mut s = Stream::new_at(data, doc_list_offset.to_usize())?; let count: u16 = s.read()?; let records = s.read_array16::<SvgDocumentRecord>(count)?; let record = records.into_iter() .find(|rec| (rec.start_glyph_id..=rec.end_glyph_id).contains(&glyph_id))?; let svg_offset = record.svg_doc_offset?; let mut s = Stream::new_at(data, doc_list_offset.to_usize() + svg_offset.to_usize())?; let svg_data = s.read_bytes(usize::num_from(record.svg_doc_length))?; Some(svg_data) }