diff --git a/cmuratori/hero/code/code531.hmml b/cmuratori/hero/code/code531.hmml new file mode 100644 index 0000000..b650d33 --- /dev/null +++ b/cmuratori/hero/code/code531.hmml @@ -0,0 +1,32 @@ +[video member=cmuratori stream_platform=twitch stream_username=handmade_hero project=code title="Parsing and Updating Font Metadata" vod_platform=youtube id=uvPbmPLfArQ annotator=Miblo] +[0:01][Recap and set the stage for the day, assuming that our certificates are not about to expire][:speech] +[2:34][Recall Windows' rule for antialiasing fonts (up to 353px high), and set up to parse and update :font metadata][:speech] +[4:33][Address the "hhfont creates corrupt PNG for "space" glyph" issue[ref + site=GitHub + page="HandmadeHero / cpp / hhfont creates corrupt PNG for \"space\" glyph" + url=https://github.com/HandmadeHero/cpp/issues/94]][:"file format" :research] +[7:39][Check out test.hht with the determination to augment it with richer :font metadata][:"file format" :parsing :research] +[9:18][Determine to break up ParseTopLevelBlock() into bundles of uniform operations, and permit such things as calling UpdateAssetMetadata() for many individual glyphs][:parsing :research] +[12:07][Introduce HandleCommonFields() for ParseTopLevelBlock() to call for many block types][:parsing] +[16:05][Extract the "default" block :parsing out of ParseTopLevelBlock() for its caller ParseHHT() to perform, introducing ParseDefaultBlock()] +[24:05][Extract the "font" block :parsing out of ParseTopLevelBlock(), introducing ParseFontBlock() and RequireIdentifier()] +[28:45][Introduce RequireField() to compress out the field :parsing code] +[30:07][Continue to implement ParseFontBlock() calling RequireField() and setting the Font header][:parsing] +[34:24][Enable ParseFontBlock() to handle the Glyph and HorizontalAdvance arrays][:parsing] +[40:19][Consult @Molly][:speech] +[44:38][Continue to enable ParseFontBlock() to handle Glyph metadata, introducing ImportGlyph()][:parsing] +[51:40][Enable ParseFontBlock() to handle the HorizontalAdvance metadata for every Glyph][:parsing] +[54:16][Enable ParseFontBlock() to handle the rest of the Glyph metadata, including code point and alignment points][:parsing] +[1:03:47][Introduce UpdateSingleAssetMetadata() for ParseFontBlock() to call][:"asset system" :parsing] +[1:12:20][Change UpdateSingleAssetMetadata() to take an asset_file rather than asset_source_file, and additionally take an Errors stream and FileBaseName, for ParseFontBlock() to pass][:"asset system" :parsing] +[1:17:52][Consider how to import glyphs specially, since they lack an asset index][:"asset system" :speech] +[1:21:47][Introduce a synthetic asset file in ParseFontBlock() to denote our font assets][:"asset system" :parsing] +[1:29:26][Set up ParseFontBlock() to rebuild differing glyph arrays, introducing BlockDiffers()][:parsing] +[1:44:19][Implement BlockDiffers()] +[1:48:50][Fix compile errors] +[1:53:52][Stub out ImportGlyph() and a version of GetOrCreateAssetSourceFile() that takes the BaseName as a string][:parsing] +[1:57:51][Q&A][:speech] +[1:58:09][@sahfortv][Q: In NeedsFullRebuild shouldn't DataSize not be equal?][:parsing] +[1:58:20][Fix typo in the NeedsFullRebuild setting in ParseFontBlock()][:parsing] +[2:00:01][Wrap it up][:speech] +[/video]