אפשרויות נוספות של גופנים בגופן משתנה של גופן מערכת ב-macOS ב-Chromium 83

Catalina כוללת משתנה מאוחד של גופן מערכת ב-macOS.

אדם ארגייל
אדם ארגייל
דומיניק רוטשס
דומיניק רוטצ'ס

הקטע'system-ui' במפרט של מודול גופני CSS ברמה 4 מגדיר מילת מפתח של גופן system-ui שמאפשרת למפתחים להשתמש בגופן של מערכת ההפעלה המובנה, המותאם לטורבו, מותאם לשוק המקומי, באיכות גבוהה וללא צורך בהורדה, ישירות באתרים ובאפליקציות שלהם.

body {
  font-family: system-ui;
}

בחירת הטיפוגרפיה דומה להצהרה: "יש להשתמש בגופן ברירת המחדל של המערכת עבור הלוקאל הנוכחי של המשתמש הזה".

ב-macOS, הגופן system-ui הוא סן פרנסיסקו, גופן שצוות העיצוב בדק, בדק ו... שדרג לאחרונה! קודם כול נלמד על התכונות החדשות והמלהיבות של הגופנים בקטלינה, ואז נדון בכמה באגים ואיך מהנדסי Chromium פתרו אותם.

בפוסט הזה אנחנו מניחים שאתם כבר מכירים גופנים משתנים. אם לא, מומלץ לצפות בסרטון מבוא לגופנים משתנים באינטרנט ולצפות בסרטון שבהמשך.

תאימות דפדפן

נכון מועד כתיבת ההודעה, system-ui קיבלה תמיכה מ-Chromium (מאז 56), מ-Edge (מאז 79), מ-Safari (מ-11) ומ-Firefox (מאז 43) אך עם מילת המפתח -apple-system. לעדכונים, אפשר לעיין במאמר האם אפשר להשתמש בגופנים משתנים?.

כוחות חדשים

היכולות החדשות שקטלינה הוסיפה לגופן של המערכת זמינות עכשיו למפתחי אתרים החל מגרסה 83 של Chromium. לגופן system-ui יש עכשיו יותר הגדרות משתנות: שינוי גודל אופטי ו-2 התאמות משקל ייחודיות:

Mojave
h1 {
  font-family: system-ui;
  font-weight: 700;
  font-variation-settings:
    'wght' 750
  ;
}

Catalina
h1 {
  font-family: system-ui;
  font-weight: 700;
  font-variation-settings:
    'wght' 750,
    'opsz' 20,
    'GRAD' 400,
    'YAXS' 400
  ;
}

ב-Mojave, system-ui הוא גופן משתנה עם הגדרות של wght בלבד. המילה system-ui ב-Catalina היא גופן משתנה עם הגדרות של wght, opsz, GRAD ו-YAXS.

נראה קיבלתי כמה הזדמנויות מגניבות לעיצוב מתקדם! אם תרצו, תוכלו להתעמק בדקויות של גופן המערכת.

wght

ניתן להגדיר משקל גופן בין 0 ל-900 ולהחיל אותו באופן שווה על כל התווים.

/* 0-900 */
font-variation-settings: 'wght' 750;

opsz

הגודל האופטי דומה לצימוד או לריווח בין אותיות, אך הריווח מתבצע על ידי עין אנושית במקום במתמטיקה. ערך של 19 ומטה מיועד לריווח של טקסט וגוף. הערך 20 ומעלה מיועד לריווח בין כותרות לתצוגה וכותרות.

/* 19 or 20 */
font-variation-settings: 'opsz' 20;

GRAD

דומה למשקל, אך ללא מגע בריווח האופקי. אפשר להזין בו ערכים בין 400 ל-1000.

/* 400-1000 */
font-variation-settings: 'GRAD' 500;

YAXS

מותחת את הגליף אנכית. אפשר להזין בו ערכים בין 400 ל-1000.

/* 400-1000 */
font-variation-settings: 'YAXS' 500;

שילוב האפשרויות

באמצעות כמה שורות של CSS, נוכל לשנות את הגדרות הגופן לטקסט מודגש לבחירתנו, או לנסות שילובים מעניינים אחרים:

font-weight: 700;
font-weight: bold;
font-variation-settings: 'wght' 750, 'YAXS' 600, 'GRAD' 500, 'opsz' 20;

וממש כך, משתמשי Chromium ב-macOS רואים את משקל 750 המשודרג המותאם אישית שלך עם כמה שינויים כיפיים נוספים 👍

מגרש משחקים

כדי לקבל עותק שניתן לעריכה של התקלה, צריך ללחוץ על רמיקס לעריכה בגליץ' שלמטה ואז לערוך את אפשרויות font-variation-settings החדשות כדי לראות איך זה משפיע על הגופן. חשוב לזכור שהגליץ' הזה יפעל רק אם משתמשים במכשיר macOS Catalina.

ב-macOS 10.15 נוספו תכונות חדשות לגופן של המערכת, וב-macOS 10.15 נרשם באג מסובך של system-ui בכלי המעקב אחר באגים ב-Chromium. תוהה אם יש קשר ביניהם!

נספח: הרגרסיה system-ui

הכתבה הזו מתחילה בבאג אחר: #1005969. הבעיה דווחה ב-macOS 10.15 כי המרווח בין הגופנים system-ui נראה צר ודחוס.

השוואה של שתי פסקאות מדף קבוצה ב-Facebook. בצד שמאל נמצא Chrome ובצד ימין מוצג Safari, ו-Chrome עדין, אבל קצת יותר צר מבחינת הריווח
Chrome בצד שמאל (המעקב קפדני יותר), Safari מצד ימין (ריווח אופטי יותר טוב)

רקע

האם שמת לב אי פעם ב-macOS 10.14 איך הפסקאות או הכותרות שלך "השתנו" לגופן בעל מראה שונה כשהגודל עלה או הופחת?

ב-Mojave (macOS 10.14), הגופן system-ui השתנה בין שני גופנים בהתאם לגודל גופן היעד. כשהטקסט היה מתחת ל-20px, מערכת macOS השתמשה ב "טקסט של סן פרנסיסקו". כשהטקסט היה 20px ומעלה, מערכת macOS השתמשה ב'תצוגת סן פרנסיסקו'. גודל אופטי נבנה באופן סטטי בשני גופנים נפרדים.

Catalina (macOS 10.15) שלחה גופן משתנה מאוחד חדש לסן פרנסיסקו. אין יותר צורך לנהל את ה "טקסט" ו "התצוגה". היא גם הוסיפה את הגדרת הווריאציה החדשה opsz שתוארה קודם לכן.

h1 {
  font-variation-settings: 'opsz' 20;
}

לצערנו, ערך ברירת המחדל של opsz בגופן החדש בקטלינה הוא 20, והמהנדסים של Chromium לא היו מוכנים להחיל את opsz על גופן המערכת. כתוצאה מכך, גדלים קטנים יותר הוצגו בצורה צרה מדי.

כדי לפתור את הבעיה, Chromium היה צריך להחיל opsz בצורה נכונה על גופן המערכת. כתוצאה מכך, תיקנו את בעיה מס' 1005969. ניצחון! או אולי...?

עוד לא בוצע

כאן זה הסתבך: Chromium החיל את opsz אבל משהו לא נראה כמו שצריך. בגופני מערכת ב-Mac יש טבלת גופנים נוספת שנקראת trak, שמשנה את המרווח האופקי. בזמן העבודה על התיקון, מהנדסי Chromium הבחינו בכך שב-macOS, במהלך אחזור מדדים אופקיים מאובייקט CTFontRef, המדדים של trak כבר נלקחו בחשבון בתוצאות המדדים. לספריית העיצוב HarfBuzz של Chromium נדרשים מדדים שבהם הערכים של trak עדיין לא נלקחים בחשבון.

הצגת ממשק משתמש של המערכת וכל משקל הגופן שלו והוריאציות שלו ברשימה. לחצי מהיחידות לא הוחלו הבדלים במשקל.
שמאל: משקולות מודגשות הוחלו על גופנים בגודל 19 ומטה. ימין: גופן בגודל 20 ומעלה יאבד עיצוב מודגש

בתוך Skia (ספריית הגרפיקה, לא בגופן של אותו השם) נעשה שימוש גם במחלקה CGFontRef של CoreGraphics וגם במחלקה CTFontRef מ-CoreText. בגלל ההמרות הפנימיות הנדרשות בין האובייקטים האלה (המשמשות לשמירה על תאימות לאחור וגישה לממשקי ה-API הנחוצים בשתי המחלקות), Skia יאבד מידע במשקל בנסיבות מסוימות וגופנים מודגשים יפסיקו לפעול. המעקב אחרי הפסילה בוצע בגיליון מס' 1057654.

Skia עדיין צריכה לתמוך ב-macOS 10.11 כי Chromium עדיין תומך בה. ב-10.11 הגופנים "טקסט סן פרנסיסקו" ו"תצוגת סן פרנסיסקו" לא היו אפילו גופנים משתנים. למעשה, כל אחת מהן הייתה משפחה של גופנים נפרדים לכל משקל זמין. בשלב מסוים מזהי הגליפים שלהם לא סונכרנו זה עם זה. אם סקיה הייתה מעצבת את הטקסט (ממירה את הטקסט לגליפים שניתן לצייר) באמצעות "טקסט של סן פרנסיסקו", היא תהיה כתובה בג'יבריש אם היא תצייר את "תצוגת סן פרנסיסקו", ולהפך. גם אם Skia רק ביקשה מכם גודל macOS אחר, יכול להיות שתעברו למכשיר השני. אמורה להיות אפשרות להשתמש תמיד באחד מהגופנים ורק לשנות את קנה המידה (באמצעות מטריצה כדי להגדיל אותו במקום לבקש גודל גדול יותר). עם זאת, ב-CoreText יש בעיה שבה לא ניתן לשנות את קנה המידה של sbix (אמוג'י צבעוני) באמצעות גליף למעלה (רק למטה). זה קצת יותר מורכב מזה. נראה ש-CoreText למעשה מגביל את הגודל האנכי לאחר השימוש במטריצה, וזה קשור לכך שאין לצייר אמוג'י בזוויות של 45 מעלות. בכל מקרה, אם אתם רוצים שהאמוג'י יוצג בגדול, תצטרכו ליצור עותק של הגופן כדי לקבל גרסה גדולה שלו.

לכן, כדי ליצור עותקים של CTFont אובייקטים בגדלים שונים באופן פנימי ולוודא שמשתמשים באותם נתוני גופנים בסיסיים, Chromium משך את CGFont מה-CTFont, ואז יצר CTFont חדש מה-CGFont (CGFont אובייקטים לא תלויים בגודל, שינוי הקסם מתרחש ברמת CoreText). זה פעל בצורה תקינה עד 10.154. ביחס לשיעור 10.15, סיבוב הלוך ושוב הזה איבד יותר מדי מידע, וכתוצאה מכך קיימת בעיית המשקל. ב-Flubr זיהו את בעיית המשקל ויצרנו פתרון חלופי לשינוי הגודל כדי ליצור את CTFont החדש ישירות מה-CTFont המקורי, תוך שליטה ישירה בגודל האופטי באמצעות מאפיין ישן שאינו מתועד ב-CoreText. הפעולה הזו גורמת לשיבושים בגרסה 10.11 ולפתור בעיות אחרות (למשל, הגדרה מפורשת של הגודל האופטי לערך ברירת המחדל).

עם זאת, כך נשמר יותר מה 'קסם' של CoreText בגופן. נראה שאחת מהאפשרויות האלה היא שיפור בהתקדמות של הגליף בדרך כלשהי מלבד הטבלה trak (ביישום שלה Chromium כבר ניסה להסתיר דרך מאפיין נוסף שאינו מתועד).

CGFont לא מבצע 'קסם' כזה, אז אולי Chromium יוכל לקבל הנחה של CGFont על CTFont ולהשתמש בו כדי להשיג התקדמות? לצערנו, זה לא עובד כי ידוע ש-CoreText "הדביקה" עם גופנים גם בדרכים אחרות. לדוגמה, אמוג'י קטנים יכולים להיות גדולים קצת יותר ממה שביקשת בפועל (ומגדילים קצת את הגודל). אפליקציית CGFont לא יודעת על זה, כך שבסופו של דבר האמוג'י שלך מבוסס sbix קרוב מדי אחד לשני, כי המדידה תהיה בגודל אחד, אבל CoreText ימשוך אותם במידה מסוימת. Chromium כן רוצה את ההתקדמות ב-CTFont, אבל הוא רוצה להשתמש בהן ללא מעקב, ועדיף שלא יהיה צורך להתעסק.

מאחר שהתיקון לבעיית הריווח דרש קבוצה של תיקוני Blink ו-Skia המחוברים ביניהם, מהנדסי Chromium לא יכלו "פשוט לחזור לגרסה קודמת" כדי לתקן את הבעיה. מהנדסי Chromium ניסו גם להשתמש בסימון build שונה לשינוי נתיב קוד שקשור לגופנים ב-Skia, תיקון הבעיה של הגופנים המודגשים, אבל בעיית הריווח בוטלה.

התיקון

בסוף, כמובן ש-Chromium רצה לתקן את שני הדברים האלה. Chromium משתמש כעת בפונקציות מובנות של גופני OpenType בגופנים מסוג HarfPop כדי לאחזר מדדים אופקיים ישירות מהנתונים הבינאריים בטבלאות הגופנים של המערכת. במצב הזה, Chromium מחליף את CoreText ו-Skia אם בגופן יש טבלת trak (אלא אם זה גופן האמוג'י).

הצגת ממשק משתמש של המערכת וכל משקל הגופן שלו והוריאציות שלו ברשימה. החלק הקודם שלא עבד נראה נהדר עכשיו.

בינתיים, עדיין יש Skia Issue #10123 כדי לעקוב אחרי פתרון הבעיה באופן מלא ב-Skia, ולחזור להשתמש ב-Skia כדי לאחזר משם את מדדי הגופנים של המערכת, במקום התיקון הנוכחי שמתבצע דרך HarfBuzz.