Debugging the PNG Writer
?
?

Keyboard Navigation

Global Keys

[, < / ], > Jump to previous / next episode
W, K, P / S, J, N Jump to previous / next timestamp
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 and Index Controls

a
w
s
d
h j k l


Esc Close menu / unfocus timestamp

Quotes and References Menus and Index

Enter Jump to timestamp

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 debugging our font glyph PNG writer
🗩
0:01Recap and set the stage for the day debugging our font glyph PNG writer
🗩
0:01Recap and set the stage for the day debugging our font glyph PNG writer
🗩
4:59Reacquaint ourselves with PNGFilterReconstruct()
📖
4:59Reacquaint ourselves with PNGFilterReconstruct()
📖
4:59Reacquaint ourselves with PNGFilterReconstruct()
📖
7:11Try running test_png on the known-valid shot4_2.png
🗹
7:11Try running test_png on the known-valid shot4_2.png
🗹
7:11Try running test_png on the known-valid shot4_2.png
🗹
8:26Craft a line that exports our font glyphs and extracts liberation_mono_0089.png to .bmp1
8:26Craft a line that exports our font glyphs and extracts liberation_mono_0089.png to .bmp1
8:26Craft a line that exports our font glyphs and extracts liberation_mono_0089.png to .bmp1
11:32Invoke our test line to see that our .bmp output works, but for being upside-down
🗹
11:32Invoke our test line to see that our .bmp output works, but for being upside-down
🗹
11:32Invoke our test line to see that our .bmp output works, but for being upside-down
🗹
13:19Reacquaint ourselves with the pre-multiplication of alpha in our PNG loader and .hha font extractor
📖
13:19Reacquaint ourselves with the pre-multiplication of alpha in our PNG loader and .hha font extractor
📖
13:19Reacquaint ourselves with the pre-multiplication of alpha in our PNG loader and .hha font extractor
📖
15:27Prevent LoadGlyphBitmap() from pre-multiplying alpha, and instead produce a monochrome bitmap
15:27Prevent LoadGlyphBitmap() from pre-multiplying alpha, and instead produce a monochrome bitmap
15:27Prevent LoadGlyphBitmap() from pre-multiplying alpha, and instead produce a monochrome bitmap
16:54Run our exporter–extractor to see our monochrome .bmp
🗹
16:54Run our exporter–extractor to see our monochrome .bmp
🗹
16:54Run our exporter–extractor to see our monochrome .bmp
🗹
17:16Make LoadGlyphBitmap() flip the bitmap's rows
17:16Make LoadGlyphBitmap() flip the bitmap's rows
17:16Make LoadGlyphBitmap() flip the bitmap's rows
18:09Run our exporter–extractor to see that our .bmp is off-by-one row
🗹
18:09Run our exporter–extractor to see that our .bmp is off-by-one row
🗹
18:09Run our exporter–extractor to see that our .bmp is off-by-one row
🗹
18:38Fix LoadGlyphBitmap() to pad the image equally top and bottom
18:38Fix LoadGlyphBitmap() to pad the image equally top and bottom
18:38Fix LoadGlyphBitmap() to pad the image equally top and bottom
19:13Run our exporter–extractor to see our 1 pixel border
🗹
19:13Run our exporter–extractor to see our 1 pixel border
🗹
19:13Run our exporter–extractor to see our 1 pixel border
🗹
19:23Determine to make our PNG writer comply with the PNG spec
🗩
19:23Determine to make our PNG writer comply with the PNG spec
🗩
19:23Determine to make our PNG writer comply with the PNG spec
🗩
20:40Combine the PNG writer and reader, switching WritePNG() to write to a stream and introducing OutCopy(), OutStruct() and OutStructCopy()
20:40Combine the PNG writer and reader, switching WritePNG() to write to a stream and introducing OutCopy(), OutStruct() and OutStructCopy()
20:40Combine the PNG writer and reader, switching WritePNG() to write to a stream and introducing OutCopy(), OutStruct() and OutStructCopy()
27:22Switch WritePNG() to use our new OutCopy() and OutStructCopy()
27:22Switch WritePNG() to use our new OutCopy() and OutStructCopy()
27:22Switch WritePNG() to use our new OutCopy() and OutStructCopy()
33:06Initialise a stream for WritePNG() to use
33:06Initialise a stream for WritePNG() to use
33:06Initialise a stream for WritePNG() to use
37:47Delete our .png glyphs, run and crash png_test
🗹
37:47Delete our .png glyphs, run and crash png_test
🗹
37:47Delete our .png glyphs, run and crash png_test
🗹
40:20remedybg bug: Run-to-cursor switches focus from source to disassembly (if the latter was not open, opening it)
🗹
40:20remedybg bug: Run-to-cursor switches focus from source to disassembly (if the latter was not open, opening it)
🗹
40:20remedybg bug: Run-to-cursor switches focus from source to disassembly (if the latter was not open, opening it)
🗹
41:17Step through WritePNG()
🏃
41:17Step through WritePNG()
🏃
41:17Step through WritePNG()
🏃
45:18remedybg bug: Opening a recent session creates a breakpoint
🗹
45:18remedybg bug: Opening a recent session creates a breakpoint
🗹
45:18remedybg bug: Opening a recent session creates a breakpoint
🗹
46:00Step through ParsePNG() in test_png to see that the Signature is wrong
🏃
46:00Step through ParsePNG() in test_png to see that the Signature is wrong
🏃
46:00Step through ParsePNG() in test_png to see that the Signature is wrong
🏃
47:19Investigate our incorrect Signature
📖
47:19Investigate our incorrect Signature
📖
47:19Investigate our incorrect Signature
📖
49:11Run hhfont and fail to see the printout
🗹
49:11Run hhfont and fail to see the printout
🗹
49:11Run hhfont and fail to see the printout
🗹
49:42Respecify DumpStreamToCRT() as DataStreamToFILE()
49:42Respecify DumpStreamToCRT() as DataStreamToFILE()
49:42Respecify DumpStreamToCRT() as DataStreamToFILE()
50:42Run our exporter–extractor to see that we're producing the .bmp again
🗹
50:42Run our exporter–extractor to see that we're producing the .bmp again
🗹
50:42Run our exporter–extractor to see that we're producing the .bmp again
🗹
51:11Run test_png on the known-valid shot4_2.png and compare its ZLIB header with one we produced for liberation_mono_0089.png
🗹
51:11Run test_png on the known-valid shot4_2.png and compare its ZLIB header with one we produced for liberation_mono_0089.png
🗹
51:11Run test_png on the known-valid shot4_2.png and compare its ZLIB header with one we produced for liberation_mono_0089.png
🗹
52:00Consult the ZLIB spec2
📖
52:00Consult the ZLIB spec2
📖
52:00Consult the ZLIB spec2
📖
56:12Make WritePNG() write out a valid FCHECK value3
56:12Make WritePNG() write out a valid FCHECK value3
56:12Make WritePNG() write out a valid FCHECK value3
1:00:15Consult the PNG spec for the suggested CRC algorithm4
📖
1:00:15Consult the PNG spec for the suggested CRC algorithm4
📖
1:00:15Consult the PNG spec for the suggested CRC algorithm4
📖
1:02:53Temporarily implement the ability to write out the CRC table
1:02:53Temporarily implement the ability to write out the CRC table
1:02:53Temporarily implement the ability to write out the CRC table
1:06:37Generate our CRC table
🗹
1:06:37Generate our CRC table
🗹
1:06:37Generate our CRC table
🗹
1:06:45Enable WritePNG() to write out our CRC5
1:06:45Enable WritePNG() to write out our CRC5
1:06:45Enable WritePNG() to write out our CRC5
1:19:54Run our exporter–extractor to see that we are producing .png files that Paint 3D can read
🗹
1:19:54Run our exporter–extractor to see that we are producing .png files that Paint 3D can read
🗹
1:19:54Run our exporter–extractor to see that we are producing .png files that Paint 3D can read
🗹
1:21:11Consult the ZLIB spec for the ADLER32 algorithm6
📖
1:21:11Consult the ZLIB spec for the ADLER32 algorithm6
📖
1:21:11Consult the ZLIB spec for the ADLER32 algorithm6
📖
1:22:07Enable WritePNG() to ADLER32 hash the data7
1:22:07Enable WritePNG() to ADLER32 hash the data7
1:22:07Enable WritePNG() to ADLER32 hash the data7
1:28:38Run our exporter–extractor, crash png_test and investigate why
🗹
1:28:38Run our exporter–extractor, crash png_test and investigate why
🗹
1:28:38Run our exporter–extractor, crash png_test and investigate why
🗹
1:31:26Fix WritePNG() to include the checksum size in the ChunkHeader
1:31:26Fix WritePNG() to include the checksum size in the ChunkHeader
1:31:26Fix WritePNG() to include the checksum size in the ChunkHeader
1:31:48Run our exporter–extractor successfully
🗹
1:31:48Run our exporter–extractor successfully
🗹
1:31:48Run our exporter–extractor successfully
🗹
1:31:55Hunt for a PNG validator and find pngcheck8,9
📖
1:31:55Hunt for a PNG validator and find pngcheck8,9
📖
1:31:55Hunt for a PNG validator and find pngcheck8,9
📖
1:35:46Try pngcheck on liberation_mono_0089.png to see that we have a CRC error in chunk IHDR
🗹
1:35:46Try pngcheck on liberation_mono_0089.png to see that we have a CRC error in chunk IHDR
🗹
1:35:46Try pngcheck on liberation_mono_0089.png to see that we have a CRC error in chunk IHDR
🗹
1:36:53Carefully consult the PNG spec for the CRC information10
📖
1:36:53Carefully consult the PNG spec for the CRC information10
📖
1:36:53Carefully consult the PNG spec for the CRC information10
📖
1:39:30Fix WritePNG() to exclude the length field from the CRC
1:39:30Fix WritePNG() to exclude the length field from the CRC
1:39:30Fix WritePNG() to exclude the length field from the CRC
1:42:08Run our exporter–extractor and crash test_png, but find that pngcheck and GIMP recognise our .png as valid
🗹
1:42:08Run our exporter–extractor and crash test_png, but find that pngcheck and GIMP recognise our .png as valid
🗹
1:42:08Run our exporter–extractor and crash test_png, but find that pngcheck and GIMP recognise our .png as valid
🗹
1:44:23Run our exporter–extractor on the correct directories, and determine that we're in the clear
🗹
1:44:23Run our exporter–extractor on the correct directories, and determine that we're in the clear
🗹
1:44:23Run our exporter–extractor on the correct directories, and determine that we're in the clear
🗹
1:45:08Q&A
🗩
1:45:08Q&A
🗩
1:45:08Q&A
🗩
1:46:35somebody_took_my_name Q: I thought there should be an error because the type was endian swapped before the CRC was calculated, but apparently that is how it works
🗪
1:46:35somebody_took_my_name Q: I thought there should be an error because the type was endian swapped before the CRC was calculated, but apparently that is how it works
🗪
1:46:35somebody_took_my_name Q: I thought there should be an error because the type was endian swapped before the CRC was calculated, but apparently that is how it works
🗪
1:47:14pythno Q: Hi Casey, I think you would enjoy Revision demopary. There are plenty of people yelling "Amiga" frequently. And some of the Amiga demos and intros are very, very good11
🗪
1:47:14pythno Q: Hi Casey, I think you would enjoy Revision demopary. There are plenty of people yelling "Amiga" frequently. And some of the Amiga demos and intros are very, very good11
🗪
1:47:14pythno Q: Hi Casey, I think you would enjoy Revision demopary. There are plenty of people yelling "Amiga" frequently. And some of the Amiga demos and intros are very, very good11
🗪
1:47:44xxthebigfoxx Q: What do you think are other fields to look into to get hired as a systems programmer other than the game industry?
🗪
1:47:44xxthebigfoxx Q: What do you think are other fields to look into to get hired as a systems programmer other than the game industry?
🗪
1:47:44xxthebigfoxx Q: What do you think are other fields to look into to get hired as a systems programmer other than the game industry?
🗪
1:49:33somebody_took_my_name Q: What does the align point for fonts stand for? The offset of a rectangle of size by size?
🗪
1:49:33somebody_took_my_name Q: What does the align point for fonts stand for? The offset of a rectangle of size by size?
🗪
1:49:33somebody_took_my_name Q: What does the align point for fonts stand for? The offset of a rectangle of size by size?
🗪
1:49:55bts1911 Q: Do you use any standard software development process while creating this game?
🗪
1:49:55bts1911 Q: Do you use any standard software development process while creating this game?
🗪
1:49:55bts1911 Q: Do you use any standard software development process while creating this game?
🗪
1:50:21teamrandb Q: I missed it during stream, could you show what an .hht font file looks like?
🗪
1:50:21teamrandb Q: I missed it during stream, could you show what an .hht font file looks like?
🗪
1:50:21teamrandb Q: I missed it during stream, could you show what an .hht font file looks like?
🗪
1:52:21lucid_frost Q: Are sampling profilers always strictly worse than adding counting points directly to the binary? I have trouble wrapping my head around the accuracy / quality of sampling
🗪
1:52:21lucid_frost Q: Are sampling profilers always strictly worse than adding counting points directly to the binary? I have trouble wrapping my head around the accuracy / quality of sampling
🗪
1:52:21lucid_frost Q: Are sampling profilers always strictly worse than adding counting points directly to the binary? I have trouble wrapping my head around the accuracy / quality of sampling
🗪
1:55:43teamrandb How do sampling profilers work? Do they need to pause every thread, or can they take a snapshot somehow and then figure out where the program was?12
🗪
1:55:43teamrandb How do sampling profilers work? Do they need to pause every thread, or can they take a snapshot somehow and then figure out where the program was?12
🗪
1:55:43teamrandb How do sampling profilers work? Do they need to pause every thread, or can they take a snapshot somehow and then figure out where the program was?12
🗪
2:07:56jkfsda Q: How many game developers are there who actually care about performance / optimisation? Isn't most game development just simple things, e.g. made with Unity? Are these game devs that work in Unity as valuable as you said, that they can apply to web-scale companies and get an easy job with high salary?
🗪
2:07:56jkfsda Q: How many game developers are there who actually care about performance / optimisation? Isn't most game development just simple things, e.g. made with Unity? Are these game devs that work in Unity as valuable as you said, that they can apply to web-scale companies and get an easy job with high salary?
🗪
2:07:56jkfsda Q: How many game developers are there who actually care about performance / optimisation? Isn't most game development just simple things, e.g. made with Unity? Are these game devs that work in Unity as valuable as you said, that they can apply to web-scale companies and get an easy job with high salary?
🗪
2:09:25diffserv 300k at Google is no joke
🗪
2:09:25diffserv 300k at Google is no joke
🗪
2:09:25diffserv 300k at Google is no joke
🗪
2:09:46Wrap it up
🗩
2:09:46Wrap it up
🗩
2:09:46Wrap it up
🗩