Finally! I have been tinkering with a custom scroll view for weeks now, but I never had time to sit down and really concentrate on it. The shifting frames of reference between the clipping view and the clipped child were really giving me headaches. I must have written five different variations of that code. With the holiday weekend, I finally had a chance to concentrate on it for a couple of hours and now I have a version that does fast scrolling using NSCopyBits().
The whole thing would have been much simpler if I didn't have to work around a quirk in NSTextFieldCell. If it thinks its vertical display coordinate is incorrect, it will reset it to zero. This is a problem in two cases. If you try to draw text beyond the bottom of the view, instead of that text being clipped into oblivion, it gets drawn at the top of the view, probably overwriting the existing contents. If you try to draw text set partially above the top of the view, it will reset the origin to zero while keeping the bottom of the display rectangle fixed, so that it draws, for example, the upper half of the line of text rather than the bottom. Both cases really break the illusion of the scroll view.
The solution is to use two views: a parent view which exists only for clipping and a child view for content. If a line of text extends past the top of the parent view, set the child's vertical origin to a small negative amount sufficient to contain that line of text. If text extends past the bottom of the clip view, set the child's height large enough to encompass that text too. NSTextFieldCell doesn't care that those regions will never be visible. As long as those virtual pixels exist, it will draw the desired text and the parent view will clip it.