mirror of
https://github.com/ghostty-org/ghostty.git
synced 2025-07-16 00:36:07 +03:00
font/shaper: work on new grid APIs
This commit is contained in:
@ -232,7 +232,24 @@ pub const Shaper = struct {
|
|||||||
// Get our font. We have to apply the font features we want for
|
// Get our font. We have to apply the font features we want for
|
||||||
// the font here.
|
// the font here.
|
||||||
const run_font: *macos.text.Font = font: {
|
const run_font: *macos.text.Font = font: {
|
||||||
const face = try run.group.group.faceFromIndex(run.font_index);
|
// The CoreText shaper relies on CoreText and CoreText claims
|
||||||
|
// that CTFonts are threadsafe. See:
|
||||||
|
// https://developer.apple.com/documentation/coretext/
|
||||||
|
//
|
||||||
|
// Quote:
|
||||||
|
// All individual functions in Core Text are thread-safe. Font
|
||||||
|
// objects (CTFont, CTFontDescriptor, and associated objects) can
|
||||||
|
// be used simultaneously by multiple operations, work queues, or
|
||||||
|
// threads. However, the layout objects (CTTypesetter,
|
||||||
|
// CTFramesetter, CTRun, CTLine, CTFrame, and associated objects)
|
||||||
|
// should be used in a single operation, work queue, or thread.
|
||||||
|
//
|
||||||
|
// Because of this, we only acquire the read lock to grab the
|
||||||
|
// face and set it up, then release it.
|
||||||
|
run.grid.lock.lockShared();
|
||||||
|
defer run.grid.lock.unlockShared();
|
||||||
|
|
||||||
|
const face = try run.grid.resolver.collection.getFace(run.font_index);
|
||||||
const original = face.font;
|
const original = face.font;
|
||||||
|
|
||||||
const attrs = try self.features.attrsDict(face.quirks_disable_default_font_features);
|
const attrs = try self.features.attrsDict(face.quirks_disable_default_font_features);
|
||||||
|
@ -174,7 +174,7 @@ pub const RunIterator = struct {
|
|||||||
|
|
||||||
// Otherwise we need a fallback character. Prefer the
|
// Otherwise we need a fallback character. Prefer the
|
||||||
// official replacement character.
|
// official replacement character.
|
||||||
if (try self.group.indexForCodepoint(
|
if (try self.grid.getIndex(
|
||||||
alloc,
|
alloc,
|
||||||
0xFFFD, // replacement char
|
0xFFFD, // replacement char
|
||||||
font_style,
|
font_style,
|
||||||
@ -182,7 +182,7 @@ pub const RunIterator = struct {
|
|||||||
)) |idx| break :font_info .{ .idx = idx, .fallback = 0xFFFD };
|
)) |idx| break :font_info .{ .idx = idx, .fallback = 0xFFFD };
|
||||||
|
|
||||||
// Fallback to space
|
// Fallback to space
|
||||||
if (try self.group.indexForCodepoint(
|
if (try self.grid.getIndex(
|
||||||
alloc,
|
alloc,
|
||||||
' ',
|
' ',
|
||||||
font_style,
|
font_style,
|
||||||
@ -251,7 +251,7 @@ pub const RunIterator = struct {
|
|||||||
) !?font.Collection.Index {
|
) !?font.Collection.Index {
|
||||||
// Get the font index for the primary codepoint.
|
// Get the font index for the primary codepoint.
|
||||||
const primary_cp: u32 = if (cell.isEmpty() or cell.codepoint() == 0) ' ' else cell.codepoint();
|
const primary_cp: u32 = if (cell.isEmpty() or cell.codepoint() == 0) ' ' else cell.codepoint();
|
||||||
const primary = try self.group.indexForCodepoint(
|
const primary = try self.grid.getIndex(
|
||||||
alloc,
|
alloc,
|
||||||
primary_cp,
|
primary_cp,
|
||||||
style,
|
style,
|
||||||
@ -275,7 +275,7 @@ pub const RunIterator = struct {
|
|||||||
|
|
||||||
// Find a font that supports this codepoint. If none support this
|
// Find a font that supports this codepoint. If none support this
|
||||||
// then the whole grapheme can't be rendered so we return null.
|
// then the whole grapheme can't be rendered so we return null.
|
||||||
const idx = try self.group.indexForCodepoint(
|
const idx = try self.grid.getIndex(
|
||||||
alloc,
|
alloc,
|
||||||
cp,
|
cp,
|
||||||
style,
|
style,
|
||||||
@ -286,11 +286,11 @@ pub const RunIterator = struct {
|
|||||||
|
|
||||||
// We need to find a candidate that has ALL of our codepoints
|
// We need to find a candidate that has ALL of our codepoints
|
||||||
for (candidates.items) |idx| {
|
for (candidates.items) |idx| {
|
||||||
if (!self.group.group.hasCodepoint(idx, primary_cp, presentation)) continue;
|
if (!self.grid.hasCodepoint(idx, primary_cp, presentation)) continue;
|
||||||
for (cps) |cp| {
|
for (cps) |cp| {
|
||||||
// Ignore Emoji ZWJs
|
// Ignore Emoji ZWJs
|
||||||
if (cp == 0xFE0E or cp == 0xFE0F or cp == 0x200D) continue;
|
if (cp == 0xFE0E or cp == 0xFE0F or cp == 0x200D) continue;
|
||||||
if (!self.group.group.hasCodepoint(idx, cp, presentation)) break;
|
if (!self.grid.hasCodepoint(idx, cp, presentation)) break;
|
||||||
} else {
|
} else {
|
||||||
// If the while completed, then we have a candidate that
|
// If the while completed, then we have a candidate that
|
||||||
// supports all of our codepoints.
|
// supports all of our codepoints.
|
||||||
|
Reference in New Issue
Block a user