/// <summary> /// This is the XBR4x by Hyllian (see http://board.byuu.org/viewtopic.php?f=10&t=2248) /// </summary> public static void Xbr4X(IPixelWorker <sPixel> worker, bool allowAlphaBlending) { Contract.Assume(worker != null); var a1 = worker.SourceM1M2(); var b1 = worker.SourceP0M2(); var c1 = worker.SourceP1M2(); var a0 = worker.SourceM2M1(); var pa = worker.SourceM1M1(); var pb = worker.SourceP0M1(); var pc = worker.SourceP1M1(); var c4 = worker.SourceP2M1(); var d0 = worker.SourceM2P0(); var pd = worker.SourceM1P0(); var pe = worker.SourceP0P0(); var pf = worker.SourceP1P0(); var f4 = worker.SourceP2P0(); var g0 = worker.SourceM2P1(); var pg = worker.SourceM1P1(); var ph = worker.SourceP0P1(); var pi = worker.SourceP1P1(); var i4 = worker.SourceP2P1(); var g5 = worker.SourceM1P2(); var h5 = worker.SourceP0P2(); var i5 = worker.SourceP1P2(); sPixel e1, e2, e3, e4, e5, e6, e7, e8, e9, ea, eb, ec, ed, ee, ef; var e0 = e1 = e2 = e3 = e4 = e5 = e6 = e7 = e8 = e9 = ea = eb = ec = ed = ee = ef = pe; _Kernel4Xv2(pe, pi, ph, pf, pg, pc, pd, pb, f4, i4, h5, i5, ref ef, ref ee, ref eb, ref e3, ref e7, ref ea, ref ed, ref ec, allowAlphaBlending); _Kernel4Xv2(pe, pc, pf, pb, pi, pa, ph, pd, b1, c1, f4, c4, ref e3, ref e7, ref e2, ref e0, ref e1, ref e6, ref eb, ref ef, allowAlphaBlending); _Kernel4Xv2(pe, pa, pb, pd, pc, pg, pf, ph, d0, a0, b1, a1, ref e0, ref e1, ref e4, ref ec, ref e8, ref e5, ref e2, ref e3, allowAlphaBlending); _Kernel4Xv2(pe, pg, pd, ph, pa, pi, pb, pf, h5, g5, d0, g0, ref ec, ref e8, ref ed, ref ef, ref ee, ref e9, ref e4, ref e0, allowAlphaBlending); worker.TargetP0P0(e0); worker.TargetP1P0(e1); worker.TargetP2P0(e2); worker.TargetP3P0(e3); worker.TargetP0P1(e4); worker.TargetP1P1(e5); worker.TargetP2P1(e6); worker.TargetP3P1(e7); worker.TargetP0P2(e8); worker.TargetP1P2(e9); worker.TargetP2P2(ea); worker.TargetP3P2(eb); worker.TargetP0P3(ec); worker.TargetP1P3(ed); worker.TargetP2P3(ee); worker.TargetP3P3(ef); }
/// <summary> /// This is the XBR3x by Hyllian (see http://board.byuu.org/viewtopic.php?f=10&t=2248) /// </summary> public static void Xbr3X(IPixelWorker <sPixel> worker, bool allowAlphaBlending, bool useOriginalImplementation) { Contract.Assume(worker != null); var a1 = worker.SourceM1M2(); var b1 = worker.SourceP0M2(); var c1 = worker.SourceP1M2(); var a0 = worker.SourceM2M1(); var pa = worker.SourceM1M1(); var pb = worker.SourceP0M1(); var pc = worker.SourceP1M1(); var c4 = worker.SourceP2M1(); var d0 = worker.SourceM2P0(); var pd = worker.SourceM1P0(); var pe = worker.SourceP0P0(); var pf = worker.SourceP1P0(); var f4 = worker.SourceP2P0(); var g0 = worker.SourceM2P1(); var pg = worker.SourceM1P1(); var ph = worker.SourceP0P1(); var pi = worker.SourceP1P1(); var i4 = worker.SourceP2P1(); var g5 = worker.SourceM1P2(); var h5 = worker.SourceP0P2(); var i5 = worker.SourceP1P2(); sPixel e1, e2, e3, e4, e5, e6, e7, e8; var e0 = e1 = e2 = e3 = e4 = e5 = e6 = e7 = e8 = pe; _Kernel3X(pe, pi, ph, pf, pg, pc, pd, pb, f4, i4, h5, i5, ref e2, ref e5, ref e6, ref e7, ref e8, allowAlphaBlending, useOriginalImplementation); _Kernel3X(pe, pc, pf, pb, pi, pa, ph, pd, b1, c1, f4, c4, ref e0, ref e1, ref e8, ref e5, ref e2, allowAlphaBlending, useOriginalImplementation); _Kernel3X(pe, pa, pb, pd, pc, pg, pf, ph, d0, a0, b1, a1, ref e6, ref e3, ref e2, ref e1, ref e0, allowAlphaBlending, useOriginalImplementation); _Kernel3X(pe, pg, pd, ph, pa, pi, pb, pf, h5, g5, d0, g0, ref e8, ref e7, ref e0, ref e3, ref e6, allowAlphaBlending, useOriginalImplementation); worker.TargetP0P0(e0); worker.TargetP1P0(e1); worker.TargetP2P0(e2); worker.TargetP0P1(e3); worker.TargetP1P1(e4); worker.TargetP2P1(e5); worker.TargetP0P2(e6); worker.TargetP1P2(e7); worker.TargetP2P2(e8); }
/// <summary> /// This is the XBR2x by Hyllian (see http://board.byuu.org/viewtopic.php?f=10&t=2248) /// </summary> public static void Xbr2X(IPixelWorker <sPixel> worker, bool allowAlphaBlending) { Contract.Assume(worker != null); var a1 = worker.SourceM1M2(); var b1 = worker.SourceP0M2(); var c1 = worker.SourceP1M2(); var a0 = worker.SourceM2M1(); var pa = worker.SourceM1M1(); var pb = worker.SourceP0M1(); var pc = worker.SourceP1M1(); var c4 = worker.SourceP2M1(); var d0 = worker.SourceM2P0(); var pd = worker.SourceM1P0(); var pe = worker.SourceP0P0(); var pf = worker.SourceP1P0(); var f4 = worker.SourceP2P0(); var g0 = worker.SourceM2P1(); var pg = worker.SourceM1P1(); var ph = worker.SourceP0P1(); var pi = worker.SourceP1P1(); var i4 = worker.SourceP2P1(); var g5 = worker.SourceM1P2(); var h5 = worker.SourceP0P2(); var i5 = worker.SourceP1P2(); sPixel e1, e2, e3; var e0 = e1 = e2 = e3 = pe; _Kernel2Xv5(pe, pi, ph, pf, pg, pc, pd, pb, f4, i4, h5, i5, ref e1, ref e2, ref e3, allowAlphaBlending); _Kernel2Xv5(pe, pc, pf, pb, pi, pa, ph, pd, b1, c1, f4, c4, ref e0, ref e3, ref e1, allowAlphaBlending); _Kernel2Xv5(pe, pa, pb, pd, pc, pg, pf, ph, d0, a0, b1, a1, ref e2, ref e1, ref e0, allowAlphaBlending); _Kernel2Xv5(pe, pg, pd, ph, pa, pi, pb, pf, h5, g5, d0, g0, ref e3, ref e0, ref e2, allowAlphaBlending); worker.TargetP0P0(e0); worker.TargetP1P0(e1); worker.TargetP0P1(e2); worker.TargetP1P1(e3); }
/// <summary> /// Christoph Feck's ([email protected]) Reverse Anti-Alias filter /// TODO: make mathutils and join clamp, min and max with the ones from spixel /// </summary> /// <param name="worker">The worker.</param> public static void Process(IPixelWorker <sPixel> worker) { var b1 = worker.SourceP0M2(); var b = worker.SourceP0M1(); var d = worker.SourceM1P0(); var e = worker.SourceP0P0(); var f = worker.SourceP1P0(); var h = worker.SourceP0P1(); var h5 = worker.SourceP0P2(); var d0 = worker.SourceM2P0(); var f4 = worker.SourceP2P0(); var redPart = _ReverseAntiAlias(b1.Red, b.Red, d.Red, e.Red, f.Red, h.Red, h5.Red, d0.Red, f4.Red); var greenPart = _ReverseAntiAlias(b1.Green, b.Green, d.Green, e.Green, f.Green, h.Green, h5.Green, d0.Green, f4.Green); var bluePart = _ReverseAntiAlias(b1.Blue, b.Blue, d.Blue, e.Blue, f.Blue, h.Blue, h5.Blue, d0.Blue, f4.Blue); var alphaPart = _ReverseAntiAlias(b1.Alpha, b.Alpha, d.Alpha, e.Alpha, f.Alpha, h.Alpha, h5.Alpha, d0.Alpha, f4.Alpha); worker.TargetP0P0(sPixel.FromRGBA(redPart.Item1, greenPart.Item1, bluePart.Item1, alphaPart.Item1)); worker.TargetP1P0(sPixel.FromRGBA(redPart.Item2, greenPart.Item2, bluePart.Item2, alphaPart.Item2)); worker.TargetP0P1(sPixel.FromRGBA(redPart.Item3, greenPart.Item3, bluePart.Item3, alphaPart.Item3)); worker.TargetP1P1(sPixel.FromRGBA(redPart.Item4, greenPart.Item4, bluePart.Item4, alphaPart.Item4)); }
// TODO: to be really exact, the comparisons are not that right by comparing to already interpolated values // TODO: when interpolating 3 or more points I'm using already calculated interpolations and weight them further // which is not the mathematically correct approach, but it's enough - at least for now /// <summary> /// Kreed's SuperEagle modified by Hawkynt to allow thresholds /// </summary> public static void SuperEagle(IPixelWorker <sPixel> worker) { var c0 = worker.SourceM1M1(); var c1 = worker.SourceP0M1(); var c2 = worker.SourceP1M1(); var c3 = worker.SourceM1P0(); var c4 = worker.SourceP0P0(); var c5 = worker.SourceP1P0(); var d4 = worker.SourceP2P0(); var c6 = worker.SourceM1P1(); var c7 = worker.SourceP0P1(); var c8 = worker.SourceP1P1(); var d5 = worker.SourceP2P1(); var d1 = worker.SourceP0P2(); var d2 = worker.SourceP1P2(); sPixel e00 = c4, e11 = c4; sPixel e01, e10; if (c4.IsLike(c8)) { var c48 = sPixel.Interpolate(c4, c8); if (c7.IsLike(c5)) { var c57 = sPixel.Interpolate(c5, c7); var conc2D = 0; conc2D += _Conc2D(c57, c48, c6, d1); conc2D += _Conc2D(c57, c48, c3, c1); conc2D += _Conc2D(c57, c48, d2, d5); conc2D += _Conc2D(c57, c48, c2, d4); if (conc2D > 0) { e10 = c57; e01 = c57; e11 = sPixel.Interpolate(c48, c57); e00 = sPixel.Interpolate(c48, c57); } else if (conc2D < 0) { e10 = sPixel.Interpolate(c48, c57); e01 = sPixel.Interpolate(c48, c57); } else { e10 = c57; e01 = c57; } } else { if (c48.IsLike(c1) && c48.IsLike(d5)) { e01 = sPixel.Interpolate(sPixel.Interpolate(c48, c1, d5), c5, 3, 1); } else if (c48.IsLike(c1)) { e01 = sPixel.Interpolate(sPixel.Interpolate(c48, c1), c5, 3, 1); } else if (c48.IsLike(d5)) { e01 = sPixel.Interpolate(sPixel.Interpolate(c48, d5), c5, 3, 1); } else { e01 = sPixel.Interpolate(c48, c5); } if (c48.IsLike(d2) && c48.IsLike(c3)) { e10 = sPixel.Interpolate(sPixel.Interpolate(c48, d2, c3), c7, 3, 1); } else if (c48.IsLike(d2)) { e10 = sPixel.Interpolate(sPixel.Interpolate(c48, d2), c7, 3, 1); } else if (c48.IsLike(c3)) { e10 = sPixel.Interpolate(sPixel.Interpolate(c48, c3), c7, 3, 1); } else { e10 = sPixel.Interpolate(c48, c7); } } } else { if (c7.IsLike(c5)) { var c57 = sPixel.Interpolate(c5, c7); e01 = c57; e10 = c57; if (c57.IsLike(c6) && c57.IsLike(c2)) { e00 = sPixel.Interpolate(sPixel.Interpolate(c57, c6, c2), c4, 3, 1); } else if (c57.IsLike(c6)) { e00 = sPixel.Interpolate(sPixel.Interpolate(c57, c6), c4, 3, 1); } else if (c57.IsLike(c2)) { e00 = sPixel.Interpolate(sPixel.Interpolate(c57, c2), c4, 3, 1); } else { e00 = sPixel.Interpolate(c57, c4); } if (c57.IsLike(d4) && c57.IsLike(d1)) { e11 = sPixel.Interpolate(sPixel.Interpolate(c57, d4, d1), c8, 3, 1); } else if (c57.IsLike(d4)) { e11 = sPixel.Interpolate(sPixel.Interpolate(c57, d4), c8, 3, 1); } else if (c57.IsLike(d1)) { e11 = sPixel.Interpolate(sPixel.Interpolate(c57, d1), c8, 3, 1); } else { e11 = sPixel.Interpolate(c57, c8); } } else { e11 = sPixel.Interpolate(c8, c7, c5, 6, 1, 1); e00 = sPixel.Interpolate(c4, c7, c5, 6, 1, 1); e10 = sPixel.Interpolate(c7, c4, c8, 6, 1, 1); e01 = sPixel.Interpolate(c5, c4, c8, 6, 1, 1); } } worker.TargetP0P0(e00); worker.TargetP1P0(e01); worker.TargetP0P1(e10); worker.TargetP1P1(e11); }
/// <summary> /// Kreed's SuperSaI /// </summary> public static void SuperSaI(IPixelWorker <sPixel> worker) { var c0 = worker.SourceM1M1(); var c1 = worker.SourceP0M1(); var c2 = worker.SourceP1M1(); var d3 = worker.SourceP2M1(); var c3 = worker.SourceM1P0(); var c4 = worker.SourceP0P0(); var c5 = worker.SourceP1P0(); var d4 = worker.SourceP2P0(); var c6 = worker.SourceM1P1(); var c7 = worker.SourceP0P1(); var c8 = worker.SourceP1P1(); var d5 = worker.SourceP2P1(); var d0 = worker.SourceM1P2(); var d1 = worker.SourceP0P2(); var d2 = worker.SourceP1P2(); var d6 = worker.SourceP2P2(); sPixel e01, e10, e11; var e00 = e01 = e11 = c4; if (c7.IsLike(c5) && c4.IsNotLike(c8)) { var c57 = sPixel.Interpolate(c7, c5); e11 = c57; e01 = c57; } else if (c4.IsLike(c8) && c7.IsNotLike(c5)) { //nothing } else if (c4.IsLike(c8) && c7.IsLike(c5)) { var c57 = sPixel.Interpolate(c7, c5); var c48 = sPixel.Interpolate(c4, c8); var conc2D = 0; conc2D += _Conc2D(c57, c48, c6, d1); conc2D += _Conc2D(c57, c48, c3, c1); conc2D += _Conc2D(c57, c48, d2, d5); conc2D += _Conc2D(c57, c48, c2, d4); if (conc2D > 0) { e11 = c57; e01 = c57; } else if (conc2D == 0) { e11 = sPixel.Interpolate(c48, c57); e01 = sPixel.Interpolate(c48, c57); } } else { if (c8.IsLike(c5) && c8.IsLike(d1) && c7.IsNotLike(d2) && c8.IsNotLike(d0)) { e11 = sPixel.Interpolate(sPixel.Interpolate(c8, c5, d1), c7, 3, 1); } else if (c7.IsLike(c4) && c7.IsLike(d2) && c7.IsNotLike(d6) && c8.IsNotLike(d1)) { e11 = sPixel.Interpolate(sPixel.Interpolate(c7, c4, d2), c8, 3, 1); } else { e11 = sPixel.Interpolate(c7, c8); } if (c5.IsLike(c8) && c5.IsLike(c1) && c5.IsNotLike(c0) && c4.IsNotLike(c2)) { e01 = sPixel.Interpolate(sPixel.Interpolate(c5, c8, c1), c4, 3, 1); } else if (c4.IsLike(c7) && c4.IsLike(c2) && c5.IsNotLike(c1) && c4.IsNotLike(d3)) { e01 = sPixel.Interpolate(sPixel.Interpolate(c4, c7, c2), c5, 3, 1); } else { e01 = sPixel.Interpolate(c4, c5); } } if (c4.IsLike(c8) && c4.IsLike(c3) && c7.IsNotLike(c5) && c4.IsNotLike(d2)) { e10 = sPixel.Interpolate(c7, sPixel.Interpolate(c4, c8, c3)); } else if (c4.IsLike(c6) && c4.IsLike(c5) && c7.IsNotLike(c3) && c4.IsNotLike(d0)) { e10 = sPixel.Interpolate(c7, sPixel.Interpolate(c4, c6, c5)); } else { e10 = c7; } if (c7.IsLike(c5) && c7.IsLike(c6) && c4.IsNotLike(c8) && c7.IsNotLike(c2)) { e00 = sPixel.Interpolate(sPixel.Interpolate(c7, c5, c6), c4); } else if (c7.IsLike(c3) && c7.IsLike(c8) && c4.IsNotLike(c6) && c7.IsNotLike(c0)) { e00 = sPixel.Interpolate(sPixel.Interpolate(c7, c3, c8), c4); } worker.TargetP0P0(e00); worker.TargetP1P0(e01); worker.TargetP0P1(e10); worker.TargetP1P1(e11); }
/// <summary> /// Derek Liauw Kie Fa's 2XSaI /// </summary> public static void SaI2X(IPixelWorker <sPixel> worker) { var c0 = worker.SourceM1M1(); var c1 = worker.SourceP0M1(); var c2 = worker.SourceP1M1(); var d3 = worker.SourceP2M1(); var c3 = worker.SourceM1P0(); var c4 = worker.SourceP0P0(); var c5 = worker.SourceP1P0(); var d4 = worker.SourceP2P0(); var c6 = worker.SourceM1P1(); var c7 = worker.SourceP0P1(); var c8 = worker.SourceP1P1(); var d5 = worker.SourceP2P1(); var d0 = worker.SourceM1P2(); var d1 = worker.SourceP0P2(); var d2 = worker.SourceP1P2(); sPixel e01, e10, e11; var e00 = e01 = e10 = e11 = c4; if (c4.IsLike(c8) && c5.IsNotLike(c7)) { var c48 = sPixel.Interpolate(c4, c8); if (c48.IsLike(c1) && c5.IsLike(d5) || c48.IsLike(c7) && c48.IsLike(c2) && c5.IsNotLike(c1) && c5.IsLike(d3)) { //nothing } else { e01 = sPixel.Interpolate(c48, c5); } if (c48.IsLike(c3) && c7.IsLike(d2) || c48.IsLike(c5) && c48.IsLike(c6) && c3.IsNotLike(c7) && c7.IsLike(d0)) { //nothing } else { e10 = sPixel.Interpolate(c48, c7); } } else if (c5.IsLike(c7) && c4.IsNotLike(c8)) { var c57 = sPixel.Interpolate(c5, c7); if (c57.IsLike(c2) && c4.IsLike(c6) || c57.IsLike(c1) && c57.IsLike(c8) && c4.IsNotLike(c2) && c4.IsLike(c0)) { e01 = c57; } else { e01 = sPixel.Interpolate(c4, c57); } if (c57.IsLike(c6) && c4.IsLike(c2) || c57.IsLike(c3) && c57.IsLike(c8) && c4.IsNotLike(c6) && c4.IsLike(c0)) { e10 = c57; } else { e10 = sPixel.Interpolate(c4, c57); } e11 = c57; } else if (c4.IsLike(c8) && c5.IsLike(c7)) { var c48 = sPixel.Interpolate(c4, c8); var c57 = sPixel.Interpolate(c5, c7); if (c48.IsNotLike(c57)) { var conc2D = 0; conc2D += _Conc2D(c48, c57, c3, c1); conc2D -= _Conc2D(c57, c48, d4, c2); conc2D -= _Conc2D(c57, c48, c6, d1); conc2D += _Conc2D(c48, c57, d5, d2); if (conc2D < 0) { e11 = c57; } else if (conc2D == 0) { e11 = sPixel.Interpolate(c48, c57); } e10 = sPixel.Interpolate(c48, c57); e01 = sPixel.Interpolate(c48, c57); } } else { e11 = sPixel.Interpolate(c4, c5, c7, c8); if (c4.IsLike(c7) && c4.IsLike(c2) && c5.IsNotLike(c1) && c5.IsLike(d3)) { //nothing } else if (c5.IsLike(c1) && c5.IsLike(c8) && c4.IsNotLike(c2) && c4.IsLike(c0)) { e01 = sPixel.Interpolate(c5, c1, c8); } else { e01 = sPixel.Interpolate(c4, c5); } if (c4.IsLike(c5) && c4.IsLike(c6) && c3.IsNotLike(c7) && c7.IsLike(d0)) { //nothing } else if (c7.IsLike(c3) && c7.IsLike(c8) && c4.IsNotLike(c6) && c4.IsLike(c0)) { e10 = sPixel.Interpolate(c7, c3, c8); } else { e10 = sPixel.Interpolate(c4, c7); } } worker.TargetP0P0(e00); worker.TargetP1P0(e01); worker.TargetP0P1(e10); worker.TargetP1P1(e11); }