function getSubrects() {
    var dw = this.dataWindow;
    if (!this.grid.properties.fetchSubregions) {
        var rect = this.grid.newRectangle(dw.left, dw.top, dw.width, dw.height); // convert from InclusiveRect
        return [rect];
    }

    var orderedColumnIndexes = this.visibleColumns.map(function(vc) { return vc.column.index; }).sort(intComparator),
        xMin = orderedColumnIndexes[0],
        width = orderedColumnIndexes[orderedColumnIndexes.length - 1] - xMin + 1;

    return [this.grid.newRectangle(xMin, dw.top, width, dw.height)];
}
@summary Create a list of `Rectangle`s representing visible cells.
@desc When `grid.properties.fetchSubregions` is true, this function needs to handle:
1. unordered columns
2. column gaps (hidden columns)
3. the single row gap that results when there are fixed rows and remaining rows are scrolled down

@ToDo This function currently only handles (1) above; needs (2) (multiple rectangles for multiple contiguous column regions) and (3) (double each region for above and below the fixed boundary when scrolled down) as well. In its present form, it will "fetch" all cells from upper left of fixed area to lower right of scrollable area. (Yikes.)

When `grid.properties.fetchSubregions` is falsy, this function merely returns `this.dataWindow` as the only rectangle.
This is way more efficient than calling `getSubrects` (as it is currently implemented) and is fine so long as there are no fixed columns or rows and column re-ordering is disabled.
(If tree column in use, it is a fixed column, but this is workable so long as the data model knows to always return it regardless of rectangle.)
Hidden columns within the range of visible columns will be fetched anyway.
Column scrolling is ok.

@ToDo This function is too slow for practical use due to map and sort.

@this {Renderer}