alacritty / crossfont Goto Github PK
View Code? Open in Web Editor NEWCross platform native font loading and rasterization library for Rust
License: Apache License 2.0
Cross platform native font loading and rasterization library for Rust
License: Apache License 2.0
Freetype 2.12 added support for OT-in-SVG by providing hooks to render svgs. It seems like it doesn't force to use librsvg, at least it seems like it. This is required if we want to support certain emoji fonts like twemoji
or apple emoji fonts.
https://freetype.org/freetype2/docs/reference/ft2-ot_svg_driver.html
First of all, thank you for this nice library and the alacritty terminal that uses it.
This issue is for alacritty, but I think the appropriate place for it is here.
On windows, when using a BGR
monitor / TV, the font rendering is very ugly (with noticeable color fringes).
On linux, this was fixed, according to alacritty/alacritty#4100 (AFAICT the fix was implemented in this library).
Adding some reference info, on how to detect which subpixel layout is used on Windows (in case it may be useful):
Investigation by BetterClearTypeTuner (2019)
Thank you again for your good work!
Since travis discontinues its free macOS builds we should migrate to combination of sr.ht and github actions like we did in alacritty/alacritty#4387.
Fontconfig file located in /etc/fonts/conf.d/10-juliamono-remove-gear-symbol.conf
to remove the icon that I don't like because the gear icon is what I want from another fontconfig file located in /etc/fonts/conf.d/10-nerd-font-symbols.conf
.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE fontconfig SYSTEM "urn:fontconfig:fonts.dtd">
<fontconfig>
<match target="scan">
<test name="family" compare="contains">
<string>JuliaMono</string>
</test>
<edit name="charset" mode="assign" binding="same">
<minus>
<name>charset</name>
<charset>
<range>
<int>0xe611</int> <!-- -->
<int>0xe615</int> <!-- -->
</range>
</charset>
</minus>
</edit>
</match>
</fontconfig>
<family>JuliaMono,JuliaMono SemiBold</family>
<prefer><family>Symbols Nerd Font</family></prefer>
</alias>
<alias>
<family>JuliaMono,JuliaMono SemiBoldItalic</family>
<prefer><family>Symbols Nerd Font</family></prefer>
</alias>
<alias>
<family>JuliaMono,JuliaMono RegularItalic</family>
<prefer><family>Symbols Nerd Font</family></prefer>
</alias>
<alias>
<family>JuliaMono,JuliaMono LightItalic</family>
<prefer><family>Symbols Nerd Font</family></prefer>
</alias>
<alias>
<family>JuliaMono,JuliaMono Light</family>
<prefer><family>Symbols Nerd Font</family></prefer>
</alias>
<alias>
<family>JuliaMono,JuliaMono MediumItalic</family>
<prefer><family>Symbols Nerd Font</family></prefer>
</alias>
<alias>
<family>JuliaMono,JuliaMono Medium</family>
<prefer><family>Symbols Nerd Font</family></prefer>
</alias>
<alias>
<family>JuliaMono,JuliaMono Bold</family>
<prefer><family>Symbols Nerd Font</family></prefer>
</alias> <alias>
<family>JuliaMono,JuliaMono BoldItalic</family>
<prefer><family>Symbols Nerd Font</family></prefer>
</alias>
<alias>
<family>JuliaMono,JuliaMono ExtraBold</family>
<prefer><family>Symbols Nerd Font</family></prefer>
</alias> <alias>
<family>JuliaMono,JuliaMono ExtraBoldItalic</family>
<prefer><family>Symbols Nerd Font</family></prefer>
</alias> <alias>
<family>JuliaMono</family>
<prefer><family>Symbols Nerd Font</family></prefer>
Alacritty is expected to show the gear icon from the Symbols Nerd Font from my fontconfig
Alacritty is showing the icon from JuliaMono instead even if I explicitly did the minus-charset option to force font-fallback to Symbols Nerd Font.
To check if another terminal respects the fontconfig I have, I use foot
.
As you can see in the screenshot below, alacritty
(left) did not seem to respect the minus-charset option I have but foot
(right) did. Thus, the gear icon from Symbols Nerd Font
shows correctly in foot.
# Configuration for Alacritty, the GPU enhanced terminal emulator.
# Any items in the `env` entry below will be added as
# environment variables. Some entries may override variables
# set by alacritty itself.
env:
# TERM variable
#
# This value is used to set the `$TERM` environment variable for
# each instance of Alacritty. If it is not present, alacritty will
# check the local terminfo database and use 'alacritty' if it is
# available, otherwise 'xterm-256color' is used.
#
TERM: alacritty
WINIT_HIDPI_FACTOR: "0"
window:
opacity: 0.98
# Window dimensions (changes require restart)
#
# Specified in number of columns/lines, not pixels.
# If both are `0`, this setting is ignored.
dimensions:
columns: 85
lines: 28
# Window padding (changes require restart)
#
# Blank space added around the window in pixels. This padding is scaled
# by DPI and the specified value is always added at both opposing sides.
padding:
x: 8
y: 8
# Spread additional padding evenly around the terminal content.
dynamic_padding: false
# Window decorations
#
# Values for `decorations`:
# - full: Borders and title bar
# - none: Neither borders nor title bar
# decorations: none
# Window title
#title: Alacritty
# Window class (Linux only):
#class: Alacritty
scrolling:
# Maximum number of lines in the scrollback buffer.
# Specifying '0' will disable scrolling.
history: 100000
# Number of lines the viewport will move for every line scrolled when
# scrollback is enabled (history > 0).
multiplier: 3
# Faux Scrolling
#
# The `faux_multiplier` setting controls the number of lines the terminal
# should scroll when the alternate screen buffer is active. This is used
# to allow mouse scrolling for applications like `man`.
#
# Specifying `0` will disable faux scrolling.
#faux_multiplier: 3
# Scroll to the bottom when new text is written to the terminal.
# auto_scroll: false
# Spaces per Tab (changes require restart)
#
# This setting defines the width of a tab in cells.
#
# Some applications, like Emacs, rely on knowing about the width of a tab.
# To prevent unexpected behavior in these applications, it's also required to
# change the `it` value in terminfo when altering this setting.
# tabspaces: 8
# Font configuration (changes require restart)
font:
# Normal (roman) font face
normal:
family: JuliaMono
# The `style` can be specified to pick a specific face.
style: Regular
# Bold font face
bold:
family: JuliaMono
# The `style` can be specified to pick a specific face.
style: Bold
# Italic font face
italic:
family: JuliaMono
# The `style` can be specified to pick a specific face.
style: Italic
bold_italic:
family: JuliaMono
# The `style` can be specified to pick a specific face.
style: BoldItalic
# Point size
size: 10
# Offset is the extra space around each character. `offset.y` can be thought of
# as modifying the line spacing, and `offset.x` as modifying the letter spacing.
offset:
x: 0
y: 0
# Glyph offset determines the locations of the glyphs within their cells with
# the default being at the bottom. Increasing `x` moves the glyph to the right,
# increasing `y` moves the glyph upwards.
glyph_offset:
x: 0
y: 0
# # Base16 PaperColor Light - alacritty color config
# # Jon Leopard (http://github.com/jonleopard) based on PaperColor Theme (https://github.com/NLKNguyen/papercolor-theme)
# colors:
# # Default colors
# primary:
# background: '0xffffff'
# foreground: '0x373b41'
# # Colors the cursor will use if `custom_cursor_colors` is true
# cursor:
# text: '0xeeeeee'
# cursor: '0x444444'
# # Normal colors
# normal:
# black: '0x444444'
# red: '0xaf0000'
# green: '0x5f8700'
# yellow: '0xd75f00'
# blue: '0x005f87'
# magenta: '0xd70087'
# cyan: '0x0087af'
# white: '0xbcbcbc'
# # Bright colors
# bright:
# black: '0x444444'
# red: '0xd70000'
# green: '0x008700'
# yellow: '0xd75f00'
# blue: '0x005faf'
# magenta: '0xbcbcbc'
# cyan: '0x444444'
# white: '0xbcbcbc'
colors:
primary:
background: "#1E1E2E" # base
foreground: "#CDD6F4" # text
# Bright and dim foreground colors
dim_foreground: "#CDD6F4" # text
bright_foreground: "#CDD6F4" # text
# Cursor colors
cursor:
text: "#1E1E2E" # base
cursor: "#F5E0DC" # rosewater
vi_mode_cursor:
text: "#1E1E2E" # base
cursor: "#B4BEFE" # lavender
# Search colors
search:
matches:
foreground: "#1E1E2E" # base
background: "#A6ADC8" # subtext0
focused_match:
foreground: "#1E1E2E" # base
background: "#A6E3A1" # green
footer_bar:
foreground: "#1E1E2E" # base
background: "#A6ADC8" # subtext0
# Keyboard regex hints
hints:
start:
foreground: "#1E1E2E" # base
background: "#F9E2AF" # yellow
end:
foreground: "#1E1E2E" # base
background: "#A6ADC8" # subtext0
# Selection colors
selection:
text: "#1E1E2E" # base
background: "#F5E0DC" # rosewater
# Normal colors
normal:
black: "#45475A" # surface1
red: "#F38BA8" # red
green: "#A6E3A1" # green
yellow: "#F9E2AF" # yellow
blue: "#89B4FA" # blue
magenta: "#F5C2E7" # pink
cyan: "#94E2D5" # teal
white: "#BAC2DE" # subtext1
# Bright colors
bright:
black: "#585B70" # surface2
red: "#F38BA8" # red
green: "#A6E3A1" # green
yellow: "#F9E2AF" # yellow
blue: "#89B4FA" # blue
magenta: "#F5C2E7" # pink
cyan: "#94E2D5" # teal
white: "#A6ADC8" # subtext0
# Dim colors
dim:
black: "#45475A" # surface1
red: "#F38BA8" # red
green: "#A6E3A1" # green
yellow: "#F9E2AF" # yellow
blue: "#89B4FA" # blue
magenta: "#F5C2E7" # pink
cyan: "#94E2D5" # teal
white: "#BAC2DE" # subtext1
indexed_colors:
- { index: 16, color: "#FAB387" }
- { index: 17, color: "#F5E0DC" }
# ...
# Visual Bell
# ...
# Visual Bell
#
# Any time the BEL code is received, Alacritty "rings" the visual bell. Once
# rung, the terminal background will be set to white and transition back to the
# default background color. You can control the rate of this transition by
# setting the `duration` property (represented in milliseconds). You can also
# configure the transition function by setting the `animation` property.
#
# Values for `animation`:
# - Ease
# - EaseOut
# - EaseOutSine
# - EaseOutQuad
# - EaseOutCubic
# - EaseOutQuart
# - EaseOutQuint
# - EaseOutExpo
# - EaseOutCirc
# - Linear
#
# Specifying a `duration` of `0` will disable the visual bell.
bell:
animation: EaseOutExpo
duration: 1
color: '0xffffff'
# Background opacity
#
# Window opacity as a floating point number from `0.0` to `1.0`.
# The value `0.0` is completely transparent and `1.0` is opaque.
# Mouse bindings
#
# Available fields:
# - mouse
# - action
# - mods (optional)
#
# Values for `mouse`:
# - Middle
# - Left
# - Right
# - Numeric identifier such as `5`
#
# All available `mods` and `action` values are documented in the key binding
# section.
mouse_bindings:
- { mouse: Middle, action: PasteSelection }
mouse:
# Click settings
#
# The `double_click` and `triple_click` settings control the time
# alacritty should wait for accepting multiple clicks as one double
# or triple click.
double_click: { threshold: 300 }
triple_click: { threshold: 300 }
hide_when_typing: false
hints:
# URL launcher
#
# This program is executed when clicking on a text which is recognized as a URL.
# The URL is always added to the command as the last parameter.
#
# When set to `None`, URL launching will be disabled completely.
#
# Default:
# - (macOS) open
# - (Linux) xdg-open
# - (Windows) explorer
#launcher:
# program: xdg-open
# args: []
# URL modifiers
#
# These are the modifiers that need to be held down for opening URLs when clicking
# on them. The available modifiers are documented in the key binding section.
modifiers: None
selection:
semantic_escape_chars: ",│`|:\"' ()[]{}<>"
# When set to `true`, selected text will be copied to the primary clipboard.
save_to_clipboard: false
# Allow terminal applications to change Alacritty's window title.
dynamic_title: true
cursor:
# Cursor style
#
# Values for `style`:
# - ▇ Block
# - _ Underline
# - | Beam
style: Block
# If this is `true`, the cursor will be rendered as a hollow box when the
# window is not focused.
unfocused_hollow: true
# Live config reload (changes require restart)
live_config_reload: true
# Shell
#
# You can set `shell.program` to the path of your favorite shell, e.g. `/bin/fish`.
# Entries in `shell.args` are passed unmodified as arguments to the shell.
#
# Default:
# - (macOS) /bin/bash --login
# - (Linux) user login shell
# - (Windows) powershell
shell:
program: /usr/bin/zsh
# args:
# - --login
# Startup directory
#
# Directory the shell is started in. If this is unset, or `None`, the working
# directory of the parent process will be used.
working_directory: None
# Windows 10 ConPTY backend (Windows only)
#
# This will enable better color support and may resolve other issues,
# however this API and its implementation is still young and so is
# disabled by default, as stability may not be as good as the winpty
# backend.
#
# Alacritty will fall back to the WinPTY automatically if the ConPTY
# backend cannot be initialized.
enable_experimental_conpty_backend: false
# Send ESC (\x1b) before characters when alt is pressed.
alt_send_esc: true
debug:
# Display the time it takes to redraw each frame.
render_timer: false
# Keep the log file after quitting Alacritty.
persistent_logging: false
# Log level
#
# Values for `log_level`:
# - None
# - Error
# - Warn
# - Info
# - Debug
# - Trace
log_level: Warn
# Print all received window events.
print_events: false
# Record all characters and escape sequences as test data.
ref_test: false
# Key bindings
#
# Key bindings are specified as a list of objects. Each binding will specify a
# key and modifiers required to trigger it, terminal modes where the binding is
# applicable, and what should be done when the key binding fires. It can either
# send a byte sequence to the running application (`chars`), execute a
# predefined action (`action`) or fork and execute a specified command plus
# arguments (`command`).
#
# Bindings are always filled by default, but will be replaced when a new binding
# with the same triggers is defined. To unset a default binding, it can be
# mapped to the `None` action.
#
# Example:
# `- { key: V, mods: Control|Shift, action: Paste }`
#
# Available fields:
# - key
# - mods (optional)
# - chars | action | command (exactly one required)
# - mode (optional)
#
# Values for `key`:
# - `A` -> `Z`
# - `F1` -> `F12`
# - `Key1` -> `Key0`
#
# A full list with available key codes can be found here:
# https://docs.rs/glutin/*/glutin/enum.VirtualKeyCode.html#variants
#
# Instead of using the name of the keys, the `key` field also supports using
# the scancode of the desired key. Scancodes have to be specified as a
# decimal number.
# This command will allow you to display the hex scancodes for certain keys:
# `showkey --scancodes`
#
# Values for `mods`:
# - Command
# - Control
# - Option
# - Super
# - Shift
# - Alt
#
# Multiple `mods` can be combined using `|` like this: `mods: Control|Shift`.
# Whitespace and capitalization is relevant and must match the example.
#
# Values for `chars`:
# The `chars` field writes the specified string to the terminal. This makes
# it possible to pass escape sequences.
# To find escape codes for bindings like `PageUp` ("\x1b[5~"), you can run
# the command `showkey -a` outside of tmux.
# Note that applications use terminfo to map escape sequences back to
# keys. It is therefore required to update the terminfo when
# changing an escape sequence.
#
# Values for `action`:
# - Paste
# - PasteSelection
# - Copy
# - IncreaseFontSize
# - DecreaseFontSize
# - ResetFontSize
# - ScrollPageUp
# - ScrollPageDown
# - ScrollLineUp
# - ScrollLineDown
# - ScrollToTop
# - ScrollToBottom
# - ClearHistory
# - Hide
# - Quit
# - ClearLogNotice
# - SpawnNewInstance
# - ToggleFullscreen
# - None
#
# Values for `action` (macOS only):
# - ToggleSimpleFullscreen: Enters fullscreen without occupying another space
#
# Values for `command`:
# The `command` field must be a map containing a `program` string and
# an `args` array of command line parameter strings.
#
# Example:
# `command: { program: "alacritty", args: ["-e", "vttest"] }`
#
# Values for `mode`:
# - ~AppCursor
# - AppCursor
# - ~AppKeypad
# - AppKeypad
key_bindings:
# (Windows/Linux only)
- { key: V, mods: Control|Shift, action: Paste }
- { key: C, mods: Control|Shift, action: Copy }
- { key: Insert, mods: Shift, action: PasteSelection }
- { key: Key0, mods: Control, action: ResetFontSize }
- { key: Equals, mods: Control, action: IncreaseFontSize }
- { key: Plus, mods: Control, action: IncreaseFontSize }
- { key: Minus, mods: Control, action: DecreaseFontSize }
#- { key: Return, mods: Alt, action: ToggleFullscreen }
- { key: Paste, action: Paste }
- { key: Copy, action: Copy }
- { key: L, mods: Control, action: ClearLogNotice }
- { key: L, mods: Control, chars: "\x0c" }
- { key: Home, mods: Alt, chars: "\x1b[1;3H" }
- { key: Home, chars: "\x1bOH", mode: AppCursor }
- { key: Home, chars: "\x1b[H", mode: ~AppCursor }
- { key: End, mods: Alt, chars: "\x1b[1;3F" }
- { key: End, chars: "\x1bOF", mode: AppCursor }
- { key: End, chars: "\x1b[F", mode: ~AppCursor }
- { key: PageUp, mods: Shift, action: ScrollPageUp, mode: ~Alt }
- { key: PageUp, mods: Shift, chars: "\x1b[5;2~", mode: Alt }
- { key: PageUp, mods: Control, chars: "\x1b[5;5~" }
- { key: PageUp, mods: Alt, chars: "\x1b[5;3~" }
- { key: PageUp, chars: "\x1b[5~" }
- { key: PageDown, mods: Shift, action: ScrollPageDown, mode: ~Alt }
- { key: PageDown, mods: Shift, chars: "\x1b[6;2~", mode: Alt }
- { key: PageDown, mods: Control, chars: "\x1b[6;5~" }
- { key: PageDown, mods: Alt, chars: "\x1b[6;3~" }
- { key: PageDown, chars: "\x1b[6~" }
- { key: Tab, mods: Shift, chars: "\x1b[Z" }
- { key: Back, chars: "\x7f" }
- { key: Back, mods: Alt, chars: "\x1b\x7f" }
- { key: Insert, chars: "\x1b[2~" }
- { key: Delete, chars: "\x1b[3~" }
- { key: Left, mods: Shift, chars: "\x1b[1;2D" }
- { key: Left, mods: Control, chars: "\x1b[1;5D" }
- { key: Left, mods: Alt, chars: "\x1b[1;3D" }
- { key: Left, chars: "\x1b[D", mode: ~AppCursor }
- { key: Left, chars: "\x1bOD", mode: AppCursor }
- { key: Right, mods: Shift, chars: "\x1b[1;2C" }
- { key: Right, mods: Control, chars: "\x1b[1;5C" }
- { key: Right, mods: Alt, chars: "\x1b[1;3C" }
- { key: Right, chars: "\x1b[C", mode: ~AppCursor }
- { key: Right, chars: "\x1bOC", mode: AppCursor }
- { key: Up, mods: Shift, chars: "\x1b[1;2A" }
- { key: Up, mods: Control, chars: "\x1b[1;5A" }
- { key: Up, mods: Alt, chars: "\x1b[1;3A" }
- { key: Up, chars: "\x1b[A", mode: ~AppCursor }
- { key: Up, chars: "\x1bOA", mode: AppCursor }
- { key: Down, mods: Shift, chars: "\x1b[1;2B" }
- { key: Down, mods: Control, chars: "\x1b[1;5B" }
- { key: Down, mods: Alt, chars: "\x1b[1;3B" }
- { key: Down, chars: "\x1b[B", mode: ~AppCursor }
- { key: Down, chars: "\x1bOB", mode: AppCursor }
- { key: F1, chars: "\x1bOP" }
- { key: F2, chars: "\x1bOQ" }
- { key: F3, chars: "\x1bOR" }
- { key: F4, chars: "\x1bOS" }
- { key: F5, chars: "\x1b[15~" }
- { key: F6, chars: "\x1b[17~" }
- { key: F7, chars: "\x1b[18~" }
- { key: F8, chars: "\x1b[19~" }
- { key: F9, chars: "\x1b[20~" }
- { key: F10, chars: "\x1b[21~" }
- { key: F11, chars: "\x1b[23~" }
- { key: F12, chars: "\x1b[24~" }
- { key: F1, mods: Shift, chars: "\x1b[1;2P" }
- { key: F2, mods: Shift, chars: "\x1b[1;2Q" }
- { key: F3, mods: Shift, chars: "\x1b[1;2R" }
- { key: F4, mods: Shift, chars: "\x1b[1;2S" }
- { key: F5, mods: Shift, chars: "\x1b[15;2~" }
- { key: F6, mods: Shift, chars: "\x1b[17;2~" }
- { key: F7, mods: Shift, chars: "\x1b[18;2~" }
- { key: F8, mods: Shift, chars: "\x1b[19;2~" }
- { key: F9, mods: Shift, chars: "\x1b[20;2~" }
- { key: F10, mods: Shift, chars: "\x1b[21;2~" }
- { key: F11, mods: Shift, chars: "\x1b[23;2~" }
- { key: F12, mods: Shift, chars: "\x1b[24;2~" }
- { key: F1, mods: Control, chars: "\x1b[1;5P" }
- { key: F2, mods: Control, chars: "\x1b[1;5Q" }
- { key: F3, mods: Control, chars: "\x1b[1;5R" }
- { key: F4, mods: Control, chars: "\x1b[1;5S" }
- { key: F5, mods: Control, chars: "\x1b[15;5~" }
- { key: F6, mods: Control, chars: "\x1b[17;5~" }
- { key: F7, mods: Control, chars: "\x1b[18;5~" }
- { key: F8, mods: Control, chars: "\x1b[19;5~" }
- { key: F9, mods: Control, chars: "\x1b[20;5~" }
- { key: F10, mods: Control, chars: "\x1b[21;5~" }
- { key: F11, mods: Control, chars: "\x1b[23;5~" }
- { key: F12, mods: Control, chars: "\x1b[24;5~" }
- { key: F1, mods: Alt, chars: "\x1b[1;6P" }
- { key: F2, mods: Alt, chars: "\x1b[1;6Q" }
- { key: F3, mods: Alt, chars: "\x1b[1;6R" }
- { key: F4, mods: Alt, chars: "\x1b[1;6S" }
- { key: F5, mods: Alt, chars: "\x1b[15;6~" }
- { key: F6, mods: Alt, chars: "\x1b[17;6~" }
- { key: F7, mods: Alt, chars: "\x1b[18;6~" }
- { key: F8, mods: Alt, chars: "\x1b[19;6~" }
- { key: F9, mods: Alt, chars: "\x1b[20;6~" }
- { key: F10, mods: Alt, chars: "\x1b[21;6~" }
- { key: F11, mods: Alt, chars: "\x1b[23;6~" }
- { key: F12, mods: Alt, chars: "\x1b[24;6~" }
- { key: F1, mods: Super, chars: "\x1b[1;3P" }
- { key: F2, mods: Super, chars: "\x1b[1;3Q" }
- { key: F3, mods: Super, chars: "\x1b[1;3R" }
- { key: F4, mods: Super, chars: "\x1b[1;3S" }
- { key: F5, mods: Super, chars: "\x1b[15;3~" }
- { key: F6, mods: Super, chars: "\x1b[17;3~" }
- { key: F7, mods: Super, chars: "\x1b[18;3~" }
- { key: F8, mods: Super, chars: "\x1b[19;3~" }
- { key: F9, mods: Super, chars: "\x1b[20;3~" }
- { key: F10, mods: Super, chars: "\x1b[21;3~" }
- { key: F11, mods: Super, chars: "\x1b[23;3~" }
- { key: F12, mods: Super, chars: "\x1b[24;3~" }
- { key: NumpadEnter, chars: "\n" }
# -*- conf -*-
# shell=$SHELL (if set, otherwise user's default shell from /etc/passwd)
# term=foot (or xterm-256color if built with -Dterminfo=disabled)
login-shell=yes
# app-id=foot
# title=foot
# locked-title=no
term=foot-extra
font=JuliaMono:size=6:style=Regular
# font-bold=<bold variant of regular font>
# font-italic=<italic variant of regular font>
# font-bold-italic=<bold+italic variant of regular font>
# line-height=<font metrics>
letter-spacing=0
# horizontal-letter-offset=0
# vertical-letter-offset=0
# underline-offset=<font metrics>
box-drawings-uses-font-glyphs=no
dpi-aware=yes
# initial-window-size-pixels=700x500 # Or,
# initial-window-size-chars=<COLSxROWS>
# initial-window-mode=windowed
# pad=2x2 # optionally append 'center'
# resize-delay-ms=100
notify=notify-send -a ${app-id} -i ${app-id} ${title} ${body}
# bold-text-in-bright=no
# bell=urgent
# word-delimiters=,│`|:"'()[]{}<>
# selection-target=primary
# workers=<number of logical CPUs>
[bell]
urgent=yes
notify=yes
# command=
# command-focused=no
[scrollback]
# lines=1000
# multiplier=3.0
# indicator-positionrelative
# indicator-format=
[url]
# launch=xdg-open ${url}
# label-letters=sadfjklewcmpgh
# osc8-underline=url-mode
# protocol=http, https, ftp, ftps, file, gemini, gopher
# uri-characters=abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_.,~:;/?#@!$&%*+="'
[cursor]
# style=block
color=1e1e2e f5e0dc
blink=no
# beam-thickness=1.5
# underline-thickness=<font underline thickness>
[mouse]
# hide-when-typing=no
# alternate-scroll-mode=yes
[colors]
alpha=1.0
background=1E1E2E
foreground=d9e0ee
regular0=6e6c7e # black
regular1=f28fad # red
regular2=abe9b3 # green
regular3=fae3b0 # yellow
regular4=96cdfb # blue
regular5=f5c2e7 # magenta
regular6=89dceb # cyan
regular7=d9e0ee # white
bright0=988ba2 # bright black
bright1=f28fad # bright red
bright2=abe9b3 # bright green
bright3=fae3b0 # bright yellow
bright4=96cdfb # bright blue
bright5=f5c2e7 # bright magenta
bright6=89dceb # bright cyan
bright7=d9e0ee # bright white
# 16 = <256-color palette #16>
# ...
# 255 = <256-color palette #255>
selection-foreground=d9e0ee
selection-background=575268
# jump-labels=<regular0> <regular3>
urls=f5e0dc
[csd]
# size=26
# font=<primary font>
# color=<foreground color>
# button-width=26
# button-color=<background color>
# button-minimize-color=<regular4>
# button-maximize-color=<regular2>
# button-close-color=<regular1>
[key-bindings]
# scrollback-up-page=Shift+Page_Up
# scrollback-up-half-page=none
# scrollback-up-line=none
# scrollback-down-page=Shift+Page_Down
# scrollback-down-half-page=none
# scrollback-down-line=none
# clipboard-copy=Control+Shift+c
# clipboard-paste=Control+Shift+v
# primary-paste=Shift+Insert
# search-start=Control+Shift+r
# font-increase=Control+plus Control+equal Control+KP_Add
# font-decrease=Control+minus Control+KP_Subtract
# font-reset=Control+0 Control+KP_0
# spawn-terminal=Control+Shift+n
# minimize=none
# maximize=none
# fullscreen=none
# pipe-visible=[sh -c "xurls | fuzzel | xargs -r firefox"] none
# pipe-scrollback=[sh -c "xurls | fuzzel | xargs -r firefox"] none
# pipe-selected=[xargs -r firefox] none
# show-urls-launch=Control+Shift+u
# show-urls-copy=none
[search-bindings]
# cancel=Control+g Control+c Escape
# commit=Return
# find-prev=Control+r
# find-next=Control+s
# cursor-left=Left Control+b
# cursor-left-word=Control+Left Mod1+b
# cursor-right=Right Control+f
# cursor-right-word=Control+Right Mod1+f
# cursor-home=Home Control+a
# cursor-end=End Control+e
# delete-prev=BackSpace
# delete-prev-word=Mod1+BackSpace Control+BackSpace
# delete-next=Delete
# delete-next-word=Mod1+d Control+Delete
# extend-to-word-boundary=Control+w
# extend-to-next-whitespace=Control+Shift+w
# clipboard-paste=Control+v Control+y
# primary-paste=Shift+Insert
[url-bindings]
# cancel=Control+g Control+c Control+d Escape
# toggle-url-visible=t
[mouse-bindings]
# primary-paste=BTN_MIDDLE
# select-begin=BTN_LEFT
# select-begin-block=Control+BTN_LEFT
# select-extend=BTN_RIGHT
# select-extend-character-wise=Control+BTN_RIGHT
# select-word=BTN_LEFT-2
# select-word-whitespace=Control+BTN_LEFT-2
# select-row=BTN_LEFT-3
Context: https://gitlab.gnome.org/GNOME/gnome-font-viewer/-/merge_requests/49#note_1784619
we're not doing much other than displaying fonts, reading their metadata, and installing them
Hm, yeah, crossfont doesn't support that, but given that it's a thin wrapper over systems API it might be easy to add.
it's similar to what font-kit was aimed to be.
I reported an issue several days ago. Maybe at that time I didn't make myself clear. I guess that the following source blocks cause this issue.
In src/ft/mod.rs :
In my case, the function load_face_with_glyph(...) has never been called. Because in face_for_glyph(...), it always returns early inside the 'if let' block.
In the get_face(...) function, the 'coverage' of the 'Fallbacklist' struct doesn't include the charset of the primary font. So setting the charset property of the first matched font (the primary font) in fonts.conf doesn't work if no fallback is happened.
I was trying to figure out why my font rendering looked incorrect in Alacritty and I finally traced it to the way i set the font smoothing:
defaults -currentHost write -g AppleFontSmoothing 0
I have been doing this for years, and it seems apple allows a string as well as an integer for this.
While I have fixed my problem by storing the value as an integer it might be useful to fix the detection to work the same as in macOS?
Tested fix:
erikolofsson@2844bc8
I've been thorugh a a bit of a rabbit hole today because of a segfault in freetype-rs
. After reading logs and stack traces, it is caused by this crate using a way too low version of freetype-rs
. From what I have gathered, the issue happens with some characters that are blanks.
This is because Face::load_glyph
can populate the slot with valid information, but no bitmap buffer, leaving it empty. However, in C, an empty slice is represented as (null, 0) but this is invalid in rust, causing a panic when trying to load it in crossfont
. Here's the offending code: link.
This issue was fixed in this commit, and later released as version 30.1.
Related issue: #44
This is the changes that make it work
alacritty/alacritty#4616 (comment)
without this change, use_thin_strokes does nothing on macOS 12
can you merge this?
ben@BeniMac2020 crossfont % git diff
diff --git a/src/darwin/mod.rs b/src/darwin/mod.rs
index aded7a7..9a0f84f 100644
--- a/src/darwin/mod.rs
+++ b/src/darwin/mod.rs
@@ -445,10 +445,13 @@ impl Font {
if use_thin_strokes {
cg_context.set_font_smoothing_style(16);
+ cg_context.set_allows_font_smoothing(false);
+ cg_context.set_should_smooth_fonts(false);
+ } else {
+ cg_context.set_allows_font_smoothing(true);
+ cg_context.set_should_smooth_fonts(true);
}
- cg_context.set_allows_font_smoothing(true);
- cg_context.set_should_smooth_fonts(true);
cg_context.set_allows_font_subpixel_quantization(true);
cg_context.set_should_subpixel_quantize_fonts(true);
cg_context.set_allows_font_subpixel_positioning(true);
servo-fontconfig
had its latest release over 2 years ago. It's no longer needed by servo itself and prob wont receive any updates soon. It depends on old crates like freetype-sys 0.13
.
I think we should phase servo-fontconfig
out in favor for other crates.
This would also solve #44
If you install a font after initializing the rasterizer it won't be able to find that font.
I think we can reload fontconfig caches on running match one more time or something like that. Could add a function to reload fontconfig caches as well.
Compiling crossfont with -Z minimal-versions
fails with:
error[E0425]: cannot find function, tuple struct or tuple variant `FT_Set_Default_Properties` in crate `freetype_sys`
--> /home/drakulix/.cargo/registry/src/github.com-1ecc6299db9ec823/crossfont-0.4.0/src/ft/mod.rs:674:27
|
674 | freetype_sys::FT_Set_Default_Properties(library.raw());
| ^^^^^^^^^^^^^^^^^^^^^^^^^ not found in `freetype_sys`
I assume crossfont
needs a higher freetype-rs
version than the minimum specified in the Cargo.toml, because running cargo update -p freetype-sys
fixes the error.
We fail to set proper size metrics for not colored glyphs in colored fonts such as https://www.babelstone.co.uk/Fonts/Shapes.html thus all non colored characters fail to redraw.
How should I lay out a line of arbitrary text using crossfont? I’m a bit confused about how best to combine width
and left
. Is this algorithm roughly correct?
let mut x = 0;
for character in text_to_render.chars() {
let glyph = rasterizer
.get_glyph(GlyphKey {
character,
font_key,
size,
})
.unwrap();
draw_bitmap_at_pos(glyph, (x, -glyph.top));
x += glyph.width + glyph.left;
}
Should the actual position of each glyph on the screen be x + glyph.left
instead of just x
as I have it here?
The algorithm above doesn’t work with any of the monospace fonts I’ve tried; rather than all characters being the same width, characters that would usually have extra space around them just don’t have that space, making them a narrower width than all the other characters.
Note how the six .
s take up less space than the six m
s, when they should be the same width:
In case it matters, I’m running on macOS 11.2.2.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.