logoRaster function
Implementation
LogoRaster logoRaster(Uint8List rgba, int pxBreite, int pxHoehe, LogoMass mass, int zeichen) {
if (pxBreite < 1 || pxHoehe < 1 || rgba.length != pxBreite * pxHoehe * 4) {
throw ArgumentError('RGBA-Laenge passt nicht zum Pixelmass');
}
final m = logoRasterMass(mass, zeichen);
final breite = m.breite;
final hoehe = m.hoehe;
final grau = Float64List(breite * hoehe);
final sx = pxBreite / breite;
final sy = pxHoehe / hoehe;
for (var y = 0; y < hoehe; y++) {
final y0 = (y * sy).floor();
final y1 = math.min(pxHoehe, math.max(y0 + 1, ((y + 1) * sy).floor()));
for (var x = 0; x < breite; x++) {
final x0 = (x * sx).floor();
final x1 = math.min(pxBreite, math.max(x0 + 1, ((x + 1) * sx).floor()));
var summe = 0.0;
var anzahl = 0;
for (var py = y0; py < y1; py++) {
for (var px = x0; px < x1; px++) {
final i = (py * pxBreite + px) * 4;
final deckung = rgba[i + 3] / 255;
final hell = 0.299 * rgba[i] + 0.587 * rgba[i + 1] + 0.114 * rgba[i + 2];
summe += hell * deckung + 255 * (1 - deckung);
anzahl += 1;
}
}
grau[y * breite + x] = anzahl == 0 ? 255 : summe / anzahl;
}
}
final punkte = Uint8List(breite * hoehe);
for (var y = 0; y < hoehe; y++) {
for (var x = 0; x < breite; x++) {
final i = y * breite + x;
final alt = grau[i];
final neu = alt < 128 ? 0.0 : 255.0;
if (neu == 0) punkte[i] = 1;
final fehler = alt - neu;
if (x + 1 < breite) grau[i + 1] = grau[i + 1] + (fehler * 7) / 16;
if (y + 1 < hoehe) {
if (x > 0) grau[i + breite - 1] = grau[i + breite - 1] + (fehler * 3) / 16;
grau[i + breite] = grau[i + breite] + (fehler * 5) / 16;
if (x + 1 < breite) grau[i + breite + 1] = grau[i + breite + 1] + fehler / 16;
}
}
}
return LogoRaster(breite: breite, hoehe: hoehe, punkte: punkte);
}