С функциями graphics.setClip() и graphics.translate() оказалось больше проблем, чем хотелось бы.
Прокачал класс Viewport - хэлпер для работы с клиппингом. Н-р, он умеет делать lock/unlock, чтобы последующие установки клипа не выходили за эту залоченную область.
Что узнал:
1. Важен порядок вызова функций
setClip => translate
!= translate => setClip
при установке области клипа учитывается текущий сдвиг координат, но все последующие никак не влияют, запоминает именно сдвиг в момент установки клипа.
2. Реальные координаты клипа g.getClipX() и g.getClipY() - возвращаются значения с учётом сдвига координат.
3. g.translate(int x, int y) - это не передвинуть канвас в указанную точку, а сдвинуть на указанное количество относительно текущей позиции. могли бы написать в доке
dx, dy для понятности.
4. Внутренности графикса по части клипа и транслэйта сложнее, чем думал (см. скрин)