25 unsigned srcWidth,
unsigned* edgeBuf,
EdgeHQ edgeOp)
29 template<std::
unsigned_
integral Pixel>
31 const Pixel* __restrict in0,
const Pixel* __restrict in1,
32 const Pixel* __restrict in2,
33 Pixel* __restrict out0,
Pixel* __restrict out1,
34 Pixel* __restrict out2,
35 unsigned srcWidth,
unsigned* __restrict edgeBuf,
38 unsigned c2 =
readPixel(in0[0]);
unsigned c3 = c2;
39 unsigned c5 =
readPixel(in1[0]);
unsigned c6 = c5;
40 unsigned c8 =
readPixel(in2[0]);
unsigned c9 = c8;
43 if (edgeOp(c5, c8)) pattern |= 3 << 6;
44 if (edgeOp(c5, c2)) pattern |= 3 << 9;
46 for (
auto x :
xrange(srcWidth)) {
53 if (
x != srcWidth - 1) {
59 pattern = (pattern >> 6) & 0x001F;
68 if (edgeOp(c5, c8)) pattern |= 1 << 5;
69 if (edgeOp(c5, c9)) pattern |= 1 << 6;
70 if (edgeOp(c6, c8)) pattern |= 1 << 7;
71 if (edgeOp(c5, c6)) pattern |= 1 << 8;
76 pattern |= ((edgeBuf[
x] & (1 << 5) ) << 6) |
77 ((edgeBuf[
x] & ((1 << 6) | (1 << 7))) << 3);
80 unsigned pixel0, pixel1, pixel2, pixel3, pixel4,
81 pixel5, pixel6, pixel7, pixel8;
83 #include "HQ3xScaler-1x1to3x3.nn"
85 out0[3 *
x + 0] = writePixel<Pixel>(pixel0);
86 out0[3 *
x + 1] = writePixel<Pixel>(pixel1);
87 out0[3 *
x + 2] = writePixel<Pixel>(pixel2);
88 out1[3 *
x + 0] = writePixel<Pixel>(pixel3);
89 out1[3 *
x + 1] = writePixel<Pixel>(pixel4);
90 out1[3 *
x + 2] = writePixel<Pixel>(pixel5);
91 out2[3 *
x + 0] = writePixel<Pixel>(pixel6);
92 out2[3 *
x + 1] = writePixel<Pixel>(pixel7);
93 out2[3 *
x + 2] = writePixel<Pixel>(pixel8);
99 template<std::
unsigned_
integral Pixel>
102 , pixelOps(pixelOps_)
106 template<std::
unsigned_
integral Pixel>
108 unsigned srcStartY,
unsigned srcEndY,
unsigned srcWidth,
114 src, srcStartY, srcEndY, srcWidth,
115 dst, dstStartY, dstEndY, (srcWidth * 9) / 2);
118 template<std::
unsigned_
integral Pixel>
120 unsigned srcStartY,
unsigned srcEndY,
unsigned srcWidth,
126 src, srcStartY, srcEndY, srcWidth,
127 dst, dstStartY, dstEndY, srcWidth * 3);
130 template<std::
unsigned_
integral Pixel>
132 unsigned srcStartY,
unsigned srcEndY,
unsigned srcWidth,
138 src, srcStartY, srcEndY, srcWidth,
139 dst, dstStartY, dstEndY, (srcWidth * 9) / 4);
142 template<std::
unsigned_
integral Pixel>
144 unsigned srcStartY,
unsigned srcEndY,
unsigned srcWidth,
150 src, srcStartY, srcEndY, srcWidth,
151 dst, dstStartY, dstEndY, (srcWidth * 3) / 2);
154 template<std::
unsigned_
integral Pixel>
156 unsigned srcStartY,
unsigned srcEndY,
unsigned srcWidth,
162 src, srcStartY, srcEndY, srcWidth,
163 dst, dstStartY, dstEndY, (srcWidth * 9) / 8);
166 template<std::
unsigned_
integral Pixel>
168 unsigned srcStartY,
unsigned srcEndY,
unsigned srcWidth,
174 src, srcStartY, srcEndY, srcWidth,
175 dst, dstStartY, dstEndY, (srcWidth * 3) / 4);
Interface for getting lines from a video frame.
Runs the hq3x scaler algorithm.
void scale1x1to3x3(FrameSource &src, unsigned srcStartY, unsigned srcEndY, unsigned srcWidth, ScalerOutput< Pixel > &dst, unsigned dstStartY, unsigned dstEndY) override
void scale4x1to3x3(FrameSource &src, unsigned srcStartY, unsigned srcEndY, unsigned srcWidth, ScalerOutput< Pixel > &dst, unsigned dstStartY, unsigned dstEndY) override
void scale4x1to9x3(FrameSource &src, unsigned srcStartY, unsigned srcEndY, unsigned srcWidth, ScalerOutput< Pixel > &dst, unsigned dstStartY, unsigned dstEndY) override
void scale2x1to9x3(FrameSource &src, unsigned srcStartY, unsigned srcEndY, unsigned srcWidth, ScalerOutput< Pixel > &dst, unsigned dstStartY, unsigned dstEndY) override
void scale2x1to3x3(FrameSource &src, unsigned srcStartY, unsigned srcEndY, unsigned srcWidth, ScalerOutput< Pixel > &dst, unsigned dstStartY, unsigned dstEndY) override
HQ3xScaler(const PixelOperations< Pixel > &pixelOps)
void scale8x1to9x3(FrameSource &src, unsigned srcStartY, unsigned srcEndY, unsigned srcWidth, ScalerOutput< Pixel > &dst, unsigned dstStartY, unsigned dstEndY) override
Polymorphic wrapper around another line scaler.
Base class for 3x scalers.
This file implemented 3 utility functions:
EdgeHQ createEdgeHQ(const PixelOperations< Pixel > &pixelOps)
constexpr KeyMatrixPosition x
Keyboard bindings.
uint32_t readPixel(Pixel p)
void operator()(const Pixel *in0, const Pixel *in1, const Pixel *in2, Pixel *out0, Pixel *out1, Pixel *out2, unsigned srcWidth, unsigned *edgeBuf, EdgeHQ edgeOp)
constexpr auto xrange(T e)