After a big product release I like to do a comparison of lines of code between the previous version and the current version.
ArtRage 4.5 was released just over two years ago. Here's some analysis of the code changes between then and now.
(Thanks to Cloc source code line counting tool: http://cloc.sourceforge.net/)
First column is file changes, other columns are lines in files.
Code:
===============================================================================
ArtRage 4.5 files blank comment code
-------------------------------------------------------------------------------
SUM: 1010 81698 105015 290963
-------------------------------------------------------------------------------
===============================================================================
ArtRage 5.0 files blank comment code
-------------------------------------------------------------------------------
SUM: 1080 89834 117855 317880
-------------------------------------------------------------------------------
This shows how many files and lines were modified.
Code:
===============================================================================
Comparison files blank comment code
-------------------------------------------------------------------------------
same 535 0 99456 268493
modified 473 0 717 9280
added 72 9611 17682 40107
removed 2 1475 4842 13190
Compare that to Lord of the Rings trilogy by J. R. R. Tolkien
Page count:
423 - Fellowship of the Ring.
352 - The Two Towers
311 - Return of the King
= 1086 pages.
43 lines per page = 46,698 lines of text.
So... we've added more code and comments than Lord of the Rings. Add in the changed lines and it's another book in the trilogy. 
So what does ArtRage code look like? Here's a very typical cut'n'paste from one of the ArtRage 5.0 source files. This is part of the code relating to the user-defined guidelines. All ArtRage code is similar style to this. Yes, every line of code has a comment - the short amount of time it takes to explain what you're doing to your future self saves hours of debugging time.
Code:
// Do Y hit testing.
// Find the closest gridline in the Y axis array.
fHoriz = true; // Assume we're going to hit a horizontal line.
if (m_aGuideY.GetSize() > 0) { // Some Vertical guidelines to test against.
cgTest.m_nLoc = RoundReal(ptPoint.y); // Set location member (but dont rebuild images)
const int32 nIndex = m_aGuideY.GetIndexOfElementLeq(&cgTest); // Find the guide less-than-or-equal to this one.
if (nIndex == -1) { // There are no guides smaller than the test position
if ((m_aGuideY[0]->m_nLoc - cgTest.m_nLoc) < rHitDist) return 0; // Y is close enough to the first gridline to hit.
}
else if (nIndex == m_aGuideY.GetSize() - 1) { // We're past the last guide - check it.
if ((cgTest.m_nLoc - m_aGuideY[m_aGuideY.GetSize() - 1]->m_nLoc) < rHitDist) // Y is close enough to the first last to hit.
return m_aGuideY.GetSize() - 1; // Hit this index
}
else { // Otherwise we're between two gridlines. Hit the closest within hit distance.
const int32 nLowDelta = cgTest.m_nLoc - m_aGuideY[nIndex]->m_nLoc; // Distance to lower guide
const int32 nHiDelta = m_aGuideY[nIndex + 1]->m_nLoc - cgTest.m_nLoc; // Distance to higher guide
if (nLowDelta < rHitDist) { // Hit Low value
return nLowDelta < nHiDelta ? nIndex : nIndex + 1; // Which of the two guides do we Hit. Must be one of the two, as we're definitly in range of Low, but high might be even closer.
}
else if (nHiDelta < rHitDist) return nIndex + 1; // Hit the high point (but we know we haven't hit the low point)
// else... no Y hit at all.
}
}