transformPixels method

Future<Image> transformPixels(
  1. Color transform(
    1. Color
    ), {
  2. bool reversePremultipliedAlpha = true,
})

Implementation

Future<Image> transformPixels(
  Color Function(Color) transform, {
  bool reversePremultipliedAlpha = true,
}) async {
  final pixelData = await pixelsInUint8();
  final newPixelData = Uint8List(pixelData.length);

  for (var i = 0; i < pixelData.length; i += 4) {
    final r = pixelData[i + 0] / 255;
    final g = pixelData[i + 1] / 255;
    final b = pixelData[i + 2] / 255;
    final a = pixelData[i + 3] / 255;

    final d = a == 0 || !reversePremultipliedAlpha ? 1 : a;

    // Reverse the pre-multiplied alpha.
    final color = Color.from(
      alpha: a,
      red: r / d,
      green: g / d,
      blue: b / d,
    );

    final newColor = a == 0 ? color : transform(color);

    final newR = newColor.r;
    final newG = newColor.g;
    final newB = newColor.b;

    // Pre-multiply the alpha back into the new color.
    newPixelData[i + 0] = (newR * d * 255).round();
    newPixelData[i + 1] = (newG * d * 255).round();
    newPixelData[i + 2] = (newB * d * 255).round();
    newPixelData[i + 3] = pixelData[i + 3];
  }

  return fromPixels(newPixelData, width, height);
}