Transmit metadata about rendered samples

This commit is contained in:
Kovid Goyal
2024-05-13 22:27:33 +05:30
parent 880078cab8
commit fc72f4961e
4 changed files with 49 additions and 22 deletions

View File

@@ -11,7 +11,16 @@ from kitty.cli import create_default_opts
from kitty.conf.utils import to_color
from kitty.constants import kitten_exe
from kitty.fonts import Descriptor
from kitty.fonts.common import face_from_descriptor, get_font_files, get_variable_data_for_descriptor, spec_for_descriptor
from kitty.fonts.common import (
face_from_descriptor,
get_axis_map,
get_font_files,
get_named_style,
get_variable_data_for_descriptor,
get_variable_data_for_face,
is_variable,
spec_for_descriptor,
)
from kitty.fonts.list import create_family_groups
from kitty.fonts.render import display_bitmap
from kitty.options.types import Options
@@ -65,21 +74,32 @@ def opts_from_cmd(cmd: Dict[str, Any]) -> Tuple[Options, FamilyKey, float, float
BaseKey = Tuple[FamilyKey, int, int]
FaceKey = Tuple[str, BaseKey]
RenderedSample = Tuple[bytes, Dict[str, Any]]
RenderedSampleTransmit = Dict[str, Any]
SAMPLE_TEXT = string.ascii_lowercase + ' ' + string.digits + ' ' + string.ascii_uppercase + ' ' + string.punctuation
def render_face_sample(font: Descriptor, opts: Options, dpi_x: float, dpi_y: float, width: int, height: int) -> bytes:
def render_face_sample(font: Descriptor, opts: Options, dpi_x: float, dpi_y: float, width: int, height: int) -> RenderedSample:
face = face_from_descriptor(font)
face.set_size(opts.font_size, dpi_x, dpi_y)
return face.render_sample_text(SAMPLE_TEXT, width, height, opts.foreground.rgb)
metadata = {
'variable_data': get_variable_data_for_face(face),
'style': font['style'],
}
if is_variable(font):
ns = get_named_style(face)
if ns:
metadata['variable_named_style'] = ns
metadata['variable_axis_map'] = get_axis_map(face)
return face.render_sample_text(SAMPLE_TEXT, width, height, opts.foreground.rgb), metadata
def render_family_sample(
opts: Options, family_key: FamilyKey, dpi_x: float, dpi_y: float, width: int, height: int, output_dir: str,
cache: Dict[FaceKey, str]
) -> Dict[str, str]:
cache: Dict[FaceKey, RenderedSampleTransmit]
) -> Dict[str, RenderedSampleTransmit]:
base_key: BaseKey = family_key, width, height
ans: Dict[str, str] = {}
ans: Dict[str, RenderedSampleTransmit] = {}
font_files = get_font_files(opts)
for x in family_key:
key: FaceKey = getattr(opts, x).created_from_string, base_key
@@ -96,9 +116,10 @@ def render_family_sample(
ans[x] = cached
else:
with tempfile.NamedTemporaryFile(delete=False, suffix='.rgba', dir=output_dir) as tf:
bitmap = render_face_sample(desc, opts, dpi_x, dpi_y, width, height)
bitmap, metadata = render_face_sample(desc, opts, dpi_x, dpi_y, width, height)
tf.write(bitmap)
cache[key] = ans[x] = tf.name
metadata['path'] = tf.name
cache[key] = ans[x] = metadata
return ans
@@ -119,7 +140,7 @@ def resolved_faces(opts: Options) -> Dict[OptNames, ResolvedFace]:
def main() -> None:
cache: Dict[FaceKey, str] = {}
cache: Dict[FaceKey, RenderedSampleTransmit] = {}
for line in sys.stdin.buffer:
cmd = json.loads(line)
action = cmd.get('action', '')
@@ -160,5 +181,5 @@ def showcase(family: str) -> None:
ss = screen_size_function()()
width = ss.cell_width * ss.cols
height = 5 * ss.cell_height
bitmap = render_face_sample(desc, opts, float(q['dpi_x']), float(q['dpi_y']), width, height)
bitmap = render_face_sample(desc, opts, float(q['dpi_x']), float(q['dpi_y']), width, height)[0]
display_bitmap(bitmap, width, height)

View File

@@ -25,7 +25,7 @@ type faces struct {
family string
settings faces_settings
preview_cache map[faces_preview_key]map[string]string
preview_cache map[faces_preview_key]map[string]RenderedSampleTransmit
preview_cache_mutex sync.Mutex
}
@@ -48,12 +48,11 @@ func (self *faces) draw_screen() (err error) {
key := faces_preview_key{settings: self.settings, width: int(sz.WidthCells * sz.CellWidth), height: int(sz.CellHeight) * num_lines}
self.preview_cache_mutex.Lock()
defer self.preview_cache_mutex.Unlock()
previews := self.preview_cache[key]
if previews == nil {
self.preview_cache[key] = make(map[string]string)
self.preview_cache[key]["in_flight"] = "yes"
previews, found := self.preview_cache[key]
if !found {
self.preview_cache[key] = make(map[string]RenderedSampleTransmit)
go func() {
var r map[string]string
var r map[string]RenderedSampleTransmit
s := key.settings
self.handler.set_worker_error(kitty_font_backend.query("render_family_samples", map[string]any{
"text_style": self.handler.text_style, "font_family": s.font_family,
@@ -62,13 +61,12 @@ func (self *faces) draw_screen() (err error) {
}, &r))
self.preview_cache_mutex.Lock()
defer self.preview_cache_mutex.Unlock()
r["in_flight"] = "no"
self.preview_cache[key] = r
self.handler.lp.WakeupMainThread()
}()
return
}
if previews["in_flight"] == "yes" {
if len(previews) < 4 {
return
}
@@ -82,7 +80,7 @@ func (self *faces) draw_screen() (err error) {
lp.QueueWriteString(str)
if y+num_lines < int(sz.HeightCells) {
lp.MoveCursorTo(1, y+1)
self.handler.graphics_manager.display_image(slot, previews[setting], key.width, key.height)
self.handler.graphics_manager.display_image(slot, previews[setting].Path, key.width, key.height)
slot++
y += num_lines + 1
}
@@ -97,7 +95,7 @@ func (self *faces) draw_screen() (err error) {
func (self *faces) initialize(h *handler) (err error) {
self.handler = h
self.preview_cache = make(map[faces_preview_key]map[string]string)
self.preview_cache = make(map[faces_preview_key]map[string]RenderedSampleTransmit)
return
}

View File

@@ -142,14 +142,14 @@ func (self *FontList) draw_preview(x, y int, sz loop.ScreenSize) (err error) {
case "":
self.preview_cache[key] = "requested"
go func() {
var r map[string]string
var r map[string]RenderedSampleTransmit
self.handler.set_worker_error(kitty_font_backend.query("render_family_samples", map[string]any{
"text_style": self.handler.text_style, "font_family": key.family, "width": key.width, "height": key.height,
"output_dir": self.handler.temp_dir,
}, &r))
self.preview_cache_mutex.Lock()
defer self.preview_cache_mutex.Unlock()
self.preview_cache[key] = r["font_family"]
self.preview_cache[key] = r["font_family"].Path
self.handler.lp.WakeupMainThread()
}()
return

View File

@@ -86,6 +86,14 @@ type ListResult struct {
Resolved_faces ResolvedFaces `json:"resolved_faces"`
}
type RenderedSampleTransmit struct {
Path string `json:"path"`
Variable_data VariableData `json:"variable_data"`
Style string `json:"style"`
Variable_named_style NamedStyle `json:"variable_named_style"`
Variable_axis_map map[string]float64 `json:"variable_axis_map"`
}
var variable_data_cache map[string]VariableData
var variable_data_cache_mutex sync.Mutex