private static Blender <GrayColor> GetGrayBlender(Func <int, int, int> blend) => (dst, src, opacity) => { int v = blend(dst.V, src.V); src = new GrayColor(v, src.A); return(BlendNormal(dst, src, opacity)); };
private static GrayColor BlendNegBW(GrayColor dst, GrayColor src, int opacity) { if (dst.A == 0) { return(src); } else if (dst.V < 128) { return(new GrayColor(255, 255)); } else { return(new GrayColor(0, 255)); } }
private static GrayColor BlendNormal(GrayColor dst, GrayColor src, int opacity) { if (dst.A == 0) { return(new GrayColor(src.V, MultiplyNormalizedToByte(src.A, opacity))); } else if (src.A == 0) { return(dst); } var sa = MultiplyNormalizedToByte(src.A, opacity); var ra = dst.A + sa - MultiplyNormalizedToByte(dst.A, sa); var rg = dst.V + (src.V - dst.V) * sa / ra; return(new GrayColor(rg, ra)); }
private static GrayColor BlendMerge(GrayColor dst, GrayColor src, int opacity) { int rk, ra; if (dst.A == 0) { rk = src.V; } else if (src.A == 0) { rk = dst.V; } else { rk = dst.V + MultiplyNormalizedToByte((src.V - dst.V), opacity); } ra = dst.A + MultiplyNormalizedToByte((src.A - dst.A), opacity); if (ra == 0) { rk = 0; } return(new GrayColor(rk, ra)); }