[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]