Another point I would look at is the way you are drawing the RWPB icons. I have found that resolving references across class boundaries can be quite time consuming. This certainly matters when you are processing per pixel, but since your inner loop plays seven times for each member of mRuList it might have an effect here. Instead of referencing the display icons in the DrawImage statement, you might be able to build an array of display icons before the outer loop and use that local copy in the DrawImage statement.

Another thing I would reconsider is your Do Loop with MeasureString. This appears to be a way of sizing the string to fit dSurface horizontally. MeasureString can be pretty slow, maybe because it has to render the whole string internally in order to measure it. Instead you could add the string to a GraphicsPath and draw the path scaled to fit the target width. Then the loop would no longer be necessary.

BB