dotScreen function

Image dotScreen(
  1. Image src, {
  2. num angle = 180,
  3. num size = 5.75,
  4. int? centerX,
  5. int? centerY,
  6. num amount = 1,
  7. Image? mask,
  8. Channel maskChannel = Channel.luminance,
})

Apply the dot screen filter to the image.

Implementation

Image dotScreen(Image src,
    {num angle = 180,
    num size = 5.75,
    int? centerX,
    int? centerY,
    num amount = 1,
    Image? mask,
    Channel maskChannel = Channel.luminance}) {
  angle = angle * 0.0174533;
  final s = sin(angle);
  final c = cos(angle);
  for (final frame in src.frames) {
    final w = frame.width - 1;
    final h = frame.height - 1;
    final cntX = (centerX ?? w ~/ 2) / w;
    final cntY = (centerY ?? h ~/ 2) / h;

    num pattern(num cntX, num cntY, num tx, num ty) {
      final texX = (tx - cntX) * w;
      final texY = (ty - cntY) * h;
      final pointX = (c * texX - s * texY) * size;
      final pointY = (s * texX + c * texY) * size;
      return (sin(pointX) * sin(pointY)) * 4.0;
    }

    for (final p in frame) {
      final average = p.luminanceNormalized;
      final pat = pattern(cntX, cntY, p.x / w, p.y / h);
      final c = (average * 10 - 5 + pat) * p.maxChannelValue;
      final msk = mask?.getPixel(p.x, p.y).getChannelNormalized(maskChannel);
      final mx = (msk ?? 1) * amount;
      p
        ..r = mix(p.r, c, mx)
        ..g = mix(p.g, c, mx)
        ..b = mix(p.b, c, mx);
    }
  }
  return src;
}