>>dylan6+(OP)
The example isn't wrong, it's just looking at the timing a little differently from how you're used to. It's treating the blanking time as all occurring at the end of a line, instead of splitting it into front porch / back porch. This is a common pattern in video generators, since it means you can use a single counter for display and blanking, and define the blanking condition in terms of the counter exceeding the active count, e.g.
blanking := hcount >= 640 || vcount >= 480;
output := blanking ? 0 : framebuffer[vcount][hcount];