I did the inevitable - I solved it right after I posted this message.
The problem was (of course, some might say) my code, not the SDL library - although I do think it behaves a little improperly.
As soon as an image is clipped with any of the clipping rectangle borders, the x and y elements of the destination SDL_Rect supplied in the SDL_Blt() method are modified - all other cases leave the SDL_Rect intact.
This is the correct and documented behavior. It’s an optimization so you
don’t have to clip the rectangles a second time when updating the screen.
-Sam Lantinga, Software Engineer, Blizzard Entertainment