From 2ddf95bd70ba0742ed0f508ab5ec5dae600db8dc Mon Sep 17 00:00:00 2001 From: Patrick Walton Date: Wed, 9 Aug 2017 15:36:41 -0700 Subject: [PATCH] Initial work on the font renderer component --- .gitignore | 4 +- demo/server/Cargo.toml | 6 + demo/server/src/main.rs | 3 + font-renderer/Cargo.toml | 12 + .../resources/tests/nimbus-sans/COPYING | 340 ++++++++++++++++++ .../tests/nimbus-sans/NimbusSanL-Regu.ttf | Bin 0 -> 106572 bytes .../resources/tests/nimbus-sans/README | 51 +++ font-renderer/src/lib.rs | 224 ++++++++++++ font-renderer/src/tests.rs | 36 ++ 9 files changed, 675 insertions(+), 1 deletion(-) create mode 100644 demo/server/Cargo.toml create mode 100644 demo/server/src/main.rs create mode 100644 font-renderer/Cargo.toml create mode 100644 font-renderer/resources/tests/nimbus-sans/COPYING create mode 100644 font-renderer/resources/tests/nimbus-sans/NimbusSanL-Regu.ttf create mode 100644 font-renderer/resources/tests/nimbus-sans/README create mode 100644 font-renderer/src/lib.rs create mode 100644 font-renderer/src/tests.rs diff --git a/.gitignore b/.gitignore index 8411c94f..f260509b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,9 @@ -/target +/font-renderer/target +/partitioner/target Cargo.lock # Editors +*.swp # IntelliJ .idea diff --git a/demo/server/Cargo.toml b/demo/server/Cargo.toml new file mode 100644 index 00000000..9f3a4127 --- /dev/null +++ b/demo/server/Cargo.toml @@ -0,0 +1,6 @@ +[package] +name = "pathfinder_server" +version = "0.1.0" +authors = ["Patrick Walton "] + +[dependencies] diff --git a/demo/server/src/main.rs b/demo/server/src/main.rs new file mode 100644 index 00000000..e7a11a96 --- /dev/null +++ b/demo/server/src/main.rs @@ -0,0 +1,3 @@ +fn main() { + println!("Hello, world!"); +} diff --git a/font-renderer/Cargo.toml b/font-renderer/Cargo.toml new file mode 100644 index 00000000..76ef30b7 --- /dev/null +++ b/font-renderer/Cargo.toml @@ -0,0 +1,12 @@ +[package] +name = "pathfinder_font_renderer" +version = "0.1.0" +authors = ["Patrick Walton "] + +[dependencies] +app_units = "0.5" +euclid = "0.15" + +[dependencies.freetype-sys] +git = "https://github.com/pcwalton/freetype-sys.git" +branch = "outline-get-cbox" diff --git a/font-renderer/resources/tests/nimbus-sans/COPYING b/font-renderer/resources/tests/nimbus-sans/COPYING new file mode 100644 index 00000000..d60c31a9 --- /dev/null +++ b/font-renderer/resources/tests/nimbus-sans/COPYING @@ -0,0 +1,340 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. diff --git a/font-renderer/resources/tests/nimbus-sans/NimbusSanL-Regu.ttf b/font-renderer/resources/tests/nimbus-sans/NimbusSanL-Regu.ttf new file mode 100644 index 0000000000000000000000000000000000000000..b0cb40419adae75189a279a1a1aed20fc1b5a94b GIT binary patch literal 106572 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, +} + +impl FontContext { + pub fn new() -> FontContext { + let mut library: FT_Library = ptr::null_mut(); + unsafe { + let result = FT_Init_FreeType(&mut library); + assert!(result == 0, "Unable to initialize FreeType"); + } + FontContext { + library: library, + faces: BTreeMap::new(), + } + } + + pub fn add_font_from_memory(&mut self, font_key: &FontKey, bytes: Vec, font_index: u32) + -> Result<(), ()> { + match self.faces.entry(*font_key) { + Entry::Occupied(_) => Ok(()), + Entry::Vacant(entry) => { + unsafe { + let mut face = Face { + face: ptr::null_mut(), + bytes: bytes, + }; + let result = FT_New_Memory_Face(self.library, + face.bytes.as_ptr(), + face.bytes.len() as FT_Long, + font_index as FT_Long, + &mut face.face); + if result == 0 && !face.face.is_null() { + entry.insert(face); + Ok(()) + } else { + Err(()) + } + } + } + } + } + + pub fn delete_font(&mut self, font_key: &FontKey) { + self.faces.remove(font_key); + } + + pub fn glyph_dimensions(&self, font_instance: &FontInstanceKey, glyph_key: &GlyphKey) + -> Option { + self.load_glyph(font_instance, glyph_key).and_then(|glyph_slot| { + self.glyph_dimensions_from_slot(font_instance, glyph_key, glyph_slot) + }) + } + + fn load_glyph(&self, font_instance: &FontInstanceKey, glyph_key: &GlyphKey) + -> Option { + let face = match self.faces.get(&font_instance.font_key) { + None => return None, + Some(face) => face, + }; + + unsafe { + FT_Set_Char_Size(face.face, font_instance.size.to_ft_f26dot6(), 0, 0, 0); + + if FT_Load_Glyph(face.face, glyph_key.glyph_index as FT_UInt, GLYPH_LOAD_FLAGS) != 0 { + return None + } + + let slot = (*face.face).glyph; + if (*slot).format != FT_GLYPH_FORMAT_OUTLINE { + return None + } + + Some(slot) + } + } + + fn glyph_dimensions_from_slot(&self, + font_instance: &FontInstanceKey, + glyph_key: &GlyphKey, + glyph_slot: FT_GlyphSlot) + -> Option { + unsafe { + let metrics = &(*glyph_slot).metrics; + + // This matches what WebRender does. + if metrics.horiAdvance == 0 { + return None + } + + let bounding_box = self.bounding_box_from_slot(font_instance, glyph_key, glyph_slot); + Some(GlyphDimensions { + origin: Point2D::new((bounding_box.xMin >> 6) as i32, + (bounding_box.yMax >> 6) as i32), + size: Size2D::new(((bounding_box.xMax - bounding_box.xMin) >> 6) as u32, + ((bounding_box.yMax - bounding_box.yMin) >> 6) as u32), + advance: metrics.horiAdvance as f32 / 64.0, + }) + } + } + + // Returns the bounding box for a glyph, accounting for subpixel positioning as appropriate. + // + // TODO(pcwalton): Subpixel positioning. + fn bounding_box_from_slot(&self, _: &FontInstanceKey, _: &GlyphKey, glyph_slot: FT_GlyphSlot) + -> FT_BBox { + let mut bounding_box: FT_BBox; + unsafe { + bounding_box = mem::zeroed(); + FT_Outline_Get_CBox(&(*glyph_slot).outline, &mut bounding_box); + }; + + // Outset the box to device pixel boundaries. This matches what WebRender does. + bounding_box.xMin &= !0x3f; + bounding_box.yMin &= !0x3f; + bounding_box.xMax = (bounding_box.xMax + 0x3f) & !0x3f; + bounding_box.yMax = (bounding_box.yMax + 0x3f) & !0x3f; + + bounding_box + } +} + +#[derive(Clone, Copy, Debug, PartialEq, PartialOrd, Eq, Ord)] +pub struct FontKey { + id: usize, +} + +impl FontKey { + pub fn new() -> FontKey { + static NEXT_FONT_KEY_ID: AtomicUsize = ATOMIC_USIZE_INIT; + FontKey { + id: NEXT_FONT_KEY_ID.fetch_add(1, Ordering::Relaxed), + } + } +} + +#[derive(Clone, Copy, Debug, PartialEq)] +pub struct FontInstanceKey { + pub font_key: FontKey, + pub size: Au, +} + +impl FontInstanceKey { + #[inline] + pub fn new(font_key: &FontKey, size: Au) -> FontInstanceKey { + FontInstanceKey { + font_key: *font_key, + size: size, + } + } +} + +// TODO(pcwalton): Subpixel offsets. +#[derive(Clone, Copy, PartialEq)] +pub struct GlyphKey { + pub glyph_index: u32, +} + +impl GlyphKey { + #[inline] + pub fn new(glyph_index: u32) -> GlyphKey { + GlyphKey { + glyph_index: glyph_index, + } + } +} + +#[repr(C)] +#[derive(Clone, Copy, Debug, PartialEq)] +pub struct GlyphDimensions { + pub origin: Point2D, + pub size: Size2D, + pub advance: f32, +} + +struct Face { + face: FT_Face, + bytes: Vec, +} + +impl Drop for Face { + fn drop(&mut self) { + unsafe { + FT_Done_Face(self.face); + } + } +} + +trait ToFtF26Dot6 { + fn to_ft_f26dot6(&self) -> FT_F26Dot6; +} + +impl ToFtF26Dot6 for Au { + fn to_ft_f26dot6(&self) -> FT_F26Dot6 { + (self.to_f64_px() * 64.0 + 0.5) as FT_F26Dot6 + } +} diff --git a/font-renderer/src/tests.rs b/font-renderer/src/tests.rs new file mode 100644 index 00000000..5788f7db --- /dev/null +++ b/font-renderer/src/tests.rs @@ -0,0 +1,36 @@ +// pathfinder/font-renderer/src/tests.rs + +use app_units::Au; +use euclid::Size2D; +use std::fs::File; +use std::io::Read; +use {FontContext, FontInstanceKey, FontKey, GlyphDimensions, GlyphKey}; + +static TEST_FONT_PATH: &'static str = "resources/tests/nimbus-sans/NimbusSanL-Regu.ttf"; +const TEST_FONT_SIZE: Au = Au(60 * 16); +const TEST_FIRST_GLYPH_INDEX: u32 = 0x1f; + +// Nimbus Sans Regular 16pt., 'A' +const EXPECTED_GLYPH_ORIGIN: [i32; 2] = [1, 12]; +const EXPECTED_GLYPH_SIZE: [u32; 2] = [8, 12]; +const EXPECTED_GLYPH_ADVANCE: f32 = 9.0; + +#[test] +fn test_font_context_glyph_dimensions() { + let mut font_context = FontContext::new(); + + let font_key = FontKey::new(); + let mut bytes = vec![]; + File::open(TEST_FONT_PATH).unwrap().read_to_end(&mut bytes).unwrap(); + font_context.add_font_from_memory(&font_key, bytes, 0).unwrap(); + + let font_instance = FontInstanceKey::new(&font_key, TEST_FONT_SIZE); + let glyph_key = GlyphKey::new('A' as u32 - TEST_FIRST_GLYPH_INDEX); + let glyph_dimensions = font_context.glyph_dimensions(&font_instance, &glyph_key).unwrap(); + + assert_eq!(glyph_dimensions, GlyphDimensions { + origin: EXPECTED_GLYPH_ORIGIN.into(), + size: Size2D::new(EXPECTED_GLYPH_SIZE[0], EXPECTED_GLYPH_SIZE[1]), + advance: EXPECTED_GLYPH_ADVANCE, + }) +}