[video output=day527 member=cmuratori stream_platform=twitch stream_username=handmade_hero project=code title="Making a Stand-Alone Font Extractor" vod_platform=youtube id=n8zn2DYjTbU annotator=Miblo]
[0:01][Note our capability to rebuild all of our assets except fonts][:"asset system" :font :speech]
[2:04][Cross-platform :font processing][:"platform layer" :speech]
[5:08][Reacquaint ourselves with our current .hha representation of fonts][:"asset system" :font :research]
[8:05][Exporting fonts to .png format for packing into .hha][:"asset system" :font :research]
[10:08][Spec out a directory structure for developer resources such as fonts][:admin :"asset system" :font]
[11:38][Set up to write fonts out to .png and then into .hht][:"asset system" :font :research]
[15:23][General thoughts on complexity in asset processing systems deriving from complex inter-relationships and structure, as we will find in fonts][:"asset system" :font :speech]
[18:18][Create hha_font.cpp based on test_asset_builder.cpp][:"asset system" :font]
[25:11][Handle command-line arguments and respecify WriteFonts() as ExtractFont()[ref
    site="Windows Dev Center"
    page="AddFontResourceExA function"
    url=https://docs.microsoft.com/en-us/windows/desktop/api/wingdi/nf-wingdi-addfontresourceexa][ref
        site="Windows Dev Center"
        page="CreateFontA function"
        url=https://docs.microsoft.com/en-us/windows/desktop/api/wingdi/nf-wingdi-createfonta]][:"asset system" :font]
[39:42][Introduce the notion of a CHAR_SET_CREATOR to facilitate the creation of various character-set extraction procedures, for localisation][:"asset system" :font]
[51:23][Enable ExtractFont() to call LoadGlyphBitmap() on all the glyphs, making the latter operate on passed in dimensions retrieved from a GetTextMetrics() system call,[ref
        site="Windows Dev Center"
        page="GetTextMetrics function"
        url=https://docs.microsoft.com/en-us/windows/desktop/api/wingdi/nf-wingdi-gettextmetrics][ref
        site="Windows Dev Center"
        page="TEXTMETRICA structure"
        url=https://docs.microsoft.com/en-gb/windows/desktop/api/wingdi/ns-wingdi-tagtextmetrica] and return a glyph_result][:"asset system" :font]
[1:20:41][Clean up compile errors]
[1:29:17][Introduce Include() and IncludeRange() for CHAR_SET_CREATOR functions to call, and a codepoint_mask for ExtractFont() to take][:"asset system" :font]
[1:41:03][:Run hhfont for the first time][:"asset system" :font]
[1:42:55][Print out some :font extraction information][:"asset system"]
[1:44:22][:Run hhafont on some real input, and crash beautifully][:"asset system" :font]
[1:45:06][Add hhfont to ~remedybg and step through it to a crash on fprintf()][:"asset system" :font :run]
[1:48:50][Clear the Mask.CodepointFromGlyph, and prevent Include() from doubly-incrementing through its loop][:"asset system" :font]
[1:50:02][:Run hhafont successfully][:"asset system" :font]
[1:50:24][Fix Include() to only add glyphs whose code point is not 0][:"asset system" :font]
[1:51:10][:Run hhafont to see a more likely glyph count][:"asset system" :font]
[1:51:25][Q&A][:speech]
[1:51:51][@centhusiast][Q: Are you going to implement the PNG writer?]
[1:53:12][@centhusiast][Q: Does the Windows API use Hungarian notation?[ref
    site=Wikipedia
    page="Hungarian notation"
    url=https://en.wikipedia.org/wiki/Hungarian_notation]][:language]
[1:54:04][@recyrillic][Q: We had a yellow ~4coder flash today. Did we know about that color of flash already?]
[1:54:53][@lucid_frost][Q: Do you think you still improve a lot as a programmer (as opposed to when you first started)? I'd be curious to know if there are specific things you work on to keep improving]
[1:59:30][@skytrias][Q: Is it hard to write a level editor? What are the steps? I just want to set positions via mouse, save them so that they're used once exited]
[2:00:10][Demo the game's asset editing :UI][:"asset system" :run]
[2:02:34][@gayonara][Q: What do you mean by better :language?]
[2:04:56][@centhusiast][Q: I really like your programming style of returning a struct from a function and I have been using it a lot. Is it true that it was not possible to return a struct from a function in the early days of C?][:language]
[2:06:52][@basedyam][Q: If you were making a game with a lot of text on-screen, what text :rendering technique do you think you'd go for?]
[2:08:43][@spranklz1][Q: How do you visualize your logic so easily? Sometimes I'll write a complicated function and it will take me, potentially, hours to debug (or fully understand); but that never seems to be a problem for you]
[2:11:22][@se5a1][Q: I keep running into problems that I cannot figure out, but if I drop it and come back to it at a later date (weeks / months), I can sometimes figure out what's going wrong within 10 minutes. Any suggestions on how to improve my problem solving in this regard?]
[2:14:59][@centhusiast][Q: What font do you recommend for a native desktop app? A font that looks pleasant to the eye. I have a hard time finding one. Thanks for your help!]
[2:15:43][@flightlesshippo][Q: What's the hardest programming problem you've found yourself dealing with?]
[2:16:03][@nickito97][Q: Do you ever use Valgrind? Would you recommend it for C (or maybe C++) code? Is there a decent Windows alternative?][:profiling]
[2:17:42][@ud_0][Q: What language / environment do you recommend for introducing young kids to programming?][:language]
[2:21:23][@nickito97][Q: Do you think learning to program with C is a bad idea?][:language]
[2:22:00][@overture2112][Q: How often do you work on random small projects that aren't work-related (i.e. not [~hero Handmade Hero], Molly Rocket stuff, etc)?]
[2:22:40][Close it down][:speech]
[/video]
