SubRegionImpl(Rect2i region, boolean crop) {
previousState = state;
int left = TeraMath.addClampAtMax(region.minX(), state.drawRegion.minX());
int right = TeraMath.addClampAtMax(region.maxX(), state.drawRegion.minX());
int top = TeraMath.addClampAtMax(region.minY(), state.drawRegion.minY());
int bottom = TeraMath.addClampAtMax(region.maxY(), state.drawRegion.minY());
Rect2i subRegion = Rect2i.createFromMinAndMax(left, top, right, bottom);
if (crop) {
Rect2i cropRegion = subRegion.intersect(state.cropRegion);
if (cropRegion.isEmpty()) {
state = new CanvasState(state, subRegion, cropRegion);
} else if (!cropRegion.equals(state.cropRegion)) {
state = new CanvasState(state, subRegion, cropRegion);
renderer.crop(cropRegion);
croppingRegion = true;
} else {
state = new CanvasState(state, subRegion);
}
} else {
state = new CanvasState(state, subRegion);
}
}