buildBands function
Builds GlyphBands for curves. Empty input yields zero bands.
Implementation
GlyphBands buildBands(List<QuadCurve> curves,
{int bandCount = 8,
int maxCurvesPerBand = GlyphBands.maxCurvesPerBandDefault}) {
if (curves.isEmpty) {
return GlyphBands._(0, 0, 0, 0, 0, const [], const [], false);
}
var minX = double.infinity, minY = double.infinity;
var maxX = double.negativeInfinity, maxY = double.negativeInfinity;
for (final c in curves) {
minX = math.min(minX, c.minX);
maxX = math.max(maxX, c.maxX);
minY = math.min(minY, c.minY);
maxY = math.max(maxY, c.maxY);
}
if (maxY <= minY) maxY = minY + 1e-6;
if (maxX <= minX) maxX = minX + 1e-6;
final bandH = (maxY - minY) / bandCount;
final bandW = (maxX - minX) / bandCount;
final hLists = List.generate(bandCount, (_) => <int>[]);
final vLists = List.generate(bandCount, (_) => <int>[]);
for (var i = 0; i < curves.length; i++) {
final c = curves[i];
var b0 = ((c.minY - minY) / bandH).floor();
var b1 = ((c.maxY - minY) / bandH).ceil() - 1;
if (b0 < 0) b0 = 0;
if (b1 >= bandCount) b1 = bandCount - 1;
for (var b = b0; b <= b1; b++) {
hLists[b].add(i);
}
var v0 = ((c.minX - minX) / bandW).floor();
var v1 = ((c.maxX - minX) / bandW).ceil() - 1;
if (v0 < 0) v0 = 0;
if (v1 >= bandCount) v1 = bandCount - 1;
for (var b = v0; b <= v1; b++) {
vLists[b].add(i);
}
}
var overflow = false;
final bands = <Uint16List>[];
for (final list in hLists) {
if (list.length > maxCurvesPerBand) overflow = true;
list.sort((a, b) => curves[b].maxX.compareTo(curves[a].maxX));
bands.add(Uint16List.fromList(list));
}
final vBands = <Uint16List>[];
for (final list in vLists) {
if (list.length > maxCurvesPerBand) overflow = true;
list.sort((a, b) => curves[b].maxY.compareTo(curves[a].maxY));
vBands.add(Uint16List.fromList(list));
}
return GlyphBands._(
bandCount, minX, minY, maxX, maxY, bands, vBands, overflow);
}