Handmade Hero»Episode Guide
Parsing and Updating Font Metadata
?
?

Keyboard Navigation

Global Keys

[, < / ], > Jump to previous / next episode
W, K, P / S, J, N Jump to previous / next marker
t / T Toggle theatre / SUPERtheatre mode
V Revert filter to original state Y Select link (requires manual Ctrl-c)

Menu toggling

q Quotes r References f Filter y Link c Credits

In-Menu Movement

a
w
s
d
h j k l


Quotes and References Menus

Enter Jump to timecode

Quotes, References and Credits Menus

o Open URL (in new tab)

Filter Menu

x, Space Toggle category and focus next
X, ShiftSpace Toggle category and focus previous
v Invert topics / media as per focus

Filter and Link Menus

z Toggle filter / linking mode

Credits Menu

Enter Open URL (in new tab)
0:01Recap and set the stage for the day, assuming that our certificates are not about to expire
🗩
0:01Recap and set the stage for the day, assuming that our certificates are not about to expire
🗩
0:01Recap and set the stage for the day, assuming that our certificates are not about to expire
🗩
2:34Recall Windows' rule for antialiasing fonts (up to 353px high), and set up to parse and update font metadata
🗩
2:34Recall Windows' rule for antialiasing fonts (up to 353px high), and set up to parse and update font metadata
🗩
2:34Recall Windows' rule for antialiasing fonts (up to 353px high), and set up to parse and update font metadata
🗩
4:33Address the "hhfont creates corrupt PNG for "space" glyph" issue1
📖
4:33Address the "hhfont creates corrupt PNG for "space" glyph" issue1
📖
4:33Address the "hhfont creates corrupt PNG for "space" glyph" issue1
📖
7:39Check out test.hht with the determination to augment it with richer font metadata
📖
7:39Check out test.hht with the determination to augment it with richer font metadata
📖
7:39Check out test.hht with the determination to augment it with richer font metadata
📖
9:18Determine to break up ParseTopLevelBlock() into bundles of uniform operations, and permit such things as calling UpdateAssetMetadata() for many individual glyphs
📖
9:18Determine to break up ParseTopLevelBlock() into bundles of uniform operations, and permit such things as calling UpdateAssetMetadata() for many individual glyphs
📖
9:18Determine to break up ParseTopLevelBlock() into bundles of uniform operations, and permit such things as calling UpdateAssetMetadata() for many individual glyphs
📖
12:07Introduce HandleCommonFields() for ParseTopLevelBlock() to call for many block types
12:07Introduce HandleCommonFields() for ParseTopLevelBlock() to call for many block types
12:07Introduce HandleCommonFields() for ParseTopLevelBlock() to call for many block types
16:05Extract the "default" block parsing out of ParseTopLevelBlock() for its caller ParseHHT() to perform, introducing ParseDefaultBlock()
16:05Extract the "default" block parsing out of ParseTopLevelBlock() for its caller ParseHHT() to perform, introducing ParseDefaultBlock()
16:05Extract the "default" block parsing out of ParseTopLevelBlock() for its caller ParseHHT() to perform, introducing ParseDefaultBlock()
24:05Extract the "font" block parsing out of ParseTopLevelBlock(), introducing ParseFontBlock() and RequireIdentifier()
24:05Extract the "font" block parsing out of ParseTopLevelBlock(), introducing ParseFontBlock() and RequireIdentifier()
24:05Extract the "font" block parsing out of ParseTopLevelBlock(), introducing ParseFontBlock() and RequireIdentifier()
28:45Introduce RequireField() to compress out the field parsing code
28:45Introduce RequireField() to compress out the field parsing code
28:45Introduce RequireField() to compress out the field parsing code
30:07Continue to implement ParseFontBlock() calling RequireField() and setting the Font header
30:07Continue to implement ParseFontBlock() calling RequireField() and setting the Font header
30:07Continue to implement ParseFontBlock() calling RequireField() and setting the Font header
34:24Enable ParseFontBlock() to handle the Glyph and HorizontalAdvance arrays
34:24Enable ParseFontBlock() to handle the Glyph and HorizontalAdvance arrays
34:24Enable ParseFontBlock() to handle the Glyph and HorizontalAdvance arrays
40:19Consult Molly
🗩
40:19Consult Molly
🗩
40:19Consult Molly
🗩
44:38Continue to enable ParseFontBlock() to handle Glyph metadata, introducing ImportGlyph()
44:38Continue to enable ParseFontBlock() to handle Glyph metadata, introducing ImportGlyph()
44:38Continue to enable ParseFontBlock() to handle Glyph metadata, introducing ImportGlyph()
51:40Enable ParseFontBlock() to handle the HorizontalAdvance metadata for every Glyph
51:40Enable ParseFontBlock() to handle the HorizontalAdvance metadata for every Glyph
51:40Enable ParseFontBlock() to handle the HorizontalAdvance metadata for every Glyph
54:16Enable ParseFontBlock() to handle the rest of the Glyph metadata, including code point and alignment points
54:16Enable ParseFontBlock() to handle the rest of the Glyph metadata, including code point and alignment points
54:16Enable ParseFontBlock() to handle the rest of the Glyph metadata, including code point and alignment points
1:03:47Introduce UpdateSingleAssetMetadata() for ParseFontBlock() to call
1:03:47Introduce UpdateSingleAssetMetadata() for ParseFontBlock() to call
1:03:47Introduce UpdateSingleAssetMetadata() for ParseFontBlock() to call
1:12:20Change UpdateSingleAssetMetadata() to take an asset_file rather than asset_source_file, and additionally take an Errors stream and FileBaseName, for ParseFontBlock() to pass
1:12:20Change UpdateSingleAssetMetadata() to take an asset_file rather than asset_source_file, and additionally take an Errors stream and FileBaseName, for ParseFontBlock() to pass
1:12:20Change UpdateSingleAssetMetadata() to take an asset_file rather than asset_source_file, and additionally take an Errors stream and FileBaseName, for ParseFontBlock() to pass
1:17:52Consider how to import glyphs specially, since they lack an asset index
🗩
1:17:52Consider how to import glyphs specially, since they lack an asset index
🗩
1:17:52Consider how to import glyphs specially, since they lack an asset index
🗩
1:21:47Introduce a synthetic asset file in ParseFontBlock() to denote our font assets
1:21:47Introduce a synthetic asset file in ParseFontBlock() to denote our font assets
1:21:47Introduce a synthetic asset file in ParseFontBlock() to denote our font assets
1:29:26Set up ParseFontBlock() to rebuild differing glyph arrays, introducing BlockDiffers()
1:29:26Set up ParseFontBlock() to rebuild differing glyph arrays, introducing BlockDiffers()
1:29:26Set up ParseFontBlock() to rebuild differing glyph arrays, introducing BlockDiffers()
1:44:19Implement BlockDiffers()
1:44:19Implement BlockDiffers()
1:44:19Implement BlockDiffers()
1:48:50Fix compile errors
1:48:50Fix compile errors
1:48:50Fix compile errors
1:53:52Stub out ImportGlyph() and a version of GetOrCreateAssetSourceFile() that takes the BaseName as a string
1:53:52Stub out ImportGlyph() and a version of GetOrCreateAssetSourceFile() that takes the BaseName as a string
1:53:52Stub out ImportGlyph() and a version of GetOrCreateAssetSourceFile() that takes the BaseName as a string
1:57:51Q&A
🗩
1:57:51Q&A
🗩
1:57:51Q&A
🗩
1:58:09sahfortv Q: In NeedsFullRebuild shouldn't DataSize not be equal?
🗪
1:58:09sahfortv Q: In NeedsFullRebuild shouldn't DataSize not be equal?
🗪
1:58:09sahfortv Q: In NeedsFullRebuild shouldn't DataSize not be equal?
🗪
1:58:20Fix typo in the NeedsFullRebuild setting in ParseFontBlock()
1:58:20Fix typo in the NeedsFullRebuild setting in ParseFontBlock()
1:58:20Fix typo in the NeedsFullRebuild setting in ParseFontBlock()
2:00:01Wrap it up
🗩
2:00:01Wrap it up
🗩
2:00:01Wrap it up
🗩