Factor width/height into AbstractCanvas.

This fixes a bug with AndroidCanvas which was returning the raw bitmap size
which failed to take into account the HiDPI scale. Now Android does things the
same as every other platform. Fewer LOCs, fewer bugs.