Starting to bring DrawGradient functions into line with each other

OutputDevice's DrawGradient functions are remarkably similar - I've
reorganized them and brought them into line with some extra checks
that seem to be missing. This will allow for easier refactoring.

Change-Id: I6f83bb9fe73d34e3668d87b4a4ee91c49d8cea0f