buildBands function

GlyphBands buildBands(
  1. List<QuadCurve> curves, {
  2. int bandCount = 8,
  3. int maxCurvesPerBand = GlyphBands.maxCurvesPerBandDefault,
})

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);
}