Handmade Hero»Episode Guide
Writing HHTs from HHFont
?
?

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:00Recap and set the stage for the day processing fonts
🗩
0:00Recap and set the stage for the day processing fonts
🗩
0:00Recap and set the stage for the day processing fonts
🗩
1:46Demo hhfont with thoughts on localisation
🗹
1:46Demo hhfont with thoughts on localisation
🗹
1:46Demo hhfont with thoughts on localisation
🗹
7:16Walk through the hhfont utility
📖
7:16Walk through the hhfont utility
📖
7:16Walk through the hhfont utility
📖
9:08Run hhfont with a full complement of arguments
🗹
9:08Run hhfont with a full complement of arguments
🗹
9:08Run hhfont with a full complement of arguments
🗹
10:55Set up ExtractFont() to write out our font metadata to .hht and rendered glyphs to directory
10:55Set up ExtractFont() to write out our font metadata to .hht and rendered glyphs to directory
10:55Set up ExtractFont() to write out our font metadata to .hht and rendered glyphs to directory
16:05Introduce Sanitize()
16:05Introduce Sanitize()
16:05Introduce Sanitize()
19:11Enable ExtractFont() to export our font metadata to .hht
19:11Enable ExtractFont() to export our font metadata to .hht
19:11Enable ExtractFont() to export our font metadata to .hht
28:12Hello Molly
🗩
28:12Hello Molly
🗩
28:12Hello Molly
🗩
29:06Continue to enable ExtractFont() to export our font metadata to .hht
29:06Continue to enable ExtractFont() to export our font metadata to .hht
29:06Continue to enable ExtractFont() to export our font metadata to .hht
31:38No scratching, Molly
🗩
31:38No scratching, Molly
🗩
31:38No scratching, Molly
🗩
32:37Fix up compile errors
32:37Fix up compile errors
32:37Fix up compile errors
33:05Run hhfont and check out the glyph and HorizontalAdvance data in our .hht to find that the latter is always an integer
🗹
33:05Run hhfont and check out the glyph and HorizontalAdvance data in our .hht to find that the latter is always an integer
🗹
33:05Run hhfont and check out the glyph and HorizontalAdvance data in our .hht to find that the latter is always an integer
🗹
35:26Change ExtractFont() to output the HorizontalAdvance as an unsigned int, and typeset the block in rows of 16
35:26Change ExtractFont() to output the HorizontalAdvance as an unsigned int, and typeset the block in rows of 16
35:26Change ExtractFont() to output the HorizontalAdvance as an unsigned int, and typeset the block in rows of 16
38:37Run hhfont and check out the block of HorizontalAdvance data
🗹
38:37Run hhfont and check out the block of HorizontalAdvance data
🗹
38:37Run hhfont and check out the block of HorizontalAdvance data
🗹
38:51Prettify the HorizontalAdvance output in ExtractFont()
38:51Prettify the HorizontalAdvance output in ExtractFont()
38:51Prettify the HorizontalAdvance output in ExtractFont()
39:16Check out our HorizontalAdvance block
🗹
39:16Check out our HorizontalAdvance block
🗹
39:16Check out our HorizontalAdvance block
🗹
39:38Set up ExtractFont() and LoadGlyphBitmap() to call our soon-to-write WritePNG()
39:38Set up ExtractFont() and LoadGlyphBitmap() to call our soon-to-write WritePNG()
39:38Set up ExtractFont() and LoadGlyphBitmap() to call our soon-to-write WritePNG()
46:16Introduce WritePNG() to export our rendered font glyphs (initially to .bmp)
46:16Introduce WritePNG() to export our rendered font glyphs (initially to .bmp)
46:16Introduce WritePNG() to export our rendered font glyphs (initially to .bmp)
49:28Try it out and check out our .bmp rendered glyphs
49:28Try it out and check out our .bmp rendered glyphs
49:28Try it out and check out our .bmp rendered glyphs
50:27Reacquaint ourselves with ParsePNG() and the PNG spec1
📖
50:27Reacquaint ourselves with ParsePNG() and the PNG spec1
📖
50:27Reacquaint ourselves with ParsePNG() and the PNG spec1
📖
57:25Implement WritePNG() guided by ParsePNG()2,3
57:25Implement WritePNG() guided by ParsePNG()2,3
57:25Implement WritePNG() guided by ParsePNG()2,3
1:22:10Enable WritePNG() to write out an IEND chunk and temporarily blank four-byte CRC4
1:22:10Enable WritePNG() to write out an IEND chunk and temporarily blank four-byte CRC4
1:22:10Enable WritePNG() to write out an IEND chunk and temporarily blank four-byte CRC4
1:26:00Try out hhfont to find that our rendered .png files are sized correctly
🗹
1:26:00Try out hhfont to find that our rendered .png files are sized correctly
🗹
1:26:00Try out hhfont to find that our rendered .png files are sized correctly
🗹
1:27:53Add test_png to remedybg
🗹
1:27:53Add test_png to remedybg
🗹
1:27:53Add test_png to remedybg
🗹
1:30:27Run test_png on a newly exported .png and step through ParsePNG() to see what it processes
🏃
1:30:27Run test_png on a newly exported .png and step through ParsePNG() to see what it processes
🏃
1:30:27Run test_png on a newly exported .png and step through ParsePNG() to see what it processes
🏃
1:32:40Make WritePNG() write out the BTYPE
1:32:40Make WritePNG() write out the BTYPE
1:32:40Make WritePNG() write out the BTYPE
1:34:00Step through test_png's ParsePNG() to find our correctly set BTYPE
🏃
1:34:00Step through test_png's ParsePNG() to find our correctly set BTYPE
🏃
1:34:00Step through test_png's ParsePNG() to find our correctly set BTYPE
🏃
1:34:35Fix WritePNG() to write out the BTYPE as part of the BFinalType byte
1:34:35Fix WritePNG() to write out the BTYPE as part of the BFinalType byte
1:34:35Fix WritePNG() to write out the BTYPE as part of the BFinalType byte
1:35:24Step through test_png's ParsePNG() to find that the while(LEN) loop cannot be correct
🏃
1:35:24Step through test_png's ParsePNG() to find that the while(LEN) loop cannot be correct
🏃
1:35:24Step through test_png's ParsePNG() to find that the while(LEN) loop cannot be correct
🏃
1:39:19Fix ParsePNG() to consume the correct length of pixels
1:39:19Fix ParsePNG() to consume the correct length of pixels
1:39:19Fix ParsePNG() to consume the correct length of pixels
1:39:53Step on through test_png's ParsePNG() to find that we do not fill all our expected pixels
🏃
1:39:53Step on through test_png's ParsePNG() to find that we do not fill all our expected pixels
🏃
1:39:53Step on through test_png's ParsePNG() to find that we do not fill all our expected pixels
🏃
1:41:18Make WritePNG() output the pixels in rows, prepending each one with a filter value
1:41:18Make WritePNG() output the pixels in rows, prepending each one with a filter value
1:41:18Make WritePNG() output the pixels in rows, prepending each one with a filter value
1:44:05Step through ParsePNG() to find that we still underflow
🏃
1:44:05Step through ParsePNG() to find that we still underflow
🏃
1:44:05Step through ParsePNG() to find that we still underflow
🏃
1:44:22Fix the Len computation in WritePNG()
1:44:22Fix the Len computation in WritePNG()
1:44:22Fix the Len computation in WritePNG()
1:44:49Step on through test_png's ParsePNG() to completion
🏃
1:44:49Step on through test_png's ParsePNG() to completion
🏃
1:44:49Step on through test_png's ParsePNG() to completion
🏃
1:45:58Fix WritePNG() to correctly offset the pixels of each row
1:45:58Fix WritePNG() to correctly offset the pixels of each row
1:45:58Fix WritePNG() to correctly offset the pixels of each row
1:46:22Export our .png glyphs to find that they remain incorrect
🗹
1:46:22Export our .png glyphs to find that they remain incorrect
🗹
1:46:22Export our .png glyphs to find that they remain incorrect
🗹
1:47:53Q&A
🗩
1:47:53Q&A
🗩
1:47:53Q&A
🗩
1:48:40somebody_took_my_name Q: The IEND footer is missing some swaps
🗪
1:48:40somebody_took_my_name Q: The IEND footer is missing some swaps
🗪
1:48:40somebody_took_my_name Q: The IEND footer is missing some swaps
🗪
1:48:43Fix WritePNG() to endian-swap the IEND chunk
1:48:43Fix WritePNG() to endian-swap the IEND chunk
1:48:43Fix WritePNG() to endian-swap the IEND chunk
1:49:03spatialfree Q: I love that "vertical header peek" in your 4coder editor. Is it a default feature? How can I get it?
🗪
1:49:03spatialfree Q: I love that "vertical header peek" in your 4coder editor. Is it a default feature? How can I get it?
🗪
1:49:03spatialfree Q: I love that "vertical header peek" in your 4coder editor. Is it a default feature? How can I get it?
🗪
1:50:14somebody_took_my_name Q: Is the RGBA the same for bitmaps and PNGs?
🗪
1:50:14somebody_took_my_name Q: Is the RGBA the same for bitmaps and PNGs?
🗪
1:50:14somebody_took_my_name Q: Is the RGBA the same for bitmaps and PNGs?
🗪
1:51:23euphius Q: Do you think machine learning can be useful in games? If yes, in what way?
🗪
1:51:23euphius Q: Do you think machine learning can be useful in games? If yes, in what way?
🗪
1:51:23euphius Q: Do you think machine learning can be useful in games? If yes, in what way?
🗪
1:53:37osor_io handmade_hero Will we be able to get your current 4coder? With the new version coming out and maybe the sources for yours on the Handmade Hero files? I keep doing things that you seem to have done already and, damn man, I'd love to have it
🗪
1:53:37osor_io handmade_hero Will we be able to get your current 4coder? With the new version coming out and maybe the sources for yours on the Handmade Hero files? I keep doing things that you seem to have done already and, damn man, I'd love to have it
🗪
1:53:37osor_io handmade_hero Will we be able to get your current 4coder? With the new version coming out and maybe the sources for yours on the Handmade Hero files? I keep doing things that you seem to have done already and, damn man, I'd love to have it
🗪
1:55:35boonetbe Q: I see quite a lot of people moving into more programming / software engineering related jobs after doing some academical research, not at all focussed on CE related things (physics, chemistry, etc). Do you have any experience working with people that didn't focus on coding for a long time, possibly not having any real training in it? What's the biggest difference with people that have a degree in CE or focused on programming from a young age?
🗪
1:55:35boonetbe Q: I see quite a lot of people moving into more programming / software engineering related jobs after doing some academical research, not at all focussed on CE related things (physics, chemistry, etc). Do you have any experience working with people that didn't focus on coding for a long time, possibly not having any real training in it? What's the biggest difference with people that have a degree in CE or focused on programming from a young age?
🗪
1:55:35boonetbe Q: I see quite a lot of people moving into more programming / software engineering related jobs after doing some academical research, not at all focussed on CE related things (physics, chemistry, etc). Do you have any experience working with people that didn't focus on coding for a long time, possibly not having any real training in it? What's the biggest difference with people that have a degree in CE or focused on programming from a young age?
🗪
1:56:52jkfsda Q: Do you feel like explicit languages make people more productive compared to expressive languages? I think functional programmers program just for masturbatory purposes
🗪
1:56:52jkfsda Q: Do you feel like explicit languages make people more productive compared to expressive languages? I think functional programmers program just for masturbatory purposes
🗪
1:56:52jkfsda Q: Do you feel like explicit languages make people more productive compared to expressive languages? I think functional programmers program just for masturbatory purposes
🗪
1:59:37jbcgannon Q: You've talked in the past about understanding the trade-offs in software development such as: optimizing increasing complexity; time constraint in the context of readability vs features implemented. Are there other things you keep in mind when deciding how to spend your time?
🗪
1:59:37jbcgannon Q: You've talked in the past about understanding the trade-offs in software development such as: optimizing increasing complexity; time constraint in the context of readability vs features implemented. Are there other things you keep in mind when deciding how to spend your time?
🗪
1:59:37jbcgannon Q: You've talked in the past about understanding the trade-offs in software development such as: optimizing increasing complexity; time constraint in the context of readability vs features implemented. Are there other things you keep in mind when deciding how to spend your time?
🗪
2:02:05x13pixels Yak Shaving. New term learned
🗪
2:02:05x13pixels Yak Shaving. New term learned
🗪
2:02:05x13pixels Yak Shaving. New term learned
🗪
2:04:31tbodt_ Q: Why not use stb_image to save PNGs instead of writing your own?
🗪
2:04:31tbodt_ Q: Why not use stb_image to save PNGs instead of writing your own?
🗪
2:04:31tbodt_ Q: Why not use stb_image to save PNGs instead of writing your own?
🗪
2:09:38ivereadthesequel handmade_hero That's why you need to get on the writing-robots bandwagon!
🗪
2:09:38ivereadthesequel handmade_hero That's why you need to get on the writing-robots bandwagon!
🗪
2:09:38ivereadthesequel handmade_hero That's why you need to get on the writing-robots bandwagon!
🗪
2:14:06joeyiswatching Q: Do you have a std::vector / dynamic array replacement, or are you also not using std::?
🗪
2:14:06joeyiswatching Q: Do you have a std::vector / dynamic array replacement, or are you also not using std::?
🗪
2:14:06joeyiswatching Q: Do you have a std::vector / dynamic array replacement, or are you also not using std::?
🗪
2:14:47tripl3m Q: Hello, probably answered before, but I wish to use C99 with MSVC, but heard it is not so well supported by Microsoft. Could it be an issue for programming in C with Windows?
🗪
2:14:47tripl3m Q: Hello, probably answered before, but I wish to use C99 with MSVC, but heard it is not so well supported by Microsoft. Could it be an issue for programming in C with Windows?
🗪
2:14:47tripl3m Q: Hello, probably answered before, but I wish to use C99 with MSVC, but heard it is not so well supported by Microsoft. Could it be an issue for programming in C with Windows?
🗪
2:15:33Stack Overflow-oriented AI
🗩
2:15:33Stack Overflow-oriented AI
🗩
2:15:33Stack Overflow-oriented AI
🗩
2:17:14saidwho12 Some guy on twitch was writing a vim plugin that you ask questions to and it would look on Google or in a database for code, and paste it on your cursor
🗪
2:17:14saidwho12 Some guy on twitch was writing a vim plugin that you ask questions to and it would look on Google or in a database for code, and paste it on your cursor
🗪
2:17:14saidwho12 Some guy on twitch was writing a vim plugin that you ask questions to and it would look on Google or in a database for code, and paste it on your cursor
🗪
2:21:50Call it quits
🗩
2:21:50Call it quits
🗩
2:21:50Call it quits
🗩